iwlagn: add feature flags
Some new devices and microcode files will a greater variety of features, so the TLV-per-feature approach we took before will quickly make things harder to manage and increase the file size. Add a new TLV that has feature flags. Currently, it will contain: 1) a PAN feature flag, which moves from a separate TLV 2) a new BT stats bit that indicates whether the microcode image uses bluetooth statistics 3) a new MFP flag for management frame protection which can be enabled once the device/microcode supports it Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
7415952ff7
commit
3997ff39fa
3 changed files with 44 additions and 4 deletions
|
@ -1191,7 +1191,7 @@ static void iwl_nic_start(struct iwl_priv *priv)
|
||||||
struct iwlagn_ucode_capabilities {
|
struct iwlagn_ucode_capabilities {
|
||||||
u32 max_probe_length;
|
u32 max_probe_length;
|
||||||
u32 standard_phy_calibration_size;
|
u32 standard_phy_calibration_size;
|
||||||
bool pan;
|
u32 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context);
|
static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context);
|
||||||
|
@ -1418,7 +1418,23 @@ static int iwlagn_load_firmware(struct iwl_priv *priv,
|
||||||
case IWL_UCODE_TLV_PAN:
|
case IWL_UCODE_TLV_PAN:
|
||||||
if (tlv_len)
|
if (tlv_len)
|
||||||
goto invalid_tlv_len;
|
goto invalid_tlv_len;
|
||||||
capa->pan = true;
|
capa->flags |= IWL_UCODE_TLV_FLAGS_PAN;
|
||||||
|
break;
|
||||||
|
case IWL_UCODE_TLV_FLAGS:
|
||||||
|
/* must be at least one u32 */
|
||||||
|
if (tlv_len < sizeof(u32))
|
||||||
|
goto invalid_tlv_len;
|
||||||
|
/* and a proper number of u32s */
|
||||||
|
if (tlv_len % sizeof(u32))
|
||||||
|
goto invalid_tlv_len;
|
||||||
|
/*
|
||||||
|
* This driver only reads the first u32 as
|
||||||
|
* right now no more features are defined,
|
||||||
|
* if that changes then either the driver
|
||||||
|
* will not work with the new firmware, or
|
||||||
|
* it'll not take advantage of new features.
|
||||||
|
*/
|
||||||
|
capa->flags = le32_to_cpup((__le32 *)tlv_data);
|
||||||
break;
|
break;
|
||||||
case IWL_UCODE_TLV_INIT_EVTLOG_PTR:
|
case IWL_UCODE_TLV_INIT_EVTLOG_PTR:
|
||||||
if (tlv_len != sizeof(u32))
|
if (tlv_len != sizeof(u32))
|
||||||
|
@ -1681,12 +1697,16 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
|
||||||
priv->cfg->base_params->max_event_log_size;
|
priv->cfg->base_params->max_event_log_size;
|
||||||
priv->_agn.inst_errlog_ptr = pieces.inst_errlog_ptr;
|
priv->_agn.inst_errlog_ptr = pieces.inst_errlog_ptr;
|
||||||
|
|
||||||
if (ucode_capa.pan) {
|
if (ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN) {
|
||||||
priv->valid_contexts |= BIT(IWL_RXON_CTX_PAN);
|
priv->valid_contexts |= BIT(IWL_RXON_CTX_PAN);
|
||||||
priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN;
|
priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN;
|
||||||
} else
|
} else
|
||||||
priv->sta_key_max_num = STA_KEY_MAX_NUM;
|
priv->sta_key_max_num = STA_KEY_MAX_NUM;
|
||||||
|
|
||||||
|
if (ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BTSTATS ||
|
||||||
|
(priv->cfg->bt_params && priv->cfg->bt_params->bt_statistics))
|
||||||
|
priv->bt_statistics = true;
|
||||||
|
|
||||||
/* Copy images into buffers for card's bus-master reads ... */
|
/* Copy images into buffers for card's bus-master reads ... */
|
||||||
|
|
||||||
/* Runtime instructions (first block of data in file) */
|
/* Runtime instructions (first block of data in file) */
|
||||||
|
@ -2827,6 +2847,9 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
|
||||||
hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
|
hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
|
||||||
IEEE80211_HW_SUPPORTS_STATIC_SMPS;
|
IEEE80211_HW_SUPPORTS_STATIC_SMPS;
|
||||||
|
|
||||||
|
if (capa->flags & IWL_UCODE_TLV_FLAGS_MFP)
|
||||||
|
hw->flags |= IEEE80211_HW_MFP_CAPABLE;
|
||||||
|
|
||||||
hw->sta_data_size = sizeof(struct iwl_station_priv);
|
hw->sta_data_size = sizeof(struct iwl_station_priv);
|
||||||
hw->vif_data_size = sizeof(struct iwl_vif_priv);
|
hw->vif_data_size = sizeof(struct iwl_vif_priv);
|
||||||
|
|
||||||
|
|
|
@ -723,7 +723,7 @@ static inline bool iwl_advanced_bt_coexist(struct iwl_priv *priv)
|
||||||
|
|
||||||
static inline bool iwl_bt_statistics(struct iwl_priv *priv)
|
static inline bool iwl_bt_statistics(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
return priv->cfg->bt_params && priv->cfg->bt_params->bt_statistics;
|
return priv->bt_statistics;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool bt_coex_active;
|
extern bool bt_coex_active;
|
||||||
|
|
|
@ -535,6 +535,22 @@ enum iwl_ucode_tlv_type {
|
||||||
IWL_UCODE_TLV_INIT_ERRLOG_PTR = 13,
|
IWL_UCODE_TLV_INIT_ERRLOG_PTR = 13,
|
||||||
IWL_UCODE_TLV_ENHANCE_SENS_TBL = 14,
|
IWL_UCODE_TLV_ENHANCE_SENS_TBL = 14,
|
||||||
IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15,
|
IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15,
|
||||||
|
/* 16 and 17 reserved for future use */
|
||||||
|
IWL_UCODE_TLV_FLAGS = 18,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum iwl_ucode_tlv_flag - ucode API flags
|
||||||
|
* @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
|
||||||
|
* was a separate TLV but moved here to save space.
|
||||||
|
* @IWL_UCODE_TLV_FLAGS_BTSTATS: This uCode image uses BT statistics, which
|
||||||
|
* may be true even if the device doesn't have BT.
|
||||||
|
* @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
|
||||||
|
*/
|
||||||
|
enum iwl_ucode_tlv_flag {
|
||||||
|
IWL_UCODE_TLV_FLAGS_PAN = BIT(0),
|
||||||
|
IWL_UCODE_TLV_FLAGS_BTSTATS = BIT(1),
|
||||||
|
IWL_UCODE_TLV_FLAGS_MFP = BIT(2),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct iwl_ucode_tlv {
|
struct iwl_ucode_tlv {
|
||||||
|
@ -1410,6 +1426,7 @@ struct iwl_priv {
|
||||||
bool bt_ch_announce;
|
bool bt_ch_announce;
|
||||||
bool bt_full_concurrent;
|
bool bt_full_concurrent;
|
||||||
bool bt_ant_couple_ok;
|
bool bt_ant_couple_ok;
|
||||||
|
bool bt_statistics;
|
||||||
__le32 kill_ack_mask;
|
__le32 kill_ack_mask;
|
||||||
__le32 kill_cts_mask;
|
__le32 kill_cts_mask;
|
||||||
__le16 bt_valid;
|
__le16 bt_valid;
|
||||||
|
|
Loading…
Add table
Reference in a new issue