aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/r8169.c
diff options
context:
space:
mode:
authorhayeswang <hayeswang@realtek.com>2011-03-20 21:50:29 -0400
committerDavid S. Miller <davem@davemloft.net>2011-03-31 00:39:18 -0400
commit4804b3b3aec163b59328140d6c858c3ed1c85992 (patch)
treeac930e62b60d49fedd46ed8a3c8ca4c748c80c26 /drivers/net/r8169.c
parent36a0e6c2d6f3eb59b7a5ddfda63d252a42dba189 (diff)
net/r8169: add a new chip for RTL8168DP
Add a new chip for RTL8168DP. Signed-off-by: Hayes Wang <hayeswang@realtek.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/r8169.c')
-rw-r--r--drivers/net/r8169.c98
1 files changed, 76 insertions, 22 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 0111a143c992..5c480750d8fb 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -127,6 +127,7 @@ enum mac_version {
127 RTL_GIGA_MAC_VER_28 = 0x1c, // 8168DP 127 RTL_GIGA_MAC_VER_28 = 0x1c, // 8168DP
128 RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E 128 RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E
129 RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E 129 RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E
130 RTL_GIGA_MAC_VER_31 = 0x1f, // 8168DP
130}; 131};
131 132
132#define _R(NAME,MAC,MASK) \ 133#define _R(NAME,MAC,MASK) \
@@ -166,7 +167,8 @@ static const struct {
166 _R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_27, 0xff7e1880), // PCI-E 167 _R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_27, 0xff7e1880), // PCI-E
167 _R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_28, 0xff7e1880), // PCI-E 168 _R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_28, 0xff7e1880), // PCI-E
168 _R("RTL8105e", RTL_GIGA_MAC_VER_29, 0xff7e1880), // PCI-E 169 _R("RTL8105e", RTL_GIGA_MAC_VER_29, 0xff7e1880), // PCI-E
169 _R("RTL8105e", RTL_GIGA_MAC_VER_30, 0xff7e1880) // PCI-E 170 _R("RTL8105e", RTL_GIGA_MAC_VER_30, 0xff7e1880), // PCI-E
171 _R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_31, 0xff7e1880) // PCI-E
170}; 172};
171#undef _R 173#undef _R
172 174
@@ -651,12 +653,18 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
651static void rtl8168_driver_start(struct rtl8169_private *tp) 653static void rtl8168_driver_start(struct rtl8169_private *tp)
652{ 654{
653 int i; 655 int i;
656 u32 reg;
654 657
655 rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START); 658 rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START);
656 659
660 if (tp->mac_version == RTL_GIGA_MAC_VER_31)
661 reg = 0xb8;
662 else
663 reg = 0x10;
664
657 for (i = 0; i < 10; i++) { 665 for (i = 0; i < 10; i++) {
658 msleep(10); 666 msleep(10);
659 if (ocp_read(tp, 0x0f, 0x0010) & 0x00000800) 667 if (ocp_read(tp, 0x0f, reg) & 0x00000800)
660 break; 668 break;
661 } 669 }
662} 670}
@@ -664,16 +672,36 @@ static void rtl8168_driver_start(struct rtl8169_private *tp)
664static void rtl8168_driver_stop(struct rtl8169_private *tp) 672static void rtl8168_driver_stop(struct rtl8169_private *tp)
665{ 673{
666 int i; 674 int i;
675 u32 reg;
667 676
668 rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP); 677 rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP);
669 678
679 if (tp->mac_version == RTL_GIGA_MAC_VER_31)
680 reg = 0xb8;
681 else
682 reg = 0x10;
683
670 for (i = 0; i < 10; i++) { 684 for (i = 0; i < 10; i++) {
671 msleep(10); 685 msleep(10);
672 if ((ocp_read(tp, 0x0f, 0x0010) & 0x00000800) == 0) 686 if ((ocp_read(tp, 0x0f, reg) & 0x00000800) == 0)
673 break; 687 break;
674 } 688 }
675} 689}
676 690
691static int r8168dp_check_dash(struct rtl8169_private *tp)
692{
693 u32 reg;
694
695 if (tp->mac_version == RTL_GIGA_MAC_VER_31)
696 reg = 0xb8;
697 else
698 reg = 0x10;
699
700 if (ocp_read(tp, 0xF, reg) & 0x00008000)
701 return 1;
702 else
703 return 0;
704}
677 705
678static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value) 706static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
679{ 707{
@@ -1555,6 +1583,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
1555 /* 8168DP family. */ 1583 /* 8168DP family. */
1556 { 0x7cf00000, 0x28800000, RTL_GIGA_MAC_VER_27 }, 1584 { 0x7cf00000, 0x28800000, RTL_GIGA_MAC_VER_27 },
1557 { 0x7cf00000, 0x28a00000, RTL_GIGA_MAC_VER_28 }, 1585 { 0x7cf00000, 0x28a00000, RTL_GIGA_MAC_VER_28 },
1586 { 0x7cf00000, 0x28b00000, RTL_GIGA_MAC_VER_31 },
1558 1587
1559 /* 8168C family. */ 1588 /* 8168C family. */
1560 { 0x7cf00000, 0x3cb00000, RTL_GIGA_MAC_VER_24 }, 1589 { 0x7cf00000, 0x3cb00000, RTL_GIGA_MAC_VER_24 },
@@ -2860,6 +2889,7 @@ static void __devinit rtl_init_mdio_ops(struct rtl8169_private *tp)
2860 ops->read = r8168dp_1_mdio_read; 2889 ops->read = r8168dp_1_mdio_read;
2861 break; 2890 break;
2862 case RTL_GIGA_MAC_VER_28: 2891 case RTL_GIGA_MAC_VER_28:
2892 case RTL_GIGA_MAC_VER_31:
2863 ops->write = r8168dp_2_mdio_write; 2893 ops->write = r8168dp_2_mdio_write;
2864 ops->read = r8168dp_2_mdio_read; 2894 ops->read = r8168dp_2_mdio_read;
2865 break; 2895 break;
@@ -2917,8 +2947,9 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
2917 void __iomem *ioaddr = tp->mmio_addr; 2947 void __iomem *ioaddr = tp->mmio_addr;
2918 2948
2919 if (((tp->mac_version == RTL_GIGA_MAC_VER_27) || 2949 if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
2920 (tp->mac_version == RTL_GIGA_MAC_VER_28)) && 2950 (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
2921 (ocp_read(tp, 0x0f, 0x0010) & 0x00008000)) { 2951 (tp->mac_version == RTL_GIGA_MAC_VER_31)) &&
2952 r8168dp_check_dash(tp)) {
2922 return; 2953 return;
2923 } 2954 }
2924 2955
@@ -2944,6 +2975,7 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
2944 case RTL_GIGA_MAC_VER_26: 2975 case RTL_GIGA_MAC_VER_26:
2945 case RTL_GIGA_MAC_VER_27: 2976 case RTL_GIGA_MAC_VER_27:
2946 case RTL_GIGA_MAC_VER_28: 2977 case RTL_GIGA_MAC_VER_28:
2978 case RTL_GIGA_MAC_VER_31:
2947 RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80); 2979 RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
2948 break; 2980 break;
2949 } 2981 }
@@ -2954,8 +2986,9 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
2954 void __iomem *ioaddr = tp->mmio_addr; 2986 void __iomem *ioaddr = tp->mmio_addr;
2955 2987
2956 if (((tp->mac_version == RTL_GIGA_MAC_VER_27) || 2988 if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
2957 (tp->mac_version == RTL_GIGA_MAC_VER_28)) && 2989 (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
2958 (ocp_read(tp, 0x0f, 0x0010) & 0x00008000)) { 2990 (tp->mac_version == RTL_GIGA_MAC_VER_31)) &&
2991 r8168dp_check_dash(tp)) {
2959 return; 2992 return;
2960 } 2993 }
2961 2994
@@ -2964,6 +2997,7 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
2964 case RTL_GIGA_MAC_VER_26: 2997 case RTL_GIGA_MAC_VER_26:
2965 case RTL_GIGA_MAC_VER_27: 2998 case RTL_GIGA_MAC_VER_27:
2966 case RTL_GIGA_MAC_VER_28: 2999 case RTL_GIGA_MAC_VER_28:
3000 case RTL_GIGA_MAC_VER_31:
2967 RTL_W8(PMCH, RTL_R8(PMCH) | 0x80); 3001 RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
2968 break; 3002 break;
2969 } 3003 }
@@ -3018,6 +3052,7 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
3018 case RTL_GIGA_MAC_VER_26: 3052 case RTL_GIGA_MAC_VER_26:
3019 case RTL_GIGA_MAC_VER_27: 3053 case RTL_GIGA_MAC_VER_27:
3020 case RTL_GIGA_MAC_VER_28: 3054 case RTL_GIGA_MAC_VER_28:
3055 case RTL_GIGA_MAC_VER_31:
3021 ops->down = r8168_pll_power_down; 3056 ops->down = r8168_pll_power_down;
3022 ops->up = r8168_pll_power_up; 3057 ops->up = r8168_pll_power_up;
3023 break; 3058 break;
@@ -3250,7 +3285,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3250 (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq); 3285 (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
3251 3286
3252 if ((tp->mac_version == RTL_GIGA_MAC_VER_27) || 3287 if ((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
3253 (tp->mac_version == RTL_GIGA_MAC_VER_28)) { 3288 (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
3289 (tp->mac_version == RTL_GIGA_MAC_VER_31)) {
3254 rtl8168_driver_start(tp); 3290 rtl8168_driver_start(tp);
3255 } 3291 }
3256 3292
@@ -3283,7 +3319,8 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
3283 struct rtl8169_private *tp = netdev_priv(dev); 3319 struct rtl8169_private *tp = netdev_priv(dev);
3284 3320
3285 if ((tp->mac_version == RTL_GIGA_MAC_VER_27) || 3321 if ((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
3286 (tp->mac_version == RTL_GIGA_MAC_VER_28)) { 3322 (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
3323 (tp->mac_version == RTL_GIGA_MAC_VER_31)) {
3287 rtl8168_driver_stop(tp); 3324 rtl8168_driver_stop(tp);
3288 } 3325 }
3289 3326
@@ -3383,7 +3420,8 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
3383 rtl8169_irq_mask_and_ack(ioaddr); 3420 rtl8169_irq_mask_and_ack(ioaddr);
3384 3421
3385 if (tp->mac_version == RTL_GIGA_MAC_VER_27 || 3422 if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
3386 tp->mac_version == RTL_GIGA_MAC_VER_28) { 3423 tp->mac_version == RTL_GIGA_MAC_VER_28 ||
3424 tp->mac_version == RTL_GIGA_MAC_VER_31) {
3387 while (RTL_R8(TxPoll) & NPQ) 3425 while (RTL_R8(TxPoll) & NPQ)
3388 udelay(20); 3426 udelay(20);
3389 3427
@@ -3780,6 +3818,17 @@ static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
3780 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK); 3818 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
3781} 3819}
3782 3820
3821static void rtl_hw_start_8168dp(void __iomem *ioaddr, struct pci_dev *pdev)
3822{
3823 rtl_csi_access_enable_1(ioaddr);
3824
3825 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
3826
3827 RTL_W8(MaxTxPacketSize, TxPacketMax);
3828
3829 rtl_disable_clock_request(pdev);
3830}
3831
3783static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev) 3832static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev)
3784{ 3833{
3785 static const struct ephy_info e_info_8168d_4[] = { 3834 static const struct ephy_info e_info_8168d_4[] = {
@@ -3843,55 +3892,59 @@ static void rtl_hw_start_8168(struct net_device *dev)
3843 switch (tp->mac_version) { 3892 switch (tp->mac_version) {
3844 case RTL_GIGA_MAC_VER_11: 3893 case RTL_GIGA_MAC_VER_11:
3845 rtl_hw_start_8168bb(ioaddr, pdev); 3894 rtl_hw_start_8168bb(ioaddr, pdev);
3846 break; 3895 break;
3847 3896
3848 case RTL_GIGA_MAC_VER_12: 3897 case RTL_GIGA_MAC_VER_12:
3849 case RTL_GIGA_MAC_VER_17: 3898 case RTL_GIGA_MAC_VER_17:
3850 rtl_hw_start_8168bef(ioaddr, pdev); 3899 rtl_hw_start_8168bef(ioaddr, pdev);
3851 break; 3900 break;
3852 3901
3853 case RTL_GIGA_MAC_VER_18: 3902 case RTL_GIGA_MAC_VER_18:
3854 rtl_hw_start_8168cp_1(ioaddr, pdev); 3903 rtl_hw_start_8168cp_1(ioaddr, pdev);
3855 break; 3904 break;
3856 3905
3857 case RTL_GIGA_MAC_VER_19: 3906 case RTL_GIGA_MAC_VER_19:
3858 rtl_hw_start_8168c_1(ioaddr, pdev); 3907 rtl_hw_start_8168c_1(ioaddr, pdev);
3859 break; 3908 break;
3860 3909
3861 case RTL_GIGA_MAC_VER_20: 3910 case RTL_GIGA_MAC_VER_20:
3862 rtl_hw_start_8168c_2(ioaddr, pdev); 3911 rtl_hw_start_8168c_2(ioaddr, pdev);
3863 break; 3912 break;
3864 3913
3865 case RTL_GIGA_MAC_VER_21: 3914 case RTL_GIGA_MAC_VER_21:
3866 rtl_hw_start_8168c_3(ioaddr, pdev); 3915 rtl_hw_start_8168c_3(ioaddr, pdev);
3867 break; 3916 break;
3868 3917
3869 case RTL_GIGA_MAC_VER_22: 3918 case RTL_GIGA_MAC_VER_22:
3870 rtl_hw_start_8168c_4(ioaddr, pdev); 3919 rtl_hw_start_8168c_4(ioaddr, pdev);
3871 break; 3920 break;
3872 3921
3873 case RTL_GIGA_MAC_VER_23: 3922 case RTL_GIGA_MAC_VER_23:
3874 rtl_hw_start_8168cp_2(ioaddr, pdev); 3923 rtl_hw_start_8168cp_2(ioaddr, pdev);
3875 break; 3924 break;
3876 3925
3877 case RTL_GIGA_MAC_VER_24: 3926 case RTL_GIGA_MAC_VER_24:
3878 rtl_hw_start_8168cp_3(ioaddr, pdev); 3927 rtl_hw_start_8168cp_3(ioaddr, pdev);
3879 break; 3928 break;
3880 3929
3881 case RTL_GIGA_MAC_VER_25: 3930 case RTL_GIGA_MAC_VER_25:
3882 case RTL_GIGA_MAC_VER_26: 3931 case RTL_GIGA_MAC_VER_26:
3883 case RTL_GIGA_MAC_VER_27: 3932 case RTL_GIGA_MAC_VER_27:
3884 rtl_hw_start_8168d(ioaddr, pdev); 3933 rtl_hw_start_8168d(ioaddr, pdev);
3885 break; 3934 break;
3886 3935
3887 case RTL_GIGA_MAC_VER_28: 3936 case RTL_GIGA_MAC_VER_28:
3888 rtl_hw_start_8168d_4(ioaddr, pdev); 3937 rtl_hw_start_8168d_4(ioaddr, pdev);
3889 break; 3938 break;
3939 case RTL_GIGA_MAC_VER_31:
3940 rtl_hw_start_8168dp(ioaddr, pdev);
3941 break;
3942
3890 3943
3891 default: 3944 default:
3892 printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n", 3945 printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
3893 dev->name, tp->mac_version); 3946 dev->name, tp->mac_version);
3894 break; 3947 break;
3895 } 3948 }
3896 3949
3897 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); 3950 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
@@ -4756,6 +4809,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
4756 case RTL_GIGA_MAC_VER_24: 4809 case RTL_GIGA_MAC_VER_24:
4757 case RTL_GIGA_MAC_VER_27: 4810 case RTL_GIGA_MAC_VER_27:
4758 case RTL_GIGA_MAC_VER_28: 4811 case RTL_GIGA_MAC_VER_28:
4812 case RTL_GIGA_MAC_VER_31:
4759 /* Experimental science. Pktgen proof. */ 4813 /* Experimental science. Pktgen proof. */
4760 case RTL_GIGA_MAC_VER_12: 4814 case RTL_GIGA_MAC_VER_12:
4761 case RTL_GIGA_MAC_VER_25: 4815 case RTL_GIGA_MAC_VER_25: