[email protected] writes: > From: Sneha Narnakaje <[email protected]> > > This patch fixes the NETDEV WATCHDOG timeout issue with dm9000 ethernet > driver on DM355, while using the NFS as root filesystem. > In the patch I have replaced the spin_lock/spin_unlock calls with dm9000 > specific disable/enable interrupt calls, in the dm9000 hard_start_xmit > routine. Though it seems to be a generic issue discussed in the netdev list, > this fix may not be a permanent solution, yet we can proceed with other > drivers > on DM355. > I have also enabled the dm9000 option in the DM355 default configuration. > > Signed-off-by: Sneha Narnakaje <[email protected]> > --- > arch/arm/configs/davinci_dm355_defconfig | 6 ++++-- > drivers/net/dm9000.c | 6 ++++-- > 2 files changed, 8 insertions(+), 4 deletions(-) > > diff --git a/arch/arm/configs/davinci_dm355_defconfig > b/arch/arm/configs/davinci_dm355_defconfig > index ac303e2..e104c41 100644 > --- a/arch/arm/configs/davinci_dm355_defconfig > +++ b/arch/arm/configs/davinci_dm355_defconfig > @@ -494,11 +494,13 @@ CONFIG_TUN=m > # CONFIG_VETH is not set > # CONFIG_PHYLIB is not set > CONFIG_NET_ETHERNET=y > -# CONFIG_MII is not set > +CONFIG_MII=y > # CONFIG_AX88796 is not set > # CONFIG_SMC91X is not set > # CONFIG_TI_DAVINCI_EMAC is not set > -# CONFIG_DM9000 is not set > +CONFIG_DM9000=y > +CONFIG_DM9000_DEBUGLEVEL=4 > +# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set > # CONFIG_IBM_NEW_EMAC_ZMII is not set > # CONFIG_IBM_NEW_EMAC_RGMII is not set > # CONFIG_IBM_NEW_EMAC_TAH is not set > diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c > index 5a9083e..ff7e24a 100644 > --- a/drivers/net/dm9000.c > +++ b/drivers/net/dm9000.c > @@ -758,7 +758,8 @@ dm9000_start_xmit(struct sk_buff *skb, struct net_device > *dev) > if (db->tx_pkt_cnt > 1) > return 1; > > - spin_lock_irqsave(&db->lock, flags); > + /* Disable all interrupts */ > + iow(db, DM9000_IMR, IMR_PAR);
I didn't look at all the locking in this driver, but for correctness, I'm guessing you probably need to do the dm9000-specific disable in addition to the spin_lock. That way you only add the extra interrupt disable, and don't change the locking. > /* Move data to DM9000 TX RAM */ > writeb(DM9000_MWCMD, db->io_addr); > @@ -783,7 +784,8 @@ dm9000_start_xmit(struct sk_buff *skb, struct net_device > *dev) > netif_stop_queue(dev); > } > > - spin_unlock_irqrestore(&db->lock, flags); > + /* Re-enable interrupt */ > + iow(db, DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM); Ditto. > /* free this SKB */ > dev_kfree_skb(skb); > -- > 1.5.2.5 > > _______________________________________________ > Davinci-linux-open-source mailing list > [email protected] > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
