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>
This commit is contained in:

committed by
John W. Linville

parent
2391b7e8d4
commit
efe0249b0f
@@ -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 {
|
|||||||
/* 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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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 {
|
|||||||
#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) {
|
||||||
|
case B43_FW_HDR_410:
|
||||||
|
return 104 + sizeof(struct b43_plcp_hdr6);
|
||||||
|
case B43_FW_HDR_351:
|
||||||
return 100 + sizeof(struct b43_plcp_hdr6);
|
return 100 + sizeof(struct b43_plcp_hdr6);
|
||||||
return 104 + sizeof(struct b43_plcp_hdr6);
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user