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.c82
1 files changed, 53 insertions, 29 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 964305c7f9f1..340da3915b96 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -187,8 +187,13 @@ static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
187 187
188MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); 188MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
189 189
190static int rx_copybreak = 200; 190/*
191static int use_dac = -1; 191 * we set our copybreak very high so that we don't have
192 * to allocate 16k frames all the time (see note in
193 * rtl8169_open()
194 */
195static int rx_copybreak = 16383;
196static int use_dac;
192static struct { 197static struct {
193 u32 msg_enable; 198 u32 msg_enable;
194} debug = { -1 }; 199} debug = { -1 };
@@ -513,8 +518,7 @@ MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
513module_param(rx_copybreak, int, 0); 518module_param(rx_copybreak, int, 0);
514MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); 519MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
515module_param(use_dac, int, 0); 520module_param(use_dac, int, 0);
516MODULE_PARM_DESC(use_dac, "Enable PCI DAC. -1 defaults on for PCI Express only." 521MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
517" Unsafe on 32 bit PCI slot.");
518module_param_named(debug, debug.msg_enable, int, 0); 522module_param_named(debug, debug.msg_enable, int, 0);
519MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); 523MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
520MODULE_LICENSE("GPL"); 524MODULE_LICENSE("GPL");
@@ -1054,14 +1058,14 @@ static void rtl8169_vlan_rx_register(struct net_device *dev,
1054} 1058}
1055 1059
1056static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc, 1060static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
1057 struct sk_buff *skb) 1061 struct sk_buff *skb, int polling)
1058{ 1062{
1059 u32 opts2 = le32_to_cpu(desc->opts2); 1063 u32 opts2 = le32_to_cpu(desc->opts2);
1060 struct vlan_group *vlgrp = tp->vlgrp; 1064 struct vlan_group *vlgrp = tp->vlgrp;
1061 int ret; 1065 int ret;
1062 1066
1063 if (vlgrp && (opts2 & RxVlanTag)) { 1067 if (vlgrp && (opts2 & RxVlanTag)) {
1064 vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff)); 1068 __vlan_hwaccel_rx(skb, vlgrp, swab16(opts2 & 0xffff), polling);
1065 ret = 0; 1069 ret = 0;
1066 } else 1070 } else
1067 ret = -1; 1071 ret = -1;
@@ -1078,7 +1082,7 @@ static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
1078} 1082}
1079 1083
1080static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc, 1084static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
1081 struct sk_buff *skb) 1085 struct sk_buff *skb, int polling)
1082{ 1086{
1083 return -1; 1087 return -1;
1084} 1088}
@@ -2837,8 +2841,8 @@ static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
2837 spin_lock_irq(&tp->lock); 2841 spin_lock_irq(&tp->lock);
2838 2842
2839 RTL_W8(Cfg9346, Cfg9346_Unlock); 2843 RTL_W8(Cfg9346, Cfg9346_Unlock);
2840 RTL_W32(MAC0, low);
2841 RTL_W32(MAC4, high); 2844 RTL_W32(MAC4, high);
2845 RTL_W32(MAC0, low);
2842 RTL_W8(Cfg9346, Cfg9346_Lock); 2846 RTL_W8(Cfg9346, Cfg9346_Lock);
2843 2847
2844 spin_unlock_irq(&tp->lock); 2848 spin_unlock_irq(&tp->lock);
@@ -2990,7 +2994,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
2990 void __iomem *ioaddr; 2994 void __iomem *ioaddr;
2991 unsigned int i; 2995 unsigned int i;
2992 int rc; 2996 int rc;
2993 int this_use_dac = use_dac;
2994 2997
2995 if (netif_msg_drv(&debug)) { 2998 if (netif_msg_drv(&debug)) {
2996 printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n", 2999 printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
@@ -3056,17 +3059,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3056 3059
3057 tp->cp_cmd = PCIMulRW | RxChkSum; 3060 tp->cp_cmd = PCIMulRW | RxChkSum;
3058 3061
3059 tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
3060 if (!tp->pcie_cap)
3061 netif_info(tp, probe, dev, "no PCI Express capability\n");
3062
3063 if (this_use_dac < 0)
3064 this_use_dac = tp->pcie_cap != 0;
3065
3066 if ((sizeof(dma_addr_t) > 4) && 3062 if ((sizeof(dma_addr_t) > 4) &&
3067 this_use_dac && 3063 !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
3068 !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
3069 netif_info(tp, probe, dev, "using 64-bit DMA\n");
3070 tp->cp_cmd |= PCIDAC; 3064 tp->cp_cmd |= PCIDAC;
3071 dev->features |= NETIF_F_HIGHDMA; 3065 dev->features |= NETIF_F_HIGHDMA;
3072 } else { 3066 } else {
@@ -3085,6 +3079,10 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3085 goto err_out_free_res_4; 3079 goto err_out_free_res_4;
3086 } 3080 }
3087 3081
3082 tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
3083 if (!tp->pcie_cap)
3084 netif_info(tp, probe, dev, "no PCI Express capability\n");
3085
3088 RTL_W16(IntrMask, 0x0000); 3086 RTL_W16(IntrMask, 0x0000);
3089 3087
3090 /* Soft reset the chip. */ 3088 /* Soft reset the chip. */
@@ -3254,9 +3252,13 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
3254} 3252}
3255 3253
3256static void rtl8169_set_rxbufsize(struct rtl8169_private *tp, 3254static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
3257 struct net_device *dev) 3255 unsigned int mtu)
3258{ 3256{
3259 unsigned int max_frame = dev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN; 3257 unsigned int max_frame = mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
3258
3259 if (max_frame != 16383)
3260 printk(KERN_WARNING PFX "WARNING! Changing of MTU on this "
3261 "NIC may lead to frame reception errors!\n");
3260 3262
3261 tp->rx_buf_sz = (max_frame > RX_BUF_SIZE) ? max_frame : RX_BUF_SIZE; 3263 tp->rx_buf_sz = (max_frame > RX_BUF_SIZE) ? max_frame : RX_BUF_SIZE;
3262} 3264}
@@ -3269,7 +3271,17 @@ static int rtl8169_open(struct net_device *dev)
3269 3271
3270 pm_runtime_get_sync(&pdev->dev); 3272 pm_runtime_get_sync(&pdev->dev);
3271 3273
3272 rtl8169_set_rxbufsize(tp, dev); 3274 /*
3275 * Note that we use a magic value here, its wierd I know
3276 * its done because, some subset of rtl8169 hardware suffers from
3277 * a problem in which frames received that are longer than
3278 * the size set in RxMaxSize register return garbage sizes
3279 * when received. To avoid this we need to turn off filtering,
3280 * which is done by setting a value of 16383 in the RxMaxSize register
3281 * and allocating 16k frames to handle the largest possible rx value
3282 * thats what the magic math below does.
3283 */
3284 rtl8169_set_rxbufsize(tp, 16383 - VLAN_ETH_HLEN - ETH_FCS_LEN);
3273 3285
3274 /* 3286 /*
3275 * Rx and Tx desscriptors needs 256 bytes alignment. 3287 * Rx and Tx desscriptors needs 256 bytes alignment.
@@ -3929,7 +3941,7 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
3929 3941
3930 rtl8169_down(dev); 3942 rtl8169_down(dev);
3931 3943
3932 rtl8169_set_rxbufsize(tp, dev); 3944 rtl8169_set_rxbufsize(tp, dev->mtu);
3933 3945
3934 ret = rtl8169_init_ring(dev); 3946 ret = rtl8169_init_ring(dev);
3935 if (ret < 0) 3947 if (ret < 0)
@@ -4467,12 +4479,20 @@ out:
4467 return done; 4479 return done;
4468} 4480}
4469 4481
4482/*
4483 * Warning : rtl8169_rx_interrupt() might be called :
4484 * 1) from NAPI (softirq) context
4485 * (polling = 1 : we should call netif_receive_skb())
4486 * 2) from process context (rtl8169_reset_task())
4487 * (polling = 0 : we must call netif_rx() instead)
4488 */
4470static int rtl8169_rx_interrupt(struct net_device *dev, 4489static int rtl8169_rx_interrupt(struct net_device *dev,
4471 struct rtl8169_private *tp, 4490 struct rtl8169_private *tp,
4472 void __iomem *ioaddr, u32 budget) 4491 void __iomem *ioaddr, u32 budget)
4473{ 4492{
4474 unsigned int cur_rx, rx_left; 4493 unsigned int cur_rx, rx_left;
4475 unsigned int delta, count; 4494 unsigned int delta, count;
4495 int polling = (budget != ~(u32)0) ? 1 : 0;
4476 4496
4477 cur_rx = tp->cur_rx; 4497 cur_rx = tp->cur_rx;
4478 rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx; 4498 rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
@@ -4534,8 +4554,12 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
4534 skb_put(skb, pkt_size); 4554 skb_put(skb, pkt_size);
4535 skb->protocol = eth_type_trans(skb, dev); 4555 skb->protocol = eth_type_trans(skb, dev);
4536 4556
4537 if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0) 4557 if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
4538 netif_receive_skb(skb); 4558 if (likely(polling))
4559 netif_receive_skb(skb);
4560 else
4561 netif_rx(skb);
4562 }
4539 4563
4540 dev->stats.rx_bytes += pkt_size; 4564 dev->stats.rx_bytes += pkt_size;
4541 dev->stats.rx_packets++; 4565 dev->stats.rx_packets++;
@@ -4773,12 +4797,12 @@ static void rtl_set_rx_mode(struct net_device *dev)
4773 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys; 4797 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
4774 mc_filter[1] = mc_filter[0] = 0xffffffff; 4798 mc_filter[1] = mc_filter[0] = 0xffffffff;
4775 } else { 4799 } else {
4776 struct dev_mc_list *mclist; 4800 struct netdev_hw_addr *ha;
4777 4801
4778 rx_mode = AcceptBroadcast | AcceptMyPhys; 4802 rx_mode = AcceptBroadcast | AcceptMyPhys;
4779 mc_filter[1] = mc_filter[0] = 0; 4803 mc_filter[1] = mc_filter[0] = 0;
4780 netdev_for_each_mc_addr(mclist, dev) { 4804 netdev_for_each_mc_addr(ha, dev) {
4781 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26; 4805 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
4782 mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31); 4806 mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
4783 rx_mode |= AcceptMulticast; 4807 rx_mode |= AcceptMulticast;
4784 } 4808 }
@@ -4796,8 +4820,8 @@ static void rtl_set_rx_mode(struct net_device *dev)
4796 mc_filter[1] = swab32(data); 4820 mc_filter[1] = swab32(data);
4797 } 4821 }
4798 4822
4799 RTL_W32(MAR0 + 0, mc_filter[0]);
4800 RTL_W32(MAR0 + 4, mc_filter[1]); 4823 RTL_W32(MAR0 + 4, mc_filter[1]);
4824 RTL_W32(MAR0 + 0, mc_filter[0]);
4801 4825
4802 RTL_W32(RxConfig, tmp); 4826 RTL_W32(RxConfig, tmp);
4803 4827