aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2011-08-11 09:07:15 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-08-22 14:45:58 -0400
commitefe0249b0fd1e9a32a7e6a5dc9c751d4d97b0adf (patch)
tree1a1db659fda1dbf9fbe6e934d14e2f4b64b53b7b /drivers/net
parent2391b7e8d40e4b3be0756396c628d2323f2d0b8d (diff)
b43: use enum for firmware header format
Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/b43/b43.h8
-rw-r--r--drivers/net/wireless/b43/main.c6
-rw-r--r--drivers/net/wireless/b43/xmit.c52
-rw-r--r--drivers/net/wireless/b43/xmit.h15
4 files changed, 55 insertions, 26 deletions
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index c818b0bc88e..39baaaf4088 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -694,6 +694,11 @@ struct b43_firmware_file {
694 enum b43_firmware_file_type type; 694 enum b43_firmware_file_type type;
695}; 695};
696 696
697enum b43_firmware_hdr_format {
698 B43_FW_HDR_410,
699 B43_FW_HDR_351,
700};
701
697/* Pointers to the firmware data and meta information about it. */ 702/* Pointers to the firmware data and meta information about it. */
698struct b43_firmware { 703struct b43_firmware {
699 /* Microcode */ 704 /* Microcode */
@@ -710,6 +715,9 @@ struct b43_firmware {
710 /* Firmware patchlevel */ 715 /* Firmware patchlevel */
711 u16 patch; 716 u16 patch;
712 717
718 /* Format of header used by firmware */
719 enum b43_firmware_hdr_format hdr_format;
720
713 /* Set to true, if we are using an opensource firmware. 721 /* Set to true, if we are using an opensource firmware.
714 * Use this to check for proprietary vs opensource. */ 722 * Use this to check for proprietary vs opensource. */
715 bool opensource; 723 bool opensource;
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 4a5cac60091..cc3dd800559 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -2514,6 +2514,10 @@ static int b43_upload_microcode(struct b43_wldev *dev)
2514 } 2514 }
2515 dev->fw.rev = fwrev; 2515 dev->fw.rev = fwrev;
2516 dev->fw.patch = fwpatch; 2516 dev->fw.patch = fwpatch;
2517 if (dev->fw.rev >= 410)
2518 dev->fw.hdr_format = B43_FW_HDR_410;
2519 else
2520 dev->fw.hdr_format = B43_FW_HDR_351;
2517 dev->fw.opensource = (fwdate == 0xFFFF); 2521 dev->fw.opensource = (fwdate == 0xFFFF);
2518 2522
2519 /* Default to use-all-queues. */ 2523 /* Default to use-all-queues. */
@@ -2561,7 +2565,7 @@ static int b43_upload_microcode(struct b43_wldev *dev)
2561 dev->fw.rev, dev->fw.patch); 2565 dev->fw.rev, dev->fw.patch);
2562 wiphy->hw_version = dev->dev->core_id; 2566 wiphy->hw_version = dev->dev->core_id;
2563 2567
2564 if (b43_is_old_txhdr_format(dev)) { 2568 if (dev->fw.hdr_format == B43_FW_HDR_351) {
2565 /* We're over the deadline, but we keep support for old fw 2569 /* We're over the deadline, but we keep support for old fw
2566 * until it turns out to be in major conflict with something new. */ 2570 * until it turns out to be in major conflict with something new. */
2567 b43warn(dev->wl, "You are using an old firmware image. " 2571 b43warn(dev->wl, "You are using an old firmware image. "
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c
index 36c72438aac..5ce17d5eed6 100644
--- a/drivers/net/wireless/b43/xmit.c
+++ b/drivers/net/wireless/b43/xmit.c
@@ -337,12 +337,15 @@ int b43_generate_txhdr(struct b43_wldev *dev,
337 memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len); 337 memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);
338 } 338 }
339 } 339 }
340 if (b43_is_old_txhdr_format(dev)) { 340 switch (dev->fw.hdr_format) {
341 case B43_FW_HDR_351:
341 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_351.plcp), 342 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_351.plcp),
342 plcp_fragment_len, rate); 343 plcp_fragment_len, rate);
343 } else { 344 break;
345 case B43_FW_HDR_410:
344 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_410.plcp), 346 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_410.plcp),
345 plcp_fragment_len, rate); 347 plcp_fragment_len, rate);
348 break;
346 } 349 }
347 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp_fb), 350 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp_fb),
348 plcp_fragment_len, rate_fb); 351 plcp_fragment_len, rate_fb);
@@ -415,10 +418,10 @@ int b43_generate_txhdr(struct b43_wldev *dev,
415 if ((rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) || 418 if ((rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) ||
416 (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)) { 419 (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)) {
417 unsigned int len; 420 unsigned int len;
418 struct ieee80211_hdr *hdr; 421 struct ieee80211_hdr *uninitialized_var(hdr);
419 int rts_rate, rts_rate_fb; 422 int rts_rate, rts_rate_fb;
420 int rts_rate_ofdm, rts_rate_fb_ofdm; 423 int rts_rate_ofdm, rts_rate_fb_ofdm;
421 struct b43_plcp_hdr6 *plcp; 424 struct b43_plcp_hdr6 *uninitialized_var(plcp);
422 struct ieee80211_rate *rts_cts_rate; 425 struct ieee80211_rate *rts_cts_rate;
423 426
424 rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, info); 427 rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, info);
@@ -429,14 +432,17 @@ int b43_generate_txhdr(struct b43_wldev *dev,
429 rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb); 432 rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb);
430 433
431 if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { 434 if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
432 struct ieee80211_cts *cts; 435 struct ieee80211_cts *uninitialized_var(cts);
433 436
434 if (b43_is_old_txhdr_format(dev)) { 437 switch (dev->fw.hdr_format) {
438 case B43_FW_HDR_351:
435 cts = (struct ieee80211_cts *) 439 cts = (struct ieee80211_cts *)
436 (txhdr->format_351.rts_frame); 440 (txhdr->format_351.rts_frame);
437 } else { 441 break;
442 case B43_FW_HDR_410:
438 cts = (struct ieee80211_cts *) 443 cts = (struct ieee80211_cts *)
439 (txhdr->format_410.rts_frame); 444 (txhdr->format_410.rts_frame);
445 break;
440 } 446 }
441 ieee80211_ctstoself_get(dev->wl->hw, info->control.vif, 447 ieee80211_ctstoself_get(dev->wl->hw, info->control.vif,
442 fragment_data, fragment_len, 448 fragment_data, fragment_len,
@@ -444,14 +450,17 @@ int b43_generate_txhdr(struct b43_wldev *dev,
444 mac_ctl |= B43_TXH_MAC_SENDCTS; 450 mac_ctl |= B43_TXH_MAC_SENDCTS;
445 len = sizeof(struct ieee80211_cts); 451 len = sizeof(struct ieee80211_cts);
446 } else { 452 } else {
447 struct ieee80211_rts *rts; 453 struct ieee80211_rts *uninitialized_var(rts);
448 454
449 if (b43_is_old_txhdr_format(dev)) { 455 switch (dev->fw.hdr_format) {
456 case B43_FW_HDR_351:
450 rts = (struct ieee80211_rts *) 457 rts = (struct ieee80211_rts *)
451 (txhdr->format_351.rts_frame); 458 (txhdr->format_351.rts_frame);
452 } else { 459 break;
460 case B43_FW_HDR_410:
453 rts = (struct ieee80211_rts *) 461 rts = (struct ieee80211_rts *)
454 (txhdr->format_410.rts_frame); 462 (txhdr->format_410.rts_frame);
463 break;
455 } 464 }
456 ieee80211_rts_get(dev->wl->hw, info->control.vif, 465 ieee80211_rts_get(dev->wl->hw, info->control.vif,
457 fragment_data, fragment_len, 466 fragment_data, fragment_len,
@@ -462,22 +471,29 @@ int b43_generate_txhdr(struct b43_wldev *dev,
462 len += FCS_LEN; 471 len += FCS_LEN;
463 472
464 /* Generate the PLCP headers for the RTS/CTS frame */ 473 /* Generate the PLCP headers for the RTS/CTS frame */
465 if (b43_is_old_txhdr_format(dev)) 474 switch (dev->fw.hdr_format) {
475 case B43_FW_HDR_351:
466 plcp = &txhdr->format_351.rts_plcp; 476 plcp = &txhdr->format_351.rts_plcp;
467 else 477 break;
478 case B43_FW_HDR_410:
468 plcp = &txhdr->format_410.rts_plcp; 479 plcp = &txhdr->format_410.rts_plcp;
480 break;
481 }
469 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp, 482 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,
470 len, rts_rate); 483 len, rts_rate);
471 plcp = &txhdr->rts_plcp_fb; 484 plcp = &txhdr->rts_plcp_fb;
472 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp, 485 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,
473 len, rts_rate_fb); 486 len, rts_rate_fb);
474 487
475 if (b43_is_old_txhdr_format(dev)) { 488 switch (dev->fw.hdr_format) {
489 case B43_FW_HDR_351:
476 hdr = (struct ieee80211_hdr *) 490 hdr = (struct ieee80211_hdr *)
477 (&txhdr->format_351.rts_frame); 491 (&txhdr->format_351.rts_frame);
478 } else { 492 break;
493 case B43_FW_HDR_410:
479 hdr = (struct ieee80211_hdr *) 494 hdr = (struct ieee80211_hdr *)
480 (&txhdr->format_410.rts_frame); 495 (&txhdr->format_410.rts_frame);
496 break;
481 } 497 }
482 txhdr->rts_dur_fb = hdr->duration_id; 498 txhdr->rts_dur_fb = hdr->duration_id;
483 499
@@ -505,10 +521,14 @@ int b43_generate_txhdr(struct b43_wldev *dev,
505 } 521 }
506 522
507 /* Magic cookie */ 523 /* Magic cookie */
508 if (b43_is_old_txhdr_format(dev)) 524 switch (dev->fw.hdr_format) {
525 case B43_FW_HDR_351:
509 txhdr->format_351.cookie = cpu_to_le16(cookie); 526 txhdr->format_351.cookie = cpu_to_le16(cookie);
510 else 527 break;
528 case B43_FW_HDR_410:
511 txhdr->format_410.cookie = cpu_to_le16(cookie); 529 txhdr->format_410.cookie = cpu_to_le16(cookie);
530 break;
531 }
512 532
513 if (phy->type == B43_PHYTYPE_N) { 533 if (phy->type == B43_PHYTYPE_N) {
514 txhdr->phy_ctl1 = 534 txhdr->phy_ctl1 =
diff --git a/drivers/net/wireless/b43/xmit.h b/drivers/net/wireless/b43/xmit.h
index 79fc162b90e..a3ff727d27f 100644
--- a/drivers/net/wireless/b43/xmit.h
+++ b/drivers/net/wireless/b43/xmit.h
@@ -166,19 +166,16 @@ struct b43_tx_legacy_rate_phy_ctl_entry {
166#define B43_TXH_PHY1_MODUL_QAM256 0x2000 /* QAM256 */ 166#define B43_TXH_PHY1_MODUL_QAM256 0x2000 /* QAM256 */
167 167
168 168
169/* r351 firmware compatibility stuff. */
170static inline
171bool b43_is_old_txhdr_format(struct b43_wldev *dev)
172{
173 return (dev->fw.rev <= 351);
174}
175
176static inline 169static inline
177size_t b43_txhdr_size(struct b43_wldev *dev) 170size_t b43_txhdr_size(struct b43_wldev *dev)
178{ 171{
179 if (b43_is_old_txhdr_format(dev)) 172 switch (dev->fw.hdr_format) {
173 case B43_FW_HDR_410:
174 return 104 + sizeof(struct b43_plcp_hdr6);
175 case B43_FW_HDR_351:
180 return 100 + sizeof(struct b43_plcp_hdr6); 176 return 100 + sizeof(struct b43_plcp_hdr6);
181 return 104 + sizeof(struct b43_plcp_hdr6); 177 }
178 return 0;
182} 179}
183 180
184 181