diff options
Diffstat (limited to 'drivers/net/r8169.c')
| -rw-r--r-- | drivers/net/r8169.c | 145 |
1 files changed, 44 insertions, 101 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 657242504621..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. */ |
| 71 | static const int max_interrupt_work = 20; | 55 | static 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 *, | |||
| 458 | static int rtl8169_change_mtu(struct net_device *dev, int new_mtu); | 440 | static int rtl8169_change_mtu(struct net_device *dev, int new_mtu); |
| 459 | static void rtl8169_down(struct net_device *dev); | 441 | static void rtl8169_down(struct net_device *dev); |
| 460 | static void rtl8169_rx_clear(struct rtl8169_private *tp); | 442 | static void rtl8169_rx_clear(struct rtl8169_private *tp); |
| 461 | |||
| 462 | #ifdef CONFIG_R8169_NAPI | ||
| 463 | static int rtl8169_poll(struct napi_struct *napi, int budget); | 443 | static int rtl8169_poll(struct napi_struct *napi, int budget); |
| 464 | #endif | ||
| 465 | 444 | ||
| 466 | static const unsigned int rtl8169_rx_config = | 445 | static 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 | ||
| 2407 | static void rtl8169_reinit_task(struct work_struct *work) | 2377 | static 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 | } | 2891 | } |
| 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 | } | ||
| 2945 | /* Clear all interrupt sources. */ | ||
| 2946 | RTL_W16(IntrStatus, 0xffff); | ||
| 2947 | } | 2892 | } |
| 2948 | out: | 2893 | out: |
| 2949 | return IRQ_RETVAL(handled); | 2894 | return IRQ_RETVAL(handled); |
| 2950 | } | 2895 | } |
| 2951 | 2896 | ||
| 2952 | #ifdef CONFIG_R8169_NAPI | ||
| 2953 | static int rtl8169_poll(struct napi_struct *napi, int budget) | 2897 | static 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 | ||
| 2980 | static void rtl8169_down(struct net_device *dev) | 2923 | static 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 | ||
| 2994 | core_down: | 2935 | core_down: |
| 2995 | spin_lock_irq(&tp->lock); | 2936 | spin_lock_irq(&tp->lock); |
| @@ -3098,8 +3039,10 @@ static void rtl_set_rx_mode(struct net_device *dev) | |||
| 3098 | (tp->mac_version == RTL_GIGA_MAC_VER_15) || | 3039 | (tp->mac_version == RTL_GIGA_MAC_VER_15) || |
| 3099 | (tp->mac_version == RTL_GIGA_MAC_VER_16) || | 3040 | (tp->mac_version == RTL_GIGA_MAC_VER_16) || |
| 3100 | (tp->mac_version == RTL_GIGA_MAC_VER_17)) { | 3041 | (tp->mac_version == RTL_GIGA_MAC_VER_17)) { |
| 3101 | mc_filter[0] = 0xffffffff; | 3042 | u32 data = mc_filter[0]; |
| 3102 | mc_filter[1] = 0xffffffff; | 3043 | |
| 3044 | mc_filter[0] = swab32(mc_filter[1]); | ||
| 3045 | mc_filter[1] = swab32(data); | ||
| 3103 | } | 3046 | } |
| 3104 | 3047 | ||
| 3105 | RTL_W32(MAR0 + 0, mc_filter[0]); | 3048 | RTL_W32(MAR0 + 0, mc_filter[0]); |
