aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-07-15 17:49:51 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-15 17:49:51 -0400
commitf57ec1889f5e830e93723d1262fd9c73703d531d (patch)
tree350eb82b62a4ca63c17e907e4130c1c3ec5a61f9
parentdd79cf7dd10028d00f99d332d5a0d04734908282 (diff)
parent11719a58bdf7724c463db54ea2abcec54a87b69c (diff)
Merge branch 'mlxsw-fixes'
Jiri Pirko says: ==================== mlxsw: Couple of fixes Couple of fixes for mlxsw driver from Ido. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/reg.h17
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c28
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c8
4 files changed, 26 insertions, 29 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h
index 1977e7a5c530..57d48da709fb 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/reg.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h
@@ -2718,7 +2718,7 @@ static inline void mlxsw_reg_ppcnt_pack(char *payload, u8 local_port,
2718 * Configures the switch priority to buffer table. 2718 * Configures the switch priority to buffer table.
2719 */ 2719 */
2720#define MLXSW_REG_PPTB_ID 0x500B 2720#define MLXSW_REG_PPTB_ID 0x500B
2721#define MLXSW_REG_PPTB_LEN 0x0C 2721#define MLXSW_REG_PPTB_LEN 0x10
2722 2722
2723static const struct mlxsw_reg_info mlxsw_reg_pptb = { 2723static const struct mlxsw_reg_info mlxsw_reg_pptb = {
2724 .id = MLXSW_REG_PPTB_ID, 2724 .id = MLXSW_REG_PPTB_ID,
@@ -2784,6 +2784,13 @@ MLXSW_ITEM32(reg, pptb, pm_msb, 0x08, 24, 8);
2784 */ 2784 */
2785MLXSW_ITEM32(reg, pptb, untagged_buff, 0x08, 0, 4); 2785MLXSW_ITEM32(reg, pptb, untagged_buff, 0x08, 0, 4);
2786 2786
2787/* reg_pptb_prio_to_buff_msb
2788 * Mapping of switch priority <i+8> to one of the allocated receive port
2789 * buffers.
2790 * Access: RW
2791 */
2792MLXSW_ITEM_BIT_ARRAY(reg, pptb, prio_to_buff_msb, 0x0C, 0x04, 4);
2793
2787#define MLXSW_REG_PPTB_ALL_PRIO 0xFF 2794#define MLXSW_REG_PPTB_ALL_PRIO 0xFF
2788 2795
2789static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port) 2796static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port)
@@ -2792,6 +2799,14 @@ static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port)
2792 mlxsw_reg_pptb_mm_set(payload, MLXSW_REG_PPTB_MM_UM); 2799 mlxsw_reg_pptb_mm_set(payload, MLXSW_REG_PPTB_MM_UM);
2793 mlxsw_reg_pptb_local_port_set(payload, local_port); 2800 mlxsw_reg_pptb_local_port_set(payload, local_port);
2794 mlxsw_reg_pptb_pm_set(payload, MLXSW_REG_PPTB_ALL_PRIO); 2801 mlxsw_reg_pptb_pm_set(payload, MLXSW_REG_PPTB_ALL_PRIO);
2802 mlxsw_reg_pptb_pm_msb_set(payload, MLXSW_REG_PPTB_ALL_PRIO);
2803}
2804
2805static inline void mlxsw_reg_pptb_prio_to_buff_pack(char *payload, u8 prio,
2806 u8 buff)
2807{
2808 mlxsw_reg_pptb_prio_to_buff_set(payload, prio, buff);
2809 mlxsw_reg_pptb_prio_to_buff_msb_set(payload, prio, buff);
2795} 2810}
2796 2811
2797/* PBMC - Port Buffer Management Control Register 2812/* PBMC - Port Buffer Management Control Register
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 660429ebfbe1..374080027b2f 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -171,23 +171,6 @@ static int mlxsw_sp_port_admin_status_set(struct mlxsw_sp_port *mlxsw_sp_port,
171 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(paos), paos_pl); 171 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(paos), paos_pl);
172} 172}
173 173
174static int mlxsw_sp_port_oper_status_get(struct mlxsw_sp_port *mlxsw_sp_port,
175 bool *p_is_up)
176{
177 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
178 char paos_pl[MLXSW_REG_PAOS_LEN];
179 u8 oper_status;
180 int err;
181
182 mlxsw_reg_paos_pack(paos_pl, mlxsw_sp_port->local_port, 0);
183 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(paos), paos_pl);
184 if (err)
185 return err;
186 oper_status = mlxsw_reg_paos_oper_status_get(paos_pl);
187 *p_is_up = oper_status == MLXSW_PORT_ADMIN_STATUS_UP ? true : false;
188 return 0;
189}
190
191static int mlxsw_sp_port_dev_addr_set(struct mlxsw_sp_port *mlxsw_sp_port, 174static int mlxsw_sp_port_dev_addr_set(struct mlxsw_sp_port *mlxsw_sp_port,
192 unsigned char *addr) 175 unsigned char *addr)
193{ 176{
@@ -1434,7 +1417,8 @@ static int mlxsw_sp_port_get_settings(struct net_device *dev,
1434 1417
1435 cmd->supported = mlxsw_sp_from_ptys_supported_port(eth_proto_cap) | 1418 cmd->supported = mlxsw_sp_from_ptys_supported_port(eth_proto_cap) |
1436 mlxsw_sp_from_ptys_supported_link(eth_proto_cap) | 1419 mlxsw_sp_from_ptys_supported_link(eth_proto_cap) |
1437 SUPPORTED_Pause | SUPPORTED_Asym_Pause; 1420 SUPPORTED_Pause | SUPPORTED_Asym_Pause |
1421 SUPPORTED_Autoneg;
1438 cmd->advertising = mlxsw_sp_from_ptys_advert_link(eth_proto_admin); 1422 cmd->advertising = mlxsw_sp_from_ptys_advert_link(eth_proto_admin);
1439 mlxsw_sp_from_ptys_speed_duplex(netif_carrier_ok(dev), 1423 mlxsw_sp_from_ptys_speed_duplex(netif_carrier_ok(dev),
1440 eth_proto_oper, cmd); 1424 eth_proto_oper, cmd);
@@ -1493,7 +1477,6 @@ static int mlxsw_sp_port_set_settings(struct net_device *dev,
1493 u32 eth_proto_new; 1477 u32 eth_proto_new;
1494 u32 eth_proto_cap; 1478 u32 eth_proto_cap;
1495 u32 eth_proto_admin; 1479 u32 eth_proto_admin;
1496 bool is_up;
1497 int err; 1480 int err;
1498 1481
1499 speed = ethtool_cmd_speed(cmd); 1482 speed = ethtool_cmd_speed(cmd);
@@ -1525,12 +1508,7 @@ static int mlxsw_sp_port_set_settings(struct net_device *dev,
1525 return err; 1508 return err;
1526 } 1509 }
1527 1510
1528 err = mlxsw_sp_port_oper_status_get(mlxsw_sp_port, &is_up); 1511 if (!netif_running(dev))
1529 if (err) {
1530 netdev_err(dev, "Failed to get oper status");
1531 return err;
1532 }
1533 if (!is_up)
1534 return 0; 1512 return 0;
1535 1513
1536 err = mlxsw_sp_port_admin_status_set(mlxsw_sp_port, false); 1514 err = mlxsw_sp_port_admin_status_set(mlxsw_sp_port, false);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
index a3720a0fad7d..074cdda7b6f3 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
@@ -194,7 +194,7 @@ static int mlxsw_sp_port_pb_prio_init(struct mlxsw_sp_port *mlxsw_sp_port)
194 194
195 mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port); 195 mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port);
196 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) 196 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
197 mlxsw_reg_pptb_prio_to_buff_set(pptb_pl, i, 0); 197 mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, i, 0);
198 return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb), 198 return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb),
199 pptb_pl); 199 pptb_pl);
200} 200}
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c
index 0b323661c0b6..01cfb7512827 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c
@@ -103,7 +103,8 @@ static int mlxsw_sp_port_pg_prio_map(struct mlxsw_sp_port *mlxsw_sp_port,
103 103
104 mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port); 104 mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port);
105 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) 105 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
106 mlxsw_reg_pptb_prio_to_buff_set(pptb_pl, i, prio_tc[i]); 106 mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, i, prio_tc[i]);
107
107 return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb), 108 return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb),
108 pptb_pl); 109 pptb_pl);
109} 110}
@@ -249,6 +250,7 @@ static int mlxsw_sp_dcbnl_ieee_setets(struct net_device *dev,
249 return err; 250 return err;
250 251
251 memcpy(mlxsw_sp_port->dcb.ets, ets, sizeof(*ets)); 252 memcpy(mlxsw_sp_port->dcb.ets, ets, sizeof(*ets));
253 mlxsw_sp_port->dcb.ets->ets_cap = IEEE_8021QAZ_MAX_TCS;
252 254
253 return 0; 255 return 0;
254} 256}
@@ -351,7 +353,8 @@ static int mlxsw_sp_dcbnl_ieee_setpfc(struct net_device *dev,
351 struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev); 353 struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
352 int err; 354 int err;
353 355
354 if (mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause) { 356 if ((mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause) &&
357 pfc->pfc_en) {
355 netdev_err(dev, "PAUSE frames already enabled on port\n"); 358 netdev_err(dev, "PAUSE frames already enabled on port\n");
356 return -EINVAL; 359 return -EINVAL;
357 } 360 }
@@ -371,6 +374,7 @@ static int mlxsw_sp_dcbnl_ieee_setpfc(struct net_device *dev,
371 } 374 }
372 375
373 memcpy(mlxsw_sp_port->dcb.pfc, pfc, sizeof(*pfc)); 376 memcpy(mlxsw_sp_port->dcb.pfc, pfc, sizeof(*pfc));
377 mlxsw_sp_port->dcb.pfc->pfc_cap = IEEE_8021QAZ_MAX_TCS;
374 378
375 return 0; 379 return 0;
376 380