The VLB bus is very obsolete and last appeared on P5 Pentium-era hardware. Support for it has been removed from other drivers, and it is highly unlikely anyone is using it with modern Linux kernels. The VLB auto-probing code also has the potential to affect other devices that use the same I/O ports in unexpected ways. Remove support for VLB cards from the driver. This allows the code managing device instances to be simplified significantly. Signed-off-by: Ethan Nelson-Moore --- Changes in v2: Rebase on latest net-next tree Improve commit message CC maintainers drivers/net/ethernet/amd/pcnet32.c | 144 ++++------------------------- 1 file changed, 20 insertions(+), 124 deletions(-) diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/pcnet32.c index 9eaefa0f5e80..7a63426af641 100644 --- a/drivers/net/ethernet/amd/pcnet32.c +++ b/drivers/net/ethernet/amd/pcnet32.c @@ -75,17 +75,8 @@ MODULE_DEVICE_TABLE(pci, pcnet32_pci_tbl); static int cards_found; -/* - * VLB I/O addresses - */ -static unsigned int pcnet32_portlist[] = - { 0x300, 0x320, 0x340, 0x360, 0 }; - static int pcnet32_debug; static int tx_start = 1; /* Mapping -- 0:20, 1:64, 2:128, 3:~220 (depends on chip vers) */ -static int pcnet32vlb; /* check for VLB cards ? */ - -static struct net_device *pcnet32_dev; static int max_interrupt_work = 2; static int rx_copybreak = 200; @@ -285,13 +276,11 @@ struct pcnet32_private { char tx_full; char phycount; /* number of phys found */ int options; - unsigned int shared_irq:1, /* shared irq possible */ - dxsuflo:1, /* disable transmit stop on uflo */ + unsigned int dxsuflo:1, /* disable transmit stop on uflo */ mii:1, /* mii port available */ autoneg:1, /* autoneg enabled */ port_tp:1, /* port set to TP */ fdx:1; /* full duplex enabled */ - struct net_device *next; struct mii_if_info mii_if; struct timer_list watchdog_timer; u32 msg_enable; /* debug message level */ @@ -305,7 +294,7 @@ struct pcnet32_private { }; static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *); -static int pcnet32_probe1(unsigned long, int, struct pci_dev *); +static int pcnet32_probe1(unsigned long, struct pci_dev *); static int pcnet32_open(struct net_device *); static int pcnet32_init_ring(struct net_device *); static netdev_tx_t pcnet32_start_xmit(struct sk_buff *, @@ -798,12 +787,8 @@ static void pcnet32_get_drvinfo(struct net_device *dev, struct pcnet32_private *lp = netdev_priv(dev); strscpy(info->driver, DRV_NAME, sizeof(info->driver)); - if (lp->pci_dev) - strscpy(info->bus_info, pci_name(lp->pci_dev), - sizeof(info->bus_info)); - else - snprintf(info->bus_info, sizeof(info->bus_info), - "VLB 0x%lx", dev->base_addr); + strscpy(info->bus_info, pci_name(lp->pci_dev), + sizeof(info->bus_info)); } static u32 pcnet32_get_link(struct net_device *dev) @@ -1506,28 +1491,6 @@ static const struct ethtool_ops pcnet32_ethtool_ops = { .set_link_ksettings = pcnet32_set_link_ksettings, }; -/* only probes for non-PCI devices, the rest are handled by - * pci_register_driver via pcnet32_probe_pci */ - -static void pcnet32_probe_vlbus(unsigned int *pcnet32_portlist) -{ - unsigned int *port, ioaddr; - - /* search for PCnet32 VLB cards at known addresses */ - for (port = pcnet32_portlist; (ioaddr = *port); port++) { - if (request_region - (ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_vlbus")) { - /* check if there is really a pcnet chip on that ioaddr */ - if ((inb(ioaddr + 14) == 0x57) && - (inb(ioaddr + 15) == 0x57)) { - pcnet32_probe1(ioaddr, 0, NULL); - } else { - release_region(ioaddr, PCNET32_TOTAL_SIZE); - } - } - } -} - static int pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -1564,7 +1527,7 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent) goto err_disable_dev; } - err = pcnet32_probe1(ioaddr, 1, pdev); + err = pcnet32_probe1(ioaddr, pdev); err_disable_dev: if (err < 0) @@ -1588,12 +1551,9 @@ static const struct net_device_ops pcnet32_netdev_ops = { #endif }; -/* pcnet32_probe1 - * Called from both pcnet32_probe_vlbus and pcnet_probe_pci. - * pdev will be NULL when called from pcnet32_probe_vlbus. - */ +/* Called from pcnet_probe_pci. */ static int -pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) +pcnet32_probe1(unsigned long ioaddr, struct pci_dev *pdev) { struct pcnet32_private *lp; int i, media; @@ -1640,13 +1600,8 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) switch (chip_version) { case 0x2420: - chipname = "PCnet/PCI 79C970"; /* PCI */ - break; - case 0x2430: - if (shared) - chipname = "PCnet/PCI 79C970"; /* 970 gives the wrong chip id back */ - else - chipname = "PCnet/32 79C965"; /* 486/VL bus */ + case 0x2430: /* Some give the wrong chip id back */ + chipname = "PCnet/PCI 79C970"; break; case 0x2621: chipname = "PCnet/PCI II 79C970A"; /* PCI */ @@ -1752,8 +1707,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) goto err_release_region; } - if (pdev) - SET_NETDEV_DEV(dev, &pdev->dev); + SET_NETDEV_DEV(dev, &pdev->dev); if (pcnet32_debug & NETIF_MSG_PROBE) pr_info("%s at %#3lx,", chipname, ioaddr); @@ -1856,7 +1810,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) spin_lock_init(&lp->lock); lp->name = chipname; - lp->shared_irq = shared; lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */ lp->rx_ring_size = RX_RING_SIZE; /* default rx ring size */ lp->tx_mod_mask = lp->tx_ring_size - 1; @@ -1920,32 +1873,10 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) a->write_csr(ioaddr, 1, (lp->init_dma_addr & 0xffff)); a->write_csr(ioaddr, 2, (lp->init_dma_addr >> 16)); - if (pdev) { /* use the IRQ provided by PCI */ - dev->irq = pdev->irq; - if (pcnet32_debug & NETIF_MSG_PROBE) - pr_cont(" assigned IRQ %d\n", dev->irq); - } else { - unsigned long irq_mask = probe_irq_on(); - - /* - * To auto-IRQ we enable the initialization-done and DMA error - * interrupts. For ISA boards we get a DMA error, but VLB and PCI - * boards will work. - */ - /* Trigger an initialization just for the interrupt. */ - a->write_csr(ioaddr, CSR0, CSR0_INTEN | CSR0_INIT); - mdelay(1); - - dev->irq = probe_irq_off(irq_mask); - if (!dev->irq) { - if (pcnet32_debug & NETIF_MSG_PROBE) - pr_cont(", failed to detect IRQ line\n"); - ret = -ENODEV; - goto err_free_ring; - } - if (pcnet32_debug & NETIF_MSG_PROBE) - pr_cont(", probed IRQ %d\n", dev->irq); - } + /* use the IRQ provided by PCI */ + dev->irq = pdev->irq; + if (pcnet32_debug & NETIF_MSG_PROBE) + pr_cont(" assigned IRQ %d\n", dev->irq); /* Set the mii phy_id so that we can query the link state */ if (lp->mii) { @@ -1987,12 +1918,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) if (register_netdev(dev)) goto err_free_ring; - if (pdev) { - pci_set_drvdata(pdev, dev); - } else { - lp->next = pcnet32_dev; - pcnet32_dev = dev; - } + pci_set_drvdata(pdev, dev); if (pcnet32_debug & NETIF_MSG_PROBE) pr_info("%s: registered as %s\n", dev->name, lp->name); @@ -2100,8 +2026,7 @@ static int pcnet32_open(struct net_device *dev) unsigned long flags; if (request_irq(dev->irq, pcnet32_interrupt, - lp->shared_irq ? IRQF_SHARED : 0, dev->name, - (void *)dev)) { + IRQF_SHARED, dev->name, (void *)dev)) { return -EAGAIN; } @@ -2157,7 +2082,7 @@ static int pcnet32_open(struct net_device *dev) lp->a->write_csr(ioaddr, 124, val); /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */ - if (pdev && pdev->subsystem_vendor == PCI_VENDOR_ID_AT && + if (pdev->subsystem_vendor == PCI_VENDOR_ID_AT && (pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX || pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) { if (lp->options & PCNET32_PORT_ASEL) { @@ -2970,10 +2895,9 @@ static struct pci_driver pcnet32_driver = { }, }; -/* An additional parameter that may be passed in... */ +/* Additional parameters that may be passed in... */ static int debug = -1; static int tx_start_pt = -1; -static int pcnet32_have_pci; module_param(debug, int, 0); MODULE_PARM_DESC(debug, DRV_NAME " debug level"); @@ -2985,8 +2909,6 @@ MODULE_PARM_DESC(rx_copybreak, DRV_NAME " copy breakpoint for copy-only-tiny-frames"); module_param(tx_start_pt, int, 0); MODULE_PARM_DESC(tx_start_pt, DRV_NAME " transmit start point (0-3)"); -module_param(pcnet32vlb, int, 0); -MODULE_PARM_DESC(pcnet32vlb, DRV_NAME " Vesa local bus (VLB) support (0/1)"); module_param_array(options, int, NULL, 0); MODULE_PARM_DESC(options, DRV_NAME " initial option setting(s) (0-15)"); module_param_array(full_duplex, int, NULL, 0); @@ -3010,38 +2932,12 @@ static int __init pcnet32_init_module(void) if ((tx_start_pt >= 0) && (tx_start_pt <= 3)) tx_start = tx_start_pt; - /* find the PCI devices */ - if (!pci_register_driver(&pcnet32_driver)) - pcnet32_have_pci = 1; - - /* should we find any remaining VLbus devices ? */ - if (pcnet32vlb) - pcnet32_probe_vlbus(pcnet32_portlist); - - if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE)) - pr_info("%d cards_found\n", cards_found); - - return (pcnet32_have_pci + cards_found) ? 0 : -ENODEV; + return pci_register_driver(&pcnet32_driver); } static void __exit pcnet32_cleanup_module(void) { - struct net_device *next_dev; - - while (pcnet32_dev) { - struct pcnet32_private *lp = netdev_priv(pcnet32_dev); - next_dev = lp->next; - unregister_netdev(pcnet32_dev); - pcnet32_free_ring(pcnet32_dev); - release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE); - dma_free_coherent(&lp->pci_dev->dev, sizeof(*lp->init_block), - lp->init_block, lp->init_dma_addr); - free_netdev(pcnet32_dev); - pcnet32_dev = next_dev; - } - - if (pcnet32_have_pci) - pci_unregister_driver(&pcnet32_driver); + pci_unregister_driver(&pcnet32_driver); } module_init(pcnet32_init_module); -- 2.43.0