Skip to content

Commit 370c63f

Browse files
committed
Merge branch 'r8169-again-few-improvements'
Heiner Kallweit says: ==================== r8169: again few improvements Again a series with few r8169 improvements. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents d7ad141 + 67ee63e commit 370c63f

File tree

1 file changed

+82
-117
lines changed

1 file changed

+82
-117
lines changed

drivers/net/ethernet/realtek/r8169_main.c

Lines changed: 82 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,36 +2530,6 @@ static void rtl_enable_rxdvgate(struct rtl8169_private *tp)
25302530
rtl_wait_txrx_fifo_empty(tp);
25312531
}
25322532

2533-
static void rtl8169_hw_reset(struct rtl8169_private *tp)
2534-
{
2535-
/* Disable interrupts */
2536-
rtl8169_irq_mask_and_ack(tp);
2537-
2538-
rtl_rx_close(tp);
2539-
2540-
switch (tp->mac_version) {
2541-
case RTL_GIGA_MAC_VER_27:
2542-
case RTL_GIGA_MAC_VER_28:
2543-
case RTL_GIGA_MAC_VER_31:
2544-
rtl_loop_wait_low(tp, &rtl_npq_cond, 20, 2000);
2545-
break;
2546-
case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38:
2547-
RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
2548-
rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
2549-
break;
2550-
case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61:
2551-
rtl_enable_rxdvgate(tp);
2552-
fsleep(2000);
2553-
break;
2554-
default:
2555-
RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
2556-
udelay(100);
2557-
break;
2558-
}
2559-
2560-
rtl_hw_reset(tp);
2561-
}
2562-
25632533
static void rtl_set_tx_config_registers(struct rtl8169_private *tp)
25642534
{
25652535
u32 val = TX_DMA_BURST << TxDMAShift |
@@ -3955,27 +3925,58 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
39553925
static void rtl8169_tx_clear(struct rtl8169_private *tp)
39563926
{
39573927
rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
3958-
tp->cur_tx = tp->dirty_tx = 0;
39593928
netdev_reset_queue(tp->dev);
39603929
}
39613930

3931+
static void rtl8169_hw_reset(struct rtl8169_private *tp)
3932+
{
3933+
/* Give a racing hard_start_xmit a few cycles to complete. */
3934+
synchronize_rcu();
3935+
3936+
/* Disable interrupts */
3937+
rtl8169_irq_mask_and_ack(tp);
3938+
3939+
rtl_rx_close(tp);
3940+
3941+
switch (tp->mac_version) {
3942+
case RTL_GIGA_MAC_VER_27:
3943+
case RTL_GIGA_MAC_VER_28:
3944+
case RTL_GIGA_MAC_VER_31:
3945+
rtl_loop_wait_low(tp, &rtl_npq_cond, 20, 2000);
3946+
break;
3947+
case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38:
3948+
RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
3949+
rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
3950+
break;
3951+
case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61:
3952+
rtl_enable_rxdvgate(tp);
3953+
fsleep(2000);
3954+
break;
3955+
default:
3956+
RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
3957+
fsleep(100);
3958+
break;
3959+
}
3960+
3961+
rtl_hw_reset(tp);
3962+
3963+
rtl8169_tx_clear(tp);
3964+
rtl8169_init_ring_indexes(tp);
3965+
}
3966+
39623967
static void rtl_reset_work(struct rtl8169_private *tp)
39633968
{
39643969
struct net_device *dev = tp->dev;
39653970
int i;
39663971

39673972
napi_disable(&tp->napi);
39683973
netif_stop_queue(dev);
3969-
synchronize_rcu();
39703974

39713975
rtl8169_hw_reset(tp);
39723976

39733977
for (i = 0; i < NUM_RX_DESC; i++)
39743978
rtl8169_mark_to_asic(tp->RxDescArray + i);
39753979

3976-
rtl8169_tx_clear(tp);
3977-
rtl8169_init_ring_indexes(tp);
3978-
39793980
napi_enable(&tp->napi);
39803981
rtl_hw_start(tp);
39813982
netif_wake_queue(dev);
@@ -4626,25 +4627,21 @@ static int r8169_phy_connect(struct rtl8169_private *tp)
46264627
return 0;
46274628
}
46284629

4629-
static void rtl8169_down(struct net_device *dev)
4630+
static void rtl8169_down(struct rtl8169_private *tp)
46304631
{
4631-
struct rtl8169_private *tp = netdev_priv(dev);
4632+
rtl_lock_work(tp);
46324633

4633-
phy_stop(tp->phydev);
4634+
/* Clear all task flags */
4635+
bitmap_zero(tp->wk.flags, RTL_FLAG_MAX);
46344636

4637+
phy_stop(tp->phydev);
46354638
napi_disable(&tp->napi);
4636-
netif_stop_queue(dev);
46374639

46384640
rtl8169_hw_reset(tp);
46394641

4640-
/* Give a racing hard_start_xmit a few cycles to complete. */
4641-
synchronize_rcu();
4642-
4643-
rtl8169_tx_clear(tp);
4644-
4645-
rtl8169_rx_clear(tp);
4646-
46474642
rtl_pll_power_down(tp);
4643+
4644+
rtl_unlock_work(tp);
46484645
}
46494646

46504647
static int rtl8169_close(struct net_device *dev)
@@ -4657,12 +4654,9 @@ static int rtl8169_close(struct net_device *dev)
46574654
/* Update counters before going down */
46584655
rtl8169_update_counters(tp);
46594656

4660-
rtl_lock_work(tp);
4661-
/* Clear all task flags */
4662-
bitmap_zero(tp->wk.flags, RTL_FLAG_MAX);
4663-
4664-
rtl8169_down(dev);
4665-
rtl_unlock_work(tp);
4657+
netif_stop_queue(dev);
4658+
rtl8169_down(tp);
4659+
rtl8169_rx_clear(tp);
46664660

46674661
cancel_work_sync(&tp->wk.work);
46684662

@@ -4816,44 +4810,30 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
48164810
pm_runtime_put_noidle(&pdev->dev);
48174811
}
48184812

