aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/r8169.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/r8169.c')
-rw-r--r--drivers/net/r8169.c139
1 files changed, 40 insertions, 99 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 9086e819d742..cfe8829ed31f 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -28,13 +28,7 @@
28#include <asm/io.h> 28#include <asm/io.h>
29#include <asm/irq.h> 29#include <asm/irq.h>
30 30
31#ifdef CONFIG_R8169_NAPI 31#define RTL8169_VERSION "2.3LK-NAPI"
32#define NAPI_SUFFIX "-NAPI"
33#else
34#define NAPI_SUFFIX ""
35#endif
36
37#define RTL8169_VERSION "2.2LK" NAPI_SUFFIX
38#define MODULENAME "r8169" 32#define MODULENAME "r8169"
39#define PFX MODULENAME ": " 33#define PFX MODULENAME ": "
40 34
@@ -57,16 +51,6 @@
57#define TX_BUFFS_AVAIL(tp) \ 51#define TX_BUFFS_AVAIL(tp) \
58 (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1) 52 (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
59 53
60#ifdef CONFIG_R8169_NAPI
61#define rtl8169_rx_skb netif_receive_skb
62#define rtl8169_rx_hwaccel_skb vlan_hwaccel_receive_skb
63#define rtl8169_rx_quota(count, quota) min(count, quota)
64#else
65#define rtl8169_rx_skb netif_rx
66#define rtl8169_rx_hwaccel_skb vlan_hwaccel_rx
67#define rtl8169_rx_quota(count, quota) count
68#endif
69
70/* Maximum events (Rx packets, etc.) to handle at each interrupt. */ 54/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
71static const int max_interrupt_work = 20; 55static const int max_interrupt_work = 20;
72 56
@@ -394,9 +378,7 @@ struct rtl8169_private {
394 void __iomem *mmio_addr; /* memory map physical address */ 378 void __iomem *mmio_addr; /* memory map physical address */
395 struct pci_dev *pci_dev; /* Index of PCI device */ 379 struct pci_dev *pci_dev; /* Index of PCI device */
396 struct net_device *dev; 380 struct net_device *dev;
397#ifdef CONFIG_R8169_NAPI
398 struct napi_struct napi; 381 struct napi_struct napi;
399#endif
400 spinlock_t lock; /* spin lock flag */ 382 spinlock_t lock; /* spin lock flag */
401 u32 msg_enable; 383 u32 msg_enable;
402 int chipset; 384 int chipset;
@@ -458,10 +440,7 @@ static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
458static int rtl8169_change_mtu(struct net_device *dev, int new_mtu); 440static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
459static void rtl8169_down(struct net_device *dev); 441static void rtl8169_down(struct net_device *dev);
460static void rtl8169_rx_clear(struct rtl8169_private *tp); 442static void rtl8169_rx_clear(struct rtl8169_private *tp);
461
462#ifdef CONFIG_R8169_NAPI
463static int rtl8169_poll(struct napi_struct *napi, int budget); 443static int rtl8169_poll(struct napi_struct *napi, int budget);
464#endif
465 444
466static const unsigned int rtl8169_rx_config = 445static const unsigned int rtl8169_rx_config =
467 (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift); 446 (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
@@ -843,10 +822,11 @@ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
843 struct sk_buff *skb) 822 struct sk_buff *skb)
844{ 823{
845 u32 opts2 = le32_to_cpu(desc->opts2); 824 u32 opts2 = le32_to_cpu(desc->opts2);
825 struct vlan_group *vlgrp = tp->vlgrp;
846 int ret; 826 int ret;
847 827
848 if (tp->vlgrp && (opts2 & RxVlanTag)) { 828 if (vlgrp && (opts2 & RxVlanTag)) {
849 rtl8169_rx_hwaccel_skb(skb, tp->vlgrp, swab16(opts2 & 0xffff)); 829 vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff));
850 ret = 0; 830 ret = 0;
851 } else 831 } else
852 ret = -1; 832 ret = -1;
@@ -1764,9 +1744,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1764 dev->change_mtu = rtl8169_change_mtu; 1744 dev->change_mtu = rtl8169_change_mtu;
1765 dev->set_mac_address = rtl_set_mac_address; 1745 dev->set_mac_address = rtl_set_mac_address;
1766 1746
1767#ifdef CONFIG_R8169_NAPI
1768 netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT); 1747 netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
1769#endif
1770 1748
1771#ifdef CONFIG_R8169_VLAN 1749#ifdef CONFIG_R8169_VLAN
1772 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; 1750 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
@@ -1887,9 +1865,7 @@ static int rtl8169_open(struct net_device *dev)
1887 if (retval < 0) 1865 if (retval < 0)
1888 goto err_release_ring_2; 1866 goto err_release_ring_2;
1889 1867
1890#ifdef CONFIG_R8169_NAPI
1891 napi_enable(&tp->napi); 1868 napi_enable(&tp->napi);
1892#endif
1893 1869
1894 rtl_hw_start(dev); 1870 rtl_hw_start(dev);
1895 1871
@@ -2197,9 +2173,7 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
2197 if (ret < 0) 2173 if (ret < 0)
2198 goto out; 2174 goto out;
2199 2175
2200#ifdef CONFIG_R8169_NAPI
2201 napi_enable(&tp->napi); 2176 napi_enable(&tp->napi);
2202#endif
2203 2177
2204 rtl_hw_start(dev); 2178 rtl_hw_start(dev);
2205 2179
@@ -2391,17 +2365,13 @@ static void rtl8169_wait_for_quiescence(struct net_device *dev)
2391 synchronize_irq(dev->irq); 2365 synchronize_irq(dev->irq);
2392 2366
2393 /* Wait for any pending NAPI task to complete */ 2367 /* Wait for any pending NAPI task to complete */
2394#ifdef CONFIG_R8169_NAPI
2395 napi_disable(&tp->napi); 2368 napi_disable(&tp->napi);
2396#endif
2397 2369
2398 rtl8169_irq_mask_and_ack(ioaddr); 2370 rtl8169_irq_mask_and_ack(ioaddr);
2399 2371
2400#ifdef CONFIG_R8169_NAPI
2401 tp->intr_mask = 0xffff; 2372 tp->intr_mask = 0xffff;
2402 RTL_W16(IntrMask, tp->intr_event); 2373 RTL_W16(IntrMask, tp->intr_event);
2403 napi_enable(&tp->napi); 2374 napi_enable(&tp->napi);
2404#endif
2405} 2375}
2406 2376
2407static void rtl8169_reinit_task(struct work_struct *work) 2377static void rtl8169_reinit_task(struct work_struct *work)
@@ -2767,7 +2737,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
2767 2737
2768 cur_rx = tp->cur_rx; 2738 cur_rx = tp->cur_rx;
2769 rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx; 2739 rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
2770 rx_left = rtl8169_rx_quota(rx_left, budget); 2740 rx_left = min(rx_left, budget);
2771 2741
2772 for (; rx_left > 0; rx_left--, cur_rx++) { 2742 for (; rx_left > 0; rx_left--, cur_rx++) {
2773 unsigned int entry = cur_rx % NUM_RX_DESC; 2743 unsigned int entry = cur_rx % NUM_RX_DESC;
@@ -2829,7 +2799,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
2829 skb->protocol = eth_type_trans(skb, dev); 2799 skb->protocol = eth_type_trans(skb, dev);
2830 2800
2831 if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0) 2801 if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
2832 rtl8169_rx_skb(skb); 2802 netif_receive_skb(skb);
2833 2803
2834 dev->last_rx = jiffies; 2804 dev->last_rx = jiffies;
2835 dev->stats.rx_bytes += pkt_size; 2805 dev->stats.rx_bytes += pkt_size;
@@ -2869,87 +2839,61 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
2869{ 2839{
2870 struct net_device *dev = dev_instance; 2840 struct net_device *dev = dev_instance;
2871 struct rtl8169_private *tp = netdev_priv(dev); 2841 struct rtl8169_private *tp = netdev_priv(dev);
2872 int boguscnt = max_interrupt_work;
2873 void __iomem *ioaddr = tp->mmio_addr; 2842 void __iomem *ioaddr = tp->mmio_addr;
2874 int status;
2875 int handled = 0; 2843 int handled = 0;
2844 int status;
2876 2845
2877 do { 2846 status = RTL_R16(IntrStatus);
2878 status = RTL_R16(IntrStatus);
2879 2847
2880 /* hotplug/major error/no more work/shared irq */ 2848 /* hotplug/major error/no more work/shared irq */
2881 if ((status == 0xFFFF) || !status) 2849 if ((status == 0xffff) || !status)
2882 break; 2850 goto out;
2883 2851
2884 handled = 1; 2852 handled = 1;
2885 2853
2886 if (unlikely(!netif_running(dev))) { 2854 if (unlikely(!netif_running(dev))) {
2887 rtl8169_asic_down(ioaddr); 2855 rtl8169_asic_down(ioaddr);
2888 goto out; 2856 goto out;
2889 } 2857 }
2890 2858
2891 status &= tp->intr_mask; 2859 status &= tp->intr_mask;
2892 RTL_W16(IntrStatus, 2860 RTL_W16(IntrStatus,
2893 (status & RxFIFOOver) ? (status | RxOverflow) : status); 2861 (status & RxFIFOOver) ? (status | RxOverflow) : status);
2894 2862
2895 if (!(status & tp->intr_event)) 2863 if (!(status & tp->intr_event))
2896 break; 2864 goto out;
2897 2865
2898 /* Work around for rx fifo overflow */ 2866 /* Work around for rx fifo overflow */
2899 if (unlikely(status & RxFIFOOver) && 2867 if (unlikely(status & RxFIFOOver) &&
2900 (tp->mac_version == RTL_GIGA_MAC_VER_11)) { 2868 (tp->mac_version == RTL_GIGA_MAC_VER_11)) {
2901 netif_stop_queue(dev); 2869 netif_stop_queue(dev);
2902 rtl8169_tx_timeout(dev); 2870 rtl8169_tx_timeout(dev);
2903 break; 2871 goto out;
2904 } 2872 }
2905 2873
2906 if (unlikely(status & SYSErr)) { 2874 if (unlikely(status & SYSErr)) {
2907 rtl8169_pcierr_interrupt(dev); 2875 rtl8169_pcierr_interrupt(dev);
2908 break; 2876 goto out;
2909 } 2877 }
2910 2878
2911 if (status & LinkChg) 2879 if (status & LinkChg)
2912 rtl8169_check_link_status(dev, tp, ioaddr); 2880 rtl8169_check_link_status(dev, tp, ioaddr);
2913 2881
2914#ifdef CONFIG_R8169_NAPI 2882 if (status & tp->napi_event) {
2915 if (status & tp->napi_event) { 2883 RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
2916 RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event); 2884 tp->intr_mask = ~tp->napi_event;
2917 tp->intr_mask = ~tp->napi_event;
2918 2885
2919 if (likely(netif_rx_schedule_prep(dev, &tp->napi))) 2886 if (likely(netif_rx_schedule_prep(dev, &tp->napi)))
2920 __netif_rx_schedule(dev, &tp->napi); 2887 __netif_rx_schedule(dev, &tp->napi);
2921 else if (netif_msg_intr(tp)) { 2888 else if (netif_msg_intr(tp)) {
2922 printk(KERN_INFO "%s: interrupt %04x in poll\n", 2889 printk(KERN_INFO "%s: interrupt %04x in poll\n",
2923 dev->name, status); 2890 dev->name, status);
2924 }
2925 }
2926 break;
2927#else
2928 /* Rx interrupt */
2929 if (status & (RxOK | RxOverflow | RxFIFOOver))
2930 rtl8169_rx_interrupt(dev, tp, ioaddr, ~(u32)0);
2931
2932 /* Tx interrupt */
2933 if (status & (TxOK | TxErr))
2934 rtl8169_tx_interrupt(dev, tp, ioaddr);
2935#endif
2936
2937 boguscnt--;
2938 } while (boguscnt > 0);
2939
2940 if (boguscnt <= 0) {
2941 if (netif_msg_intr(tp) && net_ratelimit() ) {
2942 printk(KERN_WARNING
2943 "%s: Too much work at interrupt!\n", dev->name);
2944 } 2891 }
2945 /* Clear all interrupt sources. */
2946 RTL_W16(IntrStatus, 0xffff);
2947 } 2892 }
2948out: 2893out:
2949 return IRQ_RETVAL(handled); 2894 return IRQ_RETVAL(handled);
2950} 2895}
2951 2896
2952#ifdef CONFIG_R8169_NAPI
2953static int rtl8169_poll(struct napi_struct *napi, int budget) 2897static int rtl8169_poll(struct napi_struct *napi, int budget)
2954{ 2898{
2955 struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi); 2899 struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
@@ -2975,7 +2919,6 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)
2975 2919
2976 return work_done; 2920 return work_done;
2977} 2921}
2978#endif
2979 2922
2980static void rtl8169_down(struct net_device *dev) 2923static void rtl8169_down(struct net_device *dev)
2981{ 2924{
@@ -2987,9 +2930,7 @@ static void rtl8169_down(struct net_device *dev)
2987 2930
2988 netif_stop_queue(dev); 2931 netif_stop_queue(dev);
2989 2932
2990#ifdef CONFIG_R8169_NAPI
2991 napi_disable(&tp->napi); 2933 napi_disable(&tp->napi);
2992#endif
2993 2934
2994core_down: 2935core_down:
2995 spin_lock_irq(&tp->lock); 2936 spin_lock_irq(&tp->lock);