Commit 4a9e25d8 authored by David S. Miller's avatar David S. Miller
parents 4940fc88 5d320a20
...@@ -98,40 +98,40 @@ static const int multicast_filter_limit = 32; ...@@ -98,40 +98,40 @@ static const int multicast_filter_limit = 32;
#define RTL_R32(reg) readl (ioaddr + (reg)) #define RTL_R32(reg) readl (ioaddr + (reg))
enum mac_version { enum mac_version {
RTL_GIGA_MAC_NONE = 0x00, RTL_GIGA_MAC_VER_01 = 0,
RTL_GIGA_MAC_VER_01 = 0x01, // 8169 RTL_GIGA_MAC_VER_02,
RTL_GIGA_MAC_VER_02 = 0x02, // 8169S RTL_GIGA_MAC_VER_03,
RTL_GIGA_MAC_VER_03 = 0x03, // 8110S RTL_GIGA_MAC_VER_04,
RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB RTL_GIGA_MAC_VER_05,
RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd RTL_GIGA_MAC_VER_06,
RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe RTL_GIGA_MAC_VER_07,
RTL_GIGA_MAC_VER_07 = 0x07, // 8102e RTL_GIGA_MAC_VER_08,
RTL_GIGA_MAC_VER_08 = 0x08, // 8102e RTL_GIGA_MAC_VER_09,
RTL_GIGA_MAC_VER_09 = 0x09, // 8102e RTL_GIGA_MAC_VER_10,
RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e RTL_GIGA_MAC_VER_11,
RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb RTL_GIGA_MAC_VER_12,
RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be RTL_GIGA_MAC_VER_13,
RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb RTL_GIGA_MAC_VER_14,
RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ? RTL_GIGA_MAC_VER_15,
RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ? RTL_GIGA_MAC_VER_16,
RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec RTL_GIGA_MAC_VER_17,
RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf RTL_GIGA_MAC_VER_18,
RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP RTL_GIGA_MAC_VER_19,
RTL_GIGA_MAC_VER_19 = 0x13, // 8168C RTL_GIGA_MAC_VER_20,
RTL_GIGA_MAC_VER_20 = 0x14, // 8168C RTL_GIGA_MAC_VER_21,
RTL_GIGA_MAC_VER_21 = 0x15, // 8168C RTL_GIGA_MAC_VER_22,
RTL_GIGA_MAC_VER_22 = 0x16, // 8168C RTL_GIGA_MAC_VER_23,
RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP RTL_GIGA_MAC_VER_24,
RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP RTL_GIGA_MAC_VER_25,
RTL_GIGA_MAC_VER_25 = 0x19, // 8168D RTL_GIGA_MAC_VER_26,
RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D RTL_GIGA_MAC_VER_27,
RTL_GIGA_MAC_VER_27 = 0x1b, // 8168DP RTL_GIGA_MAC_VER_28,
RTL_GIGA_MAC_VER_28 = 0x1c, // 8168DP RTL_GIGA_MAC_VER_29,
RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E RTL_GIGA_MAC_VER_30,
RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E RTL_GIGA_MAC_VER_31,
RTL_GIGA_MAC_VER_31 = 0x1f, // 8168DP RTL_GIGA_MAC_VER_32,
RTL_GIGA_MAC_VER_32 = 0x20, // 8168E RTL_GIGA_MAC_VER_33,
RTL_GIGA_MAC_VER_33 = 0x21, // 8168E RTL_GIGA_MAC_NONE = 0xff,
}; };
enum rtl_tx_desc_version { enum rtl_tx_desc_version {
...@@ -139,61 +139,84 @@ enum rtl_tx_desc_version { ...@@ -139,61 +139,84 @@ enum rtl_tx_desc_version {
RTL_TD_1 = 1, RTL_TD_1 = 1,
}; };
#define _R(NAME,MAC,TD) \ #define _R(NAME,TD,FW) \
{ .name = NAME, .mac_version = MAC, .txd_version = TD } { .name = NAME, .txd_version = TD, .fw_name = FW }
static const struct { static const struct {
const char *name; const char *name;
u8 mac_version;
enum rtl_tx_desc_version txd_version; enum rtl_tx_desc_version txd_version;
} rtl_chip_info[] = {
_R("RTL8169", RTL_GIGA_MAC_VER_01, RTL_TD_0), // 8169
_R("RTL8169s", RTL_GIGA_MAC_VER_02, RTL_TD_0), // 8169S
_R("RTL8110s", RTL_GIGA_MAC_VER_03, RTL_TD_0), // 8110S
_R("RTL8169sb/8110sb", RTL_GIGA_MAC_VER_04, RTL_TD_0), // 8169SB
_R("RTL8169sc/8110sc", RTL_GIGA_MAC_VER_05, RTL_TD_0), // 8110SCd
_R("RTL8169sc/8110sc", RTL_GIGA_MAC_VER_06, RTL_TD_0), // 8110SCe
_R("RTL8102e", RTL_GIGA_MAC_VER_07, RTL_TD_1), // PCI-E
_R("RTL8102e", RTL_GIGA_MAC_VER_08, RTL_TD_1), // PCI-E
_R("RTL8102e", RTL_GIGA_MAC_VER_09, RTL_TD_1), // PCI-E
_R("RTL8101e", RTL_GIGA_MAC_VER_10, RTL_TD_0), // PCI-E
_R("RTL8168b/8111b", RTL_GIGA_MAC_VER_11, RTL_TD_0), // PCI-E
_R("RTL8168b/8111b", RTL_GIGA_MAC_VER_12, RTL_TD_0), // PCI-E
_R("RTL8101e", RTL_GIGA_MAC_VER_13, RTL_TD_0), // PCI-E 8139
_R("RTL8100e", RTL_GIGA_MAC_VER_14, RTL_TD_0), // PCI-E 8139
_R("RTL8100e", RTL_GIGA_MAC_VER_15, RTL_TD_0), // PCI-E 8139
_R("RTL8168b/8111b", RTL_GIGA_MAC_VER_17, RTL_TD_0), // PCI-E
_R("RTL8101e", RTL_GIGA_MAC_VER_16, RTL_TD_0), // PCI-E
_R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_18, RTL_TD_1), // PCI-E
_R("RTL8168c/8111c", RTL_GIGA_MAC_VER_19, RTL_TD_1), // PCI-E
_R("RTL8168c/8111c", RTL_GIGA_MAC_VER_20, RTL_TD_1), // PCI-E
_R("RTL8168c/8111c", RTL_GIGA_MAC_VER_21, RTL_TD_1), // PCI-E
_R("RTL8168c/8111c", RTL_GIGA_MAC_VER_22, RTL_TD_1), // PCI-E
_R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_23, RTL_TD_1), // PCI-E
_R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_24, RTL_TD_1), // PCI-E
_R("RTL8168d/8111d", RTL_GIGA_MAC_VER_25, RTL_TD_1), // PCI-E
_R("RTL8168d/8111d", RTL_GIGA_MAC_VER_26, RTL_TD_1), // PCI-E
_R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_27, RTL_TD_1), // PCI-E
_R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_28, RTL_TD_1), // PCI-E
_R("RTL8105e", RTL_GIGA_MAC_VER_29, RTL_TD_1), // PCI-E
_R("RTL8105e", RTL_GIGA_MAC_VER_30, RTL_TD_1), // PCI-E
_R("RTL8168dp/8111dp", RTL_GIGA_MAC_VER_31, RTL_TD_1), // PCI-E
_R("RTL8168e/8111e", RTL_GIGA_MAC_VER_32, RTL_TD_1), // PCI-E
_R("RTL8168e/8111e", RTL_GIGA_MAC_VER_33, RTL_TD_1) // PCI-E
};
#undef _R
static const struct rtl_firmware_info {
int mac_version;
const char *fw_name; const char *fw_name;
} rtl_firmware_infos[] = { } rtl_chip_infos[] = {
{ .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 }, /* PCI devices. */
{ .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 }, [RTL_GIGA_MAC_VER_01] =
{ .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 }, _R("RTL8169", RTL_TD_0, NULL),
{ .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 }, [RTL_GIGA_MAC_VER_02] =
{ .mac_version = RTL_GIGA_MAC_VER_32, .fw_name = FIRMWARE_8168E_1 }, _R("RTL8169s", RTL_TD_0, NULL),
{ .mac_version = RTL_GIGA_MAC_VER_33, .fw_name = FIRMWARE_8168E_2 } [RTL_GIGA_MAC_VER_03] =
_R("RTL8110s", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_04] =
_R("RTL8169sb/8110sb", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_05] =
_R("RTL8169sc/8110sc", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_06] =
_R("RTL8169sc/8110sc", RTL_TD_0, NULL),
/* PCI-E devices. */
[RTL_GIGA_MAC_VER_07] =
_R("RTL8102e", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_08] =
_R("RTL8102e", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_09] =
_R("RTL8102e", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_10] =
_R("RTL8101e", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_11] =
_R("RTL8168b/8111b", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_12] =
_R("RTL8168b/8111b", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_13] =
_R("RTL8101e", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_14] =
_R("RTL8100e", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_15] =
_R("RTL8100e", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_16] =
_R("RTL8101e", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_17] =
_R("RTL8168b/8111b", RTL_TD_0, NULL),
[RTL_GIGA_MAC_VER_18] =
_R("RTL8168cp/8111cp", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_19] =
_R("RTL8168c/8111c", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_20] =
_R("RTL8168c/8111c", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_21] =
_R("RTL8168c/8111c", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_22] =
_R("RTL8168c/8111c", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_23] =
_R("RTL8168cp/8111cp", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_24] =
_R("RTL8168cp/8111cp", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_25] =
_R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_1),
[RTL_GIGA_MAC_VER_26] =
_R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_2),
[RTL_GIGA_MAC_VER_27] =
_R("RTL8168dp/8111dp", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_28] =
_R("RTL8168dp/8111dp", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_29] =
_R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1),
[RTL_GIGA_MAC_VER_30] =
_R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1),
[RTL_GIGA_MAC_VER_31] =
_R("RTL8168dp/8111dp", RTL_TD_1, NULL),
[RTL_GIGA_MAC_VER_32] =
_R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_1),
[RTL_GIGA_MAC_VER_33] =
_R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_2)
}; };
#undef _R
enum cfg_version { enum cfg_version {
RTL_CFG_0 = 0x00, RTL_CFG_0 = 0x00,
...@@ -345,7 +368,7 @@ enum rtl8168_registers { ...@@ -345,7 +368,7 @@ enum rtl8168_registers {
#define OCPAR_GPHY_READ_CMD 0x0000f060 #define OCPAR_GPHY_READ_CMD 0x0000f060
RDSAR1 = 0xd0, /* 8168c only. Undocumented on 8168dp */ RDSAR1 = 0xd0, /* 8168c only. Undocumented on 8168dp */
MISC = 0xf0, /* 8168e only. */ MISC = 0xf0, /* 8168e only. */
txpla_rst = (1 << 29) #define TXPLA_RST (1 << 29)
}; };
enum rtl_register_content { enum rtl_register_content {
...@@ -423,7 +446,7 @@ enum rtl_register_content { ...@@ -423,7 +446,7 @@ enum rtl_register_content {
BWF = (1 << 6), /* Accept Broadcast wakeup frame */ BWF = (1 << 6), /* Accept Broadcast wakeup frame */
MWF = (1 << 5), /* Accept Multicast wakeup frame */ MWF = (1 << 5), /* Accept Multicast wakeup frame */
UWF = (1 << 4), /* Accept Unicast wakeup frame */ UWF = (1 << 4), /* Accept Unicast wakeup frame */
spi_en = (1 << 3), Spi_en = (1 << 3),
LanWake = (1 << 1), /* LanWake enable/disable */ LanWake = (1 << 1), /* LanWake enable/disable */
PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */ PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */
...@@ -594,10 +617,10 @@ struct rtl8169_counters { ...@@ -594,10 +617,10 @@ struct rtl8169_counters {
struct rtl8169_private { struct rtl8169_private {
void __iomem *mmio_addr; /* memory map physical address */ void __iomem *mmio_addr; /* memory map physical address */
struct pci_dev *pci_dev; /* Index of PCI device */ struct pci_dev *pci_dev;
struct net_device *dev; struct net_device *dev;
struct napi_struct napi; struct napi_struct napi;
spinlock_t lock; /* spin lock flag */ spinlock_t lock;
u32 msg_enable; u32 msg_enable;
u16 txd_version; u16 txd_version;
u16 mac_version; u16 mac_version;
...@@ -616,7 +639,6 @@ struct rtl8169_private { ...@@ -616,7 +639,6 @@ struct rtl8169_private {
u16 intr_event; u16 intr_event;
u16 napi_event; u16 napi_event;
u16 intr_mask; u16 intr_mask;
int phy_1000_ctrl_reg;
struct mdio_ops { struct mdio_ops {
void (*write)(void __iomem *, int, int); void (*write)(void __iomem *, int, int);
...@@ -730,17 +752,19 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd) ...@@ -730,17 +752,19 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
#define OOB_CMD_DRIVER_START 0x05 #define OOB_CMD_DRIVER_START 0x05
#define OOB_CMD_DRIVER_STOP 0x06 #define OOB_CMD_DRIVER_STOP 0x06
static u16 rtl8168_get_ocp_reg(struct rtl8169_private *tp)
{
return (tp->mac_version == RTL_GIGA_MAC_VER_31) ? 0xb8 : 0x10;
}
static void rtl8168_driver_start(struct rtl8169_private *tp) static void rtl8168_driver_start(struct rtl8169_private *tp)
{ {
u16 reg;
int i; int i;
u32 reg;
rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START); rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START);
if (tp->mac_version == RTL_GIGA_MAC_VER_31) reg = rtl8168_get_ocp_reg(tp);
reg = 0xb8;
else
reg = 0x10;
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
msleep(10); msleep(10);
...@@ -751,15 +775,12 @@ static void rtl8168_driver_start(struct rtl8169_private *tp) ...@@ -751,15 +775,12 @@ static void rtl8168_driver_start(struct rtl8169_private *tp)
static void rtl8168_driver_stop(struct rtl8169_private *tp) static void rtl8168_driver_stop(struct rtl8169_private *tp)
{ {
u16 reg;
int i; int i;
u32 reg;
rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP); rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP);
if (tp->mac_version == RTL_GIGA_MAC_VER_31) reg = rtl8168_get_ocp_reg(tp);
reg = 0xb8;
else
reg = 0x10;
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
msleep(10); msleep(10);
...@@ -770,17 +791,9 @@ static void rtl8168_driver_stop(struct rtl8169_private *tp) ...@@ -770,17 +791,9 @@ static void rtl8168_driver_stop(struct rtl8169_private *tp)
static int r8168dp_check_dash(struct rtl8169_private *tp) static int r8168dp_check_dash(struct rtl8169_private *tp)
{ {
u32 reg; u16 reg = rtl8168_get_ocp_reg(tp);
if (tp->mac_version == RTL_GIGA_MAC_VER_31)
reg = 0xb8;
else
reg = 0x10;
if (ocp_read(tp, 0xF, reg) & 0x00008000) return (ocp_read(tp, 0x0f, reg) & 0x00008000) ? 1 : 0;
return 1;
else
return 0;
} }
static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value) static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
...@@ -1081,8 +1094,7 @@ static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp) ...@@ -1081,8 +1094,7 @@ static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp)
static void __rtl8169_check_link_status(struct net_device *dev, static void __rtl8169_check_link_status(struct net_device *dev,
struct rtl8169_private *tp, struct rtl8169_private *tp,
void __iomem *ioaddr, void __iomem *ioaddr, bool pm)
bool pm)
{ {
unsigned long flags; unsigned long flags;
...@@ -1199,6 +1211,11 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) ...@@ -1199,6 +1211,11 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
return 0; return 0;
} }
static const char *rtl_lookup_firmware_name(struct rtl8169_private *tp)
{
return rtl_chip_infos[tp->mac_version].fw_name;
}
static void rtl8169_get_drvinfo(struct net_device *dev, static void rtl8169_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *info) struct ethtool_drvinfo *info)
{ {
...@@ -1207,6 +1224,8 @@ static void rtl8169_get_drvinfo(struct net_device *dev, ...@@ -1207,6 +1224,8 @@ static void rtl8169_get_drvinfo(struct net_device *dev,
strcpy(info->driver, MODULENAME); strcpy(info->driver, MODULENAME);
strcpy(info->version, RTL8169_VERSION); strcpy(info->version, RTL8169_VERSION);
strcpy(info->bus_info, pci_name(tp->pci_dev)); strcpy(info->bus_info, pci_name(tp->pci_dev));
strncpy(info->fw_version, IS_ERR_OR_NULL(tp->fw) ? "N/A" :
rtl_lookup_firmware_name(tp), sizeof(info->fw_version) - 1);
} }
static int rtl8169_get_regs_len(struct net_device *dev) static int rtl8169_get_regs_len(struct net_device *dev)
...@@ -1268,16 +1287,7 @@ static int rtl8169_set_speed_xmii(struct net_device *dev, ...@@ -1268,16 +1287,7 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
/* The 8100e/8101e/8102e do Fast Ethernet only. */ /* The 8100e/8101e/8102e do Fast Ethernet only. */
if ((tp->mac_version != RTL_GIGA_MAC_VER_07) && if (tp->mii.supports_gmii) {
(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_15) &&
(tp->mac_version != RTL_GIGA_MAC_VER_16) &&
(tp->mac_version != RTL_GIGA_MAC_VER_29) &&
(tp->mac_version != RTL_GIGA_MAC_VER_30)) {
if (adv & ADVERTISED_1000baseT_Half) if (adv & ADVERTISED_1000baseT_Half)
giga_ctrl |= ADVERTISE_1000HALF; giga_ctrl |= ADVERTISE_1000HALF;
if (adv & ADVERTISED_1000baseT_Full) if (adv & ADVERTISED_1000baseT_Full)
...@@ -1307,12 +1317,10 @@ static int rtl8169_set_speed_xmii(struct net_device *dev, ...@@ -1307,12 +1317,10 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
bmcr |= BMCR_FULLDPLX; bmcr |= BMCR_FULLDPLX;
} }
tp->phy_1000_ctrl_reg = giga_ctrl;
rtl_writephy(tp, MII_BMCR, bmcr); rtl_writephy(tp, MII_BMCR, bmcr);
if ((tp->mac_version == RTL_GIGA_MAC_VER_02) || if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
(tp->mac_version == RTL_GIGA_MAC_VER_03)) { tp->mac_version == RTL_GIGA_MAC_VER_03) {
if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) { if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
rtl_writephy(tp, 0x17, 0x2138); rtl_writephy(tp, 0x17, 0x2138);
rtl_writephy(tp, 0x0e, 0x0260); rtl_writephy(tp, 0x0e, 0x0260);
...@@ -1334,10 +1342,14 @@ static int rtl8169_set_speed(struct net_device *dev, ...@@ -1334,10 +1342,14 @@ static int rtl8169_set_speed(struct net_device *dev,
int ret; int ret;
ret = tp->set_speed(dev, autoneg, speed, duplex, advertising); ret = tp->set_speed(dev, autoneg, speed, duplex, advertising);
if (ret < 0)
goto out;
if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL)) if (netif_running(dev) && (autoneg == AUTONEG_ENABLE) &&
(advertising & ADVERTISED_1000baseT_Full)) {
mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT); mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
}
out:
return ret; return ret;
} }
...@@ -1347,9 +1359,10 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -1347,9 +1359,10 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
unsigned long flags; unsigned long flags;
int ret; int ret;
del_timer_sync(&tp->timer);
spin_lock_irqsave(&tp->lock, flags); spin_lock_irqsave(&tp->lock, flags);
ret = rtl8169_set_speed(dev, ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd),
cmd->autoneg, ethtool_cmd_speed(cmd),
cmd->duplex, cmd->advertising); cmd->duplex, cmd->advertising);
spin_unlock_irqrestore(&tp->lock, flags); spin_unlock_irqrestore(&tp->lock, flags);
...@@ -1507,11 +1520,11 @@ static void rtl8169_update_counters(struct net_device *dev) ...@@ -1507,11 +1520,11 @@ static void rtl8169_update_counters(struct net_device *dev)
{ {
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
struct device *d = &tp->pci_dev->dev;
struct rtl8169_counters *counters; struct rtl8169_counters *counters;
dma_addr_t paddr; dma_addr_t paddr;
u32 cmd; u32 cmd;
int wait = 1000; int wait = 1000;
struct device *d = &tp->pci_dev->dev;
/* /*
* Some chips are unable to dump tally counters when the receiver * Some chips are unable to dump tally counters when the receiver
...@@ -1531,7 +1544,6 @@ static void rtl8169_update_counters(struct net_device *dev) ...@@ -1531,7 +1544,6 @@ static void rtl8169_update_counters(struct net_device *dev)
while (wait--) { while (wait--) {
if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) { if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
/* copy updated counters */
memcpy(&tp->counters, counters, sizeof(*counters)); memcpy(&tp->counters, counters, sizeof(*counters));
break; break;
} }
...@@ -1594,8 +1606,9 @@ static const struct ethtool_ops rtl8169_ethtool_ops = { ...@@ -1594,8 +1606,9 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
}; };
static void rtl8169_get_mac_version(struct rtl8169_private *tp, static void rtl8169_get_mac_version(struct rtl8169_private *tp,
void __iomem *ioaddr) struct net_device *dev, u8 default_version)
{ {
void __iomem *ioaddr = tp->mmio_addr;
/* /*
* The driver currently handles the 8168Bf and the 8168Be identically * The driver currently handles the 8168Bf and the 8168Be identically
* but they can be identified more specifically through the test below * but they can be identified more specifically through the test below
...@@ -1682,6 +1695,12 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp, ...@@ -1682,6 +1695,12 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
while ((reg & p->mask) != p->val) while ((reg & p->mask) != p->val)
p++; p++;
tp->mac_version = p->mac_version; tp->mac_version = p->mac_version;
if (tp->mac_version == RTL_GIGA_MAC_NONE) {
netif_notice(tp, probe, dev,
"unknown MAC, using family default\n");
tp->mac_version = default_version;
}
} }
static void rtl8169_print_mac_version(struct rtl8169_private *tp) static void rtl8169_print_mac_version(struct rtl8169_private *tp)
...@@ -1823,10 +1842,7 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw) ...@@ -1823,10 +1842,7 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
index++; index++;
break; break;
case PHY_READCOUNT_EQ_SKIP: case PHY_READCOUNT_EQ_SKIP:
if (count == data) index += (count == data) ? 2 : 1;
index += 2;
else
index += 1;
break; break;
case PHY_COMP_EQ_SKIPN: case PHY_COMP_EQ_SKIPN:
if (predata == data) if (predata == data)
...@@ -2237,7 +2253,7 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp) ...@@ -2237,7 +2253,7 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
/* /*
* Tx Error Issue * Tx Error Issue
* enhance line driver power * Enhance line driver power
*/ */
{ 0x1f, 0x0002 }, { 0x1f, 0x0002 },
{ 0x06, 0x5561 }, { 0x06, 0x5561 },
...@@ -2349,7 +2365,7 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp) ...@@ -2349,7 +2365,7 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
/* /*
* Tx Error Issue * Tx Error Issue
* enhance line driver power * Enhance line driver power
*/ */
{ 0x1f, 0x0002 }, { 0x1f, 0x0002 },
{ 0x06, 0x5561 }, { 0x06, 0x5561 },
...@@ -2548,7 +2564,7 @@ static void rtl8168e_hw_phy_config(struct rtl8169_private *tp) ...@@ -2548,7 +2564,7 @@ static void rtl8168e_hw_phy_config(struct rtl8169_private *tp)
/* For impedance matching */ /* For impedance matching */
rtl_writephy(tp, 0x1f, 0x0002); rtl_writephy(tp, 0x1f, 0x0002);
rtl_w1w0_phy(tp, 0x08, 0x8000, 0x7f00); rtl_w1w0_phy(tp, 0x08, 0x8000, 0x7f00);
rtl_writephy(tp, 0x1F, 0x0000); rtl_writephy(tp, 0x1f, 0x0000);
/* PHY auto speed down */ /* PHY auto speed down */
rtl_writephy(tp, 0x1f, 0x0007); rtl_writephy(tp, 0x1f, 0x0007);
...@@ -2692,6 +2708,9 @@ static void rtl_hw_phy_config(struct net_device *dev) ...@@ -2692,6 +2708,9 @@ static void rtl_hw_phy_config(struct net_device *dev)
case RTL_GIGA_MAC_VER_30: case RTL_GIGA_MAC_VER_30:
rtl8105e_hw_phy_config(tp); rtl8105e_hw_phy_config(tp);
break; break;
case RTL_GIGA_MAC_VER_31:
/* None. */
break;
case RTL_GIGA_MAC_VER_32: case RTL_GIGA_MAC_VER_32:
case RTL_GIGA_MAC_VER_33: case RTL_GIGA_MAC_VER_33:
rtl8168e_hw_phy_config(tp); rtl8168e_hw_phy_config(tp);
...@@ -2712,9 +2731,6 @@ static void rtl8169_phy_timer(unsigned long __opaque) ...@@ -2712,9 +2731,6 @@ static void rtl8169_phy_timer(unsigned long __opaque)
assert(tp->mac_version > RTL_GIGA_MAC_VER_01); assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
return;
spin_lock_irq(&tp->lock); spin_lock_irq(&tp->lock);
if (tp->phy_reset_pending(tp)) { if (tp->phy_reset_pending(tp)) {
...@@ -2739,28 +2755,6 @@ static void rtl8169_phy_timer(unsigned long __opaque) ...@@ -2739,28 +2755,6 @@ static void rtl8169_phy_timer(unsigned long __opaque)
spin_unlock_irq(&tp->lock); spin_unlock_irq(&tp->lock);
} }
static inline void rtl8169_delete_timer(struct net_device *dev)
{
struct rtl8169_private *tp = netdev_priv(dev);
struct timer_list *timer = &tp->timer;
if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
return;
del_timer_sync(timer);
}
static inline void rtl8169_request_timer(struct net_device *dev)
{
struct rtl8169_private *tp = netdev_priv(dev);
struct timer_list *timer = &tp->timer;
if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
return;
mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
}
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
/* /*
* Polling 'interrupt' - used by things like netconsole to send skbs * Polling 'interrupt' - used by things like netconsole to send skbs
...@@ -2885,7 +2879,8 @@ static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -2885,7 +2879,8 @@ static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV; return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
} }
static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd) static int rtl_xmii_ioctl(struct rtl8169_private *tp,
struct mii_ioctl_data *data, int cmd)
{ {
switch (cmd) { switch (cmd) {
case SIOCGMIIPHY: case SIOCGMIIPHY:
...@@ -3107,15 +3102,15 @@ static void r8168_pll_power_down(struct rtl8169_private *tp) ...@@ -3107,15 +3102,15 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
{ {
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
if (((tp->mac_version == RTL_GIGA_MAC_VER_27) || if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
(tp->mac_version == RTL_GIGA_MAC_VER_28) || tp->mac_version == RTL_GIGA_MAC_VER_28 ||
(tp->mac_version == RTL_GIGA_MAC_VER_31)) && tp->mac_version == RTL_GIGA_MAC_VER_31) &&
r8168dp_check_dash(tp)) { r8168dp_check_dash(tp)) {
return; return;
} }
if (((tp->mac_version == RTL_GIGA_MAC_VER_23) || if ((tp->mac_version == RTL_GIGA_MAC_VER_23 ||
(tp->mac_version == RTL_GIGA_MAC_VER_24)) && tp->mac_version == RTL_GIGA_MAC_VER_24) &&
(RTL_R16(CPlusCmd) & ASF)) { (RTL_R16(CPlusCmd) & ASF)) {
return; return;
} }
...@@ -3152,9 +3147,9 @@ static void r8168_pll_power_up(struct rtl8169_private *tp) ...@@ -3152,9 +3147,9 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
{ {
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
if (((tp->mac_version == RTL_GIGA_MAC_VER_27) || if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
(tp->mac_version == RTL_GIGA_MAC_VER_28) || tp->mac_version == RTL_GIGA_MAC_VER_28 ||
(tp->mac_version == RTL_GIGA_MAC_VER_31)) && tp->mac_version == RTL_GIGA_MAC_VER_31) &&
r8168dp_check_dash(tp)) { r8168dp_check_dash(tp)) {
return; return;
} }
...@@ -3235,6 +3230,22 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp) ...@@ -3235,6 +3230,22 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
} }
} }
static void rtl_hw_reset(struct rtl8169_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
int i;
/* Soft reset the chip. */
RTL_W8(ChipCmd, CmdReset);
/* Check that the chip has finished the reset. */
for (i = 0; i < 100; i++) {
if ((RTL_R8(ChipCmd) & CmdReset) == 0)
break;
msleep_interruptible(1);
}
}
static int __devinit static int __devinit
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
...@@ -3334,6 +3345,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -3334,6 +3345,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rc = -EIO; rc = -EIO;
goto err_out_free_res_3; goto err_out_free_res_3;
} }
tp->mmio_addr = ioaddr;
tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP); tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
if (!tp->pcie_cap) if (!tp->pcie_cap)
...@@ -3341,22 +3353,14 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -3341,22 +3353,14 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
RTL_W16(IntrMask, 0x0000); RTL_W16(IntrMask, 0x0000);
/* Soft reset the chip. */ rtl_hw_reset(tp);
RTL_W8(ChipCmd, CmdReset);
/* Check that the chip has finished the reset. */
for (i = 0; i < 100; i++) {
if ((RTL_R8(ChipCmd) & CmdReset) == 0)
break;
msleep_interruptible(1);
}
RTL_W16(IntrStatus, 0xffff); RTL_W16(IntrStatus, 0xffff);
pci_set_master(pdev); pci_set_master(pdev);
/* Identify chip attached to board */ /* Identify chip attached to board */
rtl8169_get_mac_version(tp, ioaddr); rtl8169_get_mac_version(tp, dev, cfg->default_ver);
/* /*
* Pretend we are using VLANs; This bypasses a nasty bug where * Pretend we are using VLANs; This bypasses a nasty bug where
...@@ -3368,26 +3372,10 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -3368,26 +3372,10 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rtl_init_mdio_ops(tp); rtl_init_mdio_ops(tp);
rtl_init_pll_power_ops(tp); rtl_init_pll_power_ops(tp);
/* Use appropriate default if unknown */
if (tp->mac_version == RTL_GIGA_MAC_NONE) {
netif_notice(tp, probe, dev,
"unknown MAC, using family default\n");
tp->mac_version = cfg->default_ver;
}
rtl8169_print_mac_version(tp); rtl8169_print_mac_version(tp);
for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) { chipset = tp->mac_version;
if (tp->mac_version == rtl_chip_info[i].mac_version) tp->txd_version = rtl_chip_infos[chipset].txd_version;
break;
}
if (i == ARRAY_SIZE(rtl_chip_info)) {
dev_err(&pdev->dev,
"driver bug, MAC version not found in rtl_chip_info\n");
goto err_out_msi_4;
}
chipset = i;
tp->txd_version = rtl_chip_info[chipset].txd_version;
RTL_W8(Cfg9346, Cfg9346_Unlock); RTL_W8(Cfg9346, Cfg9346_Unlock);
RTL_W8(Config1, RTL_R8(Config1) | PMEnable); RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
...@@ -3407,8 +3395,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -3407,8 +3395,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
tp->phy_reset_pending = rtl8169_tbi_reset_pending; tp->phy_reset_pending = rtl8169_tbi_reset_pending;
tp->link_ok = rtl8169_tbi_link_ok; tp->link_ok = rtl8169_tbi_link_ok;
tp->do_ioctl = rtl_tbi_ioctl; tp->do_ioctl = rtl_tbi_ioctl;
tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
} else { } else {
tp->set_speed = rtl8169_set_speed_xmii; tp->set_speed = rtl8169_set_speed_xmii;
tp->get_settings = rtl8169_gset_xmii; tp->get_settings = rtl8169_gset_xmii;
...@@ -3420,8 +3406,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -3420,8 +3406,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
spin_lock_init(&tp->lock); spin_lock_init(&tp->lock);
tp->mmio_addr = ioaddr;
/* Get MAC address */ /* Get MAC address */
for (i = 0; i < MAC_ADDR_LEN; i++) for (i = 0; i < MAC_ADDR_LEN; i++)
dev->dev_addr[i] = RTL_R8(MAC0 + i); dev->dev_addr[i] = RTL_R8(MAC0 + i);
...@@ -3466,12 +3450,12 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -3466,12 +3450,12 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_drvdata(pdev, dev); pci_set_drvdata(pdev, dev);
netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n", netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
rtl_chip_info[chipset].name, dev->base_addr, dev->dev_addr, rtl_chip_infos[chipset].name, dev->base_addr, dev->dev_addr,
(u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq); (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
if ((tp->mac_version == RTL_GIGA_MAC_VER_27) || if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
(tp->mac_version == RTL_GIGA_MAC_VER_28) || tp->mac_version == RTL_GIGA_MAC_VER_28 ||
(tp->mac_version == RTL_GIGA_MAC_VER_31)) { tp->mac_version == RTL_GIGA_MAC_VER_31) {
rtl8168_driver_start(tp); rtl8168_driver_start(tp);
} }
...@@ -3503,9 +3487,9 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) ...@@ -3503,9 +3487,9 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = pci_get_drvdata(pdev);
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
if ((tp->mac_version == RTL_GIGA_MAC_VER_27) || if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
(tp->mac_version == RTL_GIGA_MAC_VER_28) || tp->mac_version == RTL_GIGA_MAC_VER_28 ||
(tp->mac_version == RTL_GIGA_MAC_VER_31)) { tp->mac_version == RTL_GIGA_MAC_VER_31) {
rtl8168_driver_stop(tp); rtl8168_driver_stop(tp);
} }
...@@ -3528,33 +3512,23 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) ...@@ -3528,33 +3512,23 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
static void rtl_request_firmware(struct rtl8169_private *tp) static void rtl_request_firmware(struct rtl8169_private *tp)
{ {
int i;
/* Return early if the firmware is already loaded / cached. */ /* Return early if the firmware is already loaded / cached. */
if (!IS_ERR(tp->fw)) if (IS_ERR(tp->fw)) {
goto out; const char *name;
for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) {
const struct rtl_firmware_info *info = rtl_firmware_infos + i;
if (info->mac_version == tp->mac_version) { name = rtl_lookup_firmware_name(tp);
const char *name = info->fw_name; if (name) {
int rc; int rc;
rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev); rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev);
if (rc < 0) { if (rc >= 0)
return;
netif_warn(tp, ifup, tp->dev, "unable to load " netif_warn(tp, ifup, tp->dev, "unable to load "
"firmware patch %s (%d)\n", name, rc); "firmware patch %s (%d)\n", name, rc);
goto out_disable_request_firmware;
} }
goto out;
}
}
out_disable_request_firmware:
tp->fw = NULL; tp->fw = NULL;
out: }
return;
} }
static int rtl8169_open(struct net_device *dev) static int rtl8169_open(struct net_device *dev)
...@@ -3606,8 +3580,6 @@ static int rtl8169_open(struct net_device *dev) ...@@ -3606,8 +3580,6 @@ static int rtl8169_open(struct net_device *dev)
rtl_hw_start(dev); rtl_hw_start(dev);
rtl8169_request_timer(dev);
tp->saved_wolopts = 0; tp->saved_wolopts = 0;
pm_runtime_put_noidle(&pdev->dev); pm_runtime_put_noidle(&pdev->dev);
...@@ -3669,25 +3641,14 @@ static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp) ...@@ -3669,25 +3641,14 @@ static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
static void rtl_hw_start(struct net_device *dev) static void rtl_hw_start(struct net_device *dev)
{ {
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr;
unsigned int i;
/* Soft reset the chip. */ rtl_hw_reset(tp);
RTL_W8(ChipCmd, CmdReset);
/* Check that the chip has finished the reset. */
for (i = 0; i < 100; i++) {
if ((RTL_R8(ChipCmd) & CmdReset) == 0)
break;
msleep_interruptible(1);
}
tp->hw_start(dev); tp->hw_start(dev);
netif_start_queue(dev); netif_start_queue(dev);
} }
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp, static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
void __iomem *ioaddr) void __iomem *ioaddr)
{ {
...@@ -3753,26 +3714,26 @@ static void rtl_hw_start_8169(struct net_device *dev) ...@@ -3753,26 +3714,26 @@ static void rtl_hw_start_8169(struct net_device *dev)
} }
RTL_W8(Cfg9346, Cfg9346_Unlock); RTL_W8(Cfg9346, Cfg9346_Unlock);
if ((tp->mac_version == RTL_GIGA_MAC_VER_01) || if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
(tp->mac_version == RTL_GIGA_MAC_VER_02) || tp->mac_version == RTL_GIGA_MAC_VER_02 ||
(tp->mac_version == RTL_GIGA_MAC_VER_03) || tp->mac_version == RTL_GIGA_MAC_VER_03 ||
(tp->mac_version == RTL_GIGA_MAC_VER_04)) tp->mac_version == RTL_GIGA_MAC_VER_04)
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
RTL_W8(EarlyTxThres, NoEarlyTx); RTL_W8(EarlyTxThres, NoEarlyTx);
rtl_set_rx_max_size(ioaddr, rx_buf_sz); rtl_set_rx_max_size(ioaddr, rx_buf_sz);
if ((tp->mac_version == RTL_GIGA_MAC_VER_01) || if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
(tp->mac_version == RTL_GIGA_MAC_VER_02) || tp->mac_version == RTL_GIGA_MAC_VER_02 ||
(tp->mac_version == RTL_GIGA_MAC_VER_03) || tp->mac_version == RTL_GIGA_MAC_VER_03 ||
(tp->mac_version == RTL_GIGA_MAC_VER_04)) tp->mac_version == RTL_GIGA_MAC_VER_04)
rtl_set_rx_tx_config_registers(tp); rtl_set_rx_tx_config_registers(tp);
tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW; tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
if ((tp->mac_version == RTL_GIGA_MAC_VER_02) || if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
(tp->mac_version == RTL_GIGA_MAC_VER_03)) { tp->mac_version == RTL_GIGA_MAC_VER_03) {
dprintk("Set MAC Reg C+CR Offset 0xE0. " dprintk("Set MAC Reg C+CR Offset 0xE0. "
"Bit-3 and bit-14 MUST be 1\n"); "Bit-3 and bit-14 MUST be 1\n");
tp->cp_cmd |= (1 << 14); tp->cp_cmd |= (1 << 14);
...@@ -3790,10 +3751,10 @@ static void rtl_hw_start_8169(struct net_device *dev) ...@@ -3790,10 +3751,10 @@ static void rtl_hw_start_8169(struct net_device *dev)
rtl_set_rx_tx_desc_registers(tp, ioaddr); rtl_set_rx_tx_desc_registers(tp, ioaddr);
if ((tp->mac_version != RTL_GIGA_MAC_VER_01) && if (tp->mac_version != RTL_GIGA_MAC_VER_01 &&
(tp->mac_version != RTL_GIGA_MAC_VER_02) && tp->mac_version != RTL_GIGA_MAC_VER_02 &&
(tp->mac_version != RTL_GIGA_MAC_VER_03) && tp->mac_version != RTL_GIGA_MAC_VER_03 &&
(tp->mac_version != RTL_GIGA_MAC_VER_04)) { tp->mac_version != RTL_GIGA_MAC_VER_04) {
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
rtl_set_rx_tx_config_registers(tp); rtl_set_rx_tx_config_registers(tp);
} }
...@@ -4103,10 +4064,10 @@ static void rtl_hw_start_8168e(void __iomem *ioaddr, struct pci_dev *pdev) ...@@ -4103,10 +4064,10 @@ static void rtl_hw_start_8168e(void __iomem *ioaddr, struct pci_dev *pdev)
rtl_disable_clock_request(pdev); rtl_disable_clock_request(pdev);
/* Reset tx FIFO pointer */ /* Reset tx FIFO pointer */
RTL_W32(MISC, RTL_R32(MISC) | txpla_rst); RTL_W32(MISC, RTL_R32(MISC) | TXPLA_RST);
RTL_W32(MISC, RTL_R32(MISC) & ~txpla_rst); RTL_W32(MISC, RTL_R32(MISC) & ~TXPLA_RST);
RTL_W8(Config5, RTL_R8(Config5) & ~spi_en); RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
} }
static void rtl_hw_start_8168(struct net_device *dev) static void rtl_hw_start_8168(struct net_device *dev)
...@@ -4190,6 +4151,7 @@ static void rtl_hw_start_8168(struct net_device *dev) ...@@ -4190,6 +4151,7 @@ static void rtl_hw_start_8168(struct net_device *dev)
case RTL_GIGA_MAC_VER_28: case RTL_GIGA_MAC_VER_28:
rtl_hw_start_8168d_4(ioaddr, pdev); rtl_hw_start_8168d_4(ioaddr, pdev);
break; break;
case RTL_GIGA_MAC_VER_31: case RTL_GIGA_MAC_VER_31:
rtl_hw_start_8168dp(ioaddr, pdev); rtl_hw_start_8168dp(ioaddr, pdev);
break; break;
...@@ -4286,10 +4248,10 @@ static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev) ...@@ -4286,10 +4248,10 @@ static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev)
{ 0x0a, 0, 0x0020 } { 0x0a, 0, 0x0020 }
}; };
/* Force LAN exit from ASPM if Rx/Tx are not idel */ /* Force LAN exit from ASPM if Rx/Tx are not idle */
RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800); RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
/* disable Early Tally Counter */ /* Disable Early Tally Counter */
RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000); RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET); RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
...@@ -4310,8 +4272,8 @@ static void rtl_hw_start_8101(struct net_device *dev) ...@@ -4310,8 +4272,8 @@ static void rtl_hw_start_8101(struct net_device *dev)
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
struct pci_dev *pdev = tp->pci_dev; struct pci_dev *pdev = tp->pci_dev;
if ((tp->mac_version == RTL_GIGA_MAC_VER_13) || if (tp->mac_version == RTL_GIGA_MAC_VER_13 ||
(tp->mac_version == RTL_GIGA_MAC_VER_16)) { tp->mac_version == RTL_GIGA_MAC_VER_16) {
int cap = tp->pcie_cap; int cap = tp->pcie_cap;
if (cap) { if (cap) {
...@@ -4613,6 +4575,7 @@ static void rtl8169_reset_task(struct work_struct *work) ...@@ -4613,6 +4575,7 @@ static void rtl8169_reset_task(struct work_struct *work)
struct rtl8169_private *tp = struct rtl8169_private *tp =
container_of(work, struct rtl8169_private, task.work); container_of(work, struct rtl8169_private, task.work);
struct net_device *dev = tp->dev; struct net_device *dev = tp->dev;
int i;
rtnl_lock(); rtnl_lock();
...@@ -4621,19 +4584,15 @@ static void rtl8169_reset_task(struct work_struct *work) ...@@ -4621,19 +4584,15 @@ static void rtl8169_reset_task(struct work_struct *work)
rtl8169_wait_for_quiescence(dev); rtl8169_wait_for_quiescence(dev);
rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0); for (i = 0; i < NUM_RX_DESC; i++)
rtl8169_mark_to_asic(tp->RxDescArray + i, rx_buf_sz);
rtl8169_tx_clear(tp); rtl8169_tx_clear(tp);
if (tp->dirty_rx == tp->cur_rx) {
rtl8169_init_ring_indexes(tp); rtl8169_init_ring_indexes(tp);
rtl_hw_start(dev); rtl_hw_start(dev);
netif_wake_queue(dev); netif_wake_queue(dev);
rtl8169_check_link_status(dev, tp, tp->mmio_addr); rtl8169_check_link_status(dev, tp, tp->mmio_addr);
} else {
if (net_ratelimit())
netif_emerg(tp, intr, dev, "Rx buffers shortage\n");
rtl8169_schedule_work(dev, rtl8169_reset_task);
}
out_unlock: out_unlock:
rtnl_unlock(); rtnl_unlock();
...@@ -4677,7 +4636,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb, ...@@ -4677,7 +4636,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
goto err_out; goto err_out;
} }
/* anti gcc 2.95.3 bugware (sic) */ /* Anti gcc 2.95.3 bugware (sic) */
status = opts[0] | len | status = opts[0] | len |
(RingEnd * !((entry + 1) % NUM_TX_DESC)); (RingEnd * !((entry + 1) % NUM_TX_DESC));
...@@ -4773,7 +4732,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, ...@@ -4773,7 +4732,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
wmb(); wmb();
/* anti gcc 2.95.3 bugware (sic) */ /* Anti gcc 2.95.3 bugware (sic) */
status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_TX_DESC)); status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
txd->opts1 = cpu_to_le32(status); txd->opts1 = cpu_to_le32(status);
...@@ -4781,7 +4740,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, ...@@ -4781,7 +4740,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
wmb(); wmb();
RTL_W8(TxPoll, NPQ); /* set polling bit */ RTL_W8(TxPoll, NPQ);
if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) { if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
netif_stop_queue(dev); netif_stop_queue(dev);
...@@ -4938,20 +4897,12 @@ static struct sk_buff *rtl8169_try_rx_copy(void *data, ...@@ -4938,20 +4897,12 @@ static struct sk_buff *rtl8169_try_rx_copy(void *data,
return skb; return skb;
} }
/*
* Warning : rtl8169_rx_interrupt() might be called :
* 1) from NAPI (softirq) context
* (polling = 1 : we should call netif_receive_skb())
* 2) from process context (rtl8169_reset_task())
* (polling = 0 : we must call netif_rx() instead)
*/
static int rtl8169_rx_interrupt(struct net_device *dev, static int rtl8169_rx_interrupt(struct net_device *dev,
struct rtl8169_private *tp, struct rtl8169_private *tp,
void __iomem *ioaddr, u32 budget) void __iomem *ioaddr, u32 budget)
{ {
unsigned int cur_rx, rx_left; unsigned int cur_rx, rx_left;
unsigned int count; unsigned int count;
int polling = (budget != ~(u32)0) ? 1 : 0;
cur_rx = tp->cur_rx; cur_rx = tp->cur_rx;
rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx; rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
...@@ -5011,10 +4962,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev, ...@@ -5011,10 +4962,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
rtl8169_rx_vlan_tag(desc, skb); rtl8169_rx_vlan_tag(desc, skb);
if (likely(polling))
napi_gro_receive(&tp->napi, skb); napi_gro_receive(&tp->napi, skb);
else
netif_rx(skb);
dev->stats.rx_bytes += pkt_size; dev->stats.rx_bytes += pkt_size;
dev->stats.rx_packets++; dev->stats.rx_packets++;
...@@ -5170,7 +5118,7 @@ static void rtl8169_down(struct net_device *dev) ...@@ -5170,7 +5118,7 @@ static void rtl8169_down(struct net_device *dev)
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
rtl8169_delete_timer(dev); del_timer_sync(&tp->timer);
netif_stop_queue(dev); netif_stop_queue(dev);
...@@ -5207,7 +5155,7 @@ static int rtl8169_close(struct net_device *dev) ...@@ -5207,7 +5155,7 @@ static int rtl8169_close(struct net_device *dev)
pm_runtime_get_sync(&pdev->dev); pm_runtime_get_sync(&pdev->dev);
/* update counters before going down */ /* Update counters before going down */
rtl8169_update_counters(dev); rtl8169_update_counters(dev);
rtl8169_down(dev); rtl8169_down(dev);
...@@ -5427,7 +5375,7 @@ static void rtl_shutdown(struct pci_dev *pdev) ...@@ -5427,7 +5375,7 @@ static void rtl_shutdown(struct pci_dev *pdev)
rtl8169_net_suspend(dev); rtl8169_net_suspend(dev);
/* restore original MAC address */ /* Restore original MAC address */
rtl_rar_set(tp, dev->perm_addr); rtl_rar_set(tp, dev->perm_addr);
spin_lock_irq(&tp->lock); spin_lock_irq(&tp->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment