aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-07-08 08:01:44 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-08 23:57:46 -0400
commit36cdc743a320e78a5d12ca9765ec0f7d9f07b1f5 (patch)
tree3893297d3400262615d2622d5755fdbccc29b96f
parentccea2968398c959493cdce503ae94206d2026fbe (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.h8
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c34
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
259struct 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
1027static void fec_enet_work(struct work_struct *work) 1026static 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
1050static void 1044static 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
2648failed_register: 2642failed_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);