--- linux-2.4.20/drivers/net/wireless/hermes.h 2002-08-02 20:39:44.000000000 -0400 +++ linux-2.4.20-devel/drivers/net/wireless/hermes.h 2003-01-03 15:16:39.000000000 -0500 @@ -275,6 +275,9 @@ u16 inten; /* Which interrupts should be enabled? */ + /* Lock used in hermes_bap_seek */ + spinlock_t baplock; + #ifdef HERMES_DEBUG_BUFFER struct hermes_debug_entry dbuf[HERMES_DEBUG_BUFSIZE]; unsigned long dbufp; --- linux-2.4.20/drivers/net/wireless/hermes.c 2002-08-02 20:39:44.000000000 -0400 +++ linux-2.4.20-devel/drivers/net/wireless/hermes.c 2003-01-03 15:21:45.000000000 -0500 @@ -350,11 +350,15 @@ int oreg = bap ? HERMES_OFFSET1 : HERMES_OFFSET0; int k; u16 reg; + unsigned long flags; /* Paranoia.. */ if ( (offset > HERMES_BAP_OFFSET_MAX) || (offset % 2) ) return -EINVAL; + /* Without it, network connection errors occur.. */ + spin_lock_irqsave(&(hw->baplock), flags); + k = HERMES_BAP_BUSY_TIMEOUT; reg = hermes_read_reg(hw, oreg); while ((reg & HERMES_OFFSET_BUSY) && k) { @@ -376,7 +380,9 @@ } #endif - if (reg & HERMES_OFFSET_BUSY) + spin_unlock_irqrestore(&(hw->baplock), flags); + + if (reg & HERMES_OFFSET_BUSY) return -ETIMEDOUT; /* Now we actually set up the transfer */