iwlwifi: mvm: rs: new rate scale API - add FW notifications
This patch sends to the FW notification configuration command and handles the update responses. Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
parent
110b32f065
commit
46d372af99
@ -87,6 +87,16 @@ enum iwl_data_path_subcmd_ids {
|
|||||||
*/
|
*/
|
||||||
TLC_MNG_CONFIG_CMD = 0xF,
|
TLC_MNG_CONFIG_CMD = 0xF,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @TLC_MNG_NOTIF_REQ_CMD: &struct iwl_tlc_notif_req_config_cmd
|
||||||
|
*/
|
||||||
|
TLC_MNG_NOTIF_REQ_CMD = 0x10,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @TLC_MNG_UPDATE_NOTIF: &struct iwl_tlc_update_notif
|
||||||
|
*/
|
||||||
|
TLC_MNG_UPDATE_NOTIF = 0xF7,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @STA_PM_NOTIF: &struct iwl_mvm_pm_state_notification
|
* @STA_PM_NOTIF: &struct iwl_mvm_pm_state_notification
|
||||||
*/
|
*/
|
||||||
|
@ -229,6 +229,40 @@ struct iwl_tlc_config_cmd {
|
|||||||
__le32 max_ampdu_cnt;
|
__le32 max_ampdu_cnt;
|
||||||
} __packed; /* TLC_MNG_CONFIG_CMD_API_S_VER_1 */
|
} __packed; /* TLC_MNG_CONFIG_CMD_API_S_VER_1 */
|
||||||
|
|
||||||
|
#define IWL_TLC_NOTIF_INIT_RATE_POS 0
|
||||||
|
#define IWL_TLC_NOTIF_INIT_RATE_MSK BIT(IWL_TLC_NOTIF_INIT_RATE_POS)
|
||||||
|
#define IWL_TLC_NOTIF_REQ_INTERVAL (500)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct iwl_tlc_notif_req_config_cmd - request notif on specific changes
|
||||||
|
* @sta_id: relevant station
|
||||||
|
* @reserved1: reserved
|
||||||
|
* @flags: bitmap of requested notifications %IWL_TLC_NOTIF_INIT_\*
|
||||||
|
* @interval: minimum time between notifications from TLC to the driver (msec)
|
||||||
|
* @reserved2: reserved
|
||||||
|
*/
|
||||||
|
struct iwl_tlc_notif_req_config_cmd {
|
||||||
|
u8 sta_id;
|
||||||
|
u8 reserved1;
|
||||||
|
__le16 flags;
|
||||||
|
__le16 interval;
|
||||||
|
__le16 reserved2;
|
||||||
|
} __packed; /* TLC_MNG_NOTIF_REQ_CMD_API_S_VER_1 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct iwl_tlc_update_notif - TLC notification from FW
|
||||||
|
* @sta_id: station id
|
||||||
|
* @reserved: reserved
|
||||||
|
* @flags: bitmap of notifications reported
|
||||||
|
* @values: field per flag in struct iwl_tlc_notif_req_config_cmd
|
||||||
|
*/
|
||||||
|
struct iwl_tlc_update_notif {
|
||||||
|
u8 sta_id;
|
||||||
|
u8 reserved;
|
||||||
|
__le16 flags;
|
||||||
|
__le32 values[16];
|
||||||
|
} __packed; /* TLC_MNG_UPDATE_NTFY_API_S_VER_1 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These serve as indexes into
|
* These serve as indexes into
|
||||||
* struct iwl_rate_info fw_rate_idx_to_plcp[IWL_RATE_COUNT];
|
* struct iwl_rate_info fw_rate_idx_to_plcp[IWL_RATE_COUNT];
|
||||||
|
@ -1017,6 +1017,8 @@ static void iwl_mvm_rx_mq(struct iwl_op_mode *op_mode,
|
|||||||
iwl_mvm_rx_queue_notif(mvm, rxb, 0);
|
iwl_mvm_rx_queue_notif(mvm, rxb, 0);
|
||||||
else if (cmd == WIDE_ID(LEGACY_GROUP, FRAME_RELEASE))
|
else if (cmd == WIDE_ID(LEGACY_GROUP, FRAME_RELEASE))
|
||||||
iwl_mvm_rx_frame_release(mvm, napi, rxb, 0);
|
iwl_mvm_rx_frame_release(mvm, napi, rxb, 0);
|
||||||
|
else if (cmd == WIDE_ID(DATA_PATH_GROUP, TLC_MNG_UPDATE_NOTIF))
|
||||||
|
iwl_mvm_tlc_update_notif(mvm, pkt);
|
||||||
else
|
else
|
||||||
iwl_mvm_rx_common(mvm, rxb, pkt);
|
iwl_mvm_rx_common(mvm, rxb, pkt);
|
||||||
}
|
}
|
||||||
|
@ -213,6 +213,46 @@ static void rs_fw_set_supp_rates(struct ieee80211_sta *sta,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rs_fw_tlc_mng_notif_req_config(struct iwl_mvm *mvm, u8 sta_id)
|
||||||
|
{
|
||||||
|
u32 cmd_id = iwl_cmd_id(TLC_MNG_NOTIF_REQ_CMD, DATA_PATH_GROUP, 0);
|
||||||
|
struct iwl_tlc_notif_req_config_cmd cfg_cmd = {
|
||||||
|
.sta_id = sta_id,
|
||||||
|
.flags = cpu_to_le16(IWL_TLC_NOTIF_INIT_RATE_MSK),
|
||||||
|
.interval = cpu_to_le16(IWL_TLC_NOTIF_REQ_INTERVAL),
|
||||||
|
};
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(cfg_cmd), &cfg_cmd);
|
||||||
|
if (ret)
|
||||||
|
IWL_ERR(mvm, "Failed to send TLC notif request (%d)\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt)
|
||||||
|
{
|
||||||
|
struct iwl_tlc_update_notif *notif;
|
||||||
|
struct iwl_mvm_sta *mvmsta;
|
||||||
|
struct iwl_lq_sta_rs_fw *lq_sta;
|
||||||
|
|
||||||
|
notif = (void *)pkt->data;
|
||||||
|
mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, notif->sta_id);
|
||||||
|
|
||||||
|
if (!mvmsta) {
|
||||||
|
IWL_ERR(mvm, "Invalid sta id (%d) in FW TLC notification\n",
|
||||||
|
notif->sta_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lq_sta = &mvmsta->lq_sta.rs_fw;
|
||||||
|
|
||||||
|
if (le16_to_cpu(notif->flags) & IWL_TLC_NOTIF_INIT_RATE_MSK) {
|
||||||
|
lq_sta->last_rate_n_flags =
|
||||||
|
le32_to_cpu(notif->values[IWL_TLC_NOTIF_INIT_RATE_POS]);
|
||||||
|
IWL_DEBUG_RATE(mvm, "new rate_n_flags: 0x%X\n",
|
||||||
|
lq_sta->last_rate_n_flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||||
enum nl80211_band band)
|
enum nl80211_band band)
|
||||||
{
|
{
|
||||||
@ -243,6 +283,8 @@ void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||||||
ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(cfg_cmd), &cfg_cmd);
|
ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(cfg_cmd), &cfg_cmd);
|
||||||
if (ret)
|
if (ret)
|
||||||
IWL_ERR(mvm, "Failed to send rate scale config (%d)\n", ret);
|
IWL_ERR(mvm, "Failed to send rate scale config (%d)\n", ret);
|
||||||
|
|
||||||
|
rs_fw_tlc_mng_notif_req_config(mvm, cfg_cmd.sta_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rs_fw_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
|
int rs_fw_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
|
||||||
|
@ -454,4 +454,5 @@ void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||||||
enum nl80211_band band);
|
enum nl80211_band band);
|
||||||
int rs_fw_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
|
int rs_fw_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
|
||||||
bool enable);
|
bool enable);
|
||||||
|
void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt);
|
||||||
#endif /* __rs__ */
|
#endif /* __rs__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user