Skip to content

Commit 966e07f

Browse files
Ondrej Zarydavem330
authored andcommitted
dl2k: Reorder and cleanup initialization
Move HW init and stop into separate functions. Request IRQ only after the HW has been reset (so interrupts are disabled and no stale interrupts are pending). Signed-off-by: Ondrej Zary <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 39536ff commit 966e07f

File tree

1 file changed

+56
-39
lines changed

1 file changed

+56
-39
lines changed

drivers/net/ethernet/dlink/dl2k.c

Lines changed: 56 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -252,19 +252,6 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
252252
if (err)
253253
goto err_out_unmap_rx;
254254

255-
if (np->chip_id == CHIP_IP1000A &&
256-
(np->pdev->revision == 0x40 || np->pdev->revision == 0x41)) {
257-
/* PHY magic taken from ipg driver, undocumented registers */
258-
mii_write(dev, np->phy_addr, 31, 0x0001);
259-
mii_write(dev, np->phy_addr, 27, 0x01e0);
260-
mii_write(dev, np->phy_addr, 31, 0x0002);
261-
mii_write(dev, np->phy_addr, 27, 0xeb8e);
262-
mii_write(dev, np->phy_addr, 31, 0x0000);
263-
mii_write(dev, np->phy_addr, 30, 0x005e);
264-
/* advertise 1000BASE-T half & full duplex, prefer MASTER */
265-
mii_write(dev, np->phy_addr, MII_CTRL1000, 0x0700);
266-
}
267-
268255
/* Fiber device? */
269256
np->phy_media = (dr16(ASICCtrl) & PhyMedia) ? 1 : 0;
270257
np->link_status = 0;
@@ -274,13 +261,11 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
274261
if (np->an_enable == 2) {
275262
np->an_enable = 1;
276263
}
277-
mii_set_media_pcs (dev);
278264
} else {
279265
/* Auto-Negotiation is mandatory for 1000BASE-T,
280266
IEEE 802.3ab Annex 28D page 14 */
281267
if (np->speed == 1000)
282268
np->an_enable = 1;
283-
mii_set_media (dev);
284269
}
285270

286271
err = register_netdev (dev);
@@ -531,25 +516,13 @@ static int alloc_list(struct net_device *dev)
531516
return 0;
532517
}
533518

534-
static int
535-
rio_open (struct net_device *dev)
519+
static void rio_hw_init(struct net_device *dev)
536520
{
537521
struct netdev_private *np = netdev_priv(dev);
538522
void __iomem *ioaddr = np->ioaddr;
539-
const int irq = np->pdev->irq;
540523
int i;
541524
u16 macctrl;
542525

543-
i = alloc_list(dev);
544-
if (i)
545-
return i;
546-
547-
i = request_irq(irq, rio_interrupt, IRQF_SHARED, dev->name, dev);
548-
if (i) {
549-
free_list(dev);
550-
return i;
551-
}
552-
553526
/* Reset all logic functions */
554527
dw16(ASICCtrl + 2,
555528
GlobalReset | DMAReset | FIFOReset | NetworkReset | HostReset);
@@ -560,6 +533,24 @@ rio_open (struct net_device *dev)
560533
/* DebugCtrl bit 4, 5, 9 must set */
561534
dw32(DebugCtrl, dr32(DebugCtrl) | 0x0230);
562535

536+
if (np->chip_id == CHIP_IP1000A &&
537+
(np->pdev->revision == 0x40 || np->pdev->revision == 0x41)) {
538+
/* PHY magic taken from ipg driver, undocumented registers */
539+
mii_write(dev, np->phy_addr, 31, 0x0001);
540+
mii_write(dev, np->phy_addr, 27, 0x01e0);
541+
mii_write(dev, np->phy_addr, 31, 0x0002);
542+
mii_write(dev, np->phy_addr, 27, 0xeb8e);
543+
mii_write(dev, np->phy_addr, 31, 0x0000);
544+
mii_write(dev, np->phy_addr, 30, 0x005e);
545+
/* advertise 1000BASE-T half & full duplex, prefer MASTER */
546+
mii_write(dev, np->phy_addr, MII_CTRL1000, 0x0700);
547+
}
548+
549+
if (np->phy_media)
550+
mii_set_media_pcs(dev);
551+
else
552+
mii_set_media(dev);
553+
563554
/* Jumbo frame */
564555
if (np->jumbo != 0)
565556
dw16(MaxFrameSize, MAX_JUMBO+14);
@@ -602,10 +593,6 @@ rio_open (struct net_device *dev)
602593
dw32(MACCtrl, dr32(MACCtrl) | AutoVLANuntagging);
603594
}
604595

605-
setup_timer(&np->timer, rio_timer, (unsigned long)dev);
606-
np->timer.expires = jiffies + 1*HZ;
607-
add_timer (&np->timer);
608-
609596
/* Start Tx/Rx */
610597
dw32(MACCtrl, dr32(MACCtrl) | StatsEnable | RxEnable | TxEnable);
611598

@@ -615,6 +602,42 @@ rio_open (struct net_device *dev)
615602
macctrl |= (np->tx_flow) ? TxFlowControlEnable : 0;
616603
macctrl |= (np->rx_flow) ? RxFlowControlEnable : 0;
617604
dw16(MACCtrl, macctrl);
605+
}
606+
607+
static void rio_hw_stop(struct net_device *dev)
608+
{
609+
struct netdev_private *np = netdev_priv(dev);
610+
void __iomem *ioaddr = np->ioaddr;
611+
612+
/* Disable interrupts */
613+
dw16(IntEnable, 0);
614+
615+
/* Stop Tx and Rx logics */
616+
dw32(MACCtrl, TxDisable | RxDisable | StatsDisable);
617+
}
618+
619+
static int rio_open(struct net_device *dev)
620+
{
621+
struct netdev_private *np = netdev_priv(dev);
622+
const int irq = np->pdev->irq;
623+
int i;
624+
625+
i = alloc_list(dev);
626+
if (i)
627+
return i;
628+
629+
rio_hw_init(dev);
630+
631+
i = request_irq(irq, rio_interrupt, IRQF_SHARED, dev->name, dev);
632+
if (i) {
633+
rio_hw_stop(dev);
634+
free_list(dev);
635+
return i;
636+
}
637+
638+
setup_timer(&np->timer, rio_timer, (unsigned long)dev);
639+
np->timer.expires = jiffies + 1 * HZ;
640+
add_timer(&np->timer);
618641

619642
netif_start_queue (dev);
620643

@@ -1764,17 +1787,11 @@ static int
17641787
rio_close (struct net_device *dev)
17651788
{
17661789
struct netdev_private *np = netdev_priv(dev);
1767-
void __iomem *ioaddr = np->ioaddr;
1768-
17691790
struct pci_dev *pdev = np->pdev;
17701791

17711792
netif_stop_queue (dev);
17721793

1773-
/* Disable interrupts */
1774-
dw16(IntEnable, 0);
1775-
1776-
/* Stop Tx and Rx logics */
1777-
dw32(MACCtrl, TxDisable | RxDisable | StatsDisable);
1794+
rio_hw_stop(dev);
17781795

17791796
free_irq(pdev->irq, dev);
17801797
del_timer_sync (&np->timer);

0 commit comments

Comments
 (0)