Commit efe0249b authored by Rafał Miłecki's avatar Rafał Miłecki Committed by John W. Linville

b43: use enum for firmware header format

Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 2391b7e8
...@@ -694,6 +694,11 @@ struct b43_firmware_file { ...@@ -694,6 +694,11 @@ struct b43_firmware_file {
enum b43_firmware_file_type type; enum b43_firmware_file_type type;
}; };
enum b43_firmware_hdr_format {
B43_FW_HDR_410,
B43_FW_HDR_351,
};
/* Pointers to the firmware data and meta information about it. */ /* Pointers to the firmware data and meta information about it. */
struct b43_firmware { struct b43_firmware {
/* Microcode */ /* Microcode */
...@@ -710,6 +715,9 @@ struct b43_firmware { ...@@ -710,6 +715,9 @@ struct b43_firmware {
/* Firmware patchlevel */ /* Firmware patchlevel */
u16 patch; u16 patch;
/* Format of header used by firmware */
enum b43_firmware_hdr_format hdr_format;
/* Set to true, if we are using an opensource firmware. /* Set to true, if we are using an opensource firmware.
* Use this to check for proprietary vs opensource. */ * Use this to check for proprietary vs opensource. */
bool opensource; bool opensource;
......
...@@ -2514,6 +2514,10 @@ static int b43_upload_microcode(struct b43_wldev *dev) ...@@ -2514,6 +2514,10 @@ static int b43_upload_microcode(struct b43_wldev *dev)
} }
dev->fw.rev = fwrev; dev->fw.rev = fwrev;
dev->fw.patch = fwpatch; dev->fw.patch = fwpatch;
if (dev->fw.rev >= 410)
dev->fw.hdr_format = B43_FW_HDR_410;
else
dev->fw.hdr_format = B43_FW_HDR_351;
dev->fw.opensource = (fwdate == 0xFFFF); dev->fw.opensource = (fwdate == 0xFFFF);
/* Default to use-all-queues. */ /* Default to use-all-queues. */
...@@ -2561,7 +2565,7 @@ static int b43_upload_microcode(struct b43_wldev *dev) ...@@ -2561,7 +2565,7 @@ static int b43_upload_microcode(struct b43_wldev *dev)
dev->fw.rev, dev->fw.patch); dev->fw.rev, dev->fw.patch);
wiphy->hw_version = dev->dev->core_id; wiphy->hw_version = dev->dev->core_id;
if (b43_is_old_txhdr_format(dev)) { if (dev->fw.hdr_format == B43_FW_HDR_351) {
/* We're over the deadline, but we keep support for old fw /* We're over the deadline, but we keep support for old fw
* until it turns out to be in major conflict with something new. */ * until it turns out to be in major conflict with something new. */
b43warn(dev->wl, "You are using an old firmware image. " b43warn(dev->wl, "You are using an old firmware image. "
......
...@@ -337,12 +337,15 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -337,12 +337,15 @@ int b43_generate_txhdr(struct b43_wldev *dev,
memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len); memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);
} }
} }
if (b43_is_old_txhdr_format(dev)) { switch (dev->fw.hdr_format) {
case B43_FW_HDR_351:
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_351.plcp), b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_351.plcp),
plcp_fragment_len, rate); plcp_fragment_len, rate);
} else { break;
case B43_FW_HDR_410:
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_410.plcp), b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_410.plcp),
plcp_fragment_len, rate); plcp_fragment_len, rate);
break;
} }
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp_fb), b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp_fb),
plcp_fragment_len, rate_fb); plcp_fragment_len, rate_fb);
...@@ -415,10 +418,10 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -415,10 +418,10 @@ int b43_generate_txhdr(struct b43_wldev *dev,
if ((rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) || if ((rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) ||
(rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)) { (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)) {
unsigned int len; unsigned int len;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *uninitialized_var(hdr);
int rts_rate, rts_rate_fb; int rts_rate, rts_rate_fb;
int rts_rate_ofdm, rts_rate_fb_ofdm; int rts_rate_ofdm, rts_rate_fb_ofdm;
struct b43_plcp_hdr6 *plcp; struct b43_plcp_hdr6 *uninitialized_var(plcp);
struct ieee80211_rate *rts_cts_rate; struct ieee80211_rate *rts_cts_rate;
rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, info); 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,14 +432,17 @@ int b43_generate_txhdr(struct b43_wldev *dev,
rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb); rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb);
if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
struct ieee80211_cts *cts; struct ieee80211_cts *uninitialized_var(cts);
if (b43_is_old_txhdr_format(dev)) { switch (dev->fw.hdr_format) {
case B43_FW_HDR_351:
cts = (struct ieee80211_cts *) cts = (struct ieee80211_cts *)
(txhdr->format_351.rts_frame); (txhdr->format_351.rts_frame);
} else { break;
case B43_FW_HDR_410:
cts = (struct ieee80211_cts *) cts = (struct ieee80211_cts *)
(txhdr->format_410.rts_frame); (txhdr->format_410.rts_frame);
break;
} }
ieee80211_ctstoself_get(dev->wl->hw, info->control.vif, ieee80211_ctstoself_get(dev->wl->hw, info->control.vif,
fragment_data, fragment_len, fragment_data, fragment_len,
...@@ -444,14 +450,17 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -444,14 +450,17 @@ int b43_generate_txhdr(struct b43_wldev *dev,
mac_ctl |= B43_TXH_MAC_SENDCTS; mac_ctl |= B43_TXH_MAC_SENDCTS;
len = sizeof(struct ieee80211_cts); len = sizeof(struct ieee80211_cts);
} else { } else {
struct ieee80211_rts *rts; struct ieee80211_rts *uninitialized_var(rts);
if (b43_is_old_txhdr_format(dev)) { switch (dev->fw.hdr_format) {
case B43_FW_HDR_351:
rts = (struct ieee80211_rts *) rts = (struct ieee80211_rts *)
(txhdr->format_351.rts_frame); (txhdr->format_351.rts_frame);
} else { break;
case B43_FW_HDR_410:
rts = (struct ieee80211_rts *) rts = (struct ieee80211_rts *)
(txhdr->format_410.rts_frame); (txhdr->format_410.rts_frame);
break;
} }
ieee80211_rts_get(dev->wl->hw, info->control.vif, ieee80211_rts_get(dev->wl->hw, info->control.vif,
fragment_data, fragment_len, fragment_data, fragment_len,
...@@ -462,22 +471,29 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -462,22 +471,29 @@ int b43_generate_txhdr(struct b43_wldev *dev,
len += FCS_LEN; len += FCS_LEN;
/* Generate the PLCP headers for the RTS/CTS frame */ /* Generate the PLCP headers for the RTS/CTS frame */
if (b43_is_old_txhdr_format(dev)) switch (dev->fw.hdr_format) {
case B43_FW_HDR_351:
plcp = &txhdr->format_351.rts_plcp; plcp = &txhdr->format_351.rts_plcp;
else break;
case B43_FW_HDR_410:
plcp = &txhdr->format_410.rts_plcp; plcp = &txhdr->format_410.rts_plcp;
break;
}
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp, b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,
len, rts_rate); len, rts_rate);
plcp = &txhdr->rts_plcp_fb; plcp = &txhdr->rts_plcp_fb;
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp, b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,
len, rts_rate_fb); len, rts_rate_fb);
if (b43_is_old_txhdr_format(dev)) { switch (dev->fw.hdr_format) {
case B43_FW_HDR_351:
hdr = (struct ieee80211_hdr *) hdr = (struct ieee80211_hdr *)
(&txhdr->format_351.rts_frame); (&txhdr->format_351.rts_frame);
} else { break;
case B43_FW_HDR_410:
hdr = (struct ieee80211_hdr *) hdr = (struct ieee80211_hdr *)
(&txhdr->format_410.rts_frame); (&txhdr->format_410.rts_frame);
break;
} }
txhdr->rts_dur_fb = hdr->duration_id; txhdr->rts_dur_fb = hdr->duration_id;
...@@ -505,10 +521,14 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -505,10 +521,14 @@ int b43_generate_txhdr(struct b43_wldev *dev,
} }
/* Magic cookie */ /* Magic cookie */
if (b43_is_old_txhdr_format(dev)) switch (dev->fw.hdr_format) {
case B43_FW_HDR_351:
txhdr->format_351.cookie = cpu_to_le16(cookie); txhdr->format_351.cookie = cpu_to_le16(cookie);
else break;
case B43_FW_HDR_410:
txhdr->format_410.cookie = cpu_to_le16(cookie); txhdr->format_410.cookie = cpu_to_le16(cookie);
break;
}
if (phy->type == B43_PHYTYPE_N) { if (phy->type == B43_PHYTYPE_N) {
txhdr->phy_ctl1 = txhdr->phy_ctl1 =
......
...@@ -166,19 +166,16 @@ struct b43_tx_legacy_rate_phy_ctl_entry { ...@@ -166,19 +166,16 @@ struct b43_tx_legacy_rate_phy_ctl_entry {
#define B43_TXH_PHY1_MODUL_QAM256 0x2000 /* QAM256 */ #define B43_TXH_PHY1_MODUL_QAM256 0x2000 /* QAM256 */
/* r351 firmware compatibility stuff. */
static inline
bool b43_is_old_txhdr_format(struct b43_wldev *dev)
{
return (dev->fw.rev <= 351);
}
static inline static inline
size_t b43_txhdr_size(struct b43_wldev *dev) size_t b43_txhdr_size(struct b43_wldev *dev)
{ {
if (b43_is_old_txhdr_format(dev)) switch (dev->fw.hdr_format) {
return 100 + sizeof(struct b43_plcp_hdr6); case B43_FW_HDR_410:
return 104 + sizeof(struct b43_plcp_hdr6); return 104 + sizeof(struct b43_plcp_hdr6);
case B43_FW_HDR_351:
return 100 + sizeof(struct b43_plcp_hdr6);
}
return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment