diff options
author | Jorge Boncompte [DTI2] <jorge@dti2.net> | 2008-06-17 02:16:35 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-06-17 02:16:35 +0200 |
commit | d6c1d704ab5d2e13bebb096e415156a9c54a3d32 (patch) | |
tree | 419bdb2e79ae6be235956279a155e4337a4438a4 | |
parent | atm: [iphase] set drvdata before enabling interrupts (diff) | |
download | linux-d6c1d704ab5d2e13bebb096e415156a9c54a3d32.tar.xz linux-d6c1d704ab5d2e13bebb096e415156a9c54a3d32.zip |
atm: [iphase] doesn't call phy->start due to a bogus #ifndef
This causes the suni driver to oops if you try to use sonetdiag to get
the statistics. Also add the corresponding phy->stop call to fix another
oops if you try to remove the module.
Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net>
Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/atm/iphase.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 800c09e128ee..139fce6968a6 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c @@ -2562,17 +2562,11 @@ static int __devinit ia_start(struct atm_dev *dev) error = suni_init(dev); if (error) goto err_free_rx; - /* - * Enable interrupt on loss of signal - * SUNI_RSOP_CIE - 0x10 - * SUNI_RSOP_CIE_LOSE - 0x04 - */ - ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10); -#ifndef MODULE - error = dev->phy->start(dev); - if (error) - goto err_free_rx; -#endif + if (dev->phy->start) { + error = dev->phy->start(dev); + if (error) + goto err_free_rx; + } /* Get iadev->carrier_detect status */ IaFrontEndIntr(iadev); } @@ -3238,9 +3232,14 @@ static void __devexit ia_remove_one(struct pci_dev *pdev) struct atm_dev *dev = pci_get_drvdata(pdev); IADEV *iadev = INPH_IA_DEV(dev); - ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); + /* Disable phy interrupts */ + ia_phy_put(dev, ia_phy_get(dev, SUNI_RSOP_CIE) & ~(SUNI_RSOP_CIE_LOSE), + SUNI_RSOP_CIE); udelay(1); + if (dev->phy && dev->phy->stop) + dev->phy->stop(dev); + /* De-register device */ free_irq(iadev->irq, dev); iadev_count--; |