X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/2a9dd36f43d475c50f0fd98c6febee0e5c6fd02c..240961d891ae8b4a0c3af6c3e2f7d1797216bee8:/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c index a57b6d46f..31c8ee489 100644 --- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c +++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c @@ -454,6 +454,12 @@ static void ag71xx_dma_reset(struct ag71xx *ag) ag71xx_wr(ag, AG71XX_REG_RX_CTRL, 0); ag71xx_wr(ag, AG71XX_REG_TX_CTRL, 0); + /* + * give the hardware some time to really stop all rx/tx activity + * clearing the descriptors too early causes random memory corruption + */ + mdelay(1); + /* clear descriptor addresses */ ag71xx_wr(ag, AG71XX_REG_TX_DESC, 0); ag71xx_wr(ag, AG71XX_REG_RX_DESC, 0); @@ -567,12 +573,16 @@ static void ag71xx_hw_stop(struct ag71xx *ag) static int ag71xx_open(struct net_device *dev) { struct ag71xx *ag = netdev_priv(dev); + struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); int ret; ret = ag71xx_rings_init(ag); if (ret) goto err; + if (pdata->is_ar724x) + ag71xx_hw_init(ag); + napi_enable(&ag->napi); netif_carrier_off(dev); @@ -675,7 +685,6 @@ static netdev_tx_t ag71xx_hard_start_xmit(struct sk_buff *skb, static int ag71xx_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_data; struct ag71xx *ag = netdev_priv(dev); int ret; @@ -707,7 +716,7 @@ static int ag71xx_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (ag->phy_dev == NULL) break; - return phy_mii_ioctl(ag->phy_dev, data, cmd); + return phy_mii_ioctl(ag->phy_dev, ifr, cmd); default: break; @@ -981,7 +990,7 @@ static const struct net_device_ops ag71xx_netdev_ops = { #endif }; -static int __init ag71xx_probe(struct platform_device *pdev) +static int __devinit ag71xx_probe(struct platform_device *pdev) { struct net_device *dev; struct resource *res; @@ -1113,7 +1122,7 @@ static int __init ag71xx_probe(struct platform_device *pdev) return err; } -static int __exit ag71xx_remove(struct platform_device *pdev) +static int __devexit ag71xx_remove(struct platform_device *pdev) { struct net_device *dev = platform_get_drvdata(pdev);