r8169: additional 8101 and 8102 support
Signed-off-by: Ivan Vecera <ivecera@redhat.com> Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
This commit is contained in:
parent
dacf815434
commit
2857ffb7b8
|
@ -96,6 +96,10 @@ enum mac_version {
|
||||||
RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
|
RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
|
||||||
RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
|
RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
|
||||||
RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
|
RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
|
||||||
|
RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
|
||||||
|
RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
|
||||||
|
RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
|
||||||
|
RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
|
||||||
RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
|
RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
|
||||||
RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
|
RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
|
||||||
RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
|
RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
|
||||||
|
@ -122,6 +126,10 @@ static const struct {
|
||||||
_R("RTL8169sb/8110sb", RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
|
_R("RTL8169sb/8110sb", RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
|
||||||
_R("RTL8169sc/8110sc", RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
|
_R("RTL8169sc/8110sc", RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
|
||||||
_R("RTL8169sc/8110sc", RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
|
_R("RTL8169sc/8110sc", RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
|
||||||
|
_R("RTL8102e", RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
|
||||||
|
_R("RTL8102e", RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
|
||||||
|
_R("RTL8102e", RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
|
||||||
|
_R("RTL8101e", RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
|
||||||
_R("RTL8168b/8111b", RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
|
_R("RTL8168b/8111b", RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
|
||||||
_R("RTL8168b/8111b", RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
|
_R("RTL8168b/8111b", RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
|
||||||
_R("RTL8101e", RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
|
_R("RTL8101e", RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
|
||||||
|
@ -837,8 +845,12 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The 8100e/8101e do Fast Ethernet only. */
|
/* The 8100e/8101e/8102e do Fast Ethernet only. */
|
||||||
if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
|
if ((tp->mac_version == RTL_GIGA_MAC_VER_07) ||
|
||||||
|
(tp->mac_version == RTL_GIGA_MAC_VER_08) ||
|
||||||
|
(tp->mac_version == RTL_GIGA_MAC_VER_09) ||
|
||||||
|
(tp->mac_version == RTL_GIGA_MAC_VER_10) ||
|
||||||
|
(tp->mac_version == RTL_GIGA_MAC_VER_13) ||
|
||||||
(tp->mac_version == RTL_GIGA_MAC_VER_14) ||
|
(tp->mac_version == RTL_GIGA_MAC_VER_14) ||
|
||||||
(tp->mac_version == RTL_GIGA_MAC_VER_15) ||
|
(tp->mac_version == RTL_GIGA_MAC_VER_15) ||
|
||||||
(tp->mac_version == RTL_GIGA_MAC_VER_16)) {
|
(tp->mac_version == RTL_GIGA_MAC_VER_16)) {
|
||||||
|
@ -1212,8 +1224,17 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
|
||||||
{ 0x7c800000, 0x30000000, RTL_GIGA_MAC_VER_11 },
|
{ 0x7c800000, 0x30000000, RTL_GIGA_MAC_VER_11 },
|
||||||
|
|
||||||
/* 8101 family. */
|
/* 8101 family. */
|
||||||
|
{ 0x7cf00000, 0x34a00000, RTL_GIGA_MAC_VER_09 },
|
||||||
|
{ 0x7cf00000, 0x24a00000, RTL_GIGA_MAC_VER_09 },
|
||||||
|
{ 0x7cf00000, 0x34900000, RTL_GIGA_MAC_VER_08 },
|
||||||
|
{ 0x7cf00000, 0x24900000, RTL_GIGA_MAC_VER_08 },
|
||||||
|
{ 0x7cf00000, 0x34800000, RTL_GIGA_MAC_VER_07 },
|
||||||
|
{ 0x7cf00000, 0x24800000, RTL_GIGA_MAC_VER_07 },
|
||||||
{ 0x7cf00000, 0x34000000, RTL_GIGA_MAC_VER_13 },
|
{ 0x7cf00000, 0x34000000, RTL_GIGA_MAC_VER_13 },
|
||||||
|
{ 0x7cf00000, 0x34300000, RTL_GIGA_MAC_VER_10 },
|
||||||
{ 0x7cf00000, 0x34200000, RTL_GIGA_MAC_VER_16 },
|
{ 0x7cf00000, 0x34200000, RTL_GIGA_MAC_VER_16 },
|
||||||
|
{ 0x7c800000, 0x34800000, RTL_GIGA_MAC_VER_09 },
|
||||||
|
{ 0x7c800000, 0x24800000, RTL_GIGA_MAC_VER_09 },
|
||||||
{ 0x7c800000, 0x34000000, RTL_GIGA_MAC_VER_16 },
|
{ 0x7c800000, 0x34000000, RTL_GIGA_MAC_VER_16 },
|
||||||
/* FIXME: where did these entries come from ? -- FR */
|
/* FIXME: where did these entries come from ? -- FR */
|
||||||
{ 0xfc800000, 0x38800000, RTL_GIGA_MAC_VER_15 },
|
{ 0xfc800000, 0x38800000, RTL_GIGA_MAC_VER_15 },
|
||||||
|
@ -1375,6 +1396,22 @@ static void rtl8168cx_hw_phy_config(void __iomem *ioaddr)
|
||||||
rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
|
||||||
|
{
|
||||||
|
struct phy_reg phy_reg_init[] = {
|
||||||
|
{ 0x1f, 0x0003 },
|
||||||
|
{ 0x08, 0x441d },
|
||||||
|
{ 0x01, 0x9100 },
|
||||||
|
{ 0x1f, 0x0000 }
|
||||||
|
};
|
||||||
|
|
||||||
|
mdio_write(ioaddr, 0x1f, 0x0000);
|
||||||
|
mdio_patch(ioaddr, 0x11, 1 << 12);
|
||||||
|
mdio_patch(ioaddr, 0x19, 1 << 13);
|
||||||
|
|
||||||
|
rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
||||||
|
}
|
||||||
|
|
||||||
static void rtl_hw_phy_config(struct net_device *dev)
|
static void rtl_hw_phy_config(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct rtl8169_private *tp = netdev_priv(dev);
|
struct rtl8169_private *tp = netdev_priv(dev);
|
||||||
|
@ -1392,6 +1429,11 @@ static void rtl_hw_phy_config(struct net_device *dev)
|
||||||
case RTL_GIGA_MAC_VER_04:
|
case RTL_GIGA_MAC_VER_04:
|
||||||
rtl8169sb_hw_phy_config(ioaddr);
|
rtl8169sb_hw_phy_config(ioaddr);
|
||||||
break;
|
break;
|
||||||
|
case RTL_GIGA_MAC_VER_07:
|
||||||
|
case RTL_GIGA_MAC_VER_08:
|
||||||
|
case RTL_GIGA_MAC_VER_09:
|
||||||
|
rtl8102e_hw_phy_config(ioaddr);
|
||||||
|
break;
|
||||||
case RTL_GIGA_MAC_VER_18:
|
case RTL_GIGA_MAC_VER_18:
|
||||||
rtl8168cp_hw_phy_config(ioaddr);
|
rtl8168cp_hw_phy_config(ioaddr);
|
||||||
break;
|
break;
|
||||||
|
@ -2255,6 +2297,70 @@ static void rtl_hw_start_8168(struct net_device *dev)
|
||||||
RTL_W16(IntrMask, tp->intr_event);
|
RTL_W16(IntrMask, tp->intr_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define R810X_CPCMD_QUIRK_MASK (\
|
||||||
|
EnableBist | \
|
||||||
|
Mac_dbgo_oe | \
|
||||||
|
Force_half_dup | \
|
||||||
|
Force_half_dup | \
|
||||||
|
Force_txflow_en | \
|
||||||
|
Cxpl_dbg_sel | \
|
||||||
|
ASF | \
|
||||||
|
PktCntrDisable | \
|
||||||
|
PCIDAC | \
|
||||||
|
PCIMulRW)
|
||||||
|
|
||||||
|
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
static struct ephy_info e_info_8102e_1[] = {
|
||||||
|
{ 0x01, 0, 0x6e65 },
|
||||||
|
{ 0x02, 0, 0x091f },
|
||||||
|
{ 0x03, 0, 0xc2f9 },
|
||||||
|
{ 0x06, 0, 0xafb5 },
|
||||||
|
{ 0x07, 0, 0x0e00 },
|
||||||
|
{ 0x19, 0, 0xec80 },
|
||||||
|
{ 0x01, 0, 0x2e65 },
|
||||||
|
{ 0x01, 0, 0x6e65 }
|
||||||
|
};
|
||||||
|
u8 cfg1;
|
||||||
|
|
||||||
|
rtl_csi_access_enable(ioaddr);
|
||||||
|
|
||||||
|
RTL_W8(DBG_REG, FIX_NAK_1);
|
||||||
|
|
||||||
|
rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
|
||||||
|
|
||||||
|
RTL_W8(Config1,
|
||||||
|
LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
|
||||||
|
RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
|
||||||
|
|
||||||
|
cfg1 = RTL_R8(Config1);
|
||||||
|
if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
|
||||||
|
RTL_W8(Config1, cfg1 & ~LEDS0);
|
||||||
|
|
||||||
|
RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
|
||||||
|
|
||||||
|
rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
rtl_csi_access_enable(ioaddr);
|
||||||
|
|
||||||
|
rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
|
||||||
|
|
||||||
|
RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
|
||||||
|
RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
|
||||||
|
|
||||||
|
RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
rtl_hw_start_8102e_2(ioaddr, pdev);
|
||||||
|
|
||||||
|
rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
|
||||||
|
}
|
||||||
|
|
||||||
static void rtl_hw_start_8101(struct net_device *dev)
|
static void rtl_hw_start_8101(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct rtl8169_private *tp = netdev_priv(dev);
|
struct rtl8169_private *tp = netdev_priv(dev);
|
||||||
|
@ -2271,6 +2377,20 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (tp->mac_version) {
|
||||||
|
case RTL_GIGA_MAC_VER_07:
|
||||||
|
rtl_hw_start_8102e_1(ioaddr, pdev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RTL_GIGA_MAC_VER_08:
|
||||||
|
rtl_hw_start_8102e_3(ioaddr, pdev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RTL_GIGA_MAC_VER_09:
|
||||||
|
rtl_hw_start_8102e_2(ioaddr, pdev);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||||
|
|
||||||
RTL_W8(EarlyTxThres, EarlyTxThld);
|
RTL_W8(EarlyTxThres, EarlyTxThld);
|
||||||
|
|
Loading…
Reference in New Issue