amd8111e: 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
a6676019a7
commit
6ba33ac8a4
@ -1306,20 +1306,6 @@ config AMD8111_ETH
|
|||||||
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 amd8111e.
|
will be called amd8111e.
|
||||||
|
|
||||||
config AMD8111E_NAPI
|
|
||||||
bool "Use RX polling (NAPI)"
|
|
||||||
depends on AMD8111_ETH
|
|
||||||
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 ADAPTEC_STARFIRE
|
config ADAPTEC_STARFIRE
|
||||||
tristate "Adaptec Starfire/DuraLAN support"
|
tristate "Adaptec Starfire/DuraLAN support"
|
||||||
depends on NET_PCI && PCI
|
depends on NET_PCI && PCI
|
||||||
|
@ -101,9 +101,9 @@ Revision History:
|
|||||||
|
|
||||||
#include "amd8111e.h"
|
#include "amd8111e.h"
|
||||||
#define MODULE_NAME "amd8111e"
|
#define MODULE_NAME "amd8111e"
|
||||||
#define MODULE_VERS "3.0.6"
|
#define MODULE_VERS "3.0.7"
|
||||||
MODULE_AUTHOR("Advanced Micro Devices, Inc.");
|
MODULE_AUTHOR("Advanced Micro Devices, Inc.");
|
||||||
MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version 3.0.6");
|
MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version "MODULE_VERS);
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
|
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
|
||||||
module_param_array(speed_duplex, int, NULL, 0);
|
module_param_array(speed_duplex, int, NULL, 0);
|
||||||
@ -671,11 +671,7 @@ This is the receive indication function for packets with vlan tag.
|
|||||||
*/
|
*/
|
||||||
static int amd8111e_vlan_rx(struct amd8111e_priv *lp, struct sk_buff *skb, u16 vlan_tag)
|
static int amd8111e_vlan_rx(struct amd8111e_priv *lp, struct sk_buff *skb, u16 vlan_tag)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_AMD8111E_NAPI
|
|
||||||
return vlan_hwaccel_receive_skb(skb, lp->vlgrp,vlan_tag);
|
return vlan_hwaccel_receive_skb(skb, lp->vlgrp,vlan_tag);
|
||||||
#else
|
|
||||||
return vlan_hwaccel_rx(skb, lp->vlgrp, vlan_tag);
|
|
||||||
#endif /* CONFIG_AMD8111E_NAPI */
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -722,7 +718,6 @@ static int amd8111e_tx(struct net_device *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_AMD8111E_NAPI
|
|
||||||
/* This function handles the driver receive operation in polling mode */
|
/* This function handles the driver receive operation in polling mode */
|
||||||
static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
|
static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
|
||||||
{
|
{
|
||||||
@ -734,7 +729,6 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
|
|||||||
int min_pkt_len, status;
|
int min_pkt_len, status;
|
||||||
unsigned int intr0;
|
unsigned int intr0;
|
||||||
int num_rx_pkt = 0;
|
int num_rx_pkt = 0;
|
||||||
/*int max_rx_pkt = NUM_RX_BUFFERS;*/
|
|
||||||
short pkt_len;
|
short pkt_len;
|
||||||
#if AMD8111E_VLAN_TAG_USED
|
#if AMD8111E_VLAN_TAG_USED
|
||||||
short vtag;
|
short vtag;
|
||||||
@ -850,108 +844,6 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
|
|||||||
return num_rx_pkt;
|
return num_rx_pkt;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
This function will check the ownership of receive buffers and descriptors. It will indicate to kernel up to half the number of maximum receive buffers in the descriptor ring, in a single receive interrupt. It will also replenish the descriptors with new skbs.
|
|
||||||
*/
|
|
||||||
static int amd8111e_rx(struct net_device *dev)
|
|
||||||
{
|
|
||||||
struct amd8111e_priv *lp = netdev_priv(dev);
|
|
||||||
struct sk_buff *skb,*new_skb;
|
|
||||||
int rx_index = lp->rx_idx & RX_RING_DR_MOD_MASK;
|
|
||||||
int min_pkt_len, status;
|
|
||||||
int num_rx_pkt = 0;
|
|
||||||
int max_rx_pkt = NUM_RX_BUFFERS;
|
|
||||||
short pkt_len;
|
|
||||||
#if AMD8111E_VLAN_TAG_USED
|
|
||||||
short vtag;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If we own the next entry, it's a new packet. Send it up. */
|
|
||||||
while(++num_rx_pkt <= max_rx_pkt){
|
|
||||||
status = le16_to_cpu(lp->rx_ring[rx_index].rx_flags);
|
|
||||||
if(status & OWN_BIT)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* check if err summary bit is set */
|
|
||||||
if(status & ERR_BIT){
|
|
||||||
/*
|
|
||||||
* There is a tricky error noted by John Murphy,
|
|
||||||
* <murf@perftech.com> to Russ Nelson: Even with full-sized
|
|
||||||
* buffers it's possible for a jabber packet to use two
|
|
||||||
* buffers, with only the last correctly noting the error. */
|
|
||||||
/* reseting flags */
|
|
||||||
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
|
|
||||||
goto err_next_pkt;
|
|
||||||
}
|
|
||||||
/* check for STP and ENP */
|
|
||||||
if(!((status & STP_BIT) && (status & ENP_BIT))){
|
|
||||||
/* reseting flags */
|
|
||||||
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
|
|
||||||
goto err_next_pkt;
|
|
||||||
}
|
|
||||||
pkt_len = le16_to_cpu(lp->rx_ring[rx_index].msg_count) - 4;
|
|
||||||
|
|
||||||
#if AMD8111E_VLAN_TAG_USED
|
|
||||||
vtag = status & TT_MASK;
|
|
||||||
/*MAC will strip vlan tag*/
|
|
||||||
if(lp->vlgrp != NULL && vtag !=0)
|
|
||||||
min_pkt_len =MIN_PKT_LEN - 4;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
min_pkt_len =MIN_PKT_LEN;
|
|
||||||
|
|
||||||
if (pkt_len < min_pkt_len) {
|
|
||||||
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
|
|
||||||
lp->drv_rx_errors++;
|
|
||||||
goto err_next_pkt;
|
|
||||||
}
|
|
||||||
if(!(new_skb = dev_alloc_skb(lp->rx_buff_len))){
|
|
||||||
/* if allocation fail,
|
|
||||||
ignore that pkt and go to next one */
|
|
||||||
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
|
|
||||||
lp->drv_rx_errors++;
|
|
||||||
goto err_next_pkt;
|
|
||||||
}
|
|
||||||
|
|
||||||
skb_reserve(new_skb, 2);
|
|
||||||
skb = lp->rx_skbuff[rx_index];
|
|
||||||
pci_unmap_single(lp->pci_dev,lp->rx_dma_addr[rx_index],
|
|
||||||
lp->rx_buff_len-2, PCI_DMA_FROMDEVICE);
|
|
||||||
skb_put(skb, pkt_len);
|
|
||||||
lp->rx_skbuff[rx_index] = new_skb;
|
|
||||||
lp->rx_dma_addr[rx_index] = pci_map_single(lp->pci_dev,
|
|
||||||
new_skb->data, lp->rx_buff_len-2,PCI_DMA_FROMDEVICE);
|
|
||||||
|
|
||||||
skb->protocol = eth_type_trans(skb, dev);
|
|
||||||
|
|
||||||
#if AMD8111E_VLAN_TAG_USED
|
|
||||||
if(lp->vlgrp != NULL && (vtag == TT_VLAN_TAGGED)){
|
|
||||||
amd8111e_vlan_rx(lp, skb,
|
|
||||||
le16_to_cpu(lp->rx_ring[rx_index].tag_ctrl_info));
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
|
|
||||||
netif_rx (skb);
|
|
||||||
/*COAL update rx coalescing parameters*/
|
|
||||||
lp->coal_conf.rx_packets++;
|
|
||||||
lp->coal_conf.rx_bytes += pkt_len;
|
|
||||||
|
|
||||||
dev->last_rx = jiffies;
|
|
||||||
|
|
||||||
err_next_pkt:
|
|
||||||
lp->rx_ring[rx_index].buff_phy_addr
|
|
||||||
= cpu_to_le32(lp->rx_dma_addr[rx_index]);
|
|
||||||
lp->rx_ring[rx_index].buff_count =
|
|
||||||
cpu_to_le16(lp->rx_buff_len-2);
|
|
||||||
wmb();
|
|
||||||
lp->rx_ring[rx_index].rx_flags |= cpu_to_le16(OWN_BIT);
|
|
||||||
rx_index = (++lp->rx_idx) & RX_RING_DR_MOD_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_AMD8111E_NAPI */
|
|
||||||
/*
|
/*
|
||||||
This function will indicate the link status to the kernel.
|
This function will indicate the link status to the kernel.
|
||||||
*/
|
*/
|
||||||
@ -1280,29 +1172,22 @@ static irqreturn_t amd8111e_interrupt(int irq, void *dev_id)
|
|||||||
writel(intr0, mmio + INT0);
|
writel(intr0, mmio + INT0);
|
||||||
|
|
||||||
/* Check if Receive Interrupt has occurred. */
|
/* Check if Receive Interrupt has occurred. */
|
||||||
#ifdef CONFIG_AMD8111E_NAPI
|
if (intr0 & RINT0) {
|
||||||
if(intr0 & RINT0){
|
if (netif_rx_schedule_prep(dev, &lp->napi)) {
|
||||||
if(netif_rx_schedule_prep(dev, &lp->napi)){
|
|
||||||
/* Disable receive interupts */
|
/* Disable receive interupts */
|
||||||
writel(RINTEN0, mmio + INTEN0);
|
writel(RINTEN0, mmio + INTEN0);
|
||||||
/* Schedule a polling routine */
|
/* Schedule a polling routine */
|
||||||
__netif_rx_schedule(dev, &lp->napi);
|
__netif_rx_schedule(dev, &lp->napi);
|
||||||
}
|
} else if (intren0 & RINTEN0) {
|
||||||
else if (intren0 & RINTEN0) {
|
|
||||||
printk("************Driver bug! \
|
printk("************Driver bug! \
|
||||||
interrupt while in poll\n");
|
interrupt while in poll\n");
|
||||||
/* Fix by disable receive interrupts */
|
/* Fix by disable receive interrupts */
|
||||||
writel(RINTEN0, mmio + INTEN0);
|
writel(RINTEN0, mmio + INTEN0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if(intr0 & RINT0){
|
|
||||||
amd8111e_rx(dev);
|
|
||||||
writel(VAL2 | RDMD0, mmio + CMD0);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_AMD8111E_NAPI */
|
|
||||||
/* Check if Transmit Interrupt has occurred. */
|
/* Check if Transmit Interrupt has occurred. */
|
||||||
if(intr0 & TINT0)
|
if (intr0 & TINT0)
|
||||||
amd8111e_tx(dev);
|
amd8111e_tx(dev);
|
||||||
|
|
||||||
/* Check if Link Change Interrupt has occurred. */
|
/* Check if Link Change Interrupt has occurred. */
|
||||||
@ -1340,9 +1225,7 @@ static int amd8111e_close(struct net_device * dev)
|
|||||||
struct amd8111e_priv *lp = netdev_priv(dev);
|
struct amd8111e_priv *lp = netdev_priv(dev);
|
||||||
netif_stop_queue(dev);
|
netif_stop_queue(dev);
|
||||||
|
|
||||||
#ifdef CONFIG_AMD8111E_NAPI
|
|
||||||
napi_disable(&lp->napi);
|
napi_disable(&lp->napi);
|
||||||
#endif
|
|
||||||
|
|
||||||
spin_lock_irq(&lp->lock);
|
spin_lock_irq(&lp->lock);
|
||||||
|
|
||||||
@ -1374,9 +1257,7 @@ static int amd8111e_open(struct net_device * dev )
|
|||||||
dev->name, dev))
|
dev->name, dev))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
#ifdef CONFIG_AMD8111E_NAPI
|
|
||||||
napi_enable(&lp->napi);
|
napi_enable(&lp->napi);
|
||||||
#endif
|
|
||||||
|
|
||||||
spin_lock_irq(&lp->lock);
|
spin_lock_irq(&lp->lock);
|
||||||
|
|
||||||
@ -1384,9 +1265,7 @@ static int amd8111e_open(struct net_device * dev )
|
|||||||
|
|
||||||
if(amd8111e_restart(dev)){
|
if(amd8111e_restart(dev)){
|
||||||
spin_unlock_irq(&lp->lock);
|
spin_unlock_irq(&lp->lock);
|
||||||
#ifdef CONFIG_AMD8111E_NAPI
|
|
||||||
napi_disable(&lp->napi);
|
napi_disable(&lp->napi);
|
||||||
#endif
|
|
||||||
if (dev->irq)
|
if (dev->irq)
|
||||||
free_irq(dev->irq, dev);
|
free_irq(dev->irq, dev);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -2036,9 +1915,7 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev,
|
|||||||
dev->irq =pdev->irq;
|
dev->irq =pdev->irq;
|
||||||
dev->tx_timeout = amd8111e_tx_timeout;
|
dev->tx_timeout = amd8111e_tx_timeout;
|
||||||
dev->watchdog_timeo = AMD8111E_TX_TIMEOUT;
|
dev->watchdog_timeo = AMD8111E_TX_TIMEOUT;
|
||||||
#ifdef CONFIG_AMD8111E_NAPI
|
|
||||||
netif_napi_add(dev, &lp->napi, amd8111e_rx_poll, 32);
|
netif_napi_add(dev, &lp->napi, amd8111e_rx_poll, 32);
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
dev->poll_controller = amd8111e_poll;
|
dev->poll_controller = amd8111e_poll;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user