diff options
Diffstat (limited to 'drivers/net/starfire.c')
-rw-r--r-- | drivers/net/starfire.c | 111 |
1 files changed, 45 insertions, 66 deletions
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index 2038f38dc04b..1d2ef8f47780 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
@@ -27,8 +27,8 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #define DRV_NAME "starfire" | 29 | #define DRV_NAME "starfire" |
30 | #define DRV_VERSION "2.0" | 30 | #define DRV_VERSION "2.1" |
31 | #define DRV_RELDATE "June 27, 2006" | 31 | #define DRV_RELDATE "July 6, 2008" |
32 | 32 | ||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <linux/kernel.h> | 34 | #include <linux/kernel.h> |
@@ -69,10 +69,6 @@ | |||
69 | #define VLAN_SUPPORT | 69 | #define VLAN_SUPPORT |
70 | #endif | 70 | #endif |
71 | 71 | ||
72 | #ifndef CONFIG_ADAPTEC_STARFIRE_NAPI | ||
73 | #undef HAVE_NETDEV_POLL | ||
74 | #endif | ||
75 | |||
76 | /* The user-configurable values. | 72 | /* The user-configurable values. |
77 | These may be modified when a driver module is loaded.*/ | 73 | These may be modified when a driver module is loaded.*/ |
78 | 74 | ||
@@ -177,44 +173,6 @@ static int full_duplex[MAX_UNITS] = {0, }; | |||
177 | #define skb_first_frag_len(skb) skb_headlen(skb) | 173 | #define skb_first_frag_len(skb) skb_headlen(skb) |
178 | #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1) | 174 | #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1) |
179 | 175 | ||
180 | #ifdef HAVE_NETDEV_POLL | ||
181 | #define init_poll(dev, np) \ | ||
182 | netif_napi_add(dev, &np->napi, netdev_poll, max_interrupt_work) | ||
183 | #define netdev_rx(dev, np, ioaddr) \ | ||
184 | do { \ | ||
185 | u32 intr_enable; \ | ||
186 | if (netif_rx_schedule_prep(dev, &np->napi)) { \ | ||
187 | __netif_rx_schedule(dev, &np->napi); \ | ||
188 | intr_enable = readl(ioaddr + IntrEnable); \ | ||
189 | intr_enable &= ~(IntrRxDone | IntrRxEmpty); \ | ||
190 | writel(intr_enable, ioaddr + IntrEnable); \ | ||
191 | readl(ioaddr + IntrEnable); /* flush PCI posting buffers */ \ | ||
192 | } else { \ | ||
193 | /* Paranoia check */ \ | ||
194 | intr_enable = readl(ioaddr + IntrEnable); \ | ||
195 | if (intr_enable & (IntrRxDone | IntrRxEmpty)) { \ | ||
196 | printk(KERN_INFO "%s: interrupt while in polling mode!\n", dev->name); \ | ||
197 | intr_enable &= ~(IntrRxDone | IntrRxEmpty); \ | ||
198 | writel(intr_enable, ioaddr + IntrEnable); \ | ||
199 | } \ | ||
200 | } \ | ||
201 | } while (0) | ||
202 | #define netdev_receive_skb(skb) netif_receive_skb(skb) | ||
203 | #define vlan_netdev_receive_skb(skb, vlgrp, vlid) vlan_hwaccel_receive_skb(skb, vlgrp, vlid) | ||
204 | static int netdev_poll(struct napi_struct *napi, int budget); | ||
205 | #else /* not HAVE_NETDEV_POLL */ | ||
206 | #define init_poll(dev, np) | ||
207 | #define netdev_receive_skb(skb) netif_rx(skb) | ||
208 | #define vlan_netdev_receive_skb(skb, vlgrp, vlid) vlan_hwaccel_rx(skb, vlgrp, vlid) | ||
209 | #define netdev_rx(dev, np, ioaddr) \ | ||
210 | do { \ | ||
211 | int quota = np->dirty_rx + RX_RING_SIZE - np->cur_rx; \ | ||
212 | __netdev_rx(dev, "a);\ | ||
213 | } while (0) | ||
214 | #endif /* not HAVE_NETDEV_POLL */ | ||
215 | /* end of compatibility code */ | ||
216 | |||
217 | |||
218 | /* These identify the driver base version and may not be removed. */ | 176 | /* These identify the driver base version and may not be removed. */ |
219 | static char version[] = | 177 | static char version[] = |
220 | KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker <becker@scyld.com>\n" | 178 | KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker <becker@scyld.com>\n" |
@@ -635,6 +593,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev); | |||
635 | static irqreturn_t intr_handler(int irq, void *dev_instance); | 593 | static irqreturn_t intr_handler(int irq, void *dev_instance); |
636 | static void netdev_error(struct net_device *dev, int intr_status); | 594 | static void netdev_error(struct net_device *dev, int intr_status); |
637 | static int __netdev_rx(struct net_device *dev, int *quota); | 595 | static int __netdev_rx(struct net_device *dev, int *quota); |
596 | static int netdev_poll(struct napi_struct *napi, int budget); | ||
638 | static void refill_rx_ring(struct net_device *dev); | 597 | static void refill_rx_ring(struct net_device *dev); |
639 | static void netdev_error(struct net_device *dev, int intr_status); | 598 | static void netdev_error(struct net_device *dev, int intr_status); |
640 | static void set_rx_mode(struct net_device *dev); | 599 | static void set_rx_mode(struct net_device *dev); |
@@ -851,7 +810,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, | |||
851 | dev->hard_start_xmit = &start_tx; | 810 | dev->hard_start_xmit = &start_tx; |
852 | dev->tx_timeout = tx_timeout; | 811 | dev->tx_timeout = tx_timeout; |
853 | dev->watchdog_timeo = TX_TIMEOUT; | 812 | dev->watchdog_timeo = TX_TIMEOUT; |
854 | init_poll(dev, np); | 813 | netif_napi_add(dev, &np->napi, netdev_poll, max_interrupt_work); |
855 | dev->stop = &netdev_close; | 814 | dev->stop = &netdev_close; |
856 | dev->get_stats = &get_stats; | 815 | dev->get_stats = &get_stats; |
857 | dev->set_multicast_list = &set_rx_mode; | 816 | dev->set_multicast_list = &set_rx_mode; |
@@ -1054,9 +1013,8 @@ static int netdev_open(struct net_device *dev) | |||
1054 | 1013 | ||
1055 | writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl); | 1014 | writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl); |
1056 | 1015 | ||
1057 | #ifdef HAVE_NETDEV_POLL | ||
1058 | napi_enable(&np->napi); | 1016 | napi_enable(&np->napi); |
1059 | #endif | 1017 | |
1060 | netif_start_queue(dev); | 1018 | netif_start_queue(dev); |
1061 | 1019 | ||
1062 | if (debug > 1) | 1020 | if (debug > 1) |
@@ -1330,8 +1288,28 @@ static irqreturn_t intr_handler(int irq, void *dev_instance) | |||
1330 | 1288 | ||
1331 | handled = 1; | 1289 | handled = 1; |
1332 | 1290 | ||
1333 | if (intr_status & (IntrRxDone | IntrRxEmpty)) | 1291 | if (intr_status & (IntrRxDone | IntrRxEmpty)) { |
1334 | netdev_rx(dev, np, ioaddr); | 1292 | u32 enable; |
1293 | |||
1294 | if (likely(netif_rx_schedule_prep(dev, &np->napi))) { | ||
1295 | __netif_rx_schedule(dev, &np->napi); | ||
1296 | enable = readl(ioaddr + IntrEnable); | ||
1297 | enable &= ~(IntrRxDone | IntrRxEmpty); | ||
1298 | writel(enable, ioaddr + IntrEnable); | ||
1299 | /* flush PCI posting buffers */ | ||
1300 | readl(ioaddr + IntrEnable); | ||
1301 | } else { | ||
1302 | /* Paranoia check */ | ||
1303 | enable = readl(ioaddr + IntrEnable); | ||
1304 | if (enable & (IntrRxDone | IntrRxEmpty)) { | ||
1305 | printk(KERN_INFO | ||
1306 | "%s: interrupt while in poll!\n", | ||
1307 | dev->name); | ||
1308 | enable &= ~(IntrRxDone | IntrRxEmpty); | ||
1309 | writel(enable, ioaddr + IntrEnable); | ||
1310 | } | ||
1311 | } | ||
1312 | } | ||
1335 | 1313 | ||
1336 | /* Scavenge the skbuff list based on the Tx-done queue. | 1314 | /* Scavenge the skbuff list based on the Tx-done queue. |
1337 | There are redundant checks here that may be cleaned up | 1315 | There are redundant checks here that may be cleaned up |
@@ -1411,8 +1389,10 @@ static irqreturn_t intr_handler(int irq, void *dev_instance) | |||
1411 | } | 1389 | } |
1412 | 1390 | ||
1413 | 1391 | ||
1414 | /* This routine is logically part of the interrupt/poll handler, but separated | 1392 | /* |
1415 | for clarity, code sharing between NAPI/non-NAPI, and better register allocation. */ | 1393 | * This routine is logically part of the interrupt/poll handler, but separated |
1394 | * for clarity and better register allocation. | ||
1395 | */ | ||
1416 | static int __netdev_rx(struct net_device *dev, int *quota) | 1396 | static int __netdev_rx(struct net_device *dev, int *quota) |
1417 | { | 1397 | { |
1418 | struct netdev_private *np = netdev_priv(dev); | 1398 | struct netdev_private *np = netdev_priv(dev); |
@@ -1507,13 +1487,20 @@ static int __netdev_rx(struct net_device *dev, int *quota) | |||
1507 | } | 1487 | } |
1508 | #ifdef VLAN_SUPPORT | 1488 | #ifdef VLAN_SUPPORT |
1509 | if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) { | 1489 | if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) { |
1510 | if (debug > 4) | 1490 | u16 vlid = le16_to_cpu(desc->vlanid); |
1511 | printk(KERN_DEBUG " netdev_rx() vlanid = %d\n", le16_to_cpu(desc->vlanid)); | 1491 | |
1512 | /* vlan_netdev_receive_skb() expects a packet with the VLAN tag stripped out */ | 1492 | if (debug > 4) { |
1513 | vlan_netdev_receive_skb(skb, np->vlgrp, le16_to_cpu(desc->vlanid)); | 1493 | printk(KERN_DEBUG " netdev_rx() vlanid = %d\n", |
1494 | vlid); | ||
1495 | } | ||
1496 | /* | ||
1497 | * vlan_hwaccel_rx expects a packet with the VLAN tag | ||
1498 | * stripped out. | ||
1499 | */ | ||
1500 | vlan_hwaccel_rx(skb, np->vlgrp, vlid); | ||
1514 | } else | 1501 | } else |
1515 | #endif /* VLAN_SUPPORT */ | 1502 | #endif /* VLAN_SUPPORT */ |
1516 | netdev_receive_skb(skb); | 1503 | netif_receive_skb(skb); |
1517 | dev->last_rx = jiffies; | 1504 | dev->last_rx = jiffies; |
1518 | np->stats.rx_packets++; | 1505 | np->stats.rx_packets++; |
1519 | 1506 | ||
@@ -1532,8 +1519,6 @@ static int __netdev_rx(struct net_device *dev, int *quota) | |||
1532 | return retcode; | 1519 | return retcode; |
1533 | } | 1520 | } |
1534 | 1521 | ||
1535 | |||
1536 | #ifdef HAVE_NETDEV_POLL | ||
1537 | static int netdev_poll(struct napi_struct *napi, int budget) | 1522 | static int netdev_poll(struct napi_struct *napi, int budget) |
1538 | { | 1523 | { |
1539 | struct netdev_private *np = container_of(napi, struct netdev_private, napi); | 1524 | struct netdev_private *np = container_of(napi, struct netdev_private, napi); |
@@ -1564,8 +1549,6 @@ static int netdev_poll(struct napi_struct *napi, int budget) | |||
1564 | /* Restart Rx engine if stopped. */ | 1549 | /* Restart Rx engine if stopped. */ |
1565 | return budget - quota; | 1550 | return budget - quota; |
1566 | } | 1551 | } |
1567 | #endif /* HAVE_NETDEV_POLL */ | ||
1568 | |||
1569 | 1552 | ||
1570 | static void refill_rx_ring(struct net_device *dev) | 1553 | static void refill_rx_ring(struct net_device *dev) |
1571 | { | 1554 | { |
@@ -1906,9 +1889,8 @@ static int netdev_close(struct net_device *dev) | |||
1906 | int i; | 1889 | int i; |
1907 | 1890 | ||
1908 | netif_stop_queue(dev); | 1891 | netif_stop_queue(dev); |
1909 | #ifdef HAVE_NETDEV_POLL | 1892 | |
1910 | napi_disable(&np->napi); | 1893 | napi_disable(&np->napi); |
1911 | #endif | ||
1912 | 1894 | ||
1913 | if (debug > 1) { | 1895 | if (debug > 1) { |
1914 | printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n", | 1896 | printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n", |
@@ -2044,11 +2026,8 @@ static int __init starfire_init (void) | |||
2044 | /* when a module, this is printed whether or not devices are found in probe */ | 2026 | /* when a module, this is printed whether or not devices are found in probe */ |
2045 | #ifdef MODULE | 2027 | #ifdef MODULE |
2046 | printk(version); | 2028 | printk(version); |
2047 | #ifdef HAVE_NETDEV_POLL | 2029 | |
2048 | printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n"); | 2030 | printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n"); |
2049 | #else | ||
2050 | printk(KERN_INFO DRV_NAME ": polling (NAPI) disabled\n"); | ||
2051 | #endif | ||
2052 | #endif | 2031 | #endif |
2053 | 2032 | ||
2054 | /* we can do this test only at run-time... sigh */ | 2033 | /* we can do this test only at run-time... sigh */ |