| .. | .. |
|---|
| 18 | 18 | http://www.scyld.com/network/sundance.html |
|---|
| 19 | 19 | [link no longer provides useful info -jgarzik] |
|---|
| 20 | 20 | Archives of the mailing list are still available at |
|---|
| 21 | | - http://www.beowulf.org/pipermail/netdrivers/ |
|---|
| 21 | + https://www.beowulf.org/pipermail/netdrivers/ |
|---|
| 22 | 22 | |
|---|
| 23 | 23 | */ |
|---|
| 24 | 24 | |
|---|
| 25 | 25 | #define DRV_NAME "sundance" |
|---|
| 26 | | -#define DRV_VERSION "1.2" |
|---|
| 27 | | -#define DRV_RELDATE "11-Sep-2006" |
|---|
| 28 | | - |
|---|
| 29 | 26 | |
|---|
| 30 | 27 | /* The user-configurable values. |
|---|
| 31 | 28 | These may be modified when a driver module is loaded.*/ |
|---|
| .. | .. |
|---|
| 100 | 97 | #include <linux/crc32.h> |
|---|
| 101 | 98 | #include <linux/ethtool.h> |
|---|
| 102 | 99 | #include <linux/mii.h> |
|---|
| 103 | | - |
|---|
| 104 | | -/* These identify the driver base version and may not be removed. */ |
|---|
| 105 | | -static const char version[] = |
|---|
| 106 | | - KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE |
|---|
| 107 | | - " Written by Donald Becker\n"; |
|---|
| 108 | 100 | |
|---|
| 109 | 101 | MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); |
|---|
| 110 | 102 | MODULE_DESCRIPTION("Sundance Alta Ethernet driver"); |
|---|
| .. | .. |
|---|
| 375 | 367 | dma_addr_t tx_ring_dma; |
|---|
| 376 | 368 | dma_addr_t rx_ring_dma; |
|---|
| 377 | 369 | struct timer_list timer; /* Media monitoring timer. */ |
|---|
| 370 | + struct net_device *ndev; /* backpointer */ |
|---|
| 378 | 371 | /* ethtool extra stats */ |
|---|
| 379 | 372 | struct { |
|---|
| 380 | 373 | u64 tx_multiple_collisions; |
|---|
| .. | .. |
|---|
| 432 | 425 | static int netdev_open(struct net_device *dev); |
|---|
| 433 | 426 | static void check_duplex(struct net_device *dev); |
|---|
| 434 | 427 | static void netdev_timer(struct timer_list *t); |
|---|
| 435 | | -static void tx_timeout(struct net_device *dev); |
|---|
| 428 | +static void tx_timeout(struct net_device *dev, unsigned int txqueue); |
|---|
| 436 | 429 | static void init_ring(struct net_device *dev); |
|---|
| 437 | 430 | static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev); |
|---|
| 438 | 431 | static int reset_tx (struct net_device *dev); |
|---|
| 439 | 432 | static irqreturn_t intr_handler(int irq, void *dev_instance); |
|---|
| 440 | | -static void rx_poll(unsigned long data); |
|---|
| 441 | | -static void tx_poll(unsigned long data); |
|---|
| 433 | +static void rx_poll(struct tasklet_struct *t); |
|---|
| 434 | +static void tx_poll(struct tasklet_struct *t); |
|---|
| 442 | 435 | static void refill_rx (struct net_device *dev); |
|---|
| 443 | 436 | static void netdev_error(struct net_device *dev, int intr_status); |
|---|
| 444 | 437 | static void netdev_error(struct net_device *dev, int intr_status); |
|---|
| .. | .. |
|---|
| 516 | 509 | #endif |
|---|
| 517 | 510 | int phy, phy_end, phy_idx = 0; |
|---|
| 518 | 511 | |
|---|
| 519 | | -/* when built into the kernel, we only print version if device is found */ |
|---|
| 520 | | -#ifndef MODULE |
|---|
| 521 | | - static int printed_version; |
|---|
| 522 | | - if (!printed_version++) |
|---|
| 523 | | - printk(version); |
|---|
| 524 | | -#endif |
|---|
| 525 | | - |
|---|
| 526 | 512 | if (pci_enable_device(pdev)) |
|---|
| 527 | 513 | return -EIO; |
|---|
| 528 | 514 | pci_set_master(pdev); |
|---|
| .. | .. |
|---|
| 546 | 532 | cpu_to_le16(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET)); |
|---|
| 547 | 533 | |
|---|
| 548 | 534 | np = netdev_priv(dev); |
|---|
| 535 | + np->ndev = dev; |
|---|
| 549 | 536 | np->base = ioaddr; |
|---|
| 550 | 537 | np->pci_dev = pdev; |
|---|
| 551 | 538 | np->chip_id = chip_idx; |
|---|
| 552 | 539 | np->msg_enable = (1 << debug) - 1; |
|---|
| 553 | 540 | spin_lock_init(&np->lock); |
|---|
| 554 | 541 | spin_lock_init(&np->statlock); |
|---|
| 555 | | - tasklet_init(&np->rx_tasklet, rx_poll, (unsigned long)dev); |
|---|
| 556 | | - tasklet_init(&np->tx_tasklet, tx_poll, (unsigned long)dev); |
|---|
| 542 | + tasklet_setup(&np->rx_tasklet, rx_poll); |
|---|
| 543 | + tasklet_setup(&np->tx_tasklet, tx_poll); |
|---|
| 557 | 544 | |
|---|
| 558 | 545 | ring_space = dma_alloc_coherent(&pdev->dev, TX_TOTAL_SIZE, |
|---|
| 559 | 546 | &ring_dma, GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 969 | 956 | add_timer(&np->timer); |
|---|
| 970 | 957 | } |
|---|
| 971 | 958 | |
|---|
| 972 | | -static void tx_timeout(struct net_device *dev) |
|---|
| 959 | +static void tx_timeout(struct net_device *dev, unsigned int txqueue) |
|---|
| 973 | 960 | { |
|---|
| 974 | 961 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 975 | 962 | void __iomem *ioaddr = np->base; |
|---|
| 976 | 963 | unsigned long flag; |
|---|
| 977 | 964 | |
|---|
| 978 | 965 | netif_stop_queue(dev); |
|---|
| 979 | | - tasklet_disable(&np->tx_tasklet); |
|---|
| 966 | + tasklet_disable_in_atomic(&np->tx_tasklet); |
|---|
| 980 | 967 | iowrite16(0, ioaddr + IntrEnable); |
|---|
| 981 | 968 | printk(KERN_WARNING "%s: Transmit timed out, TxStatus %2.2x " |
|---|
| 982 | 969 | "TxFrameId %2.2x," |
|---|
| .. | .. |
|---|
| 1069 | 1056 | } |
|---|
| 1070 | 1057 | } |
|---|
| 1071 | 1058 | |
|---|
| 1072 | | -static void tx_poll (unsigned long data) |
|---|
| 1059 | +static void tx_poll(struct tasklet_struct *t) |
|---|
| 1073 | 1060 | { |
|---|
| 1074 | | - struct net_device *dev = (struct net_device *)data; |
|---|
| 1075 | | - struct netdev_private *np = netdev_priv(dev); |
|---|
| 1061 | + struct netdev_private *np = from_tasklet(np, t, tx_tasklet); |
|---|
| 1076 | 1062 | unsigned head = np->cur_task % TX_RING_SIZE; |
|---|
| 1077 | 1063 | struct netdev_desc *txdesc = |
|---|
| 1078 | 1064 | &np->tx_ring[(np->cur_tx - 1) % TX_RING_SIZE]; |
|---|
| .. | .. |
|---|
| 1193 | 1179 | int handled = 0; |
|---|
| 1194 | 1180 | int i; |
|---|
| 1195 | 1181 | |
|---|
| 1196 | | - |
|---|
| 1197 | 1182 | do { |
|---|
| 1198 | 1183 | int intr_status = ioread16(ioaddr + IntrStatus); |
|---|
| 1199 | 1184 | iowrite16(intr_status, ioaddr + IntrStatus); |
|---|
| .. | .. |
|---|
| 1286 | 1271 | dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1287 | 1272 | le32_to_cpu(np->tx_ring[entry].frag[0].addr), |
|---|
| 1288 | 1273 | skb->len, DMA_TO_DEVICE); |
|---|
| 1289 | | - dev_kfree_skb_irq (np->tx_skbuff[entry]); |
|---|
| 1274 | + dev_consume_skb_irq(np->tx_skbuff[entry]); |
|---|
| 1290 | 1275 | np->tx_skbuff[entry] = NULL; |
|---|
| 1291 | 1276 | np->tx_ring[entry].frag[0].addr = 0; |
|---|
| 1292 | 1277 | np->tx_ring[entry].frag[0].length = 0; |
|---|
| .. | .. |
|---|
| 1305 | 1290 | dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1306 | 1291 | le32_to_cpu(np->tx_ring[entry].frag[0].addr), |
|---|
| 1307 | 1292 | skb->len, DMA_TO_DEVICE); |
|---|
| 1308 | | - dev_kfree_skb_irq (np->tx_skbuff[entry]); |
|---|
| 1293 | + dev_consume_skb_irq(np->tx_skbuff[entry]); |
|---|
| 1309 | 1294 | np->tx_skbuff[entry] = NULL; |
|---|
| 1310 | 1295 | np->tx_ring[entry].frag[0].addr = 0; |
|---|
| 1311 | 1296 | np->tx_ring[entry].frag[0].length = 0; |
|---|
| .. | .. |
|---|
| 1328 | 1313 | return IRQ_RETVAL(handled); |
|---|
| 1329 | 1314 | } |
|---|
| 1330 | 1315 | |
|---|
| 1331 | | -static void rx_poll(unsigned long data) |
|---|
| 1316 | +static void rx_poll(struct tasklet_struct *t) |
|---|
| 1332 | 1317 | { |
|---|
| 1333 | | - struct net_device *dev = (struct net_device *)data; |
|---|
| 1334 | | - struct netdev_private *np = netdev_priv(dev); |
|---|
| 1318 | + struct netdev_private *np = from_tasklet(np, t, rx_tasklet); |
|---|
| 1319 | + struct net_device *dev = np->ndev; |
|---|
| 1335 | 1320 | int entry = np->cur_rx % RX_RING_SIZE; |
|---|
| 1336 | 1321 | int boguscnt = np->budget; |
|---|
| 1337 | 1322 | void __iomem *ioaddr = np->base; |
|---|
| .. | .. |
|---|
| 1658 | 1643 | { |
|---|
| 1659 | 1644 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 1660 | 1645 | strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); |
|---|
| 1661 | | - strlcpy(info->version, DRV_VERSION, sizeof(info->version)); |
|---|
| 1662 | 1646 | strlcpy(info->bus_info, pci_name(np->pci_dev), sizeof(info->bus_info)); |
|---|
| 1663 | 1647 | } |
|---|
| 1664 | 1648 | |
|---|
| .. | .. |
|---|
| 1945 | 1929 | } |
|---|
| 1946 | 1930 | } |
|---|
| 1947 | 1931 | |
|---|
| 1948 | | -#ifdef CONFIG_PM |
|---|
| 1949 | | - |
|---|
| 1950 | | -static int sundance_suspend(struct pci_dev *pci_dev, pm_message_t state) |
|---|
| 1932 | +static int __maybe_unused sundance_suspend(struct device *dev_d) |
|---|
| 1951 | 1933 | { |
|---|
| 1952 | | - struct net_device *dev = pci_get_drvdata(pci_dev); |
|---|
| 1934 | + struct net_device *dev = dev_get_drvdata(dev_d); |
|---|
| 1953 | 1935 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 1954 | 1936 | void __iomem *ioaddr = np->base; |
|---|
| 1955 | 1937 | |
|---|
| .. | .. |
|---|
| 1959 | 1941 | netdev_close(dev); |
|---|
| 1960 | 1942 | netif_device_detach(dev); |
|---|
| 1961 | 1943 | |
|---|
| 1962 | | - pci_save_state(pci_dev); |
|---|
| 1963 | 1944 | if (np->wol_enabled) { |
|---|
| 1964 | 1945 | iowrite8(AcceptBroadcast | AcceptMyPhys, ioaddr + RxMode); |
|---|
| 1965 | 1946 | iowrite16(RxEnable, ioaddr + MACCtrl1); |
|---|
| 1966 | 1947 | } |
|---|
| 1967 | | - pci_enable_wake(pci_dev, pci_choose_state(pci_dev, state), |
|---|
| 1968 | | - np->wol_enabled); |
|---|
| 1969 | | - pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state)); |
|---|
| 1948 | + |
|---|
| 1949 | + device_set_wakeup_enable(dev_d, np->wol_enabled); |
|---|
| 1970 | 1950 | |
|---|
| 1971 | 1951 | return 0; |
|---|
| 1972 | 1952 | } |
|---|
| 1973 | 1953 | |
|---|
| 1974 | | -static int sundance_resume(struct pci_dev *pci_dev) |
|---|
| 1954 | +static int __maybe_unused sundance_resume(struct device *dev_d) |
|---|
| 1975 | 1955 | { |
|---|
| 1976 | | - struct net_device *dev = pci_get_drvdata(pci_dev); |
|---|
| 1956 | + struct net_device *dev = dev_get_drvdata(dev_d); |
|---|
| 1977 | 1957 | int err = 0; |
|---|
| 1978 | 1958 | |
|---|
| 1979 | 1959 | if (!netif_running(dev)) |
|---|
| 1980 | 1960 | return 0; |
|---|
| 1981 | | - |
|---|
| 1982 | | - pci_set_power_state(pci_dev, PCI_D0); |
|---|
| 1983 | | - pci_restore_state(pci_dev); |
|---|
| 1984 | | - pci_enable_wake(pci_dev, PCI_D0, 0); |
|---|
| 1985 | 1961 | |
|---|
| 1986 | 1962 | err = netdev_open(dev); |
|---|
| 1987 | 1963 | if (err) { |
|---|
| .. | .. |
|---|
| 1996 | 1972 | return err; |
|---|
| 1997 | 1973 | } |
|---|
| 1998 | 1974 | |
|---|
| 1999 | | -#endif /* CONFIG_PM */ |
|---|
| 1975 | +static SIMPLE_DEV_PM_OPS(sundance_pm_ops, sundance_suspend, sundance_resume); |
|---|
| 2000 | 1976 | |
|---|
| 2001 | 1977 | static struct pci_driver sundance_driver = { |
|---|
| 2002 | 1978 | .name = DRV_NAME, |
|---|
| 2003 | 1979 | .id_table = sundance_pci_tbl, |
|---|
| 2004 | 1980 | .probe = sundance_probe1, |
|---|
| 2005 | 1981 | .remove = sundance_remove1, |
|---|
| 2006 | | -#ifdef CONFIG_PM |
|---|
| 2007 | | - .suspend = sundance_suspend, |
|---|
| 2008 | | - .resume = sundance_resume, |
|---|
| 2009 | | -#endif /* CONFIG_PM */ |
|---|
| 1982 | + .driver.pm = &sundance_pm_ops, |
|---|
| 2010 | 1983 | }; |
|---|
| 2011 | 1984 | |
|---|
| 2012 | 1985 | static int __init sundance_init(void) |
|---|
| 2013 | 1986 | { |
|---|
| 2014 | | -/* when a module, this is printed whether or not devices are found in probe */ |
|---|
| 2015 | | -#ifdef MODULE |
|---|
| 2016 | | - printk(version); |
|---|
| 2017 | | -#endif |
|---|
| 2018 | 1987 | return pci_register_driver(&sundance_driver); |
|---|
| 2019 | 1988 | } |
|---|
| 2020 | 1989 | |
|---|