aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2016-04-11 04:11:14 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-11 14:58:45 -0400
commit8cbde1175e3c8565edbb777cd09cbfdb93c78397 (patch)
treeca15a29ae475eef0d982b7899efde6a4d4f55a77
parent84c33dd342ad596a271a61da0119bf34e80bb1c5 (diff)
bnxt_en: Add async event handling for speed config changes.
On some dual port cards, link speeds on both ports have to be compatible. Firmware will inform the driver when a certain speed is no longer supported if the other port has linked up at a certain speed. Add logic to handle this event by logging a message and getting the updated list of supported speeds. 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.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index c83a5a1862d0..4645c44e7c15 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -122,6 +122,7 @@ 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 HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED,
125 HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE,
125}; 126};
126 127
127static bool bnxt_vf_pciid(enum board_idx idx) 128static bool bnxt_vf_pciid(enum board_idx idx)
@@ -1257,6 +1258,21 @@ static int bnxt_async_event_process(struct bnxt *bp,
1257 1258
1258 /* TODO CHIMP_FW: Define event id's for link change, error etc */ 1259 /* TODO CHIMP_FW: Define event id's for link change, error etc */
1259 switch (event_id) { 1260 switch (event_id) {
1261 case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE: {
1262 u32 data1 = le32_to_cpu(cmpl->event_data1);
1263 struct bnxt_link_info *link_info = &bp->link_info;
1264
1265 if (BNXT_VF(bp))
1266 goto async_event_process_exit;
1267 if (data1 & 0x20000) {
1268 u16 fw_speed = link_info->force_link_speed;
1269 u32 speed = bnxt_fw_to_ethtool_speed(fw_speed);
1270
1271 netdev_warn(bp->dev, "Link speed %d no longer supported\n",
1272 speed);
1273 }
1274 /* fall thru */
1275 }
1260 case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE: 1276 case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
1261 set_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event); 1277 set_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event);
1262 break; 1278 break;