@@ -60,11 +60,11 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up)
6060 int i ;
6161 unsigned int offset = 0 ;
6262
63- if (up && up != MLX4_EN_NUM_UP )
63+ if (up && up != MLX4_EN_NUM_UP_HIGH )
6464 return - EINVAL ;
6565
6666 netdev_set_num_tc (dev , up );
67-
67+ netif_set_real_num_tx_queues ( dev , priv -> tx_ring_num [ TX ]);
6868 /* Partition Tx queues evenly amongst UP's */
6969 for (i = 0 ; i < up ; i ++ ) {
7070 netdev_set_tc_queue (dev , i , priv -> num_tx_rings_p_up , offset );
@@ -86,16 +86,63 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up)
8686 return 0 ;
8787}
8888
89+ int mlx4_en_alloc_tx_queue_per_tc (struct net_device * dev , u8 tc )
90+ {
91+ struct mlx4_en_priv * priv = netdev_priv (dev );
92+ struct mlx4_en_dev * mdev = priv -> mdev ;
93+ struct mlx4_en_port_profile new_prof ;
94+ struct mlx4_en_priv * tmp ;
95+ int port_up = 0 ;
96+ int err = 0 ;
97+
98+ tmp = kzalloc (sizeof (* tmp ), GFP_KERNEL );
99+ if (!tmp )
100+ return - ENOMEM ;
101+
102+ mutex_lock (& mdev -> state_lock );
103+ memcpy (& new_prof , priv -> prof , sizeof (struct mlx4_en_port_profile ));
104+ new_prof .num_up = (tc == 0 ) ? MLX4_EN_NUM_UP_LOW :
105+ MLX4_EN_NUM_UP_HIGH ;
106+ new_prof .tx_ring_num [TX ] = new_prof .num_tx_rings_p_up *
107+ new_prof .num_up ;
108+ err = mlx4_en_try_alloc_resources (priv , tmp , & new_prof , true);
109+ if (err )
110+ goto out ;
111+
112+ if (priv -> port_up ) {
113+ port_up = 1 ;
114+ mlx4_en_stop_port (dev , 1 );
115+ }
116+
117+ mlx4_en_safe_replace_resources (priv , tmp );
118+ if (port_up ) {
119+ err = mlx4_en_start_port (dev );
120+ if (err ) {
121+ en_err (priv , "Failed starting port for setup TC\n" );
122+ goto out ;
123+ }
124+ }
125+
126+ err = mlx4_en_setup_tc (dev , tc );
127+ out :
128+ mutex_unlock (& mdev -> state_lock );
129+ kfree (tmp );
130+ return err ;
131+ }
132+
89133static int __mlx4_en_setup_tc (struct net_device * dev , u32 handle ,
90134 u32 chain_index , __be16 proto ,
91135 struct tc_to_netdev * tc )
92136{
93137 if (tc -> type != TC_SETUP_MQPRIO )
94138 return - EINVAL ;
95139
140+ if (tc -> mqprio -> num_tc && tc -> mqprio -> num_tc != MLX4_EN_NUM_UP_HIGH )
141+ return - EINVAL ;
142+
96143 tc -> mqprio -> hw = TC_MQPRIO_HW_OFFLOAD_TCS ;
97144
98- return mlx4_en_setup_tc (dev , tc -> mqprio -> num_tc );
145+ return mlx4_en_alloc_tx_queue_per_tc (dev , tc -> mqprio -> num_tc );
99146}
100147
101148#ifdef CONFIG_RFS_ACCEL
@@ -2144,7 +2191,7 @@ static int mlx4_en_copy_priv(struct mlx4_en_priv *dst,
21442191
21452192 memcpy (& dst -> hwtstamp_config , & prof -> hwtstamp_config ,
21462193 sizeof (dst -> hwtstamp_config ));
2147- dst -> num_tx_rings_p_up = src -> mdev -> profile . num_tx_rings_p_up ;
2194+ dst -> num_tx_rings_p_up = prof -> num_tx_rings_p_up ;
21482195 dst -> rx_ring_num = prof -> rx_ring_num ;
21492196 dst -> flags = prof -> flags ;
21502197 dst -> mdev = src -> mdev ;
@@ -2197,6 +2244,7 @@ static void mlx4_en_update_priv(struct mlx4_en_priv *dst,
21972244 dst -> tx_ring [t ] = src -> tx_ring [t ];
21982245 dst -> tx_cq [t ] = src -> tx_cq [t ];
21992246 }
2247+ dst -> num_tx_rings_p_up = src -> num_tx_rings_p_up ;
22002248 dst -> rx_ring_num = src -> rx_ring_num ;
22012249 memcpy (dst -> prof , src -> prof , sizeof (struct mlx4_en_port_profile ));
22022250}
@@ -2780,7 +2828,7 @@ static int mlx4_xdp_set(struct net_device *dev, struct bpf_prog *prog)
27802828 if (priv -> tx_ring_num [TX ] + xdp_ring_num > MAX_TX_RINGS ) {
27812829 tx_changed = 1 ;
27822830 new_prof .tx_ring_num [TX ] =
2783- MAX_TX_RINGS - ALIGN (xdp_ring_num , MLX4_EN_NUM_UP );
2831+ MAX_TX_RINGS - ALIGN (xdp_ring_num , priv -> prof -> num_up );
27842832 en_warn (priv , "Reducing the number of TX rings, to not exceed the max total rings number.\n" );
27852833 }
27862834
@@ -3271,7 +3319,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
32713319 priv -> flags |= MLX4_EN_DCB_ENABLED ;
32723320 priv -> cee_config .pfc_state = false;
32733321
3274- for (i = 0 ; i < MLX4_EN_NUM_UP ; i ++ )
3322+ for (i = 0 ; i < MLX4_EN_NUM_UP_HIGH ; i ++ )
32753323 priv -> cee_config .dcb_pfc [i ] = pfc_disabled ;
32763324
32773325 if (mdev -> dev -> caps .flags2 & MLX4_DEV_CAP_FLAG2_ETS_CFG ) {
0 commit comments