bumped up to -pre2.

locking rework of hfa384x.c is now in!  Things should be MUCH better.
origin
solomon 2002-08-02 21:27:31 +00:00
parent d4e482e2d2
commit dd17617d6c
3 changed files with 35 additions and 11 deletions

View File

@ -41,6 +41,9 @@
* Intersil Corporation as part of PRISM(R) chipset product development.
*
* --------------------------------------------------------------------
-pre2
- Restructured the driver locking. SMP should be MUCH better now.
- Stripped out more dead code. (mainly FID_STACK)
- Fix an skb access after we call netif_rx
- Fixes for XScale CPUs.
- Added added a MiniUSB ident info

View File

@ -1,7 +1,7 @@
WLAN_VERSION=0
WLAN_PATCHLEVEL=1
WLAN_SUBLEVEL=15
WLAN_EXTRAVERSION=-pre1
WLAN_EXTRAVERSION=-pre2
LINUX_SRC=/usr/src/linux
WLAN_TARGET_ARCH=
PCMCIA_SRC=

View File

@ -1696,6 +1696,8 @@ int hfa384x_cmd_notify(hfa384x_t *hw, UINT16 reclaim, UINT16 fid,
cmd.parm1 = 0;
cmd.parm2 = 0;
spin_lock(&hw->cmdlock);
/* Copy the record to FID */
result = hfa384x_copy_to_bap(hw, HFA384x_BAP_PROC, hw->infofid, 0, buf, len);
if ( result ) {
@ -1709,6 +1711,8 @@ int hfa384x_cmd_notify(hfa384x_t *hw, UINT16 reclaim, UINT16 fid,
result = hfa384x_docmd_wait(hw, &cmd);
failed:
spin_unlock(&hw->cmdlock);
DBFEXIT;
return result;
}
@ -1791,6 +1795,8 @@ int hfa384x_cmd_access(hfa384x_t *hw, UINT16 write, UINT16 rid,
DBFENTER;
spin_lock(&hw->cmdlock);
if (write) {
rec.rid = host2hfa384x_16(rid);
rec.reclen = host2hfa384x_16((len/2) + 1); /* note conversion to words, +1 for rid field */
@ -1838,6 +1844,7 @@ int hfa384x_cmd_access(hfa384x_t *hw, UINT16 write, UINT16 rid,
}
fail:
spin_unlock(&hw->cmdlock);
DBFEXIT;
return result;
}
@ -2301,6 +2308,10 @@ int hfa384x_copy_from_bap(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset,
if ( i > 0 ) udelay(2);
i++;
} while ( i < BAP_TIMEOUT && HFA384x_OFFSET_ISBUSY(reg));
/* Release lock */
spin_unlock_irqrestore( &(hw->baplock), flags);
if ( HFA384x_OFFSET_ISBUSY(reg) ){
/* If timeout, return -ETIMEDOUT */
result = reg;
@ -2319,8 +2330,6 @@ int hfa384x_copy_from_bap(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset,
d[len-1] = ((UINT8*)(&reg))[0];
}
}
/* Release lock */
spin_unlock_irqrestore( &(hw->baplock), flags);
}
if (result) {
WLAN_LOG_DEBUG3(1,
@ -2408,6 +2417,10 @@ int hfa384x_copy_to_bap4(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset,
if ( i > 0 ) udelay(2);
i++;
} while ( i < BAP_TIMEOUT && HFA384x_OFFSET_ISBUSY(reg));
/* Release lock */
spin_unlock_irqrestore( &(hw->baplock), flags);
if ( HFA384x_OFFSET_ISBUSY(reg) ){
/* If timeout, return reg */
result = reg;
@ -2490,8 +2503,7 @@ int hfa384x_copy_to_bap4(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset,
// printk(KERN_DEBUG "ctb2 %d id %04x o %d %d %d %d %d\n", bap, id, offset, len1, len2, len3, len4);
}
/* Release lock */
spin_unlock_irqrestore( &(hw->baplock), flags);
}
if (result)
@ -2667,16 +2679,17 @@ hfa384x_copy_to_aux(
int hfa384x_docmd_wait( hfa384x_t *hw, hfa384x_metacmd_t *cmd)
{
int result = -ETIMEDOUT;
wlan_flags_t flags;
int uselock = 0;
UINT16 reg = 0;
UINT16 counter;
DBFENTER;
/* acquire the lock */
spin_lock_irqsave(&(hw->cmdlock), flags);
/* acquire the lock iff we're not already locked. */
if (!spin_is_locked(&hw->cmdlock)) {
uselock = 1;
spin_lock(&hw->cmdlock);
}
hw->cmdflag = 0;
hw->cmddata = cmd;
@ -2748,7 +2761,10 @@ int hfa384x_docmd_wait( hfa384x_t *hw, hfa384x_metacmd_t *cmd)
failed:
hw->cmdflag = 0;
hw->cmddata = NULL;
spin_unlock_irqrestore( &(hw->cmdlock), flags);
/* unlock iff we locked when we entered */
if (uselock)
spin_unlock(&hw->cmdlock);
DBFEXIT;
return result;
@ -3248,6 +3264,9 @@ int hfa384x_drvr_txframe(hfa384x_t *hw, struct sk_buff *skb, p80211_hdr_t *p8021
return 4;
}
/* now let's get the cmdlock */
spin_lock(&hw->cmdlock);
/* Copy descriptor+payload to FID */
if (p80211_wep->enabled) {
result = hfa384x_copy_to_bap4(hw, HFA384x_BAP_PROC, fid, 0,
@ -3292,6 +3311,8 @@ int hfa384x_drvr_txframe(hfa384x_t *hw, struct sk_buff *skb, p80211_hdr_t *p8021
/* indicate we haven't any buffers, int_alloc will clear */
result = txfid_queue_empty(hw);
failed:
spin_unlock(&hw->cmdlock);
DBFEXIT;
return result;
}