qlcnic: Fix loopback diagnostic test
o Adapter requires that if the port is in loopback mode no traffic should be flowing through that port, so on arrival of Link up AEN, do not advertise Link up to the stack until port is out of loopback mode Signed-off-by: Manish Chopra <manish.chopra@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c3ac17cd6a
commit
d9c602f033
3 changed files with 7 additions and 6 deletions
|
@ -487,6 +487,7 @@ struct qlcnic_hardware_context {
|
||||||
struct qlcnic_mailbox *mailbox;
|
struct qlcnic_mailbox *mailbox;
|
||||||
u8 extend_lb_time;
|
u8 extend_lb_time;
|
||||||
u8 phys_port_id[ETH_ALEN];
|
u8 phys_port_id[ETH_ALEN];
|
||||||
|
u8 lb_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct qlcnic_adapter_stats {
|
struct qlcnic_adapter_stats {
|
||||||
|
@ -808,6 +809,7 @@ struct qlcnic_mac_list_s {
|
||||||
|
|
||||||
#define QLCNIC_ILB_MODE 0x1
|
#define QLCNIC_ILB_MODE 0x1
|
||||||
#define QLCNIC_ELB_MODE 0x2
|
#define QLCNIC_ELB_MODE 0x2
|
||||||
|
#define QLCNIC_LB_MODE_MASK 0x3
|
||||||
|
|
||||||
#define QLCNIC_LINKEVENT 0x1
|
#define QLCNIC_LINKEVENT 0x1
|
||||||
#define QLCNIC_LB_RESPONSE 0x2
|
#define QLCNIC_LB_RESPONSE 0x2
|
||||||
|
|
|
@ -1684,12 +1684,6 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
|
||||||
}
|
}
|
||||||
} while ((adapter->ahw->linkup && ahw->has_link_events) != 1);
|
} while ((adapter->ahw->linkup && ahw->has_link_events) != 1);
|
||||||
|
|
||||||
/* Make sure carrier is off and queue is stopped during loopback */
|
|
||||||
if (netif_running(netdev)) {
|
|
||||||
netif_carrier_off(netdev);
|
|
||||||
netif_tx_stop_all_queues(netdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = qlcnic_do_lb_test(adapter, mode);
|
ret = qlcnic_do_lb_test(adapter, mode);
|
||||||
|
|
||||||
qlcnic_83xx_clear_lb_mode(adapter, mode);
|
qlcnic_83xx_clear_lb_mode(adapter, mode);
|
||||||
|
@ -2121,6 +2115,7 @@ static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
|
||||||
ahw->link_autoneg = MSB(MSW(data[3]));
|
ahw->link_autoneg = MSB(MSW(data[3]));
|
||||||
ahw->module_type = MSB(LSW(data[3]));
|
ahw->module_type = MSB(LSW(data[3]));
|
||||||
ahw->has_link_events = 1;
|
ahw->has_link_events = 1;
|
||||||
|
ahw->lb_mode = data[4] & QLCNIC_LB_MODE_MASK;
|
||||||
qlcnic_advert_link_change(adapter, link_status);
|
qlcnic_advert_link_change(adapter, link_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -689,6 +689,10 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup)
|
||||||
adapter->ahw->linkup = 0;
|
adapter->ahw->linkup = 0;
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
} else if (!adapter->ahw->linkup && linkup) {
|
} else if (!adapter->ahw->linkup && linkup) {
|
||||||
|
/* Do not advertise Link up if the port is in loopback mode */
|
||||||
|
if (qlcnic_83xx_check(adapter) && adapter->ahw->lb_mode)
|
||||||
|
return;
|
||||||
|
|
||||||
netdev_info(netdev, "NIC Link is up\n");
|
netdev_info(netdev, "NIC Link is up\n");
|
||||||
adapter->ahw->linkup = 1;
|
adapter->ahw->linkup = 1;
|
||||||
netif_carrier_on(netdev);
|
netif_carrier_on(netdev);
|
||||||
|
|
Loading…
Reference in a new issue