I have started looking into updating iwx(4) to newer firmware. This newer firmware is not working yet but I already have a few simple changes which could be reviewed and committed. This is the first one:
Newer iwx(4) firmware versions will require a larger beacon filter command. The extra fields fields are initialized to zero even on Linux but newer firmware will require a size change anyway. This is a fairly straightforward adaptation of changes made in iwlwifi. ok? Tested on -46 and -48 firmware. diff 83ac15007194e8c54722e3f86d4805975b1b47a8 cad9585f8bd2c9a5a5bcdc5cd1fa273652ba3309 blob - 96350c02d07ea7a54cb27f04257ced45814b15d6 blob + b65fa80f56f6dd878b1ac48bbed7ae2d191ffc76 --- sys/dev/pci/if_iwx.c +++ sys/dev/pci/if_iwx.c @@ -4411,8 +4411,16 @@ int iwx_beacon_filter_send_cmd(struct iwx_softc *sc, struct iwx_beacon_filter_cmd *cmd) { + size_t len; + + if (isset(sc->sc_ucode_api, IWX_UCODE_TLV_API_BEACON_FILTER_V4)) + len = sizeof(struct iwx_beacon_filter_cmd); + else + len = offsetof(struct iwx_beacon_filter_cmd, + bf_threshold_absolute_low); + return iwx_send_cmd_pdu(sc, IWX_REPLY_BEACON_FILTERING_CMD, - 0, sizeof(struct iwx_beacon_filter_cmd), cmd); + 0, len, cmd); } int blob - 3ca42ff579a929d5f5d71b80e8afe1943aec60f2 lob + 04653f5d23e199b791eef8421b881a6a1854343a --- sys/dev/pci/if_iwxreg.h +++ sys/dev/pci/if_iwxreg.h @@ -909,6 +909,7 @@ enum msix_ivar_for_cause { #define IWX_UCODE_TLV_API_ADAPTIVE_DWELL 32 #define IWX_UCODE_TLV_API_NEW_RX_STATS 35 #define IWX_UCODE_TLV_API_ADAPTIVE_DWELL_V2 42 +#define IWX_UCODE_TLV_API_BEACON_FILTER_V4 47 #define IWX_UCODE_TLV_API_REDUCED_SCAN_CONFIG 56 #define IWX_UCODE_TLV_API_SCAN_EXT_CHAN_VER 58 #define IWX_NUM_UCODE_TLV_API 128 @@ -3996,6 +3997,13 @@ struct iwx_uapsd_misbehaving_ap_notif { * @ba_escape_timer: Fully receive and parse beacon if no beacons were passed * for a longer period of time then this escape-timeout. Units: Beacons. * @ba_enable_beacon_abort: 1, beacon abort is enabled; 0, disabled. + * @bf_threshold_absolute_low: See below. + * @bf_threshold_absolute_high: Send Beacon to driver if Energy value calculated + * for this beacon crossed this absolute threshold. For the 'Increase' + * direction the bf_energy_absolute_low[i] is used. For the 'Decrease' + * direction the bf_energy_absolute_high[i] is used. Zero value means + * that this specific threshold is ignored for beacon filtering, and + * beacon will not be forced to be sent to driver due to this setting. */ struct iwx_beacon_filter_cmd { uint32_t bf_energy_delta; @@ -4009,7 +4017,9 @@ struct iwx_beacon_filter_cmd { uint32_t bf_escape_timer; uint32_t ba_escape_timer; uint32_t ba_enable_beacon_abort; -} __packed; + uint32_t bf_threshold_absolute_low[2]; + uint32_t bf_threshold_absolute_high[2]; +} __packed; /* BEACON_FILTER_CONFIG_API_S_VER_4 */ /* Beacon filtering and beacon abort */ #define IWX_BF_ENERGY_DELTA_DEFAULT 5