[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

Reply via email to