Hi, In this patch, I don't change the routine of dm9000_phy_write(). I just abstract the real phy operation from dm9000_phy_write() to make a new function dm9000_phy_write_reg(), which contains no lock.
It is called in dm9000_phy_write() or dm9000_init_dm9000(). Since dm9000_timeout() holds the main spinlock through the entire routine, dm9000_phy_write_reg() called in this routine is protected from another thread. I think there is no need to acquire any locks. The only problem is dm9000_init_dm9000() may be called in dm9000_open(). If another thread calls dm9000_open() in timeout may cause race condition. dm9000_init_dm9000() needs lock to avoid race condition, did you mean that? Thanks!