diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2011-08-11 09:07:15 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-08-22 14:45:58 -0400 |
commit | efe0249b0fd1e9a32a7e6a5dc9c751d4d97b0adf (patch) | |
tree | 1a1db659fda1dbf9fbe6e934d14e2f4b64b53b7b /drivers/net/wireless | |
parent | 2391b7e8d40e4b3be0756396c628d2323f2d0b8d (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/wireless')
-rw-r--r-- | drivers/net/wireless/b43/b43.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/b43/main.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/b43/xmit.c | 52 | ||||
-rw-r--r-- | drivers/net/wireless/b43/xmit.h | 15 |
4 files changed, 55 insertions, 26 deletions
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index c818b0bc88ec..39baaaf4088f 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 | ||
697 | enum 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. */ |
698 | struct b43_firmware { | 703 | struct 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 4a5cac600916..cc3dd800559e 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 36c72438aac4..5ce17d5eed6e 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 79fc162b90ec..a3ff727d27f2 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. */ | ||
170 | static inline | ||
171 | bool b43_is_old_txhdr_format(struct b43_wldev *dev) | ||
172 | { | ||
173 | return (dev->fw.rev <= 351); | ||
174 | } | ||
175 | |||
176 | static inline | 169 | static inline |
177 | size_t b43_txhdr_size(struct b43_wldev *dev) | 170 | size_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 | ||