aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2016-04-05 14:09:01 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-05 16:20:47 -0400
commit4bb13abf208cb484a9b9d1af9233b0ef850c2fe7 (patch)
tree54a062226813e30b72e1cf91d338ace5cbe02ce5
parent25be862370031056989ee76e3c48c3ac8ff67fd4 (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.c55
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h3
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[] = {
121static const u16 bnxt_async_events_arr[] = { 121static 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
126static bool bnxt_vf_pciid(enum board_idx idx) 127static 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
1239static int bnxt_async_event_process(struct bnxt *bp, 1253static 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
5480static 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
5450static void bnxt_cfg_ntp_filters(struct bnxt *); 5502static void bnxt_cfg_ntp_filters(struct bnxt *);
5451 5503
5452static void bnxt_sp_task(struct work_struct *work) 5504static 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