Skip to content

Commit

Permalink
wifi: iwlwifi: support link id in SESSION_PROTECTION_NOTIF
Browse files Browse the repository at this point in the history
FW is introducing an API change in which link ID will be used
for session protection notif. Add support for it.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20231017115047.4c59b149086e.I74fe93a6337f4ec9d1bd6f791d315411ac5b40da@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Miri Korenblit authored and Johannes Berg committed Oct 23, 2023
1 parent 1350658 commit 085d33c
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
10 changes: 7 additions & 3 deletions drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,8 @@ struct iwl_mvm_session_prot_cmd {

/**
* struct iwl_mvm_session_prot_notif - session protection started / ended
* @mac_id: the mac id for which the session protection started / ended
* @mac_link_id: the mac id (or link id, for notif ver > 2) for which the
* session protection started / ended
* @status: 1 means success, 0 means failure
* @start: 1 means the session protection started, 0 means it ended
* @conf_id: see &enum iwl_mvm_session_prot_conf_id
Expand All @@ -470,10 +471,13 @@ struct iwl_mvm_session_prot_cmd {
* and end even the firmware could not schedule it.
*/
struct iwl_mvm_session_prot_notif {
__le32 mac_id;
__le32 mac_link_id;
__le32 status;
__le32 start;
__le32 conf_id;
} __packed; /* SESSION_PROTECTION_NOTIFICATION_API_S_VER_2 */
} __packed;
/* SESSION_PROTECTION_NOTIFICATION_API_S_VER_2 and
* SESSION_PROTECTION_NOTIFICATION_API_S_VER_3
*/

#endif /* __iwl_fw_api_time_event_h__ */
27 changes: 25 additions & 2 deletions drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
Original file line number Diff line number Diff line change
Expand Up @@ -898,18 +898,41 @@ void iwl_mvm_rx_session_protect_notif(struct iwl_mvm *mvm,
{
struct iwl_rx_packet *pkt = rxb_addr(rxb);
struct iwl_mvm_session_prot_notif *notif = (void *)pkt->data;
unsigned int ver =
iwl_fw_lookup_cmd_ver(mvm->fw,
WIDE_ID(MAC_CONF_GROUP,
SESSION_PROTECTION_CMD), 2);
int id = le32_to_cpu(notif->mac_link_id);
struct ieee80211_vif *vif;
struct iwl_mvm_vif *mvmvif;
unsigned int notif_link_id;

rcu_read_lock();
vif = iwl_mvm_rcu_dereference_vif_id(mvm, le32_to_cpu(notif->mac_id),
true);

if (ver <= 2) {
vif = iwl_mvm_rcu_dereference_vif_id(mvm, id, true);
} else {
struct ieee80211_bss_conf *link_conf =
iwl_mvm_rcu_fw_link_id_to_link_conf(mvm, id, true);

if (!link_conf)
goto out_unlock;

notif_link_id = link_conf->link_id;
vif = link_conf->vif;
}

if (!vif)
goto out_unlock;

mvmvif = iwl_mvm_vif_from_mac80211(vif);

if (WARN(ver > 2 && mvmvif->time_event_data.link_id >= 0 &&
mvmvif->time_event_data.link_id != notif_link_id,
"SESION_PROTECTION_NOTIF was received for link %u, while the current time event is on link %u\n",
notif_link_id, mvmvif->time_event_data.link_id))
goto out_unlock;

/* The vif is not a P2P_DEVICE, maintain its time_event_data */
if (vif->type != NL80211_IFTYPE_P2P_DEVICE) {
struct iwl_mvm_time_event_data *te_data =
Expand Down

0 comments on commit 085d33c

Please sign in to comment.