4819-
static void rtl8169_net_suspend(struct net_device *dev)
4813+
static void rtl8169_net_suspend(struct rtl8169_private *tp)
48204814
{
4821-
struct rtl8169_private *tp = netdev_priv(dev);
4822-
4823-
if (!netif_running(dev))
4815+
if (!netif_running(tp->dev))
48244816
return;
48254817

4826-
phy_stop(tp->phydev);
4827-
netif_device_detach(dev);
4828-
4829-
rtl_lock_work(tp);
4830-
napi_disable(&tp->napi);
4831-
/* Clear all task flags */
4832-
bitmap_zero(tp->wk.flags, RTL_FLAG_MAX);
4833-
4834-
rtl_unlock_work(tp);
4835-
4836-
rtl_pll_power_down(tp);
4818+
netif_device_detach(tp->dev);
4819+
rtl8169_down(tp);
48374820
}
48384821

48394822
#ifdef CONFIG_PM
48404823

4841-
static int rtl8169_suspend(struct device *device)
4824+
static int __maybe_unused rtl8169_suspend(struct device *device)
48424825
{
4843-
struct net_device *dev = dev_get_drvdata(device);
4844-
struct rtl8169_private *tp = netdev_priv(dev);
4826+
struct rtl8169_private *tp = dev_get_drvdata(device);
48454827

4846-
rtl8169_net_suspend(dev);
4828+
rtl8169_net_suspend(tp);
48474829
clk_disable_unprepare(tp->clk);
48484830

48494831
return 0;
48504832
}
48514833

