forked from Minki/linux
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:
parent
6a3d8aa48c
commit
a6676019a7
@ -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
|
||||||
|
@ -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, "a);\
|
|
||||||
} 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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user