aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex/benet/be_cmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_cmds.c')
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c21
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:
125static void be_async_link_state_process(struct be_adapter *adapter, 125static 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 */
1234int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed, 1241int 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
1266err: 1279err: