diff options
Diffstat (limited to 'drivers/net/r8169.c')
| -rw-r--r-- | drivers/net/r8169.c | 82 | 
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 | ||
| 188 | MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); | 188 | MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); | 
| 189 | 189 | ||
| 190 | static int rx_copybreak = 200; | 190 | /* | 
| 191 | static 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 | */ | ||
| 195 | static int rx_copybreak = 16383; | ||
| 196 | static int use_dac; | ||
| 192 | static struct { | 197 | static 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"); | |||
| 513 | module_param(rx_copybreak, int, 0); | 518 | module_param(rx_copybreak, int, 0); | 
| 514 | MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); | 519 | MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); | 
| 515 | module_param(use_dac, int, 0); | 520 | module_param(use_dac, int, 0); | 
| 516 | MODULE_PARM_DESC(use_dac, "Enable PCI DAC. -1 defaults on for PCI Express only." | 521 | MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot."); | 
| 517 | " Unsafe on 32 bit PCI slot."); | ||
| 518 | module_param_named(debug, debug.msg_enable, int, 0); | 522 | module_param_named(debug, debug.msg_enable, int, 0); | 
| 519 | MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); | 523 | MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); | 
| 520 | MODULE_LICENSE("GPL"); | 524 | MODULE_LICENSE("GPL"); | 
| @@ -1054,14 +1058,14 @@ static void rtl8169_vlan_rx_register(struct net_device *dev, | |||
| 1054 | } | 1058 | } | 
| 1055 | 1059 | ||
| 1056 | static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc, | 1060 | static 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 | ||
| 1080 | static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc, | 1084 | static 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 | ||
| 3256 | static void rtl8169_set_rxbufsize(struct rtl8169_private *tp, | 3254 | static 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 | */ | ||
| 4470 | static int rtl8169_rx_interrupt(struct net_device *dev, | 4489 | static 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 | ||
