| .. | .. |
|---|
| 27 | 27 | */ |
|---|
| 28 | 28 | |
|---|
| 29 | 29 | #define DRV_NAME "starfire" |
|---|
| 30 | | -#define DRV_VERSION "2.1" |
|---|
| 31 | | -#define DRV_RELDATE "July 6, 2008" |
|---|
| 32 | 30 | |
|---|
| 33 | 31 | #include <linux/interrupt.h> |
|---|
| 34 | 32 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 165 | 163 | #define FIRMWARE_RX "adaptec/starfire_rx.bin" |
|---|
| 166 | 164 | #define FIRMWARE_TX "adaptec/starfire_tx.bin" |
|---|
| 167 | 165 | |
|---|
| 168 | | -/* These identify the driver base version and may not be removed. */ |
|---|
| 169 | | -static const char version[] = |
|---|
| 170 | | -KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker <becker@scyld.com>\n" |
|---|
| 171 | | -" (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELDATE ")\n"; |
|---|
| 172 | | - |
|---|
| 173 | 166 | MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); |
|---|
| 174 | 167 | MODULE_DESCRIPTION("Adaptec Starfire Ethernet driver"); |
|---|
| 175 | 168 | MODULE_LICENSE("GPL"); |
|---|
| 176 | | -MODULE_VERSION(DRV_VERSION); |
|---|
| 177 | 169 | MODULE_FIRMWARE(FIRMWARE_RX); |
|---|
| 178 | 170 | MODULE_FIRMWARE(FIRMWARE_TX); |
|---|
| 179 | 171 | |
|---|
| .. | .. |
|---|
| 576 | 568 | static void mdio_write(struct net_device *dev, int phy_id, int location, int value); |
|---|
| 577 | 569 | static int netdev_open(struct net_device *dev); |
|---|
| 578 | 570 | static void check_duplex(struct net_device *dev); |
|---|
| 579 | | -static void tx_timeout(struct net_device *dev); |
|---|
| 571 | +static void tx_timeout(struct net_device *dev, unsigned int txqueue); |
|---|
| 580 | 572 | static void init_ring(struct net_device *dev); |
|---|
| 581 | 573 | static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev); |
|---|
| 582 | 574 | static irqreturn_t intr_handler(int irq, void *dev_instance); |
|---|
| .. | .. |
|---|
| 653 | 645 | void __iomem *base; |
|---|
| 654 | 646 | int drv_flags, io_size; |
|---|
| 655 | 647 | int boguscnt; |
|---|
| 656 | | - |
|---|
| 657 | | -/* when built into the kernel, we only print version if device is found */ |
|---|
| 658 | | -#ifndef MODULE |
|---|
| 659 | | - static int printed_version; |
|---|
| 660 | | - if (!printed_version++) |
|---|
| 661 | | - printk(version); |
|---|
| 662 | | -#endif |
|---|
| 663 | 648 | |
|---|
| 664 | 649 | if (pci_enable_device (pdev)) |
|---|
| 665 | 650 | return -EIO; |
|---|
| .. | .. |
|---|
| 901 | 886 | tx_ring_size = ((sizeof(starfire_tx_desc) * TX_RING_SIZE + QUEUE_ALIGN - 1) / QUEUE_ALIGN) * QUEUE_ALIGN; |
|---|
| 902 | 887 | rx_ring_size = sizeof(struct starfire_rx_desc) * RX_RING_SIZE; |
|---|
| 903 | 888 | np->queue_mem_size = tx_done_q_size + rx_done_q_size + tx_ring_size + rx_ring_size; |
|---|
| 904 | | - np->queue_mem = pci_alloc_consistent(np->pci_dev, np->queue_mem_size, &np->queue_mem_dma); |
|---|
| 889 | + np->queue_mem = dma_alloc_coherent(&np->pci_dev->dev, |
|---|
| 890 | + np->queue_mem_size, |
|---|
| 891 | + &np->queue_mem_dma, GFP_ATOMIC); |
|---|
| 905 | 892 | if (np->queue_mem == NULL) { |
|---|
| 906 | 893 | free_irq(irq, dev); |
|---|
| 907 | 894 | return -ENOMEM; |
|---|
| .. | .. |
|---|
| 1105 | 1092 | } |
|---|
| 1106 | 1093 | |
|---|
| 1107 | 1094 | |
|---|
| 1108 | | -static void tx_timeout(struct net_device *dev) |
|---|
| 1095 | +static void tx_timeout(struct net_device *dev, unsigned int txqueue) |
|---|
| 1109 | 1096 | { |
|---|
| 1110 | 1097 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 1111 | 1098 | void __iomem *ioaddr = np->base; |
|---|
| .. | .. |
|---|
| 1151 | 1138 | np->rx_info[i].skb = skb; |
|---|
| 1152 | 1139 | if (skb == NULL) |
|---|
| 1153 | 1140 | break; |
|---|
| 1154 | | - np->rx_info[i].mapping = pci_map_single(np->pci_dev, skb->data, np->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 1155 | | - if (pci_dma_mapping_error(np->pci_dev, |
|---|
| 1156 | | - np->rx_info[i].mapping)) { |
|---|
| 1141 | + np->rx_info[i].mapping = dma_map_single(&np->pci_dev->dev, |
|---|
| 1142 | + skb->data, |
|---|
| 1143 | + np->rx_buf_sz, |
|---|
| 1144 | + DMA_FROM_DEVICE); |
|---|
| 1145 | + if (dma_mapping_error(&np->pci_dev->dev, np->rx_info[i].mapping)) { |
|---|
| 1157 | 1146 | dev_kfree_skb(skb); |
|---|
| 1158 | 1147 | np->rx_info[i].skb = NULL; |
|---|
| 1159 | 1148 | break; |
|---|
| .. | .. |
|---|
| 1232 | 1221 | status |= skb_first_frag_len(skb) | (skb_num_frags(skb) << 16); |
|---|
| 1233 | 1222 | |
|---|
| 1234 | 1223 | np->tx_info[entry].mapping = |
|---|
| 1235 | | - pci_map_single(np->pci_dev, skb->data, skb_first_frag_len(skb), PCI_DMA_TODEVICE); |
|---|
| 1224 | + dma_map_single(&np->pci_dev->dev, skb->data, |
|---|
| 1225 | + skb_first_frag_len(skb), |
|---|
| 1226 | + DMA_TO_DEVICE); |
|---|
| 1236 | 1227 | } else { |
|---|
| 1237 | 1228 | const skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i - 1]; |
|---|
| 1238 | 1229 | status |= skb_frag_size(this_frag); |
|---|
| 1239 | 1230 | np->tx_info[entry].mapping = |
|---|
| 1240 | | - pci_map_single(np->pci_dev, |
|---|
| 1231 | + dma_map_single(&np->pci_dev->dev, |
|---|
| 1241 | 1232 | skb_frag_address(this_frag), |
|---|
| 1242 | 1233 | skb_frag_size(this_frag), |
|---|
| 1243 | | - PCI_DMA_TODEVICE); |
|---|
| 1234 | + DMA_TO_DEVICE); |
|---|
| 1244 | 1235 | } |
|---|
| 1245 | | - if (pci_dma_mapping_error(np->pci_dev, |
|---|
| 1246 | | - np->tx_info[entry].mapping)) { |
|---|
| 1236 | + if (dma_mapping_error(&np->pci_dev->dev, np->tx_info[entry].mapping)) { |
|---|
| 1247 | 1237 | dev->stats.tx_dropped++; |
|---|
| 1248 | 1238 | goto err_out; |
|---|
| 1249 | 1239 | } |
|---|
| .. | .. |
|---|
| 1286 | 1276 | entry = prev_tx % TX_RING_SIZE; |
|---|
| 1287 | 1277 | np->tx_info[entry].skb = NULL; |
|---|
| 1288 | 1278 | if (i > 0) { |
|---|
| 1289 | | - pci_unmap_single(np->pci_dev, |
|---|
| 1279 | + dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1290 | 1280 | np->tx_info[entry].mapping, |
|---|
| 1291 | | - skb_first_frag_len(skb), |
|---|
| 1292 | | - PCI_DMA_TODEVICE); |
|---|
| 1281 | + skb_first_frag_len(skb), DMA_TO_DEVICE); |
|---|
| 1293 | 1282 | np->tx_info[entry].mapping = 0; |
|---|
| 1294 | 1283 | entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE; |
|---|
| 1295 | 1284 | for (j = 1; j < i; j++) { |
|---|
| 1296 | | - pci_unmap_single(np->pci_dev, |
|---|
| 1285 | + dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1297 | 1286 | np->tx_info[entry].mapping, |
|---|
| 1298 | | - skb_frag_size( |
|---|
| 1299 | | - &skb_shinfo(skb)->frags[j-1]), |
|---|
| 1300 | | - PCI_DMA_TODEVICE); |
|---|
| 1287 | + skb_frag_size(&skb_shinfo(skb)->frags[j - 1]), |
|---|
| 1288 | + DMA_TO_DEVICE); |
|---|
| 1301 | 1289 | entry++; |
|---|
| 1302 | 1290 | } |
|---|
| 1303 | 1291 | } |
|---|
| .. | .. |
|---|
| 1371 | 1359 | u16 entry = (tx_status & 0x7fff) / sizeof(starfire_tx_desc); |
|---|
| 1372 | 1360 | struct sk_buff *skb = np->tx_info[entry].skb; |
|---|
| 1373 | 1361 | np->tx_info[entry].skb = NULL; |
|---|
| 1374 | | - pci_unmap_single(np->pci_dev, |
|---|
| 1362 | + dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1375 | 1363 | np->tx_info[entry].mapping, |
|---|
| 1376 | 1364 | skb_first_frag_len(skb), |
|---|
| 1377 | | - PCI_DMA_TODEVICE); |
|---|
| 1365 | + DMA_TO_DEVICE); |
|---|
| 1378 | 1366 | np->tx_info[entry].mapping = 0; |
|---|
| 1379 | 1367 | np->dirty_tx += np->tx_info[entry].used_slots; |
|---|
| 1380 | 1368 | entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE; |
|---|
| 1381 | 1369 | { |
|---|
| 1382 | 1370 | int i; |
|---|
| 1383 | 1371 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
|---|
| 1384 | | - pci_unmap_single(np->pci_dev, |
|---|
| 1372 | + dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1385 | 1373 | np->tx_info[entry].mapping, |
|---|
| 1386 | 1374 | skb_frag_size(&skb_shinfo(skb)->frags[i]), |
|---|
| 1387 | | - PCI_DMA_TODEVICE); |
|---|
| 1375 | + DMA_TO_DEVICE); |
|---|
| 1388 | 1376 | np->dirty_tx++; |
|---|
| 1389 | 1377 | entry++; |
|---|
| 1390 | 1378 | } |
|---|
| 1391 | 1379 | } |
|---|
| 1392 | 1380 | |
|---|
| 1393 | | - dev_kfree_skb_irq(skb); |
|---|
| 1381 | + dev_consume_skb_irq(skb); |
|---|
| 1394 | 1382 | } |
|---|
| 1395 | 1383 | np->tx_done_q[np->tx_done].status = 0; |
|---|
| 1396 | 1384 | np->tx_done = (np->tx_done + 1) % DONE_Q_SIZE; |
|---|
| .. | .. |
|---|
| 1476 | 1464 | if (pkt_len < rx_copybreak && |
|---|
| 1477 | 1465 | (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) { |
|---|
| 1478 | 1466 | skb_reserve(skb, 2); /* 16 byte align the IP header */ |
|---|
| 1479 | | - pci_dma_sync_single_for_cpu(np->pci_dev, |
|---|
| 1480 | | - np->rx_info[entry].mapping, |
|---|
| 1481 | | - pkt_len, PCI_DMA_FROMDEVICE); |
|---|
| 1467 | + dma_sync_single_for_cpu(&np->pci_dev->dev, |
|---|
| 1468 | + np->rx_info[entry].mapping, |
|---|
| 1469 | + pkt_len, DMA_FROM_DEVICE); |
|---|
| 1482 | 1470 | skb_copy_to_linear_data(skb, np->rx_info[entry].skb->data, pkt_len); |
|---|
| 1483 | | - pci_dma_sync_single_for_device(np->pci_dev, |
|---|
| 1484 | | - np->rx_info[entry].mapping, |
|---|
| 1485 | | - pkt_len, PCI_DMA_FROMDEVICE); |
|---|
| 1471 | + dma_sync_single_for_device(&np->pci_dev->dev, |
|---|
| 1472 | + np->rx_info[entry].mapping, |
|---|
| 1473 | + pkt_len, DMA_FROM_DEVICE); |
|---|
| 1486 | 1474 | skb_put(skb, pkt_len); |
|---|
| 1487 | 1475 | } else { |
|---|
| 1488 | | - pci_unmap_single(np->pci_dev, np->rx_info[entry].mapping, np->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 1476 | + dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1477 | + np->rx_info[entry].mapping, |
|---|
| 1478 | + np->rx_buf_sz, DMA_FROM_DEVICE); |
|---|
| 1489 | 1479 | skb = np->rx_info[entry].skb; |
|---|
| 1490 | 1480 | skb_put(skb, pkt_len); |
|---|
| 1491 | 1481 | np->rx_info[entry].skb = NULL; |
|---|
| .. | .. |
|---|
| 1603 | 1593 | if (skb == NULL) |
|---|
| 1604 | 1594 | break; /* Better luck next round. */ |
|---|
| 1605 | 1595 | np->rx_info[entry].mapping = |
|---|
| 1606 | | - pci_map_single(np->pci_dev, skb->data, np->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 1607 | | - if (pci_dma_mapping_error(np->pci_dev, |
|---|
| 1608 | | - np->rx_info[entry].mapping)) { |
|---|
| 1596 | + dma_map_single(&np->pci_dev->dev, skb->data, |
|---|
| 1597 | + np->rx_buf_sz, DMA_FROM_DEVICE); |
|---|
| 1598 | + if (dma_mapping_error(&np->pci_dev->dev, np->rx_info[entry].mapping)) { |
|---|
| 1609 | 1599 | dev_kfree_skb(skb); |
|---|
| 1610 | 1600 | np->rx_info[entry].skb = NULL; |
|---|
| 1611 | 1601 | break; |
|---|
| .. | .. |
|---|
| 1853 | 1843 | { |
|---|
| 1854 | 1844 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 1855 | 1845 | strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); |
|---|
| 1856 | | - strlcpy(info->version, DRV_VERSION, sizeof(info->version)); |
|---|
| 1857 | 1846 | strlcpy(info->bus_info, pci_name(np->pci_dev), sizeof(info->bus_info)); |
|---|
| 1858 | 1847 | } |
|---|
| 1859 | 1848 | |
|---|
| .. | .. |
|---|
| 1979 | 1968 | for (i = 0; i < RX_RING_SIZE; i++) { |
|---|
| 1980 | 1969 | np->rx_ring[i].rxaddr = cpu_to_dma(0xBADF00D0); /* An invalid address. */ |
|---|
| 1981 | 1970 | if (np->rx_info[i].skb != NULL) { |
|---|
| 1982 | | - pci_unmap_single(np->pci_dev, np->rx_info[i].mapping, np->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 1971 | + dma_unmap_single(&np->pci_dev->dev, |
|---|
| 1972 | + np->rx_info[i].mapping, |
|---|
| 1973 | + np->rx_buf_sz, DMA_FROM_DEVICE); |
|---|
| 1983 | 1974 | dev_kfree_skb(np->rx_info[i].skb); |
|---|
| 1984 | 1975 | } |
|---|
| 1985 | 1976 | np->rx_info[i].skb = NULL; |
|---|
| .. | .. |
|---|
| 1989 | 1980 | struct sk_buff *skb = np->tx_info[i].skb; |
|---|
| 1990 | 1981 | if (skb == NULL) |
|---|
| 1991 | 1982 | continue; |
|---|
| 1992 | | - pci_unmap_single(np->pci_dev, |
|---|
| 1993 | | - np->tx_info[i].mapping, |
|---|
| 1994 | | - skb_first_frag_len(skb), PCI_DMA_TODEVICE); |
|---|
| 1983 | + dma_unmap_single(&np->pci_dev->dev, np->tx_info[i].mapping, |
|---|
| 1984 | + skb_first_frag_len(skb), DMA_TO_DEVICE); |
|---|
| 1995 | 1985 | np->tx_info[i].mapping = 0; |
|---|
| 1996 | 1986 | dev_kfree_skb(skb); |
|---|
| 1997 | 1987 | np->tx_info[i].skb = NULL; |
|---|
| .. | .. |
|---|
| 2000 | 1990 | return 0; |
|---|
| 2001 | 1991 | } |
|---|
| 2002 | 1992 | |
|---|
| 2003 | | -#ifdef CONFIG_PM |
|---|
| 2004 | | -static int starfire_suspend(struct pci_dev *pdev, pm_message_t state) |
|---|
| 1993 | +static int __maybe_unused starfire_suspend(struct device *dev_d) |
|---|
| 2005 | 1994 | { |
|---|
| 2006 | | - struct net_device *dev = pci_get_drvdata(pdev); |
|---|
| 1995 | + struct net_device *dev = dev_get_drvdata(dev_d); |
|---|
| 2007 | 1996 | |
|---|
| 2008 | 1997 | if (netif_running(dev)) { |
|---|
| 2009 | 1998 | netif_device_detach(dev); |
|---|
| 2010 | 1999 | netdev_close(dev); |
|---|
| 2011 | 2000 | } |
|---|
| 2012 | 2001 | |
|---|
| 2013 | | - pci_save_state(pdev); |
|---|
| 2014 | | - pci_set_power_state(pdev, pci_choose_state(pdev,state)); |
|---|
| 2015 | | - |
|---|
| 2016 | 2002 | return 0; |
|---|
| 2017 | 2003 | } |
|---|
| 2018 | 2004 | |
|---|
| 2019 | | -static int starfire_resume(struct pci_dev *pdev) |
|---|
| 2005 | +static int __maybe_unused starfire_resume(struct device *dev_d) |
|---|
| 2020 | 2006 | { |
|---|
| 2021 | | - struct net_device *dev = pci_get_drvdata(pdev); |
|---|
| 2022 | | - |
|---|
| 2023 | | - pci_set_power_state(pdev, PCI_D0); |
|---|
| 2024 | | - pci_restore_state(pdev); |
|---|
| 2007 | + struct net_device *dev = dev_get_drvdata(dev_d); |
|---|
| 2025 | 2008 | |
|---|
| 2026 | 2009 | if (netif_running(dev)) { |
|---|
| 2027 | 2010 | netdev_open(dev); |
|---|
| .. | .. |
|---|
| 2030 | 2013 | |
|---|
| 2031 | 2014 | return 0; |
|---|
| 2032 | 2015 | } |
|---|
| 2033 | | -#endif /* CONFIG_PM */ |
|---|
| 2034 | | - |
|---|
| 2035 | 2016 | |
|---|
| 2036 | 2017 | static void starfire_remove_one(struct pci_dev *pdev) |
|---|
| 2037 | 2018 | { |
|---|
| .. | .. |
|---|
| 2043 | 2024 | unregister_netdev(dev); |
|---|
| 2044 | 2025 | |
|---|
| 2045 | 2026 | if (np->queue_mem) |
|---|
| 2046 | | - pci_free_consistent(pdev, np->queue_mem_size, np->queue_mem, np->queue_mem_dma); |
|---|
| 2027 | + dma_free_coherent(&pdev->dev, np->queue_mem_size, |
|---|
| 2028 | + np->queue_mem, np->queue_mem_dma); |
|---|
| 2047 | 2029 | |
|---|
| 2048 | 2030 | |
|---|
| 2049 | 2031 | /* XXX: add wakeup code -- requires firmware for MagicPacket */ |
|---|
| .. | .. |
|---|
| 2056 | 2038 | free_netdev(dev); /* Will also free np!! */ |
|---|
| 2057 | 2039 | } |
|---|
| 2058 | 2040 | |
|---|
| 2041 | +static SIMPLE_DEV_PM_OPS(starfire_pm_ops, starfire_suspend, starfire_resume); |
|---|
| 2059 | 2042 | |
|---|
| 2060 | 2043 | static struct pci_driver starfire_driver = { |
|---|
| 2061 | 2044 | .name = DRV_NAME, |
|---|
| 2062 | 2045 | .probe = starfire_init_one, |
|---|
| 2063 | 2046 | .remove = starfire_remove_one, |
|---|
| 2064 | | -#ifdef CONFIG_PM |
|---|
| 2065 | | - .suspend = starfire_suspend, |
|---|
| 2066 | | - .resume = starfire_resume, |
|---|
| 2067 | | -#endif /* CONFIG_PM */ |
|---|
| 2047 | + .driver.pm = &starfire_pm_ops, |
|---|
| 2068 | 2048 | .id_table = starfire_pci_tbl, |
|---|
| 2069 | 2049 | }; |
|---|
| 2070 | 2050 | |
|---|
| .. | .. |
|---|
| 2073 | 2053 | { |
|---|
| 2074 | 2054 | /* when a module, this is printed whether or not devices are found in probe */ |
|---|
| 2075 | 2055 | #ifdef MODULE |
|---|
| 2076 | | - printk(version); |
|---|
| 2077 | | - |
|---|
| 2078 | 2056 | printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n"); |
|---|
| 2079 | 2057 | #endif |
|---|
| 2080 | 2058 | |
|---|