#define STMMAC_COAL_TIMER(x) (jiffies + usecs_to_jiffies(x))
+static struct workqueue_struct *moniter_tx_wq;
+static struct delayed_work moniter_tx_worker;
/**
* stmmac_verify_args - verify the driver parameters.
* Description: it checks the driver parameters and set a default in case of
priv->hw->desc->init_tx_desc(&priv->dma_tx[i],
priv->mode,
(i == DMA_TX_SIZE - 1));
- priv->dirty_tx = 0;
- priv->cur_tx = 0;
+ //priv->dirty_tx = 0;
+ //priv->cur_tx = 0;
+ priv->cur_tx = priv->dirty_tx;
netdev_reset_queue(priv->dev);
priv->hw->dma->start_tx(priv->ioaddr);
napi_enable(&priv->napi);
netif_start_queue(dev);
+ queue_delayed_work(moniter_tx_wq, &moniter_tx_worker, HZ);
return 0;
lpiirq_error:
* netdev structure and arrange for the device to be reset to a sane state
* in order to transmit a new packet.
*/
+unsigned int timeout_err;
static void stmmac_tx_timeout(struct net_device *dev)
{
struct stmmac_priv *priv = netdev_priv(dev);
/* Clear Tx resources and restart transmitting again */
stmmac_tx_err(priv);
+ timeout_err = 1;
}
/**
return 0;
}
+struct stmmac_priv *priv_monitor;
+static void moniter_tx_handler(struct work_struct *work)
+{
+ if (priv_monitor) {
+ if (timeout_err) {
+ pr_info("recover eth\n");
+ stmmac_release(priv_monitor->dev);
+ stmmac_open(priv_monitor->dev);
+ timeout_err = 0;
+ }
+ } else {
+ pr_info("device not init yet!\n");
+ }
+ queue_delayed_work(moniter_tx_wq, &moniter_tx_worker, HZ);
+}
/**
* stmmac_dvr_probe
* @device: device pointer
struct net_device *ndev = NULL;
struct stmmac_priv *priv;
+ moniter_tx_wq = create_singlethread_workqueue("eth_moniter_tx_wq");
+ INIT_DELAYED_WORK(&moniter_tx_worker, moniter_tx_handler);
ndev = alloc_etherdev(sizeof(struct stmmac_priv));
if (!ndev)
return -ENOMEM;
ret = gmac_create_sysfs(
mdiobus_get_phy(priv->mii, priv->plat->phy_addr), priv->ioaddr);
#endif
+ priv_monitor = priv;
return ret;
error_netdev_register:
struct stmmac_priv *priv = netdev_priv(ndev);
unsigned long flags;
+ cancel_delayed_work_sync(&moniter_tx_worker);
if (!ndev || !netif_running(ndev))
return 0;
stmmac_init_tx_coalesce(priv);
stmmac_set_rx_mode(ndev);
-
#ifdef CONFIG_AMLOGIC_ETH_PRIVE
netif_device_attach(ndev);
#endif
if (priv->phydev)
phy_start(priv->phydev);
+ queue_delayed_work(moniter_tx_wq, &moniter_tx_worker, HZ);
+ timeout_err = 1;
return 0;
}
EXPORT_SYMBOL_GPL(stmmac_resume);