cxgb3: link fault fixes
Do not call t3_link_fault() under spinlock, as it calls msleep(). Besides, only the access to pi->link_fault needs to be serialized. Also initialize local variables before checking the link status, link state fields might otherwise end up containing garbage. Signed-off-by: Divy Le Ray <divy@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
10b6d95612
commit
c22c814931
|
@ -2496,14 +2496,16 @@ static void check_link_status(struct adapter *adapter)
|
||||||
for_each_port(adapter, i) {
|
for_each_port(adapter, i) {
|
||||||
struct net_device *dev = adapter->port[i];
|
struct net_device *dev = adapter->port[i];
|
||||||
struct port_info *p = netdev_priv(dev);
|
struct port_info *p = netdev_priv(dev);
|
||||||
|
int link_fault;
|
||||||
|
|
||||||
spin_lock_irq(&adapter->work_lock);
|
spin_lock_irq(&adapter->work_lock);
|
||||||
if (p->link_fault) {
|
link_fault = p->link_fault;
|
||||||
t3_link_fault(adapter, i);
|
|
||||||
spin_unlock_irq(&adapter->work_lock);
|
spin_unlock_irq(&adapter->work_lock);
|
||||||
|
|
||||||
|
if (link_fault) {
|
||||||
|
t3_link_fault(adapter, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&adapter->work_lock);
|
|
||||||
|
|
||||||
if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) {
|
if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) {
|
||||||
t3_xgm_intr_disable(adapter, i);
|
t3_xgm_intr_disable(adapter, i);
|
||||||
|
|
|
@ -1274,6 +1274,11 @@ void t3_link_fault(struct adapter *adapter, int port_id)
|
||||||
A_XGM_INT_STATUS + mac->offset);
|
A_XGM_INT_STATUS + mac->offset);
|
||||||
link_fault &= F_LINKFAULTCHANGE;
|
link_fault &= F_LINKFAULTCHANGE;
|
||||||
|
|
||||||
|
link_ok = lc->link_ok;
|
||||||
|
speed = lc->speed;
|
||||||
|
duplex = lc->duplex;
|
||||||
|
fc = lc->fc;
|
||||||
|
|
||||||
phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
|
phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
|
||||||
|
|
||||||
if (link_fault) {
|
if (link_fault) {
|
||||||
|
|
Loading…
Reference in New Issue