4852-
static void __rtl8169_resume(struct net_device *dev)
4834+
static void __rtl8169_resume(struct rtl8169_private *tp)
48534835
{
4854-
struct rtl8169_private *tp = netdev_priv(dev);
4855-
4856-
netif_device_attach(dev);
4836+
netif_device_attach(tp->dev);
48574837

48584838
rtl_pll_power_up(tp);
48594839
rtl8169_init_phy(tp);
@@ -4867,34 +4847,32 @@ static void __rtl8169_resume(struct net_device *dev)
48674847
rtl_unlock_work(tp);
48684848
}
48694849

4870-
static int rtl8169_resume(struct device *device)
4850+
static int __maybe_unused rtl8169_resume(struct device *device)
48714851
{
4872-
struct net_device *dev = dev_get_drvdata(device);
4873-
struct rtl8169_private *tp = netdev_priv(dev);
4852+
struct rtl8169_private *tp = dev_get_drvdata(device);
48744853

4875-
rtl_rar_set(tp, dev->dev_addr);
4854+
rtl_rar_set(tp, tp->dev->dev_addr);
48764855

48774856
clk_prepare_enable(tp->clk);
48784857

4879-
if (netif_running(dev))
4880-
__rtl8169_resume(dev);
4858+
if (netif_running(tp->dev))
4859+
__rtl8169_resume(tp);
48814860

48824861
return 0;
48834862
}
48844863

