// SPDX-License-Identifier: GPL-2.0-only /* * NXP Wireless LAN device driver: station command handling * * Copyright 2011-2020 NXP */ #include "decl.h" #include "ioctl.h" #include "util.h" #include "fw.h" #include "main.h" #include "wmm.h" #include "11n.h" #include "11ac.h" static bool drcs; module_param(drcs, bool, 0644); MODULE_PARM_DESC(…) …; static bool disable_auto_ds; module_param(disable_auto_ds, bool, 0); MODULE_PARM_DESC(…) …; /* * This function prepares command to set/get RSSI information. * * Preparation includes - * - Setting command ID, action and proper size * - Setting data/beacon average factors * - Resetting SNR/NF/RSSI values in private structure * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_rssi_info(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action) { … } /* * This function prepares command to set MAC control. * * Preparation includes - * - Setting command ID, action and proper size * - Ensuring correct endian-ness */ static int mwifiex_cmd_mac_control(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, u32 *action) { … } /* * This function prepares command to set/get SNMP MIB. * * Preparation includes - * - Setting command ID, action and proper size * - Setting SNMP MIB OID number and value * (as required) * - Ensuring correct endian-ness * * The following SNMP MIB OIDs are supported - * - FRAG_THRESH_I : Fragmentation threshold * - RTS_THRESH_I : RTS threshold * - SHORT_RETRY_LIM_I : Short retry limit * - DOT11D_I : 11d support */ static int mwifiex_cmd_802_11_snmp_mib(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, u32 cmd_oid, u16 *ul_temp) { … } /* * This function prepares command to get log. * * Preparation includes - * - Setting command ID and proper size * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_get_log(struct host_cmd_ds_command *cmd) { … } /* * This function prepares command to set/get Tx data rate configuration. * * Preparation includes - * - Setting command ID, action and proper size * - Setting configuration index, rate scope and rate drop pattern * parameters (as required) * - Ensuring correct endian-ness */ static int mwifiex_cmd_tx_rate_cfg(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, u16 *pbitmap_rates) { … } /* * This function prepares command to set/get Tx power configuration. * * Preparation includes - * - Setting command ID, action and proper size * - Setting Tx power mode, power group TLV * (as required) * - Ensuring correct endian-ness */ static int mwifiex_cmd_tx_power_cfg(struct host_cmd_ds_command *cmd, u16 cmd_action, struct host_cmd_ds_txpwr_cfg *txp) { … } /* * This function prepares command to get RF Tx power. */ static int mwifiex_cmd_rf_tx_power(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, void *data_buf) { … } /* * This function prepares command to set rf antenna. */ static int mwifiex_cmd_rf_antenna(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, struct mwifiex_ds_ant_cfg *ant_cfg) { … } /* * This function prepares command to set Host Sleep configuration. * * Preparation includes - * - Setting command ID and proper size * - Setting Host Sleep action, conditions, ARP filters * (as required) * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_hs_cfg(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, struct mwifiex_hs_config_param *hscfg_param) { … } /* * This function prepares command to set/get MAC address. * * Preparation includes - * - Setting command ID, action and proper size * - Setting MAC address (for SET only) * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_mac_address(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action) { … } /* * This function prepares command to set MAC multicast address. * * Preparation includes - * - Setting command ID, action and proper size * - Setting MAC multicast address * - Ensuring correct endian-ness */ static int mwifiex_cmd_mac_multicast_adr(struct host_cmd_ds_command *cmd, u16 cmd_action, struct mwifiex_multicast_list *mcast_list) { … } /* * This function prepares command to deauthenticate. * * Preparation includes - * - Setting command ID and proper size * - Setting AP MAC address and reason code * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_deauthenticate(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u8 *mac) { … } /* * This function prepares command to stop Ad-Hoc network. * * Preparation includes - * - Setting command ID and proper size * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_ad_hoc_stop(struct host_cmd_ds_command *cmd) { … } /* * This function sets WEP key(s) to key parameter TLV(s). * * Multi-key parameter TLVs are supported, so we can send multiple * WEP keys in a single buffer. */ static int mwifiex_set_keyparamset_wep(struct mwifiex_private *priv, struct mwifiex_ie_type_key_param_set *key_param_set, u16 *key_param_len) { … } /* This function populates key material v2 command * to set network key for AES & CMAC AES. */ static int mwifiex_set_aes_key_v2(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, struct mwifiex_ds_encrypt_key *enc_key, struct host_cmd_ds_802_11_key_material_v2 *km) { … } /* This function prepares command to set/get/reset network key(s). * This function prepares key material command for V2 format. * Preparation includes - * - Setting command ID, action and proper size * - Setting WEP keys, WAPI keys or WPA keys along with required * encryption (TKIP, AES) (as required) * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_key_material_v2(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, u32 cmd_oid, struct mwifiex_ds_encrypt_key *enc_key) { … } /* * This function prepares command to set/get/reset network key(s). * This function prepares key material command for V1 format. * * Preparation includes - * - Setting command ID, action and proper size * - Setting WEP keys, WAPI keys or WPA keys along with required * encryption (TKIP, AES) (as required) * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11_key_material_v1(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, u32 cmd_oid, struct mwifiex_ds_encrypt_key *enc_key) { … } /* Wrapper function for setting network key depending upon FW KEY API version */ static int mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, u32 cmd_oid, struct mwifiex_ds_encrypt_key *enc_key) { … } /* * This function prepares command to set/get 11d domain information. * * Preparation includes - * - Setting command ID, action and proper size * - Setting domain information fields (for SET only) * - Ensuring correct endian-ness */ static int mwifiex_cmd_802_11d_domain_info(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action) { … } /* * This function prepares command to set/get IBSS coalescing status. * * Preparation includes - * - Setting command ID, action and proper size * - Setting status to enable or disable (for SET only) * - Ensuring correct endian-ness */ static int mwifiex_cmd_ibss_coalescing_status(struct host_cmd_ds_command *cmd, u16 cmd_action, u16 *enable) { … } /* This function prepares command buffer to get/set memory location value. */ static int mwifiex_cmd_mem_access(struct host_cmd_ds_command *cmd, u16 cmd_action, void *pdata_buf) { … } /* * This function prepares command to set/get register value. * * Preparation includes - * - Setting command ID, action and proper size * - Setting register offset (for both GET and SET) and * register value (for SET only) * - Ensuring correct endian-ness * * The following type of registers can be accessed with this function - * - MAC register * - BBP register * - RF register * - PMIC register * - CAU register * - EEPROM */ static int mwifiex_cmd_reg_access(struct host_cmd_ds_command *cmd, u16 cmd_action, void *data_buf) { … } /* * This function prepares command to set PCI-Express * host buffer configuration * * Preparation includes - * - Setting command ID, action and proper size * - Setting host buffer configuration * - Ensuring correct endian-ness */ static int mwifiex_cmd_pcie_host_spec(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 action) { … } /* * This function prepares command for event subscription, configuration * and query. Events can be subscribed or unsubscribed. Current subscribed * events can be queried. Also, current subscribed events are reported in * every FW response. */ static int mwifiex_cmd_802_11_subsc_evt(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, struct mwifiex_ds_misc_subsc_evt *subsc_evt_cfg) { … } static int mwifiex_cmd_append_rpn_expression(struct mwifiex_private *priv, struct mwifiex_mef_entry *mef_entry, u8 **buffer) { … } static int mwifiex_cmd_mef_cfg(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, struct mwifiex_ds_mef_cfg *mef) { … } /* This function parse cal data from ASCII to hex */ static u32 mwifiex_parse_cal_cfg(u8 *src, size_t len, u8 *dst) { … } int mwifiex_dnld_dt_cfgdata(struct mwifiex_private *priv, struct device_node *node, const char *prefix) { … } /* This function prepares command of set_cfg_data. */ static int mwifiex_cmd_cfg_data(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, void *data_buf) { … } static int mwifiex_cmd_set_mc_policy(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, void *data_buf) { … } static int mwifiex_cmd_robust_coex(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, bool *is_timeshare) { … } static int mwifiex_cmd_gtk_rekey_offload(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, struct cfg80211_gtk_rekey_data *data) { … } static int mwifiex_cmd_chan_region_cfg(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action) { … } static int mwifiex_cmd_coalesce_cfg(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, void *data_buf) { … } static int mwifiex_cmd_tdls_config(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, u16 cmd_action, void *data_buf) { … } static int mwifiex_cmd_tdls_oper(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, void *data_buf) { … } /* This function prepares command of sdio rx aggr info. */ static int mwifiex_cmd_sdio_rx_aggr_cfg(struct host_cmd_ds_command *cmd, u16 cmd_action, void *data_buf) { … } /* This function prepares command to get HS wakeup reason. * * Preparation includes - * - Setting command ID, action and proper size * - Ensuring correct endian-ness */ static int mwifiex_cmd_get_wakeup_reason(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd) { … } static int mwifiex_cmd_get_chan_info(struct host_cmd_ds_command *cmd, u16 cmd_action) { … } /* This function check if the command is supported by firmware */ static int mwifiex_is_cmd_supported(struct mwifiex_private *priv, u16 cmd_no) { … } /* * This function prepares the commands before sending them to the firmware. * * This is a generic function which calls specific command preparation * routines based upon the command number. */ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no, u16 cmd_action, u32 cmd_oid, void *data_buf, void *cmd_buf) { … } /* * This function issues commands to initialize firmware. * * This is called after firmware download to bring the card to * working state. * Function is also called during reinitialization of virtual * interfaces. * * The following commands are issued sequentially - * - Set PCI-Express host buffer configuration (PCIE only) * - Function init (for first interface only) * - Read MAC address (for first interface only) * - Reconfigure Tx buffer size (for first interface only) * - Enable auto deep sleep (for first interface only) * - Get Tx rate * - Get Tx power * - Set IBSS coalescing status * - Set AMSDU aggregation control * - Set 11d control * - Set MAC control (this must be the last command to initialize firmware) */ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init) { … }