diff options
author | Michael Chan <michael.chan@broadcom.com> | 2016-04-11 04:11:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-11 14:58:45 -0400 |
commit | 8cbde1175e3c8565edbb777cd09cbfdb93c78397 (patch) | |
tree | ca15a29ae475eef0d982b7899efde6a4d4f55a77 | |
parent | 84c33dd342ad596a271a61da0119bf34e80bb1c5 (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.c | 16 |
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 | ||
127 | static bool bnxt_vf_pciid(enum board_idx idx) | 128 | static 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; |