48854864
static int rtl8169_runtime_suspend(struct device *device)
48864865
{
4887-
struct net_device *dev = dev_get_drvdata(device);
4888-
struct rtl8169_private *tp = netdev_priv(dev);
4866+
struct rtl8169_private *tp = dev_get_drvdata(device);
48894867

48904868
if (!tp->TxDescArray)
48914869
return 0;
48924870

48934871
rtl_lock_work(tp);
4894-
__rtl8169_set_wol(tp, WAKE_ANY);
4872+
__rtl8169_set_wol(tp, WAKE_PHY);
48954873
rtl_unlock_work(tp);
48964874

4897-
rtl8169_net_suspend(dev);
4875+
rtl8169_net_suspend(tp);
48984876

48994877
/* Update counters before going runtime suspend */
49004878
rtl8169_update_counters(tp);
@@ -4904,10 +4882,9 @@ static int rtl8169_runtime_suspend(struct device *device)
49044882

49054883
static int rtl8169_runtime_resume(struct device *device)
49064884
{
4907-
struct net_device *dev = dev_get_drvdata(device);
4908-
struct rtl8169_private *tp = netdev_priv(dev);
4885+
struct rtl8169_private *tp = dev_get_drvdata(device);
49094886

4910-
rtl_rar_set(tp, dev->dev_addr);
4887+
rtl_rar_set(tp, tp->dev->dev_addr);
49114888

49124889
if (!tp->TxDescArray)
49134890
return 0;
@@ -4916,40 +4893,28 @@ static int rtl8169_runtime_resume(struct device *device)
49164893
__rtl8169_set_wol(tp, tp->saved_wolopts);
49174894
rtl_unlock_work(tp);
49184895

4919-
__rtl8169_resume(dev);
4896+
__rtl8169_resume(tp);
49204897

49214898
return 0;
49224899
}
49234900

49244901
static int rtl8169_runtime_idle(struct device *device)
49254902
{
4926-
struct net_device *dev = dev_get_drvdata(device);
4903+
struct rtl8169_private *tp = dev_get_drvdata(device);
49274904

4928-
if (!netif_running(dev) || !netif_carrier_ok(dev))
4905+
if (!netif_running(tp->dev) || !netif_carrier_ok(tp->dev))
49294906
pm_schedule_suspend(device, 10000);
49304907

49314908
return -EBUSY;
49324909
}
49334910

49344911
static const struct dev_pm_ops rtl8169_pm_ops = {
4935-
.suspend = rtl8169_suspend,
4936-
.resume = rtl8169_resume,
4937-
.freeze = rtl8169_suspend,
4938-
.thaw = rtl8169_resume,
4939-
.poweroff = rtl8169_suspend,
4940-
.restore = rtl8169_resume,
4941-
.runtime_suspend = rtl8169_runtime_suspend,
4942-
.runtime_resume = rtl8169_runtime_resume,
4943-
.runtime_idle = rtl8169_runtime_idle,
4912+
SET_SYSTEM_SLEEP_PM_OPS(rtl8169_suspend, rtl8169_resume)
4913+
SET_RUNTIME_PM_OPS(rtl8169_runtime_suspend, rtl8169_runtime_resume,
4914+
rtl8169_runtime_idle)
49444915
};
49454916

4946-
#define RTL8169_PM_OPS (&rtl8169_pm_ops)
4947-
4948-
#else /* !CONFIG_PM */
4949-
4950-
#define RTL8169_PM_OPS NULL
4951-
4952-
#endif /* !CONFIG_PM */
4917+
#endif /* CONFIG_PM */
49534918

49544919
static void rtl_wol_shutdown_quirk(struct rtl8169_private *tp)
49554920
{
@@ -4970,13 +4935,12 @@ static void rtl_wol_shutdown_quirk(struct rtl8169_private *tp)
49704935

49714936
static void rtl_shutdown(struct pci_dev *pdev)
49724937
{
4973-
struct net_device *dev = pci_get_drvdata(pdev);
4974-
struct rtl8169_private *tp = netdev_priv(dev);
4938+
struct rtl8169_private *tp = pci_get_drvdata(pdev);
49754939

4976-
rtl8169_net_suspend(dev);
4940+
rtl8169_net_suspend(tp);
49774941

49784942
/* Restore original MAC address */
4979-
rtl_rar_set(tp, dev->perm_addr);
4943+
rtl_rar_set(tp, tp->dev->perm_addr);
49804944

49814945
rtl8169_hw_reset(tp);
49824946

@@ -4993,21 +4957,20 @@ static void rtl_shutdown(struct pci_dev *pdev)
49934957

49944958
static void rtl_remove_one(struct pci_dev *pdev)
49954959
{
4996-
struct net_device *dev = pci_get_drvdata(pdev);
4997-
struct rtl8169_private *tp = netdev_priv(dev);
4960+
struct rtl8169_private *tp = pci_get_drvdata(pdev);
49984961

49994962
if (pci_dev_run_wake(pdev))
50004963
pm_runtime_get_noresume(&pdev->dev);
50014964

5002-
unregister_netdev(dev);
4965+
unregister_netdev(tp->dev);
50034966

50044967
if (r8168_check_dash(tp))
50054968
rtl8168_driver_stop(tp);
50064969

50074970
rtl_release_firmware(tp);
50084971

50094972
/* restore original MAC address */
5010-
rtl_rar_set(tp, dev->perm_addr);
4973+
rtl_rar_set(tp, tp->dev->perm_addr);
50114974
}
50124975

50134976
static const struct net_device_ops rtl_netdev_ops = {
@@ -5446,7 +5409,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
54465409
if (!tp->counters)
54475410
return -ENOMEM;
54485411

5449-
pci_set_drvdata(pdev, dev);
5412+
pci_set_drvdata(pdev, tp);
54505413

54515414
rc = r8169_mdio_register(tp);
54525415
if (rc)
@@ -5483,7 +5446,9 @@ static struct pci_driver rtl8169_pci_driver = {
54835446
.probe = rtl_init_one,
54845447
.remove = rtl_remove_one,
54855448
.shutdown = rtl_shutdown,
5486-
.driver.pm = RTL8169_PM_OPS,
5449+
#ifdef CONFIG_PM
5450+
.driver.pm = &rtl8169_pm_ops,
5451+
#endif
54875452
};
54885453

54895454
module_pci_driver(rtl8169_pci_driver);

0 commit comments

Comments
 (0)