aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2006-06-27 15:38:40 -0400
committerJohn W. Linville <linville@tuxdriver.com>2006-07-10 14:19:41 -0400
commitefa6a370216f1816456b49aac03295071720f7eb (patch)
treea29c205e603d96ad3b4ef34b274335a851672aac /drivers/net/wireless/bcm43xx/bcm43xx_wx.c
parentb312d799b324e895745ffe148def234fc60d5b74 (diff)
[PATCH] bcm43xx: opencoded locking
As many people don't seem to like the locking "obfuscation" in the bcm43xx driver, this patch removes it. Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/bcm43xx/bcm43xx_wx.c')
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_wx.c121
1 files changed, 67 insertions, 54 deletions
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
index 5c36e29efff7..ebe2a8469a78 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
@@ -56,12 +56,11 @@ static int bcm43xx_wx_get_name(struct net_device *net_dev,
56{ 56{
57 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 57 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
58 int i; 58 int i;
59 unsigned long flags;
60 struct bcm43xx_phyinfo *phy; 59 struct bcm43xx_phyinfo *phy;
61 char suffix[7] = { 0 }; 60 char suffix[7] = { 0 };
62 int have_a = 0, have_b = 0, have_g = 0; 61 int have_a = 0, have_b = 0, have_g = 0;
63 62
64 bcm43xx_lock_irqsafe(bcm, flags); 63 mutex_lock(&bcm->mutex);
65 for (i = 0; i < bcm->nr_80211_available; i++) { 64 for (i = 0; i < bcm->nr_80211_available; i++) {
66 phy = &(bcm->core_80211_ext[i].phy); 65 phy = &(bcm->core_80211_ext[i].phy);
67 switch (phy->type) { 66 switch (phy->type) {
@@ -77,7 +76,7 @@ static int bcm43xx_wx_get_name(struct net_device *net_dev,
77 assert(0); 76 assert(0);
78 } 77 }
79 } 78 }
80 bcm43xx_unlock_irqsafe(bcm, flags); 79 mutex_unlock(&bcm->mutex);
81 80
82 i = 0; 81 i = 0;
83 if (have_a) { 82 if (have_a) {
@@ -111,7 +110,9 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev,
111 int freq; 110 int freq;
112 int err = -EINVAL; 111 int err = -EINVAL;
113 112
114 bcm43xx_lock_irqsafe(bcm, flags); 113 mutex_lock(&bcm->mutex);
114 spin_lock_irqsave(&bcm->irq_lock, flags);
115
115 if ((data->freq.m >= 0) && (data->freq.m <= 1000)) { 116 if ((data->freq.m >= 0) && (data->freq.m <= 1000)) {
116 channel = data->freq.m; 117 channel = data->freq.m;
117 freq = bcm43xx_channel_to_freq(bcm, channel); 118 freq = bcm43xx_channel_to_freq(bcm, channel);
@@ -131,7 +132,8 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev,
131 err = 0; 132 err = 0;
132 } 133 }
133out_unlock: 134out_unlock:
134 bcm43xx_unlock_irqsafe(bcm, flags); 135 spin_unlock_irqrestore(&bcm->irq_lock, flags);
136 mutex_unlock(&bcm->mutex);
135 137
136 return err; 138 return err;
137} 139}
@@ -143,11 +145,10 @@ static int bcm43xx_wx_get_channelfreq(struct net_device *net_dev,
143{ 145{
144 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 146 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
145 struct bcm43xx_radioinfo *radio; 147 struct bcm43xx_radioinfo *radio;
146 unsigned long flags;
147 int err = -ENODEV; 148 int err = -ENODEV;
148 u16 channel; 149 u16 channel;
149 150
150 bcm43xx_lock_irqsafe(bcm, flags); 151 mutex_lock(&bcm->mutex);
151 radio = bcm43xx_current_radio(bcm); 152 radio = bcm43xx_current_radio(bcm);
152 channel = radio->channel; 153 channel = radio->channel;
153 if (channel == 0xFF) { 154 if (channel == 0xFF) {
@@ -162,7 +163,7 @@ static int bcm43xx_wx_get_channelfreq(struct net_device *net_dev,
162 163
163 err = 0; 164 err = 0;
164out_unlock: 165out_unlock:
165 bcm43xx_unlock_irqsafe(bcm, flags); 166 mutex_unlock(&bcm->mutex);
166 167
167 return err; 168 return err;
168} 169}
@@ -180,13 +181,15 @@ static int bcm43xx_wx_set_mode(struct net_device *net_dev,
180 if (mode == IW_MODE_AUTO) 181 if (mode == IW_MODE_AUTO)
181 mode = BCM43xx_INITIAL_IWMODE; 182 mode = BCM43xx_INITIAL_IWMODE;
182 183
183 bcm43xx_lock_irqsafe(bcm, flags); 184 mutex_lock(&bcm->mutex);
185 spin_lock_irqsave(&bcm->irq_lock, flags);
184 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { 186 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) {
185 if (bcm->ieee->iw_mode != mode) 187 if (bcm->ieee->iw_mode != mode)
186 bcm43xx_set_iwmode(bcm, mode); 188 bcm43xx_set_iwmode(bcm, mode);
187 } else 189 } else
188 bcm->ieee->iw_mode = mode; 190 bcm->ieee->iw_mode = mode;
189 bcm43xx_unlock_irqsafe(bcm, flags); 191 spin_unlock_irqrestore(&bcm->irq_lock, flags);
192 mutex_unlock(&bcm->mutex);
190 193
191 return 0; 194 return 0;
192} 195}
@@ -197,11 +200,10 @@ static int bcm43xx_wx_get_mode(struct net_device *net_dev,
197 char *extra) 200 char *extra)
198{ 201{
199 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 202 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
200 unsigned long flags;
201 203
202 bcm43xx_lock_irqsafe(bcm, flags); 204 mutex_lock(&bcm->mutex);
203 data->mode = bcm->ieee->iw_mode; 205 data->mode = bcm->ieee->iw_mode;
204 bcm43xx_unlock_irqsafe(bcm, flags); 206 mutex_unlock(&bcm->mutex);
205 207
206 return 0; 208 return 0;
207} 209}
@@ -214,7 +216,6 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev,
214 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 216 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
215 struct iw_range *range = (struct iw_range *)extra; 217 struct iw_range *range = (struct iw_range *)extra;
216 const struct ieee80211_geo *geo; 218 const struct ieee80211_geo *geo;
217 unsigned long flags;
218 int i, j; 219 int i, j;
219 struct bcm43xx_phyinfo *phy; 220 struct bcm43xx_phyinfo *phy;
220 221
@@ -254,7 +255,7 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev,
254 IW_ENC_CAPA_CIPHER_TKIP | 255 IW_ENC_CAPA_CIPHER_TKIP |
255 IW_ENC_CAPA_CIPHER_CCMP; 256 IW_ENC_CAPA_CIPHER_CCMP;
256 257
257 bcm43xx_lock_irqsafe(bcm, flags); 258 mutex_lock(&bcm->mutex);
258 phy = bcm43xx_current_phy(bcm); 259 phy = bcm43xx_current_phy(bcm);
259 260
260 range->num_bitrates = 0; 261 range->num_bitrates = 0;
@@ -301,7 +302,7 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev,
301 } 302 }
302 range->num_frequency = j; 303 range->num_frequency = j;
303 304
304 bcm43xx_unlock_irqsafe(bcm, flags); 305 mutex_unlock(&bcm->mutex);
305 306
306 return 0; 307 return 0;
307} 308}
@@ -314,11 +315,11 @@ static int bcm43xx_wx_set_nick(struct net_device *net_dev,
314 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 315 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
315 size_t len; 316 size_t len;
316 317
317 bcm43xx_lock_noirq(bcm); 318 mutex_lock(&bcm->mutex);
318 len = min((size_t)data->data.length, (size_t)IW_ESSID_MAX_SIZE); 319 len = min((size_t)data->data.length, (size_t)IW_ESSID_MAX_SIZE);
319 memcpy(bcm->nick, extra, len); 320 memcpy(bcm->nick, extra, len);
320 bcm->nick[len] = '\0'; 321 bcm->nick[len] = '\0';
321 bcm43xx_unlock_noirq(bcm); 322 mutex_unlock(&bcm->mutex);
322 323
323 return 0; 324 return 0;
324} 325}
@@ -331,12 +332,12 @@ static int bcm43xx_wx_get_nick(struct net_device *net_dev,
331 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 332 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
332 size_t len; 333 size_t len;
333 334
334 bcm43xx_lock_noirq(bcm); 335 mutex_lock(&bcm->mutex);
335 len = strlen(bcm->nick) + 1; 336 len = strlen(bcm->nick) + 1;
336 memcpy(extra, bcm->nick, len); 337 memcpy(extra, bcm->nick, len);
337 data->data.length = (__u16)len; 338 data->data.length = (__u16)len;
338 data->data.flags = 1; 339 data->data.flags = 1;
339 bcm43xx_unlock_noirq(bcm); 340 mutex_unlock(&bcm->mutex);
340 341
341 return 0; 342 return 0;
342} 343}
@@ -350,7 +351,8 @@ static int bcm43xx_wx_set_rts(struct net_device *net_dev,
350 unsigned long flags; 351 unsigned long flags;
351 int err = -EINVAL; 352 int err = -EINVAL;
352 353
353 bcm43xx_lock_irqsafe(bcm, flags); 354 mutex_lock(&bcm->mutex);
355 spin_lock_irqsave(&bcm->irq_lock, flags);
354 if (data->rts.disabled) { 356 if (data->rts.disabled) {
355 bcm->rts_threshold = BCM43xx_MAX_RTS_THRESHOLD; 357 bcm->rts_threshold = BCM43xx_MAX_RTS_THRESHOLD;
356 err = 0; 358 err = 0;
@@ -361,7 +363,8 @@ static int bcm43xx_wx_set_rts(struct net_device *net_dev,
361 err = 0; 363 err = 0;
362 } 364 }
363 } 365 }
364 bcm43xx_unlock_irqsafe(bcm, flags); 366 spin_unlock_irqrestore(&bcm->irq_lock, flags);
367 mutex_unlock(&bcm->mutex);
365 368
366 return err; 369 return err;
367} 370}
@@ -372,13 +375,12 @@ static int bcm43xx_wx_get_rts(struct net_device *net_dev,
372 char *extra) 375 char *extra)
373{ 376{
374 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 377 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
375 unsigned long flags;
376 378
377 bcm43xx_lock_irqsafe(bcm, flags); 379 mutex_lock(&bcm->mutex);
378 data->rts.value = bcm->rts_threshold; 380 data->rts.value = bcm->rts_threshold;
379 data->rts.fixed = 0; 381 data->rts.fixed = 0;
380 data->rts.disabled = (bcm->rts_threshold == BCM43xx_MAX_RTS_THRESHOLD); 382 data->rts.disabled = (bcm->rts_threshold == BCM43xx_MAX_RTS_THRESHOLD);
381 bcm43xx_unlock_irqsafe(bcm, flags); 383 mutex_unlock(&bcm->mutex);
382 384
383 return 0; 385 return 0;
384} 386}
@@ -392,7 +394,8 @@ static int bcm43xx_wx_set_frag(struct net_device *net_dev,
392 unsigned long flags; 394 unsigned long flags;
393 int err = -EINVAL; 395 int err = -EINVAL;
394 396
395 bcm43xx_lock_irqsafe(bcm, flags); 397 mutex_lock(&bcm->mutex);
398 spin_lock_irqsave(&bcm->irq_lock, flags);
396 if (data->frag.disabled) { 399 if (data->frag.disabled) {
397 bcm->ieee->fts = MAX_FRAG_THRESHOLD; 400 bcm->ieee->fts = MAX_FRAG_THRESHOLD;
398 err = 0; 401 err = 0;
@@ -403,7 +406,8 @@ static int bcm43xx_wx_set_frag(struct net_device *net_dev,
403 err = 0; 406 err = 0;
404 } 407 }
405 } 408 }
406 bcm43xx_unlock_irqsafe(bcm, flags); 409 spin_unlock_irqrestore(&bcm->irq_lock, flags);
410 mutex_unlock(&bcm->mutex);
407 411
408 return err; 412 return err;
409} 413}
@@ -414,13 +418,12 @@ static int bcm43xx_wx_get_frag(struct net_device *net_dev,
414 char *extra) 418 char *extra)
415{ 419{
416 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 420 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
417 unsigned long flags;
418 421
419 bcm43xx_lock_irqsafe(bcm, flags); 422 mutex_lock(&bcm->mutex);
420 data->frag.value = bcm->ieee->fts; 423 data->frag.value = bcm->ieee->fts;
421 data->frag.fixed = 0; 424 data->frag.fixed = 0;
422 data->frag.disabled = (bcm->ieee->fts == MAX_FRAG_THRESHOLD); 425 data->frag.disabled = (bcm->ieee->fts == MAX_FRAG_THRESHOLD);
423 bcm43xx_unlock_irqsafe(bcm, flags); 426 mutex_unlock(&bcm->mutex);
424 427
425 return 0; 428 return 0;
426} 429}
@@ -442,7 +445,8 @@ static int bcm43xx_wx_set_xmitpower(struct net_device *net_dev,
442 return -EOPNOTSUPP; 445 return -EOPNOTSUPP;
443 } 446 }
444 447
445 bcm43xx_lock_irqsafe(bcm, flags); 448 mutex_lock(&bcm->mutex);
449 spin_lock_irqsave(&bcm->irq_lock, flags);
446 if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) 450 if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED)
447 goto out_unlock; 451 goto out_unlock;
448 radio = bcm43xx_current_radio(bcm); 452 radio = bcm43xx_current_radio(bcm);
@@ -466,7 +470,8 @@ static int bcm43xx_wx_set_xmitpower(struct net_device *net_dev,
466 err = 0; 470 err = 0;
467 471
468out_unlock: 472out_unlock:
469 bcm43xx_unlock_irqsafe(bcm, flags); 473 spin_unlock_irqrestore(&bcm->irq_lock, flags);
474 mutex_unlock(&bcm->mutex);
470 475
471 return err; 476 return err;
472} 477}
@@ -478,10 +483,9 @@ static int bcm43xx_wx_get_xmitpower(struct net_device *net_dev,
478{ 483{
479 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 484 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
480 struct bcm43xx_radioinfo *radio; 485 struct bcm43xx_radioinfo *radio;
481 unsigned long flags;
482 int err = -ENODEV; 486 int err = -ENODEV;
483 487
484 bcm43xx_lock_irqsafe(bcm, flags); 488 mutex_lock(&bcm->mutex);
485 if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) 489 if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED)
486 goto out_unlock; 490 goto out_unlock;
487 radio = bcm43xx_current_radio(bcm); 491 radio = bcm43xx_current_radio(bcm);
@@ -493,7 +497,7 @@ static int bcm43xx_wx_get_xmitpower(struct net_device *net_dev,
493 497
494 err = 0; 498 err = 0;
495out_unlock: 499out_unlock:
496 bcm43xx_unlock_irqsafe(bcm, flags); 500 mutex_unlock(&bcm->mutex);
497 501
498 return err; 502 return err;
499} 503}
@@ -580,7 +584,8 @@ static int bcm43xx_wx_set_interfmode(struct net_device *net_dev,
580 return -EINVAL; 584 return -EINVAL;
581 } 585 }
582 586
583 bcm43xx_lock_irqsafe(bcm, flags); 587 mutex_lock(&bcm->mutex);
588 spin_lock_irqsave(&bcm->irq_lock, flags);
584 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { 589 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) {
585 err = bcm43xx_radio_set_interference_mitigation(bcm, mode); 590 err = bcm43xx_radio_set_interference_mitigation(bcm, mode);
586 if (err) { 591 if (err) {
@@ -595,7 +600,8 @@ static int bcm43xx_wx_set_interfmode(struct net_device *net_dev,
595 } else 600 } else
596 bcm43xx_current_radio(bcm)->interfmode = mode; 601 bcm43xx_current_radio(bcm)->interfmode = mode;
597 } 602 }
598 bcm43xx_unlock_irqsafe(bcm, flags); 603 spin_unlock_irqrestore(&bcm->irq_lock, flags);
604 mutex_unlock(&bcm->mutex);
599 605
600 return err; 606 return err;
601} 607}
@@ -606,12 +612,11 @@ static int bcm43xx_wx_get_interfmode(struct net_device *net_dev,
606 char *extra) 612 char *extra)
607{ 613{
608 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 614 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
609 unsigned long flags;
610 int mode; 615 int mode;
611 616
612 bcm43xx_lock_irqsafe(bcm, flags); 617 mutex_lock(&bcm->mutex);
613 mode = bcm43xx_current_radio(bcm)->interfmode; 618 mode = bcm43xx_current_radio(bcm)->interfmode;
614 bcm43xx_unlock_irqsafe(bcm, flags); 619 mutex_unlock(&bcm->mutex);
615 620
616 switch (mode) { 621 switch (mode) {
617 case BCM43xx_RADIO_INTERFMODE_NONE: 622 case BCM43xx_RADIO_INTERFMODE_NONE:
@@ -641,9 +646,11 @@ static int bcm43xx_wx_set_shortpreamble(struct net_device *net_dev,
641 int on; 646 int on;
642 647
643 on = *((int *)extra); 648 on = *((int *)extra);
644 bcm43xx_lock_irqsafe(bcm, flags); 649 mutex_lock(&bcm->mutex);
650 spin_lock_irqsave(&bcm->irq_lock, flags);
645 bcm->short_preamble = !!on; 651 bcm->short_preamble = !!on;
646 bcm43xx_unlock_irqsafe(bcm, flags); 652 spin_unlock_irqrestore(&bcm->irq_lock, flags);
653 mutex_unlock(&bcm->mutex);
647 654
648 return 0; 655 return 0;
649} 656}
@@ -654,12 +661,11 @@ static int bcm43xx_wx_get_shortpreamble(struct net_device *net_dev,
654 char *extra) 661 char *extra)
655{ 662{
656 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 663 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
657 unsigned long flags;
658 int on; 664 int on;
659 665
660 bcm43xx_lock_irqsafe(bcm, flags); 666 mutex_lock(&bcm->mutex);
661 on = bcm->short_preamble; 667 on = bcm->short_preamble;
662 bcm43xx_unlock_irqsafe(bcm, flags); 668 mutex_unlock(&bcm->mutex);
663 669
664 if (on) 670 if (on)
665 strncpy(extra, "1 (Short Preamble enabled)", MAX_WX_STRING); 671 strncpy(extra, "1 (Short Preamble enabled)", MAX_WX_STRING);
@@ -681,11 +687,13 @@ static int bcm43xx_wx_set_swencryption(struct net_device *net_dev,
681 687
682 on = *((int *)extra); 688 on = *((int *)extra);
683 689
684 bcm43xx_lock_irqsafe(bcm, flags); 690 mutex_lock(&bcm->mutex);
691 spin_lock_irqsave(&bcm->irq_lock, flags);
685 bcm->ieee->host_encrypt = !!on; 692 bcm->ieee->host_encrypt = !!on;
686 bcm->ieee->host_decrypt = !!on; 693 bcm->ieee->host_decrypt = !!on;
687 bcm->ieee->host_build_iv = !on; 694 bcm->ieee->host_build_iv = !on;
688 bcm43xx_unlock_irqsafe(bcm, flags); 695 spin_unlock_irqrestore(&bcm->irq_lock, flags);
696 mutex_unlock(&bcm->mutex);
689 697
690 return 0; 698 return 0;
691} 699}
@@ -696,12 +704,11 @@ static int bcm43xx_wx_get_swencryption(struct net_device *net_dev,
696 char *extra) 704 char *extra)
697{ 705{
698 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 706 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
699 unsigned long flags;
700 int on; 707 int on;
701 708
702 bcm43xx_lock_irqsafe(bcm, flags); 709 mutex_lock(&bcm->mutex);
703 on = bcm->ieee->host_encrypt; 710 on = bcm->ieee->host_encrypt;
704 bcm43xx_unlock_irqsafe(bcm, flags); 711 mutex_unlock(&bcm->mutex);
705 712
706 if (on) 713 if (on)
707 strncpy(extra, "1 (SW encryption enabled) ", MAX_WX_STRING); 714 strncpy(extra, "1 (SW encryption enabled) ", MAX_WX_STRING);
@@ -764,11 +771,13 @@ static int bcm43xx_wx_sprom_read(struct net_device *net_dev,
764 if (!sprom) 771 if (!sprom)
765 goto out; 772 goto out;
766 773
767 bcm43xx_lock_irqsafe(bcm, flags); 774 mutex_lock(&bcm->mutex);
775 spin_lock_irqsave(&bcm->irq_lock, flags);
768 err = -ENODEV; 776 err = -ENODEV;
769 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) 777 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED)
770 err = bcm43xx_sprom_read(bcm, sprom); 778 err = bcm43xx_sprom_read(bcm, sprom);
771 bcm43xx_unlock_irqsafe(bcm, flags); 779 spin_unlock_irqrestore(&bcm->irq_lock, flags);
780 mutex_unlock(&bcm->mutex);
772 if (!err) 781 if (!err)
773 data->data.length = sprom2hex(sprom, extra); 782 data->data.length = sprom2hex(sprom, extra);
774 kfree(sprom); 783 kfree(sprom);
@@ -809,11 +818,15 @@ static int bcm43xx_wx_sprom_write(struct net_device *net_dev,
809 if (err) 818 if (err)
810 goto out_kfree; 819 goto out_kfree;
811 820
812 bcm43xx_lock_irqsafe(bcm, flags); 821 mutex_lock(&bcm->mutex);
822 spin_lock_irqsave(&bcm->irq_lock, flags);
823 spin_lock(&bcm->leds_lock);
813 err = -ENODEV; 824 err = -ENODEV;
814 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) 825 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED)
815 err = bcm43xx_sprom_write(bcm, sprom); 826 err = bcm43xx_sprom_write(bcm, sprom);
816 bcm43xx_unlock_irqsafe(bcm, flags); 827 spin_unlock(&bcm->leds_lock);
828 spin_unlock_irqrestore(&bcm->irq_lock, flags);
829 mutex_unlock(&bcm->mutex);
817out_kfree: 830out_kfree:
818 kfree(sprom); 831 kfree(sprom);
819out: 832out: