]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: iwlwifi: mld: add support for nan schedule config command version 2
authorAvraham Stern <avraham.stern@intel.com>
Tue, 12 May 2026 19:34:39 +0000 (22:34 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Tue, 26 May 2026 12:17:11 +0000 (15:17 +0300)
Version 2 of the NAN schedule config command adds support for deferred
schedule update and passing the availability attribute blob to
firmware.
Add support for the new command version. Currently the new
functionality is not supported.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Link: https://patch.msgid.link/20260512222731.422e4bc47f84.I04b7dec6f3e48cfd950e7ff6f13484d0881d832e@changeid
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/mac-cfg.h
drivers/net/wireless/intel/iwlwifi/mld/nan.c

index 75b4773190967daafb07c63b193e0193714a7d9e..dd850aeebdeccf1e6167b08102210a0f11b5b422 100644 (file)
@@ -1253,6 +1253,27 @@ struct iwl_nan_config_cmd {
        u8 beacon_data[];
 } __packed; /*  NAN_CONFIG_CMD_API_S_VER_1 */
 
+/**
+ * struct iwl_nan_schedule_cmd_v1 - NAN schedule command
+ * @channels: per channel information
+ * @channels.availability_map: bitmap of slots this channel is advertising
+ *     availability on, will be ULW'ed out if no link/inactive link is
+ *     referenced by the link ID below
+ * @channels.channel_entry: NAN channel entry descriptor
+ * @channels.link_id: FW link ID, or %0xFF for unset
+ * @channels.reserved: (reserved)
+ */
+struct iwl_nan_schedule_cmd_v1 {
+       struct {
+               __le32 availability_map;
+               u8 channel_entry[6];
+               u8 link_id;
+               u8 reserved;
+       } __packed channels[NUM_PHY_CTX];
+} __packed; /* NAN_SCHEDULE_CMD_API_S_VER_1 */
+
+#define IWL_MAX_AVAILABILITY_ATTR_LEN 54
+
 /**
  * struct iwl_nan_schedule_cmd - NAN schedule command
  * @channels: per channel information
@@ -1262,6 +1283,14 @@ struct iwl_nan_config_cmd {
  * @channels.channel_entry: NAN channel entry descriptor
  * @channels.link_id: FW link ID, or %0xFF for unset
  * @channels.reserved: (reserved)
+ * @avail_attr: NAN availability attribute information
+ * @avail_attr.attr_len: length of the availability attribute
+ * @avail_attr.reserved: reserved
+ * @avail_attr.attr: the availability attribute including the attribute header
+ * @deferred: true if the firmware should defer applying the schedule until
+ *     notifying all peers. For a deferred schedule update, the firmware should
+ *     send a notification to the driver after the new schedule is applied.
+ * @reserved: reserved
  */
 struct iwl_nan_schedule_cmd {
        struct {
@@ -1270,7 +1299,16 @@ struct iwl_nan_schedule_cmd {
                u8 link_id;
                u8 reserved;
        } __packed channels[NUM_PHY_CTX];
-} __packed; /* NAN_SCHEDULE_CMD_API_S_VER_1 */
+
+       struct {
+               u8 attr_len;
+               u8 reserved;
+               u8 attr[IWL_MAX_AVAILABILITY_ATTR_LEN];
+       } __packed avail_attr;
+
+       u8 deferred;
+       u8 reserved[3];
+} __packed; /* NAN_SCHEDULE_CMD_API_S_VER_2 */
 
 /**
  * struct iwl_nan_peer_cmd - NAN peer command
index 913f0acf172adbbb48f288996f57190edd58b754..53a0c3b9bb33e1ca3e2c10a5d93d74d99e760c38 100644 (file)
@@ -546,11 +546,27 @@ void iwl_mld_nan_vif_cfg_changed(struct iwl_mld *mld,
        bool added_links = false;
        bool empty_schedule = true;
        int ret, i;
+       u16 cmd_size;
+       u32 cmd_id = WIDE_ID(MAC_CONF_GROUP, NAN_SCHEDULE_CMD);
+       u8 version = iwl_fw_lookup_cmd_ver(mld->fw, cmd_id, 0);
 
        if (!(changes & BSS_CHANGED_NAN_LOCAL_SCHED))
                return;
 
-       for (i = 0; i <  ARRAY_SIZE(sched_cfg->channels); i++) {
+       switch (version) {
+       case 1:
+               cmd_size = sizeof(struct iwl_nan_schedule_cmd_v1);
+               break;
+       case 2:
+               cmd_size = sizeof(struct iwl_nan_schedule_cmd);
+               break;
+       default:
+               IWL_ERR(mld, "NAN: unsupported NAN schedule cmd version %d\n",
+                       version);
+               return;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sched_cfg->channels); i++) {
                if (!sched_cfg->channels[i].chanreq.oper.chan)
                        continue;
                empty_schedule = false;
@@ -647,9 +663,7 @@ void iwl_mld_nan_vif_cfg_changed(struct iwl_mld *mld,
                cmd.channels[chan_idx].availability_map |= cpu_to_le32(BIT(i));
        }
 
-       ret = iwl_mld_send_cmd_pdu(mld,
-                                  WIDE_ID(MAC_CONF_GROUP, NAN_SCHEDULE_CMD),
-                                  &cmd);
+       ret = iwl_mld_send_cmd_pdu(mld, cmd_id, &cmd, cmd_size);
        if (ret)
                IWL_ERR(mld, "NAN: failed to update schedule (%d)\n", ret);