net: mediatek: move the pending_work struct to the device generic struct
authorJohn Crispin <blogic@openwrt.org>
Thu, 7 Apr 2016 22:54:10 +0000 (00:54 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Apr 2016 02:41:33 +0000 (22:41 -0400)
The worker always touches both netdevs. It is ethernet core and not MAC
specific. We only need one worker, which belongs into the ethernets core
struct.

Signed-off-by: John Crispin <blogic@openwrt.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mediatek/mtk_eth_soc.c
drivers/net/ethernet/mediatek/mtk_eth_soc.h

index cd5d0c97f0ce6024289faeb58c89ef55c371bdc3..eb0d5544787ada3289821d3c9c2b08ba49d50bdd 100644 (file)
@@ -1193,7 +1193,7 @@ static void mtk_tx_timeout(struct net_device *dev)
        eth->netdev[mac->id]->stats.tx_errors++;
        netif_err(eth, tx_err, dev,
                  "transmit timed out\n");
-       schedule_work(&mac->pending_work);
+       schedule_work(&eth->pending_work);
 }
 
 static irqreturn_t mtk_handle_irq(int irq, void *_eth)
@@ -1430,8 +1430,7 @@ static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
 static void mtk_pending_work(struct work_struct *work)
 {
-       struct mtk_mac *mac = container_of(work, struct mtk_mac, pending_work);
-       struct mtk_eth *eth = mac->hw;
+       struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work);
        int err, i;
        unsigned long restart = 0;
 
@@ -1439,7 +1438,7 @@ static void mtk_pending_work(struct work_struct *work)
 
        /* stop all devices to make sure that dma is properly shut down */
        for (i = 0; i < MTK_MAC_COUNT; i++) {
-               if (!netif_oper_up(eth->netdev[i]))
+               if (!eth->netdev[i])
                        continue;
                mtk_stop(eth->netdev[i]);
                __set_bit(i, &restart);
@@ -1464,15 +1463,13 @@ static int mtk_cleanup(struct mtk_eth *eth)
        int i;
 
        for (i = 0; i < MTK_MAC_COUNT; i++) {
-               struct mtk_mac *mac = netdev_priv(eth->netdev[i]);
-
                if (!eth->netdev[i])
                        continue;
 
                unregister_netdev(eth->netdev[i]);
                free_netdev(eth->netdev[i]);
-               cancel_work_sync(&mac->pending_work);
        }
+       cancel_work_sync(&eth->pending_work);
 
        return 0;
 }
@@ -1660,7 +1657,6 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
        mac->id = id;
        mac->hw = eth;
        mac->of_node = np;
-       INIT_WORK(&mac->pending_work, mtk_pending_work);
 
        mac->hw_stats = devm_kzalloc(eth->dev,
                                     sizeof(*mac->hw_stats),
@@ -1762,6 +1758,7 @@ static int mtk_probe(struct platform_device *pdev)
 
        eth->dev = &pdev->dev;
        eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
+       INIT_WORK(&eth->pending_work, mtk_pending_work);
 
        err = mtk_hw_init(eth);
        if (err)
index 48a5292c8ed8b793e3058d41cd389a8064fbfaf4..eed626d56ea4f1d3df5f2ed3aacbd8bded28cead 100644 (file)
@@ -363,6 +363,7 @@ struct mtk_rx_ring {
  * @clk_gp1:           The gmac1 clock
  * @clk_gp2:           The gmac2 clock
  * @mii_bus:           If there is a bus we need to create an instance for it
+ * @pending_work:      The workqueue used to reset the dma ring
  */
 
 struct mtk_eth {
@@ -389,6 +390,7 @@ struct mtk_eth {
        struct clk                      *clk_gp1;
        struct clk                      *clk_gp2;
        struct mii_bus                  *mii_bus;
+       struct work_struct              pending_work;
 };
 
 /* struct mtk_mac -    the structure that holds the info about the MACs of the
@@ -398,7 +400,6 @@ struct mtk_eth {
  * @hw:                        Backpointer to our main datastruture
  * @hw_stats:          Packet statistics counter
  * @phy_dev:           The attached PHY if available
- * @pending_work:      The workqueue used to reset the dma ring
  */
 struct mtk_mac {
        int                             id;
@@ -406,7 +407,6 @@ struct mtk_mac {
        struct mtk_eth                  *hw;
        struct mtk_hw_stats             *hw_stats;
        struct phy_device               *phy_dev;
-       struct work_struct              pending_work;
 };
 
 /* the struct describing the SoC. these are declared in the soc_xyz.c files */