mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-16 22:10:24 +00:00
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) {
|
||||
struct net_device *dev = adapter->port[i];
|
||||
struct port_info *p = netdev_priv(dev);
|
||||
int link_fault;
|
||||
|
||||
spin_lock_irq(&adapter->work_lock);
|
||||
if (p->link_fault) {
|
||||
link_fault = p->link_fault;
|
||||
spin_unlock_irq(&adapter->work_lock);
|
||||
|
||||
if (link_fault) {
|
||||
t3_link_fault(adapter, i);
|
||||
spin_unlock_irq(&adapter->work_lock);
|
||||
continue;
|
||||
}
|
||||
spin_unlock_irq(&adapter->work_lock);
|
||||
|
||||
if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) {
|
||||
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);
|
||||
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);
|
||||
|
||||
if (link_fault) {
|
||||
|
Loading…
Reference in New Issue
Block a user