.. | .. |
---|
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 | |
---|