diff options
author | hayeswang <hayeswang@realtek.com> | 2011-03-20 21:50:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-31 00:39:18 -0400 |
commit | 4804b3b3aec163b59328140d6c858c3ed1c85992 (patch) | |
tree | ac930e62b60d49fedd46ed8a3c8ca4c748c80c26 /drivers/net/r8169.c | |
parent | 36a0e6c2d6f3eb59b7a5ddfda63d252a42dba189 (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.c | 98 |
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) | |||
651 | static void rtl8168_driver_start(struct rtl8169_private *tp) | 653 | static 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) | |||
664 | static void rtl8168_driver_stop(struct rtl8169_private *tp) | 672 | static 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 | ||
691 | static 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 | ||
678 | static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value) | 706 | static 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 | ||
3821 | static 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 | |||
3783 | static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev) | 3832 | static 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: |