diff options
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_cmds.c')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 62868ea48295..0fcb45624796 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -125,7 +125,14 @@ done: | |||
125 | static void be_async_link_state_process(struct be_adapter *adapter, | 125 | static void be_async_link_state_process(struct be_adapter *adapter, |
126 | struct be_async_event_link_state *evt) | 126 | struct be_async_event_link_state *evt) |
127 | { | 127 | { |
128 | be_link_status_update(adapter, evt->port_link_status); | 128 | /* When link status changes, link speed must be re-queried from FW */ |
129 | adapter->link_speed = -1; | ||
130 | |||
131 | /* For the initial link status do not rely on the ASYNC event as | ||
132 | * it may not be received in some cases. | ||
133 | */ | ||
134 | if (adapter->flags & BE_FLAGS_LINK_STATUS_INIT) | ||
135 | be_link_status_update(adapter, evt->port_link_status); | ||
129 | } | 136 | } |
130 | 137 | ||
131 | /* Grp5 CoS Priority evt */ | 138 | /* Grp5 CoS Priority evt */ |
@@ -1232,7 +1239,7 @@ err: | |||
1232 | 1239 | ||
1233 | /* Uses synchronous mcc */ | 1240 | /* Uses synchronous mcc */ |
1234 | int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed, | 1241 | int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed, |
1235 | u16 *link_speed, u32 dom) | 1242 | u16 *link_speed, u8 *link_status, u32 dom) |
1236 | { | 1243 | { |
1237 | struct be_mcc_wrb *wrb; | 1244 | struct be_mcc_wrb *wrb; |
1238 | struct be_cmd_req_link_status *req; | 1245 | struct be_cmd_req_link_status *req; |
@@ -1240,6 +1247,9 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed, | |||
1240 | 1247 | ||
1241 | spin_lock_bh(&adapter->mcc_lock); | 1248 | spin_lock_bh(&adapter->mcc_lock); |
1242 | 1249 | ||
1250 | if (link_status) | ||
1251 | *link_status = LINK_DOWN; | ||
1252 | |||
1243 | wrb = wrb_from_mccq(adapter); | 1253 | wrb = wrb_from_mccq(adapter); |
1244 | if (!wrb) { | 1254 | if (!wrb) { |
1245 | status = -EBUSY; | 1255 | status = -EBUSY; |
@@ -1247,7 +1257,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed, | |||
1247 | } | 1257 | } |
1248 | req = embedded_payload(wrb); | 1258 | req = embedded_payload(wrb); |
1249 | 1259 | ||
1250 | if (lancer_chip(adapter)) | 1260 | if (adapter->generation == BE_GEN3 || lancer_chip(adapter)) |
1251 | req->hdr.version = 1; | 1261 | req->hdr.version = 1; |
1252 | 1262 | ||
1253 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | 1263 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, |
@@ -1257,10 +1267,13 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed, | |||
1257 | if (!status) { | 1267 | if (!status) { |
1258 | struct be_cmd_resp_link_status *resp = embedded_payload(wrb); | 1268 | struct be_cmd_resp_link_status *resp = embedded_payload(wrb); |
1259 | if (resp->mac_speed != PHY_LINK_SPEED_ZERO) { | 1269 | if (resp->mac_speed != PHY_LINK_SPEED_ZERO) { |
1260 | *link_speed = le16_to_cpu(resp->link_speed); | 1270 | if (link_speed) |
1271 | *link_speed = le16_to_cpu(resp->link_speed); | ||
1261 | if (mac_speed) | 1272 | if (mac_speed) |
1262 | *mac_speed = resp->mac_speed; | 1273 | *mac_speed = resp->mac_speed; |
1263 | } | 1274 | } |
1275 | if (link_status) | ||
1276 | *link_status = resp->logical_link_status; | ||
1264 | } | 1277 | } |
1265 | 1278 | ||
1266 | err: | 1279 | err: |