···694694 enum b43_firmware_file_type type;695695};696696697697+enum b43_firmware_hdr_format {698698+ B43_FW_HDR_410,699699+ B43_FW_HDR_351,700700+};701701+697702/* Pointers to the firmware data and meta information about it. */698703struct b43_firmware {699704 /* Microcode */···714709 u16 rev;715710 /* Firmware patchlevel */716711 u16 patch;712712+713713+ /* Format of header used by firmware */714714+ enum b43_firmware_hdr_format hdr_format;717715718716 /* Set to true, if we are using an opensource firmware.719717 * Use this to check for proprietary vs opensource. */
+5-1
drivers/net/wireless/b43/main.c
···25142514 }25152515 dev->fw.rev = fwrev;25162516 dev->fw.patch = fwpatch;25172517+ if (dev->fw.rev >= 410)25182518+ dev->fw.hdr_format = B43_FW_HDR_410;25192519+ else25202520+ dev->fw.hdr_format = B43_FW_HDR_351;25172521 dev->fw.opensource = (fwdate == 0xFFFF);2518252225192523 /* Default to use-all-queues. */···25652561 dev->fw.rev, dev->fw.patch);25662562 wiphy->hw_version = dev->dev->core_id;2567256325682568- if (b43_is_old_txhdr_format(dev)) {25642564+ if (dev->fw.hdr_format == B43_FW_HDR_351) {25692565 /* We're over the deadline, but we keep support for old fw25702566 * until it turns out to be in major conflict with something new. */25712567 b43warn(dev->wl, "You are using an old firmware image. "
+36-16
drivers/net/wireless/b43/xmit.c
···337337 memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);338338 }339339 }340340- if (b43_is_old_txhdr_format(dev)) {340340+ switch (dev->fw.hdr_format) {341341+ case B43_FW_HDR_351:341342 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_351.plcp),342343 plcp_fragment_len, rate);343343- } else {344344+ break;345345+ case B43_FW_HDR_410:344346 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_410.plcp),345347 plcp_fragment_len, rate);348348+ break;346349 }347350 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp_fb),348351 plcp_fragment_len, rate_fb);···418415 if ((rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) ||419416 (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)) {420417 unsigned int len;421421- struct ieee80211_hdr *hdr;418418+ struct ieee80211_hdr *uninitialized_var(hdr);422419 int rts_rate, rts_rate_fb;423420 int rts_rate_ofdm, rts_rate_fb_ofdm;424424- struct b43_plcp_hdr6 *plcp;421421+ struct b43_plcp_hdr6 *uninitialized_var(plcp);425422 struct ieee80211_rate *rts_cts_rate;426423427424 rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, info);···432429 rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb);433430434431 if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {435435- struct ieee80211_cts *cts;432432+ struct ieee80211_cts *uninitialized_var(cts);436433437437- if (b43_is_old_txhdr_format(dev)) {434434+ switch (dev->fw.hdr_format) {435435+ case B43_FW_HDR_351:438436 cts = (struct ieee80211_cts *)439437 (txhdr->format_351.rts_frame);440440- } else {438438+ break;439439+ case B43_FW_HDR_410:441440 cts = (struct ieee80211_cts *)442441 (txhdr->format_410.rts_frame);442442+ break;443443 }444444 ieee80211_ctstoself_get(dev->wl->hw, info->control.vif,445445 fragment_data, fragment_len,···450444 mac_ctl |= B43_TXH_MAC_SENDCTS;451445 len = sizeof(struct ieee80211_cts);452446 } else {453453- struct ieee80211_rts *rts;447447+ struct ieee80211_rts *uninitialized_var(rts);454448455455- if (b43_is_old_txhdr_format(dev)) {449449+ switch (dev->fw.hdr_format) {450450+ case B43_FW_HDR_351:456451 rts = (struct ieee80211_rts *)457452 (txhdr->format_351.rts_frame);458458- } else {453453+ break;454454+ case B43_FW_HDR_410:459455 rts = (struct ieee80211_rts *)460456 (txhdr->format_410.rts_frame);457457+ break;461458 }462459 ieee80211_rts_get(dev->wl->hw, info->control.vif,463460 fragment_data, fragment_len,···471462 len += FCS_LEN;472463473464 /* Generate the PLCP headers for the RTS/CTS frame */474474- if (b43_is_old_txhdr_format(dev))465465+ switch (dev->fw.hdr_format) {466466+ case B43_FW_HDR_351:475467 plcp = &txhdr->format_351.rts_plcp;476476- else468468+ break;469469+ case B43_FW_HDR_410:477470 plcp = &txhdr->format_410.rts_plcp;471471+ break;472472+ }478473 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,479474 len, rts_rate);480475 plcp = &txhdr->rts_plcp_fb;481476 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,482477 len, rts_rate_fb);483478484484- if (b43_is_old_txhdr_format(dev)) {479479+ switch (dev->fw.hdr_format) {480480+ case B43_FW_HDR_351:485481 hdr = (struct ieee80211_hdr *)486482 (&txhdr->format_351.rts_frame);487487- } else {483483+ break;484484+ case B43_FW_HDR_410:488485 hdr = (struct ieee80211_hdr *)489486 (&txhdr->format_410.rts_frame);487487+ break;490488 }491489 txhdr->rts_dur_fb = hdr->duration_id;492490···521505 }522506523507 /* Magic cookie */524524- if (b43_is_old_txhdr_format(dev))508508+ switch (dev->fw.hdr_format) {509509+ case B43_FW_HDR_351:525510 txhdr->format_351.cookie = cpu_to_le16(cookie);526526- else511511+ break;512512+ case B43_FW_HDR_410:527513 txhdr->format_410.cookie = cpu_to_le16(cookie);514514+ break;515515+ }528516529517 if (phy->type == B43_PHYTYPE_N) {530518 txhdr->phy_ctl1 =