aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/Kconfig16
-rw-r--r--drivers/net/r8169.c139
2 files changed, 41 insertions, 114 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index d85b9d067597..84925915dce4 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -2122,27 +2122,13 @@ config R8169
2122 To compile this driver as a module, choose M here: the module 2122 To compile this driver as a module, choose M here: the module
2123 will be called r8169. This is recommended. 2123 will be called r8169. This is recommended.
2124 2124
2125config R8169_NAPI
2126 bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
2127 depends on R8169 && EXPERIMENTAL
2128 help
2129 NAPI is a new driver API designed to reduce CPU and interrupt load
2130 when the driver is receiving lots of packets from the card. It is
2131 still somewhat experimental and thus not yet enabled by default.
2132
2133 If your estimated Rx load is 10kpps or more, or if the card will be
2134 deployed on potentially unfriendly networks (e.g. in a firewall),
2135 then say Y here.
2136
2137 If in doubt, say N.
2138
2139config R8169_VLAN 2125config R8169_VLAN
2140 bool "VLAN support" 2126 bool "VLAN support"
2141 depends on R8169 && VLAN_8021Q 2127 depends on R8169 && VLAN_8021Q
2142 ---help--- 2128 ---help---
2143 Say Y here for the r8169 driver to support the functions required 2129 Say Y here for the r8169 driver to support the functions required
2144 by the kernel 802.1Q code. 2130 by the kernel 802.1Q code.
2145 2131
2146 If in doubt, say Y. 2132 If in doubt, say Y.
2147 2133
2148config SB1250_MAC 2134config SB1250_MAC
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);