5252
5353#define MLX4_FLAG2_V_IGNORE_FCS_MASK BIT(1)
5454#define MLX4_FLAG2_V_USER_MTU_MASK BIT(5)
55+ #define MLX4_FLAG_V_MTU_MASK BIT(0)
5556#define MLX4_IGNORE_FCS_MASK 0x1
5657#define MLX4_TC_MAX_NUMBER 8
5758
@@ -1240,6 +1241,38 @@ void mlx4_reset_roce_gids(struct mlx4_dev *dev, int slave)
12401241 return ;
12411242}
12421243
1244+ static void
1245+ mlx4_en_set_port_mtu (struct mlx4_dev * dev , int slave , int port ,
1246+ struct mlx4_set_port_general_context * gen_context )
1247+ {
1248+ struct mlx4_priv * priv = mlx4_priv (dev );
1249+ struct mlx4_mfunc_master_ctx * master = & priv -> mfunc .master ;
1250+ struct mlx4_slave_state * slave_st = & master -> slave_state [slave ];
1251+ u16 mtu , prev_mtu ;
1252+
1253+ /* Mtu is configured as the max USER_MTU among all
1254+ * the functions on the port.
1255+ */
1256+ mtu = be16_to_cpu (gen_context -> mtu );
1257+ mtu = min_t (int , mtu , dev -> caps .eth_mtu_cap [port ] +
1258+ ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN );
1259+ prev_mtu = slave_st -> mtu [port ];
1260+ slave_st -> mtu [port ] = mtu ;
1261+ if (mtu > master -> max_mtu [port ])
1262+ master -> max_mtu [port ] = mtu ;
1263+ if (mtu < prev_mtu && prev_mtu == master -> max_mtu [port ]) {
1264+ int i ;
1265+
1266+ slave_st -> mtu [port ] = mtu ;
1267+ master -> max_mtu [port ] = mtu ;
1268+ for (i = 0 ; i < dev -> num_slaves ; i ++ )
1269+ master -> max_mtu [port ] =
1270+ max_t (u16 , master -> max_mtu [port ],
1271+ master -> slave_state [i ].mtu [port ]);
1272+ }
1273+ gen_context -> mtu = cpu_to_be16 (master -> max_mtu [port ]);
1274+ }
1275+
12431276static void
12441277mlx4_en_set_port_user_mtu (struct mlx4_dev * dev , int slave , int port ,
12451278 struct mlx4_set_port_general_context * gen_context )
@@ -1278,7 +1311,6 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
12781311 struct mlx4_priv * priv = mlx4_priv (dev );
12791312 struct mlx4_port_info * port_info ;
12801313 struct mlx4_mfunc_master_ctx * master = & priv -> mfunc .master ;
1281- struct mlx4_slave_state * slave_st = & master -> slave_state [slave ];
12821314 struct mlx4_set_port_rqp_calc_context * qpn_context ;
12831315 struct mlx4_set_port_general_context * gen_context ;
12841316 struct mlx4_roce_gid_entry * gid_entry_tbl , * gid_entry_mbox , * gid_entry_mb1 ;
@@ -1289,7 +1321,6 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
12891321 int base ;
12901322 u32 in_modifier ;
12911323 u32 promisc ;
1292- u16 mtu , prev_mtu ;
12931324 int err ;
12941325 int i , j ;
12951326 int offset ;
@@ -1332,26 +1363,10 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
13321363 break ;
13331364 case MLX4_SET_PORT_GENERAL :
13341365 gen_context = inbox -> buf ;
1335- /* Mtu is configured as the max MTU among all the
1336- * the functions on the port. */
1337- mtu = be16_to_cpu (gen_context -> mtu );
1338- mtu = min_t (int , mtu , dev -> caps .eth_mtu_cap [port ] +
1339- ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN );
1340- prev_mtu = slave_st -> mtu [port ];
1341- slave_st -> mtu [port ] = mtu ;
1342- if (mtu > master -> max_mtu [port ])
1343- master -> max_mtu [port ] = mtu ;
1344- if (mtu < prev_mtu && prev_mtu ==
1345- master -> max_mtu [port ]) {
1346- slave_st -> mtu [port ] = mtu ;
1347- master -> max_mtu [port ] = mtu ;
1348- for (i = 0 ; i < dev -> num_slaves ; i ++ ) {
1349- master -> max_mtu [port ] =
1350- max (master -> max_mtu [port ],
1351- master -> slave_state [i ].mtu [port ]);
1352- }
1353- }
1354- gen_context -> mtu = cpu_to_be16 (master -> max_mtu [port ]);
1366+
1367+ if (gen_context -> flags & MLX4_FLAG_V_MTU_MASK )
1368+ mlx4_en_set_port_mtu (dev , slave , port ,
1369+ gen_context );
13551370
13561371 if (gen_context -> flags2 & MLX4_FLAG2_V_USER_MTU_MASK )
13571372 mlx4_en_set_port_user_mtu (dev , slave , port ,
0 commit comments