aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTariq Toukan <tariqt@mellanox.com>2016-09-11 03:56:19 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-11 22:40:26 -0400
commit564ed9b187082da79726a2f25bb88a58ebeec7e8 (patch)
tree5e85335819dd264382ecb66c47a8cab88e3d9062
parentc677071741343381f4f555867c04af7ec4a90869 (diff)
net/mlx4_en: Fixes for DCBX
This patch adds a capability check before enabling DCBX. In addition, it re-organizes the relevant data structures, and fixes a typo in a define. Fixes: af7d51852631 ("net/mlx4_en: Add DCB PFC support through CEE netlink commands") Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c31
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c21
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h15
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/port.c4
4 files changed, 28 insertions, 43 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c
index 316a70714434..b04760a5034b 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c
@@ -94,7 +94,7 @@ static u8 mlx4_en_dcbnl_getcap(struct net_device *dev, int capid, u8 *cap)
94 *cap = true; 94 *cap = true;
95 break; 95 break;
96 case DCB_CAP_ATTR_DCBX: 96 case DCB_CAP_ATTR_DCBX:
97 *cap = priv->cee_params.dcbx_cap; 97 *cap = priv->dcbx_cap;
98 break; 98 break;
99 case DCB_CAP_ATTR_PFC_TCS: 99 case DCB_CAP_ATTR_PFC_TCS:
100 *cap = 1 << mlx4_max_tc(priv->mdev->dev); 100 *cap = 1 << mlx4_max_tc(priv->mdev->dev);
@@ -111,14 +111,14 @@ static u8 mlx4_en_dcbnl_getpfcstate(struct net_device *netdev)
111{ 111{
112 struct mlx4_en_priv *priv = netdev_priv(netdev); 112 struct mlx4_en_priv *priv = netdev_priv(netdev);
113 113
114 return priv->cee_params.dcb_cfg.pfc_state; 114 return priv->cee_config.pfc_state;
115} 115}
116 116
117static void mlx4_en_dcbnl_setpfcstate(struct net_device *netdev, u8 state) 117static void mlx4_en_dcbnl_setpfcstate(struct net_device *netdev, u8 state)
118{ 118{
119 struct mlx4_en_priv *priv = netdev_priv(netdev); 119 struct mlx4_en_priv *priv = netdev_priv(netdev);
120 120
121 priv->cee_params.dcb_cfg.pfc_state = state; 121 priv->cee_config.pfc_state = state;
122} 122}
123 123
124static void mlx4_en_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, 124static void mlx4_en_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority,
@@ -126,7 +126,7 @@ static void mlx4_en_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority,
126{ 126{
127 struct mlx4_en_priv *priv = netdev_priv(netdev); 127 struct mlx4_en_priv *priv = netdev_priv(netdev);
128 128
129 *setting = priv->cee_params.dcb_cfg.tc_config[priority].dcb_pfc; 129 *setting = priv->cee_config.dcb_pfc[priority];
130} 130}
131 131
132static void mlx4_en_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority, 132static void mlx4_en_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority,
@@ -134,8 +134,8 @@ static void mlx4_en_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority,
134{ 134{
135 struct mlx4_en_priv *priv = netdev_priv(netdev); 135 struct mlx4_en_priv *priv = netdev_priv(netdev);
136 136
137 priv->cee_params.dcb_cfg.tc_config[priority].dcb_pfc = setting; 137 priv->cee_config.dcb_pfc[priority] = setting;
138 priv->cee_params.dcb_cfg.pfc_state = true; 138 priv->cee_config.pfc_state = true;
139} 139}
140 140
141static int mlx4_en_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num) 141static int mlx4_en_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num)
@@ -157,12 +157,11 @@ static u8 mlx4_en_dcbnl_set_all(struct net_device *netdev)
157{ 157{
158 struct mlx4_en_priv *priv = netdev_priv(netdev); 158 struct mlx4_en_priv *priv = netdev_priv(netdev);
159 struct mlx4_en_dev *mdev = priv->mdev; 159 struct mlx4_en_dev *mdev = priv->mdev;
160 struct mlx4_en_cee_config *dcb_cfg = &priv->cee_params.dcb_cfg;
161 160
162 if (!(priv->cee_params.dcbx_cap & DCB_CAP_DCBX_VER_CEE)) 161 if (!(priv->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
163 return 1; 162 return 1;
164 163
165 if (dcb_cfg->pfc_state) { 164 if (priv->cee_config.pfc_state) {
166 int tc; 165 int tc;
167 166
168 priv->prof->rx_pause = 0; 167 priv->prof->rx_pause = 0;
@@ -170,7 +169,7 @@ static u8 mlx4_en_dcbnl_set_all(struct net_device *netdev)
170 for (tc = 0; tc < CEE_DCBX_MAX_PRIO; tc++) { 169 for (tc = 0; tc < CEE_DCBX_MAX_PRIO; tc++) {
171 u8 tc_mask = 1 << tc; 170 u8 tc_mask = 1 << tc;
172 171
173 switch (dcb_cfg->tc_config[tc].dcb_pfc) { 172 switch (priv->cee_config.dcb_pfc[tc]) {
174 case pfc_disabled: 173 case pfc_disabled:
175 priv->prof->tx_ppp &= ~tc_mask; 174 priv->prof->tx_ppp &= ~tc_mask;
176 priv->prof->rx_ppp &= ~tc_mask; 175 priv->prof->rx_ppp &= ~tc_mask;
@@ -226,7 +225,7 @@ static u8 mlx4_en_dcbnl_set_state(struct net_device *dev, u8 state)
226 struct mlx4_en_priv *priv = netdev_priv(dev); 225 struct mlx4_en_priv *priv = netdev_priv(dev);
227 int num_tcs = 0; 226 int num_tcs = 0;
228 227
229 if (!(priv->cee_params.dcbx_cap & DCB_CAP_DCBX_VER_CEE)) 228 if (!(priv->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
230 return 1; 229 return 1;
231 230
232 if (!!(state) == !!(priv->flags & MLX4_EN_FLAG_DCB_ENABLED)) 231 if (!!(state) == !!(priv->flags & MLX4_EN_FLAG_DCB_ENABLED))
@@ -256,7 +255,7 @@ static int mlx4_en_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id)
256 .selector = idtype, 255 .selector = idtype,
257 .protocol = id, 256 .protocol = id,
258 }; 257 };
259 if (!(priv->cee_params.dcbx_cap & DCB_CAP_DCBX_VER_CEE)) 258 if (!(priv->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
260 return 0; 259 return 0;
261 260
262 return dcb_getapp(netdev, &app); 261 return dcb_getapp(netdev, &app);
@@ -268,7 +267,7 @@ static int mlx4_en_dcbnl_setapp(struct net_device *netdev, u8 idtype,
268 struct mlx4_en_priv *priv = netdev_priv(netdev); 267 struct mlx4_en_priv *priv = netdev_priv(netdev);
269 struct dcb_app app; 268 struct dcb_app app;
270 269
271 if (!(priv->cee_params.dcbx_cap & DCB_CAP_DCBX_VER_CEE)) 270 if (!(priv->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
272 return -EINVAL; 271 return -EINVAL;
273 272
274 memset(&app, 0, sizeof(struct dcb_app)); 273 memset(&app, 0, sizeof(struct dcb_app));
@@ -437,7 +436,7 @@ static u8 mlx4_en_dcbnl_getdcbx(struct net_device *dev)
437{ 436{
438 struct mlx4_en_priv *priv = netdev_priv(dev); 437 struct mlx4_en_priv *priv = netdev_priv(dev);
439 438
440 return priv->cee_params.dcbx_cap; 439 return priv->dcbx_cap;
441} 440}
442 441
443static u8 mlx4_en_dcbnl_setdcbx(struct net_device *dev, u8 mode) 442static u8 mlx4_en_dcbnl_setdcbx(struct net_device *dev, u8 mode)
@@ -446,7 +445,7 @@ static u8 mlx4_en_dcbnl_setdcbx(struct net_device *dev, u8 mode)
446 struct ieee_ets ets = {0}; 445 struct ieee_ets ets = {0};
447 struct ieee_pfc pfc = {0}; 446 struct ieee_pfc pfc = {0};
448 447
449 if (mode == priv->cee_params.dcbx_cap) 448 if (mode == priv->dcbx_cap)
450 return 0; 449 return 0;
451 450
452 if ((mode & DCB_CAP_DCBX_LLD_MANAGED) || 451 if ((mode & DCB_CAP_DCBX_LLD_MANAGED) ||
@@ -455,7 +454,7 @@ static u8 mlx4_en_dcbnl_setdcbx(struct net_device *dev, u8 mode)
455 !(mode & DCB_CAP_DCBX_HOST)) 454 !(mode & DCB_CAP_DCBX_HOST))
456 goto err; 455 goto err;
457 456
458 priv->cee_params.dcbx_cap = mode; 457 priv->dcbx_cap = mode;
459 458
460 ets.ets_cap = IEEE_8021QAZ_MAX_TCS; 459 ets.ets_cap = IEEE_8021QAZ_MAX_TCS;
461 pfc.pfc_cap = IEEE_8021QAZ_MAX_TCS; 460 pfc.pfc_cap = IEEE_8021QAZ_MAX_TCS;
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 4198e9bf89d0..fedb829276f4 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -71,10 +71,11 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up)
71#ifdef CONFIG_MLX4_EN_DCB 71#ifdef CONFIG_MLX4_EN_DCB
72 if (!mlx4_is_slave(priv->mdev->dev)) { 72 if (!mlx4_is_slave(priv->mdev->dev)) {
73 if (up) { 73 if (up) {
74 priv->flags |= MLX4_EN_FLAG_DCB_ENABLED; 74 if (priv->dcbx_cap)
75 priv->flags |= MLX4_EN_FLAG_DCB_ENABLED;
75 } else { 76 } else {
76 priv->flags &= ~MLX4_EN_FLAG_DCB_ENABLED; 77 priv->flags &= ~MLX4_EN_FLAG_DCB_ENABLED;
77 priv->cee_params.dcb_cfg.pfc_state = false; 78 priv->cee_config.pfc_state = false;
78 } 79 }
79 } 80 }
80#endif /* CONFIG_MLX4_EN_DCB */ 81#endif /* CONFIG_MLX4_EN_DCB */
@@ -3048,9 +3049,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
3048 struct mlx4_en_priv *priv; 3049 struct mlx4_en_priv *priv;
3049 int i; 3050 int i;
3050 int err; 3051 int err;
3051#ifdef CONFIG_MLX4_EN_DCB
3052 struct tc_configuration *tc;
3053#endif
3054 3052
3055 dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv), 3053 dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv),
3056 MAX_TX_RINGS, MAX_RX_RINGS); 3054 MAX_TX_RINGS, MAX_RX_RINGS);
@@ -3117,16 +3115,13 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
3117 priv->msg_enable = MLX4_EN_MSG_LEVEL; 3115 priv->msg_enable = MLX4_EN_MSG_LEVEL;
3118#ifdef CONFIG_MLX4_EN_DCB 3116#ifdef CONFIG_MLX4_EN_DCB
3119 if (!mlx4_is_slave(priv->mdev->dev)) { 3117 if (!mlx4_is_slave(priv->mdev->dev)) {
3120 priv->cee_params.dcbx_cap = DCB_CAP_DCBX_VER_CEE | 3118 priv->dcbx_cap = DCB_CAP_DCBX_VER_CEE | DCB_CAP_DCBX_HOST |
3121 DCB_CAP_DCBX_HOST | 3119 DCB_CAP_DCBX_VER_IEEE;
3122 DCB_CAP_DCBX_VER_IEEE;
3123 priv->flags |= MLX4_EN_DCB_ENABLED; 3120 priv->flags |= MLX4_EN_DCB_ENABLED;
3124 priv->cee_params.dcb_cfg.pfc_state = false; 3121 priv->cee_config.pfc_state = false;
3125 3122
3126 for (i = 0; i < MLX4_EN_NUM_UP; i++) { 3123 for (i = 0; i < MLX4_EN_NUM_UP; i++)
3127 tc = &priv->cee_params.dcb_cfg.tc_config[i]; 3124 priv->cee_config.dcb_pfc[i] = pfc_disabled;
3128 tc->dcb_pfc = pfc_disabled;
3129 }
3130 3125
3131 if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ETS_CFG) { 3126 if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ETS_CFG) {
3132 dev->dcbnl_ops = &mlx4_en_dcbnl_ops; 3127 dev->dcbnl_ops = &mlx4_en_dcbnl_ops;
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 2c2913dcae98..9099dbd04951 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -482,20 +482,10 @@ enum dcb_pfc_type {
482 pfc_enabled_rx 482 pfc_enabled_rx
483}; 483};
484 484
485struct tc_configuration {
486 enum dcb_pfc_type dcb_pfc;
487};
488
489struct mlx4_en_cee_config { 485struct mlx4_en_cee_config {
490 bool pfc_state; 486 bool pfc_state;
491 struct tc_configuration tc_config[MLX4_EN_NUM_UP]; 487 enum dcb_pfc_type dcb_pfc[MLX4_EN_NUM_UP];
492}; 488};
493
494struct mlx4_en_cee_params {
495 u8 dcbx_cap;
496 struct mlx4_en_cee_config dcb_cfg;
497};
498
499#endif 489#endif
500 490
501struct ethtool_flow_id { 491struct ethtool_flow_id {
@@ -624,7 +614,8 @@ struct mlx4_en_priv {
624 struct ieee_ets ets; 614 struct ieee_ets ets;
625 u16 maxrate[IEEE_8021QAZ_MAX_TCS]; 615 u16 maxrate[IEEE_8021QAZ_MAX_TCS];
626 enum dcbnl_cndd_states cndd_state[IEEE_8021QAZ_MAX_TCS]; 616 enum dcbnl_cndd_states cndd_state[IEEE_8021QAZ_MAX_TCS];
627 struct mlx4_en_cee_params cee_params; 617 struct mlx4_en_cee_config cee_config;
618 u8 dcbx_cap;
628#endif 619#endif
629#ifdef CONFIG_RFS_ACCEL 620#ifdef CONFIG_RFS_ACCEL
630 spinlock_t filters_lock; 621 spinlock_t filters_lock;
diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c
index 3d2095e5c61c..c5b2064297a1 100644
--- a/drivers/net/ethernet/mellanox/mlx4/port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/port.c
@@ -52,7 +52,7 @@
52 52
53#define MLX4_FLAG_V_IGNORE_FCS_MASK 0x2 53#define MLX4_FLAG_V_IGNORE_FCS_MASK 0x2
54#define MLX4_IGNORE_FCS_MASK 0x1 54#define MLX4_IGNORE_FCS_MASK 0x1
55#define MLNX4_TX_MAX_NUMBER 8 55#define MLX4_TC_MAX_NUMBER 8
56 56
57void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table) 57void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table)
58{ 58{
@@ -2022,7 +2022,7 @@ int mlx4_max_tc(struct mlx4_dev *dev)
2022 u8 num_tc = dev->caps.max_tc_eth; 2022 u8 num_tc = dev->caps.max_tc_eth;
2023 2023
2024 if (!num_tc) 2024 if (!num_tc)
2025 num_tc = MLNX4_TX_MAX_NUMBER; 2025 num_tc = MLX4_TC_MAX_NUMBER;
2026 2026
2027 return num_tc; 2027 return num_tc;
2028} 2028}