For more info send email. Signed-off-by: Corcodel Marian <a...@marian1000.go.ro> --- drivers/net/ethernet/realtek/r8169.c | 69 ++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 27 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 61623e9..e215812 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -3709,14 +3709,6 @@ static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag) schedule_work(&tp->wk.work); } -static void rtl8169_phy_timer(unsigned long __opaque) -{ - struct net_device *dev = (struct net_device *)__opaque; - struct rtl8169_private *tp = netdev_priv(dev); - - rtl_schedule_task(tp, RTL_FLAG_TASK_PHY_PENDING); -} - static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev, void __iomem *ioaddr) { @@ -4427,7 +4419,6 @@ static void rtl_hw_reset(struct rtl8169_private *tp) RTL_W8(ChipCmd, CmdReset); - rtl_udelay_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100); } static void rtl_request_uncached_firmware(struct rtl8169_private *tp) @@ -4704,6 +4695,7 @@ static void rtl_hw_start_8169(struct net_device *dev) rtl_set_rx_tx_desc_registers(tp, ioaddr); + if (tp->mac_version != RTL_GIGA_MAC_VER_01 && tp->mac_version != RTL_GIGA_MAC_VER_02 && tp->mac_version != RTL_GIGA_MAC_VER_03 && @@ -5625,20 +5617,25 @@ static void rtl_hw_start_8101(struct net_device *dev) tp->mac_version == RTL_GIGA_MAC_VER_16) pcie_capability_set_word(pdev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_NOSNOOP_EN); + switch (tp->mac_version) { + case RTL_GIGA_MAC_VER_09: + break; + default: - RTL_W8(Cfg9346, Cfg9346_Unlock); - - RTL_W8(MaxTxPacketSize, TxPacketMax); + RTL_W8(MaxTxPacketSize, TxPacketMax); - rtl_set_rx_max_size(ioaddr, rx_buf_sz); + rtl_set_rx_max_size(ioaddr, rx_buf_sz); - tp->cp_cmd &= ~R810X_CPCMD_QUIRK_MASK; - RTL_W16(CPlusCmd, tp->cp_cmd); + tp->cp_cmd &= ~R810X_CPCMD_QUIRK_MASK; + RTL_W16(CPlusCmd, tp->cp_cmd); - rtl_set_rx_tx_desc_registers(tp, ioaddr); + rtl_set_rx_tx_desc_registers(tp, ioaddr); - rtl_set_rx_tx_config_registers(tp); + rtl_set_rx_tx_config_registers(tp); + break; + } + RTL_W8(Cfg9346, Cfg9346_Unlock); switch (tp->mac_version) { case RTL_GIGA_MAC_VER_07: rtl_hw_start_8102e_1(tp); @@ -6393,7 +6390,7 @@ static void rtl_task(struct work_struct *work) struct rtl8169_private *tp = container_of(work, struct rtl8169_private, wk.work); struct net_device *dev = tp->dev; - int i; + bool pending; rtl_lock_work(tp); @@ -6401,13 +6398,25 @@ static void rtl_task(struct work_struct *work) !test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags)) goto out_unlock; - for (i = 0; i < ARRAY_SIZE(rtl_work); i++) { - bool pending; + pending = test_and_clear_bit(rtl_work[0].bitnr, tp->wk.flags); + if (pending) + rtl_work[0].action(tp); + + switch (tp->mac_version) { + case RTL_GIGA_MAC_VER_09: + test_and_clear_bit(rtl_work[1].bitnr, tp->wk.flags); + break; + default: + pending = test_and_clear_bit(rtl_work[1].bitnr, + tp->wk.flags); + if (pending) + rtl_work[1].action(tp); + break; + } - pending = test_and_clear_bit(rtl_work[i].bitnr, tp->wk.flags); + pending = test_and_clear_bit(rtl_work[2].bitnr, tp->wk.flags); if (pending) - rtl_work[i].action(tp); - } + rtl_work[2].action(tp); out_unlock: rtl_unlock_work(tp); @@ -6553,6 +6562,14 @@ static int rtl_open(struct net_device *dev) if (retval < 0) goto err_free_rx_1; + switch (tp->mac_version) { + case RTL_GIGA_MAC_VER_09: + rtl_set_rx_tx_desc_registers(tp, ioaddr); + break; + default: + break; + } + INIT_WORK(&tp->wk.work, rtl_task); smp_mb(); @@ -6569,7 +6586,6 @@ static int rtl_open(struct net_device *dev) set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags); - napi_enable(&tp->napi); rtl8169_init_phy(dev, tp); @@ -6580,7 +6596,7 @@ static int rtl_open(struct net_device *dev) rtl_hw_start(dev); netif_start_queue(dev); - + napi_enable(&tp->napi); rtl_unlock_work(tp); tp->saved_wolopts = 0; @@ -6892,7 +6908,7 @@ static const struct rtl_cfg_info { .region = 2, .align = 8, .event_slow = SYSErr | LinkChg | RxOverflow | RxFIFOOver | - PCSTimeout, + PCSTimeout | SWInt | TxDescUnavail, .features = RTL_FEATURE_MSI, .default_ver = RTL_GIGA_MAC_VER_13, } @@ -7183,7 +7199,6 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) init_timer(&tp->timer); tp->timer.data = (unsigned long) dev; - tp->timer.function = rtl8169_phy_timer; tp->rtl_fw = RTL_FIRMWARE_UNKNOWN; -- 2.1.4