|
@@ -101,9 +101,9 @@ Revision History:
|
|
|
|
|
|
#include "amd8111e.h"
|
|
|
#define MODULE_NAME "amd8111e"
|
|
|
-#define MODULE_VERS "3.0.6"
|
|
|
+#define MODULE_VERS "3.0.7"
|
|
|
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_DEVICE_TABLE(pci, amd8111e_pci_tbl);
|
|
|
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)
|
|
|
{
|
|
|
-#ifdef CONFIG_AMD8111E_NAPI
|
|
|
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
|
|
|
|
|
@@ -722,7 +718,6 @@ static int amd8111e_tx(struct net_device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_AMD8111E_NAPI
|
|
|
/* This function handles the driver receive operation in polling mode */
|
|
|
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;
|
|
|
unsigned int intr0;
|
|
|
int num_rx_pkt = 0;
|
|
|
- /*int max_rx_pkt = NUM_RX_BUFFERS;*/
|
|
|
short pkt_len;
|
|
|
#if AMD8111E_VLAN_TAG_USED
|
|
|
short vtag;
|
|
@@ -850,108 +844,6 @@ rx_not_empty:
|
|
|
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.
|
|
|
*/
|
|
@@ -1280,29 +1172,22 @@ static irqreturn_t amd8111e_interrupt(int irq, void *dev_id)
|
|
|
writel(intr0, mmio + INT0);
|
|
|
|
|
|
/* Check if Receive Interrupt has occurred. */
|
|
|
-#ifdef CONFIG_AMD8111E_NAPI
|
|
|
- if(intr0 & RINT0){
|
|
|
- if(netif_rx_schedule_prep(dev, &lp->napi)){
|
|
|
+ if (intr0 & RINT0) {
|
|
|
+ if (netif_rx_schedule_prep(dev, &lp->napi)) {
|
|
|
/* Disable receive interupts */
|
|
|
writel(RINTEN0, mmio + INTEN0);
|
|
|
/* Schedule a polling routine */
|
|
|
__netif_rx_schedule(dev, &lp->napi);
|
|
|
- }
|
|
|
- else if (intren0 & RINTEN0) {
|
|
|
+ } else if (intren0 & RINTEN0) {
|
|
|
printk("************Driver bug! \
|
|
|
interrupt while in poll\n");
|
|
|
/* Fix by disable receive interrupts */
|
|
|
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. */
|
|
|
- if(intr0 & TINT0)
|
|
|
+ if (intr0 & TINT0)
|
|
|
amd8111e_tx(dev);
|
|
|
|
|
|
/* 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);
|
|
|
netif_stop_queue(dev);
|
|
|
|
|
|
-#ifdef CONFIG_AMD8111E_NAPI
|
|
|
napi_disable(&lp->napi);
|
|
|
-#endif
|
|
|
|
|
|
spin_lock_irq(&lp->lock);
|
|
|
|
|
@@ -1374,9 +1257,7 @@ static int amd8111e_open(struct net_device * dev )
|
|
|
dev->name, dev))
|
|
|
return -EAGAIN;
|
|
|
|
|
|
-#ifdef CONFIG_AMD8111E_NAPI
|
|
|
napi_enable(&lp->napi);
|
|
|
-#endif
|
|
|
|
|
|
spin_lock_irq(&lp->lock);
|
|
|
|
|
@@ -1384,9 +1265,7 @@ static int amd8111e_open(struct net_device * dev )
|
|
|
|
|
|
if(amd8111e_restart(dev)){
|
|
|
spin_unlock_irq(&lp->lock);
|
|
|
-#ifdef CONFIG_AMD8111E_NAPI
|
|
|
napi_disable(&lp->napi);
|
|
|
-#endif
|
|
|
if (dev->irq)
|
|
|
free_irq(dev->irq, dev);
|
|
|
return -ENOMEM;
|
|
@@ -2036,9 +1915,7 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev,
|
|
|
dev->irq =pdev->irq;
|
|
|
dev->tx_timeout = amd8111e_tx_timeout;
|
|
|
dev->watchdog_timeo = AMD8111E_TX_TIMEOUT;
|
|
|
-#ifdef CONFIG_AMD8111E_NAPI
|
|
|
netif_napi_add(dev, &lp->napi, amd8111e_rx_poll, 32);
|
|
|
-#endif
|
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
|
dev->poll_controller = amd8111e_poll;
|
|
|
#endif
|