RDMA/nes: Fix SFP+ link down detection issue with switch port disable
In case of SFP+ PHY, link status check at interrupt processing can give false results. For proper link status change detection a delayed recheck is needed to give nes registers time to settle. Add a periodic link status recheck scheduled at interrupt to detect potential delayed registers state changes. Addresses: http://bugs.openfabrics.org/bugzilla/show_bug.cgi?id=2117 Signed-off-by: Maciej Sosnowski <maciej.sosnowski@intel.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:

committed by
Roland Dreier

parent
ea623455b7
commit
5f61b2c693
@@ -674,6 +674,8 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
|
||||
}
|
||||
nes_notifiers_registered++;
|
||||
|
||||
INIT_DELAYED_WORK(&nesdev->work, nes_recheck_link_status);
|
||||
|
||||
/* Initialize network devices */
|
||||
if ((netdev = nes_netdev_init(nesdev, mmio_regs)) == NULL)
|
||||
goto bail7;
|
||||
@@ -756,6 +758,7 @@ static void __devexit nes_remove(struct pci_dev *pcidev)
|
||||
struct nes_device *nesdev = pci_get_drvdata(pcidev);
|
||||
struct net_device *netdev;
|
||||
int netdev_index = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (nesdev->netdev_count) {
|
||||
netdev = nesdev->netdev[netdev_index];
|
||||
@@ -782,6 +785,14 @@ static void __devexit nes_remove(struct pci_dev *pcidev)
|
||||
free_irq(pcidev->irq, nesdev);
|
||||
tasklet_kill(&nesdev->dpc_tasklet);
|
||||
|
||||
spin_lock_irqsave(&nesdev->nesadapter->phy_lock, flags);
|
||||
if (nesdev->link_recheck) {
|
||||
spin_unlock_irqrestore(&nesdev->nesadapter->phy_lock, flags);
|
||||
cancel_delayed_work_sync(&nesdev->work);
|
||||
} else {
|
||||
spin_unlock_irqrestore(&nesdev->nesadapter->phy_lock, flags);
|
||||
}
|
||||
|
||||
/* Deallocate the Adapter Structure */
|
||||
nes_destroy_adapter(nesdev->nesadapter);
|
||||
|
||||
|
Reference in New Issue
Block a user