diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-07-08 08:01:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-08 23:57:46 -0400 |
commit | 36cdc743a320e78a5d12ca9765ec0f7d9f07b1f5 (patch) | |
tree | 3893297d3400262615d2622d5755fdbccc29b96f | |
parent | ccea2968398c959493cdce503ae94206d2026fbe (diff) |
net: fec: replace delayed work with standard work
As of "better implementation of iMX6 ERR006358 quirk", we no longer have
a requirement for a delayed work. Moreover, the work is now only used
for timeout purposes, so the timeout flag is also pointless - we set it
each time we queue the work, and the work clears it.
Replace the fec_enet_delayed_work struct with a standard work_struct,
resulting in simplified timeout handling code.
Acked-by: Fugang Duan <B38611@freescale.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/freescale/fec.h | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 34 |
2 files changed, 16 insertions, 26 deletions
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 17e294970207..bd53caf1c1eb 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h | |||
@@ -256,11 +256,6 @@ struct bufdesc_ex { | |||
256 | #define FLAG_RX_CSUM_ENABLED (BD_ENET_RX_ICE | BD_ENET_RX_PCR) | 256 | #define FLAG_RX_CSUM_ENABLED (BD_ENET_RX_ICE | BD_ENET_RX_PCR) |
257 | #define FLAG_RX_CSUM_ERROR (BD_ENET_RX_ICE | BD_ENET_RX_PCR) | 257 | #define FLAG_RX_CSUM_ERROR (BD_ENET_RX_ICE | BD_ENET_RX_PCR) |
258 | 258 | ||
259 | struct fec_enet_delayed_work { | ||
260 | struct delayed_work delay_work; | ||
261 | bool timeout; | ||
262 | }; | ||
263 | |||
264 | /* The FEC buffer descriptors track the ring buffers. The rx_bd_base and | 259 | /* The FEC buffer descriptors track the ring buffers. The rx_bd_base and |
265 | * tx_bd_base always point to the base of the buffer descriptors. The | 260 | * tx_bd_base always point to the base of the buffer descriptors. The |
266 | * cur_rx and cur_tx point to the currently available buffer. | 261 | * cur_rx and cur_tx point to the currently available buffer. |
@@ -326,6 +321,8 @@ struct fec_enet_private { | |||
326 | struct napi_struct napi; | 321 | struct napi_struct napi; |
327 | int csum_flags; | 322 | int csum_flags; |
328 | 323 | ||
324 | struct work_struct tx_timeout_work; | ||
325 | |||
329 | struct ptp_clock *ptp_clock; | 326 | struct ptp_clock *ptp_clock; |
330 | struct ptp_clock_info ptp_caps; | 327 | struct ptp_clock_info ptp_caps; |
331 | unsigned long last_overflow_check; | 328 | unsigned long last_overflow_check; |
@@ -338,7 +335,6 @@ struct fec_enet_private { | |||
338 | int hwts_rx_en; | 335 | int hwts_rx_en; |
339 | int hwts_tx_en; | 336 | int hwts_tx_en; |
340 | struct timer_list time_keep; | 337 | struct timer_list time_keep; |
341 | struct fec_enet_delayed_work delay_work; | ||
342 | struct regulator *reg_phy; | 338 | struct regulator *reg_phy; |
343 | }; | 339 | }; |
344 | 340 | ||
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 8cfc3a3de7fb..b2ae7e706d5e 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
@@ -1020,31 +1020,25 @@ fec_timeout(struct net_device *ndev) | |||
1020 | 1020 | ||
1021 | ndev->stats.tx_errors++; | 1021 | ndev->stats.tx_errors++; |
1022 | 1022 | ||
1023 | fep->delay_work.timeout = true; | 1023 | schedule_work(&fep->tx_timeout_work); |
1024 | schedule_delayed_work(&(fep->delay_work.delay_work), 0); | ||
1025 | } | 1024 | } |
1026 | 1025 | ||
1027 | static void fec_enet_work(struct work_struct *work) | 1026 | static void fec_enet_timeout_work(struct work_struct *work) |
1028 | { | 1027 | { |
1029 | struct fec_enet_private *fep = | 1028 | struct fec_enet_private *fep = |
1030 | container_of(work, | 1029 | container_of(work, struct fec_enet_private, tx_timeout_work); |
1031 | struct fec_enet_private, | ||
1032 | delay_work.delay_work.work); | ||
1033 | struct net_device *ndev = fep->netdev; | 1030 | struct net_device *ndev = fep->netdev; |
1034 | 1031 | ||
1035 | if (fep->delay_work.timeout) { | 1032 | rtnl_lock(); |
1036 | fep->delay_work.timeout = false; | 1033 | if (netif_device_present(ndev) || netif_running(ndev)) { |
1037 | rtnl_lock(); | 1034 | napi_disable(&fep->napi); |
1038 | if (netif_device_present(ndev) || netif_running(ndev)) { | 1035 | netif_tx_lock_bh(ndev); |
1039 | napi_disable(&fep->napi); | 1036 | fec_restart(ndev); |
1040 | netif_tx_lock_bh(ndev); | 1037 | netif_wake_queue(ndev); |
1041 | fec_restart(ndev); | 1038 | netif_tx_unlock_bh(ndev); |
1042 | netif_wake_queue(ndev); | 1039 | napi_enable(&fep->napi); |
1043 | netif_tx_unlock_bh(ndev); | ||
1044 | napi_enable(&fep->napi); | ||
1045 | } | ||
1046 | rtnl_unlock(); | ||
1047 | } | 1040 | } |
1041 | rtnl_unlock(); | ||
1048 | } | 1042 | } |
1049 | 1043 | ||
1050 | static void | 1044 | static void |
@@ -2642,7 +2636,7 @@ fec_probe(struct platform_device *pdev) | |||
2642 | if (fep->bufdesc_ex && fep->ptp_clock) | 2636 | if (fep->bufdesc_ex && fep->ptp_clock) |
2643 | netdev_info(ndev, "registered PHC device %d\n", fep->dev_id); | 2637 | netdev_info(ndev, "registered PHC device %d\n", fep->dev_id); |
2644 | 2638 | ||
2645 | INIT_DELAYED_WORK(&(fep->delay_work.delay_work), fec_enet_work); | 2639 | INIT_WORK(&fep->tx_timeout_work, fec_enet_timeout_work); |
2646 | return 0; | 2640 | return 0; |
2647 | 2641 | ||
2648 | failed_register: | 2642 | failed_register: |
@@ -2667,7 +2661,7 @@ fec_drv_remove(struct platform_device *pdev) | |||
2667 | struct net_device *ndev = platform_get_drvdata(pdev); | 2661 | struct net_device *ndev = platform_get_drvdata(pdev); |
2668 | struct fec_enet_private *fep = netdev_priv(ndev); | 2662 | struct fec_enet_private *fep = netdev_priv(ndev); |
2669 | 2663 | ||
2670 | cancel_delayed_work_sync(&(fep->delay_work.delay_work)); | 2664 | cancel_work_sync(&fep->tx_timeout_work); |
2671 | unregister_netdev(ndev); | 2665 | unregister_netdev(ndev); |
2672 | fec_enet_mii_remove(fep); | 2666 | fec_enet_mii_remove(fep); |
2673 | del_timer_sync(&fep->time_keep); | 2667 | del_timer_sync(&fep->time_keep); |