--- linux-2.5.54/drivers/net/wireless/hermes.h 2003-01-01 22:21:02.000000000 -0500 +++ linux-2.5.54-devel/drivers/net/wireless/hermes.h 2003-01-03 15:32:33.000000000 -0500 @@ -288,6 +288,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.5.54/drivers/net/wireless/hermes.c 2003-01-01 22:21:13.000000000 -0500 +++ linux-2.5.54-devel/drivers/net/wireless/hermes.c 2003-01-03 15:34:23.000000000 -0500 @@ -342,11 +342,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) { @@ -368,6 +372,8 @@ } #endif + spin_unlock_irqrestore(&(hw->baplock), flags); + if (reg & HERMES_OFFSET_BUSY) return -ETIMEDOUT;