starfire: delete non NAPI code from the driver.

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Acked-by: Jeff Garzik <jgarzik@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Francois Romieu 2008-07-06 20:54:45 -07:00 committed by David S. Miller
parent 6a3d8aa48c
commit a6676019a7
2 changed files with 45 additions and 80 deletions

View File

@ -1334,20 +1334,6 @@ config ADAPTEC_STARFIRE
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called starfire. This is recommended. will be called starfire. This is recommended.
config ADAPTEC_STARFIRE_NAPI
bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
depends on ADAPTEC_STARFIRE && EXPERIMENTAL
help
NAPI is a new driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card. It is
still somewhat experimental and thus not yet enabled by default.
If your estimated Rx load is 10kpps or more, or if the card will be
deployed on potentially unfriendly networks (e.g. in a firewall),
then say Y here.
If in doubt, say N.
config AC3200 config AC3200
tristate "Ansel Communications EISA 3200 support (EXPERIMENTAL)" tristate "Ansel Communications EISA 3200 support (EXPERIMENTAL)"
depends on NET_PCI && (ISA || EISA) && EXPERIMENTAL depends on NET_PCI && (ISA || EISA) && EXPERIMENTAL

View File

@ -27,8 +27,8 @@
*/ */
#define DRV_NAME "starfire" #define DRV_NAME "starfire"
#define DRV_VERSION "2.0" #define DRV_VERSION "2.1"
#define DRV_RELDATE "June 27, 2006" #define DRV_RELDATE "July 6, 2008"
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
@ -69,10 +69,6 @@
#define VLAN_SUPPORT #define VLAN_SUPPORT
#endif #endif
#ifndef CONFIG_ADAPTEC_STARFIRE_NAPI
#undef HAVE_NETDEV_POLL
#endif
/* The user-configurable values. /* The user-configurable values.
These may be modified when a driver module is loaded.*/ These may be modified when a driver module is loaded.*/
@ -177,44 +173,6 @@ static int full_duplex[MAX_UNITS] = {0, };
#define skb_first_frag_len(skb) skb_headlen(skb) #define skb_first_frag_len(skb) skb_headlen(skb)
#define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1) #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1)
#ifdef HAVE_NETDEV_POLL
#define init_poll(dev, np) \
netif_napi_add(dev, &np->napi, netdev_poll, max_interrupt_work)
#define netdev_rx(dev, np, ioaddr) \
do { \
u32 intr_enable; \
if (netif_rx_schedule_prep(dev, &np->napi)) { \
__netif_rx_schedule(dev, &np->napi); \
intr_enable = readl(ioaddr + IntrEnable); \
intr_enable &= ~(IntrRxDone | IntrRxEmpty); \
writel(intr_enable, ioaddr + IntrEnable); \
readl(ioaddr + IntrEnable); /* flush PCI posting buffers */ \
} else { \
/* Paranoia check */ \
intr_enable = readl(ioaddr + IntrEnable); \
if (intr_enable & (IntrRxDone | IntrRxEmpty)) { \
printk(KERN_INFO "%s: interrupt while in polling mode!\n", dev->name); \
intr_enable &= ~(IntrRxDone | IntrRxEmpty); \
writel(intr_enable, ioaddr + IntrEnable); \
} \
} \
} while (0)
#define netdev_receive_skb(skb) netif_receive_skb(skb)
#define vlan_netdev_receive_skb(skb, vlgrp, vlid) vlan_hwaccel_receive_skb(skb, vlgrp, vlid)
static int netdev_poll(struct napi_struct *napi, int budget);
#else /* not HAVE_NETDEV_POLL */
#define init_poll(dev, np)
#define netdev_receive_skb(skb) netif_rx(skb)
#define vlan_netdev_receive_skb(skb, vlgrp, vlid) vlan_hwaccel_rx(skb, vlgrp, vlid)
#define netdev_rx(dev, np, ioaddr) \
do { \
int quota = np->dirty_rx + RX_RING_SIZE - np->cur_rx; \
__netdev_rx(dev, &quota);\
} while (0)
#endif /* not HAVE_NETDEV_POLL */
/* end of compatibility code */
/* These identify the driver base version and may not be removed. */ /* These identify the driver base version and may not be removed. */
static char version[] = static char version[] =
KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker <becker@scyld.com>\n" 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);
static irqreturn_t intr_handler(int irq, void *dev_instance); static irqreturn_t intr_handler(int irq, void *dev_instance);
static void netdev_error(struct net_device *dev, int intr_status); static void netdev_error(struct net_device *dev, int intr_status);
static int __netdev_rx(struct net_device *dev, int *quota); static int __netdev_rx(struct net_device *dev, int *quota);
static int netdev_poll(struct napi_struct *napi, int budget);
static void refill_rx_ring(struct net_device *dev); static void refill_rx_ring(struct net_device *dev);
static void netdev_error(struct net_device *dev, int intr_status); static void netdev_error(struct net_device *dev, int intr_status);
static void set_rx_mode(struct net_device *dev); static void set_rx_mode(struct net_device *dev);
@ -851,7 +810,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
dev->hard_start_xmit = &start_tx; dev->hard_start_xmit = &start_tx;
dev->tx_timeout = tx_timeout; dev->tx_timeout = tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT; dev->watchdog_timeo = TX_TIMEOUT;
init_poll(dev, np); netif_napi_add(dev, &np->napi, netdev_poll, max_interrupt_work);
dev->stop = &netdev_close; dev->stop = &netdev_close;
dev->get_stats = &get_stats; dev->get_stats = &get_stats;
dev->set_multicast_list = &set_rx_mode; dev->set_multicast_list = &set_rx_mode;
@ -1054,9 +1013,8 @@ static int netdev_open(struct net_device *dev)
writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl); writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl);
#ifdef HAVE_NETDEV_POLL
napi_enable(&np->napi); napi_enable(&np->napi);
#endif
netif_start_queue(dev); netif_start_queue(dev);
if (debug > 1) if (debug > 1)
@ -1330,8 +1288,28 @@ static irqreturn_t intr_handler(int irq, void *dev_instance)
handled = 1; handled = 1;
if (intr_status & (IntrRxDone | IntrRxEmpty)) if (intr_status & (IntrRxDone | IntrRxEmpty)) {
netdev_rx(dev, np, ioaddr); u32 enable;
if (likely(netif_rx_schedule_prep(dev, &np->napi))) {
__netif_rx_schedule(dev, &np->napi);
enable = readl(ioaddr + IntrEnable);
enable &= ~(IntrRxDone | IntrRxEmpty);
writel(enable, ioaddr + IntrEnable);
/* flush PCI posting buffers */
readl(ioaddr + IntrEnable);
} else {
/* Paranoia check */
enable = readl(ioaddr + IntrEnable);
if (enable & (IntrRxDone | IntrRxEmpty)) {
printk(KERN_INFO
"%s: interrupt while in poll!\n",
dev->name);
enable &= ~(IntrRxDone | IntrRxEmpty);
writel(enable, ioaddr + IntrEnable);
}
}
}
/* Scavenge the skbuff list based on the Tx-done queue. /* Scavenge the skbuff list based on the Tx-done queue.
There are redundant checks here that may be cleaned up There are redundant checks here that may be cleaned up
@ -1411,8 +1389,10 @@ static irqreturn_t intr_handler(int irq, void *dev_instance)
} }
/* This routine is logically part of the interrupt/poll handler, but separated /*
for clarity, code sharing between NAPI/non-NAPI, and better register allocation. */ * This routine is logically part of the interrupt/poll handler, but separated
* for clarity and better register allocation.
*/
static int __netdev_rx(struct net_device *dev, int *quota) static int __netdev_rx(struct net_device *dev, int *quota)
{ {
struct netdev_private *np = netdev_priv(dev); struct netdev_private *np = netdev_priv(dev);
@ -1507,13 +1487,20 @@ static int __netdev_rx(struct net_device *dev, int *quota)
} }
#ifdef VLAN_SUPPORT #ifdef VLAN_SUPPORT
if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) { if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) {
if (debug > 4) u16 vlid = le16_to_cpu(desc->vlanid);
printk(KERN_DEBUG " netdev_rx() vlanid = %d\n", le16_to_cpu(desc->vlanid));
/* vlan_netdev_receive_skb() expects a packet with the VLAN tag stripped out */ if (debug > 4) {
vlan_netdev_receive_skb(skb, np->vlgrp, le16_to_cpu(desc->vlanid)); printk(KERN_DEBUG " netdev_rx() vlanid = %d\n",
vlid);
}
/*
* vlan_hwaccel_rx expects a packet with the VLAN tag
* stripped out.
*/
vlan_hwaccel_rx(skb, np->vlgrp, vlid);
} else } else
#endif /* VLAN_SUPPORT */ #endif /* VLAN_SUPPORT */
netdev_receive_skb(skb); netif_receive_skb(skb);
dev->last_rx = jiffies; dev->last_rx = jiffies;
np->stats.rx_packets++; np->stats.rx_packets++;
@ -1532,8 +1519,6 @@ static int __netdev_rx(struct net_device *dev, int *quota)
return retcode; return retcode;
} }
#ifdef HAVE_NETDEV_POLL
static int netdev_poll(struct napi_struct *napi, int budget) static int netdev_poll(struct napi_struct *napi, int budget)
{ {
struct netdev_private *np = container_of(napi, struct netdev_private, napi); 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)
/* Restart Rx engine if stopped. */ /* Restart Rx engine if stopped. */
return budget - quota; return budget - quota;
} }
#endif /* HAVE_NETDEV_POLL */
static void refill_rx_ring(struct net_device *dev) static void refill_rx_ring(struct net_device *dev)
{ {
@ -1906,9 +1889,8 @@ static int netdev_close(struct net_device *dev)
int i; int i;
netif_stop_queue(dev); netif_stop_queue(dev);
#ifdef HAVE_NETDEV_POLL
napi_disable(&np->napi); napi_disable(&np->napi);
#endif
if (debug > 1) { if (debug > 1) {
printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n", printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n",
@ -2044,11 +2026,8 @@ static int __init starfire_init (void)
/* when a module, this is printed whether or not devices are found in probe */ /* when a module, this is printed whether or not devices are found in probe */
#ifdef MODULE #ifdef MODULE
printk(version); printk(version);
#ifdef HAVE_NETDEV_POLL
printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n"); printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n");
#else
printk(KERN_INFO DRV_NAME ": polling (NAPI) disabled\n");
#endif
#endif #endif
/* we can do this test only at run-time... sigh */ /* we can do this test only at run-time... sigh */