diff options
author | Michael Chan <michael.chan@broadcom.com> | 2016-04-05 14:09:01 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-05 16:20:47 -0400 |
commit | 4bb13abf208cb484a9b9d1af9233b0ef850c2fe7 (patch) | |
tree | 54a062226813e30b72e1cf91d338ace5cbe02ce5 | |
parent | 25be862370031056989ee76e3c48c3ac8ff67fd4 (diff) |
bnxt_en: Add unsupported SFP+ module warnings.
Add the PORT_CONN_NOT_ALLOWED async event handling logic. The driver
will print an appropriate warning to reflect the SFP+ module enforcement
policy done in the firmware.
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.c | 55 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 |
2 files changed, 58 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index dd0b32c58a24..597e4724a474 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | |||
@@ -121,6 +121,7 @@ static const u16 bnxt_vf_req_snif[] = { | |||
121 | static const u16 bnxt_async_events_arr[] = { | 121 | static const u16 bnxt_async_events_arr[] = { |
122 | HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE, | 122 | HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE, |
123 | HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD, | 123 | HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD, |
124 | HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED, | ||
124 | }; | 125 | }; |
125 | 126 | ||
126 | static bool bnxt_vf_pciid(enum board_idx idx) | 127 | static bool bnxt_vf_pciid(enum board_idx idx) |
@@ -1236,6 +1237,19 @@ next_rx_no_prod: | |||
1236 | return rc; | 1237 | return rc; |
1237 | } | 1238 | } |
1238 | 1239 | ||
1240 | #define BNXT_GET_EVENT_PORT(data) \ | ||
1241 | ((data) & \ | ||
1242 | HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_PORT_ID_MASK) | ||
1243 | |||
1244 | #define BNXT_EVENT_POLICY_MASK \ | ||
1245 | HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_MASK | ||
1246 | |||
1247 | #define BNXT_EVENT_POLICY_SFT \ | ||
1248 | HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_SFT | ||
1249 | |||
1250 | #define BNXT_GET_EVENT_POLICY(data) \ | ||
1251 | (((data) & BNXT_EVENT_POLICY_MASK) >> BNXT_EVENT_POLICY_SFT) | ||
1252 | |||
1239 | static int bnxt_async_event_process(struct bnxt *bp, | 1253 | static int bnxt_async_event_process(struct bnxt *bp, |
1240 | struct hwrm_async_event_cmpl *cmpl) | 1254 | struct hwrm_async_event_cmpl *cmpl) |
1241 | { | 1255 | { |
@@ -1249,6 +1263,22 @@ static int bnxt_async_event_process(struct bnxt *bp, | |||
1249 | case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD: | 1263 | case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD: |
1250 | set_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event); | 1264 | set_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event); |
1251 | break; | 1265 | break; |
1266 | case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED: { | ||
1267 | u32 data1 = le32_to_cpu(cmpl->event_data1); | ||
1268 | u16 port_id = BNXT_GET_EVENT_PORT(data1); | ||
1269 | |||
1270 | if (BNXT_VF(bp)) | ||
1271 | break; | ||
1272 | |||
1273 | if (bp->pf.port_id != port_id) | ||
1274 | break; | ||
1275 | |||
1276 | bp->link_info.last_port_module_event = | ||
1277 | BNXT_GET_EVENT_POLICY(data1); | ||
1278 | |||
1279 | set_bit(BNXT_HWRM_PORT_MODULE_SP_EVENT, &bp->sp_event); | ||
1280 | break; | ||
1281 | } | ||
1252 | default: | 1282 | default: |
1253 | netdev_err(bp->dev, "unhandled ASYNC event (id 0x%x)\n", | 1283 | netdev_err(bp->dev, "unhandled ASYNC event (id 0x%x)\n", |
1254 | event_id); | 1284 | event_id); |
@@ -5447,6 +5477,28 @@ bnxt_restart_timer: | |||
5447 | mod_timer(&bp->timer, jiffies + bp->current_interval); | 5477 | mod_timer(&bp->timer, jiffies + bp->current_interval); |
5448 | } | 5478 | } |
5449 | 5479 | ||
5480 | static void bnxt_port_module_event(struct bnxt *bp) | ||
5481 | { | ||
5482 | struct bnxt_link_info *link_info = &bp->link_info; | ||
5483 | struct hwrm_port_phy_qcfg_output *resp = &link_info->phy_qcfg_resp; | ||
5484 | |||
5485 | if (bnxt_update_link(bp, true)) | ||
5486 | return; | ||
5487 | |||
5488 | if (link_info->last_port_module_event != 0) { | ||
5489 | netdev_warn(bp->dev, "Unqualified SFP+ module detected on port %d\n", | ||
5490 | bp->pf.port_id); | ||
5491 | if (bp->hwrm_spec_code >= 0x10201) { | ||
5492 | netdev_warn(bp->dev, "Module part number %s\n", | ||
5493 | resp->phy_vendor_partnumber); | ||
5494 | } | ||
5495 | } | ||
5496 | if (link_info->last_port_module_event == 1) | ||
5497 | netdev_warn(bp->dev, "TX is disabled\n"); | ||
5498 | if (link_info->last_port_module_event == 3) | ||
5499 | netdev_warn(bp->dev, "Shutdown SFP+ module\n"); | ||
5500 | } | ||
5501 | |||
5450 | static void bnxt_cfg_ntp_filters(struct bnxt *); | 5502 | static void bnxt_cfg_ntp_filters(struct bnxt *); |
5451 | 5503 | ||
5452 | static void bnxt_sp_task(struct work_struct *work) | 5504 | static void bnxt_sp_task(struct work_struct *work) |
@@ -5494,6 +5546,9 @@ static void bnxt_sp_task(struct work_struct *work) | |||
5494 | rtnl_unlock(); | 5546 | rtnl_unlock(); |
5495 | } | 5547 | } |
5496 | 5548 | ||
5549 | if (test_and_clear_bit(BNXT_HWRM_PORT_MODULE_SP_EVENT, &bp->sp_event)) | ||
5550 | bnxt_port_module_event(bp); | ||
5551 | |||
5497 | if (test_and_clear_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event)) | 5552 | if (test_and_clear_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event)) |
5498 | bnxt_hwrm_port_qstats(bp); | 5553 | bnxt_hwrm_port_qstats(bp); |
5499 | 5554 | ||
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index a981e2c17107..cc8e38a9f684 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h | |||
@@ -825,6 +825,8 @@ struct bnxt_link_info { | |||
825 | u16 req_link_speed; | 825 | u16 req_link_speed; |
826 | u32 advertising; | 826 | u32 advertising; |
827 | bool force_link_chng; | 827 | bool force_link_chng; |
828 | |||
829 | u8 last_port_module_event; | ||
828 | /* a copy of phy_qcfg output used to report link | 830 | /* a copy of phy_qcfg output used to report link |
829 | * info to VF | 831 | * info to VF |
830 | */ | 832 | */ |
@@ -992,6 +994,7 @@ struct bnxt { | |||
992 | #define BNXT_RST_RING_SP_EVENT 7 | 994 | #define BNXT_RST_RING_SP_EVENT 7 |
993 | #define BNXT_HWRM_PF_UNLOAD_SP_EVENT 8 | 995 | #define BNXT_HWRM_PF_UNLOAD_SP_EVENT 8 |
994 | #define BNXT_PERIODIC_STATS_SP_EVENT 9 | 996 | #define BNXT_PERIODIC_STATS_SP_EVENT 9 |
997 | #define BNXT_HWRM_PORT_MODULE_SP_EVENT 10 | ||
995 | 998 | ||
996 | struct bnxt_pf_info pf; | 999 | struct bnxt_pf_info pf; |
997 | #ifdef CONFIG_BNXT_SRIOV | 1000 | #ifdef CONFIG_BNXT_SRIOV |