diff options
-rw-r--r-- | drivers/net/ethernet/mediatek/mtk_eth_soc.c | 13 | ||||
-rw-r--r-- | drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 |
2 files changed, 7 insertions, 10 deletions
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index cd5d0c97f0ce..eb0d5544787a 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | |||
@@ -1193,7 +1193,7 @@ static void mtk_tx_timeout(struct net_device *dev) | |||
1193 | eth->netdev[mac->id]->stats.tx_errors++; | 1193 | eth->netdev[mac->id]->stats.tx_errors++; |
1194 | netif_err(eth, tx_err, dev, | 1194 | netif_err(eth, tx_err, dev, |
1195 | "transmit timed out\n"); | 1195 | "transmit timed out\n"); |
1196 | schedule_work(&mac->pending_work); | 1196 | schedule_work(ð->pending_work); |
1197 | } | 1197 | } |
1198 | 1198 | ||
1199 | static irqreturn_t mtk_handle_irq(int irq, void *_eth) | 1199 | 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) | |||
1430 | 1430 | ||
1431 | static void mtk_pending_work(struct work_struct *work) | 1431 | static void mtk_pending_work(struct work_struct *work) |
1432 | { | 1432 | { |
1433 | struct mtk_mac *mac = container_of(work, struct mtk_mac, pending_work); | 1433 | struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work); |
1434 | struct mtk_eth *eth = mac->hw; | ||
1435 | int err, i; | 1434 | int err, i; |
1436 | unsigned long restart = 0; | 1435 | unsigned long restart = 0; |
1437 | 1436 | ||
@@ -1439,7 +1438,7 @@ static void mtk_pending_work(struct work_struct *work) | |||
1439 | 1438 | ||
1440 | /* stop all devices to make sure that dma is properly shut down */ | 1439 | /* stop all devices to make sure that dma is properly shut down */ |
1441 | for (i = 0; i < MTK_MAC_COUNT; i++) { | 1440 | for (i = 0; i < MTK_MAC_COUNT; i++) { |
1442 | if (!netif_oper_up(eth->netdev[i])) | 1441 | if (!eth->netdev[i]) |
1443 | continue; | 1442 | continue; |
1444 | mtk_stop(eth->netdev[i]); | 1443 | mtk_stop(eth->netdev[i]); |
1445 | __set_bit(i, &restart); | 1444 | __set_bit(i, &restart); |
@@ -1464,15 +1463,13 @@ static int mtk_cleanup(struct mtk_eth *eth) | |||
1464 | int i; | 1463 | int i; |
1465 | 1464 | ||
1466 | for (i = 0; i < MTK_MAC_COUNT; i++) { | 1465 | for (i = 0; i < MTK_MAC_COUNT; i++) { |
1467 | struct mtk_mac *mac = netdev_priv(eth->netdev[i]); | ||
1468 | |||
1469 | if (!eth->netdev[i]) | 1466 | if (!eth->netdev[i]) |
1470 | continue; | 1467 | continue; |
1471 | 1468 | ||
1472 | unregister_netdev(eth->netdev[i]); | 1469 | unregister_netdev(eth->netdev[i]); |
1473 | free_netdev(eth->netdev[i]); | 1470 | free_netdev(eth->netdev[i]); |
1474 | cancel_work_sync(&mac->pending_work); | ||
1475 | } | 1471 | } |
1472 | cancel_work_sync(ð->pending_work); | ||
1476 | 1473 | ||
1477 | return 0; | 1474 | return 0; |
1478 | } | 1475 | } |
@@ -1660,7 +1657,6 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) | |||
1660 | mac->id = id; | 1657 | mac->id = id; |
1661 | mac->hw = eth; | 1658 | mac->hw = eth; |
1662 | mac->of_node = np; | 1659 | mac->of_node = np; |
1663 | INIT_WORK(&mac->pending_work, mtk_pending_work); | ||
1664 | 1660 | ||
1665 | mac->hw_stats = devm_kzalloc(eth->dev, | 1661 | mac->hw_stats = devm_kzalloc(eth->dev, |
1666 | sizeof(*mac->hw_stats), | 1662 | sizeof(*mac->hw_stats), |
@@ -1762,6 +1758,7 @@ static int mtk_probe(struct platform_device *pdev) | |||
1762 | 1758 | ||
1763 | eth->dev = &pdev->dev; | 1759 | eth->dev = &pdev->dev; |
1764 | eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE); | 1760 | eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE); |
1761 | INIT_WORK(ð->pending_work, mtk_pending_work); | ||
1765 | 1762 | ||
1766 | err = mtk_hw_init(eth); | 1763 | err = mtk_hw_init(eth); |
1767 | if (err) | 1764 | if (err) |
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h index 48a5292c8ed8..eed626d56ea4 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h | |||
@@ -363,6 +363,7 @@ struct mtk_rx_ring { | |||
363 | * @clk_gp1: The gmac1 clock | 363 | * @clk_gp1: The gmac1 clock |
364 | * @clk_gp2: The gmac2 clock | 364 | * @clk_gp2: The gmac2 clock |
365 | * @mii_bus: If there is a bus we need to create an instance for it | 365 | * @mii_bus: If there is a bus we need to create an instance for it |
366 | * @pending_work: The workqueue used to reset the dma ring | ||
366 | */ | 367 | */ |
367 | 368 | ||
368 | struct mtk_eth { | 369 | struct mtk_eth { |
@@ -389,6 +390,7 @@ struct mtk_eth { | |||
389 | struct clk *clk_gp1; | 390 | struct clk *clk_gp1; |
390 | struct clk *clk_gp2; | 391 | struct clk *clk_gp2; |
391 | struct mii_bus *mii_bus; | 392 | struct mii_bus *mii_bus; |
393 | struct work_struct pending_work; | ||
392 | }; | 394 | }; |
393 | 395 | ||
394 | /* struct mtk_mac - the structure that holds the info about the MACs of the | 396 | /* struct mtk_mac - the structure that holds the info about the MACs of the |
@@ -398,7 +400,6 @@ struct mtk_eth { | |||
398 | * @hw: Backpointer to our main datastruture | 400 | * @hw: Backpointer to our main datastruture |
399 | * @hw_stats: Packet statistics counter | 401 | * @hw_stats: Packet statistics counter |
400 | * @phy_dev: The attached PHY if available | 402 | * @phy_dev: The attached PHY if available |
401 | * @pending_work: The workqueue used to reset the dma ring | ||
402 | */ | 403 | */ |
403 | struct mtk_mac { | 404 | struct mtk_mac { |
404 | int id; | 405 | int id; |
@@ -406,7 +407,6 @@ struct mtk_mac { | |||
406 | struct mtk_eth *hw; | 407 | struct mtk_eth *hw; |
407 | struct mtk_hw_stats *hw_stats; | 408 | struct mtk_hw_stats *hw_stats; |
408 | struct phy_device *phy_dev; | 409 | struct phy_device *phy_dev; |
409 | struct work_struct pending_work; | ||
410 | }; | 410 | }; |
411 | 411 | ||
412 | /* the struct describing the SoC. these are declared in the soc_xyz.c files */ | 412 | /* the struct describing the SoC. these are declared in the soc_xyz.c files */ |