Skip to content

Commit

Permalink
b43: Workaround circular locking in hw-tkip key update callback
Browse files Browse the repository at this point in the history
The TKIP key update callback is called from the RX path, where the driver
mutex is already locked. This results in a circular locking bug.
Avoid this by removing the lock.

Johannes noted that there is a separate bug: The callback still breaks on SDIO
hardware, because SDIO hardware access needs to sleep, but we are not allowed
to sleep in the callback due to mac80211's RCU locking.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Tested-by: Larry Finger <Larry.Finger@lwfinger.net>
Reported-by: kecsa@kutfo.hit.bme.hu
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: stable <stable@kernel.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Michael Buesch authored and John W. Linville committed Jan 25, 2010
1 parent 6589651 commit 96869a3
Showing 1 changed file with 5 additions and 8 deletions.
13 changes: 5 additions & 8 deletions drivers/net/wireless/b43/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -856,22 +856,19 @@ static void b43_op_update_tkip_key(struct ieee80211_hw *hw,
if (B43_WARN_ON(!modparam_hwtkip))
return;

mutex_lock(&wl->mutex);

/* This is only called from the RX path through mac80211, where
* our mutex is already locked. */
B43_WARN_ON(!mutex_is_locked(&wl->mutex));
dev = wl->current_dev;
if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
goto out_unlock;
B43_WARN_ON(!dev || b43_status(dev) < B43_STAT_INITIALIZED);

keymac_write(dev, index, NULL); /* First zero out mac to avoid race */

rx_tkip_phase1_write(dev, index, iv32, phase1key);
/* only pairwise TKIP keys are supported right now */
if (WARN_ON(!sta))
goto out_unlock;
return;
keymac_write(dev, index, sta->addr);

out_unlock:
mutex_unlock(&wl->mutex);
}

static void do_key_write(struct b43_wldev *dev,
Expand Down

0 comments on commit 96869a3

Please sign in to comment.