Both diffs work fine here. However, it appears I'm still only loading
the -22 firmware:
iwm0: hw rev 0x230, fw ver 22.391740.0
Am I missing something obvious to get it to load the -34 firmware, or do
the two work in conjunction? I tried moving the -22 firmware out of the
way, but that caused a lot of havoc.
Tracey
On Mon, Nov 04, 2019 at 02:25:59PM +0100, Stefan Sperling wrote:
> This diff adds support for new iwm firmare's umac scan API.
> It is required to make scanning work on -34 firmware.
> Combined with the 'new ADD_STA' diff I just sent out, this is the last
> change we need to get -34 firmware working.
>
> This adds a couple of lines under #ifdef notyet for ax200 devices (which
> are the post-9k generation of devices). I kept these while porting the
> necessary changes from Linux, because we will eventually need them.
>
> I really don't like that huge union of structs but that is how Linux
> solved the backwards compat issue. Unless Intel starts providing newer
> firmware images for old devices (unlikely) keeping track of which API
> version is needed with which fimware image is only going to get more
> difficult over time. So I'd prefer our approach to remain close enough to
> Linux to allow code for newer devices to be ported without too much effort.
>
> ok?
>
> diff 0181db2e1507c7a303c9d89a8410f8181993d536
> 7ccc2a384b9e6c567f74851744d872e72c7d91bc
> blob - 73727efa2ad5d72670c6c2129ee76f4e77797652
> blob + 0199163cc7f36c58992a881dd498b30ff1febc38
> --- sys/dev/pci/if_iwm.c
> +++ sys/dev/pci/if_iwm.c
> @@ -546,7 +546,9 @@ iwm_firmware_store_section(struct iwm_softc *sc, enum
> return 0;
> }
>
> -#define IWM_DEFAULT_SCAN_CHANNELS 40
> +#define IWM_DEFAULT_SCAN_CHANNELS 40
> +/* Newer firmware might support more channels. Raise this value if needed. */
> +#define IWM_MAX_SCAN_CHANNELS 52 /* as of 8265-34 firmware
> image */
>
> struct iwm_tlv_calib_data {
> uint32_t ucode_type;
> @@ -837,6 +839,10 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode
> }
> sc->sc_capa_n_scan_channels =
> le32toh(*(uint32_t *)tlv_data);
> + if (sc->sc_capa_n_scan_channels >
> IWM_MAX_SCAN_CHANNELS) {
> + err = ERANGE;
> + goto parse_out;
> + }
> break;
>
> case IWM_UCODE_TLV_FW_VERSION:
> @@ -4939,6 +4945,24 @@ iwm_umac_scan_fill_channels(struct iwm_softc *sc,
> }
>
> int
> +iwm_fill_probe_req_v1(struct iwm_softc *sc, struct iwm_scan_probe_req_v1
> *preq1)
> +{
> + struct iwm_scan_probe_req preq2;
> + int err, i;
> +
> + err = iwm_fill_probe_req(sc, &preq2);
> + if (err)
> + return err;
> +
> + preq1->mac_header = preq2.mac_header;
> + for (i = 0; i < nitems(preq1->band_data); i++)
> + preq1->band_data[i] = preq2.band_data[i];
> + preq1->common_data = preq2.common_data;
> + memcpy(preq1->buf, preq2.buf, sizeof(preq1->buf));
> + return 0;
> +}
> +
> +int
> iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq)
> {
> struct ieee80211com *ic = &sc->sc_ic;
> @@ -5042,12 +5066,13 @@ iwm_lmac_scan(struct iwm_softc *sc, int bgscan)
> .flags = 0,
> };
> struct iwm_scan_req_lmac *req;
> + struct iwm_scan_probe_req_v1 *preq;
> size_t req_len;
> int err, async = bgscan;
>
> req_len = sizeof(struct iwm_scan_req_lmac) +
> (sizeof(struct iwm_scan_channel_cfg_lmac) *
> - sc->sc_capa_n_scan_channels) + sizeof(struct iwm_scan_probe_req);
> + sc->sc_capa_n_scan_channels) + sizeof(struct iwm_scan_probe_req_v1);
> if (req_len > IWM_MAX_CMD_PAYLOAD_SIZE)
> return ENOMEM;
> req = malloc(req_len, M_DEVBUF,
> @@ -5120,10 +5145,10 @@ iwm_lmac_scan(struct iwm_softc *sc, int bgscan)
> (struct iwm_scan_channel_cfg_lmac *)req->data,
> ic->ic_des_esslen != 0, bgscan);
>
> - err = iwm_fill_probe_req(sc,
> - (struct iwm_scan_probe_req *)(req->data +
> - (sizeof(struct iwm_scan_channel_cfg_lmac) *
> - sc->sc_capa_n_scan_channels)));
> + preq = (struct iwm_scan_probe_req_v1 *)(req->data +
> + (sizeof(struct iwm_scan_channel_cfg_lmac) *
> + sc->sc_capa_n_scan_channels));
> + err = iwm_fill_probe_req_v1(sc, preq);
> if (err) {
> free(req, M_DEVBUF, req_len);
> return err;
> @@ -5184,9 +5209,7 @@ iwm_config_umac_scan(struct iwm_softc *sc)
> IEEE80211_ADDR_COPY(scan_config->mac_addr, sc->sc_ic.ic_myaddr);
>
> scan_config->bcast_sta_id = IWM_AUX_STA_ID;
> - scan_config->channel_flags = IWM_CHANNEL_FLAG_EBS |
> - IWM_CHANNEL_FLAG_ACCURATE_EBS | IWM_CHANNEL_FLAG_EBS_ADD |
> - IWM_CHANNEL_FLAG_PRE_SCAN_PASSIVE2ACTIVE;
> + scan_config->channel_flags = 0;
>
> for (c = &ic->ic_channels[1], nchan = 0;
> c <= &ic->ic_channels[IEEE80211_CHAN_MAX] &&
> @@ -5218,6 +5241,72 @@ iwm_config_umac_scan(struct iwm_softc *sc)
> }
>
> int
> +iwm_umac_scan_size(struct iwm_softc *sc)
> +{
> + int base_size = IWM_SCAN_REQ_UMAC_SIZE_V1;
> + int tail_size;
> +
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2))
> + base_size = IWM_SCAN_REQ_UMAC_SIZE_V8;
> + else if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL))
> + base_size = IWM_SCAN_REQ_UMAC_SIZE_V7;
> +#ifdef notyet
> + else if (sc->sc_device_family >= IWM_DEVICE_FAMILY_22000)
> + base_size = IWM_SCAN_REQ_UMAC_SIZE_V6;
> +#endif
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_SCAN_EXT_CHAN_VER))
> + tail_size = sizeof(struct iwm_scan_req_umac_tail_v2);
> + else
> + tail_size = sizeof(struct iwm_scan_req_umac_tail_v1);
> +
> + return base_size + sizeof(struct iwm_scan_channel_cfg_umac) *
> + sc->sc_capa_n_scan_channels + tail_size;
> +}
> +
> +struct iwm_scan_umac_chan_param *
> +iwm_get_scan_req_umac_chan_param(struct iwm_softc *sc,
> + struct iwm_scan_req_umac *req)
> +{
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2))
> + return &req->v8.channel;
> +
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL))
> + return &req->v7.channel;
> +#ifdef notyet
> + if (sc->sc_device_family >= IWM_DEVICE_FAMILY_22000)
> + return &req->v6.channel;
> +#endif
> + return &req->v1.channel;
> +}
> +
> +void *
> +iwm_get_scan_req_umac_data(struct iwm_softc *sc, struct iwm_scan_req_umac
> *req)
> +{
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2))
> + return (void *)&req->v8.data;
> +
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL))
> + return (void *)&req->v7.data;
> +#ifdef notyet
> + if (sc->sc_device_family >= IWM_DEVICE_FAMILY_22000)
> + return (void *)&req->v6.data;
> +#endif
> + return (void *)&req->v1.data;
> +
> +}
> +
> +/* adaptive dwell max budget time [TU] for full scan */
> +#define IWM_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN 300
> +/* adaptive dwell max budget time [TU] for directed scan */
> +#define IWM_SCAN_ADWELL_MAX_BUDGET_DIRECTED_SCAN 100
> +/* adaptive dwell default high band APs number */
> +#define IWM_SCAN_ADWELL_DEFAULT_HB_N_APS 8
> +/* adaptive dwell default low band APs number */
> +#define IWM_SCAN_ADWELL_DEFAULT_LB_N_APS 2
> +/* adaptive dwell default APs number in social channels (1, 6, 11) */
> +#define IWM_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL 10
> +
> +int
> iwm_umac_scan(struct iwm_softc *sc, int bgscan)
> {
> struct ieee80211com *ic = &sc->sc_ic;
> @@ -5225,19 +5314,21 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan)
> .id = iwm_cmd_id(IWM_SCAN_REQ_UMAC, IWM_LONG_GROUP, 0),
> .len = { 0, },
> .data = { NULL, },
> - .flags =0,
> + .flags = 0,
> };
> struct iwm_scan_req_umac *req;
> - struct iwm_scan_req_umac_tail *tail;
> + void *cmd_data, *tail_data;
> + struct iwm_scan_req_umac_tail_v2 *tail;
> + struct iwm_scan_req_umac_tail_v1 *tailv1;
> + struct iwm_scan_umac_chan_param *chanparam;
> size_t req_len;
> int err, async = bgscan;
>
> - req_len = sizeof(struct iwm_scan_req_umac) +
> - (sizeof(struct iwm_scan_channel_cfg_umac) *
> - sc->sc_capa_n_scan_channels) +
> - sizeof(struct iwm_scan_req_umac_tail);
> - if (req_len > IWM_MAX_CMD_PAYLOAD_SIZE)
> - return ENOMEM;
> + req_len = iwm_umac_scan_size(sc);
> + if ((req_len < IWM_SCAN_REQ_UMAC_SIZE_V1 +
> + sizeof(struct iwm_scan_req_umac_tail_v1)) ||
> + req_len > IWM_MAX_CMD_PAYLOAD_SIZE)
> + return ERANGE;
> req = malloc(req_len, M_DEVBUF,
> (async ? M_NOWAIT : M_WAIT) | M_CANFAIL | M_ZERO);
> if (req == NULL)
> @@ -5247,40 +5338,88 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan)
> hcmd.data[0] = (void *)req;
> hcmd.flags |= async ? IWM_CMD_ASYNC : 0;
>
> - /* These timings correspond to iwlwifi's UNASSOC scan. */
> - req->active_dwell = 10;
> - req->passive_dwell = 110;
> - req->fragmented_dwell = 44;
> - req->extended_dwell = 90;
> - if (bgscan) {
> - req->max_out_time = htole32(120);
> - req->suspend_time = htole32(120);
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL)) {
> + req->v7.adwell_default_n_aps_social =
> + IWM_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL;
> + req->v7.adwell_default_n_aps =
> + IWM_SCAN_ADWELL_DEFAULT_LB_N_APS;
> +
> + if (ic->ic_des_esslen != 0)
> + req->v7.adwell_max_budget =
> + htole16(IWM_SCAN_ADWELL_MAX_BUDGET_DIRECTED_SCAN);
> + else
> + req->v7.adwell_max_budget =
> + htole16(IWM_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN);
> +
> + req->v7.scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
> + req->v7.max_out_time[IWM_SCAN_LB_LMAC_IDX] = 0;
> + req->v7.suspend_time[IWM_SCAN_LB_LMAC_IDX] = 0;
> +
> + if (isset(sc->sc_ucode_api,
> + IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2)) {
> + req->v8.active_dwell[IWM_SCAN_LB_LMAC_IDX] = 10;
> + req->v8.passive_dwell[IWM_SCAN_LB_LMAC_IDX] = 110;
> + } else {
> + req->v7.active_dwell = 10;
> + req->v7.passive_dwell = 110;
> + req->v7.fragmented_dwell = 44;
> + }
> } else {
> - req->max_out_time = htole32(0);
> - req->suspend_time = htole32(0);
> + /* These timings correspond to iwlwifi's UNASSOC scan. */
> + req->v1.active_dwell = 10;
> + req->v1.passive_dwell = 110;
> + req->v1.fragmented_dwell = 44;
> + req->v1.extended_dwell = 90;
> }
>
> - req->scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
> + if (bgscan) {
> + const uint32_t timeout = htole32(120);
> + if (isset(sc->sc_ucode_api,
> + IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2)) {
> + req->v8.max_out_time[IWM_SCAN_LB_LMAC_IDX] = timeout;
> + req->v8.suspend_time[IWM_SCAN_LB_LMAC_IDX] = timeout;
> + } else if (isset(sc->sc_ucode_api,
> + IWM_UCODE_TLV_API_ADAPTIVE_DWELL)) {
> + req->v7.max_out_time[IWM_SCAN_LB_LMAC_IDX] = timeout;
> + req->v7.suspend_time[IWM_SCAN_LB_LMAC_IDX] = timeout;
> + } else {
> + req->v1.max_out_time = timeout;
> + req->v1.suspend_time = timeout;
> + }
> + }
> +
> + req->v1.scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
> req->ooc_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
>
> - req->n_channels = iwm_umac_scan_fill_channels(sc,
> - (struct iwm_scan_channel_cfg_umac *)req->data,
> + cmd_data = iwm_get_scan_req_umac_data(sc, req);
> + chanparam = iwm_get_scan_req_umac_chan_param(sc, req);
> + chanparam->count = iwm_umac_scan_fill_channels(sc,
> + (struct iwm_scan_channel_cfg_umac *)cmd_data,
> ic->ic_des_esslen != 0, bgscan);
> + chanparam->flags = 0;
>
> + tail_data = cmd_data + sizeof(struct iwm_scan_channel_cfg_umac) *
> + sc->sc_capa_n_scan_channels;
> + tail = tail_data;
> + /* tail v1 layout differs in preq and direct_scan member fields. */
> + tailv1 = tail_data;
> +
> req->general_flags = htole32(IWM_UMAC_SCAN_GEN_FLAGS_PASS_ALL |
> - IWM_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE |
> - IWM_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL);
> + IWM_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE);
>
> - tail = (void *)&req->data +
> - sizeof(struct iwm_scan_channel_cfg_umac) *
> - sc->sc_capa_n_scan_channels;
> -
> /* Check if we're doing an active directed scan. */
> if (ic->ic_des_esslen != 0) {
> - tail->direct_scan[0].id = IEEE80211_ELEMID_SSID;
> - tail->direct_scan[0].len = ic->ic_des_esslen;
> - memcpy(tail->direct_scan[0].ssid, ic->ic_des_essid,
> - ic->ic_des_esslen);
> + if (isset(sc->sc_ucode_api,
> IWM_UCODE_TLV_API_SCAN_EXT_CHAN_VER)) {
> + tail->direct_scan[0].id = IEEE80211_ELEMID_SSID;
> + tail->direct_scan[0].len = ic->ic_des_esslen;
> + memcpy(tail->direct_scan[0].ssid, ic->ic_des_essid,
> + ic->ic_des_esslen);
> + } else {
> + tailv1->direct_scan[0].id = IEEE80211_ELEMID_SSID;
> + tailv1->direct_scan[0].len = ic->ic_des_esslen;
> + memcpy(tailv1->direct_scan[0].ssid, ic->ic_des_essid,
> + ic->ic_des_esslen);
> + }
> req->general_flags |=
> htole32(IWM_UMAC_SCAN_GEN_FLAGS_PRE_CONNECT);
> } else
> @@ -5291,7 +5430,18 @@ iwm_umac_scan(struct iwm_softc *sc, int bgscan)
> req->general_flags |=
> htole32(IWM_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED);
>
> - err = iwm_fill_probe_req(sc, &tail->preq);
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_ADAPTIVE_DWELL)) {
> + req->general_flags |=
> + htole32(IWM_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL);
> + } else {
> + req->general_flags |=
> + htole32(IWM_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL);
> + }
> +
> + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_SCAN_EXT_CHAN_VER))
> + err = iwm_fill_probe_req(sc, &tail->preq);
> + else
> + err = iwm_fill_probe_req_v1(sc, &tailv1->preq);
> if (err) {
> free(req, M_DEVBUF, req_len);
> return err;
> blob - 8d0564aa8c5a74ad83853f409edd1845d86cae47
> blob + e1f75f40b907ffdf22520dfd39a9aae28335c600
> --- sys/dev/pci/if_iwmreg.h
> +++ sys/dev/pci/if_iwmreg.h
> @@ -639,6 +639,8 @@
> #define IWM_UCODE_TLV_API_NAN2_VER2 31
> #define IWM_UCODE_TLV_API_ADAPTIVE_DWELL 32
> #define IWM_UCODE_TLV_API_NEW_RX_STATS 35
> +#define IWM_UCODE_TLV_API_ADAPTIVE_DWELL_V2 42
> +#define IWM_UCODE_TLV_API_SCAN_EXT_CHAN_VER 58
> #define IWM_NUM_UCODE_TLV_API 128
>
> #define IWM_UCODE_TLV_API_BITS \
> @@ -4863,13 +4865,27 @@ struct iwm_scan_probe_segment {
> * @common_data: last (and common) part of the probe
> * @buf: raw data block
> */
> -struct iwm_scan_probe_req {
> +struct iwm_scan_probe_req_v1 {
> struct iwm_scan_probe_segment mac_header;
> struct iwm_scan_probe_segment band_data[2];
> struct iwm_scan_probe_segment common_data;
> uint8_t buf[IWM_SCAN_OFFLOAD_PROBE_REQ_SIZE];
> } __packed;
>
> +/* iwl_scan_probe_req - PROBE_REQUEST_FRAME_API_S_VER_v2
> + * @mac_header: first (and common) part of the probe
> + * @band_data: band specific data
> + * @common_data: last (and common) part of the probe
> + * @buf: raw data block
> + */
> +struct iwm_scan_probe_req {
> + struct iwm_scan_probe_segment mac_header;
> + struct iwm_scan_probe_segment band_data[3];
> + struct iwm_scan_probe_segment common_data;
> + uint8_t buf[IWM_SCAN_OFFLOAD_PROBE_REQ_SIZE];
> +} __packed;
> +
> +
> #define IWM_SCAN_CHANNEL_FLAG_EBS (1 << 0)
> #define IWM_SCAN_CHANNEL_FLAG_EBS_ACCURATE (1 << 1)
> #define IWM_SCAN_CHANNEL_FLAG_CACHE_ADD (1 << 2)
> @@ -5205,6 +5221,14 @@ struct iwm_scan_config {
> #define IWM_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED (1 << 8)
> #define IWM_UMAC_SCAN_GEN_FLAGS_MATCH (1 << 9)
> #define IWM_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL (1 << 10)
> +/* Extended dwell is obselete when adaptive dwell is used, making this
> + * bit reusable. Hence, probe request defer is used only when adaptive
> + * dwell is supported. */
> +#define IWM_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP (1 << 10)
> +#define IWM_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED (1 << 11)
> +#define IWM_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL (1 << 13)
> +#define IWM_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME (1 << 14)
> +#define IWM_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE (1 << 15)
>
> /**
> * struct iwm_scan_channel_cfg_umac
> @@ -5241,32 +5265,77 @@ struct iwm_scan_umac_schedule {
> * @preq: probe request with IEs blocks
> * @direct_scan: list of SSIDs for directed active scan
> */
> -struct iwm_scan_req_umac_tail {
> +struct iwm_scan_req_umac_tail_v1 {
> /* SCAN_PERIODIC_PARAMS_API_S_VER_1 */
> struct iwm_scan_umac_schedule schedule[IWM_MAX_SCHED_SCAN_PLANS];
> uint16_t delay;
> uint16_t reserved;
> /* SCAN_PROBE_PARAMS_API_S_VER_1 */
> + struct iwm_scan_probe_req_v1 preq;
> + struct iwm_ssid_ie direct_scan[IWM_PROBE_OPTION_MAX];
> +} __packed;
> +
> +/**
> + * struct iwm_scan_req_umac_tail - the rest of the UMAC scan request command
> + * parameters following channels configuration array.
> + * @schedule: two scheduling plans.
> + * @delay: delay in TUs before starting the first scan iteration
> + * @reserved: for future use and alignment
> + * @preq: probe request with IEs blocks
> + * @direct_scan: list of SSIDs for directed active scan
> + */
> +struct iwm_scan_req_umac_tail_v2 {
> + /* SCAN_PERIODIC_PARAMS_API_S_VER_1 */
> + struct iwm_scan_umac_schedule schedule[IWM_MAX_SCHED_SCAN_PLANS];
> + uint16_t delay;
> + uint16_t reserved;
> + /* SCAN_PROBE_PARAMS_API_S_VER_2 */
> struct iwm_scan_probe_req preq;
> struct iwm_ssid_ie direct_scan[IWM_PROBE_OPTION_MAX];
> } __packed;
>
> /**
> + * struct iwm_scan_umac_chan_param
> + * @flags: channel flags &enum iwl_scan_channel_flags
> + * @count: num of channels in scan request
> + * @reserved: for future use and alignment
> + */
> +struct iwm_scan_umac_chan_param {
> + uint8_t flags;
> + uint8_t count;
> + uint16_t reserved;
> +} __packed; /* SCAN_CHANNEL_PARAMS_API_S_VER_1 */
> +
> +#define IWM_SCAN_LB_LMAC_IDX 0
> +#define IWM_SCAN_HB_LMAC_IDX 1
> +
> +/**
> * struct iwm_scan_req_umac
> - * @flags: &enum iwm_umac_scan_flags
> - * @uid: scan id, &enum iwm_umac_scan_uid_offsets
> - * @ooc_priority: out of channel priority - &enum iwm_scan_priority
> - * @general_flags: &enum iwm_umac_scan_general_flags
> + * @flags: &enum iwl_umac_scan_flags
> + * @uid: scan id, &enum iwl_umac_scan_uid_offsets
> + * @ooc_priority: out of channel priority - &enum iwl_scan_priority
> + * @general_flags: &enum iwl_umac_scan_general_flags
> + * @scan_start_mac_id: report the scan start TSF time according to this mac
> TSF
> * @extended_dwell: dwell time for channels 1, 6 and 11
> - * @active_dwell: dwell time for active scan
> - * @passive_dwell: dwell time for passive scan
> + * @active_dwell: dwell time for active scan per LMAC
> + * @passive_dwell: dwell time for passive scan per LMAC
> * @fragmented_dwell: dwell time for fragmented passive scan
> - * @max_out_time: max out of serving channel time
> - * @suspend_time: max suspend time
> - * @scan_priority: scan internal prioritization &enum iwm_scan_priority
> - * @channel_flags: &enum iwm_scan_channel_flags
> - * @n_channels: num of channels in scan request
> + * @adwell_default_n_aps: for adaptive dwell the default number of APs
> + * per channel
> + * @adwell_default_n_aps_social: for adaptive dwell the default
> + * number of APs per social (1,6,11) channel
> + * @general_flags2: &enum iwl_umac_scan_general_flags2
> + * @adwell_max_budget: for adaptive dwell the maximal budget of TU to be
> added
> + * to total scan time
> + * @max_out_time: max out of serving channel time, per LMAC - for CDB there
> + * are 2 LMACs (high band and low band)
> + * @suspend_time: max suspend time, per LMAC - for CDB there are 2 LMACs
> + * @scan_priority: scan internal prioritization &enum iwl_scan_priority
> + * @num_of_fragments: Number of fragments needed for full coverage per band.
> + * Relevant only for fragmented scan.
> + * @channel: &struct iwm_scan_umac_chan_param
> * @reserved: for future use and alignment
> + * @reserved3: for future use and alignment
> * @data: &struct iwm_scan_channel_cfg_umac and
> * &struct iwm_scan_req_umac_tail
> */
> @@ -5275,20 +5344,83 @@ struct iwm_scan_req_umac {
> uint32_t uid;
> uint32_t ooc_priority;
> /* SCAN_GENERAL_PARAMS_API_S_VER_1 */
> - uint32_t general_flags;
> - uint8_t extended_dwell;
> - uint8_t active_dwell;
> - uint8_t passive_dwell;
> - uint8_t fragmented_dwell;
> - uint32_t max_out_time;
> - uint32_t suspend_time;
> - uint32_t scan_priority;
> - /* SCAN_CHANNEL_PARAMS_API_S_VER_1 */
> - uint8_t channel_flags;
> - uint8_t n_channels;
> - uint16_t reserved;
> - uint8_t data[];
> -} __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_1 */
> + uint16_t general_flags;
> + uint8_t reserved;
> + uint8_t scan_start_mac_id;
> + union {
> + struct {
> + uint8_t extended_dwell;
> + uint8_t active_dwell;
> + uint8_t passive_dwell;
> + uint8_t fragmented_dwell;
> + uint32_t max_out_time;
> + uint32_t suspend_time;
> + uint32_t scan_priority;
> + struct iwm_scan_umac_chan_param channel;
> + uint8_t data[];
> + } v1; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_1 */
> + struct {
> + uint8_t extended_dwell;
> + uint8_t active_dwell;
> + uint8_t passive_dwell;
> + uint8_t fragmented_dwell;
> + uint32_t max_out_time[2];
> + uint32_t suspend_time[2];
> + uint32_t scan_priority;
> + struct iwm_scan_umac_chan_param channel;
> + uint8_t data[];
> + } v6; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_6 */
> + struct {
> + uint8_t active_dwell;
> + uint8_t passive_dwell;
> + uint8_t fragmented_dwell;
> + uint8_t adwell_default_n_aps;
> + uint8_t adwell_default_n_aps_social;
> + uint8_t reserved3;
> + uint16_t adwell_max_budget;
> + uint32_t max_out_time[2];
> + uint32_t suspend_time[2];
> + uint32_t scan_priority;
> + struct iwm_scan_umac_chan_param channel;
> + uint8_t data[];
> + } v7; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_7 */
> + struct {
> + uint8_t active_dwell[2];
> + uint8_t reserved2;
> + uint8_t adwell_default_n_aps;
> + uint8_t adwell_default_n_aps_social;
> + uint8_t general_flags2;
> + uint16_t adwell_max_budget;
> + uint32_t max_out_time[2];
> + uint32_t suspend_time[2];
> + uint32_t scan_priority;
> + uint8_t passive_dwell[2];
> + uint8_t num_of_fragments[2];
> + struct iwm_scan_umac_chan_param channel;
> + uint8_t data[];
> + } v8; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_8 */
> + struct {
> + uint8_t active_dwell[2];
> + uint8_t adwell_default_hb_n_aps;
> + uint8_t adwell_default_lb_n_aps;
> + uint8_t adwell_default_n_aps_social;
> + uint8_t general_flags2;
> + uint16_t adwell_max_budget;
> + uint32_t max_out_time[2];
> + uint32_t suspend_time[2];
> + uint32_t scan_priority;
> + uint8_t passive_dwell[2];
> + uint8_t num_of_fragments[2];
> + struct iwm_scan_umac_chan_param channel;
> + uint8_t data[];
> + } v9; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_9 */
> + };
> +} __packed;
> +
> +#define IWM_SCAN_REQ_UMAC_SIZE_V8 sizeof(struct iwm_scan_req_umac)
> +#define IWM_SCAN_REQ_UMAC_SIZE_V7 48
> +#define IWM_SCAN_REQ_UMAC_SIZE_V6 44
> +#define IWM_SCAN_REQ_UMAC_SIZE_V1 36
>
> /**
> * struct iwm_umac_scan_abort
--
Tracey Emery