99#include <sys/endian.h>
100#include <sys/firmware.h>
101#include <sys/kernel.h>
102#include <sys/malloc.h>
104#include <sys/mutex.h>
105#include <sys/module.h>
108#include <sys/socket.h>
109#include <sys/sockio.h>
110#include <sys/sysctl.h>
111#include <sys/linker.h>
113#include <machine/bus.h>
114#include <machine/endian.h>
115#include <machine/resource.h>
118#include <net/if_var.h>
119#include <net/if_arp.h>
120#include <net/if_dl.h>
121#include <net/if_media.h>
122#include <net/if_types.h>
125#include <netinet/in.h>
126#include <netinet/in_systm.h>
127#include <netinet/if_ether.h>
128#include <netinet/ip.h>
130#include <net80211/ieee80211_var.h>
131#include <net80211/ieee80211_regdomain.h>
132#include <net80211/ieee80211_ratectl.h>
133#include <net80211/ieee80211_radiotap.h>
200 struct ieee80211_node *ni)
211 if (ni->ni_flags & IEEE80211_NODE_HT) {
232 "sf_full_timeout has wrong size");
239 "sf_full_timeout_def has wrong size");
251 .
state = htole32(new_state),
256 if (sc->
cfg->disable_dummy_notification)
279 "Invalid state: %d. not sending Smart Fifo cmd\n",
285 sizeof(sf_cmd), &sf_cmd);
299 boolean_t remove_vif)
302 struct ieee80211_node *ni = NULL;
303 int num_active_macs = 0;
306 if (changed_vif && !remove_vif)
309 switch (num_active_macs) {
317 ni = changed_vif->iv_bss;
318 if (ni != NULL &&
IWM_NODE(ni)->in_assoc &&
319 changed_vif->iv_dtim_period) {
_Static_assert(nitems(iwm_nvm_channels)<=IWM_NUM_CHANNELS, "IWM_NUM_CHANNELS is too small")
int iwm_sf_update(struct iwm_softc *sc, struct ieee80211vap *changed_vif, boolean_t remove_vif)
static const uint32_t sf_full_timeout_def[IWM_SF_NUM_SCENARIO][IWM_SF_NUM_TIMEOUT_TYPES]
static void iwm_fill_sf_command(struct iwm_softc *sc, struct iwm_sf_cfg_cmd *sf_cmd, struct ieee80211_node *ni)
static int iwm_sf_config(struct iwm_softc *sc, struct ieee80211_node *ni, enum iwm_sf_state new_state)
static const uint32_t sf_full_timeout[IWM_SF_NUM_SCENARIO][IWM_SF_NUM_TIMEOUT_TYPES]
int iwm_send_cmd_pdu(struct iwm_softc *sc, uint32_t id, uint32_t flags, uint16_t len, const void *data)
#define IWM_SF_LONG_DELAY_AGING_TIMER
#define IWM_SF_BA_IDLE_TIMER_DEF
#define IWM_SF_TX_RE_IDLE_TIMER_DEF
#define IWM_SF_BA_IDLE_TIMER
#define IWM_SF_SINGLE_UNICAST_AGING_TIMER
#define IWM_SF_BA_AGING_TIMER
#define IWM_SF_SINGLE_UNICAST_AGING_TIMER_DEF
#define IWM_SF_W_MARK_SISO
#define IWM_SF_CFG_DUMMY_NOTIF_OFF
#define IWM_SF_TX_RE_AGING_TIMER
#define IWM_SF_TX_RE_IDLE_TIMER
#define IWM_SF_MCAST_IDLE_TIMER_DEF
#define IWM_SF_MCAST_IDLE_TIMER
#define IWM_SF_AGG_UNICAST_IDLE_TIMER
#define IWM_SF_SINGLE_UNICAST_IDLE_TIMER
#define IWM_SF_W_MARK_LEGACY
#define IWM_SF_BA_AGING_TIMER_DEF
#define IWM_SF_AGG_UNICAST_AGING_TIMER
#define IWM_SF_TX_RE_AGING_TIMER_DEF
#define IWM_SF_W_MARK_SCAN
#define IWM_SF_W_MARK_MIMO2
#define IWM_SF_MCAST_AGING_TIMER
#define IWM_SF_AGG_UNICAST_AGING_TIMER_DEF
#define IWM_SF_AGG_UNICAST_IDLE_TIMER_DEF
#define IWM_SF_MCAST_AGING_TIMER_DEF
#define IWM_REPLY_SF_CFG_CMD
#define IWM_SF_NUM_TIMEOUT_TYPES
#define IWM_SF_SINGLE_UNICAST_IDLE_TIMER_DEF
uint32_t watermark[IWM_SF_TRANSIENT_STATES_NUMBER]
uint32_t full_on_timeouts[IWM_SF_NUM_SCENARIO][IWM_SF_NUM_TIMEOUT_TYPES]
uint32_t long_delay_timeouts[IWM_SF_NUM_SCENARIO][IWM_SF_NUM_TIMEOUT_TYPES]
enum iwm_sf_state sf_state
const struct iwm_cfg * cfg