diff options
author | David S. Miller <davem@davemloft.net> | 2016-07-15 17:49:51 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-15 17:49:51 -0400 |
commit | f57ec1889f5e830e93723d1262fd9c73703d531d (patch) | |
tree | 350eb82b62a4ca63c17e907e4130c1c3ec5a61f9 | |
parent | dd79cf7dd10028d00f99d332d5a0d04734908282 (diff) | |
parent | 11719a58bdf7724c463db54ea2abcec54a87b69c (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.h | 17 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 28 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c | 8 |
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 | ||
2723 | static const struct mlxsw_reg_info mlxsw_reg_pptb = { | 2723 | static 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 | */ |
2785 | MLXSW_ITEM32(reg, pptb, untagged_buff, 0x08, 0, 4); | 2785 | MLXSW_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 | */ | ||
2792 | MLXSW_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 | ||
2789 | static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port) | 2796 | static 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 | |||
2805 | static 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 | ||
174 | static 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 | |||
191 | static int mlxsw_sp_port_dev_addr_set(struct mlxsw_sp_port *mlxsw_sp_port, | 174 | static 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 | ||