diff --git a/SCR.txt b/SCR.txt index 12c2313..fc6f96e 100644 --- a/SCR.txt +++ b/SCR.txt @@ -4,7 +4,7 @@ NXP Software Content Register Package: mwifiex.git Outgoing License: GPL-2.0 -License File: mxm_wifiex/wlan_src/gpl-2.0.txt +License File: LICENSE Type of content: source Description and comments: NXP Wi-Fi linux SDK Release Location: https://github.com/nxp-imx/mwifiex diff --git a/mxm_wifiex/wlan_src/README b/mxm_wifiex/wlan_src/README new file mode 100644 index 0000000..4cfad44 --- /dev/null +++ b/mxm_wifiex/wlan_src/README @@ -0,0 +1,539 @@ +=============================================================================== + U S E R M A N U A L + + Copyright 2008-2023 NXP + + +1) FOR DRIVER BUILD + + Goto source code directory wlan_src/. + make [clean] build + The driver and utility binaries can be found in ../bin_xxxx directory. + The driver code supports Linux kernel from 2.6.32 to 6.1.1 + +2) FOR DRIVER INSTALL + + a) Copy firmware image to /lib/firmware/nxp/, copy wifi_mod_para.conf to /lib/firmware/nxp/. + b) Install WLAN driver + There are drv_mode, max_sta_bss, max_uap_bss etc. module parameters. + The bit settings of drv_mode are, + Bit 0 : STA + Bit 1 : uAP + Bit 2 : WIFIDIRECT + + max_sta_bss: Maximum number of STA BSS (default 1, max 1) + sta_name: Name of the STA interface (default: "mlan") + max_uap_bss: Maximum number of uAP BSS (default 1, max 2) + uap_name: Name of the uAP interface (default: "uap") + max_wfd_bss: Maximum number of WIFIDIRECT BSS (default 1, max 1) + wfd_name: Name of the WIFIDIRECT interface (default: "wfd") + max_vir_bss: Number of Virtual interfaces (default 0) + uap_oper_ctrl: uAP operation control when in-STA disconnect with ext-AP + 0: default do nothing, 2: uAP stops and restarts automatically + For example, to install multi-chip driver, + insmod mlan.ko + insmod moal.ko mod_para=nxp/wifi_mod_para.conf [drvdbg=0x7] + wifi_mod_para.conf is used to support multi-chips which has different load module parameters. It contains + the module parameters for different chips. + c) Uninstall WLAN driver, + ifconfig mlanX down + ifconfig uapX down + rmmod moal + rmmod mlan + + To load driver with MFG firmware file, use mfg_mode=1 when insmod WLAN driver and + specify MFG firmware name if needed. + + To load driver with rf_test firmware file, use rf_test_mode=1 when insmod WLAN driver. + This parameter only used for 9177(FC) + + There are some other parameters for debugging purpose etc. Use modinfo to check details. + drvdbg= + dev_cap_mask= + mac_addr=xx:xx:xx:xx:xx:xx + auto_ds=0|1|2 + ext_scan=0|1|2 + net_rx=0|1 + amsdu_deaggr=0|1 + + ps_mode=0|1|2 + sched_scan=0|1 + max_tx_buf=2048|4096|8192 + pm_keep_power=1|0 + shutdown_hs=1|0 + cfg_11d=0|1|2 + dts_enable=0|1 + fw_name = + e.g. copy pcieuart9098_combo_v1.bin to firmware directory, fw_name=nxp/pcieuart9098_combo_v1.bin + hw_name = + reg_work=0|1 + hw_test=0|1 + fw_serial=0|1 + req_fw_nowait=0|1 + dfs53cfg=0|1|2 + mcs32=0|1 + SD8887: antcfg=0|1|2|0xffff + SD8897/SD8997: antcfg=0x11|0x13|0x33 + slew_rate: Slew Rate Control value = 0|1|2|3 (0 is the slowest slew rate and 03 has the highest slew rate (default)) + init_cfg= + e.g. copy init_cfg.conf to firmware directory, init_cfg=nxp/init_cfg.conf + cal_data_cfg= + e.g. copy cal_data.conf to firmware directory, cal_data_cfg=nxp/cal_data.conf + Note: Loading driver with 8887 must include correct cal_data_cfg parameter. + dpd_data_cfg= + e.g. copy dpd_data.conf to firmware directory, dpd_data_cfg=nxp/dpd_data.conf + txpwrlimit_cfg= + e.g. copy txpwrlimit_cfg_set.conf to firmware directory, txpwrlimit_cfg=nxp/txpwrlimit_cfg_set.conf + cntry_txpwr=0|1|2 + 0: Disable setting tx power table of country (default) + 1: Enable setting tx power table of country + 2: Enable setting rgpower table of country + init_hostcmd_cfg= + e.g. copy init_hostcmd_cfg.conf to firmware directory, init_hostcmd_cfg=nxp/init_hostcmd_cfg.conf + band_steer_cfg= + e.g. generate bscfg.conf by band_steer_cfg.conf, then copy bscfg.conf to firmware directory, band_steer_cfg=nxp/bscfg.conf + sdio_rx_aggr=1|0 + cfg80211_wext= + Bit 0: STA WEXT + Bit 1: uAP WEXT + Bit 2: STA CFG80211 + Bit 3: uAP CFG80211 + cfg80211_drcs=1|0 + reg_alpha2= + skip_fwdnld=0|1 + wq_sched_prio: Priority for work queue + wq_sched_policy: Scheduling policy for work queue + (0: SCHED_NORMAL, 1: SCHED_FIFO, 2: SCHED_RR, 3: SCHED_BATCH, 5: SCHED_IDLE) + Please note that, both wq_sched_prio and wq_sched_policy should be provided + as module parameters. If wq_sched_policy is (0, 3 or 5), then wq_sched_prio + must be 0. wq_sched_prio should be 1 to 99 otherwise. + rx_work=0|1|2 + pcie_int_mode=0|1|2 + pcie_int_mode=0|1 + ring_size=32|64|128|256|512 + aggrctrl=1|0 + usb_aggr=0|1|2 + low_power_mode_enable=0|1 + When low power mode is enabled, the output power will be clipped at ~+10dBm and the + expected PA current is expected to be in the 80-90 mA range for b/g/n modes + wakelock_timeout= + pmic=0|1 + indication_gpio=0xXY + hs_wake_interval= + disconnect_on_suspend=0|1 + hs_mimo_switch=0|1 + hs_auto_arp=0|1 + gtk_rekey_offload=0|1|2 + napi=0|1 + fixed_beacon_buffer=0|1 + GoAgeoutTime=0|x + multi_dtim=0|x + inact_tmo=0|x + drcs_chantime_mode=0|x + Bit31~Bit24:Channel time for channel index0; + Bit23~Bit16:mode for channel index0; 0|1 + Bit15~Bit8:Channel time for channel index1; + Bit7~Bit0:mode for channel index1; 0|1 + roamoffload_in_hs=0|1 + uap_max_sta: Maximum number of STA for UAP/GO (default 0, max 64) + host_mlme=0|1 + for supplicant/authenticator running on host side, WPA3 support is available only in host_mlme mode + country_ie_ignore=0|1 + beacon_hints=0|1 + + chan_track=0|1 for 9098 only + keep_previous_scan=0|1, + auto_11ax=0|1, + + + Note: On some platforms (e.g. PXA910/920) double quotation marks ("") need to used + for module parameters. + insmod sdxxx.ko " ..." + +3) FOR DRIVER PROC & DEBUG + + The following info are provided in /proc/net/mwlan/adapterX/mlanY|uapY|wfdY/info, + on kernel 2.6.24 or later, the entry is /proc/mwlan/adapterX/mlanY|uapY|wfdY/info. + + driver_name = "wlan" or "uap" + driver_version = + interface_name = "mlanX", "uapX" or "wfdX" + bss_mode = "Ad-hoc" | "Managed" | "Auto" | "Unknown" + media_state = "Disconnected" | "Connected" + mac_address = <6-byte adapter MAC address> + multicase_count = // Only for STA + essid = // Only for STA + bssid = // Only for STA + channel = // Only for STA + region_code = // Only for STA + multicast_address[n] = // Only for STA + num_tx_bytes = + num_rx_bytes = + num_tx_pkts = + num_rx_pkts = + num_tx_pkts_dropped = + num_rx_pkts_dropped = + num_tx_pkts_err = + num_rx_pkts_err = + carrier "on" | "off" + tx queue "stopped" | "started" + tkip_mic_failures = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) + ccmp_decrypt_errors = 0 // Only for uAP + wep_undecryptable_count = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) + wep_icv_error_count = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) + decrypt_failure_count = 0 // Only for uAP + mcast_tx_count = 0 // Only for uAP + failed_count = 0 // Only for uAP + retry_count = 0 // Only for uAP + multiple_retry_count = 0 // Only for uAP + frame_duplicate_count = 0 // Only for uAP + rts_success_count = 0 // Only for uAP + rts_failure_count = 0 // Only for uAP + ack_failure_count = 0 // Only for uAP + rx_fragment_count = 0 // Only for uAP + mcast_rx_frame_count = 0 // Only for uAP + fcs_error_count = 0 // Only for uAP + tx_frame_count = 0 // Only for uAP + rsna_tkip_cm_invoked = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) + rsna_4way_hshk_failures = 0 // Only for uAP + + The following debug info are provided in /proc/net/mwlan/adapterX/mlanY|uapY|wfdY/debug, + on kernel 2.6.24 or later, the entry is /proc/mwlan/adapterX/mlanY|uapY|wfdY/debug. + + drvdbg = + wmm_ac_vo = + wmm_ac_vi = + wmm_ac_be = + wmm_ac_bk = + max_tx_buf_size = + tx_buf_size = + curr_tx_buf_size = + ps_mode = <0/1, CAM mode/PS mode> + ps_state = <0/1/2/3, awake state/pre-sleep state/sleep-confirm state/sleep state> + is_deep_sleep = <0/1, not deep sleep state/deep sleep state> // Only for STA + wakeup_dev_req = <0/1, wakeup device not required/required> + wakeup_tries = + hs_configured = <0/1, host sleep not configured/configured> + hs_activated = <0/1, extended host sleep not activated/activated> + tx_pkts_queued = + pps_uapsd_mode = <0/1, PPS/UAPSD mode disabled/enabled> // Only for STA + sleep_pd = // Only for STA + qos_cfg = // Only for STA + tx_lock_flag = <0/1, Tx lock flag> // Only for STA + port_open = <0/1, port open flag> // Only for STA + scan_processing = <0/1, scan processing flag> // Only for STA + num_bridge_pkts = // Only for uAP + num_drop_pkts = // Only for uAP + num_tx_timeout = + num_cmd_timeout = + timeout_cmd_id = + timeout_cmd_act = + last_cmd_id = + last_cmd_act = + last_cmd_index = <0 based last command index> + last_cmd_resp_id = + last_cmd_resp_index = <0 based last command response index> + last_event = + last_event_index = <0 based last event index> + num_cmd_h2c_fail = + num_cmd_sleep_cfm_fail = + num_tx_h2c_fail = + num_cmdevt_c2h_fail = + num_rx_c2h_fail = + num_int_read_fail = + last_int_status = + num_evt_deauth = // Only for STA + num_evt_disassoc = // Only for STA + num_evt_link_lost = // Only for STA + num_cmd_deauth = // Only for STA + num_cmd_assoc_ok = // Only for STA + num_cmd_assoc_fail = // Only for STA + cmd_sent = <0/1, send command resources available/sending command to device> + data_sent = <0/1, send data resources available/sending data to device> + mp_rd_bitmap = + curr_rd_port = + mp_wr_bitmap = + curr_wr_port = + txbd_rdptr = + txbd_wrptr = + rxbd_rdptr = + rxbd_wrptr = + eventbd_rdptr = + eventbd_wrptr = + cmd_resp_received = <0/1, no cmd response to process/response received and yet to process> + event_received = <0/1, no event to process/event received and yet to process> + tx_cmd_urb_pending = + tx_data_urb_pending = + rx_cmd_urb_pending = + rx_data_urb_pending = + ioctl_pending = + tx_pending = + rx_pending = + lock_count = + malloc_count = + mbufalloc_count = + malloc_cons_count = + main_state = + sdiocmd53w = + sdiocmd53r = + hs_skip_count = + hs_force_count = + + Issue SDIO cmd52 read/write through proc. + Usage: + echo "sdcmd52rw= [data]" > /proc/mwlan/adapterX/config + where the parameters: + func: The function number to use (0-7) + reg: The address of the register + data: The value to write, read if the value is absent + For SDIO MMC driver, only function 0 and WLAN function access is allowed. + And there is a limitation for function 0 write, only vendor specific CCCR + registers (0xf0 -0xff) are permiited. + Examples: + echo "sdcmd52rw= 0 4" > /proc/mwlan/adapterX/config # read func 0 address 4 + cat /proc/mwlan/adapterX/config # display the register value + echo "sdcmd52rw= 1 3 0xf" > /proc/mwlan/adapterX/config # write 0xf to func 1 address 3 + + Issue debug_dump command through proc. + Usage: + echo "debug_dump" > /proc/mwlan/adapterX/config + + Examples: + echo "debug_dump" > /proc/mwlan/adapterX/config # dump driver internal debug status. + To obtain fw dump or driver dump, use command: + cat /proc/mwlan/adapter0/drv_dump > file_drv_dump #save the drv dump to file_drv_dump + cat /proc/mwlan/adapter0/fw_dump > file_fw_dump #save the fw dump to file_fw_dump + cat /proc/mwlan/adapter1/drv_dump > file_drv_dump_2 #save the adapter1 drv dump to file_drv_dump_2 + + Use dmesg or cat /var/log/debug to check driver debug messages. + + Update /proc/sys/kernel/printk to change message log levels. + For example, + echo 6 > /proc/sys/kernel/printk (messages with a higher priority than 6 + will be printed to the console) + echo 15 > /proc/sys/kernel/printk (all messages will be printed to console) + +4) FOR FW RELOAD + a) Enable parallel firmware download in driver parameter + insmod sdxxx.ko fw_serial=0 + + b) default fw name for parallel firmware download + sd8887_wlan_a2.bin + + c) Trigger FW reload + echo "fw_reload=1" > /proc/mwlan/adapterX/config trigger SDIO inband firmware reset and reload firmware + echo "fw_reload=2" > /proc/mwlan/adapterX/config trigger firmware reload + echo "fw_reload=3" > /proc/mwlan/adapterX/config set firmware reload flag in driver. + echo "fw_reload=4" > /proc/mwlan/config trigger PCIe FLR and reload firmware. + echo "fw_reload=6" > /proc/mwlan/config trigger PCIe inband firmware reset and reload firmware. + + (Note: This feature will be supported on Robin3 and KF2. + For CAC-A2, it only work with the board which supports parallel fw download) + +5) FOR RF test mode commands: + + Following commands are used to perform RF testing of the wifi chipset. + Please not that these test mode commands can only be issued while the + device is in disconnected state and the uAP BSS is inactive. + Normal wifi operations cannot be used on entering RF Test Mode. + + Enter RF Test Mode: + echo "rf_test_mode=1" > /proc/mwlan/adapterX/config + + Exit RF Test Mode: + echo "rf_test_mode=0" > /proc/mwlan/adapterX/config + Please note that after exiting the RF Test Mode, the FW needs to be + reset in order to use normal wifi connectivity. + + To get the set of available RF Test Mode commands, currently set + parameters values for each command and the output, + cat /proc/mwlan/adapterX/config + + Set Radio Mode + echo "radio_mode= " + + Example: 2.4G[1x1] e.g Firecrest + echo "radio_mode=11 0" > /proc/mwlan/adapterX/config + 5G[1x1] e.g Firecrest + echo "radio_mode=3 0" > /proc/mwlan/adapterX/config + + Set Tx Antenna + For 1x1 chipsets, 1:Main, 2:Aux when antenna diversity is supported + For 2x2 chipsets, 1:Path A, 2: Path B, 3: Path A+B + Both Tx and Rx must be set to same antenna path + echo "tx_antenna=1" > /proc/mwlan/adapterX/config + + Set Rx Antenna + For 1x1 chipsets, 1:Main, 2:Aux when antenna diversity is supported + For 2x2 chipsets, 1:Path A, 2:Path B, 3:Path A+B + Both Tx and Rx must be set to same antenna path + echo "rx_antenna=1" > /proc/mwlan/adapterX/config + + Set RF band (0:2G, 1:5G) + For 2G, channel will be reset to 6, while for 5G, to channel 36 + echo "band=0" > /proc/mwlan/adapterX/config + + Set RF bandwidth (0:20MHz, 1:40MHz, 4:80MHz) + echo "bw=0" > /proc/mwlan/adapterX/config + + Set RF channel + echo "channel=6" > /proc/mwlan/adapterX/config + + Get and reset packet error rate + echo "get_and_reset_per" > /proc/mwlan/adapterX/config + + Set Tx Power + This command will set power only if caldata is already loaded in the FW. + Power (0 to 24 dBm) + Modulation (0: CCK, 1:OFDM, 2:MCS) + Path ID (0: PathA, 1:PathB, 2:PathA+B) + echo "tx_power=16 2 0" > /proc/mwlan/adapterX/config + + Set MFG HE TB Tx to configure Trigger based TX reponse + Enable Tx (0:disable, 1:enable) + Q num (0-7 : TCQs 0-7, 17-20: AXQs 0-3) + AID (Association ID as applicable) + AXQ MU Timer(to set the MU EDCA Timer for the Queue) + Tx Power (-11 to 9 dBm) + echo "he_tb_tx=1 1 5 400 10" > /proc/mwlan/adapterX/config + + Set Tx Continuous Mode + Start (0:disable, 1:enable) + Continuous Wave Mode (0:disable, 1:enable) + Payload Pattern (0 to 0xFFFFFFFF) + CS Mode (Applicable only when continuous wave is disabled) + (0:disable, 1:enable) + Active SubChannel (0:low, 1:upper, 3:both) + Tx Data Rate (Rate Index corresponding to legacy/HT/VHT rates) + + Example: To start continuous wave (tone) mode, first stop any ongoing + Tx and then start wave mode: + step1: echo "tx_continuous=0" > /proc/mwlan/adapterX/config + step2: echo "tx_continuous=1 1 0xAAA 0 3 7" > /proc/mwlan/adapterX/config + + Example: To start continuous packet mode, first stop any ongoing Tx and + then start pkt mode: + step1: echo "tx_continuous=0" > /proc/mwlan/adapterX/config + step2: echo "tx_continuous=1 0 0xAAA 0 3 7" > /proc/mwlan/adapterX/config + + stop: + echo "tx_continuous=0" > /proc/mwlan/adapterX/config + + Set Tx Frame + Start (0:disable, 1:enable) + Tx Data Rate (Rate Index corresponding to legacy/HT/VHT rates) + Payload Pattern (0 to 0xFFFFFFFF) + Payload Length (1 to 0x400) + Adjust Burst SIFS Gap (0:disable, 1:enable) + Burst SIFS in us (0 to 255us) + Short Preamble (0:disable, 1:enable) + Active SubChannel (0:low, 1:upper, 3:both) + Short GI (0:disable, 1:enable) + Adv Coding (0:disable, 1:enable) + Beamforming (0:disable, 1:enable) + GreenField Mode (0:disable, 1:enable) + STBC (0:disable, 1:enable) + NumPkt (Set to default value -1) + MaxPktExt (Set to default value -1) + BeamChange (Set to default value -1) + DCM (Set to default value -1) + Doppler (Set to default value -1) + MidamblePeriod (Set to default value -1) + QNum (Set to default value 1) + BSSID (xx:xx:xx:xx:xx:xx) + + Example: To start Tx frame with duty cycle, first stop any ongoing Tx + and then start Tx frame: + echo "tx_frame=0" > /proc/mwlan/adapterX/config + echo "tx_frame=1 7 0xAAA 0x100 1 20 0 0 0 0 0 0 0 05:43:3f:c4:51" > /proc/mwlan/adapterX/config + + Configure Trigger Frame + Example: To configure Trigger frame: + echo "trigger_frame=1 0 1 2 5484 0 256 0 0 2 1 0 0 0 1 60 1 0 65535 0 511 5 0 67 0 0 0 0 90 0 0 0 0" > /proc/mwlan/adapter0/config + + Example: To disable configuration of Trigger frame: + echo "trigger_frame=0" > /proc/mwlan/adapter0/config + + For more information about trigger frame configuration as per supported BW(80MHz, 40MHz and 20MHz), + Please refer : config/trigger_frame_cfg.conf + + Example : To start trigger frame transmission : + echo "rf_test_mode=1" > /proc/mwlan/adapter0/config + echo "radio_mode=3 0" > /proc/mwlan/adapterX/config + echo "band=1" > /proc/mwlan/adapter0/config + echo "bw=0" > /proc/mwlan/adapter0/config + echo "channel=36" > /proc/mwlan/adapter0/config + echo "trigger_frame=1 0 1 2 5484 0 256 0 0 0 1 0 0 0 1 60 1 0 65535 0 511 5 0 61 0 0 0 0 90 0 0 0 0" > /proc/mwlan/adapter0/config + echo "tx_frame=1 0x1102 0xabababab 200" >/proc/mwlan/adapter0/config + +6) Set host sleep parameters + + hssetpara + This command is used to set host sleep parameters. + Example: + echo "hssetpara=2 0xff 0xc8 3 400" > /proc/mwlan/adapter0/config + echo "hssetpara=2 1 0xc8 3 400 " > /proc/mwlan/adapter0/config + +7) For Antenna Diversity Command + + antcfg + This command is used to set/get the mode of Tx/Rx path. + + GET Command Format: cat /proc/mwlan/adapter0/config + SET Command Format: echo "antcfg=[m] [n] [o] [p]" > /proc/mwlan/adapter0/config + + For chip which support STREAM_2X2 + where value of m is: + Bit 0 -- Tx Path A or Tx/Rx Path A if [n] is not provided + Bit 1 -- Tx Path B or Tx/Rx Path B if [n] is not provided + Bit 0-1 -- Tx Path A+B or Tx/Rx Path A+B if [n] is not provided + For 9097/9098/IW62X, LOW BYTE for 2G setting + Bit 8 -- Tx Path A or Tx/Rx Path A if [n] is not provided + Bit 9 -- Tx Path B or Tx/Rx Path B if [n] is not provided + Bit 8-9 -- Tx Path A+B or Tx/Rx Path A+B if [n] is not provided + For 9097/9098/IW62X, HIGH BYTE for 5G setting + where value of n is: + Bit 0 -- Rx Path A + Bit 1 -- Rx Path B + Bit 0-1 -- Rx Path A+B + For 9097/9098/IW62X, LOW BYTE for 2G setting + Bit 8 -- Rx Path A + Bit 8 -- Rx Path B + Bit 8-9 -- Rx Path A+B + For 9097/9098/IW62X, HIGH BYTE for 5G setting + The Tx path setting (m) is used for both Tx and Rx if Rx path (n) is not provided. + + Examples: + cat /proc/mwlan/adapter0/config : Get Tx and Rx path + echo "antcfg=3" > /proc/mwlan/adapter0/config : Set Tx and Rx path to A+B + echo "antcfg=1 3" > /proc/mwlan/adapter0/config : Set Tx path to A and Rx path to A+B + + echo "antcfg=0x103" > /proc/mwlan/adapter0/config : Set Tx and Rx path to A+B on 2G and Tx and Rx path to A on 5G + echo "antcfg=0x103 0x103" > /proc/mwlan/adapter0/config : Set Tx path to A+B and Rx path to A+B on 2G, and Tx and Rx path to A on 5G + + echo "antcfg=0x202" > /proc/mwlan/adapter0/config : Use 5GHz path B pin for 5G TX/RX and 2GHz path B pin for 2G TX/RX + + On RD board connection is as follows : + 5GHz path A pin -> AntA + 5GHz path B pin -> AntB + 2GHz path A pin -> AntB + 2GHz path B pin -> AntA + + For chip which support SAD + where value of m is: + Bit 0 -- Tx/Rx antenna 1 + Bit 1 -- Tx/Rx antenna 2 + ... + 0xFFFF -- Tx/Rx antenna diversity + + where value of n is: + SAD evaluate time interval, only be provided when m = 0xFFFF, default value is 6s(0x1770) + + Examples: + cat /proc/mwlan/adapter0/config : Get Tx/Rx antenna mode + echo "antcfg=1" > /proc/mwlan/adapter0/config : Set Tx/Rx antenna 1 + echo "antcfg=0xFFFF" > /proc/mwlan/adapter0/config : Set Tx/Rx antenna diversity + echo "antcfg=0xFFFF 0x1770" > /proc/mwlan/adapter0/config : Set antenna evaluate time interval to 6s + diff --git a/mxm_wifiex/wlan_src/README_MLAN b/mxm_wifiex/wlan_src/README_MLAN deleted file mode 100644 index d8719c9..0000000 --- a/mxm_wifiex/wlan_src/README_MLAN +++ /dev/null @@ -1,5209 +0,0 @@ -=============================================================================== - U S E R M A N U A L - - Copyright 2008-2022 NXP - - -1) FOR DRIVER BUILD - - Goto source code directory wlan_src/. - make [clean] build - The driver and utility binaries can be found in ../bin_xxxx directory. - The driver code supports Linux kernel from 2.6.32 to 6.0.0. - -2) FOR DRIVER INSTALL - - a) Copy firmware image to /lib/firmware/nxp/, copy wifi_mod_para.conf to /lib/firmware/nxp/. - b) Install WLAN driver - There are drv_mode, max_sta_bss, max_uap_bss etc. module parameters. - The bit settings of drv_mode are, - Bit 0 : STA - Bit 1 : uAP - Bit 2 : WIFIDIRECT - - max_sta_bss: Maximum number of STA BSS (default 1, max 1) - sta_name: Name of the STA interface (default: "mlan") - max_uap_bss: Maximum number of uAP BSS (default 1, max 2) - uap_name: Name of the uAP interface (default: "uap") - max_wfd_bss: Maximum number of WIFIDIRECT BSS (default 1, max 1) - wfd_name: Name of the WIFIDIRECT interface (default: "wfd") - max_vir_bss: Number of Virtual interfaces (default 0) - uap_oper_ctrl: uAP operation control when in-STA disconnect with ext-AP - 0: default do nothing, 2: uAP stops and restarts automatically - For example, to install multi-chip driver, - insmod mlan.ko - insmod moal.ko mod_para=nxp/wifi_mod_para.conf [drvdbg=0x7] - wifi_mod_para.conf is used to support multi-chips which has different load module parameters. It contains - the module parameters for different chips. - c) Uninstall WLAN driver, - ifconfig mlanX down - ifconfig uapX down - rmmod moal - rmmod mlan - - To load driver with MFG firmware file, use mfg_mode=1 when insmod WLAN driver and - specify MFG firmware name if needed. - - To load driver with rf_test firmware file, use rf_test_mode=1 when insmod WLAN driver. - This parameter only used for 9177(FC) - - There are some other parameters for debugging purpose etc. Use modinfo to check details. - drvdbg= - dev_cap_mask= - mac_addr=xx:xx:xx:xx:xx:xx - auto_ds=0|1|2 - ext_scan=0|1|2 - net_rx=0|1 - amsdu_deaggr=0|1 - - ps_mode=0|1|2 - sched_scan=0|1 - max_tx_buf=2048|4096|8192 - pm_keep_power=1|0 - shutdown_hs=1|0 - cfg_11d=0|1|2 - dts_enable=0|1 - fw_name = - e.g. copy pcieuart9098_combo_v1.bin to firmware directory, fw_name=nxp/pcieuart9098_combo_v1.bin - hw_name = - reg_work=0|1 - hw_test=0|1 - fw_serial=0|1 - req_fw_nowait=0|1 - dfs53cfg=0|1|2 - mcs32=0|1 - SD8887: antcfg=0|1|2|0xffff - SD8897/SD8997: antcfg=0x11|0x13|0x33 - slew_rate: Slew Rate Control value = 0|1|2|3 (0 is the slowest slew rate and 03 has the highest slew rate (default)) - init_cfg= - e.g. copy init_cfg.conf to firmware directory, init_cfg=nxp/init_cfg.conf - cal_data_cfg= - e.g. copy cal_data.conf to firmware directory, cal_data_cfg=nxp/cal_data.conf - Note: Loading driver with 8887 must include correct cal_data_cfg parameter. - dpd_data_cfg= - e.g. copy dpd_data.conf to firmware directory, dpd_data_cfg=nxp/dpd_data.conf - txpwrlimit_cfg= - e.g. copy txpwrlimit_cfg_set.conf to firmware directory, txpwrlimit_cfg=nxp/txpwrlimit_cfg_set.conf - cntry_txpwr=0|1|2 - 0: Disable setting tx power table of country (default) - 1: Enable setting tx power table of country - 2: Enable setting rgpower table of country - init_hostcmd_cfg= - e.g. copy init_hostcmd_cfg.conf to firmware directory, init_hostcmd_cfg=nxp/init_hostcmd_cfg.conf - band_steer_cfg= - e.g. generate bscfg.conf by band_steer_cfg.conf, then copy bscfg.conf to firmware directory, band_steer_cfg=nxp/bscfg.conf - sdio_rx_aggr=1|0 - cfg80211_wext= - Bit 0: STA WEXT - Bit 1: uAP WEXT - Bit 2: STA CFG80211 - Bit 3: uAP CFG80211 - cfg80211_drcs=1|0 - reg_alpha2= - skip_fwdnld=0|1 - wq_sched_prio: Priority for work queue - wq_sched_policy: Scheduling policy for work queue - (0: SCHED_NORMAL, 1: SCHED_FIFO, 2: SCHED_RR, 3: SCHED_BATCH, 5: SCHED_IDLE) - Please note that, both wq_sched_prio and wq_sched_policy should be provided - as module parameters. If wq_sched_policy is (0, 3 or 5), then wq_sched_prio - must be 0. wq_sched_prio should be 1 to 99 otherwise. - rx_work=0|1|2 - pcie_int_mode=0|1|2 - pcie_int_mode=0|1 - ring_size=32|64|128|256|512 - aggrctrl=1|0 - usb_aggr=0|1|2 - low_power_mode_enable=0|1 - When low power mode is enabled, the output power will be clipped at ~+10dBm and the - expected PA current is expected to be in the 80-90 mA range for b/g/n modes - wakelock_timeout= - pmic=0|1 - indication_gpio=0xXY - hs_wake_interval= - disconnect_on_suspend=0|1 - hs_mimo_switch=0|1 - gtk_rekey_offload=0|1|2 - napi=0|1 - fixed_beacon_buffer=0|1 - GoAgeoutTime=0|x - multi_dtim=0|x - inact_tmo=0|x - drcs_chantime_mode=0|x - Bit31~Bit24:Channel time for channel index0; - Bit23~Bit16:mode for channel index0; 0|1 - Bit15~Bit8:Channel time for channel index1; - Bit7~Bit0:mode for channel index1; 0|1 - roamoffload_in_hs=0|1 - uap_max_sta: Maximum number of STA for UAP/GO (default 0, max 64) - host_mlme=0|1 - for supplicant/authenticator running on host side, WPA3 support is available only in host_mlme mode - country_ie_ignore=0|1 - beacon_hints=0|1 - - chan_track=0|1 for 9098 only - keep_previous_scan=0|1, - - - Note: On some platforms (e.g. PXA910/920) double quotation marks ("") need to used - for module parameters. - insmod sdxxx.ko " ..." - -3) FOR DRIVER PROC & DEBUG - - The following info are provided in /proc/net/mwlan/adapterX/mlanY|uapY|wfdY/info, - on kernel 2.6.24 or later, the entry is /proc/mwlan/adapterX/mlanY|uapY|wfdY/info. - - driver_name = "wlan" or "uap" - driver_version = - interface_name = "mlanX", "uapX" or "wfdX" - bss_mode = "Ad-hoc" | "Managed" | "Auto" | "Unknown" - media_state = "Disconnected" | "Connected" - mac_address = <6-byte adapter MAC address> - multicase_count = // Only for STA - essid = // Only for STA - bssid = // Only for STA - channel = // Only for STA - region_code = // Only for STA - multicast_address[n] = // Only for STA - num_tx_bytes = - num_rx_bytes = - num_tx_pkts = - num_rx_pkts = - num_tx_pkts_dropped = - num_rx_pkts_dropped = - num_tx_pkts_err = - num_rx_pkts_err = - carrier "on" | "off" - tx queue "stopped" | "started" - tkip_mic_failures = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) - ccmp_decrypt_errors = 0 // Only for uAP - wep_undecryptable_count = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) - wep_icv_error_count = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) - decrypt_failure_count = 0 // Only for uAP - mcast_tx_count = 0 // Only for uAP - failed_count = 0 // Only for uAP - retry_count = 0 // Only for uAP - multiple_retry_count = 0 // Only for uAP - frame_duplicate_count = 0 // Only for uAP - rts_success_count = 0 // Only for uAP - rts_failure_count = 0 // Only for uAP - ack_failure_count = 0 // Only for uAP - rx_fragment_count = 0 // Only for uAP - mcast_rx_frame_count = 0 // Only for uAP - fcs_error_count = 0 // Only for uAP - tx_frame_count = 0 // Only for uAP - rsna_tkip_cm_invoked = 0 // Only for uAP (use of WEP/TKIP is not recommended anymore) - rsna_4way_hshk_failures = 0 // Only for uAP - - The following debug info are provided in /proc/net/mwlan/adapterX/mlanY|uapY|wfdY/debug, - on kernel 2.6.24 or later, the entry is /proc/mwlan/adapterX/mlanY|uapY|wfdY/debug. - - drvdbg = - wmm_ac_vo = - wmm_ac_vi = - wmm_ac_be = - wmm_ac_bk = - max_tx_buf_size = - tx_buf_size = - curr_tx_buf_size = - ps_mode = <0/1, CAM mode/PS mode> - ps_state = <0/1/2/3, awake state/pre-sleep state/sleep-confirm state/sleep state> - is_deep_sleep = <0/1, not deep sleep state/deep sleep state> // Only for STA - wakeup_dev_req = <0/1, wakeup device not required/required> - wakeup_tries = - hs_configured = <0/1, host sleep not configured/configured> - hs_activated = <0/1, extended host sleep not activated/activated> - tx_pkts_queued = - pps_uapsd_mode = <0/1, PPS/UAPSD mode disabled/enabled> // Only for STA - sleep_pd = // Only for STA - qos_cfg = // Only for STA - tx_lock_flag = <0/1, Tx lock flag> // Only for STA - port_open = <0/1, port open flag> // Only for STA - scan_processing = <0/1, scan processing flag> // Only for STA - num_bridge_pkts = // Only for uAP - num_drop_pkts = // Only for uAP - num_tx_timeout = - num_cmd_timeout = - timeout_cmd_id = - timeout_cmd_act = - last_cmd_id = - last_cmd_act = - last_cmd_index = <0 based last command index> - last_cmd_resp_id = - last_cmd_resp_index = <0 based last command response index> - last_event = - last_event_index = <0 based last event index> - num_cmd_h2c_fail = - num_cmd_sleep_cfm_fail = - num_tx_h2c_fail = - num_cmdevt_c2h_fail = - num_rx_c2h_fail = - num_int_read_fail = - last_int_status = - num_evt_deauth = // Only for STA - num_evt_disassoc = // Only for STA - num_evt_link_lost = // Only for STA - num_cmd_deauth = // Only for STA - num_cmd_assoc_ok = // Only for STA - num_cmd_assoc_fail = // Only for STA - cmd_sent = <0/1, send command resources available/sending command to device> - data_sent = <0/1, send data resources available/sending data to device> - mp_rd_bitmap = - curr_rd_port = - mp_wr_bitmap = - curr_wr_port = - txbd_rdptr = - txbd_wrptr = - rxbd_rdptr = - rxbd_wrptr = - eventbd_rdptr = - eventbd_wrptr = - cmd_resp_received = <0/1, no cmd response to process/response received and yet to process> - event_received = <0/1, no event to process/event received and yet to process> - tx_cmd_urb_pending = - tx_data_urb_pending = - rx_cmd_urb_pending = - rx_data_urb_pending = - ioctl_pending = - tx_pending = - rx_pending = - lock_count = - malloc_count = - mbufalloc_count = - malloc_cons_count = - main_state = - sdiocmd53w = - sdiocmd53r = - hs_skip_count = - hs_force_count = - - Issue SDIO cmd52 read/write through proc. - Usage: - echo "sdcmd52rw= [data]" > /proc/mwlan/adapterX/config - where the parameters: - func: The function number to use (0-7) - reg: The address of the register - data: The value to write, read if the value is absent - For SDIO MMC driver, only function 0 and WLAN function access is allowed. - And there is a limitation for function 0 write, only vendor specific CCCR - registers (0xf0 -0xff) are permiited. - Examples: - echo "sdcmd52rw= 0 4" > /proc/mwlan/adapterX/config # read func 0 address 4 - cat /proc/mwlan/adapterX/config # display the register value - echo "sdcmd52rw= 1 3 0xf" > /proc/mwlan/adapterX/config # write 0xf to func 1 address 3 - - Issue debug_dump command through proc. - Usage: - echo "debug_dump" > /proc/mwlan/adapterX/config - - Examples: - echo "debug_dump" > /proc/mwlan/adapterX/config # dump driver internal debug status. - To obtain fw dump or driver dump, use command: - cat /proc/mwlan/adapter0/drv_dump > file_drv_dump #save the drv dump to file_drv_dump - cat /proc/mwlan/adapter0/fw_dump > file_fw_dump #save the fw dump to file_fw_dump - cat /proc/mwlan/adapter1/drv_dump > file_drv_dump_2 #save the adapter1 drv dump to file_drv_dump_2 - - Use dmesg or cat /var/log/debug to check driver debug messages. - - Update /proc/sys/kernel/printk to change message log levels. - For example, - echo 6 > /proc/sys/kernel/printk (messages with a higher priority than 6 - will be printed to the console) - echo 15 > /proc/sys/kernel/printk (all messages will be printed to console) - -4) FOR FW RELOAD - a) Enable parallel firmware download in driver parameter - insmod sdxxx.ko fw_serial=0 - - b) default fw name for parallel firmware download - sd8887_wlan_a2.bin - - c) Trigger FW reload - echo "fw_reload=1" > /proc/mwlan/adapterX/config trigger inband firmware reset and reload firmware - echo "fw_reload=2" > /proc/mwlan/adapterX/config trigger firmware reload - echo "fw_reload=3" > /proc/mwlan/adapterX/config set firmware reload flag in driver. - echo "fw_reload=4" > /proc/mwlan/config trigger pcie FLR and reload firmware. - - (Note: This feature will be supported on Robin3 and KF2. - For CAC-A2, it only work with the board which supports parallel fw download) - -5) FOR RF test mode commands: - - Following commands are used to perform RF testing of the wifi chipset. - Please not that these test mode commands can only be issued while the - device is in disconnected state and the uAP BSS is inactive. - Normal wifi operations cannot be used on entering RF Test Mode. - - Enter RF Test Mode: - echo "rf_test_mode=1" > /proc/mwlan/adapterX/config - - Exit RF Test Mode: - echo "rf_test_mode=0" > /proc/mwlan/adapterX/config - Please note that after exiting the RF Test Mode, the FW needs to be - reset in order to use normal wifi connectivity. - - To get the set of available RF Test Mode commands, currently set - parameters values for each command and the output, - cat /proc/mwlan/adapterX/config - - Set Tx Antenna - For 1x1 chipsets, 1:Main, 2:Aux when antenna diversity is supported - For 2x2 chipsets, 1:Path A, 2: Path B, 3: Path A+B - Both Tx and Rx must be set to same antenna path - echo "tx_antenna=1" > /proc/mwlan/adapterX/config - - Set Rx Antenna - For 1x1 chipsets, 1:Main, 2:Aux when antenna diversity is supported - For 2x2 chipsets, 1:Path A, 2:Path B, 3:Path A+B - Both Tx and Rx must be set to same antenna path - echo "rx_antenna=1" > /proc/mwlan/adapterX/config - - Set RF band (0:2G, 1:5G) - For 2G, channel will be reset to 6, while for 5G, to channel 36 - echo "band=0" > /proc/mwlan/adapterX/config - - Set RF bandwidth (0:20MHz, 1:40MHz, 4:80MHz) - echo "bw=0" > /proc/mwlan/adapterX/config - - Set RF channel - echo "channel=6" > /proc/mwlan/adapterX/config - - Set Radio Mode - echo "radio_mode=14 4" > /proc/mwlan/adapterX/config - - Get and reset packet error rate - echo "get_and_reset_per" > /proc/mwlan/adapterX/config - - Set Tx Power - This command will set power only if caldata is already loaded in the FW. - Power (0 to 24 dBm) - Modulation (0: CCK, 1:OFDM, 2:MCS) - Path ID (0: PathA, 1:PathB, 2:PathA+B) - echo "tx_power=16 2 0" > /proc/mwlan/adapterX/config - - Set MFG HE TB Tx to configure Trigger based TX reponse - Enable Tx (0:disable, 1:enable) - Q num (0-7 : TCQs 0-7, 17-20: AXQs 0-3) - AID (Association ID as applicable) - AXQ MU Timer(to set the MU EDCA Timer for the Queue) - Tx Power (-11 to 9 dBm) - echo "he_tb_tx=1 1 5 400 10" > /proc/mwlan/adapterX/config - - Set Tx Continuous Mode - Start (0:disable, 1:enable) - Continuous Wave Mode (0:disable, 1:enable) - Payload Pattern (0 to 0xFFFFFFFF) - CS Mode (Applicable only when continuous wave is disabled) - (0:disable, 1:enable) - Active SubChannel (0:low, 1:upper, 3:both) - Tx Data Rate (Rate Index corresponding to legacy/HT/VHT rates) - - Example: To start continuous wave (tone) mode, first stop any ongoing - Tx and then start wave mode: - step1: echo "tx_continuous=0" > /proc/mwlan/adapterX/config - step2: echo "tx_continuous=1 1 0xAAA 0 3 7" > /proc/mwlan/adapterX/config - - Example: To start continuous packet mode, first stop any ongoing Tx and - then start pkt mode: - step1: echo "tx_continuous=0" > /proc/mwlan/adapterX/config - step2: echo "tx_continuous=1 0 0xAAA 0 3 7" > /proc/mwlan/adapterX/config - - stop: - echo "tx_continuous=0" > /proc/mwlan/adapterX/config - - Set Tx Frame - Start (0:disable, 1:enable) - Tx Data Rate (Rate Index corresponding to legacy/HT/VHT rates) - Payload Pattern (0 to 0xFFFFFFFF) - Payload Length (1 to 0x400) - Adjust Burst SIFS Gap (0:disable, 1:enable) - Burst SIFS in us (0 to 255us) - Short Preamble (0:disable, 1:enable) - Active SubChannel (0:low, 1:upper, 3:both) - Short GI (0:disable, 1:enable) - Adv Coding (0:disable, 1:enable) - Beamforming (0:disable, 1:enable) - GreenField Mode (0:disable, 1:enable) - STBC (0:disable, 1:enable) - NumPkt (Set to default value -1) - MaxPktExt (Set to default value -1) - BeamChange (Set to default value -1) - DCM (Set to default value -1) - Doppler (Set to default value -1) - MidamblePeriod (Set to default value -1) - QNum (Set to default value 1) - BSSID (xx:xx:xx:xx:xx:xx) - - Example: To start Tx frame with duty cycle, first stop any ongoing Tx - and then start Tx frame: - echo "tx_frame=0" > /proc/mwlan/adapterX/config - echo "tx_frame=1 7 0xAAA 0x100 1 20 0 0 0 0 0 0 0 05:43:3f:c4:51" > /proc/mwlan/adapterX/config - - Configure Trigger Frame - Example: To configure Trigger frame: - echo "trigger_frame=1 0 1 2 5484 0 256 0 0 2 1 0 0 0 1 60 1 0 65535 0 511 5 0 67 0 0 0 0 90 0 0 0 0" > /proc/mwlan/adapter0/config - - Example: To disable configuration of Trigger frame: - echo "trigger_frame=0" > /proc/mwlan/adapter0/config - - For more information about trigger frame configuration as per supported BW(80MHz, 40MHz and 20MHz), - Please refer : config/trigger_frame_cfg.conf - - Example : To start trigger frame transmission : - echo "rf_test_mode=1" > /proc/mwlan/adapter0/config - echo "band=1" > /proc/mwlan/adapter0/config - echo "bw=0" > /proc/mwlan/adapter0/config - echo "channel=36" > /proc/mwlan/adapter0/config - echo "trigger_frame=1 0 1 2 5484 0 256 0 0 0 1 0 0 0 1 60 1 0 65535 0 511 5 0 61 0 0 0 0 90 0 0 0 0" > /proc/mwlan/adapter0/config - echo "tx_frame=1 0x1102 0xabababab 200" >/proc/mwlan/adapter0/config - -6) Set host sleep parameters - - hssetpara - This command is used to set host sleep parameters. - Example: - echo "hssetpara=2 0xff 0xc8 3 400" > /proc/mwlan/adapter0/config - echo "hssetpara=2 1 0xc8 3 400 " > /proc/mwlan/adapter0/config - -7) For Antenna Diversity Command - - antcfg - This command is used to set/get the mode of Tx/Rx path. - - GET Command Format: cat /proc/mwlan/adapter0/config - SET Command Format: echo "antcfg=[m] [n] [o] [p]" > /proc/mwlan/adapter0/config - - For chip which support STREAM_2X2 - where value of m is: - Bit 0 -- Tx Path A or Tx/Rx Path A if [n] is not provided - Bit 1 -- Tx Path B or Tx/Rx Path B if [n] is not provided - Bit 0-1 -- Tx Path A+B or Tx/Rx Path A+B if [n] is not provided - For 9097/9098/IW62X, LOW BYTE for 2G setting - Bit 8 -- Tx Path A or Tx/Rx Path A if [n] is not provided - Bit 9 -- Tx Path B or Tx/Rx Path B if [n] is not provided - Bit 8-9 -- Tx Path A+B or Tx/Rx Path A+B if [n] is not provided - For 9097/9098/IW62X, HIGH BYTE for 5G setting - where value of n is: - Bit 0 -- Rx Path A - Bit 1 -- Rx Path B - Bit 0-1 -- Rx Path A+B - For 9097/9098/IW62X, LOW BYTE for 2G setting - Bit 8 -- Rx Path A - Bit 8 -- Rx Path B - Bit 8-9 -- Rx Path A+B - For 9097/9098/IW62X, HIGH BYTE for 5G setting - The Tx path setting (m) is used for both Tx and Rx if Rx path (n) is not provided. - - Examples: - cat /proc/mwlan/adapter0/config : Get Tx and Rx path - echo "antcfg=3" > /proc/mwlan/adapter0/config : Set Tx and Rx path to A+B - echo "antcfg=1 3" > /proc/mwlan/adapter0/config : Set Tx path to A and Rx path to A+B - - echo "antcfg=0x103" > /proc/mwlan/adapter0/config : Set Tx and Rx path to A+B on 2G and Tx and Rx path to A on 5G - echo "antcfg=0x103 0x103" > /proc/mwlan/adapter0/config : Set Tx path to A+B and Rx path to A+B on 2G, and Tx and Rx path to A on 5G - - echo "antcfg=0x202" > /proc/mwlan/adapter0/config : Use 5GHz path B pin for 5G TX/RX and 2GHz path B pin for 2G TX/RX - - On RD board connection is as follows : - 5GHz path A pin -> AntA - 5GHz path B pin -> AntB - 2GHz path A pin -> AntB - 2GHz path B pin -> AntA - - For chip which support SAD - where value of m is: - Bit 0 -- Tx/Rx antenna 1 - Bit 1 -- Tx/Rx antenna 2 - ... - 0xFFFF -- Tx/Rx antenna diversity - - where value of n is: - SAD evaluate time interval, only be provided when m = 0xFFFF, default value is 6s(0x1770) - - Examples: - cat /proc/mwlan/adapter0/config : Get Tx/Rx antenna mode - echo "antcfg=1" > /proc/mwlan/adapter0/config : Set Tx/Rx antenna 1 - echo "antcfg=0xFFFF" > /proc/mwlan/adapter0/config : Set Tx/Rx antenna diversity - echo "antcfg=0xFFFF 0x1770" > /proc/mwlan/adapter0/config : Set antenna evaluate time interval to 6s - - - -=============================================================================== - U S E R M A N U A L F O R MLANUTL - -NAME - mlanutl - configure the additional parameters available for NXP mdriver. - -SYNOPSIS - mlanutl -v - mlanutl [parameters] ... - - mlanutl mlanX verext - mlanutl mlanX version - mlanutl mlanX hostcmd generate_raw - mlanutl mlanX hostcmd send_om_set - mlanutl mlanX getdatarate - mlanutl uapX getdatarate - mlanutl mlanX drvdbg [n] - mlanutl mlanX getlog - mlanutl mlanX getsignal [m] [n] - mlanutl mlanX signalextcfg [m] - mlanutl mlanX getsignalextv2 [m] - mlanutl mlanX getsignalext [m] - mlanutl mlanX get_txpwrlimit [raw_data_file] - mlanutl mlanX aggrpriotbl [ ... ] - mlanutl uapX aggrpriotbl [ ... ] - mlanutl mlanX addbapara [

] - mlanutl uapX addbapara [

] - mlanutl mlanX addbareject [ ... ] - mlanutl uapX addbareject [ ... ] - mlanutl mlanX dyn_bw [n] - mlanutl mlanX vhtcfg [l] [m] [n] [o] - mlanutl uapX vhtcfg [l] [m] [n] [o] - mlanutl mlanX httxcfg [] [] - mlanutl mlanX htcapinfo [] [] - mlanutl mlanX 11axcfg [config/11axcfg.conf] - mlanutl mlanX 11axcmd - mlanutl mlanX txratecfg [l] [m] [n] [o] - mlanutl uapX txratecfg [l] [m] [n] [o] - mlanutl mlanX txwatchdog [l] - mlanutl uapX txwatchdog [l] - mlanutl mlanX hssetpara condition [GPIO# [gap]] [ind_GPIO# [level]] - mlanutl mlanX mefcfg - mlanutl mlanX cloud_keep_alive - mlanutl mlanX min_ba_threshold - mlanutl mlanX 11dcfg - mlanutl mlanX 11dclrtbl - mlanutl mlanX addts - mlanutl mlanX amsduaggrctrl - mlanutl mlanX antcfg [m] [n] - mlanutl mlanX/uapX mimoswitch [tx_antmode] [rx_antmode] - mlanutl mlanX arpfilter - mlanutl mlanX assocctrl [k] [l] [m] [n] - mlanutl mlanX assocessid <"[essid]"> - mlanutl mlanX assocessid_bssid <"[bssid] [essid]"> - mlanutl mlanX associate " " - mlanutl mlanX get_chnrgpwr [save_region_channel_power_data_file] - mlanutl mlanX comparergpwr [target_file] - mlanutl mlanX comparetrpc [display] - mlanutl mlanX getcfgchanlist - mlanutl mlanX authtype [n] - mlanutl mlanX autotdls [n] - mlanutl mlanX tdls_idle_time [n] - mlanutl uapX dfs_offload [n] - mlanutl mlanX bandcfg [l] [m] [n] - mlanutl mlanX bcninterval [n] - mlanutl wfdX bssrole [l] - mlanutl mlanX cfgdata [] - mlanutl mlanX cfpcode [m] [n] - mlanutl mlanX changraph [ ] - mlanutl mlanX coex_rx_winsize [m] - mlanutl mlanX countrycode [l] - - mlanutl mlanX cfpinfo - mlanutl uapX cfpinfo - - mlanutl mlanX customie [[[] ] ] - mlanutl mlanX deauth [l] - mlanutl uapX deauth [l] - mlanutl mlanX deepsleep [l] [m] - mlanutl mlanX delba [ ] - mlanutl uapX delba [ ] - mlanutl mlanX delts - mlanutl mlanX dfstesting [ ] - mlanutl uapX clear_nop - mlanutl uapX nop_list - mlanutl uapX fake_radar - mlanutl uapX getchload [] - mlanutl uapX getchload - mlanutl dfsX dfs_cac [ ] - mlanutl dfsX autodfs [conf_file] - mlanutl mlanX dfs_repeater [n] - mlanutl mlanX dfs53cfg [n] - mlanutl uapX dfs_mode [n] - mlanutl mlanX esuppmode [l] [m] [n] - mlanutl mlanX extcapcfg [] - mlanutl mlanX fwmacaddr [mac_addr] - mlanutl mlanX getkey - mlanutl mlanX getscantable [ARGS] - mlanutl uapX getstalist - mlanutl uapX channel_switch - mlanutl uapX channel_switch - mlanutl mlanX hostcmd <11n_2040coex.conf> 2040coex - mlanutl mlanX hostcmd auto_tx_get - mlanutl mlanX hostcmd auto_tx_unreg - mlanutl mlanX hostcmd bgscfg - - mlanutl mlanX hostcmd coalesce_cfg - mlanutl mlanX hostcmd ed_mac_ctrl - mlanutl mlanX hostcmd crypto_test - mlanutl mlanX hostcmd nat_keep_alive - mlanutl mlanX hostcmd pad_cfg_get - mlanutl mlanX hostcmd pad_cfg_set - mlanutl mlanX hostcmd requesttpc - mlanutl mlanX hostcmd mode_get - mlanutl mlanX hostcmd mode_timeshare - mlanutl mlanX hostcmd mode_spatial - mlanutl mlanX hostcmd mode_none - mlanutl mlanX hostcmd mode_bca - mlanutl mlanX hostcmd gpio_cfg - mlanutl mlanX hostcmd external_coex_config - mlanutl mlanX hostcmd external_coex_pta_config - mlanutl mlanX hostcmd external_coex_uart_config - mlanutl mlanX hostcmd generictime - mlanutl mlanX hostcmd a2dptime - mlanutl mlanX hostcmd inquirytim - mlanutl mlanX hostcmd ap_generictime - mlanutl mlanX hostcmd ap_a2dptime - mlanutl mlanX hostcmd ap_inquirytime - mlanutl mlanX hostcmd get_bca_arb_config - mlanutl mlanX hostcmd set_en_bca_arb_config - mlanutl mlanX hostcmd set_dis_bca_arb_config - mlanutl mlanX hostcmd set_wlan_traffic_priority - mlanutl mlanX hostcmd get_wlan_traffic_priority - mlanutl mlanX hostcmd get_wlan_stats - mlanutl mlanX hostcmd get_15_4_stats - mlanutl mlanX hostcmd get_bt_stats - mlanutl mlanX hostcmd get_ble_stats - mlanutl mlanX hostcmd sdio_pulldown_disable - mlanutl mlanX hostcmd sdio_pulldown_get - mlanutl mlanX hostcmd sdio_pulldown_set - mlanutl mlanX hostcmd subevent_get - mlanutl mlanX hostcmd subevent_set - mlanutl mlanX hostcmd txpwrlimit_2g_cfg_set - mlanutl mlanX hostcmd txpwrlimit_5g_cfg_set - mlanutl mlanX hostcmd txpwrlimit_cfg_get - mlanutl mlanX hostcmd txrate_cfg_get - mlanutl mlanX hostcmd txrate_cfg_set_bg - mlanutl mlanX hostcmd txrate_cfg_set_bgn - mlanutl mlanX hostcmd generate_raw - mlanutl mlanX hostcmd fwdump - - mlanutl mlanX hostcmd stop_su - mlanutl mlanX hostcmd start_su - - mlanutl mlanX hotspotcfg [] - mlanutl mlanX hscfg [condition [[GPIO# [gap]]]] [ind_GPIO# [level]] - mlanutl mlanX mgmtfilter - mlanutl mlanX auto_arp [n] - mlanutl mlanX htstreamcfg [n] - mlanutl mlanX httxbfcap [cap] - mlanutl mlanX httxbfcfg "[;GlobalData/tsData/interval/txPeerData/snrData]" - mlanutl mlanX inactivityto [k] - mlanutl mlanX ipaddr [";"] - mlanutl mlanX linkstats - mlanutl mlanX listeninterval [l] - mlanutl mlanX macctrl [n] - mlanutl uapX macctrl [n] - mlanutl mlanX memrdwr

[value] - mlanutl mlanX miracastcfg [l] [m] [n] - mlanutl mlanX mgmtframectrl [] - mlanutl uapX mgmtframectrl [] - mlanutl mlanX mgmtframetx - mlanutl mlanX mpactrl [tx_ena] [rx_ena] [tx_size] [rx_size] [tx_ports] [rx_ports] - mlanutl mlanX netmon [ [ ]] - mlanutl mlanX offchannel [ ] - mlanutl mlanX otpuserdata - mlanutl mlanX passphrase [l] - mlanutl mlanX pb_bypass [data_1, data_2, ... data_n] - mlanutl mlanX pcieregrw [value] - mlanutl mlanX pciebar0regrw [value] - mlanutl mlanX pmfcfg - mlanutl mlanX port_ctrl [n] - mlanutl mlanX powercons [n] - mlanutl mlanX pscfg [k] [d] [l] ... - mlanutl mlanX bcntimeoutcfg [l] [m] [o] [p] - mlanutl mlanX psmode [l] - - mlanutl robustcoex [Enable/Disable] [gpionum] [gpiopolarity] - mlanutl mlanX qconfig def [Queue Id: 0-3] - mlanutl mlanX qconfig get [Queue Id: 0-3] - mlanutl mlanX qconfig set msdu [Queue Id: 0-3] - mlanutl mlanX qoscfg - mlanutl mlanX qstatus - mlanutl mlanX radioctrl [n] - mlanutl mlanX rdeeprom - mlanutl mlanX reassoctrl [n] - mlanutl mlanX regioncode [n] - mlanutl mlanX regrdwr [value] - mlanutl mlanX rejectaddbareq [conditions] - mlanutl uapX rejectaddbareq [conditions] - mlanutl mlanX scancfg [t] [m] [p] [s] [a] [b] [c] [ext] [gap] - mlanutl mlanX sdcmd52rw
[data] - mlanutl mlanX sdcmd53rw
[data1] ... [dataN] - mlanutl mlanX sdioclock - mlanutl mlanX setuserscan [ARGS] - mlanutl mlanX cancelscan - mlanutl mlanX sleepparams [ ] - mlanutl mlanX sleeppd [n] - mlanutl mlanX sysclock [clk1] [clk2] [clk3] [clk4] - mlanutl mlanX tcpackenh [l] [m] - mlanutl mlanX tdls_channel_switch - mlanutl mlanX tdls_config <0/1> - mlanutl mlanX tdls_cs_params - mlanutl mlanX tdls_debug "allow_weak_security" <0/1> - mlanutl mlanX tdls_debug "cs_im_return" <0/1> - mlanutl mlanX tdls_debug "fail_setup_confirm" <0/1> - mlanutl mlanX tdls_debug "higher_lower_mac" <0/1> - mlanutl mlanX tdls_debug "ignore_key_expiry" <0/1> - mlanutl mlanX tdls_debug "setup_existing_link" <0/1> - mlanutl mlanX tdls_debug "setup_with_prohibited" <0/1> - mlanutl mlanX tdls_debug "stop_rx" <0/1> - mlanutl mlanX tdls_debug "wrong_bss" <0/1> - mlanutl mlanX tdls_disable_cs <0/1> - mlanutl mlanX tdls_discovery - mlanutl mlanX tdls_link_status - mlanutl mlanX tdls_powermode - mlanutl mlanX tdls_setinfo - mlanutl mlanX tdls_setup - mlanutl mlanX tdls_stop_channel_switch - mlanutl mlanX tdls_teardown - mlanutl mlanX thermal - mlanutl mlanX ts_status - mlanutl mlanX tsf - mlanutl mlanX txaggrctrl [m] - mlanutl mlanX txbufcfg - mlanutl mlanX aggrctrl [l] - mlanutl mlanX usbaggrctrl [l] [m] [n] [o] [p] [q] [r] [s] - mlanutl mlanX usbresume - mlanutl mlanX usbsuspend - mlanutl per_pkt_cfg [tx_rx_control] [type_num] [ether_type1 ether_type2 ...] [tx_rx_control] [type_num] [ether_type1 ether_type2 ...] - mlanutl dot11_txrx - mlanutl mlanX txrxhistogram [action] [tx_rx_statics] - mlanutl uapX txrxhistogram [action] [tx_rx_statics] - mlanutl mlanX wakeupreason - mlanutl uapX wakeupreason - mlanutl mlanX warmreset - mlanutl mlanX wpssession [n] - mlanutl mlanX wmmcfg [n] - mlanutl mlanX wmmparamcfg [AC_BE AIFSN ECW_MAX ECW_MIN TX_OP] - [AC_BK AIFSN ECW_MAX ECW_MIN TX_OP] - [AC_VI AIFSN ECW_MAX ECW_MIN TX_OP] - [AC_VO AIFSN ECW_MAX ECW_MIN TX_OP] - mlanutl mlanX wwscfg [m] - mlanutl mlanX mc_cfg [n] - mlanutl mlanX mc_policy [n] - mlanutl mlanX mc_cfg_ext [c] [s] [u] [m] - mlanutl p2pX cfg_noa [h] [i] [j] [k] [l] - mlanutl p2pX cfg_opp_ps [m] [n] - mlanutl mlanX get_sensor_temp - mlanutl indrstcfg [gpio_pin] - - - mlanutl uapX ctrldeauth - - mlanutl mlanX/uapX bootsleep <1/0> - - mlanutl mlanX ssu [mode] [ssu file] - - mlanutl mlanX csi - - mlanutl mlanX arb [mode] - - mlanutl mlanX dmcs [value] - - mlanutl mlanX/uapX range_ext [mode] - mlanutl mlanX twt_setup [config/twt.conf] - mlanutl mlanX twt_teardown [config/twt.conf] - mlanutl rx_abort_cfg [enable] [rssi_threshold] - mlanutl rx_abort_cfg_ext [enable] [margin ceil_thresh] - mlanutl tx_ampdu_prot_mode [mode] - mlanutl rate_adapt_cfg [low_thresh high_thresh timer_interval] - mlanutl cck_desense_cfg [mode] [margin ceil_thresh] [num_on_intervals num_off_intervals] - mlanutl mlanX/uapX lpm [mode] - mlanutl dot11mc_unassoc_ftm_cfg [enable] - mlanutl mlanX tp_state [mode] [drop_point] - mlanutl mlanX/uapX clocksync [j][k] [l] [m] [n] - mlanutl mlanX/uapX gettsfinfo [j] - mlanutl uapX backupchan [j] - mlanutl uapX targetchan [j] - mlanutl mlanX ips_cfg [1/0] - mlanutl mlanX/uapX mcast_aggr_group [action] [mcast_addr] - mlanutl mlanX/uapX mc_aggr_cfg [i][j] - mlanutl uapX mcast_tx - mlanutl getuuid - -DESCRIPTION - Those commands are used to send additional commands to the NXP MLAN - card via the Linux device driver. - - The mlanX parameter specifies the network device that is to be used to - perform this command on. It could be mlan0, mlan1 etc. - -verext - Retrieve and display an extended version string from the firmware - - Usage: - mlanutl mlanX verext [#] - - where [#] is an optional argument to retrieve a specific version string, - omission of the argument retrieves the 0 indexed string. - -version - This is used to get the current version of the driver and the firmware. - -drvdbg - This command is used to set/get the bit masks of driver debug message control. - - Usage: - mlanutl mlanX drvdbg [n] - - Where the parameter is the generic debug message control bit mask. - The following types of driver debug messages can be dynamically enabled or - disabled by setting or clearing the corresponding bits, - bit 0: MMSG PRINTM(MMSG,...) - bit 1: MFATAL PRINTM(MFATAL,...) - bit 2: MERROR PRINTM(MERROR,...) - bit 3: MDATA PRINTM(MDATA,...) - bit 4: MCMND PRINTM(MCMND,...) - bit 5: MEVENT PRINTM(MEVENT,...) - bit 6: MINTR PRINTM(MINTR,...) - bit 7: MIOCTL PRINTM(MIOCTL,...) - ... - bit 16: MDAT_D PRINTM(MDAT_D,...), DBG_HEXDUMP(MDAT_D,...) - bit 17: MCMD_D PRINTM(MCMD_D,...), DBG_HEXDUMP(MCMD_D,...) - bit 18: MEVT_D PRINTM(MEVT_D,...), DBG_HEXDUMP(MEVT_D,...) - bit 19: MFW_D PRINTM(MFW_D,...), DBG_HEXDUMP(MFW_D,...) - bit 20: MIF_D PRINTM(MIF_D,...), DBG_HEXDUMP(MIF_D,...) - ... - bit 28: MENTRY PRINTM(MENTRY,...), ENTER(), LEAVE() - bit 29: MWARN PRINTM(MWARN,...) - bit 30: MINFO PRINTM(MINFO,...) - - If CONFIG_DEBUG=2, all kinds of debug messages can be configured. - - If CONFIG_DEBUG=1, all kinds of debug messages can be configured except - for MENTRY, MWARN and MINFO. By default MMSG, MFATAL and MERROR are enabled. - - Some special debug messages, - '*' // MLAN driver ISR is called (bit 6 MINTR enabled) - '|' // PS awake event is received (bit 5 MEVENT enabled) - '_' // PS sleep event is received (bit 5 MEVENT enabled) - '+' // PS sleep confirm is sent (bit 5 MEVENT enabled) - - Examples: - mlanutl mlan0 drvdbg : Get the current driver debug masks - mlanutl mlan0 drvdbg 0 : Disable all the debug messages - mlanutl mlan0 drvdbg 7 : Enable MMSG, MFATAL and MERROR messages - mlanutl mlan0 drvdbg 0x20037 : Enable MMSG, MFATAL, MEEROR, - MCMND, MEVENT and MCMD_D messages - mlanutl mlan0 drvdbg -1 : Enable all the debug messages - -hostcmd generate_raw - This command is used to generate the raw data(hostcommand block) for - hostcommand in and write that to file - - Usage: - mlanutl mlanX hostcmd generate_raw - -hostcmd send_om_set - This command is used to configure the STAUT to include OM control subfield - - Usage: - mlanutl mlanX hostcmd send_om_set - -getdatarate - This command is used to get the data rate being used in last Tx - packet and last Rx packet. - -getlog - This command is used to get the statistics available in the station. - Following stats are displayed:- - dot11MulticastTransmittedFrameCount Increments when the multicast bit is set in the destination - MAC address of a successfully transmitted MSDU - - dot11FailedCount Increments when an MSDU is not transmitted successfully - - dot11RetryCount Increments when an MSDU is successfully transmitted after one - or more retransmissions - - dot11MultipleRetryCount Increments when an MSDU is successfully transmitted after more - than one retransmission - - dot11FrameDuplicateCount Increments when a frame is received that the Sequence Control - field is indicating a duplicate count - - dot11RTSSuccessCount Increments when a CTS is received in response to an RTS - - dot11RTSFailureCount Increments when a CTS is not received in response to an RTS - - dot11ACKFaliureCount Increments when an ACK is not received when expected - - dot11ReceivedFragmentCount Increments for each successfully received MPDU of type Data or Management - - dot11MulticastReceivedFrameCount Increments when a MSDU is received with the multicast bit set in the destination MAC address - - dot11FCSErrorCount Increments when an FCS error is detected in a received MPDU - - dot11TransmittedFrameCount Increments for each successfully transmitted MSDU - - dot11WeplcvErrCnt Increment when WEP (use of WEP/TKIP is not recommended anymore)decryption error for key index 0.3 - - beaconReceivedCnt Increments when received beacon - - beaconMissedCnt Increments when beacon missed - - dot11TransmittedFrameCount Increments for each successfully transmitted MSDU - - dot11QosTransmittedFragmentCount Increments when a corresponding UP's MPDU transmitted successfully - - dot11QosFailedCount Increments when a corresponding UP's MSDU not transmitted successfully - - dot11QosRetryCount Increment when a corresponding UP's MSDU transmitted successfully after one or more retransmission - - dot11QosMultipleRetryCount Increments when a corresponding UP's MSDU is successfully transmitted after more than one retransmission - - dot11QosFrameDuplicateCount Increments when a corresponding UP's frame is received that the Sequence - Control field is indicating a duplicate frame - - dot11QosRTSSuccessCount Increments when a CTS is received in response to an RTS, which is sent for a corresponding UP's Qos frame - - dot11QosRTSFailureCount Increments when a CTS is not received in response to an RTS, which is sent for a corresponding UP's - Qos frame - - dot11QosACKFailureCount Increments when an ACK is not received when expected for a corresponding UP's Qos frame - - dot11QosReceivedFragmentCount Increments when a corresponding UP's MPDU received - - dot11QosTransmittedFrameCount Increments when a corresponding UP's MSDU transmitted - - dot11QosDiscardedFrameCount Increments when a corresponding UP's MSDU not transmitted successfully - - dot11QosMPDUsReceivedCount Increments when a corresponding UP's MDPU received - - - dot11QosRetriesReceivedCount Increments when a corresponding UP's MDPU received which retry bit is set - - dot11RSNAStatsCMACICVErrors Increment when a MPDU discard by CMAC integrity check - - dot11RSNAStatsCMACReplays Increments when a MPDU discarded by the CMAC replay error - - dot11RSNAStatsRobustMgmtCCMPReplays Increments when a robust management frame discarded by CCMP replay error - - dot11RSNAStatsTKIPICVErrors Increments when a MPDU discarded by TKIP ICV error //(use of WEP/TKIP is not recommended anymore) - - dot11RSNAStatsTKIPReplays Increments when a MPDU discarded by TKIP replay error //(use of WEP/TKIP is not recommended anymore) - - dot11RSNAStatsCCMPDecryptErrors Increments when a MPDU discarded by CCMP decryption error - - dot11RSNAStatsCCMPReplays Increments when a MPDU discarded by CCMP replay error - - dot11TransmittedAMSDUCount Increments when a A-MSDU transmitted successfully - - dot11FailedAMSDUCount Increments when a A-MSDU not transmitted successfully - - dot11RetryAMSDUCount Increments when a A-MSDU is successfully transmitted after one or more retransmissions - - dot11MultipleRetryAMSDUCount Increments when a A-MSDU is successfully transmitted after more than one retransmissions - - dot11TransmittedOctetsInAMSDUCount Increments by the number of octets in the frame body - of an A-MSDU frame when an A-MSDU frame is successfully transmitted - - dot11AMSDUAckFailureCount Increments when an acknowledgment to an A-MSDU is not received when expected. - - dot11ReceivedAMSDUCount Increments when a A-MSDU frame received - - dot11ReceivedOctetsInAMSDUCount Increments by the number of octets in the frame body - of an A-MSDU frame when an A-MSDU frame is received - - dot11TransmittedAMPDUCount Increments when an A-MPDU is transmitted - - dot11TransmittedMPDUsInAMPDUCount Increments by the number of MPDUs in the A-MPDU when an A-MPDU is transmitted - - dot11TransmittedOctetsInAMPDUCount Increments by the number of octets in the A-MPDU frame when an A-MPDU frame is transmitted - - dot11AMPDUReceivedCount Increments when the MAC receives an A-MPDU from the PHY - - dot11MPDUInReceivedAMPDUCount Increments by the number of MPDUs received in the - A-MPDU when an A-MPDU is received - - dot11ReceivedOctetsInAMPDUCount Increments by the number of octets in the A-MPDU - frame when an A-MPDU frame is received - - dot11AMPDUDelimiterCRCErrorCount Increments when an MPDU delimiter has a CRC error when this is the first - CRC error in the received A-MPDU or when the previous delimiter has been decoded correctly - - Cmd Usage: mlanutl mlanX getlog ext - The above command is used with the argument "ext" to display the following error statistics:- - - rxStuckIssueCount-1 - rxStuckIssueCount-2 - rxStuckRecoveryCount - rxStuckTsf-1 - rxStuckTsf-2 - txWatchdogRecoveryCount - txWatchdogTsf-1 - txWatchdogTsf-2 - channelSwitchAnnouncementSent - channelSwitchState - registerClass - channelNumber - channelSwitchMode - RxResetRecoveryCount - RxIsr2NotDoneCnt - gdmaAbortCnt - gResetRxMacCnt - gOwnrshpCtlErrCnt - gOwnrshpBcnErrCnt - gOwnrshpMgtErrCnt - gOwnrshpDatErrCnt - -getsignal - This command gets the last and average value of RSSI, SNR and NF of - Beacon and Data. - Note: This command is available only when STA is connected. - - where value of m is: - 1 -- RSSI (Receive Signal Strength Indication) - 2 -- SNR (Signal to Noise Ratio) - 3 -- NF (Noise Floor) - where value of n is: - 1 -- Beacon last - 2 -- Beacon average - 3 -- Data last - 4 -- Data average - - Examples: - mlanutl mlan0 getsignal 1 : Get the RSSI info (beacon last, beacon - average, data last and data average) - mlanutl mlan0 getsignal 3 4 : Get the NF of data average - mlanutl mlan0 getsignal 2 1 : Get the SNR of beacon last - mlanutl mlan0 getsignal : Get all of the signal info - mlan0 getsignal:-32 -33 -35 -36 67 59 63 56 -99 -92 -98 -92 - RSSI info: beacon last -32, beacon average -33, data last -35, data average -36 - SNR info: beacon last 67, beacon average 59, data last 63, data average 56 - NF info: beacon last -99, beacon average -92, data last -98, data average -92 - -getsignalext - This command gets the last and average value of RSSI, SNR and NF of - Beacon and Data of spectific antenna path. - Note: This command is available only when STA is connected. - Driver will enable signalext and collect signal information for one second - - where value of m is: - 1 -- PATH A - 2 -- PATH B - 3 -- PATH A+B - - Examples: - mlanutl mlan0 getsignalext :Get All path's signal. - mlanutl maln0 getsignalext 3 :Get path A+B signal - mlanutl maln0 getsignalext 1 :Get path A signal - mlanutl mlan0 getsignalext 2 :Get path B signal - - PATH A: -46 -46 -49 -49 65 45 39 42 -111 -91 -88 -91 - - PATH A: RSSI info: beacon last -46, beacon average -46, data last -49, data average -49 - SNR info: beacon last 65, beacon average 45, data last 39, data average 42 - NF info: beacon last -111, beacon average -91, data last -88, data average -91 - -signalextcfg - This command is used to enable/disable signalext - Usage: - mlanutl mlanX signalextcfg [m] - where the value of [m] is: - 1 -- enable signalext in firmware - 0 -- disable signalext in firmware - Examples: - mlanutl mlan0 signalextcfg 1 : Enable signalext in firmware - mlanutl mlan0 signalextcfg 0 : Disable signalext in firmware - -getsignalextv2 - This command gets the last and average value of RSSI, SNR and NF of - Beacon and Data of spectific antenna path. - Note: This command is available only when STA is connected. - "mlanutl mlanX signalextcfg 1" command needs to be issued before issuing this command - - where value of m is: - 1 -- PATH A - 2 -- PATH B - 3 -- PATH A+B - - Examples: - mlanutl mlan0 getsignalextv2 :Get All path's signal. - mlanutl maln0 getsignalextv2 3 :Get path A+B signal - mlanutl maln0 getsignalextv2 1 :Get path A signal - mlanutl mlan0 getsignalextv2 2 :Get path B signal - - PATH A: -46 -46 -49 -49 65 45 39 42 -111 -91 -88 -91 - - PATH A: RSSI info: beacon last -46, beacon average -46, data last -49, data average -49 - SNR info: beacon last 65, beacon average 45, data last 39, data average 42 - NF info: beacon last -111, beacon average -91, data last -88, data average -91 - -get_txpwrlimit - This command is used to get the txpwrlimit table in FW -Usage: - mlanutl mlanX get_txpwrlimit [raw_data_file] - where - 0: Get 2.4G txpwrlimit table - 0x10: Get 5G sub0 txpwrlimit table - 0x11: Get 5G sub1 txpwrlimit table - 0x12: Get 5G sub2 txpwrlimit table - 0x13: Get 5G sub3 txpwrlimit table - 0x1f: Get all 5G txpwrlimit table - 0xff: Get both 2G and 5G txpwrlimit table - driver will save fw raw data to this file. - - Examples: - mlanutl mlan0 get_txpwrlimit 0 : Get 2G txpwrlimit table. - mlanutl mlan0 get_txpwrlimit 0x10 : Get 5G sub band0 txpwrlimit table - mlanutl mlan0 get_txpwrlimit 0xff txpwrlimit.bin : Get both 2G/5G txpwrlimit table and save to txpwrlimit.bin - -aggrpriotbl - This command is used set/get the priority table for AMPDU/AMSDU traffic per tid. - This command can also be used to disable AMPDU/AMSDU for a given tid. - In case of AMPDU this priority table will be used to setup block ack (to make - sure the highest priority tid always uses AMPDU as we have limited AMPDU streams) - - where ... - - - This is priority for Tid0 for AMPDU packet. A priority could be any - values between 0 - 7, 0xff to disable aggregation. - - This is priority for Tid0 for AMSDU packet. A priority could be any - values between 0 - 7, 0xff to disable aggregation. - - eg: - mlanutl mlanX aggrpriotbl - This command will get the current Priority table for AMPDU and AMSDU. - <2 2 0 0 1 1 3 3 4 4 5 5 255 255 255 255>. This is read as - <"Prio for AMPDU for Tid0" "Prio for AMSDU for Tid0" - "Prio for AMPDU for Tid1" "Prio for AMSDU for Tid1" and so on - mlanutl mlanX aggrpriotbl 2 2 0 0 1 1 3 3 4 4 5 5 255 255 255 255 - - This will set the priority table for AMPDU and AMSDU - Priority for Tid0/AMPDU = 2, Tid0/AMSDU = 2, Tid1/AMPDU = 0, Tid1/AMSDU = 0 - and so on. Aggregation for Tid6 and Tid7 are disabled. - Here higher the priority number, higher the priority (i.e. 7 - has higher priority than 6). Similarly for AMSDU. - mlanutl mlanX aggrpriotbl 0xff 2 0xff 0 0xff 1 0xff 3 0xff 4 0xff 5 0xff 0xff 0xff 0xff - This will disable - AMPDU for all the TIDs but will still keep AMSDU enabled to Tid0 to Tid5 - - The default setting is 2 255 0 255 1 255 3 255 4 255 5 255 255 255 255 255. - - A delBA should be seen in case a disable happens on a TID for which AMPDU stream - is currently setup. - - Note:- This command should only be issue in disconnected state. - -addbapara - This command can be used to update the default ADDBA parameters. - - where is - - This is the block ack timeout for ADDBA request. - 0 : Disable (recommended for throughput test) - 1 - 65535 : Block Ack Timeout in TU - - where is - - Window size for ADDBA request. (16 is recommended and default value) - - where is - - Window size for ADDBA response. (48 is recommended and 32 is default value) - (16 is recommended for IWNCOMM AP in WAPI throughput test) - - Current window size limit for Tx as well as Rx is 1023. - - where

is - - amsdu support for ADDBA request. (1 is default value) - 0: disable amsdu in ADDBA request - 1: enable amsdu in ADDBA request - - where is - - amsdu support for ADDBA response. (1 is default value) - 0: disable amsdu in ADDBA response - 1: enable amsdu in ADDBA response - - eg: - mlanutl mlanX addbapara - This command will get the current addba params - mlanutl mlanX addbapara 1000 64 8 0 0 - This will change the ADDBA timeout to (1000 * 1024) us, - txwinsize to 64 and rxwinsize to 8 and disable amdsu in ADDBA request/response. - - The default setting is 65535 16 32 1 1. - - In case the ADDBA timeout value is updated then a ADDBA is sent for all streams - to update the timeout value. - - In case txwinsize and/or rxwinsize is updated, the effect could only be seen on - next ADDBA request/response. The current streams will not be affected with this - change. - - In case of txamsdu/rxamsdu is updated, the effect could only be seen on - next ADDBA request/response. The current streams will not be affected with this - change. AMSDU in AMPDU stream will be enabled when AP support this feature - and AMSDU is enabled in aggrpriotbl. - -addbareject - This command is used set/get the addbareject table for all the TIDs. - This command can also be used to enable rejection of ADDBA requests for a given tid. - - where ... - - - This can be 0/1 for TidX. 1 enables rejection of ADDBA request for TidX and - 0 would accept any ADDBAs for TidX. - - eg: - mlanutl mlanX addbareject - This command will get the current table. - [0 0 0 0 0 0 0 0]. ADDBA would be accepted for all TIDs. This is the default state. - - mlanutl mlanX addbareject 0 0 1 1 0 0 0 0 - This command will accept ADDBA requests for - Tid [0,1,4,5,6,7] and reject ADDBA requests for Tid [2,3] - - mlanutl mlanX addbareject 1 1 1 1 1 1 1 1 - This will enable rejection of ADDBA requests for - all Tids. - - Note:- This command should only be issue in disconnected state. - -vhtcfg - This command is used to set and get various 11ac specific configuration - for transmission and reception. For the SET operation, all paramaters - may be applied. For the GET operation, only the first two parameters are applied. - The 6th argument "rx_mcs_set" can be used to disbale/enable 802.11ac. - - where is - - This is the band setting for the vhtcfg - 0: Settings for both 2.4G and 5G bands (for SET operation, 11N BW only) - 1: Settings for 2.4G band (for 11N BW only) - 2: Settings for 5G band - - where is - - This parameter specifies the configuration of VHT operation for TX or/and VHT capabilities - 0: Unspecified - 1: configuration of VHT capabilities for Tx operations (STA only) - 2: configuration of VHT capabilities for association (STA only) - 3: configuration of VHT capabilities (uAP only) - Note: For the STA, the VHT capabilities configuration is applied in association, - whereas the VHT operations configuration is actually used in Tx. - - where [l] is - - This parameter specifies the bandwidth (BW) configuration - applied to the vhtcfg. - If is 1/3 (Tx operations), - 0: Tx BW follows the BW (20/40 MHz) from 11N CFG - 1: Tx BW follows the BW (80/160/80+80 MHz) from VHT Capabilities - defined in below for 5G band. - If is 2 (association), - 0: Rx BW follows the BW (20/40 MHz) from 11N CFG - 1: Rx BW follows the BW (80/160/80+80 MHz) from VHT Capabilities - defined in below for 5G band. - - where [m] is - - This parameter specifies the VHT capabilities info if is 2 (association) - or the VHT Tx operations if is 1 (Tx operations). - The VHT Tx operation should be a subset of VHT capabilities for association. - It is a bitmap and should be used as follows: - - Bit 31-30: Reserved and set to 0 - Bit 29: TX antenna pattern consistency - 1: antenna pattern does not change - 0: antenna pattern might change - Bit 28: RX antenna pattern consistency - 1: antenna pattern does not change - 0: antenna pattern might change - Bit 27-26: VHT link adaptation capable - 0: no feedback of VHT MFB from the STA - 1: unsolicted feedback of VHT MFB from the STA - 2: both response and unsolicted feedback of VHT MFB - from the STA - 3: reserved and set to 0 - Bit 25-23: Maximum A-MPDU length exponent - Bit 22: +HTC-VHT capable (1: enable. 0 disable) - Bit 21: VHT TXOP PS - Bit 20: MU beamformee capable (1: enable. 0 disable) - Bit 19: MU beamformer capable (1: enable. 0 disable) - Bit 18-16: Number of sounding dimensions (set to maximum-1 - if Bit 11 is 1. Otherwise, reserved and set to 0) - Bit 15-13: Compressed steering number of beamformer - antennas supported (set to maximum-1 if Bit 12 is 1. - Otherwise, reserved and set to 0) - Bit 12: SU beamformee capable (1: enable. 0 disable) - Bit 11: SU beamformer capable (1: enable. 0 disable) - Bit 10-8: Rx STBC - 0: no support - 1: support of 1 spatial stream - 2: support of 1-2 streams - 3: support of 1-3 spatial streams - 4: support of 1-4 spatial streams - 5-7: reserved and set to 0 - Bit 7: TX STBC (1: enable. 0 disable) - Bit 6: Short GI for 160 and 80+80 MHz (1: enable. 0 disable) - Bit 5: Short GI for 80 MHz (1: enable. 0 disable) - Bit 4: Rx LDPC (1: enable. 0 disable) - Bit 3-2: Supported channel width set. - 0: no support of either 160 or 80+80 MHz. - 1: support of 160 MHz - 2: support of both 160 and 80+80 MHz. - 3: reserved and set to 0. - Bit 1-0: Maximum MPDU length - 0: 3895 octets. - 1: 7991 octets. - 2: 11454 octets. - 3: reserved and set to 0. - - Note: for the STA, if is 1 (Tx operations), the bitmap for may be simplied as follows: - Bit 31-8: Reserved and set to 0 - Bit 7: Tx STBC (1: enable. 0 disable) - Bit 6: Reserved and set to 0 - Bit 5: Short GI for 80 Mhz (1: enable. 0 disable) - Bit 4: LDPC (1: enable. 0 disable) - Bit 3-0: Reserved and set to 0 - - where [n] is , - - This parameter specifies the TX MCS map. It may not be used for the STA if is 1 (Tx operations). - It is a bitmap and should be used as following - Bit 15-0: MCS map, which is defined as folows: - Bit 15-14: Max MCS for 8 SS - Bit 13-12: Max MCS for 7 SS - Bit 11-10: Max MCS for 6 SS - Bit 9-8: Max MCS for 5 SS - Bit 7-6: Max MCS for 4 SS - Bit 5-4: Max MCS for 3 SS - Bit 3-2: Max MCS for 2 SS - Bit 1-0: Max MCS for 1 SS - - where [o] is . - - This parameter specifies the RX MCS map. It may not be used for the STA if is 1 (Tx operations). - It is a bitmap with the same sructure as for - rx_mcs_map = 0xffff : FW will disable 802.11ac - rx_mcs_map = others : FW will enable 802.11ac - - Note: The user setting of vhtcap may be overwritten by the driver - if the setting of those fields is beyond the hardware capabilities. - - Examples: - mlanutl mlan0 vhtcfg 2 1 : Get current VHT configuration in 5GHz for the STA. - mlanutl mlan0 vhtcfg 2 2 : Get maximum VHT configuration in 5GHz for the STA. - mlanutl mlan0 vhtcfg 2 1 1 0x000001f0 - : Set the Tx operations configuration in 5GHz for the STA, - Tx BW follows the VHT Capabilities. - mlanutl mlan0 vhtcfg 2 2 0 0x000001f0 0xfff5 0xfffa - : Set the VHT capabilities configuration in 5GHz for the STA, - the Tx supports MCS 0-8 for both 1 and 2 spatial streams, - while the Rx supports MCS 0-9 for both 1 and 2 spatial streams. - mlanutl uap0 vhtcfg 2 3 0 0x000001f0 0xfffa 0xfffa - : Set the current/maximum VHT configuration in 5GHz for the uAP. - Both Tx and Rx supports MCS 0-9 for both 1 and 2 spatial streams. - mlanutl uap0 vhtcfg 2 3 0 0x000001b0 - : Set the VHT capability information in 5GHz for the uAP, and keep the Tx/Rx MCS Map same as before. - -dyn_bw - This command is used to set/get dynamic bandwidth. - - Usage: - mlanutl mlanX dyn_bw [n] - - where - [BIT0] - 0 = TxInfo Indicated BW Disable - 1 = TxInfo Indicated BW Enable - [BIT1] - 0 = TxInfo Dynamatic BW Disable - 1 = TxInfo Dynamatic BW Enable - [BIT2] - 0 = TxInfo Force send RTS Disable - 1 = TxInfo Force send RTS Enable - [BIT3] - 0 = Mac Dynamic BW Operation Mode Disable (Static BW Operation Mode) - 1 = Mac Dynamic BW Operation Mode Enable - other bits reserved. - - If no parameter provided, get is performed. - - Examples: - mlanutl mlan0 dyn_bw 0x1 : Enable TxInfo Indicated BW - mlanutl mlan0 dyn_bw : get current setting - -httxcfg - This command is used to configure various 11n specific configuration - for transmit (such as Short GI, Channel BW and Green field support) - - where is - This is a bitmap and should be used as following - Bit 15-8: Reserved set to 0 - Bit 7: STBC enable/disable - Bit 6: Short GI in 40 Mhz enable/disable - Bit 5: Short GI in 20 Mhz enable/disable - Bit 4: Green field enable/disable - Bit 3-2: Reserved set to 1 - Bit 1: 20/40 Mhz enable disable. - Bit 0: LDPC enable/disable - - When Bit 1 is set then firmware could transmit in 20Mhz or 40Mhz based - on rate adaptation. When this bit is reset then firmware will only - transmit in 20Mhz. - - where is - - This is the band info for settings. - 0: Settings for both 2.4G and 5G bands - 1: Settings for 2.4G band - 2: Settings for 5G band - - Example: - mlanutl mlanX httxcfg - This will display HT Tx configuration for 2.4G and 5G band. - - mlanutl mlanX httxcfg 0x62 - This will enable 20/40 and Short GI but will disable Green field for 2.4G and 5G band. - - mlanutl mlanX httxcfg 0x30 1 - This will enable Short GI 20 Mhz and Green field for 2.4G band. - - The default value is 0x20 for 2.4G and 0x62 for 5G. - - Note:- If 20/40 MHz support is disabled in htcapinfo, device will not transmit - in 40 MHz even 20/40 MHz is enabled in httxcfg. - -htcapinfo - This command is used to configure some of parameters in HTCapInfo IE - (such as Short GI, Channel BW, and Green field support) - - where is - - This is a bitmap and should be used as following - Bit 29: Green field enable/disable - Bit 26: Rx STBC Support enable/disable. (As we support - single spatial stream only 1 bit is used for Rx STBC) - Bit 25: Tx STBC support enable/disable. - Bit 24: Short GI in 40 Mhz enable/disable - Bit 23: Short GI in 20 Mhz enable/disable - Bit 22: Rx LDPC enable/disable - Bit 17: 20/40 Mhz enable disable. - Bit 8: Enable/disable 40Mhz Intolarent bit in ht capinfo. - 0 will reset this bit and 1 will set this bit in - htcapinfo attached in assoc request. - All others are reserved and should be set to 0. - - Setting of any other bits will return error. - - where is - - This is the band info for settings. - 0: Settings for both 2.4G and 5G bands - 1: Settings for 2.4G band - 2: Settings for 5G band - - Example: - mlanutl mlanX htcapinfo - This will display HT capabilties information. - If the information for 2.4G and 5G is different, - the first value is for 2.4G and the second value is for 5G. - Otherwise, it will display a single value for both bands. - - mlanutl mlanX htcapinfo 0x1820000 - This will enable Short GI, Channel BW to 20/40 and disable Green field support for 2.4G and 5G band. - - mlanutl mlanX htcapinfo 0x800000 2 - This will enable Short GI, Channel BW to 20 only, No Rx STBC support and disable Green field support for 5G band. - - The default value is 0x4800000 for 2.4G and 0x5820000 for 5G. - - Note:- This command can be issued any time but it will only come to effect from - next association. (as HTCapInfo is sent only during Association). - -11axcfg - This command is used to config 11ax HE capability using conf file. - - Usage: - mlanutl mlanX 11axcfg [conf file] - - Example: - mlanutl mlan0 11axcfg config/11axcfg.conf - mlanutl uap0 11axcfg config/11axcfg.conf - -11axcmd - This command is used to config 11ax HE capability using command. - - Usage: - mlanutl 11axcmd [value_1] [value_2] [value_3] - : spatial reuse configuration - set obss_pd offset, [value_1] = NON_SRG_OffSET, [value_2] = SRG_OFFSET - - : spatial reuse configuration - control SR, [value_1]= 1 is enable SR, [value_1] = 0 is disable SR - - : enable/disable beam change - enable beam_change when [value_1 = 0] - disable beam_change when [value_1 = 1] - - : enable/disable HTC transmission - enable transmission of HTC when [value_1 = 1] - disable transmission of HTC when [value_1 = 0] - - : set/get RTS threshold - This subcmd applies to uapX only. uAP uses it to manage the RTS/CTS used by associated non-AP HE STA - set TXOP duration RTS Threshold when [value_1 = ]. If = 1023, disable TXOP duration RTS - get TXOP duration RTS Threshold without value_1 and value_2 - Where is: - Bit 0-9: TXOP RTS Threshold - : set/get omi value - used for OMI transmission in MAC header HTC+ field, please see 11ax spec for OMI definition - set OMI: [value_1 = ] [value_2 = ] [value_3 = ] - where - is defined as: - Bit 0-2: Rx NSS - Bit 3-4: Channel Width - Bit 6 : Tx NSTS (applies to client mode only) - All other bits are not supported currently. - is defined as: - 0: OMI is transmitted in QoS NULL frame; - 1: OMI is transmitted in QoS data frame; - 0xFF: OMI is transmitted in both QoS NULL and QoS data frame. - is applied only if OMI is sent in QoS data frame. - It specifies the number of consecutive data frames containing the OMI. - - get OMI without any value - - : set/get OBSS narrow band RU tolerance time value in seconds - set tolerance time when [value_1 =

[value] - - where the parameters are, -
: memory address - [value]: value to be written - - Examples: - mlanutl mlan0 memrdwr 0x4cf70 : Read memory address 0x4cf70 - mlanutl mlan0 memrdwr 0x80000000 0xffffffff - : Write 0xffffffff to memory address 0x80000000 - -miracastcfg - This command is used to set/get the miracast configuration. - - Usage: - mlanutl mlanX miracastcfg [l] [m] [n] - - where the parameters are, - [l]: miracast mode - 0: Disable - 1: Source - 2: Sink - [m]: scan time per channel, in ms - [n]: gap during two scans, in ms - - Examples: - mlanutl mlan0 miracastcfg : Get miracast configuration - mlanutl mlan0 miracastcfg 0 : Disable miracast configuration - mlanutl mlan0 miracastcfg 1 20 40 : Set miracast mode as source, with scan time - 20ms per channel and gap during two scans 40ms - -mgmtframectrl - This command is used to set/get registered frame type to passthrough. - - Usage: - mlanutl mlanX mgmtframectrl [] - mlanutl uapX mgmtframectrl [] - - Where the parameter is: - : the bit mask of management frame reception. - : Bit 0 - Association Request - : Bit 1 - Association Response - : Bit 2 - Re-Association Request - : Bit 3 - Re-Association Response - : Bit 4 - Probe Request - : Bit 5 - Probe Response - : Bit 8 - Beacon Frames - : Bit 13 - Action Frames - - Examples: - mlanutl mlan0 mgmtframectrl : Get present mask - mlanutl mlan0 mgmtframectrl 0x0020 : Bit 5 is set, Forward probe response frames to application layer - -mgmtframetx - This command is used to send management frame. - - Usage: - mlanutl mlanX mgmtframetx - - Where the parameter is: - mgmt_frame.conf : The configuration file contains the management frame. - - Examples: - mlanutl mlan0 mgmtframetx config/mgmt_frame.conf - -mpactrl - This command is used to set/get the Tx, Rx SDIO aggregation parameters. - Note: The parameters can be set only in disconnected state. - - Usage: - mlanutl mlanX mpactrl [tx_ena] [rx_ena] [tx_size] [rx_size] [tx_ports] [rx_ports] - - where the parameter are: - [tx_ena]: Enable/disable (1/0) Tx MP-A - [rx_ena]: Enable/disable (1/0) Rx MP-A - [tx_size]: Size of Tx MP-A buffer - [rx_size]: Size of Rx MP-A buffer - [tx_ports]: Max ports (1-16) for Tx MP-A - [rx_ports]: Max ports (1-16) for Rx MP-A - default values are 1 1 16384 32768 16 16 - The MP-A may be disabled by default at build time if the MMC driver byte mode patch - is not available in kernel. - - Examples: - mlanutl mlan0 mpactrl : Get MP aggregation parameters - mlanutl mlan0 mpactrl 0 0 - : Disable MP aggregation for Tx, Rx respectively - mlanutl mlan0 mpactrl 1 1 8192 8192 8 8 - : Enable MP aggregation for Tx, Rx - : Set Tx, Rx buffer size to 8192 bytes - : Set maximum Tx, Rx ports to 8 - -netmon - This command is used to set/get network monitor configuration. - Note: For channel specified mode, the configuration should be issued when - STA/AP is disconnected. For in-channel sniffer mode, the configuration - can be issued irrespective of the STA/AP connected state, and requires - specification of only action and filter parameters. If any of the STA/AP - connection is active, the in-channel sniffer mode will inherently work - on the active band and channel configuration. - - Usage: - mlanutl netmon [ [ ]] - - Where the parameters are: - : mlanX - : (0) disable any network monitor activity - : (1) enable channel specified sniffer mode activity - : network monitor fitler flag - bit 0: (1/0) enable/disable management frame - bit 1: (1/0) enable/disable control frame - bit 2: (1/0) enable/disable data frame - : 802.11 band - bit 0: B - bit 1: G - bit 2: A - bit 3: GN - bit 4: AN - bit 5: AC 2.4G - bit 6: AC 5G - : channel to monitor - : [offset] - [offset] : secondary channel bandwidth - 0 - Bandwidth 20Mhz - 1 - HT Bandwidth 40Mhz sec channel above - 3 - HT Bandwidth 40Mhz sec channel below - 4 - VHT Bandwidth 80Mhz - - Examples: - mlanutl mlan0 netmon : Get the current network monitor configuration - mlanutl mlan0 netmon 0 : Disable network monitor activity - mlanutl mlan0 netmon 1 4 11 6 : Enable channel specified sniffer activity, set filter - data frame, band B/G/GN and channel 6 - mlanutl mlan0 netmon 1 7 20 64 1 : Enable channel specified sniffer activity, set filter - management, control and data frame, band A/AN, - channel 64 and secondary channel above - -offchannel - This command is used to set/cancel the offchannel configuration. - Note: This command only can be used when cfg80211 is enabled during load time. - - Usage: - mlanutl mlanX offchannel [ ] - - where - - 0 : Cancel the offchannel configuration - 1 : Set the offchannel configuration - - The channel to configure - - The duration for which to configure - : channel bandwidth - 0 - Bandwidth 20Mhz - 1 - HT Bandwidth 40Mhz sec channel above - 3 - HT Bandwidth 40Mhz sec channel below - 4 - VHT Bandwidth 80Mhz - - Examples: - mlanutl mlan0 offchannel : Get current offchannel status. - mlanutl mlan0 offchannel 0 : Cancel the offchannel configuration. - mlanutl mlan0 offchannel 1 3 5 : Configure channel 3 for 5 milliseconds. - mlanutl mlan0 offchannel 1 36 5000 : Configure channel 36 for 5000 milliseconds. - mlanutl mlan0 offchannel 1 64 500 4 : Configure channel 64 in 80MHz for 500 milliseconds. - -otpuserdata - This command is used to get the OTP user data. - - Where - is - - This parameter specifies the length of OTP user data to be read - - Examples: - mlanutl mlan0 otpuserdata 10 : Get the 10-byte OTP user data - -passphrase - This command is used to set/get passphrase for WPA-PSK/WPA2-PSK/WPA3-SAE mode.// use of WPA/TKIP is not recommended anymore - - Where - ASCII string for ssid/passphrase/psk/sae_password. - - Setting psk for WPA3 SAE protocol is not possible, as new psk gets generated - everytime in protocol flow. - - 1) "0;" - This will get the passphrase, AKMP - for specified ssid, if none specified then it will get all. - - Example: - mlanutl mlan0 passphrase "0;ssid=nxp" - - 2) "1;; - " - Passphrase and psk cannot be provided for the same SSID. - This command takes only one SSID at a time, If ssid= is present it should contain - a passphrase or psk. If no arguments are provided then AKMP=802.1x, and passphrase - should be provided after association. - End of each parameter should be followed by a ';'(except for the last parameter) - as the delimiter. If ';' or '/' has to be used in an SSID then a '/' should be preceded - to ';' or '/' as a escape. - - Examples: - mlanutl mlan0 passphrase "1;ssid=nxpAP;passphrase=abcdefgd" - mlanutl mlan0 passphrase "1;ssid=nxp AP;psk=<64 bytes hexpsk>" - - If user wants to input the ssid as "nxp; AP" then command has to be - mlanutl mlan0 passphrase "1;ssid=nxp/; AP;passphrase=abcdefgh" - - If user wants to input the ssid as "//;" then command has to be - mlanutl mlan0 passphrase "1;ssid=/////;;passphrase=abcdefgh" - - 3) "2;" - This will clear the passphrase - for specified ssid, if none specified then it will clear all. - - Examples: - mlanutl mlan0 passphrase "2;ssid=nxp" - mlanutl mlan0 passphrase "2" : Clear all profiles and disable embedded supplicant - - 4)"1;ssid=;sae_password=" This will set WPA3 SAE ssid & password. sae_password should be within the range of 8 to 255 char. - Examples: - mlanutl mlan0 passphrase "1;ssid=nxp;sae_password=1234567890" - -pb_bypass - This command is used to get the By-passed TX packet from upper layer. - - Usage: - - mlanutl mlanX pb_bypass [data_1, data_2, ... data_n] - - where value of data_1, data_2, ... data_n isBypass TX Data - -pcieregrw - This command is used to read/write PCIE register. - - Usage: - mlanutl mlanX pcieregrw [value] - - where the parameters are, - : The offset of PCIE register - [value]: The value to write - - Examples: - mlanutl mlan0 pcieregrw 0x48 : Read PCIE register 0x48 - mlanutl mlan0 pcieregrw 0x44 8 : Write 8 to PCIE register 0x44 - -pciebar0regrw - This command is used to read/write PCIE register/memory from BAR0. - - Usage: - mlanutl mlanX pciebar0regrw [value] - - where the parameters are, - : The offset of PCIE register - [value]: The value to write - - Examples: - mlanutl mlan0 pciebar0regrw 0x48 : Read PCIE register 0x48 - mlanutl mlan0 pciebar0regrw 0x44 8 : Write 8 to PCIE register 0x44 - -pmfcfg - This command is used to set/get management frame protection parameters. - - Usage: - mlanutl mlanX pmfcfg - - where - : Management Frame Protection Capable (MFPC) - 1: Management Frame Protection Capable - 0: Management Frame Protection not Capable - : Management Frame Protection Required (MFPR) - 1: Management Frame Protection Required - 0: Management Frame Protection Optional - Default setting is PMF not capable. - m = 0, n = 1 is an invalid combination - - Examples: - mlanutl mlan0 pmfcfg : Get PMF parameters - mlanutl mlan0 pmfcfg 1 0 : Set MFPC and make MFPR optional - -port_ctrl - This command is used to Set/Get Port Control mode. No argument is used to get. - - where value of n is: - 0 -- Disable - 1 -- Enable - - Examples: - mlanutl mlan0 port_ctrl 1 : Enable Port Control mode - mlanutl mlan0 port_ctrl : Get Port Control mode status - -powercons - This command is used to set the local transmit power constraint. - Value is in dbm unit. This command is only used for ad-hoc start. - - Usage: - mlanutl mlanX powercons [n] - - Examples: - mlanutl mlanX powercons : get the current setting - mlanutl mlanX powercons 12 : set local power constraint to 12 dbm - -pscfg - This command is used to set/get PS configuration parameters. - - Usage: - mlanutl mlanX pscfg [k] [d] [l] ... - - Where the parameters: - [k]: Keep alive null packet interval (0: Unchanged, -1: Disable, n: Interval in seconds) - [d]: DTIM interval ( 0: Unchanged, - 1-5: Value, - 65534: DTIM will be ignored, listen interval will be used, - 65533: Closest DTIM to the listen interval period will be used ) - [l]: Local listen interval ( 0: Unchanged, - -1: Disable, - 1-49: Value in beacon intervals, - >= 50: Value in TUs ) - [b]: Beacon miss timeout (0: Unchanged, 1-50: Value in milliseconds, 65535: Disable) - [p]: Delay to PS (0-65535: Value in milliseconds, default 1000ms) - [m]: PS mode (0: Unchanged, 1: Auto mode, 2: PS-Poll mode, 3: PS Null mode) - No change if parameters are not provided. - - Examples: - mlanutl mlan0 pscfg : Get all the current PS configuration settings - mlanutl mlan0 pscfg 3 4 : Set PS keep alive null packet interval to 3 seconds - and DTIM interval to 4, all the other configurations - are unchanged - mlanutl mlan0 pscfg 0 0 0 0 50 2 : Set delay to PS to 50 ms and PS mode to PS-Poll mode, - keep the others unchanged - -bcntimeoutcfg - This command is used to set Beacon timeout parameters. - - Usage: - mlanutl mlanX bcntimeoutcfg [l] [m] [o] [p] - - Where the parameters: - [l]: Beacon miss timeout period Rx window (in ms) - [m]: Beacon miss timeout period (unit in beacon interval) - [o]: Beacon reacquire timeout period Rx window (unit in beacon interval) - [p]: Beacon reacquire timeout period (unit in beacon interval) - Please note that it would be better [m]+[p] not exceed 64. - Examples: - mlanutl mlan0 bcntimeoutcfg 10 30 2 30 : Set beacon timeout configure to - Beacon miss timeout period Rx window : 10 (ms) - Beacon miss timeout period : 30 (Beacon Interval) - Beacon reacquire timeout period Rx window : 2 (Beacon Interval) - Beacon reacquire timeout period : 30 (Beacon Interval) - -psmode - This command is used to set/get the IEEE PS mode configuration. - - Usage: - mlanutl mlanX psmode [l] - - where the parameter: - [l] - 0 : Disable IEEE PS mode - 1 : Enable IEEE PS mode - : Get IEEE PS mode - - Examples: - mlanutl mlan0 psmode : Get IEEE PS mode. - mlanutl mlan0 psmode 1 : Enable IEEE PS mode. - -qconfig - Send a WMM AC Queue configuration command to get/set/default params - - Configure or get the parameters of a WMM AC queue. The command takes - an optional Queue Id as a last parameter. Without the queue id, all - queues will be acted upon. - - Usage: - mlanutl mlanX qconfig def [Queue Id: 0-3] - mlanutl mlanX qconfig get [Queue Id: 0-3] - mlanutl mlanX qconfig set msdu [Queue Id: 0-3] - -qoscfg - This command sets WMM IE QOS info when an argument is given, and gets current WMM - IE QOS info when no argument is given. - - Examples: - mlanutl mlanX qoscfg 0x0f : Set WMM IE QOS info to 0x0f - mlanutl mlanX qoscfg : Get WMM IE QOS info - -qstatus - This command retrieves the current status of the WMM queues. If WMM - is enabled then it displays the information for each AC in a table. - - Usage: - mlanutl mlanX qstatus - -radioctrl - This command is used to turn on/off the radio. - Note: The radio can be disabled only in disconnected state. - - where value of n is: - 0 -- Disable - 1 -- Enable - - Examples: - mlanutl mlan0 radioctrl 1 : Turn the radio on - mlanutl mlan0 radioctrl : Get radio status - -rdeeprom - This command is used to read the EEPROM contents of the card. - - Usage: - mlanutl mlanX rdeeprom - - where the parameters are, - : multiples of 4 - : 4-20, multiples of 4 - - Example: - mlanutl mlan0 rdeeprom 0 20 : Read 20 bytes of EEPROM data from offset 0 - -reassoctrl - This command is used to turn on/off re-association in driver. - - Usage: - mlanutl mlanX reassoctrl [n] - - Where value of n is: - 0 -- Disable - 1 -- Enable - - Examples: - mlanutl mlan0 reassoctrl : Get re-association status - mlanutl mlan0 reassoctrl 1 : Turn re-association on - -regioncode - This command is used to set/get the region code in the station. - Note: This command should be issued at beginning before band/channel selection - and association. - - where value is 'region code' for various regions like - USA FCC, Canada IC, Europe ETSI, Japan ... - The special code (0xff) is used for Japan to support channel 1-14 in B/G/N mode. - - Examples: - mlanutl mlan0 regioncode : Get region code - mlanutl mlan0 regioncode 0x10 : Set region code to USA (0x10) - Note : in some case regioncode will be 0 after updated countycode or 80211d - i.e. mlanutl mlanX countrycode (CA, JP, CN, DE, ES AT, BR, RU) - or uaputl.exe sys_cfg_80211d state 1 country (CA, JP, CN, DE, ES AT, BR, RU) - Please use cfp instead of it. - -regrdwr - This command is used to read/write the adapter register. - - Usage: - mlanutl mlanX regrdwr [value] - - where the parameters are, - : 1:MAC, 2:BBP, 3:RF, 5:CAU, 6:PSU, 7:BCA, 8:CIU, 0x81:MAC2, 0x82:BBP2, 0x83: RF2, 0x87: BCA2 - : 1:MAC, 2:BBP, 3:RF, 5:CAU, 6:PSU, 7:BCA, 8:CIU - : 1:MAC/SOC, 2:BBP, 3:RF, 5:CAU, 6:PSU, 7:BCA - : offset of register - [value]: value to be written - Note: - BBP reg (type 2) 0xXZZZ: - X: 0=BBUD, 8=BBUA. - ZZZ: offset (0-0xFFF). - RF reg (type 3) 0xXYZZ: - - For 8887/8897/8777 - 1. If Y == 0, access RFU BASE Register. - X = Path ID (0=Path_A, 1=Path_B), ZZ = offset (0-0xFF). - 2. If Y != 0, access RFU XCVR Register on Path Y (1=Path_A, 2=Path_B). - X = Page # (0=Page_1, 1=Page_2, 2=Page_3 if chip support), ZZ: offset (0-0xFF). - For 8977/8997/8987 - X = Path ID (0-1) - Y = Page Number (0-6) in selected Path - ZZ = Register offset in selected path/page - - Examples: - mlanutl mlan0 regrdwr 1 0x60 : Read the MAC register - mlanutl mlan0 regrdwr 1 0x794 0x80000000 : Write 0x80000000 to MAC register - mlanutl mlan0 regrdwr 0x81 0x60 :Read MAC2 register - -rejectaddbareq - This command is used to set/get the conditions of rejecting addba request. - - Usage: - mlanutl mlanX rejectaddbareq [conditions] - mlanutl uapX rejectaddbareq [conditions] - - Where conditions are: - bit 0 = 1 -- reject the addba request when host sleep activated - bit 1 = 1 -- reject the addba request when FW auto re-connect enabled - this bit is only used with STA BSS - others -- reserved - - Examples: - mlanutl mlan0 rejectaddbareq : Get the reject addba request conditions - mlanutl mlan0 rejectaddbareq 0x1 : Reject the addba request - when host sleep activated - mlanutl mlan0 rejectaddbareq 0x2 : Reject the addba request - when FW auto re-connect enabled - mlanutl mlan0 rejectaddbareq 0x3 : Reject the addba request when - host sleep activated or - FW auto re-connect enabled - mlanutl uap0 rejectaddbareq 0x1 : Reject the addba request - when host sleep activated - -scancfg - This command is used to set/get scan configuration parameters. - - Usage: - mlanutl mlanX scancfg [t] [m] [p] [s] [a] [b] [c] [ext] [gap] - - where the parameters: - [t]: Scan Type (0: Unchanged, 1: Active, 2: Passive, default Active) - [m]: Scan Mode (0: Unchanged, 1: BSS, 2: IBSS, 3: Any, default Any) - [p]: Scan Probes (0: Unchanged, 1-5: Number of probes per channel, default 4) - [s]: Specific Scan Time (0: Unchanged, n: Value in ms, default 110 ms, max 500 ms) - [a]: Active Scan Time (0: Unchanged, n: Value in ms, default 200 ms, max 500 ms) - [b]: Passive Scan Time (0: Unchanged, n: Value in ms, default 200 ms, max 2000 ms) - [c]: Passive to Active Scan (0: Unchanged, 1: Enable, 2: Disable, default Enable) - [ext]: Extended scan (0: Unchanged, 1: Legacy scan, 2: Extended scan, 3: Extended scan enhance) - [gap]: Time gap between two scans in milliseconds (max value 500ms) - No change if the parameter is 0 or the parameter is not provided. - - Examples: - mlanutl mlan0 scancfg : Get all the current scan configuration settings - mlanutl mlan0 scancfg 1 3 : Set scan type to active and scan mode to any, - all the other scan configurations are unchanged - mlanutl mlan0 scancfg 0 1 2 200 : Set scan mode to BSS, number of probes to 2 and - specific scan time to 200 ms, all the other scan - configurations are unchanged - mlanutl mlan0 scancfg 0 0 0 0 0 0 1 : Set Passive to Active Scan to enable, all the - other scan configurations are unchanged - mlanutl mlan0 scancfg 2 0 0 0 0 0 2 : Set scan type to passive, Passive to Active - Scan to disable, all the other scan configurations - are unchanged - -sdcmd52rw - This command is used to read/write a controller register in - Secure Digital I/O Interfaces. - - Usage: - mlanutl mlanX sdcmd52rw [value] - - For SDIO MMC driver, only function 0 and 1 access is allowed. And there - is a limitation for function 0 write, only vendor specific CCCR registers - (0xf0 -0xff) are permiited. - - Examples: - mlanutl mlan0 sdcmd52rw 1 3 : Read SDIO function 1 register 3 - mlanutl mlan0 sdcmd52rw 1 1 0x3f : Write 0x3f to SDIO function 1 register 1 - -sdcmd53rw - This command is used to issue a CMD53 read/write data in - Secure Digital I/O Interfaces. - - Usage: - mlanutl mlanX sdcmd53rw
[data1] ... [dataN] - - where the parameters are, - : function number (0/1/2/..) -
: data address - : byte mode/block mode (0/1) - : block size (32/64/../512, NA for byte mode) - : block number or byte number - ... : data for write - - Note: The total data length is block size * block number for block mode - or byte number for byte mode. The max data length is 2000-byte. - For write the data pattern will be duplicated to data buffer. - - Examples: - mlanutl mlan0 sdcmd53rw 0 0x8000 1 0x40 2 - mlanutl mlan0 sdcmd53rw 1 0x10000 0 1 5 0x0a 0x0b 0x0c 0x0d 0x0e - -sdioclock - Turn On(1) or Off(0) the SDIO clock. - - Usage: - mlanutl mlanX sdioclock 1 (on) - mlanutl mlanX sdioclock 0 (off) - mlanutl mlanX sdioclock (get the current clock state) - - -setuserscan - Initiate a customized scan and retrieve the results - - Usage: - mlanutl mlanX setuserscan [ARGS] - - Where [ARGS]: - ssid="[SSID]" specify a SSID filter for the scan - group= specify the channel group(s) to scan - chan=[chan#][band][mode] where band is [a,b,g,e] and mode is - blank for unchange, or 'c' for active or 'p' for passive - bssid=xx:xx:xx:xx:xx:xx specify a BSSID filter for the scan - wc="[WILDCARD SSID]" specify a UNIX pattern matching filter (using * - and ?) for SSIDs found in a broadcast probe - keep=[0 or 1] keep the previous scan results (1), discard (0) - dur=[scan time] time to scan for each channel in milliseconds - gap=[gap time] Time gap between two scans in milliseconds - probes=[#] number of probe requests to send on each chan - for each broadcast probe required and each SSID - specific probe required (1-5) - bss_type=[1,2,3] BSS type: 1 (Infra), 2(Adhoc), 3(Any) - sort_by_ch Sort by channel number in ascending order. - Default mode: Sort by Signal Strength in descending order. - scan_type=[0,1] ext scan type (0-1) 0: legacy, 1: enhance scan - - Any combination of the above arguments can be supplied on the command line. - If the chan token is absent, a full channel scan will be completed by driver. - If the dur or probes tokens are absent, the driver default setting will be - used. The bssid and ssid fields, if blank, will produce an unfiltered scan. - It's allowed to input multiple ssid/wc entries, the max entry number is 10. - The type field will default to 3 (Any) and the keep field will default to 0 - (Discard). - - Examples: - 1) Perform an active scan on channels 1, 6, and 11 in the 'g' band: - setuserscan chan=1g,6g,11g - - 2) Perform a passive scan on channel 11 for 20 ms: - setuserscan chan=11gp dur=20 - - 3) Perform an active scan on channels 1, 6, and 11; and a passive scan on - channel 36 in the 'a' band: - setuserscan chan=1g,6g,11g,36ap - - 4) Perform an active scan on channel 6 and 36 for specific SSID: - setuserscan chan=6g,36a ssid=TestAP1 ssid=TestAP2 - - 5) Scan all available channels (B/G/N, A bands) for a specific BSSID, keep - the current scan table intact, update existing or append new scan data: - setuserscan bssid=00:50:43:20:12:82 keep=1 - - 6) Scan channel 6, for all infrastructure networks, sending two probe - requests. Keep the previous scan table intact. Update any duplicate - BSSID/SSID matches with the new scan data: - setuserscan chan=6g bss_type=1 probes=2 keep=1 - - 7) Scan channel 1 and 6, for all networks matching the NXP*AP - or AP*NXP? patterns and for NXPTst SSID. Generate 3 broadcast - probes for the patterns and 3 SSID specific probes for NXPTst on - both channel 1 and channel 6. - setuserscan chan=1g,6g probes=3 wc="NXP*AP" wc="AP*NXP?" ssid="NXPTst" - - 8) Scan all the channels for specified band. - setuserscan chan=0g - 9) Perform active scan for a list of specific BSSIDs - setuserscan bssid=00:50:43:20:12:82 bssid=48:e2:44:3f:ec:76 - - 9) Scan channel 1 and 6, send 3 probe requests, scan each channel for 40 ms - with time gap of 50ms between 2 scans - setuserscan chan=1g,6g probes=3 dur=40 gap=50 - - 10) Perform an enhance scan - setuserscan scan_type=1 - - All entries in the scan table (not just the new scan data when keep=1) - will be displayed upon completion by use of the getscantable ioctl. -cancelscan - This command is used to cancel scan - Usage: - mlanutl mlanX cancelscan -sleepparams - This command is used to set the sleepclock configurations - - Usage: - mlanutl mlanX sleepparams [ ] - - where: - p1 is Sleep clock error in ppm (0-65535) - p2 is Wakeup offset in usec (0-65535) - p3 is Clock stabilization time in usec (0-65535) - p4 is Control periodic calibration (0-2) - p5 is Control the use of external sleep clock (0-2) - p6 is reserved for debug (0-65535) - - Examples: - mlanutl mlan0 sleepparams : Get current sleepclock configuration - mlanutl mlan0 sleepparams 10 1000 2000 1 0 128 : Set sleepclock configuration - -sleeppd - This command is used to configure the sleep period of the WLAN device. - - Usage: - mlanutl mlanX sleeppd [] - - Where the parameter is: - period: sleep period in milliseconds. Range 10~60. 0 for disable. - - Examples: - mlanutl mlan0 sleeppd : Get sleep period configuration - mlanutl mlan0 sleeppd 10 : Set sleep period to 10 ms - -sysclock - This command is used to set/get system clocks in MHz. - The current system clock, configurable system clocks and all of the - supported system clocks will be returned if no parameter provided. - - Examples: - mlanutl mlan0 sysclock : Get system clocks - 80 80 128 128 128 5 11 16 20 22 32 40 44 64 80 106 128 160 ... - (The current system clock is 80 MHz. - The configurable system clocks of non-security, security, non-security - A-MPDU and security A-MPDU are 80 MHz, 128 MHz, 128 MHz and 128 MHz. - The supported system clocks are 5 MHz, 11 MHz, ..., 160 MHz, 182 MHz, - 213 MHz, 256 MHz, 320 Mhz, 366 MHz , ... . the Max system clocks is different - for different chips, you could use this command to get the supported system clock) - - mlanutl mlanX sysclock 80 : Set system clock in non-security mode - to 80 MHz, no change for others - mlanutl mlanX sysclock 0 0 128 : Set system clock in non-security A-MPDU - mode to 128 MHz, no changes for others - -tcpackenh - This command is used to set/get TCP ACK enhancement mode. - - Usage: - mlanutl mlanX tcpackenh [l] [m] - - where - [l] is a control to set TCP ACK enhancement mode - 1 -- Enable TCP ACK enhancement (default) - 0 -- Disable TCP ACK enhancement - [m] is to configure TCP ACK max hold number - default value is 9, which means driver could hold up to 9 TCP ACK and - only send the last one to peer. - - Examples: - mlanutl mlan0 tcpackenh : Display TCP ACK enhancement - mlanutl mlan0 tcpackenh 1 : Enable TCP ACK enhancement - mlanutl mlan0 tcpackenh 0 : Disable TCP ACK enhancement - mlanutl mlan0 tcpackenh 1 1 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 50% - mlanutl mlan0 tcpackenh 1 2 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 67% - mlanutl mlan0 tcpackenh 1 3 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 75% - mlanutl mlan0 tcpackenh 1 4 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 80% - mlanutl mlan0 tcpackenh 1 5 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 83% - mlanutl mlan0 tcpackenh 1 6 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 85% - mlanutl mlan0 tcpackenh 1 7 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 87.5% - mlanutl mlan0 tcpackenh 1 8 : Enable TCP ACK enhancement and - configure TCP ACK drop percentage to 88.8% - -host_tdls_config - This command is used to support channel switch and uapsd for host based tdls - - Usage: - mlanutl mlanX host_tdls_config - - - Where the parameter is: - host_tdls.conf: The configuration file specifying to enable/disable uapsd/cs and related parameters. - - Examples: - mlanutl mlan0 host_tdls_config config/host_tdls.conf - : enable or disable uapsd/cs, config the channel related ie, based on the configuration file. -tdls_channel_switch - This command is used to send TDLS channel switch request. - - Usage: - mlanutl mlanX tdls_channel_switch - - Where the parameter is: - tdls.conf: The configuration file for sending TDLS channel switch command. - - Examples: - mlanutl mlan0 tdls_channel_switch config/tdls.conf - : Send TDLS channel switch command, based on the configuration file. - -tdls_config - This command is used to enable/disable TDLS on device. - - Usage: - mlanutl mlanX tdls_config <0/1> - - Where the parameter is: - 0: Enable TDLS. - 1: Disable TDLS. - - Examples: - mlanutl mlan0 tdls_config 0 : Disable TDLS - mlanutl mlan0 tdls_config 1 : Enable TDLS - -tdls_cs_params - This command is used to set TDLS channel switch params - - Usage: - mlanutl mlanX tdls_cs_params - - Where the parameter is: - tdls.conf: The configuration file specifying the TDLS channel switch params. - - Examples: - mlanutl mlan0 tdls_cs_params config/tdls.conf - : Set TDLS channel switch params, based on the configuration file. - -tdls_debug - This command is used for FW debug functionality and tests. - -tdls_disable_cs - This command is used to disable TDLS channel switch - - Usage: - mlanutl mlanX tdls_disable_cs - - Where the parameter is: - tdls.conf: The configuration file to disable TDLS channel switch. - - Examples: - mlanutl mlan0 tdls_disable_cs config/tdls.conf - : Disable TDLS channel switch, based on the configuration file. - -tdls_discovery - This command is used to request TDLS discovery. - - Usage: - mlanutl mlanX tdls_discovery - - Where the parameter is: - tdls.conf: The configuration file to request TDLS discovery. - - Examples: - mlanutl mlan0 tdls_discovery config/tdls.conf - : Request TDLS discovery based on the configuration file. - -tdls_link_status [peer_mac_address] - This command is used to get link information about TDLS links or - a TDLS link correponding to peer mac address. - - Usage: - mlanutl mlanX tdls_link_status - - Where the parameter is: - tdls.conf: The configuration file to send TDLS command to get current link status. - - Examples: - mlanutl mlan0 tdls_link_status config/tdls.conf - : Send TDLS command to get current link status based on the configuration file. - -tdls_powermode - This command is used to send TDLS powermode request. - - Usage: - mlanutl mlanX tdls_powermode - - Where the parameter is: - tdls.conf: The configuration file for sending TDLS powermode command. - - Examples: - mlanutl mlan0 tdls_powermode config/tdls.conf - : Send TDLS powermode (either 0:Active, 1:PowerSave) command, based on the configuration file. - -tdls_setinfo - This command is used for setting the capabilities of the TDLS station. - - Usage: - mlanutl mlanX tdls_setinfo - - Where the parameter is: - tdls.conf: The configuration file specifying the capabilities of the TDLS station. - - Examples: - mlanutl mlan0 tdls_setinfo config/tdls.conf - : Set capabilities of the TDLS station, based on the configuration file. - -tdls_setup - This command is used to send TDLS setup request. - - Usage: - mlanutl mlanX tdls_setup - - Where the parameter is: - tdls.conf: The configuration file for sending TDLS setup request. - - Examples: - mlanutl mlan0 tdls_setup config/tdls.conf - : Send TDLS setup request, based on the configuration file. - -tdls_stop_channel_switch - This command is used to send stop TDLS channel switch request. - - Usage: - mlanutl mlanX tdls_stop_channel_switch - - Where the parameter is: - tdls.conf: The configuration file for sending stop TDLS channel switch command. - - Examples: - mlanutl mlan0 tdls_stop_channel_switch config/tdls.conf - : Send stop TDLS channel switch command, based on the configuration file. - -tdls_teardown - This command is used to send TDLS teardown request. - - Usage: - mlanutl mlanX tdls_teardown - - Where the parameter is: - tdls.conf: The configuration file for requesting teardown of TDLS link. - - Examples: - mlanutl mlan0 tdls_teardown config/tdls.conf - : Request teardown of TDLS link, based on the configuration file. - -hal_phy_cfg - This command is used to set the hal/phy related config parameters - - Usage: - mlanutl mlanX/uapX hal_phy_cfg - - Where the parameter is: - hal_phy_cfg.conf: The configuration file specifying to the values of hal/phy related config parameters - - Examples: - mlanutl mlan0 hal_phy_cfg config/hal_phy_cfg.conf - : to enable or disable 11b_psd_mask the file would contain following paramters - hal_phy_cfg{ - 11b_psd_mask_cfg=1 # 1: 11b_psd_mask_enable, 0: 11b_psd_mask_disable - } - -thermal - This command is used to get the current thermal reading. - - Examples: - mlanutl mlan0 thermal : Get thermal reading - -ts_status - This command queries the FW for the status of TSIDs 0 through 7 - configured via call admission control and displays the results in a - table. - - Usage: - mlanutl mlanX ts_status - -tsf - Set/Get the TSF timer value for the station. Station maintains a TSF timer with - modulus 2^64 counting in increments of microseconds. - - Usage: - mlanutl mlanX/uapX tsf [t] - - where, - [t] : 64bit timestamp value in microseconds - - Examples: - mlanutl mlan0 tsf : Get timestamp - mlanutl uap0 tsf 669468581993 : Set timestamp - -txaggrctrl - This command is used to enable/disable TX AMPDU on infra link when TDLS link is established - - Usage: - mlanutl mlanX txaggrctrl [m] - - Where: - [m]: 1 to enable TX AMPDU on infra link; 0 to disable TX AMPDU on infra link - - Examples: - mlanutl mlan0 txaggrctrl : Get current TX AMPDU status on infra link - mlanutl mlan0 txaggrctrl 0 : Disable TX AMPDU on infra link - mlanutl mlan0 txaggrctrl 1 : Enable TX AMPDU on infra link - - Note: - The set command only works when TDLS link is established. - -txbufcfg - This command can be used to get current buffer size. - - eg: - mlanutl mlanX txbufcfg - This will display the current buffer size. - - Note:- The actual tx buf size will depends on AP's capability and max transmit buffer size. - -aggrctrl - This command is used to set/get aggregation parameters. - - Usage: - mlanutl mlanX aggrctrl [l] - - where the parameter: - [l]: Enable (1) or disable (0) Tx aggregation - - Examples: - mlanutl mlan0 aggrctrl : Display aggregation configurations - mlanutl mlan0 aggrctrl 0 : Disable Tx aggregation - mlanutl mlan0 aggrctrl 1 : Enable Tx aggregation - -usbaggrctrl - This command is used to set/get USB aggregation parameters. - - Usage: - mlanutl mlanX usbaggrctrl [l] [m] [n] [o] [p] [q] [r] [s] - - where the parameter: - [l]: Enable (1) or disable (0) Tx aggregation - [m]: Enable (1) or disable (0) Rx aggregation - [n]: Tx aggregation max size/number - For number based aggregation, the values supported are - - 2, 4, 8, 16 - For size based aggregation, the number supported are - - 4096, 8192, 16384, 32768 - [o]: Rx aggregation max size/number - For number based deaggregation, the values supported are - - 2, 4, 8, 16 - For size based deaggregation, the number supported are - - 4096, 8192, 16384, 32768 - [p]: Tx aggregation alignment - The value must be 2048, 4096, 8192 etc. - [q]: Rx aggregation alignment - The value must be 512, 1024, 2048, 4096, 8192 etc. - [r]: Tx aggregation timeout - Timeout value in us, 0 for disabled, 0xFFFF for dynamic timeout - and 1-10000 are valid timeout value - [s]: Rx aggregation timeout - Timeout value in us, 0 for disabled - - Examples: - mlanutl mlan0 usbaggrctrl : Display USB aggregation configurations - mlanutl mlan0 usbaggrctrl 0 0 : Disable both Tx and Rx aggregation - mlanutl mlan0 usbaggrctrl 1 1 4 8 2048 512 1000 200 : Enable both Tx and Rx aggregation - -usbresume - This command is used to resume the device from suspend mode. - Note: It's only valid on kernel 2.6.24 or later. - -usbsuspend - This command is used to put device to suspend mode. - Note: It's only valid on kernel 2.6.24 or later. - -opermodecfg - This command is used to set and get 11ac Operating Mode Notification configuration. - - where is - - This is the channel width setting for the opermodecfg - 1: 20MHz - 2: 40MHz - 3: 80MHz - 4: 160MHz or 80+80MHz - - where is - - This parameter specifies the nss that the STA can receive. - 1: NSS1 - 2: NSS2 - 3: NSS3 - 4: NSS4 - 5: NSS5 - 6: NSS6 - 7: NSS7 - 8: NSS8 - -wakeupreason - This command is used to get the host sleep wakeup reason. - - Usage: - mlanutl mlanX wakeupreason - mlanutl uapX wakeupreason - Examples: - mlanutl mlan0 wakeupreason : Get the host sleep wakeup reason - mlanutl uap0 wakeupreason : Get the host sleep wakeup reason - 0: unknown - 1: Broadcast data matched - 2: Multicast data matched - 3: Unicast data matched - 4: Maskable event matched - 5. Non-maskable event matched - 6: Non-maskable condition matched (EAPoL rekey) - 7: Magic pattern matched - 8: Control frame matched - 9: Management frame matched - Others: reserved. (0) - -warmreset - This command is used for warm reset of the interface. - - Usage: - mlanutl mlanX warmreset - -wpssession - This command is used to control wps session. No argument is used to get. - - where value of n is: - 0 -- Disable - 1 -- Enable - - Examples: - mlanutl mlan0 wpssession 1 : Enable wpssession - mlanutl mlan0 wpssession : Get wpssession status - -wmmcfg - This command is used to control WMM. No argument is used to get. - - where value of n is: - 0 -- Disable - 1 -- Enable - - Examples: - mlanutl mlan0 wmmcfg 1 : Enable WMM - mlanutl mlan0 wmmcfg : Get WMM status - -wmmparamcfg - This command is used to configure WMM paramameters. - - Usage: - mlanutl mlanX wmmparamcfg [AC_BE AIFSN ECW_MAX ECW_MIN TX_OP] - [AC_BK AIFSN ECW_MAX ECW_MIN TX_OP] - [AC_VI AIFSN ECW_MAX ECW_MIN TX_OP] - [AC_VO AIFSN ECW_MAX ECW_MIN TX_OP] - - The supported option are: - AC_BE: 0 - AC_BK: 1 - AC_VI: 2 - AC_V0: 3 - AIFSN: AIFSN value - ECW_MAX: ECW max - ECW_MIN: ECW min - TX_OP: TXOP Limit - empty - Get current WMM parameters - - Example: - mlanutl mlanX wmmparamcfg 0 3 10 4 0 - Set AC_BE with AIFSN 3, ECW_MAX 10, ECW_MIN 4 and TXOP 0 - - mlanutl mlanX wmmparamcfg 1 7 10 4 0 - Set AC_BK with AIFSN 7, ECW_MAX 10, ECW_MIN 4 and TXOP 0 - - mlanutl mlanX wmmparamcfg 2 2 4 3 94 - Set AC_VI with AIFSN 2, ECW_MAX 4, ECW_MIN 3 and TXOP 94 - - mlanutl mlanX wmmparamcfg 3 2 3 2 47 - Set AC_VO with AIFSN 2, ECW_MAX 3, ECW_MIN 2 and TXOP 47 - - mlanutl mlanX wmmparamcfg - Get current WMM parameters - - mlanutl mlanX wmmparamcfg 0 3 10 4 0 1 7 10 4 0 2 2 4 3 94 3 2 3 2 47 - Set AC_BE with AIFSN 3, ECW_MAX 10, ECW_MIN 4 and TXOP 0 - Set AC_BK with AIFSN 7, ECW_MAX 10, ECW_MIN 4 and TXOP 0 - Set AC_VI with AIFSN 2, ECW_MAX 4, ECW_MIN 3 and TXOP 94 - Set AC_VO with AIFSN 2, ECW_MAX 3, ECW_MIN 2 and TXOP 47 - -wwscfg - This command is used to set/get the WWS (World Wide Safe) mode. - - where value of m is: - 0 -- Disable WWS mode (default) - 1 -- Enable WWS mode - - Examples: - mlanutl mlan0 wwscfg : Get WWS mode - mlanutl mlan0 wwscfg 1 : Enable WWS mode - mlanutl mlan0 wwscfg 0 : Disable WWS mode - -mc_cfg - This command is used to set/get the channel time. - - Usage: - mlanutl mlanX mc_cfg [n] - - where : Channel time in microseconds. - - Examples: - mlanutl mlanX mc_cfg : Get Channel time and buffer weight. - mlanutl mlanX mc_cfg 10000 : Set Channel time to 10000us. - -mc_policy - This command is used to set/get the multi-channel policy. - Note: This is a device specific command. Hence, setting on one interface is - reflected on all other interfaces. - - Usage: - mlanutl mlanX mc_policy [n] - - where : Multi-channel policy - - Examples: - mlanutl mlanX mc_policy : Get multi-channel policy setting. - mlanutl mlanX mc_policy 1 : Set multi-channel policy to 1. - mlanutl mlanX mc_policy 0 : Disable multi-channel policy - -mc_cfg_ext - This command is used to set/get the drcs parameters. - - Usage: - mlanutl mlanX mc_cfg_ext [c] [s] [u] [m] - - where: - channel index0: - [c] : chantime(in TU) - [s] : switchtime(in TU) - [u] : undozetime(in TU) - [m] : mode :0x0 --- PM1(default) - 0x1 --- Null2Self - channel index1: - : chantime(in TU) - : switchtime(in TU) - : undozetime(in TU) - : mode :0x0 --- PM1(default) - 0x1 --- Null2Self - Note: - channel index0: the first channel - channel index1: the second channel - undozetime should be less than other channel's switchtime - If want to set two channels the same parameters, just ignore the last four parameters and - use [c] [s] [u] [m] to set. - Examples: - mlanutl mlanX mc_cfg_ext : Get the drcs parameters for two channels. - mlanutl mlanX mc_cfg_ext 15 10 5 0 : Set two channels:channeltime 15TU, switchtime 10TU, undozetime 5TU, mode PM1 - mlanutl mlanX mc_cfg_ext 15 10 5 0 25 15 9 0 : Set channel index0: channeltime 17TU, switchtime 10TU, undozetime 5TU, mode PM1; - set channel index1: channeltime 25TU, switchtime 15TU, undozetime 9TU, mode PM1. - -cfg_noa - This is used to get/set P2P NoA (Notice of Absence) parameters only for P2P GO. - - Usage: - mlanutl p2pX cfg_noa [h] [i] [j] [k] [l] - - where: - [h] : noa_enable : 1/0 Set to 1 to enable NoA, 0 to disable NoA. - [i] : index : 0 - 255 Identifies an instance of NoA timing. - [j] : count : 1 - 255 Indicates the number of absence intervals. - 255 means a continuous schedule. - [k] : duration : Indicates the maximum duration in units of microseconds - that P2P GO can remain absent following the start of - a NoA interval. - [l] : interval : Indicates the length of the NoA interval in units of - microseconds. - - Examples: - mlanutl p2pX cfg_noa : Get noa configuration. - mlanutl p2pX cfg_noa 1 1 255 50 100 : Set noa configuration. - -cfg_opp_ps - This is used to get/set P2P OPP-PS parameters only for P2P GO. - - Usage: - mlanutl p2pX cfg_opp_ps [m] [n] - - where: - [m] : ps_enable : 1/0 Set to 1 to indicate P2P GO is using opportunistic - power save. Set to 0 if opportunistic power save is disabled. - [n] : ct_window : A period of time in TU after a TBTT during which P2P GO - is present. 0 indicates that there shall be no - CTWindow (Client Traffic Window). - - Examples: - mlanutl p2pX cfg_opp_ps : Get noa configuration. - mlanutl p2pX cfg_opp_ps 1 7 : Set noa configuration. - -get_sensor_temp - This command is used to get SOC temperature - Usage: - mlanutl mlanX get_sensor_temp - -indrstcfg - This command is used to set/ get independent reset mode configuration - - Usage : - mlanutl indrstcfg [gpio_pin] - - interface : mlanX, uapX - ir_mode : 0 -- Disable - 1 -- Enable out band reset, disable in band - 2 -- Enable in band, disable out band - gpio_pin : 255 -- Default pin for reset - any other number for changing the gpio for reset. - - Example : - mlanutl mlan0 indrstcfg 1 255 : Set default pin on interface mlan0 as reset pin - mlanutl mlan0 indrstcfg 0 : Disable the gpio 17 as reset pin on interface mlan0 - mlanutl mlan0 indrstcfg : Get the status and the pin used for reset pin - mlanutl mlan0 indrstcfg 2 : Enable in band reset mode - -ctrldeauth - This command is used to set/get firmware ctrldeauth setting - Usage : - mlanutl uapX ctrldeauth - - Where value of n is : - 0 -- Firmware will use default behavior - 1 -- Firmware will not send deauth packet when uap move to another channel. - - Example : - mlanutl uap0 ctrldeauth : Get current setting - mlanutl uap0 ctrldeauth : Firmware will not send deauth packet when uap move to different channel. - -robustcoex - This command is used to set robust coex. - - Usage : - mlanutl robustcoex [Enable/Disable] [gpionum] [gpiopolarity] - Enable/Disable : 0 -- Disable ; 1 -- Enable - gpionum : Number of gpio - gpiopolarity : polarity of gpio - - Example : - mlanutl mlan0 robustcoex gpiocfg 1 4 1 : Enable robustcoex gpio, set gpionum to 4 and gpiopolarity to 1 - mlanutl mlan0 robustcoex gpiocfg 0 : Disable robustcoex gpio - -cwmode - This command is used to set Cont. Tx/Wave mode. - - Usage: - mlanutl cwmode config/cwmode.conf - interface: mlanX - cwmode.conf: This config file specifies whether to enable/disable Cont Tx/Wave mode. - User can specify parameters like Channel, datarate, BW, Channel Offset, Band. - Detailed information about parameters is mentioned in the conf file. - Example: - mlanutl mlan0 cwmode config/cwmode.conf : Enable/Disable Cont Tx/Wave mode. - mlanutl mlan0 cwmode : Get current Tx mode - -bootsleep - This command is used to set and get boot sleep configure. - - Usage : - mlanutl mlanX/uapX bootsleep - : enable boot sleep - : 0 - disable boot sleep - : 1 - enable boot sleep - - Example : - mlanutl mlan0/uap0 bootsleep 1 : Enable boot sleep - mlanutl mlan0/uap0 bootsleep : Get boot sleep configure - -ssu - Collect spectral analysis data and save them into /data/ssudump.txt - - Usage : - mlanutl mlanX ssu [mode] [ssu file] - - mode : 2 -- Enable ssu and use FW default ssu parameter - ssu file : file to config ssu parameter - - Example : - mlanutl mlan0 ssu :Enable SSU and use driver default ssu parameter - mlanutl mlan0 ssu config/ssu.conf :Enable SSU and use ssu parameter from ssu.conf - mlanutl mlan0 ssu 2 :Enable SSU and use FW default ssu parameter - -csi - Enable/disable channel state information collection - - Usage : - mlanutl mlanX csi - disable : 0 - enable : config file with csi filters - - Example : - mlanutl mlan0 csi config/csi.conf : Enable CSI - mlanutl mlan0 csi 0 : Disable CSI - -arb - Set HW ARB mode - The command needs to be issued before association. - - Usage: - mlanutl mlanX arb [mode] - - where the parameter is: - [mode]: - 0: arb mode 0 (default) - 1: arb mode 1 - 2: arb mode 2 - 3: arb mode 3 (Improve TX throughput) - 4: arb mode 4 (Improve RX throughput) - - Example : - mlanutl mlan0 arb 1 : Set HW ARB mode 1 - -dmcs - This command is used to config DMCS or get DMCS status. - - Usage: - mlanutl mlanX dmcs [value] - - : config mapping policy - disable dynamic mapping when [value = 0] - enable dynamic mapping when [value = 1] - : get DMCS status - - Example : - mlanutl mlan0 dmcs 0 1 : Enable dynamic mapping - mlanutl mlan0 dmcs 0 0 : Disable dynamic mapping - mlanutl mlan0 dmcs 1 : Get DMCS status - -range_ext - This command is used to config range extension mode. - - Usage: - mlanutl mlanX/uapX range_ext [mode] - - where the parameter is: - [mode]: - 0: Default Mode(Auto Rate) - 1: HE ER+DCM Mode - 2: Legacy Mode(1 Mbps Rate) - - Example: - mlanutl mlan0 range_ext : get range extension mode - mlanutl mlan0 range_ext 1 : set range extension mode to HE ER+DCM mode - -twt_setup - This command is used to config TWT setup parameters using conf file. - - Usage: - mlanutl mlanX twt_setup [conf file] - - Example: - mlanutl mlan0 twt_setup config/twt.conf - -twt_teardown - This command is used to config TWT teardown parameters using conf file. - - Usage: - mlanutl mlanX twt_teardown [conf file] - - Example: - mlanutl mlan0 twt_teardown config/twt.conf - -rx_abort_cfg - This command is used to set/get static rx abort config for pkt having - weaker RSSI than threshold. This threshold will be overwritten on starting - dynamic rx abort cfg ext. - - Usage: - mlanutl rx_abort_cfg [enable] [rssi_threshold] - - Where the parameters are: - : mlanX, - uapX - [enable] : 0 - Disable Rx abort - 1 - Enable Rx abort of pkt having weak RSSI - [rssi_threshold] : weak RSSI pkt threshold in dBm (absolute value) - (default = 70) - - Examples: - mlanutl mlan0 rx_abort_cfg - - Display current rx abort configuration - mlanutl uap0 rx_abort_cfg 1 60 - - Enable rx abort and set weak RSSI Threshold to -60 dBm - mlanutl mlan0 rx_abort_cfg 1 40 - - Enable rx abort and set weak RSSI Threshold to -40 dBm - mlanutl mlan0 rx_abort_cfg 0 - - Disable rx abort - -rx_abort_cfg_ext - This command is used to set/get dynamic rx abort config. This will set - threshold based on minimum of ceiling rssi threshold and the weakest - RSSI among all connected peers. Margin can be specified as an offset to - this threshold. Default margin is set to -10 dBm. Ceiling rssi threshold - can be changed by specifying. Default ceil is set to -70 dBm. - This will be disabled on enabling fixed rx abort (rx_abort_cfg) - - Note: This dynamic rx abort mode is enabled by default. - - Usage: - mlanutl rx_abort_cfg_ext [enable] [margin ceil_thresh] - - Where the parameters are: - : mlanX, - uapX - [enable] : 0 - Disable Rx abort - 1 - Enable Rx abort of pkt having weak RSSI - [margin] : rssi margin in dBm (absolute val) - (default = 10) - [ceil_thresh] : ceiling weak RSSI pkt threshold in dBm - (absolute value) (default = 70) - - Examples: - mlanutl mlan0 rx_abort_cfg_ext - - Display current rx abort configuration - mlanutl uap0 rx_abort_cfg_ext 1 10 60 - - Enable dynamic rx abort, set margin to -10 dBm and set ceil - RSSI Threshold to -60 dBm - mlanutl mlan0 rx_abort_cfg_ext 1 5 50 - - Enable dynamic rx abort, set margin to -5 dBm and set ceil - RSSI Threshold to -50 dBm - mlanutl mlan0 rx_abort_cfg_ext 0 - - Disable dynamic rx abort - -tx_ampdu_prot_mode - This command is used to set either RTS/CTS or CTS2SELF protection mechanism - in MAC, for aggregated Tx QoS data frames. RTS/CTS is enabled by default. - - Usage: - mlanutl tx_ampdu_prot_mode [mode] - - Where the parameters are: - : mlanX, - uapX - [mode] : 0 - Set RTS/CTS mode - 1 - Set CTS2SELF mode - 2 - Disable Protection mode - 3 - Set Dynamic RTS/CTS mode - - Examples: - mlanutl mlan0 tx_ampdu_prot_mode - - Get currently set protection mode for Tx AMPDU - mlanutl mlan0 tx_ampdu_prot_mode 1 - - Set protection mode for Tx AMPDU to CTS2SELF - -rate_adapt_cfg - This command is used to switch between SR rateadapt and Legacy rateadapt. - FW default Algorithm is Legacy rateadapt - when SR rateadapt is enabled then it is used to set static threshold based - or dynamic noise based rate adaptation and set the timer interval to evaluate - sw rate adaptation.For static mode, low and high thresholds for Tx aggregated - pkt success rate should be configured. The Tx rate will decrease if success rate - goes lower than LOW_THRESH, will increase if it goes beyond HIGH_THRESH, and will - remain the same when success rate is between these thresholds.To set dynamic mode, - specify 0xff for both low and high thresh. - - Note: config can be set only before associating with an external AP - when in STA mode, or before starting bss when in uAP mode - - Usage: - mlanutl rate_adapt_cfg - [sr_rateadapt low_thresh high_thresh timer_interval] - - Where the parameters are: - : mlanX, - uapX - [sr_rateadapt] : SR Rateadapt or Legacy Rateadapt - [low_thresh] : lower tx success rate threshold - [high_thresh] : higher tx success rate threshold - [timer_interval] : interval to evaluate tx rate in sw in multiples - of 10 (ms) - - Examples: - mlanutl mlan0 rate_adapt_cfg - - Display SR rateadapt or Legacy rateadapt enabled - - Display current rate adapt configuration if SR rateadapt is enabled. - mlanutl uap0 rate_adapt_cfg 1 60 80 10 - - set lower Tx success rate threshold to 60%, higher to 80% - and evaluate tx rate every 100 ms (i.e 10 * 10 = 100 ms) - when SR Rateadapt is enabled. - mlanutl mlan0 rateadapt_cfg 0 - - switch to Legacy rateadapt. - mlanutl mlan0 rateadapt_cfg 1 - - switch to SR rateadapt. - Fw default is dynamic Success threshold enabled - with 100 ms linkadapt timer. - mlanutl mlan0 rate_adapt_cfg 1 50 70 50 - - set lower Tx success rate threshold to 50%, higher to 70% - and evaluate tx rate every 500 ms (i.e 50 * 10 = 500 ms) - when SR Rateadapt is enabled. - mlanutl mlan0 rate_adapt_cfg 1 0xff 0xff 10 - - set dynamic environment noise based mode and evaluate tx rate - every 100 ms (i.e 10 * 10 = 100 ms) - when SR Rateadapt is enabled. - -cck_desense_cfg - This command is used to configure CCK (802.11b) Desensitization RSSI - threshold. All CCK traffic beyond this threshold will be ignored, resulting - in higher Tx throughput. Threshold value is in absolute value of rssi in - dBm. In dynamic and enhanced modes, cck desense will be turned on only in - presence of an active connection and the effective CCK desense RSSI - threshold will be updated every rateadapt interval, based on: - min{ceil_thresh, [min RSSI among all connected peers] - margin} - - Further, for dynamic enhanced mode, CCK desense will be turned on/off based - on environment noise condition and ongoing Tx traffic rate. In this mode, - CCK desense will also be turned off periodically in order to allow 802.11b - Rx frames from Ext-AP, if rx rssi becomes weaker than the current threshold - or when in uAP mode, frames from clients which attempt to connect with the - uAP, but have weaker RSSI than the set threshold. - Turn on and off intervals are specified in terms of rateadapt intervals. - Please note that in this mode, if dynamic Rx Abort is enabled, then it - will turn on/off in sync with cck desense. - - Usage: - mlanutl cck_desense_cfg [mode] [margin ceil_thresh] - [num_on_intervals num_off_intervals] - - Where the parameters are: - : mlanX, - uapX - [mode] : 0 - Disable cck desense - 1 - Enable dynamic cck desense mode - 2 - Enable dynamic enhanced cck desense mode - [margin] : rssi margin in dBm (absolute val) - (default = 10) - [ceil_thresh] : ceiling weak RSSI pkt threshold in dBm - (absolute value) (default = 70) - [num_on_intervals] : number of rateadapt intervals to keep cck - desense "on" [for mode 2 only] (default = 20) - [num_off_intervals]: number of rateadapt intervals to keep cck - desense "off" [for mode 2 only] (default = 3) - - Examples: - mlanutl mlan0 cck_desense_cfg - - Display current cck desense configuration - mlanutl uap0 cck_desense_cfg 1 10 70 - - Set dynamic mode, margin to -10 dBm and ceil RSSI Threshold to - -70 dBm - mlanutl uap0 cck_desense_cfg 2 10 60 30 5 - - Set dynamic enhanced mode, margin to -10 dBm, ceil RSSI Threshold - to -60 dBm, num on intervals to 30 and num off intervals to 5. - mlanutl mlan0 cck_desense_cfg 1 10 50 - - Set dynamic mode, margin to -10 dBm and ceil RSSI Threshold to - -50 dBm - mlanutl mlan0 cck_desense_cfg 2 5 60 - - Set dynamic enhanced mode, set margin to -5 dBm, set ceil RSSI - Threshold to -60 dBm, and retain previous num on/off intervals - setting. - mlanutl mlan0 cck_desense_cfg 0 - - Disable cck desense - -lpm - This command is used to configure low power mode. - - Usage: - mlanutl mlanX/uapX lpm [mode] - - Where the paramter is: - [mode] : low power mode 0, 1, 2, 3 - - Examples: - mlanutl mlan0 lpm Get low power mode - mlanutl mlan0 lpm 1 Set low power mode to 1 - -dot11mc_unassoc_ftm_cfg - This command is used to enable or disable the configuration for - DOT11MC FTM frames exchanges in un-associated state for STA or uAP - - Usage: - mlanutl dot11mc_unassoc_ftm_cfg [enable] - - Where the parameters are: - : mlanX, - uapX - [enable] : 0 - Disable unassociated state FTM - 1 - Enable unassociated state FTM - - Examples: - mlanutl mlan0 dot11mc_unassoc_ftm_cfg - - Get current state of unassociated state FTM cfg - mlanutl mlan0 dot11mc_unassoc_ftm_cfg 1 - - Set the unassociated state FTM cfg to Enabled - -tp_state - This command is used to collect throughput result at different - drop points. - - Usage: - mlanutl mlanX tp_state [mode] [drop_point] - - Where the parameter is: - [mode] : enable/disable tp_state collecting - 0 - Disable 1 - Enable - [drop_point] : Request driver to drop tx packets at this point - 0 - Reserved for Tx - 1 - Kernel sends packets with .ndo_start_xmit - 2 - Before adding tx packets into queues - 3 - After main process handles tx packets - 4 - Before attaching pkts to bus - 5 - Rx PCIE interrupt Recv Data before enqueue to list - 6 - Rx after dequeue from list - 7 - Rx before de-amsdu - 8 - Rx before send to kernel - 9 - Reserved for Rx - Examples: - mlanutl mlan0 tp_state 1 1 Collect throughput result and drop tx pkts at point 1. - mlanutl mlan0 tp_state Get throughput results (only works with enable mode). - mlanutl mlan0 tp_state 0 Disable throughput accounting. - mlanutl mlan0 tp_state 1 0xff Just for reading TX/RX accounting, no pkts drop - -clocksync - This command is used to set and get WIFI TSF based clock sync setting - - Usage: - mlanutl mlanX/uapX clocksync [j][k] [l] [m] [n] - - where - [j] mode - - This parameter use to configure GPIO TSF latch mode - 0: GPIO level - 1: GPIO toggle - 2: GPIO toggle on Next Beacon. - [k] role - - 0: when mode set to 0 or 1 - 1: AP - 2: STA - [l] gpio pin number - [m] GPIO Level/Toggle - mode = 0 - 0: low 1: high - mode = 1 or 2 - 0: low to high - 1: high to low - [n] GPIO pulse width - mode = 0, reserved, set to 0 - mode 1 or 2 - 0: GPIO remain on toggle level (high or low) - Non-0: GPIO pulse width in microseconds (min 1 us) - - If no parameter provided, get is performed. - - Examples: - mlanutl mlan0 clocksync 0 0 5 0 0 - mlanutl mlan0 clocksync 1 0 10 1 500 - mlanutl mlan0 clocksync 1 0 5 0 0 - mlanutl mlan0 clocksync 2 1 10 1 500 - mlanutl mlan0 clocksync 2 2 3 0 0 - mlanutl mlan0 clocksync - -gettsfinfo - This command is used to get TSF info - - Usage: - mlanutl mlanX gettsfinfo [j] - where - [j] format - 0: Report GPIO assert TSF - 1: Report Beacon TSF and Offset (valid if CONFIG Mode 2) - - Examples: - mlanutl mlan0 gettsfinfo Get GPIO assert TSF - mlanutl mlan0 gettsfinfo 1 Get Beacon TSP and Offset (valid if CONFIG mode 2) - -targetchan - This command is used to get/set target channel for UAP - - Usage: - mlanutl uaX targetchan [j] - where - [j] target channel - - Examples: - mlanutl uap0 targetchan Get current target channel - mlanutl uap0 targetchan 52 Set target channel to 52 -backuptchan - This command is used to get/set backup channel for UAP - - Usage: - mlanutl uaX backupchan [j] - where - [j] backup channel - - Examples: - mlanutl uap0 backupchan Get current backup channel - mlanutl uap0 backupchan 52 Set backup channel to 52 - -ips_cfg - This command is used to get/set IPS - - Usage: - mlanutl mlanX ips_cfg [1/0] - - Examples: - mlanutl mlan0 ips_cfg Get current IPS config - mlanutl mlan0 ips_cfg 1 Enable IPS - -mcast_aggr_group - This command is used to add/remove multicast address to mcast_aggr_group. - Also, while the address is set, stats for each of these addresses will be auto-logged. (Refer 'stats' command for more info) - - Usage: - mlanutl mlanX/uapX mcast_aggr_group [action] [mcast_addr] - where - [action] : add/remove multicast mac address to mcast_aggr_group - 0 - remove 1 - add - [mcast_addr] : mcast address - - Examples: - mlanutl uap0 mcast_aggr_group 1 01:00:5e:00:00:42 Add 01:00:5e:00:00:42 to mcast_aggr_group - mlanutl uap0 mcast_aggr_group 0 01:00:5e:00:00:43 Remove 01:00:5e:00:00:43 from mcast_aggr_group - mlanutl uap0 mcast_aggr_group List current mcast_aggr_group - -mc_aggr_cfg - This command gets or sets the configuration of multicast packet aggregation. - - Usage: - mlanutl mlanX/uapX mc_aggr_cfg [i][j] - where - [i]: Enable Bitmap , 1-Enable, 0-Disable - Valid if corresponding mask bit is 1 - Bit 0: MC aggregation - Bit 1: Packet expiry - Bit 2: CTS2Self - Bit 3: CTS2Sef duration offset - [j]: Mask Bitmap, 1-valid, 0-invalid - Bit 0: MC aggregation - Bit 1: Packet expiry - Bit 2: CTS2Self - - Examples: - mlanutl uap0 mc_aggr_cfg 1 1 Enable MC aggregation - mlanutl uap0 mc_aggr_cfg 7 7 Enable MC aggregation,Packet expiry,CTS2Self feature - mlanutl uap0 mc_aggr_cfg Query current MC aggregation configuration. - -mcast_tx - This command is used to transmit multicast packets as per the mcast_tx conf file. - - Usage: - mlanutl mcast_tx - where - : wifi interface name i.e. uap0 - : multicast tx conf file - -stats - This command is used to get/reset Tx-Rx stats for unicast/multicast address. - Usage: - ./mlanutl uapx stats [action] - Where - [action] : get/reset all stats for unicast and multicast addresses. - all: get all stats collection - reset: reset all stats collection - mcast_timeout: get all multicast timeout stats collection - - Examples: - mlanutl uap0 stats all Get all stats for mac address configured using mcast_aggr_group command - mlanutl uap0 stats reset Reset all stats for mac address configured using mcast_aggr_group command - mlanutl uap0 stats mcast_timeout Get all multicast timeout stats for mac address configured using mcast_aggr_group command - -getuuid - This command is used to read 16 byte uuid for a given interface and uuid remains same for - - Usage: - ./mlanutl getuuid - - Examples: - i/p: mlanutl uap0 getuuid - o/p: uuid: a0b0c0d0d0c0b0a0a0b0c0d0d0c0b0a0 - -=============================================================================== -=============================================================================== - U S E R M A N U A L F O R Enable Scan GAP - -Following commands can be used to enable gap between scans. - -mlanutl mlanX scancfg [t] [m] [p] [s] [a] [b] [c] [ext] [gap] -mlanutl mlanX setuserscan [ARGS] - -For detail information, please refer the command description. -=============================================================================== diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11ac.c b/mxm_wifiex/wlan_src/mlan/mlan_11ac.c index 6ced102..298629c 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11ac.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11ac.c @@ -53,97 +53,84 @@ t_u16 wlan_convert_mcsmap_to_maxrate(mlan_private *priv, t_u16 bands, * * @return channel center frequency center, if found; O, otherwise */ - t_u8 wlan_get_center_freq_idx(mlan_private *pmpriv, t_u16 band, t_u32 pri_chan, t_u8 chan_bw) { - t_u8 center_freq_idx = 0; + struct center_freq_desc { + t_u8 pri_chan; + t_u8 ch_40; + t_u8 ch_80; + t_u8 ch_160; + }; - if (band & BAND_AAC) { - switch (pri_chan) { - case 36: - case 40: - case 44: - case 48: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 42; - break; - } - /* fall through */ - case 52: - case 56: - case 60: - case 64: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 58; - break; - } else if (chan_bw == CHANNEL_BW_160MHZ) { - center_freq_idx = 50; - break; - } - /* fall through */ - case 100: - case 104: - case 108: - case 112: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 106; - break; - } - /* fall through */ - case 116: - case 120: - case 124: - case 128: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 122; - break; - } else if (chan_bw == CHANNEL_BW_160MHZ) { - center_freq_idx = 114; - break; - } - /* fall through */ - case 132: - case 136: - case 140: - case 144: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 138; - break; - } - /* fall through */ - case 149: - case 153: - case 157: - case 161: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 155; - break; - } - /* fall through */ - case 165: - case 169: - case 173: - case 177: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 171; - break; - } - /* fall through */ - case 184: - case 188: - case 192: - case 196: - if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 190; - break; - } - /* fall through */ - default: /* error. go to the default */ - center_freq_idx = 42; + static const struct center_freq_desc center_freq_idx_map_5g[] = { + {.pri_chan = 36, .ch_40 = 38, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 40, .ch_40 = 38, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 44, .ch_40 = 46, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 48, .ch_40 = 46, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 52, .ch_40 = 54, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 56, .ch_40 = 54, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 60, .ch_40 = 62, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 64, .ch_40 = 62, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 68, .ch_40 = 70, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 72, .ch_40 = 70, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 76, .ch_40 = 78, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 80, .ch_40 = 78, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 84, .ch_40 = 86, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 88, .ch_40 = 86, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 92, .ch_40 = 94, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 96, .ch_40 = 94, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 100, .ch_40 = 102, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 104, .ch_40 = 102, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 108, .ch_40 = 110, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 112, .ch_40 = 110, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 116, .ch_40 = 118, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 120, .ch_40 = 118, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 124, .ch_40 = 126, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 128, .ch_40 = 126, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 132, .ch_40 = 134, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 136, .ch_40 = 134, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 140, .ch_40 = 142, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 144, .ch_40 = 142, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 149, .ch_40 = 151, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 153, .ch_40 = 151, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 157, .ch_40 = 159, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 161, .ch_40 = 159, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 165, .ch_40 = 167, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 169, .ch_40 = 167, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 173, .ch_40 = 175, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 177, .ch_40 = 175, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 184, .ch_40 = 186, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 188, .ch_40 = 186, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 192, .ch_40 = 194, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 196, .ch_40 = 194, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 0, + .ch_40 = 42 /* terminator with default cfreq */}}; + + const struct center_freq_desc *map = MNULL; + + if (band == BAND_5GHZ) + map = center_freq_idx_map_5g; + + for (; map != MNULL; map++) { + /* reached end of map, return default value for that map */ + if (map->pri_chan == 0) + return map->ch_40; + + if (map->pri_chan == pri_chan) { + if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || + chan_bw == CHANNEL_BW_40MHZ_BELOW) + return map->ch_40; + + if (chan_bw == CHANNEL_BW_80MHZ) + return map->ch_80; + + if (chan_bw == CHANNEL_BW_160MHZ) + return map->ch_160; } } - return center_freq_idx; + + return 0; } /** @@ -227,12 +214,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter, t_u32 cfg_value = 0; t_u32 hw_value = 0; t_u8 nss = 0; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) t_u16 rx_nss = 0; t_u16 tx_nss = 0; -#endif ENTER(); @@ -311,11 +294,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter, /** update the RX MCS map */ if (cfg->param.vht_cfg.txrx & MLAN_RADIO_RX) { -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (cfg->param.vht_cfg.band == BAND_SELECT_A) { rx_nss = GET_RXMCSSUPP( @@ -334,7 +314,6 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter, 0x0f; } } -#endif /* use the previous user value */ if (cfg->param.vht_cfg.vht_rx_mcs == 0xffffffff) cfg->param.vht_cfg.vht_rx_mcs = GET_VHTMCS( @@ -345,12 +324,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter, hw_value = GET_DEVNSSRXMCS( pmadapter->hw_dot_11ac_mcs_support, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((rx_nss != 0) && (nss > rx_nss)) cfg_value = NO_NSS_SUPPORT; -#endif if ((hw_value == NO_NSS_SUPPORT) || (cfg_value == NO_NSS_SUPPORT)) SET_VHTNSSMCS( @@ -373,12 +348,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter, hw_value = GET_DEVNSSTXMCS( pmadapter->hw_dot_11ac_mcs_support, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((tx_nss != 0) && (nss > tx_nss)) cfg_value = NO_NSS_SUPPORT; -#endif if ((hw_value == NO_NSS_SUPPORT) || (cfg_value == NO_NSS_SUPPORT)) SET_VHTNSSMCS( @@ -799,11 +770,7 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap, t_u16 mcs_user = 0; t_u16 mcs_resp = 0; t_u16 nss; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) t_u16 rx_nss = 0, tx_nss = 0; -#endif ENTER(); /* Fill VHT cap info */ @@ -821,11 +788,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap, if (flag) mcs_map_resp = wlan_le16_to_cpu(pvht_cap->vht_cap.mcs_sets.rx_mcs_map); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(priv->adapter->card_type) || - IS_CARDNW62X(priv->adapter->card_type) || + IS_CARDIW62X(priv->adapter->card_type) || IS_CARD9097(priv->adapter->card_type)) { if (bands & BAND_A) { rx_nss = GET_RXMCSSUPP(priv->adapter->user_htstream >> @@ -842,17 +806,12 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap, if (bw_80p80) rx_nss = tx_nss = 1; } -#endif mcs_map_result = 0; for (nss = 1; nss <= 8; nss++) { mcs_user = GET_VHTNSSMCS(mcs_map_user, nss); mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((rx_nss != 0) && (nss > rx_nss)) mcs_user = NO_NSS_SUPPORT; -#endif if ((mcs_user == NO_NSS_SUPPORT) || (mcs_resp == NO_NSS_SUPPORT)) SET_VHTNSSMCS(mcs_map_result, nss, NO_NSS_SUPPORT); @@ -880,12 +839,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap, for (nss = 1; nss <= 8; nss++) { mcs_user = GET_VHTNSSMCS(mcs_map_user, nss); mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((tx_nss != 0) && (nss > tx_nss)) mcs_user = NO_NSS_SUPPORT; -#endif if ((mcs_user == NO_NSS_SUPPORT) || (mcs_resp == NO_NSS_SUPPORT)) SET_VHTNSSMCS(mcs_map_result, nss, NO_NSS_SUPPORT); @@ -1080,7 +1035,7 @@ void wlan_fill_tdls_vht_oprat_ie(mlan_private *priv, break; } vht_oprat->chan_center_freq_1 = wlan_get_center_freq_idx( - priv, BAND_AAC, pbss_desc->channel, chan_bw); + priv, BAND_5GHZ, pbss_desc->channel, chan_bw); LEAVE(); return; @@ -1097,22 +1052,15 @@ void wlan_fill_tdls_vht_oprat_ie(mlan_private *priv, t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc) { t_u8 ret = MFALSE; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) t_u16 rx_nss = 0, tx_nss = 0; IEEEtypes_VHTCap_t *pvht_cap = pbss_desc->pvht_cap; MrvlIEtypes_He_cap_t *phecap = MNULL; IEEEtypes_HECap_t *pBsshecap = MNULL; -#endif ENTER(); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (!IS_CARD9098(pmpriv->adapter->card_type) && - !IS_CARDNW62X(pmpriv->adapter->card_type) && + !IS_CARDIW62X(pmpriv->adapter->card_type) && !IS_CARD9097(pmpriv->adapter->card_type)) return ret; /** check band A */ @@ -1139,7 +1087,6 @@ t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc) else ret = MFALSE; } -#endif LEAVE(); return ret; } @@ -1163,11 +1110,7 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, t_u16 nss; int ret_len = 0; t_u8 bw_80p80 = MFALSE; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) t_u16 rx_nss = 0; -#endif ENTER(); @@ -1235,11 +1178,8 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, } else { /** set default bandwidth:80M*/ SET_OPER_MODE_80M(pmrvl_oper_mode->oper_mode); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (pbss_desc->bss_band & BAND_A) rx_nss = GET_RXMCSSUPP( @@ -1248,21 +1188,16 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, rx_nss = GET_RXMCSSUPP(pmadapter->user_htstream); } -#endif mcs_map_user = GET_DEVRXMCSMAP(pmpriv->usr_dot_11ac_mcs_support); nss = wlan_get_nss_num_vht_mcs(mcs_map_user); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { PRINTM(MCMND, "rx_nss=%d nss=%d\n", rx_nss, nss); nss = MIN(rx_nss, nss); } -#endif pmrvl_oper_mode->oper_mode |= (nss - 1) << 4; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11ax.c b/mxm_wifiex/wlan_src/mlan/mlan_11ax.c index 38b903d..4599535 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11ax.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11ax.c @@ -295,11 +295,7 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band, { pmlan_adapter pmadapter = pmpriv->adapter; t_u16 len = 0; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) t_u16 rx_nss = 0, tx_nss = 0; -#endif MrvlIEtypes_He_cap_t *phecap = MNULL; t_u8 nss = 0; t_u16 cfg_value = 0; @@ -325,9 +321,6 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band, } phe_cap->type = wlan_cpu_to_le16(phe_cap->type); phe_cap->len = wlan_cpu_to_le16(phe_cap->len); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type)) { if (band & BAND_AAX) { @@ -342,17 +335,12 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band, 0x0f; } } -#endif phecap = (MrvlIEtypes_He_cap_t *)phe_cap; for (nss = 1; nss <= 8; nss++) { cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((rx_nss != 0) && (nss > rx_nss)) cfg_value = NO_NSS_SUPPORT; -#endif if ((hw_value == NO_NSS_SUPPORT) || (cfg_value == NO_NSS_SUPPORT)) SET_HE_NSSMCS(phecap->rx_mcs_80, nss, NO_NSS_SUPPORT); @@ -363,12 +351,8 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band, for (nss = 1; nss <= 8; nss++) { cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((tx_nss != 0) && (nss > tx_nss)) cfg_value = NO_NSS_SUPPORT; -#endif if ((hw_value == NO_NSS_SUPPORT) || (cfg_value == NO_NSS_SUPPORT)) SET_HE_NSSMCS(phecap->tx_mcs_80, nss, NO_NSS_SUPPORT); @@ -400,11 +384,7 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, MrvlIEtypes_He_cap_t *phecap = MNULL; int len = 0; t_u8 bw_80p80 = MFALSE; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) t_u16 rx_nss = 0, tx_nss = 0; -#endif t_u8 nss = 0; t_u16 cfg_value = 0; t_u16 hw_value = 0; @@ -445,11 +425,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, } phecap->type = wlan_cpu_to_le16(phecap->type); phecap->len = wlan_cpu_to_le16(phecap->len); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmpriv->adapter->card_type) || - IS_CARDNW62X(pmpriv->adapter->card_type) || + IS_CARDIW62X(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type)) { if (pbss_desc->bss_band & band_selected) { rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >> @@ -466,16 +443,11 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, if (bw_80p80) rx_nss = tx_nss = 1; } -#endif for (nss = 1; nss <= 8; nss++) { cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((rx_nss != 0) && (nss > rx_nss)) cfg_value = NO_NSS_SUPPORT; -#endif if ((hw_value == NO_NSS_SUPPORT) || (cfg_value == NO_NSS_SUPPORT)) SET_HE_NSSMCS(phecap->rx_mcs_80, nss, NO_NSS_SUPPORT); @@ -486,12 +458,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, for (nss = 1; nss <= 8; nss++) { cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if ((tx_nss != 0) && (nss > tx_nss)) cfg_value = NO_NSS_SUPPORT; -#endif if ((hw_value == NO_NSS_SUPPORT) || (cfg_value == NO_NSS_SUPPORT)) SET_HE_NSSMCS(phecap->tx_mcs_80, nss, NO_NSS_SUPPORT); @@ -1071,6 +1039,7 @@ mlan_status wlan_cmd_twt_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, mlan_ds_twtcfg *ds_twtcfg = (mlan_ds_twtcfg *)pdata_buf; hostcmd_twt_setup *twt_setup_params = MNULL; hostcmd_twt_teardown *twt_teardown_params = MNULL; + hostcmd_twt_report *twt_report_params = MNULL; mlan_status ret = MLAN_STATUS_SUCCESS; ENTER(); @@ -1123,6 +1092,13 @@ mlan_status wlan_cmd_twt_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, ds_twtcfg->param.twt_teardown.teardown_all_twt; cmd->size += sizeof(hostcmd_twtcfg->param.twt_teardown); break; + case MLAN_11AX_TWT_REPORT_SUBID: + twt_report_params = &hostcmd_twtcfg->param.twt_report; + memset(pmpriv->adapter, twt_report_params, 0x00, + sizeof(hostcmd_twtcfg->param.twt_report)); + twt_report_params->type = ds_twtcfg->param.twt_report.type; + cmd->size += sizeof(hostcmd_twtcfg->param.twt_report); + break; default: PRINTM(MERROR, "Unknown subcmd %x\n", ds_twtcfg->sub_id); ret = MLAN_STATUS_FAILURE; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11h.c b/mxm_wifiex/wlan_src/mlan/mlan_11h.c index ce3b024..f5d8ea6 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11h.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11h.c @@ -279,7 +279,7 @@ t_void wlan_11h_set_chan_dfs_state(mlan_private *priv, t_u8 chan, t_u8 bw, dfs_state_t dfs_state) { t_u8 n_chan; - t_u8 chan_list[4]; + t_u8 chan_list[4] = {0}; t_u8 i; n_chan = woal_get_bonded_channels(chan, bw, chan_list); for (i = 0; i < n_chan; i++) @@ -1369,14 +1369,12 @@ wlan_11h_prepare_custom_ie_chansw(mlan_adapter *pmadapter, sizeof(mlan_ioctl_req)); /* prepare mlan_ioctl_req */ - memset(pmadapter, pioctl_req, 0x00, sizeof(mlan_ioctl_req)); pioctl_req->req_id = MLAN_IOCTL_MISC_CFG; pioctl_req->action = MLAN_ACT_SET; pioctl_req->pbuf = (t_u8 *)pds_misc_cfg; pioctl_req->buf_len = sizeof(mlan_ds_misc_cfg); /* prepare mlan_ds_misc_cfg */ - memset(pmadapter, pds_misc_cfg, 0x00, sizeof(mlan_ds_misc_cfg)); pds_misc_cfg->sub_command = MLAN_OID_MISC_CUSTOM_IE; pds_misc_cfg->param.cust_ie.type = TLV_TYPE_MGMT_IE; pds_misc_cfg->param.cust_ie.len = (sizeof(custom_ie) - MAX_IE_SIZE); @@ -1731,9 +1729,6 @@ static mlan_status wlan_11h_add_dfs_timestamp(mlan_adapter *pmadapter, return MLAN_STATUS_FAILURE; } - memset(pmadapter, (t_u8 *)pdfs_ts, 0, - sizeof(wlan_dfs_timestamp_t)); - util_enqueue_list_tail(pmadapter->pmoal_handle, &pmadapter->state_dfs.dfs_ts_head, (pmlan_linked_list)pdfs_ts, MNULL, @@ -1772,7 +1767,7 @@ static void wlan_11h_add_all_dfs_timestamp(mlan_adapter *pmadapter, t_u8 repr, t_u8 channel, t_u8 bandwidth) { t_u8 n_chan; - t_u8 chan_list[4]; + t_u8 chan_list[4] = {0}; t_u8 i; n_chan = woal_get_bonded_channels(channel, bandwidth, chan_list); for (i = 0; i < n_chan; i++) @@ -2764,8 +2759,9 @@ t_s32 wlan_11h_process_start(mlan_private *priv, t_u8 **ppbuffer, return ret; } #ifdef STA_SUPPORT - wlan_11d_create_dnld_countryinfo( - priv, adapter->adhoc_start_band); + if (wlan_11d_create_dnld_countryinfo( + priv, adapter->adhoc_start_band)) + PRINTM(MERROR, "Dnld_countryinfo_11d failed\n"); #endif } @@ -3421,7 +3417,10 @@ mlan_status wlan_11h_ioctl_channel_nop_info(pmlan_adapter pmadapter, if (ch_nop_info->chan_width == CHAN_BW_80MHZ) ch_nop_info->new_chan.center_chan = wlan_get_center_freq_idx( - pmpriv, BAND_AAC, + pmpriv, + ch_nop_info->new_chan + .bandcfg + .chanBand, ch_nop_info->new_chan .channel, ch_nop_info->chan_width); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11n.c b/mxm_wifiex/wlan_src/mlan/mlan_11n.c index 473f5c4..ce5e49b 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11n.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11n.c @@ -1526,14 +1526,12 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap, /* Set ampdu param */ SETAMPDU_SIZE(pht_cap->ht_cap.ampdu_param, AMPDU_FACTOR_64K); - SETAMPDU_SPACING(pht_cap->ht_cap.ampdu_param, 0); + SETAMPDU_SPACING(pht_cap->ht_cap.ampdu_param, + pmadapter->hw_mpdu_density); rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (bands & BAND_A) rx_mcs_supp = MIN( @@ -1544,7 +1542,6 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap, MIN(rx_mcs_supp, GET_RXMCSSUPP(pmadapter->user_htstream)); } -#endif memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff, rx_mcs_supp); /* Clear all the other values to get the minimum mcs set btw STA and AP @@ -1606,11 +1603,8 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap, SETAMPDU_SPACING(pht_cap->ht_cap.ampdu_param, 0); rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (bands & BAND_A) rx_mcs_supp = MIN( @@ -1621,7 +1615,6 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap, MIN(rx_mcs_supp, GET_RXMCSSUPP(pmadapter->user_htstream)); } -#endif memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff, rx_mcs_supp); /* Clear all the other values to get the minimum mcs set btw STA and AP diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11n_aggr.c b/mxm_wifiex/wlan_src/mlan/mlan_11n_aggr.c index 53e8543..1151166 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11n_aggr.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11n_aggr.c @@ -120,8 +120,6 @@ static void wlan_11n_form_amsdu_txpd(mlan_private *priv, mlan_buffer *mbuf) * Original priority has been overwritten */ ptx_pd->priority = (t_u8)mbuf->priority; - ptx_pd->pkt_delay_2ms = - wlan_wmm_compute_driver_packet_delay(priv, mbuf); ptx_pd->bss_num = GET_BSS_NUM(priv); ptx_pd->bss_type = priv->bss_type; /* Always zero as the data is followed by TxPD */ @@ -156,6 +154,9 @@ static INLINE void wlan_11n_update_pktlen_amsdu_txpd(mlan_private *priv, ptx_pd = (TxPD *)mbuf->pbuf; ptx_pd->tx_pkt_length = (t_u16)wlan_cpu_to_le16(mbuf->data_len - sizeof(TxPD)); + ptx_pd->pkt_delay_2ms = + wlan_wmm_compute_driver_packet_delay(priv, mbuf); + #ifdef STA_SUPPORT if ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) && (priv->adapter->pps_uapsd_mode)) { @@ -494,6 +495,8 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list, pmbuf_aggr->data_offset = 0; pmbuf_aggr->in_ts_sec = pmbuf_src->in_ts_sec; pmbuf_aggr->in_ts_usec = pmbuf_src->in_ts_usec; + pmbuf_aggr->extra_ts_sec = pmbuf_src->extra_ts_sec; + pmbuf_aggr->extra_ts_usec = pmbuf_src->extra_ts_usec; if (pmbuf_src->flags & MLAN_BUF_FLAG_TDLS) pmbuf_aggr->flags |= MLAN_BUF_FLAG_TDLS; if (pmbuf_src->flags & MLAN_BUF_FLAG_TCP_ACK) @@ -522,7 +525,7 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list, /* Collects TP statistics */ if (pmadapter->tp_state_on && (pkt_size > sizeof(TxPD))) pmadapter->callbacks.moal_tp_accounting( - pmadapter->pmoal_handle, pmbuf_src->pdesc, 3); + pmadapter->pmoal_handle, pmbuf_src, 3); pra_list->total_pkts--; /* decrement for every PDU taken from the list */ @@ -670,5 +673,5 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list, exit: LEAVE(); - return pkt_size + headroom; + return MIN((pkt_size + headroom), INT_MAX); } diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c b/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c index 27b94bf..023700e 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c @@ -134,13 +134,14 @@ static mlan_status wlan_11n_dispatch_pkt(t_void *priv, t_void *payload, static void mlan_11n_rxreorder_timer_restart(pmlan_adapter pmadapter, RxReorderTbl *rx_reor_tbl_ptr) { - t_u16 min_flush_time = 0; + t_u16 min_flush_time = DEF_FLUSH_TIME_AC_BE_BK; + mlan_wmm_ac_e wmm_ac; ENTER(); - if (rx_reor_tbl_ptr->win_size >= 32) - min_flush_time = MIN_FLUSH_TIMER_15_MS; - else - min_flush_time = MIN_FLUSH_TIMER_MS; + wmm_ac = wlan_wmm_convert_tos_to_ac(pmadapter, rx_reor_tbl_ptr->tid); + if ((WMM_AC_VI == wmm_ac) || (WMM_AC_VO == wmm_ac)) { + min_flush_time = DEF_FLUSH_TIME_AC_VI_VO; + } if (rx_reor_tbl_ptr->timer_context.timer_is_set) pmadapter->callbacks.moal_stop_timer( @@ -149,7 +150,7 @@ static void mlan_11n_rxreorder_timer_restart(pmlan_adapter pmadapter, pmadapter->callbacks.moal_start_timer( pmadapter->pmoal_handle, rx_reor_tbl_ptr->timer_context.timer, - MFALSE, (rx_reor_tbl_ptr->win_size * min_flush_time)); + MFALSE, min_flush_time); rx_reor_tbl_ptr->timer_context.timer_is_set = MTRUE; LEAVE(); @@ -168,7 +169,7 @@ static void mlan_11n_rxreorder_timer_restart(pmlan_adapter pmadapter, static mlan_status wlan_11n_dispatch_pkt_until_start_win( t_void *priv, RxReorderTbl *rx_reor_tbl_ptr, int start_win) { - int no_pkt_to_send, i, xchg; + t_u32 no_pkt_to_send, i, xchg; mlan_status ret = MLAN_STATUS_SUCCESS; void *rx_tmp_ptr = MNULL; mlan_private *pmpriv = (mlan_private *)priv; @@ -208,6 +209,9 @@ static mlan_status wlan_11n_dispatch_pkt_until_start_win( rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i] = MNULL; } + /* clear the bits of reorder bitmap that has been dispatched */ + rx_reor_tbl_ptr->bitmap = rx_reor_tbl_ptr->bitmap >> no_pkt_to_send; + rx_reor_tbl_ptr->start_win = start_win; pmpriv->adapter->callbacks.moal_spin_unlock( pmpriv->adapter->pmoal_handle, pmpriv->rx_pkt_lock); @@ -286,6 +290,9 @@ static mlan_status wlan_11n_scan_and_dispatch(t_void *priv, } } + /* clear the bits of reorder bitmap that has been dispatched */ + rx_reor_tbl_ptr->bitmap = rx_reor_tbl_ptr->bitmap >> i; + rx_reor_tbl_ptr->start_win = (rx_reor_tbl_ptr->start_win + i) & (MAX_TID_VALUE - 1); @@ -517,6 +524,8 @@ static t_void wlan_11n_create_rxreorder_tbl(mlan_private *priv, t_u8 *ta, new_node->win_size = win_size; new_node->force_no_drop = MFALSE; new_node->check_start_win = MTRUE; + new_node->bitmap = 0; + new_node->ba_status = BA_STREAM_SETUP_INPROGRESS; for (i = 0; i < win_size; ++i) new_node->rx_reorder_ptr[i] = MNULL; @@ -640,7 +649,7 @@ mlan_status wlan_cmd_11n_addba_rspgen(mlan_private *priv, HostCmd_DS_11N_ADDBA_REQ *pevt_addba_req = (HostCmd_DS_11N_ADDBA_REQ *)pdata_buf; t_u8 tid = 0; - int win_size = 0; + t_u32 win_size = 0; ENTER(); @@ -685,21 +694,26 @@ mlan_status wlan_cmd_11n_addba_rspgen(mlan_private *priv, else padd_ba_rsp->status_code = wlan_cpu_to_le16(ADDBA_RSP_STATUS_ACCEPT); + + win_size = (padd_ba_rsp->block_ack_param_set & + BLOCKACKPARAM_WINSIZE_MASK) >> + BLOCKACKPARAM_WINSIZE_POS; + padd_ba_rsp->block_ack_param_set &= ~BLOCKACKPARAM_WINSIZE_MASK; if (!priv->add_ba_param.rx_amsdu) /* We do not support AMSDU inside AMPDU, hence reset the bit */ padd_ba_rsp->block_ack_param_set &= ~BLOCKACKPARAM_AMSDU_SUPP_MASK; - padd_ba_rsp->block_ack_param_set |= - (priv->add_ba_param.rx_win_size << BLOCKACKPARAM_WINSIZE_POS); - win_size = (padd_ba_rsp->block_ack_param_set & - BLOCKACKPARAM_WINSIZE_MASK) >> - BLOCKACKPARAM_WINSIZE_POS; + /*cert failure observed due to BA setup failure + if win_size requested from client is 0 */ + if (win_size) + win_size = MIN(win_size, priv->add_ba_param.rx_win_size); + else + win_size = priv->add_ba_param.rx_win_size; - if (win_size == 0) - padd_ba_rsp->status_code = - wlan_cpu_to_le16(ADDBA_RSP_STATUS_DECLINED); + padd_ba_rsp->block_ack_param_set |= win_size + << BLOCKACKPARAM_WINSIZE_POS; padd_ba_rsp->block_ack_param_set = wlan_cpu_to_le16(padd_ba_rsp->block_ack_param_set); @@ -960,6 +974,8 @@ mlan_status mlan_11n_rxreorder_pkt(void *priv, t_u16 seq_num, t_u16 tid, rx_reor_tbl_ptr ->rx_reorder_ptr[seq_num - start_win] = payload; + MLAN_SET_BIT(rx_reor_tbl_ptr->bitmap, + seq_num - start_win); } else { /* Wrap condition */ if (rx_reor_tbl_ptr ->rx_reorder_ptr[(seq_num + @@ -973,6 +989,9 @@ mlan_status mlan_11n_rxreorder_pkt(void *priv, t_u16 seq_num, t_u16 tid, ->rx_reorder_ptr[(seq_num + (MAX_TID_VALUE)) - start_win] = payload; + MLAN_SET_BIT(rx_reor_tbl_ptr->bitmap, + (seq_num + (MAX_TID_VALUE)) - + start_win); } } @@ -988,11 +1007,20 @@ mlan_status mlan_11n_rxreorder_pkt(void *priv, t_u16 seq_num, t_u16 tid, } done: - if (!rx_reor_tbl_ptr->timer_context.timer_is_set || - (prev_start_win != rx_reor_tbl_ptr->start_win)) { - mlan_11n_rxreorder_timer_restart(pmadapter, rx_reor_tbl_ptr); + if (rx_reor_tbl_ptr->bitmap == 0) { + if (rx_reor_tbl_ptr->timer_context.timer_is_set) { + pmadapter->callbacks.moal_stop_timer( + pmadapter->pmoal_handle, + rx_reor_tbl_ptr->timer_context.timer); + rx_reor_tbl_ptr->timer_context.timer_is_set = MFALSE; + } + } else { + if (!rx_reor_tbl_ptr->timer_context.timer_is_set || + (prev_start_win != rx_reor_tbl_ptr->start_win)) { + mlan_11n_rxreorder_timer_restart(pmadapter, + rx_reor_tbl_ptr); + } } - LEAVE(); return ret; } diff --git a/mxm_wifiex/wlan_src/mlan/mlan_cfp.c b/mxm_wifiex/wlan_src/mlan/mlan_cfp.c index f981114..e9be852 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_cfp.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_cfp.c @@ -5,7 +5,7 @@ * related code * * - * Copyright 2009-2022 NXP + * Copyright 2009-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -32,6 +32,7 @@ #include "mlan_fw.h" #include "mlan_join.h" #include "mlan_main.h" +#include "mlan_11h.h" /******************************************************** * Local Variables @@ -87,7 +88,7 @@ static country_code_mapping_t country_code_mapping[] = { {"IN", 0x10, 0x06}, /* India */ {"MY", 0x30, 0x06}, /* Malaysia */ {"NZ", 0x30, 0x30}, /* New Zeland */ - {"MX", 0x10, 0x07}, /* Mexico */ + {"MX", 0x30, 0x07}, /* Mexico */ }; /** Country code for ETSI */ @@ -2458,11 +2459,12 @@ static oper_bw_chan *wlan_get_nonglobal_operclass_table(mlan_private *pmpriv, * @param pmpriv A pointer to mlan_private structure * @param channel Channel number * @param oper_class operating class + * @param bandwidth band width * * @return MLAN_STATUS_PENDING --success, otherwise fail */ mlan_status wlan_check_operclass_validation(mlan_private *pmpriv, t_u8 channel, - t_u8 oper_class) + t_u8 oper_class, t_u8 bandwidth) { int arraysize = 0, i = 0, channum = 0; oper_bw_chan *poper_bw_chan = MNULL; @@ -2485,7 +2487,7 @@ mlan_status wlan_check_operclass_validation(mlan_private *pmpriv, t_u8 channel, } if (oper_class >= 128) { center_freq_idx = wlan_get_center_freq_idx( - pmpriv, BAND_AAC, channel, CHANNEL_BW_80MHZ); + pmpriv, BAND_5GHZ, channel, CHANNEL_BW_80MHZ); channel = center_freq_idx; } poper_bw_chan = wlan_get_nonglobal_operclass_table(pmpriv, &arraysize); @@ -2555,7 +2557,7 @@ mlan_status wlan_get_curr_oper_class(mlan_private *pmpriv, t_u8 channel, } if (bw == BW_80MHZ) { center_freq_idx = wlan_get_center_freq_idx( - pmpriv, BAND_AAC, channel, CHANNEL_BW_80MHZ); + pmpriv, BAND_5GHZ, channel, CHANNEL_BW_80MHZ); channel = center_freq_idx; } @@ -2593,14 +2595,16 @@ mlan_status wlan_get_curr_oper_class(mlan_private *pmpriv, t_u8 channel, int wlan_add_supported_oper_class_ie(mlan_private *pmpriv, t_u8 **pptlv_out, t_u8 curr_oper_class) { - t_u8 oper_class_us[] = {1, 2, 3, 4, 5, 12, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 128, 129, 130}; - t_u8 oper_class_eu[] = {1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 17, 128, 129, 130}; - t_u8 oper_class_jp[] = {1, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, - 45, 56, 57, 58, 128, 129, 130}; - t_u8 oper_class_cn[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 129, 130}; + t_u8 oper_class_us[] = {115, 118, 124, 121, 125, 81, 116, + 119, 122, 126, 126, 117, 120, 123, + 127, 127, 83, 84, 128, 129, 130}; + t_u8 oper_class_eu[] = {115, 118, 121, 81, 116, 119, 122, 117, + 120, 123, 83, 84, 125, 128, 129, 130}; + t_u8 oper_class_jp[] = {115, 81, 82, 118, 118, 121, 121, 116, + 119, 119, 122, 122, 117, 120, 120, 123, + 123, 83, 84, 121, 128, 129, 130}; + t_u8 oper_class_cn[] = {115, 118, 125, 116, 119, 126, + 81, 83, 84, 128, 129, 130}; t_u8 country_code[][COUNTRY_CODE_LEN] = {"US", "JP", "CN"}; int country_id = 0, ret = 0; MrvlIETypes_SuppOperClass_t *poper_class = MNULL; @@ -2710,11 +2714,12 @@ mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u16 band) if ((j < MAX_REGION_CHANNEL_NUM) && (region_chan_old[j].valid == MTRUE)) { - wlan_cfp_copy_dynamic(pmadapter, cfp, cfp_no, + wlan_cfp_copy_dynamic(pmadapter, cfp, (t_u8)cfp_no, region_chan_old[j].pcfp, region_chan_old[j].num_cfp); } else if (cfp) { - wlan_cfp_copy_dynamic(pmadapter, cfp, cfp_no, MNULL, 0); + wlan_cfp_copy_dynamic(pmadapter, cfp, (t_u8)cfp_no, + MNULL, 0); } i++; } @@ -2742,11 +2747,12 @@ mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u16 band) break; } if ((j < MAX_REGION_CHANNEL_NUM) && region_chan_old[j].valid) { - wlan_cfp_copy_dynamic(pmadapter, cfp, cfp_no, + wlan_cfp_copy_dynamic(pmadapter, cfp, (t_u8)cfp_no, region_chan_old[j].pcfp, region_chan_old[j].num_cfp); } else if (cfp) { - wlan_cfp_copy_dynamic(pmadapter, cfp, cfp_no, MNULL, 0); + wlan_cfp_copy_dynamic(pmadapter, cfp, (t_u8)cfp_no, + MNULL, 0); } i++; } @@ -3699,6 +3705,13 @@ mlan_status wlan_get_cfpinfo(pmlan_adapter pmadapter, ret = MLAN_STATUS_FAILURE; goto out; } + ret = wlan_11h_ioctl_nop_channel_list(pmadapter, pioctl_req); + if (ret) { + PRINTM(MERROR, + "cfpinfo wlan_11h_ioctl_nop_channel_list failed!\n"); + ret = MLAN_STATUS_FAILURE; + goto out; + } /* Calculate the total response size required to return region, * country codes, cfp tables and power tables */ diff --git a/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c b/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c index 8755c4b..499f7bc 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c @@ -403,9 +403,13 @@ static t_void wlan_dump_info(mlan_adapter *pmadapter, t_u8 reason) pcmd_buf = pcmd_node->cmdbuf->pbuf + pcmd_node->cmdbuf->data_offset + pmadapter->ops.intf_header_len; - for (i = 0; i < 16; i++) - PRINTM(MERROR, "%02x ", *pcmd_buf++); - PRINTM(MERROR, "\n"); + if ((pmadapter->ops.intf_header_len + 16) > + pcmd_node->cmdbuf->data_len) { + for (i = 0; i < 16; i++) + PRINTM(MERROR, "%02x ", + *pcmd_buf++); + PRINTM(MERROR, "\n"); + } } #endif pmpriv = pcmd_node->priv; @@ -1489,12 +1493,18 @@ static mlan_status wlan_dnld_sleep_confirm_cmd(mlan_adapter *pmadapter) } #endif /* STA_SUPPORT */ - PRINTM_NETINTF(MEVENT, pmpriv); #define NUM_SC_PER_LINE 16 - if (++i % NUM_SC_PER_LINE == 0) - PRINTM(MEVENT, "+\n"); - else - PRINTM(MEVENT, "+"); + if (++i % NUM_SC_PER_LINE == 0) { + if (pmadapter->second_mac) + PRINTM(MEVENT, "++\n"); + else + PRINTM(MEVENT, "+\n"); + } else { + if (pmadapter->second_mac) + PRINTM(MEVENT, "++"); + else + PRINTM(MEVENT, "+"); + } } done: @@ -1597,7 +1607,6 @@ mlan_status wlan_alloc_cmd_buffer(mlan_adapter *pmadapter) } pmadapter->cmd_pool = pcmd_array; - memset(pmadapter, pmadapter->cmd_pool, 0, buf_size); #if defined(PCIE) || defined(SDIO) if (!IS_USB(pmadapter->card_type)) { @@ -2310,9 +2319,7 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter) if (IS_PCIE(pmadapter->card_type) && cmdresp_no == HostCmd_CMD_FUNC_SHUTDOWN && pmadapter->pwarm_reset_ioctl_req) { -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) -#endif wlan_pcie_init_fw(pmadapter); } #endif @@ -2435,9 +2442,12 @@ t_void wlan_cmd_timeout_func(t_void *function_context) pcmd_buf = pcmd_node->cmdbuf->pbuf + pcmd_node->cmdbuf->data_offset + pmadapter->ops.intf_header_len; - for (i = 0; i < 16; i++) - PRINTM(MERROR, "%02x ", *pcmd_buf++); - PRINTM(MERROR, "\n"); + if ((pmadapter->ops.intf_header_len + 16) < + pcmd_node->cmdbuf->data_len) { + for (i = 0; i < 16; i++) + PRINTM(MERROR, "%02x ", *pcmd_buf++); + PRINTM(MERROR, "\n"); + } } #endif #ifdef PCIE @@ -2892,6 +2902,466 @@ t_void wlan_fill_hal_wifi_rate(pmlan_private pmpriv, mlan_wifi_rate *pmlan_rate, LEAVE(); } +/** + * @brief This function prepares command of ftm config session params. + * + * @param pmpriv A pointer to mlan_private structure + * @param cmd A pointer to HostCmd_DS_COMMAND structure + * @param cmd_action The action: GET or SET + * @param cmd_oid OID: CONFIG or CANCEL + * @param pdata_buf A pointer to data buffer + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_cmd_802_11_ftm_config_session_params(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, + t_u32 cmd_oid, + t_void *pdata_buf) +{ + HostCmd_DS_FTM_CONFIG_SESSION_PARAMS *ftm_config = + &cmd->params.ftm_config; + t_u8 *tlv = MNULL; + mlan_rtt_config_params *rtt_params = MNULL; + MrvlIEtypes_RTTRangeRequest_t *tlv_rtt_rr = MNULL; + mlan_rtt_cancel_params *rtt_cancel = MNULL; + MrvlIEtypes_RTTRangeCancel_t *tlv_rtt_rc = MNULL; + t_u32 i = 0; + + ENTER(); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS); + cmd->size = S_DS_GEN + sizeof(HostCmd_DS_FTM_CONFIG_SESSION_PARAMS); + + ftm_config->action = wlan_cpu_to_le16(HostCmd_ACT_GEN_SET); + tlv = ftm_config->tlv_buffer; + + if (cmd_oid == OID_RTT_REQUEST) { + rtt_params = (mlan_rtt_config_params *)pdata_buf; + for (i = 0; i < rtt_params->rtt_config_num; i++) { + tlv_rtt_rr = (MrvlIEtypes_RTTRangeRequest_t *)tlv; + tlv_rtt_rr->header.type = + wlan_cpu_to_le16(TLV_TYPE_RTT_RANGE_REQUEST); + tlv_rtt_rr->header.len = + wlan_cpu_to_le16((sizeof(*tlv_rtt_rr) - + sizeof(MrvlIEtypesHeader_t))); + memcpy_ext(pmpriv->adapter, tlv_rtt_rr->addr, + rtt_params->rtt_config[i].addr, + sizeof(rtt_params->rtt_config[i].addr), + sizeof(tlv_rtt_rr->addr)); + tlv_rtt_rr->type = rtt_params->rtt_config[i].type; + tlv_rtt_rr->peer = rtt_params->rtt_config[i].peer; + tlv_rtt_rr->channel = rtt_params->rtt_config[i].channel; + tlv_rtt_rr->bandcfg = rtt_params->rtt_config[i].bandcfg; + tlv_rtt_rr->burst_period = + rtt_params->rtt_config[i].burst_period; + tlv_rtt_rr->num_burst = + rtt_params->rtt_config[i].num_burst; + tlv_rtt_rr->num_frames_per_burst = + rtt_params->rtt_config[i].num_frames_per_burst; + tlv_rtt_rr->num_retries_per_rtt_frame = + rtt_params->rtt_config[i] + .num_retries_per_rtt_frame; + tlv_rtt_rr->num_retries_per_ftmr = + rtt_params->rtt_config[i].num_retries_per_ftmr; + tlv_rtt_rr->LCI_request = + rtt_params->rtt_config[i].LCI_request; + tlv_rtt_rr->LCR_request = + rtt_params->rtt_config[i].LCR_request; + tlv_rtt_rr->burst_duration = + rtt_params->rtt_config[i].burst_duration; + tlv_rtt_rr->preamble = + rtt_params->rtt_config[i].preamble; + tlv_rtt_rr->bw = rtt_params->rtt_config[i].bw; + cmd->size += sizeof(*tlv_rtt_rr); + tlv += sizeof(*tlv_rtt_rr); + } + } else if (cmd_oid == OID_RTT_CANCEL) { + rtt_cancel = (mlan_rtt_cancel_params *)pdata_buf; + for (i = 0; i < rtt_cancel->rtt_cancel_num; i++) { + tlv_rtt_rc = (MrvlIEtypes_RTTRangeCancel_t *)tlv; + tlv_rtt_rc->header.type = + wlan_cpu_to_le16(TLV_TYPE_RTT_RANGE_CANCEL); + tlv_rtt_rc->header.len = + wlan_cpu_to_le16(sizeof(*tlv_rtt_rc) - + sizeof(MrvlIEtypesHeader_t)); + memcpy_ext(pmpriv->adapter, tlv_rtt_rc->addr, + rtt_cancel->rtt_cancel[i], + sizeof(rtt_cancel->rtt_cancel[i]), + sizeof(tlv_rtt_rc->addr)); + cmd->size += sizeof(*tlv_rtt_rc); + tlv += sizeof(*tlv_rtt_rc); + } + } else { + LEAVE(); + return MLAN_STATUS_FAILURE; + } + + cmd->size = wlan_cpu_to_le16(cmd->size); + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function handles the command response of ftm config session + * params. + * + * @param pmpriv A pointer to mlan_private structure + * @param resp A pointer to HostCmd_DS_COMMAND + * @param pioctl_buf A pointer to mlan_ioctl_req structure + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status +wlan_ret_802_11_ftm_config_session_params(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + ENTER(); + + PRINTM(MCMND, "ftm config successfully\n"); + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function transform Event_WLS_FTM_t to wifi_rtt_result in + * mlan_event. + * + * @param pmpriv A pointer to mlan_private structure + * @param event_ftm A pointer to Event_WLS_FTM_t + * @param event_ftm_len length of event_ftm + * @param pevent A pointer to mlan_event + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_fill_hal_rtt_results(pmlan_private pmpriv, + Event_WLS_FTM_t *event_ftm, + t_u32 event_ftm_len, mlan_event *pevent) +{ + /** For input buffer Event_WLS_FTM_t */ + t_u8 *tlv = event_ftm->u.rtt_results.tlv_buffer; + int event_left_len = event_ftm_len - (tlv - (t_u8 *)event_ftm); + MrvlIEtypes_RTTResult_t *tlv_rtt_result = MNULL; + t_u16 tlv_rtt_result_len = 0; + IEEEtypes_Header_t *tlv_ie = MNULL; + int tlv_ie_len = 0; + int tlv_left_len = 0; + t_u8 *tlv_pos = MNULL; + /** For output buffer mlan_event */ + t_u8 *pos = pevent->event_buf; + wifi_rtt_result_element *rtt_result_elem = MNULL; + wifi_rtt_result *rtt_result = MNULL; + t_u32 i = 0; + + ENTER(); + PRINTM(MCMND, + "wlan_fill_hal_rtt_results event_ftm_len=%d event_left_len=%d event_ftm=%p tlv=%p\n", + event_ftm_len, event_left_len, event_ftm, tlv); + + pevent->event_id = MLAN_EVENT_ID_DRV_RTT_RESULT; + + /** Event format for moal is: [complete(u8)] + [multiple number of rtt + * result(len(u16) + body)] */ + + /** [complete(u8)] */ + *pos = event_ftm->u.rtt_results.complete; + pos += sizeof(event_ftm->u.rtt_results.complete); + + /** multiple number of rtt result(wifi_rtt_result_element) */ + /** Fill rtt results, 1 tlv at least contain 1 MrvlIEtypes_RTTResult_t + */ + while (event_left_len >= sizeof(MrvlIEtypes_RTTResult_t)) { + PRINTM(MCMND, "[%d] event_left_len=%d tlv=%p\n", i, + event_left_len, tlv); + tlv_rtt_result = (MrvlIEtypes_RTTResult_t *)tlv; + tlv_rtt_result_len = + wlan_le16_to_cpu(tlv_rtt_result->header.len); + + rtt_result_elem = (wifi_rtt_result_element *)pos; + pos += sizeof(*rtt_result_elem); + + rtt_result = (wifi_rtt_result *)(rtt_result_elem->data); + memcpy_ext(pmpriv->adapter, rtt_result->addr, + tlv_rtt_result->addr, sizeof(tlv_rtt_result->addr), + sizeof(rtt_result->addr)); + rtt_result->burst_num = + wlan_le32_to_cpu(tlv_rtt_result->burst_num); + rtt_result->measurement_number = + wlan_le32_to_cpu(tlv_rtt_result->measurement_number); + rtt_result->success_number = + wlan_le32_to_cpu(tlv_rtt_result->success_number); + rtt_result->number_per_burst_peer = + tlv_rtt_result->number_per_burst_peer; + rtt_result->status = tlv_rtt_result->status; + rtt_result->retry_after_duration = + tlv_rtt_result->retry_after_duration; + rtt_result->type = tlv_rtt_result->type; + rtt_result->rssi = wlan_le32_to_cpu(tlv_rtt_result->rssi); + rtt_result->rssi_spread = + wlan_le32_to_cpu(tlv_rtt_result->rssi_spread); + wlan_fill_hal_wifi_rate(pmpriv, &tlv_rtt_result->tx_rate, + &rtt_result->tx_rate); + wlan_fill_hal_wifi_rate(pmpriv, &tlv_rtt_result->rx_rate, + &rtt_result->rx_rate); + rtt_result->rtt = wlan_le64_to_cpu(tlv_rtt_result->rtt); + rtt_result->rtt_sd = wlan_le64_to_cpu(tlv_rtt_result->rtt_sd); + rtt_result->rtt_spread = + wlan_le64_to_cpu(tlv_rtt_result->rtt_spread); + rtt_result->distance_mm = + wlan_le32_to_cpu(tlv_rtt_result->distance_mm); + rtt_result->distance_sd_mm = + wlan_le32_to_cpu(tlv_rtt_result->distance_sd_mm); + rtt_result->distance_spread_mm = + wlan_le32_to_cpu(tlv_rtt_result->distance_spread_mm); + rtt_result->ts = wlan_le64_to_cpu(tlv_rtt_result->ts); + rtt_result->burst_duration = + wlan_le32_to_cpu(tlv_rtt_result->burst_duration); + rtt_result->negotiated_burst_num = + wlan_le32_to_cpu(tlv_rtt_result->negotiated_burst_num); + pos += sizeof(*rtt_result); + + tlv_ie = (IEEEtypes_Header_t *)(tlv_rtt_result->tlv_buffer); + tlv_pos = (t_u8 *)tlv_ie; + tlv_left_len = + tlv_rtt_result_len - (sizeof(*tlv_rtt_result) - + sizeof(tlv_rtt_result->header)); + PRINTM(MCMND, "tlv_ie=%p tlv_left_len=%d\n", tlv_ie, + tlv_left_len); + /** Get the standard IEEEIE: MEASUREMENT_REPORT for LCI/LCR*/ + while ((tlv_left_len > 0) && (tlv_left_len > sizeof(*tlv_ie))) { + tlv_ie_len = tlv_ie->len; + PRINTM(MCMND, + "[-] tlv_ie=%p tlv_ie_len=%d tlv_left_len=%d jump=%d\n", + tlv_ie, tlv_ie_len, tlv_left_len, + sizeof(*tlv_ie) + tlv_ie_len); + if ((tlv_ie_len > 0) && + (tlv_ie->element_id == MEASUREMENT_REPORT)) { + PRINTM(MCMND, "LCI/LCR IE: id=%d len=%d\n", + tlv_ie->element_id, tlv_ie->len); + memcpy_ext(pmpriv->adapter, pos, (t_u8 *)tlv_ie, + sizeof(*tlv_ie) + tlv_ie_len, + sizeof(*tlv_ie) + tlv_ie_len); + pos += sizeof(*tlv_ie) + tlv_ie_len; + } + tlv_left_len -= sizeof(*tlv_ie) + tlv_ie_len; + tlv_pos += sizeof(*tlv_ie) + tlv_ie_len; + tlv_ie = (IEEEtypes_Header_t *)tlv_pos; + PRINTM(MCMND, + "[+] tlv_ie=%p tlv_ie_len=%d tlv_left_len=%d \n", + tlv_ie, tlv_ie_len, tlv_left_len); + } + + rtt_result_elem->len = pos - rtt_result_elem->data; + + tlv += tlv_rtt_result_len + sizeof(tlv_rtt_result->header); + event_left_len -= + tlv_rtt_result_len + sizeof(tlv_rtt_result->header); + i++; + } + + /** event_len include the mlan_event header and payload */ + pevent->event_len = pos - pevent->event_buf; + PRINTM(MCMND, "pevent->event_len=%d \n", pevent->event_len); + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function prepares command of ftm config responder. + * + * @param pmpriv A pointer to mlan_private structure + * @param cmd A pointer to HostCmd_DS_COMMAND structure + * @param pdata_buf A pointer to data buffer + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_cmd_802_11_ftm_config_responder(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, + t_u32 cmd_oid, + t_void *pdata_buf) +{ + mlan_rtt_responder *rtt_rsp_cfg = (mlan_rtt_responder *)pdata_buf; + HostCmd_DS_FTM_CONFIG_RESPONDER *responder = + &cmd->params.ftm_rtt_responder; + t_u8 *tlv = responder->tlv_buffer; + MrvlIEtypes_RTTResponderEnCfg_t *tlv_rsp_en = MNULL; + MrvlIEtypes_RTTLCICfg_t *tlv_lci = MNULL; + MrvlIEtypes_RTTLCRCfg_t *tlv_lcr = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + + ENTER(); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_FTM_CONFIG_RESPONDER); + cmd->size = S_DS_GEN + sizeof(HostCmd_DS_FTM_CONFIG_RESPONDER); + + switch (rtt_rsp_cfg->action) { + case RTT_GET_RESPONDER_INFO: + responder->action = + wlan_cpu_to_le16(HostCmd_ACT_RTT_GET_RSP_INFO); + break; + case RTT_SET_RESPONDER_ENABLE: + tlv_rsp_en = (MrvlIEtypes_RTTResponderEnCfg_t *)tlv; + responder->action = + wlan_cpu_to_le16(HostCmd_ACT_RTT_SET_RSP_EN); + tlv_rsp_en->header.type = + wlan_cpu_to_le16(TLV_TYPE_RTT_RESPONDER_EN_CFG); + tlv_rsp_en->header.len = wlan_cpu_to_le16( + sizeof(*tlv_rsp_en) - sizeof(MrvlIEtypesHeader_t)); + tlv_rsp_en->channel = rtt_rsp_cfg->u.encfg.channel; + tlv_rsp_en->bandcfg = rtt_rsp_cfg->u.encfg.bandcfg; + tlv_rsp_en->max_duration_seconds = + wlan_cpu_to_le32(rtt_rsp_cfg->u.encfg.max_dur_sec); + cmd->size += sizeof(*tlv_rsp_en); + break; + case RTT_SET_RESPONDER_DISABLE: + responder->action = + wlan_cpu_to_le16(HostCmd_ACT_RTT_SET_RSP_DIS); + break; + case RTT_SET_RESPONDER_LCI: + tlv_lci = (MrvlIEtypes_RTTLCICfg_t *)tlv; + responder->action = + wlan_cpu_to_le16(HostCmd_ACT_RTT_SET_RSP_LCI); + tlv_lci->header.type = wlan_cpu_to_le16(TLV_TYPE_RTT_LCI_CFG); + tlv_lci->header.len = wlan_cpu_to_le16( + sizeof(*tlv_lci) - sizeof(MrvlIEtypesHeader_t)); + tlv_lci->latitude = + wlan_cpu_to_le64(rtt_rsp_cfg->u.lci.latitude); + tlv_lci->longitude = + wlan_cpu_to_le64(rtt_rsp_cfg->u.lci.longitude); + tlv_lci->altitude = + wlan_cpu_to_le32(rtt_rsp_cfg->u.lci.altitude); + tlv_lci->latitude_unc = rtt_rsp_cfg->u.lci.latitude_unc; + tlv_lci->longitude_unc = rtt_rsp_cfg->u.lci.longitude_unc; + tlv_lci->altitude_unc = rtt_rsp_cfg->u.lci.altitude_unc; + tlv_lci->motion_pattern = rtt_rsp_cfg->u.lci.motion_pattern; + tlv_lci->floor = wlan_cpu_to_le32(rtt_rsp_cfg->u.lci.floor); + tlv_lci->height_above_floor = + wlan_cpu_to_le32(rtt_rsp_cfg->u.lci.height_above_floor); + tlv_lci->height_unc = + wlan_cpu_to_le32(rtt_rsp_cfg->u.lci.height_unc); + cmd->size += sizeof(*tlv_lci); + break; + case RTT_SET_RESPONDER_LCR: + tlv_lcr = (MrvlIEtypes_RTTLCRCfg_t *)tlv; + responder->action = + wlan_cpu_to_le16(HostCmd_ACT_RTT_SET_RSP_LCR); + tlv_lcr->header.type = wlan_cpu_to_le16(TLV_TYPE_RTT_LCR_CFG); + tlv_lcr->header.len = wlan_cpu_to_le16( + sizeof(*tlv_lcr) - sizeof(MrvlIEtypesHeader_t)); + memcpy_ext(pmpriv->adapter, tlv_lcr->country_code, + rtt_rsp_cfg->u.lcr.country_code, + sizeof(rtt_rsp_cfg->u.lcr.country_code), + sizeof(tlv_lcr->country_code)); + tlv_lcr->length = wlan_cpu_to_le32(rtt_rsp_cfg->u.lcr.length); + memcpy_ext(pmpriv->adapter, tlv_lcr->civic_info, + rtt_rsp_cfg->u.lcr.civic_info, + sizeof(rtt_rsp_cfg->u.lcr.civic_info), + sizeof(tlv_lcr->civic_info)); + cmd->size += sizeof(*tlv_lcr); + break; + default: + PRINTM(MERROR, + "wlan_cmd_802_11_ftm_config_responder: action not found\n"); + ret = MLAN_STATUS_FAILURE; + goto done; + break; + } + + cmd->size = wlan_cpu_to_le16(cmd->size); + +done: + LEAVE(); + return ret; +} + +/** + * @brief This function handles the command response of ftm config responder + * + * @param pmpriv A pointer to mlan_private structure + * @param resp A pointer to HostCmd_DS_COMMAND + * @param pioctl_buf A pointer to mlan_ioctl_req structure + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_ret_802_11_ftm_config_responder(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)(pioctl_buf->pbuf); + mlan_rtt_responder *rtt_rsp_cfg = &(misc->param.rtt_rsp_cfg); + HostCmd_DS_FTM_CONFIG_RESPONDER *responder = MNULL; + t_u32 cmdrsp_len = wlan_le16_to_cpu(resp->size); + int left_len = 0; + t_u8 *tlv = MNULL; + MrvlIEtypes_RTTResponderInfo_t *tlv_rsp_info = MNULL; + + ENTER(); + + PRINTM(MCMND, "ftm config responder successfully cmdrsp_len=%d\n", + cmdrsp_len); + + if ((cmdrsp_len < S_DS_GEN) || + (cmdrsp_len - S_DS_GEN < sizeof(HostCmd_DS_FTM_CONFIG_RESPONDER))) + goto done; + + responder = &resp->params.ftm_rtt_responder; + left_len = cmdrsp_len - (S_DS_GEN + sizeof(*responder)); + PRINTM(MCMND, "left_len=%d\n", left_len); + + tlv = responder->tlv_buffer; + while ((left_len > 0) && (left_len > sizeof(MrvlIEtypesHeader_t))) { + PRINTM(MCMND, "left_len=%d tlv: type=0x%x len=%d\n", left_len, + ((MrvlIEtypesHeader_t *)tlv)->type, + ((MrvlIEtypesHeader_t *)tlv)->len); + if (((MrvlIEtypesHeader_t *)tlv)->type == + TLV_TYPE_RTT_RESPONDER_INFO) { + if (((MrvlIEtypesHeader_t *)tlv)->len >= + (sizeof(MrvlIEtypes_RTTResponderInfo_t) - + sizeof(MrvlIEtypesHeader_t))) { + tlv_rsp_info = + (MrvlIEtypes_RTTResponderInfo_t *)tlv; + PRINTM(MCMND, "rtt_rsp_cfg->action=0x%x\n", + rtt_rsp_cfg->action); + if (rtt_rsp_cfg->action == + RTT_GET_RESPONDER_INFO || + rtt_rsp_cfg->action == + RTT_SET_RESPONDER_ENABLE) { + rtt_rsp_cfg->u.info.channel = + tlv_rsp_info->channel; + rtt_rsp_cfg->u.info.bandcfg = + tlv_rsp_info->bandcfg; + rtt_rsp_cfg->u.info.preamble = + tlv_rsp_info->preamble; + PRINTM(MCMND, + "set to rtt_rsp_cfg channel=%d bandcfg=%d %d %d %d preamble=%d\n", + rtt_rsp_cfg->u.info.channel, + rtt_rsp_cfg->u.info.bandcfg + .chanBand, + rtt_rsp_cfg->u.info.bandcfg + .chanWidth, + rtt_rsp_cfg->u.info.bandcfg + .chan2Offset, + rtt_rsp_cfg->u.info.bandcfg + .chan2Offset, + rtt_rsp_cfg->u.info.preamble); + break; + } + } + } + left_len -= ((MrvlIEtypesHeader_t *)tlv)->len + + sizeof(MrvlIEtypesHeader_t); + tlv += ((MrvlIEtypesHeader_t *)tlv)->len + + sizeof(MrvlIEtypesHeader_t); + } + +done: + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /** * @brief Handle the version_ext resp * @@ -3141,8 +3611,10 @@ void wlan_process_sleep_confirm_resp(pmlan_adapter pmadapter, t_u8 *pbuf, LEAVE(); return; } - PRINTM_NETINTF(MEVENT, pmpriv); - PRINTM(MEVENT, "#\n"); + if (pmadapter->second_mac) + PRINTM(MEVENT, "##\n"); + else + PRINTM(MEVENT, "#\n"); if (cmd->result != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Sleep confirm command failed\n"); pmadapter->pm_wakeup_card_req = MFALSE; @@ -4566,6 +5038,10 @@ mlan_status wlan_download_vdll_block(mlan_adapter *pmadapter, t_u8 *block, PRINTM(MERROR, "dnld vdll: Fail to alloc vdll buf"); goto done; } + if (!pmpriv) { + PRINTM(MERROR, "dnld vdll: Fail to get pmpriv"); + goto done; + } cmd_hdr = (HostCmd_DS_GEN *)(pmbuf->pbuf + pmbuf->data_offset); cmd_hdr->command = wlan_cpu_to_le16(HostCmd_CMD_VDLL); cmd_hdr->seq_num = wlan_cpu_to_le16(0xFF00); @@ -5292,7 +5768,7 @@ mlan_status wlan_cmd_sdio_rx_aggr_cfg(HostCmd_DS_COMMAND *pcmd, pcmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_SDIO_SP_RX_AGGR_CFG) + S_DS_GEN); cfg->action = cmd_action; - if (cmd_action == HostCmd_ACT_GEN_SET) + if (pdata_buf && (cmd_action == HostCmd_ACT_GEN_SET)) cfg->enable = *(t_u8 *)pdata_buf; return MLAN_STATUS_SUCCESS; } @@ -5415,7 +5891,7 @@ mlan_status wlan_ret_cfg_data(IN pmlan_private pmpriv, pevent->bss_index = pmpriv->bss_index; pevent->event_id = MLAN_EVENT_ID_STORE_HOST_CMD_RESP; pevent->resp = (t_u8 *)resp; - pevent->event_len = wlan_le16_to_cpu(resp->size); + pevent->event_len = resp->size; wlan_recv_event(pmpriv, MLAN_EVENT_ID_STORE_HOST_CMD_RESP, (mlan_event *)pevent); @@ -5440,7 +5916,7 @@ mlan_status wlan_cmd_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd, t_u16 cmd_action, t_void *pdata_buf) { HostCmd_DS_MAC_CONTROL *pmac = &pcmd->params.mac_ctrl; - t_u32 action = *((t_u32 *)pdata_buf); + t_u32 action = 0; ENTER(); @@ -5453,7 +5929,10 @@ mlan_status wlan_cmd_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd, pcmd->command = wlan_cpu_to_le16(HostCmd_CMD_MAC_CONTROL); pcmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_MAC_CONTROL) + S_DS_GEN); - pmac->action = wlan_cpu_to_le32(action); + if (pdata_buf) { + action = *((t_u32 *)pdata_buf); + pmac->action = wlan_cpu_to_le32(action); + } LEAVE(); return MLAN_STATUS_SUCCESS; @@ -5591,6 +6070,9 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, pmadapter->hw_dot_11n_dev_cap = wlan_le32_to_cpu(hw_spec->dot_11n_dev_cap); pmadapter->hw_dev_mcs_support = hw_spec->dev_mcs_support; + pmadapter->hw_mpdu_density = GET_MPDU_DENSITY(hw_spec->hw_dev_cap); + PRINTM(MCMND, "GET_HW_SPEC: hw_mpdu_density=%d dev_mcs_support=0x%x\n", + pmadapter->hw_mpdu_density, hw_spec->dev_mcs_support); for (i = 0; i < pmadapter->priv_num; i++) { if (pmadapter->priv[i]) wlan_update_11n_cap(pmadapter->priv[i]); @@ -5598,16 +6080,12 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, wlan_show_dot11ndevcap(pmadapter, pmadapter->hw_dot_11n_dev_cap); wlan_show_devmcssupport(pmadapter, pmadapter->hw_dev_mcs_support); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) pmadapter->user_htstream = pmadapter->hw_dev_mcs_support; /** separate stream config for 2.4G and 5G, will be changed according to * antenna cfg*/ if (pmadapter->fw_bands & BAND_A) pmadapter->user_htstream |= (pmadapter->user_htstream << 8); PRINTM(MCMND, "user_htstream=0x%x\n", pmadapter->user_htstream); -#endif if (ISSUPP_BEAMFORMING(pmadapter->hw_dot_11n_dev_cap)) { PRINTM(MCMND, "Enable Beamforming\n"); @@ -5691,18 +6169,10 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, } } #endif - - if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code, - pmadapter->fw_bands)) { - if (pioctl_req) - pioctl_req->status_code = MLAN_ERROR_CMD_SCAN_FAIL; - ret = MLAN_STATUS_FAILURE; - goto done; - } #ifdef STA_SUPPORT if (wlan_11d_set_universaltable(pmpriv, pmadapter->fw_bands)) { if (pioctl_req) - pioctl_req->status_code = MLAN_ERROR_CMD_SCAN_FAIL; + pioctl_req->status_code = MLAN_ERROR_IOCTL_FAIL; ret = MLAN_STATUS_FAILURE; goto done; } @@ -5815,6 +6285,13 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, tlv = (MrvlIEtypesHeader_t *)((t_u8 *)tlv + tlv_len + sizeof(MrvlIEtypesHeader_t)); } + if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code, + pmadapter->fw_bands)) { + if (pioctl_req) + pioctl_req->status_code = MLAN_ERROR_IOCTL_FAIL; + ret = MLAN_STATUS_FAILURE; + goto done; + } done: LEAVE(); return ret; @@ -6433,6 +6910,84 @@ mlan_status wlan_ret_gpio_tsf_latch(pmlan_private pmpriv, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function prepares command of CROSS CHIP SYNCH. + * + * @param pmpriv A pointer to mlan_private structure + * @param cmd A pointer to HostCmd_DS_COMMAND structure + * @param cmd_action The action: GET or SET + * @param pdata_buf A pointer to data buffer + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_cmd_cross_chip_synch(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, + t_void *pdata_buf) +{ + HostCmd_DS_CROSS_CHIP_SYNCH *cross_chip_synch = + &cmd->params.cross_chip_synch; + mlan_ds_cross_chip_synch *cfg = (mlan_ds_cross_chip_synch *)pdata_buf; + + ENTER(); + + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_CROSS_CHIP_SYNCH); + cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_CROSS_CHIP_SYNCH) + + S_DS_GEN); + cross_chip_synch->action = wlan_cpu_to_le16(cmd_action); + + if (cmd_action == HostCmd_ACT_GEN_SET) { + cross_chip_synch->start_stop = cfg->start_stop; + cross_chip_synch->role = cfg->role; + cross_chip_synch->period = wlan_cpu_to_le32(cfg->period); + cross_chip_synch->init_tsf_low = + wlan_cpu_to_le32(cfg->init_tsf_low); + cross_chip_synch->init_tsf_high = + wlan_cpu_to_le32(cfg->init_tsf_high); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function handles the command response of CROSS CHIP SYNCH. + * + * @param pmpriv A pointer to mlan_private structure + * @param resp A pointer to HostCmd_DS_COMMAND structure + * @param pioctl_buf A pointer to mlan_ioctl_req buf + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_ret_cross_chip_synch(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + HostCmd_DS_CROSS_CHIP_SYNCH *cross_chip_synch = + &resp->params.cross_chip_synch; + mlan_ds_misc_cfg *cfg = MNULL; + ENTER(); + if (pioctl_buf) { + cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; + + if (wlan_le16_to_cpu(cross_chip_synch->action) == + HostCmd_ACT_GEN_GET) { + cfg->param.cross_chip_synch.start_stop = + cross_chip_synch->start_stop; + cfg->param.cross_chip_synch.role = + cross_chip_synch->role; + cfg->param.cross_chip_synch.period = + wlan_le32_to_cpu(cross_chip_synch->period); + cfg->param.cross_chip_synch.init_tsf_low = + wlan_le32_to_cpu( + cross_chip_synch->init_tsf_low); + cfg->param.cross_chip_synch.init_tsf_high = + wlan_le32_to_cpu( + cross_chip_synch->init_tsf_high); + } + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /** * @brief This function prepares command of mimo switch configuration. * @@ -6563,7 +7118,8 @@ mlan_status wlan_ret_tx_rx_pkt_stats(pmlan_private pmpriv, HostCmd_DS_TX_RX_HISTOGRAM *ptx_rx_histogram = &resp->params.tx_rx_histogram; mlan_ds_misc_cfg *info; - t_u16 cmdsize = wlan_le16_to_cpu(resp->size), length; + t_u16 cmdsize = resp->size; + t_u16 length; t_u32 *pos, count = 0; ENTER(); @@ -6751,11 +7307,7 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv, HostCmd_DS_802_11_RF_ANTENNA *pantenna = &resp->params.antenna; t_u16 tx_ant_mode = wlan_le16_to_cpu(pantenna->tx_antenna_mode); t_u16 rx_ant_mode = wlan_le16_to_cpu(pantenna->rx_antenna_mode); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) mlan_adapter *pmadapter = pmpriv->adapter; -#endif typedef struct _HostCmd_DS_802_11_RF_ANTENNA_1X1 { /** Action */ t_u16 action; @@ -6781,11 +7333,9 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv, " Rx action = 0x%x, Rx Mode = 0x%04x\n", wlan_le16_to_cpu(pantenna->action_tx), tx_ant_mode, wlan_le16_to_cpu(pantenna->action_rx), rx_ant_mode); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || + IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { tx_ant_mode &= 0x0303; rx_ant_mode &= 0x0303; @@ -6818,7 +7368,6 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv, pmadapter->user_htstream, tx_ant_mode, rx_ant_mode); } -#endif } else PRINTM(MINFO, "RF_ANT_RESP: action = 0x%x, Mode = 0x%04x, Evaluate time = %d, Current antenna = %d\n", @@ -6855,12 +7404,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, t_void *pdata_buf) { mlan_ds_reg_rw *reg_rw; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) MrvlIEtypes_Reg_type_t *tlv; mlan_adapter *pmadapter = pmpriv->adapter; -#endif ENTER(); @@ -6874,12 +7419,10 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, mac_reg->action = wlan_cpu_to_le16(cmd_action); mac_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); mac_reg->value = wlan_cpu_to_le32(reg_rw->value); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) if ((reg_rw->type == MLAN_REG_MAC2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || + IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t *)((t_u8 *)cmd + @@ -6893,7 +7436,6 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, sizeof(HostCmd_DS_MAC_REG_ACCESS) + S_DS_GEN + sizeof(MrvlIEtypes_Reg_type_t)); } -#endif break; } case HostCmd_CMD_REG_ACCESS: { @@ -6915,12 +7457,10 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, bbp_reg->action = wlan_cpu_to_le16(cmd_action); bbp_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); bbp_reg->value = (t_u8)reg_rw->value; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) if ((reg_rw->type == MLAN_REG_BBP2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || + IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t *)((t_u8 *)cmd + @@ -6934,7 +7474,6 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, sizeof(HostCmd_DS_BBP_REG_ACCESS) + S_DS_GEN + sizeof(MrvlIEtypes_Reg_type_t)); } -#endif break; } case HostCmd_CMD_RF_REG_ACCESS: { @@ -6945,12 +7484,10 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, rf_reg->action = wlan_cpu_to_le16(cmd_action); rf_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); rf_reg->value = (t_u8)reg_rw->value; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) if ((reg_rw->type == MLAN_REG_RF2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || + IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t *)((t_u8 *)cmd + @@ -6964,7 +7501,6 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, sizeof(HostCmd_DS_RF_REG_ACCESS) + S_DS_GEN + sizeof(MrvlIEtypes_Reg_type_t)); } -#endif break; } case HostCmd_CMD_CAU_REG_ACCESS: { @@ -7010,12 +7546,10 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, bca_reg->action = wlan_cpu_to_le16(cmd_action); bca_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); bca_reg->value = wlan_cpu_to_le32(reg_rw->value); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) if ((reg_rw->type == MLAN_REG_BCA2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type) || + IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t *)((t_u8 *)cmd + @@ -7029,7 +7563,6 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, sizeof(HostCmd_DS_BCA_REG_ACCESS) + S_DS_GEN + sizeof(MrvlIEtypes_Reg_type_t)); } -#endif break; } default: @@ -7883,7 +8416,7 @@ mlan_status wlan_ret_chan_region_cfg(pmlan_private pmpriv, t_u16 action; HostCmd_DS_CHAN_REGION_CFG *reg = MNULL; t_u8 *tlv_buf = MNULL; - t_u16 tlv_buf_left; + t_u16 tlv_buf_left = 0; mlan_ds_misc_cfg *misc_cfg = MNULL; mlan_ds_misc_chnrgpwr_cfg *cfg = MNULL; mlan_status ret = MLAN_STATUS_SUCCESS; @@ -7903,7 +8436,11 @@ mlan_status wlan_ret_chan_region_cfg(pmlan_private pmpriv, } tlv_buf = (t_u8 *)reg + sizeof(*reg); - tlv_buf_left = wlan_le16_to_cpu(resp->size) - S_DS_GEN - sizeof(*reg); + if (resp->size > (S_DS_GEN + sizeof(*reg))) { + tlv_buf_left = resp->size - S_DS_GEN - sizeof(*reg); + } else { + PRINTM(MERROR, "Region size calculation ERROR.\n"); + } /* Add FW cfp tables and region info */ wlan_add_fw_cfp_tables(pmpriv, tlv_buf, tlv_buf_left); @@ -7928,7 +8465,7 @@ mlan_status wlan_ret_chan_region_cfg(pmlan_private pmpriv, if (misc_cfg->sub_command == MLAN_OID_MISC_GET_REGIONPWR_CFG) { cfg = (mlan_ds_misc_chnrgpwr_cfg *)&( misc_cfg->param.rgchnpwr_cfg); - cfg->length = wlan_le16_to_cpu(resp->size); + cfg->length = resp->size; memcpy_ext(pmpriv->adapter, cfg->chnrgpwr_buf, (t_u8 *)resp, cfg->length, sizeof(cfg->chnrgpwr_buf)); } else { @@ -8548,7 +9085,7 @@ mlan_status wlan_cmd_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, boot_sleep->action = wlan_cpu_to_le16(cmd_action); boot_sleep->enable = wlan_cpu_to_le16(enable); - cmd->size = S_DS_GEN + sizeof(HostCmd_DS_BOOT_SLEEP); + cmd->size = wlan_cpu_to_le16(S_DS_GEN + sizeof(HostCmd_DS_BOOT_SLEEP)); LEAVE(); return MLAN_STATUS_SUCCESS; @@ -8926,6 +9463,40 @@ mlan_status wlan_cmd_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function prepares command of OFDM DESENSE cfg + * + * @param pmpriv A pointer to mlan_private structure + * @param cmd A pointer to HostCmd_DS_COMMAND structure + * @param cmd_action the action: GET or SET + * @param pdata_buf A pointer to data buffer + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_cmd_ofdmdesense_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, + t_void *pdata_buf) +{ + HostCmd_DS_CMD_OFDM_DESENSE_CFG *cfg_cmd = + (HostCmd_DS_CMD_OFDM_DESENSE_CFG *)&cmd->params.ofdm_desense_cfg; + mlan_ds_misc_ofdm_desense_cfg *cfg = + (mlan_ds_misc_ofdm_desense_cfg *)pdata_buf; + + ENTER(); + + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_OFDM_DESENSE_CFG); + cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_CMD_OFDM_DESENSE_CFG) + + S_DS_GEN); + cfg_cmd->action = wlan_cpu_to_le16(cmd_action); + + if (cmd_action == HostCmd_ACT_GEN_SET) { + cfg_cmd->enable = (t_u8)cfg->enable; + cfg_cmd->cca_threshold = (t_s8)cfg->cca_threshold; + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /** * @brief This function handles the command response of Rx Abort Cfg * @@ -8953,6 +9524,35 @@ mlan_status wlan_ret_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, LEAVE(); return MLAN_STATUS_SUCCESS; } +/** + * @brief This function handles the command response of OFDM DESENSE CFG + * + * @param pmpriv A pointer to mlan_private structure + * @param resp A pointer to HostCmd_DS_COMMAND + * @param pioctl_buf A pointer to mlan_ioctl_req structure + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_ret_ofdmdesense_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + HostCmd_DS_CMD_OFDM_DESENSE_CFG *cfg_cmd = + (HostCmd_DS_CMD_OFDM_DESENSE_CFG *)&resp->params + .ofdm_desense_cfg; + mlan_ds_misc_cfg *misc_cfg = MNULL; + + ENTER(); + + if (pioctl_buf) { + misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; + misc_cfg->param.ofdm_desense_cfg.enable = (t_u8)cfg_cmd->enable; + misc_cfg->param.ofdm_desense_cfg.cca_threshold = + (t_s8)cfg_cmd->cca_threshold; + } + LEAVE(); + return MLAN_STATUS_SUCCESS; +} /** * @brief This function prepares command of Rx abort cfg ext @@ -8983,6 +9583,11 @@ mlan_status wlan_cmd_rxabortcfg_ext(pmlan_private pmpriv, cfg_cmd->enable = (t_u8)cfg->enable; cfg_cmd->rssi_margin = (t_s8)cfg->rssi_margin; cfg_cmd->ceil_rssi_threshold = (t_s8)cfg->ceil_rssi_threshold; + cfg_cmd->floor_rssi_threshold = (t_s8)cfg->floor_rssi_threshold; + cfg_cmd->current_dynamic_rssi_threshold = + (t_s8)cfg->current_dynamic_rssi_threshold; + cfg_cmd->rssi_default_config = (t_u8)cfg->rssi_default_config; + cfg_cmd->edmac_enable = (t_u8)cfg->edmac_enable; } LEAVE(); @@ -9016,6 +9621,14 @@ mlan_status wlan_ret_rxabortcfg_ext(pmlan_private pmpriv, cfg_cmd->rssi_margin; misc_cfg->param.rx_abort_cfg_ext.ceil_rssi_threshold = cfg_cmd->ceil_rssi_threshold; + misc_cfg->param.rx_abort_cfg_ext.floor_rssi_threshold = + cfg_cmd->floor_rssi_threshold; + misc_cfg->param.rx_abort_cfg_ext.current_dynamic_rssi_threshold = + cfg_cmd->current_dynamic_rssi_threshold; + misc_cfg->param.rx_abort_cfg_ext.rssi_default_config = + cfg_cmd->rssi_default_config; + misc_cfg->param.rx_abort_cfg_ext.edmac_enable = + cfg_cmd->edmac_enable; } LEAVE(); return MLAN_STATUS_SUCCESS; @@ -9535,7 +10148,7 @@ mlan_status wlan_ret_get_chan_trpc_config(pmlan_private pmpriv, misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; cfg = (mlan_ds_misc_chan_trpc_cfg *)&(misc->param.trpc_cfg); cfg->sub_band = wlan_le16_to_cpu(trpc_cfg->sub_band); - cfg->length = wlan_le16_to_cpu(resp->size); + cfg->length = resp->size; memcpy_ext(pmadapter, cfg->trpc_buf, (t_u8 *)resp, cfg->length, sizeof(cfg->trpc_buf)); } @@ -9628,7 +10241,6 @@ mlan_status wlan_cmd_get_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, cfg_cmd->noise = wlan_cpu_to_le16(cfg->noise); cfg_cmd->rx_quality = wlan_cpu_to_le16(cfg->rx_quality); cfg_cmd->duration = wlan_cpu_to_le16(cfg->duration); - cfg_cmd->cca_th = wlan_cpu_to_le16(cfg->cca_th); LEAVE(); return MLAN_STATUS_SUCCESS; } diff --git a/mxm_wifiex/wlan_src/mlan/mlan_decl.h b/mxm_wifiex/wlan_src/mlan/mlan_decl.h index 2b496fe..e1b1d42 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_decl.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_decl.h @@ -24,7 +24,7 @@ #define _MLAN_DECL_H_ /** MLAN release version */ -#define MLAN_RELEASE_VERSION "368.p2" +#define MLAN_RELEASE_VERSION "391" /** Re-define generic data types for MLAN/MOAL */ /** Signed char (1-byte) */ @@ -262,11 +262,12 @@ typedef t_s32 t_sval; #define FW_RELOAD_NO_EMULATION 2 /** out band reset with interface re-emulation */ #define FW_RELOAD_WITH_EMULATION 3 -#ifdef PCIE /** pcie card reset */ #define FW_RELOAD_PCIE_RESET 4 -#endif +/** sdio hw reset */ #define FW_RELOAD_SDIO_HW_RESET 5 +/** pcie inband reset */ +#define FW_RELOAD_PCIE_INBAND_RESET 6 #ifdef USB #define MLAN_USB_BLOCK_SIZE (512) @@ -373,7 +374,9 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; /** 8801 card type */ #define CARD_TYPE_8801 0x0a /** OWL card type */ -#define CARD_TYPE_NW62X 0x0b +#define CARD_TYPE_IW62X 0x0b +/** Black bird card type */ +#define CARD_TYPE_AW693 0x0c /** 9098 A0 reverion num */ #define CHIP_9098_REV_A0 1 @@ -405,8 +408,10 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_SD9177 (CARD_TYPE_9177 | (INTF_SD << 8)) /** SD8801 card type */ #define CARD_TYPE_SD8801 (CARD_TYPE_8801 | (INTF_SD << 8)) -/** SD_NW62X card type */ -#define CARD_TYPE_SDNW62X (CARD_TYPE_NW62X | (INTF_SD << 8)) +/** SD_IW62X card type */ +#define CARD_TYPE_SDIW62X (CARD_TYPE_IW62X | (INTF_SD << 8)) +/** SD_IW62X card type */ +#define CARD_TYPE_SDAW693 (CARD_TYPE_AW693 | (INTF_SD << 8)) #define IS_SD8887(ct) (CARD_TYPE_SD8887 == (ct)) #define IS_SD8897(ct) (CARD_TYPE_SD8897 == (ct)) @@ -418,7 +423,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_SD9098(ct) (CARD_TYPE_SD9098 == (ct)) #define IS_SD9177(ct) (CARD_TYPE_SD9177 == (ct)) #define IS_SD8801(ct) (CARD_TYPE_SD8801 == (ct)) -#define IS_SDNW62X(ct) (CARD_TYPE_SDNW62X == (ct)) +#define IS_SDIW62X(ct) (CARD_TYPE_SDIW62X == (ct)) +#define IS_SDAW693(ct) (CARD_TYPE_SDAW693 == (ct)) /** SD8887 Card */ #define CARD_SD8887 "SD8887" @@ -440,8 +446,10 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_SD9177 "SDIW612" /** SD8801 Card */ #define CARD_SD8801 "SD8801" -/** SDNW62X Card */ -#define CARD_SDNW62X "SDNW62X" +/** SDIW62X Card */ +#define CARD_SDIW62X "SDIW62X" +/** SDAW693 Card */ +#define CARD_SDAW693 "SDAW693" #endif #ifdef PCIE @@ -453,14 +461,17 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_PCIE9097 (CARD_TYPE_9097 | (INTF_PCIE << 8)) /** PCIE9098 card type */ #define CARD_TYPE_PCIE9098 (CARD_TYPE_9098 | (INTF_PCIE << 8)) -/** PCIENW62X card type */ -#define CARD_TYPE_PCIENW62X (CARD_TYPE_NW62X | (INTF_PCIE << 8)) +/** PCIEIW62X card type */ +#define CARD_TYPE_PCIEIW62X (CARD_TYPE_IW62X | (INTF_PCIE << 8)) +/** PCIEAW693 card type */ +#define CARD_TYPE_PCIEAW693 (CARD_TYPE_AW693 | (INTF_PCIE << 8)) #define IS_PCIE8897(ct) (CARD_TYPE_PCIE8897 == (ct)) #define IS_PCIE8997(ct) (CARD_TYPE_PCIE8997 == (ct)) #define IS_PCIE9097(ct) (CARD_TYPE_PCIE9097 == (ct)) #define IS_PCIE9098(ct) (CARD_TYPE_PCIE9098 == (ct)) -#define IS_PCIENW62X(ct) (CARD_TYPE_PCIENW62X == (ct)) +#define IS_PCIEIW62X(ct) (CARD_TYPE_PCIEIW62X == (ct)) +#define IS_PCIEAW693(ct) (CARD_TYPE_PCIEAW693 == (ct)) /** PCIE8897 Card */ #define CARD_PCIE8897 "PCIE8897" @@ -474,8 +485,10 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_PCIE9098 "PCIE9098" /** PCIEAW690 Card */ #define CARD_PCIEAW690 "PCIEAW690" -/** PCIENW62X Card */ -#define CARD_PCIENW62X "PCIENW62X" +/** PCIEIW62X Card */ +#define CARD_PCIEIW62X "PCIEIW62X" +/** PCIEAW693 Card */ +#define CARD_PCIEAW693 "PCIEAW693" /** PCIEIW629 Card */ #define CARD_PCIEIW629 "PCIEIW629" #endif @@ -493,8 +506,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_USB9098 (CARD_TYPE_9098 | (INTF_USB << 8)) /** USB9097 card type */ #define CARD_TYPE_USB9097 (CARD_TYPE_9097 | (INTF_USB << 8)) -/** USBNW62X card type */ -#define CARD_TYPE_USBNW62X (CARD_TYPE_NW62X | (INTF_USB << 8)) +/** USBIW62X card type */ +#define CARD_TYPE_USBIW62X (CARD_TYPE_IW62X | (INTF_USB << 8)) #define IS_USB8801(ct) (CARD_TYPE_USB8801 == (ct)) #define IS_USB8897(ct) (CARD_TYPE_USB8897 == (ct)) @@ -502,7 +515,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_USB8978(ct) (CARD_TYPE_USB8978 == (ct)) #define IS_USB9098(ct) (CARD_TYPE_USB9098 == (ct)) #define IS_USB9097(ct) (CARD_TYPE_USB9097 == (ct)) -#define IS_USBNW62X(ct) (CARD_TYPE_USBNW62X == (ct)) +#define IS_USBIW62X(ct) (CARD_TYPE_USBIW62X == (ct)) /** USB8801 Card */ #define CARD_USB8801 "USB8801" @@ -516,8 +529,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_USB9098 "USB9098" /** USB9097 Card */ #define CARD_USB9097 "USBIW620" -/** USBNW62X Card */ -#define CARD_USBNW62X "USBNW62X" +/** USBIW62X Card */ +#define CARD_USBIW62X "USBIW62X" #endif #define IS_CARD8801(ct) (CARD_TYPE_8801 == ((ct)&0xf)) @@ -529,7 +542,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_CARD9098(ct) (CARD_TYPE_9098 == ((ct)&0xf)) #define IS_CARD9097(ct) (CARD_TYPE_9097 == ((ct)&0xf)) #define IS_CARD9177(ct) (CARD_TYPE_9177 == ((ct)&0xf)) -#define IS_CARDNW62X(ct) (CARD_TYPE_NW62X == ((ct)&0xf)) +#define IS_CARDIW62X(ct) (CARD_TYPE_IW62X == ((ct)&0xf)) +#define IS_CARDAW693(ct) (CARD_TYPE_AW693 == ((ct)&0xf)) typedef struct _card_type_entry { t_u16 card_type; @@ -822,6 +836,7 @@ typedef enum _mlan_event_id { MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020, #endif MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023, + MLAN_EVENT_ID_DRV_RTT_RESULT = 0x80000025, MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026, MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027, MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER = 0x80000028, @@ -974,10 +989,10 @@ typedef MLAN_PACK_START struct _Band_Config_t { t_u8 chan2Offset : 2; /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */ t_u8 chanWidth : 2; - /** Band Info - (00)=2.4GHz, (01)=5GHz */ + /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; #else - /** Band Info - (00)=2.4GHz, (01)=5GHz */ + /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */ t_u8 chanWidth : 2; @@ -1152,6 +1167,10 @@ typedef MLAN_PACK_START struct _mix_rate_info { t_u8 mcs_index; /** bitrate, in 500Kbps */ t_u16 bitrate; + /** NSS */ + t_u8 nss_index; + /** DCM */ + t_u8 dcm; } MLAN_PACK_END mix_rate_info, *pmix_rate_info; typedef MLAN_PACK_START struct _rxpd_extra_info { @@ -1163,10 +1182,12 @@ typedef MLAN_PACK_START struct _rxpd_extra_info { t_u8 mcs_known; /** mcs.flags */ t_u8 mcs_flags; - /** vht sig1 */ - t_u32 vht_sig1; - /** vht sig2 */ - t_u32 vht_sig2; + /** vht/he sig1 */ + t_u32 vht_he_sig1; + /** vht/he sig2 */ + t_u32 vht_he_sig2; + /** HE user idx */ + t_u32 user_idx; } MLAN_PACK_END rxpd_extra_info, *prxpd_extra_info; typedef MLAN_PACK_START struct _radiotap_info { @@ -2030,6 +2051,308 @@ typedef struct { 0x00000080 /** all contention (min, max, avg) statistics (within ac \ statisctics) */ +/** =========== Define Copied from HAL START =========== */ +/** Ranging status */ +typedef enum { + RTT_STATUS_SUCCESS = 0, + /** general failure status */ + RTT_STATUS_FAILURE = 1, + /** target STA does not respond to request */ + RTT_STATUS_FAIL_NO_RSP = 2, + /** request rejected. Applies to 2-sided RTT only */ + RTT_STATUS_FAIL_REJECTED = 3, + RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4, + /** timing measurement times out */ + RTT_STATUS_FAIL_TM_TIMEOUT = 5, + /** Target on different channel, cannot range */ + RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6, + /** ranging not supported */ + RTT_STATUS_FAIL_NO_CAPABILITY = 7, + /** request aborted for unknown reason */ + RTT_STATUS_ABORTED = 8, + /** Invalid T1-T4 timestamp */ + RTT_STATUS_FAIL_INVALID_TS = 9, + /** 11mc protocol failed */ + RTT_STATUS_FAIL_PROTOCOL = 10, + /** request could not be scheduled */ + RTT_STATUS_FAIL_SCHEDULE = 11, + /** responder cannot collaborate at time of request */ + RTT_STATUS_FAIL_BUSY_TRY_LATER = 12, + /** bad request args */ + RTT_STATUS_INVALID_REQ = 13, + /** WiFi not enabled */ + RTT_STATUS_NO_WIFI = 14, + /** Responder overrides param info, cannot range with new params */ + RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15 +} wifi_rtt_status; + +/** RTT peer type */ +typedef enum { + RTT_PEER_AP = 0x1, + RTT_PEER_STA = 0x2, + RTT_PEER_P2P_GO = 0x3, + RTT_PEER_P2P_CLIENT = 0x4, + RTT_PEER_NAN = 0x5 +} rtt_peer_type; + +/** RTT Measurement Bandwidth */ +typedef enum { + WIFI_RTT_BW_5 = 0x01, + WIFI_RTT_BW_10 = 0x02, + WIFI_RTT_BW_20 = 0x04, + WIFI_RTT_BW_40 = 0x08, + WIFI_RTT_BW_80 = 0x10, + WIFI_RTT_BW_160 = 0x20 +} wifi_rtt_bw; + +/** RTT Type */ +typedef enum { + RTT_TYPE_1_SIDED = 0x1, + RTT_TYPE_2_SIDED = 0x2, +} wifi_rtt_type; + +/** RTT configuration */ +typedef struct { + /** peer device mac address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** 1-sided or 2-sided RTT */ + wifi_rtt_type type; + /** optional - peer device hint (STA, P2P, AP) */ + rtt_peer_type peer; + /** Required for STA-AP mode, optional for P2P, NBD etc. */ + wifi_channel_info channel; + /** Time interval between bursts (units: 100 ms). + * Applies to 1-sided and 2-sided RTT multi-burst requests. + * Range: 0-31, 0: no preference by initiator (2-sided RTT) */ + t_u32 burst_period; + /** Total number of RTT bursts to be executed. It will be + * specified in the same way as the parameter "Number of + * Burst Exponent" found in the FTM frame format. It + * applies to both: 1-sided RTT and 2-sided RTT. Valid + * values are 0 to 15 as defined in 802.11mc std. + * 0 means single shot + * The implication of this parameter on the maximum + * number of RTT results is the following: + * for 1-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst) + * for 2-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst - 1) */ + t_u32 num_burst; + /** num of frames per burst. Minimum value = 1, Maximum value = 31 + * For 2-sided this equals the number of FTM frames to be attempted in a + * single burst. This also equals the number of FTM frames that the + * initiator will request that the responder send in a single frame. */ + t_u32 num_frames_per_burst; + /** number of retries for a failed RTT frame. Applies + * to 1-sided RTT only. Minimum value = 0, Maximum value = 3 */ + t_u32 num_retries_per_rtt_frame; + + /** following fields are only valid for 2-side RTT */ + /** Maximum number of retries that the initiator can retry an FTMR + * frame. Minimum value = 0, Maximum value = 3 */ + t_u32 num_retries_per_ftmr; + /** 1: request LCI, 0: do not request LCI */ + t_u8 LCI_request; + /** 1: request LCR, 0: do not request LCR */ + t_u8 LCR_request; + /** Applies to 1-sided and 2-sided RTT. Valid values will + * be 2-11 and 15 as specified by the 802.11mc std for + * the FTM parameter burst duration. In a multi-burst + * request, if responder overrides with larger value, + * the initiator will return failure. In a single-burst + * request if responder overrides with larger value, + * the initiator will sent TMR_STOP to terminate RTT + * at the end of the burst_duration it requested. */ + t_u32 burst_duration; + /** RTT preamble to be used in the RTT frames */ + wifi_preamble preamble; + /** RTT BW to be used in the RTT frames */ + wifi_rtt_bw bw; +} wifi_rtt_config; + +/** Format of information elements found in the beacon */ +typedef struct { + /** element identifier */ + t_u8 id; + /** number of bytes to follow */ + t_u8 len; + t_u8 data[]; +} wifi_information_element; + +/** RTT results */ +typedef struct { + /** device mac address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** burst number in a multi-burst request */ + t_u32 burst_num; + /** Total RTT measurement frames attempted */ + t_u32 measurement_number; + /** Total successful RTT measurement frames */ + t_u32 success_number; + /** Maximum number of "FTM frames per burst" supported by + * the responder STA. Applies to 2-sided RTT only. + * If reponder overrides with larger value: + * - for single-burst request initiator will truncate the + * larger value and send a TMR_STOP after receiving as + * many frames as originally requested. + * - for multi-burst request, initiator will return + * failure right away */ + t_u8 number_per_burst_peer; + /** ranging status */ + wifi_rtt_status status; + /** When status == RTT_STATUS_FAIL_BUSY_TRY_LATER, + * this will be the time provided by the responder as to + * when the request can be tried again. Applies to 2-sided + * RTT only. In sec, 1-31sec. */ + t_u8 retry_after_duration; + /** RTT type */ + wifi_rtt_type type; + /** average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB */ + int rssi; + /** rssi spread in 0.5 dB steps e.g. 5 implies 2.5 dB spread (optional) + */ + int rssi_spread; + /** 1-sided RTT: TX rate of RTT frame. + * 2-sided RTT: TX rate of initiator's Ack in response to FTM frame. */ + wifi_rate tx_rate; + /** 1-sided RTT: TX rate of Ack from other side. + * 2-sided RTT: TX rate of FTM frame coming from responder. */ + wifi_rate rx_rate; + /** round trip time in picoseconds */ + t_s64 rtt; + /** rtt standard deviation in picoseconds */ + t_s64 rtt_sd; + /** difference between max and min rtt times recorded in picoseconds */ + t_s64 rtt_spread; + /** distance in mm (optional) */ + int distance_mm; + /** standard deviation in mm (optional) */ + int distance_sd_mm; + /** difference between max and min distance recorded in mm (optional) */ + int distance_spread_mm; + /** time of the measurement (in microseconds since boot) */ + t_s64 ts; + /** in ms, actual time taken by the FW to finish one burst + * measurement. Applies to 1-sided and 2-sided RTT. */ + int burst_duration; + /** Number of bursts allowed by the responder. Applies + * to 2-sided RTT only. */ + int negotiated_burst_num; + /** for 11mc only */ + wifi_information_element *LCI; + /** for 11mc only */ + wifi_information_element *LCR; +} wifi_rtt_result; + +/** Preamble definition for bit mask used in wifi_rtt_capabilities */ +#define PREAMBLE_LEGACY 0x1 +#define PREAMBLE_HT 0x2 +#define PREAMBLE_VHT 0x4 + +/** BW definition for bit mask used in wifi_rtt_capabilities */ +#define BW_5_SUPPORT 0x1 +#define BW_10_SUPPORT 0x2 +#define BW_20_SUPPORT 0x4 +#define BW_40_SUPPORT 0x8 +#define BW_80_SUPPORT 0x10 +#define BW_160_SUPPORT 0x20 + +/** RTT Capabilities */ +typedef struct { + /** if 1-sided rtt data collection is supported */ + t_u8 rtt_one_sided_supported; + /** if ftm rtt data collection is supported */ + t_u8 rtt_ftm_supported; + /** if initiator supports LCI request. Applies to 2-sided RTT */ + t_u8 lci_support; + /** if initiator supports LCR request. Applies to 2-sided RTT */ + t_u8 lcr_support; + /** bit mask indicates what preamble is supported by initiator */ + t_u8 preamble_support; + /** bit mask indicates what BW is supported by initiator */ + t_u8 bw_support; + /** if 11mc responder mode is supported */ + t_u8 responder_supported; + /** draft 11mc spec version supported by chip. For instance, + * version 4.0 should be 40 and version 4.3 should be 43 etc. */ + t_u8 mc_version; +} wifi_rtt_capabilities; + +/** API for setting LCI/LCR information to be provided to a requestor */ +typedef enum { + /** Not expected to change location */ + WIFI_MOTION_NOT_EXPECTED = 0, + /** Expected to change location */ + WIFI_MOTION_EXPECTED = 1, + /** Movement pattern unknown */ + WIFI_MOTION_UNKNOWN = 2, +} wifi_motion_pattern; + +/** LCI information */ +typedef struct { + /** latitude in degrees * 2^25 , 2's complement */ + long latitude; + /** latitude in degrees * 2^25 , 2's complement */ + long longitude; + /** Altitude in units of 1/256 m */ + int altitude; + /** As defined in Section 2.3.2 of IETF RFC 6225 */ + t_u8 latitude_unc; + /** As defined in Section 2.3.2 of IETF RFC 6225 */ + t_u8 longitude_unc; + /** As defined in Section 2.4.5 from IETF RFC 6225: */ + t_u8 altitude_unc; + /** Following element for configuring the Z subelement */ + wifi_motion_pattern motion_pattern; + /** floor in units of 1/16th of floor. 0x80000000 if unknown. */ + int floor; + /** in units of 1/64 m */ + int height_above_floor; + /** in units of 1/64 m. 0 if unknown */ + int height_unc; +} wifi_lci_information; + +/** LCR information */ +typedef struct { + /** country code */ + char country_code[2]; + /** length of the info field */ + int length; + /** Civic info to be copied in FTM frame */ + char civic_info[256]; +} wifi_lcr_information; + +/** + * RTT Responder information + */ +typedef struct { + wifi_channel_info channel; + wifi_preamble preamble; +} wifi_rtt_responder; + +/** =========== Define Copied from HAL END =========== */ + +#define MAX_RTT_CONFIG_NUM 10 + +/** RTT config params */ +typedef struct wifi_rtt_config_params { + t_u8 rtt_config_num; + wifi_rtt_config rtt_config[MAX_RTT_CONFIG_NUM]; +} wifi_rtt_config_params_t; + +#define OID_RTT_REQUEST 0 +#define OID_RTT_CANCEL 1 + +/** Pass RTT result element between mlan and moal */ +typedef struct { + /** element identifier */ + t_u16 id; + /** number of bytes to follow */ + t_u16 len; + /** data: fill with one wifi_rtt_result */ + t_u8 data[]; +} wifi_rtt_result_element; + /** station stats */ typedef struct _sta_stats { /** last_rx_in_msec */ @@ -2351,6 +2674,8 @@ typedef struct _mlan_device { t_u8 ext_scan; /* mcs32 setting */ t_u8 mcs32; + /** second mac flag */ + t_u8 second_mac; } mlan_device, *pmlan_device; /** MLAN API function prototype */ diff --git a/mxm_wifiex/wlan_src/mlan/mlan_fw.h b/mxm_wifiex/wlan_src/mlan/mlan_fw.h index ccb2204..fe66b5d 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_fw.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_fw.h @@ -5,7 +5,7 @@ * in MLAN module. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -248,14 +248,14 @@ typedef enum _KEY_INFO_WAPI { #define MRVDRV_SNAP_HEADER_LEN 8 /** The number of times to try when polling for status bits */ -#define MAX_POLL_TRIES 300 +#define MAX_POLL_TRIES 100 /** The number of times to try when waiting for downloaded firmware to become active when multiple interface is present */ #define MAX_MULTI_INTERFACE_POLL_TRIES 150 /** The number of times to try when waiting for downloaded firmware to become active. (polling the scratch register). */ -#define MAX_FIRMWARE_POLL_TRIES 100 +#define MAX_FIRMWARE_POLL_TRIES 300 /** FW fill in rx_len with extra 204 bytes */ #define EXTRA_LEN 256 @@ -708,6 +708,9 @@ typedef enum _WLAN_802_11_WEP_STATUS { /** DevMCSSupported : Rx MCS supported */ #define GET_RXMCSSUPP(DevMCSSupported) (DevMCSSupported & 0x0f) +/** hw_dev_cap : MPDU DENSITY */ +#define GET_MPDU_DENSITY(hw_dev_cap) (hw_dev_cap & 0x7) + /** GET HTCapInfo : Supported Channel BW */ #define GETHT_SUPPCHANWIDTH(HTCapInfo) (HTCapInfo & MBIT(1)) /** GET HTCapInfo : Support for Greenfield */ @@ -889,7 +892,14 @@ typedef enum _WLAN_802_11_WEP_STATUS { #define SET_EXTCAP_TWT_REQ(ext_cap) (ext_cap.TWTReq = 1) /** ExtCap : ReSet support Ext TWT REQ */ #define RESET_EXTCAP_TWT_REQ(ext_cap) (ext_cap.TWTReq = 0) +/** ExtCap : Support for Beacon Protection */ +#define ISSUPP_EXTCAP_EXT_BEACON_PROT(ext_cap) (ext_cap.beacon_prot) +/** ExtCap : Set support Beacon Protection */ +#define SET_EXTCAP_BEACON_PROT(ext_cap) (ext_cap.beacon_prot = 1) +/** ExtCap : Set FTMI bit(bit 71) */ +#define SET_EXTCAP_FTMI(ext_cap) (ext_cap.FTMI = 1) +#define SET_EXTCAP_INTERNETWORKING(ext_cap) (ext_cap.Interworking = 1) /** LLC/SNAP header len */ #define LLC_SNAP_LEN 8 @@ -1368,6 +1378,9 @@ typedef enum _WLAN_802_11_WEP_STATUS { #define HostCmd_CMD_802_11_STATS 0x0014 #define HostCmd_CMD_GET_CH_LOAD 0x027b +/** Host Command ID: CROSS CHIP SYNCH */ +#define HostCmd_CMD_CROSS_CHIP_SYNCH 0x027d + /** Host Command ID : TDLS configuration */ #define HostCmd_CMD_TDLS_CONFIG 0x0100 /** Host Command ID : TDLS operation */ @@ -1678,9 +1691,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_He_Op_t { /** Host Command ID : GPIO independent reset configure */ #define HostCmd_CMD_INDEPENDENT_RESET_CFG 0x0243 -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) /* TLV type: reg type */ #define TLV_TYPE_REG_ACCESS_CTRL (PROPRIETARY_TLV_BASE_ID + 0x13C) /* 0x023c*/ /** MrvlIEtypes_Reg_type_t*/ @@ -1690,7 +1700,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Reg_type_t { /** type: 0x81/0x82/0x83 */ t_u8 type; } MLAN_PACK_END MrvlIEtypes_Reg_type_t; -#endif /** use to query chan region cfg setting in firmware */ #define HostCmd_CMD_CHAN_REGION_CFG 0x0242 /** used in hostcmd to download region power cfg setting to firmware */ @@ -1755,6 +1764,17 @@ typedef MLAN_PACK_START struct _power_table_attr { #define HostCmd_CMD_TX_AMPDU_PROT_MODE 0x0263 #define HostCmd_CMD_RATE_ADAPT_CFG 0x0264 #define HostCmd_CMD_CCK_DESENSE_CFG 0x0265 +#define HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS 0x024d +#define HostCmd_CMD_FTM_SESSION_CTRL 0x024e +#define HostCmd_CMD_FTM_FEATURE_CTRL 0x024f +#define HostCmd_CMD_WLS_REQ_FTM_RANGE 0x0250 + +#define HostCmd_CMD_FTM_CONFIG_RESPONDER 0x0255 +#define HostCmd_ACT_RTT_GET_RSP_INFO 0x0000 +#define HostCmd_ACT_RTT_SET_RSP_EN 0x0001 +#define HostCmd_ACT_RTT_SET_RSP_DIS 0x0002 +#define HostCmd_ACT_RTT_SET_RSP_LCI 0x0003 +#define HostCmd_ACT_RTT_SET_RSP_LCR 0x0004 #define HostCmd_CMD_VDLL 0x0240 #if defined(PCIE) @@ -1783,7 +1803,7 @@ typedef MLAN_PACK_START struct _power_table_attr { /** Host Command ID : IPS Config */ #define HostCmd_CMD_IPS_CONFIG 0x0279 - +#define HostCmd_CMD_OFDM_DESENSE_CFG 0x027f typedef MLAN_PACK_START struct { t_u32 enable; } MLAN_PACK_END HostCmd_DS_IPS_CONFIG; @@ -2088,6 +2108,14 @@ typedef enum _ENH_PS_MODES { #define EVENT_ROAM_OFFLOAD 0x00000083 +#define EVENT_WLS_FTM_COMPLETE 0x00000086 + +#define WLS_SUB_EVENT_FTM_COMPLETE 0 +#define WLS_SUB_EVENT_RADIO_RECEIVED 1 +#define WLS_SUB_EVENT_RADIO_RPT_RECEIVED 2 +#define WLS_SUB_EVENT_ANQP_RESP_RECEIVED 3 +#define WLS_SUB_EVENT_RTT_RESULTS 4 + #define EVENT_EXCEED_MAX_P2P_CONN 0x00000089 #if defined(PCIE) @@ -2275,6 +2303,8 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_TDLS_Idle_Timeout_t { #define RXPD_CHAN_MASK 0x3FE0 /** Rate control mask 15-23 */ #define TXPD_RATE_MASK 0xff8000 +/** DCM at bit 16 */ +#define RXPD_DCM_MASK 0x10000 /** enable bw ctrl in TxPD */ #define TXPD_BW_ENABLE MBIT(20) /** enable tx power ctrl in TxPD */ @@ -2604,8 +2634,8 @@ typedef MLAN_PACK_START struct _parsed_region_chan_11d { /** ChanScanMode_t */ typedef MLAN_PACK_START struct _ChanScanMode_t { #ifdef BIG_ENDIAN_SUPPORT - /** Reserved */ - t_u8 reserved_7 : 1; + /** rnr_flag, host use only */ + t_u8 rnr_flag : 1; /** First passive scan then active scan */ t_u8 passive_to_active_scan : 1; /** First channel in scan */ @@ -2635,8 +2665,8 @@ typedef MLAN_PACK_START struct _ChanScanMode_t { t_u8 first_chan : 1; /** First passive scan then active scan */ t_u8 passive_to_active_scan : 1; - /** Reserved */ - t_u8 reserved_7 : 1; + /** rnr_flag, host use only */ + t_u8 rnr_flag : 1; #endif } MLAN_PACK_END ChanScanMode_t; @@ -3063,6 +3093,7 @@ typedef MLAN_PACK_START struct _MrvlIEtype_KeyParamSetV2_t { wapi_param wapi; /** IGTK key param */ cmac_aes_param cmac_aes; + gmac_aes_256_param gmac_aes; /** gcmp key param */ gcmp_param gcmp; /** ccmp 256 key parameters */ @@ -3525,8 +3556,8 @@ typedef MLAN_PACK_START struct _HostCmd_DS_GET_HW_SPEC { t_u16 number_of_antenna; /** FW release number, example 0x1234=1.2.3.4 */ t_u32 fw_release_number; - /** Reserved field */ - t_u32 reserved_1; + /** hw dev cap */ + t_u32 hw_dev_cap; /** Reserved field */ t_u32 reserved_2; /** Reserved field */ @@ -3666,7 +3697,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_GET_CH_LOAD { t_s16 noise; t_u16 rx_quality; t_u16 duration; - t_u16 cca_th; } MLAN_PACK_END HostCmd_DS_GET_CH_LOAD; /** HostCmd_DS_CMD_802_11_RSSI_INFO */ @@ -4747,6 +4777,22 @@ typedef MLAN_PACK_START struct _HostCmd_DS_GPIO_TSF_LATCH_PARAM_CONFIG { t_u8 tlv_buf[]; } MLAN_PACK_END HostCmd_DS_GPIO_TSF_LATCH_PARAM_CONFIG; +/** MrvlIEtypes_CROSS_CHIP_SYNCH_CONFIG */ +typedef MLAN_PACK_START struct _HostCmd_DS_CROSS_CHIP_SYNCH { + /** Action 0-GET, 1-SET */ + t_u16 action; + /**cross chip sync start/stop */ + t_u8 start_stop; + /**cross chip synch role, master or slave */ + t_u8 role; + /**cross chip synch periodicty of toggle in us */ + t_u32 period; + /**cross chip synch initial TSF low */ + t_u32 init_tsf_low; + /**cross chip synch intial TSF high */ + t_u32 init_tsf_high; +} MLAN_PACK_END HostCmd_DS_CROSS_CHIP_SYNCH; + MLAN_PACK_START struct coalesce_filt_field_param { t_u8 operation; t_u8 operand_len; @@ -5287,6 +5333,16 @@ typedef struct MLAN_PACK_START _hostcmd_twt_teardown { t_u8 reserved[3]; } MLAN_PACK_END hostcmd_twt_teardown, *phostcmd_twt_teardown; +/** Type definition of hostcmd_twt_report */ +typedef MLAN_PACK_START struct _hostcmd_twt_report { + /** TWT report type, 0: BTWT id */ + t_u8 type; + /** TWT report length of value in data */ + t_u8 length; + t_u8 reserve[2]; + /** TWT report payload for FW response to fill */ + t_u8 data[36]; +} MLAN_PACK_END hostcmd_twt_report, *phostcmd_twt_report; /** HostCmd_DS_TWT_CFG */ typedef MLAN_PACK_START struct _HostCmd_DS_TWT_CFG { /** Action */ @@ -5300,6 +5356,8 @@ typedef MLAN_PACK_START struct _HostCmd_DS_TWT_CFG { /** TWT Teardown config for Sub ID: MLAN_11AX_TWT_TEARDOWN_SUBID */ hostcmd_twt_teardown twt_teardown; + /** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */ + hostcmd_twt_report twt_report; } param; } MLAN_PACK_END HostCmd_DS_TWT_CFG; @@ -5535,6 +5593,16 @@ typedef MLAN_PACK_START struct _MrvlIETypes_SuppOperClass_t { t_u8 oper_class[1]; } MLAN_PACK_END MrvlIETypes_SuppOperClass_t; +/* Supported Transmit Power Envelope Element */ +typedef MLAN_PACK_START struct { + /** Header */ + MrvlIEtypesHeader_t header; + /** Transmit Power Information */ + t_u8 tpc_info; + /** Maximum Transmit Power Spectral Density */ + t_u8 max_tp_spectral_density; +} MLAN_PACK_END MrvlIETypes_TpcEnvelope_t; + /** Oper_class channel bandwidth element */ typedef MLAN_PACK_START struct _MrvlIEtypes_chan_bw_oper_t { /** Header */ @@ -7790,6 +7858,22 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Keep_Alive_Pkt_t { t_u8 ip_packet[]; } MLAN_PACK_END MrvlIEtypes_Keep_Alive_Pkt_t; +#define OID_CLOUD_KEEP_ALIVE_ACK 1 +#define TLV_TYPE_CLOUD_KEEP_ALIVE_ACK \ + (PROPRIETARY_TLV_BASE_ID + 0x15D) /* 0x0100 + 349 */ + +typedef MLAN_PACK_START struct _MrvlIEtypes_Cloud_Keep_Alive_Rx_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** ID for cloud keep alive */ + t_u8 keep_alive_id; + /** Enable/disable for this ID */ + t_u8 enable; + /** Ethernet Header */ + Eth803Hdr_t eth_header; + /** packet buffer*/ + t_u8 ip_packet[]; +} MLAN_PACK_END MrvlIEtypes_Cloud_Keep_Alive_Rx_t; /** TLV to indicate firmware only keep probe response while scan */ #define TLV_TYPE_ONLYPROBERESP (PROPRIETARY_TLV_BASE_ID + 0xE9) /* 0x01E9 */ typedef MLAN_PACK_START struct _MrvlIEtypes_OnlyProberesp_t { @@ -7799,6 +7883,230 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_OnlyProberesp_t { t_u8 proberesp_only; } MLAN_PACK_END MrvlIEtypes_OnlyProberesp_t; +/** TLV for RTT Range Request */ +#define TLV_TYPE_RTT_RANGE_REQUEST \ + (PROPRIETARY_TLV_BASE_ID + 0x125) /* 0x0100 + 0x125 */ +typedef MLAN_PACK_START struct _MrvlIEtypes_RTTRangeRequest_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** Peer device MAC address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** 1-sided or 2-sided RTT */ + t_u8 type; + /** peer device hint (STA, P2P, AP) */ + t_u8 peer; + /** channel number */ + t_u8 channel; + /** Band Config */ + Band_Config_t bandcfg; + /** Time interval between bursts (units: 100 ms) */ + t_u8 burst_period; + /** Total number of RTT bursts to be executed. */ + t_u8 num_burst; + /** num of frames per burst. */ + t_u8 num_frames_per_burst; + /** number of retries for a failed RTT frame. */ + t_u8 num_retries_per_rtt_frame; + /** Maximum number of retries that the initiator can retry an FTMR + * frame. */ + t_u8 num_retries_per_ftmr; + /** LCI request */ + t_u8 LCI_request; + /** LCR request */ + t_u8 LCR_request; + /** burst duration */ + t_u8 burst_duration; + /** RTT preamble to be used in the RTT frames */ + t_u8 preamble; + /** RTT BW to be used in the RTT frames */ + t_u8 bw; +} MLAN_PACK_END MrvlIEtypes_RTTRangeRequest_t; + +/** TLV for RTT Range Cancel */ +#define TLV_TYPE_RTT_RANGE_CANCEL \ + (PROPRIETARY_TLV_BASE_ID + 0x126) /* 0x0100 + 0x126 */ +typedef MLAN_PACK_START struct _MrvlIEtypes_RTTRangeCancel_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** Peer device MAC address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; +} MLAN_PACK_END MrvlIEtypes_RTTRangeCancel_t; + +typedef MLAN_PACK_START struct _HostCmd_DS_FTM_CONFIG_SESSION_PARAMS { + /** Action */ + t_u16 action; + /** TLV buffer */ + /** MrvlIEtypes_RTTRangeRequest_t */ + /** MrvlIEtypes_RTTRangeCancel_t */ + t_u8 tlv_buffer[]; +} MLAN_PACK_END HostCmd_DS_FTM_CONFIG_SESSION_PARAMS; + +typedef MLAN_PACK_START struct _WLS_Sub_Event_RTTResults_t { + /** complete */ + t_u8 complete; + /** tlv buffer */ + /** MrvlIEtypes_RTTResult_t */ + t_u8 tlv_buffer[]; +} MLAN_PACK_END WLS_SUB_EVENT_RTTResults_t; + +/** TLV for RTT Result */ +#define TLV_TYPE_RTT_RESULT \ + (PROPRIETARY_TLV_BASE_ID + 0x127) /* 0x0100 + 0x127 */ +typedef MLAN_PACK_START struct _MrvlIEtypes_RTTResult_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** Peer device MAC address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** burst number in a multi-burst request */ + t_u32 burst_num; + /** Total RTT measurement frames attempted */ + t_u32 measurement_number; + /** Total successful RTT measurement frames */ + t_u32 success_number; + /** Maximum number of "FTM frames per burst" supported by the responder + * STA. */ + t_u8 number_per_burst_peer; + /** ranging status */ + t_u8 status; + /** The time provided by the responder when the request can be tried + * again. */ + t_u8 retry_after_duration; + /** RTT type */ + t_u8 type; + /** average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB */ + t_s32 rssi; + /** rssi spread in 0.5 dB steps e.g. 5 implies 2.5 dB spread (optional) + */ + t_s32 rssi_spread; + /** TX rate */ + mlan_wifi_rate tx_rate; + /** RX rate */ + mlan_wifi_rate rx_rate; + /** round trip time in picoseconds */ + t_s64 rtt; + /** rtt standard deviation in picoseconds */ + t_s64 rtt_sd; + /** difference between max and min rtt times recorded in picoseconds */ + t_s64 rtt_spread; + /** distance in mm (optional) */ + t_s32 distance_mm; + /** standard deviation in mm (optional) */ + t_s32 distance_sd_mm; + /** difference between max and min distance recorded in mm (optional) */ + t_s32 distance_spread_mm; + /** time of the measurement (in microseconds since boot) */ + t_s64 ts; + /** in ms, actual time taken by the FW to finish one burst */ + t_s32 burst_duration; + /** Number of bursts allowed by the responder. */ + t_s32 negotiated_burst_num; + /** tlv buffer */ + t_u8 tlv_buffer[]; +} MLAN_PACK_END MrvlIEtypes_RTTResult_t; + +/** TLV for IEEEI IE */ +typedef MLAN_PACK_START struct _MrvlIEtypes_IEEEIE_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** data */ + t_u8 data[]; +} MLAN_PACK_END MrvlIEtypes_IEEEIE_t; + +/** auto link switch network info */ +typedef MLAN_PACK_START struct _Event_WLS_FTM_t { + /** Event ID */ + t_u16 event_id; + /** BSS index number for multiple BSS support */ + t_u8 bss_index; + /** BSS type */ + t_u8 bss_type; + /** sub event id */ + t_u8 sub_event_id; + union { + /** RTT Results Sub Event */ + WLS_SUB_EVENT_RTTResults_t rtt_results; + } u; +} MLAN_PACK_END Event_WLS_FTM_t; + +typedef MLAN_PACK_START struct _HostCmd_DS_FTM_CONFIG_RESPONDER { + /** Action */ + t_u16 action; + /** TLV buffer */ + /** MrvlIEtypes_RTTResponderInfo_t */ + /** MrvlIEtypes_RTTResponderEnCfg_t */ + t_u8 tlv_buffer[]; +} MLAN_PACK_END HostCmd_DS_FTM_CONFIG_RESPONDER; + +/** TLV for RTTResponderInfo */ +#define TLV_TYPE_RTT_RESPONDER_INFO \ + (PROPRIETARY_TLV_BASE_ID + 0x128) /* 0x0100 + 0x128 */ +typedef MLAN_PACK_START struct _MrvlIEtypes_RTTResponderInfo_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** channel */ + t_u8 channel; + /** bandcfg */ + Band_Config_t bandcfg; + /** bandcfg */ + t_u8 preamble; +} MLAN_PACK_END MrvlIEtypes_RTTResponderInfo_t; + +/** TLV for RTTResponderEnCfg */ +#define TLV_TYPE_RTT_RESPONDER_EN_CFG \ + (PROPRIETARY_TLV_BASE_ID + 0x129) /* 0x0100 + 0x129 */ +typedef MLAN_PACK_START struct _MrvlIEtypes_RTTResponderEnCfg_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** channel */ + t_u8 channel; + /** bandcfg */ + Band_Config_t bandcfg; + /** bandcfg */ + t_u32 max_duration_seconds; +} MLAN_PACK_END MrvlIEtypes_RTTResponderEnCfg_t; + +/** TLV for RTTLCICfg */ +#define TLV_TYPE_RTT_LCI_CFG \ + (PROPRIETARY_TLV_BASE_ID + 0x12A) /* 0x0100 + 0x12A */ +typedef MLAN_PACK_START struct _MrvlIEtypes_RTTLCICfg_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** latitude */ + t_u64 latitude; + /** longitude */ + t_u64 longitude; + /** altitude */ + t_u32 altitude; + /** latitude_unc */ + t_u8 latitude_unc; + /** longitude_unc */ + t_u8 longitude_unc; + /** altitude_unc */ + t_u8 altitude_unc; + /** motion_pattern */ + t_u8 motion_pattern; + /** floor */ + t_u32 floor; + /** height_above_floor */ + t_u32 height_above_floor; + /** height_unc */ + t_u32 height_unc; +} MLAN_PACK_END MrvlIEtypes_RTTLCICfg_t; + +/** TLV for RTTLCRCfg */ +#define TLV_TYPE_RTT_LCR_CFG \ + (PROPRIETARY_TLV_BASE_ID + 0x12B) /* 0x0100 + 0x12B */ +typedef MLAN_PACK_START struct _MrvlIEtypes_RTTLCRCfg_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** country_code */ + char country_code[2]; + /** length of the info field */ + t_u32 length; + /** Civic info to be copied in FTM frame */ + char civic_info[256]; +} MLAN_PACK_END MrvlIEtypes_RTTLCRCfg_t; + #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) #define HostCmd_CMD_CRYPTO 0x025e @@ -7942,6 +8250,16 @@ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_RX_ABORT_CFG { /** rx weak rssi pkt threshold */ t_s8 rssi_threshold; } MLAN_PACK_END HostCmd_DS_CMD_RX_ABORT_CFG; + +/** HostCmd_CMD_OFDM_DESENSE_CFG */ +typedef MLAN_PACK_START struct _HostCmd_DS_CMD_OFDM_DESENSE_CFG { + /** Action */ + t_u16 action; + /** Enable/disable cca desense on pkt */ + t_u8 enable; + /** cca pkt threshold */ + t_s8 cca_threshold; +} MLAN_PACK_END HostCmd_DS_CMD_OFDM_DESENSE_CFG; /** HostCmd_CMD_RX_ABORT_CFG_EXT */ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_RX_ABORT_CFG_EXT { /** Action */ @@ -7952,6 +8270,14 @@ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_RX_ABORT_CFG_EXT { t_s8 rssi_margin; /** specify ceil rssi threshold */ t_s8 ceil_rssi_threshold; + /** specify floor rssi threshold */ + t_s8 floor_rssi_threshold; + /** current dynamic rssi threshold */ + t_s8 current_dynamic_rssi_threshold; + /** rssi config: default or user configured */ + t_u8 rssi_default_config; + /** EDMAC status */ + t_u8 edmac_enable; } MLAN_PACK_END HostCmd_DS_CMD_RX_ABORT_CFG_EXT; /** HostCmd_CMD_ARB_CONFIG */ @@ -8247,6 +8573,8 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { HostCmd_DS_ROAM_OFFLOAD roam_offload; HostCmd_DS_CHAN_REGION_CFG reg_cfg; HostCmd_DS_AUTO_TX auto_tx; + HostCmd_DS_FTM_CONFIG_SESSION_PARAMS ftm_config; + HostCmd_DS_FTM_CONFIG_RESPONDER ftm_rtt_responder; HostCmd_DS_DYN_BW dyn_bw; HostCmd_DS_802_11_ROBUSTCOEX robustcoexparams; HostCmd_DS_DMCS_CFG dmcs; @@ -8273,6 +8601,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { HostCmd_DS_TWT_CFG twtcfg; HostCmd_DS_CMD_RX_ABORT_CFG rx_abort_cfg; + HostCmd_DS_CMD_OFDM_DESENSE_CFG ofdm_desense_cfg; HostCmd_DS_CMD_RX_ABORT_CFG_EXT rx_abort_cfg_ext; HostCmd_DS_CMD_TX_AMPDU_PROT_MODE tx_ampdu_prot_mode; HostCmd_DS_CMD_RATE_ADAPT_CFG rate_adapt_cfg; @@ -8294,6 +8623,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { HostCmd_DS_MC_AGGR_CFG mc_aggr_cfg; HostCmd_DS_STATS stats; HostCmd_DS_GET_CH_LOAD ch_load; + HostCmd_DS_CROSS_CHIP_SYNCH cross_chip_synch; } params; } MLAN_PACK_END HostCmd_DS_COMMAND, *pHostCmd_DS_COMMAND; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_ieee.h b/mxm_wifiex/wlan_src/mlan/mlan_ieee.h index cf2ef85..e0a73ad 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_ieee.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_ieee.h @@ -4,7 +4,7 @@ * definitions used in MLAN and MOAL module. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -48,7 +48,7 @@ typedef enum _WLAN_802_11_NETWORK_TYPE { #ifdef BIG_ENDIAN_SUPPORT /** Frame control: Type Mgmt frame */ -#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x3000 +#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x0c00 /** Frame control: SubType Mgmt frame */ #define IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(fc) (((fc)&0xF000) >> 12) #else @@ -90,6 +90,8 @@ typedef MLAN_PACK_START enum _IEEEtypes_ElementId_e { EXTEND_CHANNEL_SWITCH_ANN = 60, QUIET = 40, IBSS_DFS = 41, + MEASUREMENT_REQUEST = 38, + MEASUREMENT_REPORT = 39, SUPPORTED_CHANNELS = 36, REGULATORY_CLASS = 59, HT_CAPABILITY = 45, @@ -177,6 +179,33 @@ typedef MLAN_PACK_START struct _IEEEtypes_Generic_t { t_u8 data[IEEE_MAX_IE_SIZE - sizeof(IEEEtypes_Header_t)]; } MLAN_PACK_END IEEEtypes_Generic_t, *pIEEEtypes_Generic_t; +#define MEASURE_TYPE_CLI 8 +#define MEASURE_TYPE_LOCATION_CIVIC 9 + +/** Measurement Report IE */ +typedef MLAN_PACK_START struct _IEEEtypes_MeasurementReport_t { + /** Generic IE header */ + IEEEtypes_Header_t ieee_hdr; + /** Measurement Token */ + t_u8 ms_token; + /** Measurement Report Mode */ + t_u8 ms_rp_mode; + /** Measurement Type, value in MEASURE_TYPE_XXX */ + t_u8 ms_type; + /** variable */ + t_u8 variable[]; +} MLAN_PACK_END IEEEtypes_MeasurementReport_t; + +/** Report */ +typedef MLAN_PACK_START struct _IEEEtypes_Report_t { + /** Subelement ID */ + t_u8 subelement_id; + /** length */ + t_u8 length; + /** variable */ + t_u8 variable[]; +} MLAN_PACK_END IEEEtypes_Report_t; + /**ft capability policy*/ typedef MLAN_PACK_START struct _IEEEtypes_FtCapPolicy_t { #ifdef BIG_ENDIAN_SUPPORT @@ -1718,8 +1747,8 @@ typedef MLAN_PACK_START struct _wlan_user_scan_chan { t_u8 radio_type; /** Scan type: Active = 1, Passive = 2 */ t_u8 scan_type; - /** Reserved */ - t_u8 reserved; + /** rnr_flag */ + t_u8 rnr_flag; /** Scan duration in milliseconds; if 0 default used */ t_u32 scan_time; } MLAN_PACK_END wlan_user_scan_chan; @@ -1834,11 +1863,14 @@ typedef MLAN_PACK_START struct { #define BG_SCAN_SSID_RSSI_MATCH 0x0004 /**wait for all channel scan to complete to report scan result*/ #define BG_SCAN_WAIT_ALL_CHAN_DONE 0x80000000 -/** Maximum number of channels that can be sent in bg scan config */ -#define CHAN_MAX_24G 14 -#define CHAN_MAX_5G 24 -#define CHAN_MAX_UNII4 3 -#define WLAN_BG_SCAN_CHAN_MAX (CHAN_MAX_24G + CHAN_MAX_5G + CHAN_MAX_UNII4) + +#define CHAN_MAX_6G 0 + +/** max bgscan chan number */ +#define WLAN_BG_SCAN_CHAN_MAX 38 + +/** max bgscan chan number, include UNII_4 channel */ +#define WLAN_BG_SCAN_CHAN_MAX_UNII_4 41 /** Enumeration definition */ /** EES MODE */ @@ -1906,7 +1938,7 @@ typedef MLAN_PACK_START struct { /** SSID filter list used in the to limit the scan results */ wlan_user_scan_ssid ssid_list[MRVDRV_MAX_SSID_LIST_LENGTH]; /** Variable number (fixed maximum) of channels to scan up */ - wlan_user_scan_chan chan_list[WLAN_BG_SCAN_CHAN_MAX]; + wlan_user_scan_chan chan_list[WLAN_USER_SCAN_CHAN_MAX]; /** scan channel gap */ t_u16 scan_chan_gap; /** Enable EES configuration */ diff --git a/mxm_wifiex/wlan_src/mlan/mlan_init.c b/mxm_wifiex/wlan_src/mlan/mlan_init.c index a9fd9cd..38f70f6 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_init.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_init.c @@ -317,6 +317,20 @@ mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter) LEAVE(); return MLAN_STATUS_FAILURE; } + if (pmadapter->callbacks.moal_vmalloc && + pmadapter->callbacks.moal_vfree) + ret = pmadapter->callbacks.moal_vmalloc( + pmadapter->pmoal_handle, buf_size, + (t_u8 **)&pmadapter->pold_chan_stats); + else + ret = pmadapter->callbacks.moal_malloc( + pmadapter->pmoal_handle, buf_size, MLAN_MEM_DEF, + (t_u8 **)&pmadapter->pold_chan_stats); + if (ret != MLAN_STATUS_SUCCESS || !pmadapter->pold_chan_stats) { + PRINTM(MERROR, "Failed to allocate old channel statistics\n"); + LEAVE(); + return MLAN_STATUS_FAILURE; + } #endif /* Allocate command buffer */ @@ -967,13 +981,11 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter) EVT_RW_PTR_ROLLOVER_IND; } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { pmadapter->pcard_pcie->rxbd_wrptr = pmadapter->pcard_pcie->txrx_bd_size; pmadapter->pcard_pcie->evtbd_wrptr = MLAN_MAX_EVT_BD; } -#endif } #endif LEAVE(); @@ -1763,6 +1775,15 @@ t_void wlan_free_adapter(pmlan_adapter pmadapter) (t_u8 *)pmadapter->pchan_stats); pmadapter->pchan_stats = MNULL; } + if (pmadapter->pold_chan_stats) { + if (pcb->moal_vmalloc && pcb->moal_vfree) + pcb->moal_vfree(pmadapter->pmoal_handle, + (t_u8 *)pmadapter->pold_chan_stats); + else + pcb->moal_mfree(pmadapter->pmoal_handle, + (t_u8 *)pmadapter->pold_chan_stats); + pmadapter->pold_chan_stats = MNULL; + } if (pmadapter->bcn_buf) { if (pcb->moal_vmalloc && pcb->moal_vfree) pcb->moal_vfree(pmadapter->pmoal_handle, @@ -2055,11 +2076,16 @@ mlan_status wlan_init_fw_complete(pmlan_adapter pmadapter) /* Reconfigure wmm parameter*/ if (status == MLAN_STATUS_SUCCESS) { pmpriv = wlan_get_priv(pmadapter, MLAN_BSS_ROLE_STA); - if (pmpriv) + if (pmpriv) { status = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_PARAM_CONFIG, HostCmd_ACT_GEN_SET, 0, MNULL, &pmadapter->ac_params); + if (status != MLAN_STATUS_SUCCESS) + PRINTM(MERROR, + "ERR: wlan_prepare_cmd returned status=0x%x\n", + status); + } } /* Invoke callback */ ret = pcb->moal_init_fw_complete(pmadapter->pmoal_handle, status); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h b/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h index 7790db9..062b239 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h @@ -3,7 +3,7 @@ * @brief This file declares the IOCTL data structures and APIs. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -328,6 +328,9 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_ROBUSTCOEX = 0x00200056, MLAN_OID_MISC_GET_TX_RX_HISTOGRAM = 0x00200057, + MLAN_OID_MISC_CONFIG_RTT = 0x00200059, + MLAN_OID_MISC_CANCEL_RTT = 0x0020005A, + MLAN_OID_MISC_RTT_RESPONDER_CFG = 0x0020005B, MLAN_OID_MISC_CFP_INFO = 0x00200060, MLAN_OID_MISC_BOOT_SLEEP = 0x00200061, #if defined(PCIE) @@ -365,6 +368,10 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_CH_LOAD = 0x00200087, MLAN_OID_MISC_STATS = 0x00200088, MLAN_OID_MISC_CH_LOAD_RESULTS = 0x00200089, + MLAN_OID_MISC_CLOUD_KEEP_ALIVE_RX = 0x0020008A, + MLAN_OID_MISC_CROSS_CHIP_SYNCH = 0x0020008B, + MLAN_OID_MISC_RF_TEST_CONFIG_TRIGGER_FRAME = 0x0020008C, + MLAN_OID_MISC_OFDM_DESENSE_CFG = 0x0020008D, }; /** Sub command size */ @@ -1181,6 +1188,11 @@ typedef struct _mlan_uap_scan_channels { #define MAX_NUM_PKTS 9 #define DEF_NUM_PKTS 3 + +/** Default channel mode and retry packets for channel switch */ +#define DEFAULT_RETRY_PKTS 9 +#define DEFAULT_CHAN_MODE_MASK 3 + /** mlan_chan_switch_param */ typedef struct _mlan_action_chan_switch { /** mode*/ @@ -1372,8 +1384,6 @@ enum _mlan_band_def { BAND_AAC = 64, BAND_GAX = 256, BAND_AAX = 512, - MLAN_OID_MISC_RF_TEST_CONFIG_TRIGGER_FRAME = 0x0020008C, - }; /** Channel bandwidth */ @@ -1885,6 +1895,8 @@ typedef struct _mlan_fw_info { t_u32 hw_dot_11n_dev_cap; /** Device support for MIMO abstraction of MCSs */ t_u8 hw_dev_mcs_support; + /** mpdu density */ + t_u8 hw_mpdu_density; /** user's MCS setting */ t_u8 usr_dev_mcs_support; /** 802.11ac device capabilities */ @@ -1927,6 +1939,8 @@ typedef struct _mlan_fw_info { t_u8 prohibit_80mhz; /** FW support beacon protection */ t_u8 fw_beacon_prot; + /** FW RTT support */ + t_u8 rtt_support; /* lower 8 bytes of uuid */ t_u64 uuid_lo; @@ -2548,6 +2562,9 @@ typedef struct _sta_info_data { t_u16 ie_len; } sta_info_data; +/** Per station Maximum IE buffer SIZE */ +#define MAX_STA_LIST_IE_SIZE 13 + /** mlan_ds_sta_list structure for MLAN_OID_UAP_STA_LIST */ typedef struct _mlan_ds_sta_list { /** station count */ @@ -4017,6 +4034,7 @@ typedef struct _mlan_ds_11ax_cfg { #define MLAN_11AX_TWT_SETUP_SUBID 0x114 #define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115 +#define MLAN_11AX_TWT_REPORT_SUBID 0x116 #define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322) #define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323) @@ -4153,6 +4171,17 @@ typedef struct MLAN_PACK_START _mlan_ds_twt_teardown { t_u8 teardown_all_twt; } MLAN_PACK_END mlan_ds_twt_teardown, *pmlan_ds_twt_teardown; +/** Type definition of mlan_ds_twt_report for MLAN_OID_11AX_TWT_CFG */ +typedef MLAN_PACK_START struct _mlan_ds_twt_report { + /** TWT report type, 0: BTWT id */ + t_u8 type; + /** TWT report length of value in data */ + t_u8 length; + t_u8 reserve[2]; + /** TWT report payload for FW response to fill */ + t_u8 data[36]; +} MLAN_PACK_END mlan_ds_twt_report, *pmlan_ds_twt_report; + /** Type definition of mlan_ds_twtcfg for MLAN_OID_11AX_TWT_CFG */ typedef struct MLAN_PACK_START _mlan_ds_twtcfg { /** Sub-command */ @@ -4166,6 +4195,8 @@ typedef struct MLAN_PACK_START _mlan_ds_twtcfg { /** TWT Teardown config for Sub ID: MLAN_11AX_TWT_TEARDOWN_SUBID */ mlan_ds_twt_teardown twt_teardown; + /** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */ + mlan_ds_twt_report twt_report; } param; } MLAN_PACK_END mlan_ds_twtcfg, *pmlan_ds_twtcfg; @@ -4243,20 +4274,11 @@ enum _mlan_reg_type { MLAN_REG_CAU = 5, MLAN_REG_PSU = 6, MLAN_REG_BCA = 7, -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) || \ - defined(SD9177) MLAN_REG_CIU = 8, -#endif -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) MLAN_REG_MAC2 = 0x81, MLAN_REG_BBP2 = 0x82, MLAN_REG_RF2 = 0x83, MLAN_REG_BCA2 = 0x87 -#endif }; /** Type definition of mlan_ds_reg_rw for MLAN_OID_REG_RW */ @@ -4489,6 +4511,12 @@ enum _mlan_func_cmd { #define MLAN_NETMON_CONTROL MBIT(1) /* data frame */ #define MLAN_NETMON_DATA MBIT(2) +/* only unicast destined frame (no promiscuous) */ +#define MLAN_NETMON_NOPROM MBIT(3) +/* capture non-bss Rx beacons */ +#define MLAN_NETMON_NON_BSS_BCN MBIT(5) +/* capture Tx frames */ +#define MLAN_NETMON_TX MBIT(6) typedef struct _mlan_ds_misc_net_monitor { /** Enable/disable network monitor */ @@ -4522,6 +4550,15 @@ typedef struct _mlan_ds_misc_rx_abort_cfg { /** Rx weak RSSI pkt threshold */ t_s8 rssi_threshold; } mlan_ds_misc_rx_abort_cfg; +/** Type definition of mlan_ds_misc_ofdm_desense_cfg + * for MLAN_OID_MISC_OFDM_DESENSE_CFG + */ +typedef struct _mlan_ds_misc_ofdm_desense_cfg { + /** enable/disable ofdm desense cfg */ + t_u8 enable; + /** OFDM CCA pkt threshold */ + t_s8 cca_threshold; +} mlan_ds_misc_ofdm_desense_cfg; /** Type definition of mlan_ds_misc_rx_abort_cfg_ext * for MLAN_OID_MISC_RX_ABORT_CFG_EXT @@ -4533,6 +4570,14 @@ typedef struct _mlan_ds_misc_rx_abort_cfg_ext { t_s8 rssi_margin; /** specify ceil rssi threshold */ t_s8 ceil_rssi_threshold; + /** specify floor rssi threshold */ + t_s8 floor_rssi_threshold; + /** current dynamic rssi threshold */ + t_s8 current_dynamic_rssi_threshold; + /** rssi config: default or user configured */ + t_u8 rssi_default_config; + /** EDMAC status */ + t_u8 edmac_enable; } mlan_ds_misc_rx_abort_cfg_ext; /** Type definition of mlan_ds_misc_rx_abort_cfg_ext @@ -5373,6 +5418,21 @@ typedef struct _mlan_ds_misc_keep_alive { t_u16 ether_type; } mlan_ds_misc_keep_alive, *pmlan_ds_misc_keep_alive; +#define MKEEP_ALIVE_ACK_PKT_MAX 100 +typedef struct _mlan_ds_misc_keep_alive_rx { + t_u8 mkeep_alive_id; + t_u8 enable; + /** enable/disable tcp reset*/ + t_u8 reset; + /**True means saved in driver, false means not saved or download*/ + t_u8 cached; + t_u8 dst_mac[MLAN_MAC_ADDR_LENGTH]; + t_u8 src_mac[MLAN_MAC_ADDR_LENGTH]; + t_u16 pkt_len; + t_u8 packet[MKEEP_ALIVE_ACK_PKT_MAX]; + /** Ethernet type */ + t_u16 ether_type; +} mlan_ds_misc_keep_alive_rx, *pmlan_ds_misc_keep_alive_rx; /** TX and RX histogram statistic parameters*/ typedef MLAN_PACK_START struct _mlan_ds_misc_tx_rx_histogram { /** Enable or disable get tx/rx histogram statistic */ @@ -5427,6 +5487,115 @@ typedef struct _mlan_ds_misc_robustcoex_params { t_u8 gpio_polarity; } mlan_ds_misc_robustcoex_params; +/** RTT configuration */ +typedef struct _mlan_rtt_config { + /** peer device mac address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** 1-sided or 2-sided RTT */ + t_u8 type; + /** optional - peer device hint (STA, P2P, AP) */ + t_u8 peer; + /** Required for STA-AP mode, optional for P2P, NBD etc. */ + t_u8 channel; + /** Required for STA-AP mode, optional for P2P, NBD etc. */ + Band_Config_t bandcfg; + /** Time interval between bursts (units: 100 ms). + * Applies to 1-sided and 2-sided RTT multi-burst requests. + * Range: 0-31, 0: no preference by initiator (2-sided RTT) */ + t_u8 burst_period; + /** Total number of RTT bursts to be executed. It will be + * specified in the same way as the parameter "Number of + * Burst Exponent" found in the FTM frame format. It + * applies to both: 1-sided RTT and 2-sided RTT. Valid + * values are 0 to 15 as defined in 802.11mc std. + * 0 means single shot + * The implication of this parameter on the maximum + * number of RTT results is the following: + * for 1-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst) + * for 2-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst - 1) */ + t_u8 num_burst; + /** num of frames per burst. + * Minimum value = 1, Maximum value = 31 + * For 2-sided this equals the number of FTM frames + * to be attempted in a single burst. This also + * equals the number of FTM frames that the + * initiator will request that the responder send + * in a single frame. */ + t_u8 num_frames_per_burst; + /** number of retries for a failed RTT frame. Applies + * to 1-sided RTT only. Minimum value = 0, Maximum value = 3 */ + t_u8 num_retries_per_rtt_frame; + + /** following fields are only valid for 2-side RTT */ + /** Maximum number of retries that the initiator can + * retry an FTMR frame. + * Minimum value = 0, Maximum value = 3 */ + t_u8 num_retries_per_ftmr; + /** 1: request LCI, 0: do not request LCI */ + t_u8 LCI_request; + /** 1: request LCR, 0: do not request LCR */ + t_u8 LCR_request; + /** Applies to 1-sided and 2-sided RTT. Valid values will + * be 2-11 and 15 as specified by the 802.11mc std for + * the FTM parameter burst duration. In a multi-burst + * request, if responder overrides with larger value, + * the initiator will return failure. In a single-burst + * request if responder overrides with larger value, + * the initiator will sent TMR_STOP to terminate RTT + * at the end of the burst_duration it requested. */ + t_u8 burst_duration; + /** RTT preamble to be used in the RTT frames */ + t_u8 preamble; + /** RTT BW to be used in the RTT frames */ + t_u8 bw; +} mlan_rtt_config, *pmlan_rtt_config; + +/** RTT config params */ +typedef struct _mlan_rtt_config_params { + t_u8 rtt_config_num; + mlan_rtt_config rtt_config[MAX_RTT_CONFIG_NUM]; +} mlan_rtt_config_params; + +/** RTT cancel params */ +typedef struct _mlan_rtt_cancel_params { + t_u8 rtt_cancel_num; + t_u8 rtt_cancel[MAX_RTT_CONFIG_NUM][MLAN_MAC_ADDR_LENGTH]; +} mlan_rtt_cancel_params; + +/** RTT responder info */ +typedef struct _rtt_responder_info { + t_u8 channel; + Band_Config_t bandcfg; + t_u8 preamble; +} rtt_responder_info; + +/** RTT responder enable configure */ +typedef struct _rtt_responder_encfg { + t_u8 channel; + Band_Config_t bandcfg; + t_u32 max_dur_sec; +} rtt_responder_encfg; + +/** Define for mlan_rtt_responder.action */ +#define RTT_GET_RESPONDER_INFO 0 +#define RTT_SET_RESPONDER_ENABLE 1 +#define RTT_SET_RESPONDER_DISABLE 2 +#define RTT_SET_RESPONDER_LCI 3 +#define RTT_SET_RESPONDER_LCR 4 + +/** RTT responder configure for MLAN_OID_MISC_RTT_RESPONDER_CFG */ +typedef struct _mlan_rtt_responder { + t_u8 action; + union { + rtt_responder_info info; + rtt_responder_encfg encfg; + wifi_lci_information lci; + wifi_lcr_information lcr; + } u; +} mlan_rtt_responder; + #if defined(PCIE) typedef struct _mlan_ds_ssu_params { t_u32 nskip; @@ -5885,9 +6054,24 @@ typedef struct _mlan_ds_ch_load { t_s16 noise; t_u16 rx_quality; t_u16 duration; - t_u16 cca_th; } mlan_ds_ch_load; +/** Type definition of mlan_ds_cross_chip_synch */ +typedef struct _mlan_ds_cross_chip_synch { + /**cross chip sync action 0-GET, 1-SET */ + t_u16 action; + /**cross chip sync start or stop */ + t_u8 start_stop; + /**cross chip sync role, master or slave */ + t_u8 role; + /**cross chip sync periodicty of toggle in us */ + t_u32 period; + /**cross chip sync initial TSF low */ + t_u32 init_tsf_low; + /**cross chip sync intial TSF high */ + t_u32 init_tsf_high; +} mlan_ds_cross_chip_synch; + /** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */ typedef struct _mlan_ds_misc_cfg { /** Sub-command */ @@ -6001,11 +6185,18 @@ typedef struct _mlan_ds_misc_cfg { t_u64 misc_tsf; mlan_ds_custom_reg_domain custom_reg_domain; mlan_ds_misc_keep_alive keep_alive; + mlan_ds_misc_keep_alive_rx keep_alive_rx; mlan_ds_misc_tx_rx_histogram tx_rx_histogram; mlan_ds_cw_mode_ctrl cwmode; /** Tx/Rx per-packet control */ t_u8 txrx_pkt_ctrl; mlan_ds_misc_robustcoex_params robustcoexparams; + /** config RTT for MLAN_OID_MISC_CONFIG_RTT */ + mlan_rtt_config_params rtt_params; + /** cancel RTT for MLAN_OID_MISC_CANCEL_RTT */ + mlan_rtt_cancel_params rtt_cancel; + /** config RTT responder for MLAN_OID_MISC_RTT_RESPONDER_CFG */ + mlan_rtt_responder rtt_rsp_cfg; #if defined(PCIE) mlan_ds_ssu_params ssu_params; #endif @@ -6016,6 +6207,7 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_mapping_policy dmcs_policy; mlan_ds_misc_dmcs_status dmcs_status; mlan_ds_misc_rx_abort_cfg rx_abort_cfg; + mlan_ds_misc_ofdm_desense_cfg ofdm_desense_cfg; mlan_ds_misc_rx_abort_cfg_ext rx_abort_cfg_ext; mlan_ds_misc_tx_ampdu_prot_mode tx_ampdu_prot_mode; mlan_ds_misc_rate_adapt_cfg rate_adapt_cfg; @@ -6033,6 +6225,7 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_arb_cfg arb_cfg; mlan_ds_misc_cfp_tbl cfp; t_u8 range_ext_mode; + mlan_ds_twt_report twt_report_info; mlan_ds_misc_dot11mc_unassoc_ftm_cfg dot11mc_unassoc_ftm_cfg; mlan_ds_misc_tp_state tp_state; mlan_ds_hal_phy_cfg_params hal_phy_cfg_params; @@ -6043,6 +6236,7 @@ typedef struct _mlan_ds_misc_cfg { #endif t_u32 ips_ctrl; mlan_ds_ch_load ch_load; + mlan_ds_cross_chip_synch cross_chip_synch; } param; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_join.c b/mxm_wifiex/wlan_src/mlan/mlan_join.c index fd92ed8..b63c45c 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_join.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_join.c @@ -309,12 +309,13 @@ static mlan_status wlan_get_common_rates(mlan_private *pmpriv, t_u8 *rate1, PRINTM(MINFO, "Tx DataRate is set to 0x%X\n", pmpriv->data_rate); if (!pmpriv->is_data_rate_auto) { - while (*ptr) { + while (rate1_size && *ptr) { if ((*ptr & 0x7f) == pmpriv->data_rate) { ret = MLAN_STATUS_SUCCESS; goto done; } ptr++; + rate1_size--; } PRINTM(MMSG, "Previously set fixed data rate %#x is not " @@ -1168,8 +1169,8 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, psae_pwe_mode_tlv = (MrvlIEtypes_SAE_PWE_Mode_t *)pos; psae_pwe_mode_tlv->header.type = wlan_cpu_to_le16( TLV_TYPE_WPA3_SAE_PWE_DERIVATION_MODE); - psae_pwe_mode_tlv->header.len = - sizeof(psae_pwe_mode_tlv->pwe); + psae_pwe_mode_tlv->header.len = wlan_cpu_to_le16( + sizeof(psae_pwe_mode_tlv->pwe)); psae_pwe_mode_tlv->pwe[0] = pbss_desc->prsnx_ie->data[0]; pos += sizeof(psae_pwe_mode_tlv->header) + @@ -1254,6 +1255,8 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, psecurity_cfg_ie->header.len = sizeof(t_u8); pos += sizeof(psecurity_cfg_ie->header) + psecurity_cfg_ie->header.len; + psecurity_cfg_ie->header.len = + wlan_cpu_to_le16(psecurity_cfg_ie->header.len); } #ifdef DRV_EMBEDDED_SUPPLICANT else if (supplicantIsEnabled(pmpriv->psapriv)) { @@ -1462,18 +1465,20 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, host_mlme_tlv = (MrvlIEtypes_HostMlme_t *)pos; host_mlme_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_HOST_MLME); - host_mlme_tlv->header.len = - wlan_cpu_to_le16(sizeof(host_mlme_tlv->host_mlme)); + host_mlme_tlv->header.len = sizeof(host_mlme_tlv->host_mlme); host_mlme_tlv->host_mlme = MTRUE; pos += sizeof(host_mlme_tlv->header) + host_mlme_tlv->header.len; + host_mlme_tlv->header.len = + wlan_cpu_to_le16(host_mlme_tlv->header.len); } if (memcmp(pmadapter, &pmpriv->curr_bss_params.prev_bssid, zero_mac, MLAN_MAC_ADDR_LENGTH)) { prev_bssid_tlv = (MrvlIEtypes_PrevBssid_t *)pos; prev_bssid_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_PREV_BSSID); - prev_bssid_tlv->header.len = MLAN_MAC_ADDR_LENGTH; + prev_bssid_tlv->header.len = + wlan_cpu_to_le16(MLAN_MAC_ADDR_LENGTH); memcpy_ext(pmadapter, prev_bssid_tlv->prev_bssid, &pmpriv->curr_bss_params.prev_bssid, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); @@ -1511,6 +1516,9 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, if (pmpriv->config_bands == BAND_B) SHORT_SLOT_TIME_DISABLED(tmp_cap); + if (pmpriv->adapter->pcard_info->support_11mc) + RADIO_MEASUREMENT_ENABLED(tmp_cap); + tmp_cap &= CAPINFO_MASK; PRINTM(MINFO, "ASSOC_CMD: tmp_cap=%4X CAPINFO_MASK=%4lX\n", tmp_cap, CAPINFO_MASK); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_main.h b/mxm_wifiex/wlan_src/mlan/mlan_main.h index 643db9a..0e19825 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_main.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_main.h @@ -353,8 +353,9 @@ extern t_u32 mlan_drvdbg; #define endian_convert_RxPD_extra_header(x) \ do { \ (x)->channel_flags = wlan_le16_to_cpu((x)->channel_flags); \ - (x)->vht_sig1 = wlan_le32_to_cpu((x)->vht_sig1); \ - (x)->vht_sig2 = wlan_le32_to_cpu((x)->vht_sig2); \ + (x)->vht_he_sig1 = wlan_le32_to_cpu((x)->vht_he_sig1); \ + (x)->vht_he_sig2 = wlan_le32_to_cpu((x)->vht_he_sig2); \ + (x)->user_idx = wlan_le32_to_cpu((x)->user_idx); \ } while (0) #else /** Convert ulong n/w to host */ @@ -567,14 +568,7 @@ extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond); #define SDIO_CMD53_MAX_SIZE 65280 #define MAX_SUPPORT_AMSDU_SIZE 4096 /** Maximum numbfer of registers to read for multiple port */ -#if defined(SD8887) || defined(SD8997) || defined(SD8977) || \ - defined(SD8987) || defined(SD9098) || defined(SD9097) || \ - defined(SDNW62X) || defined(SD8978) || defined(SD9177) #define MAX_MP_REGS 196 -#else -/* upto 0xB7 */ -#define MAX_MP_REGS 184 -#endif /** Maximum port */ #define MAX_PORT 32 /** Maximum port 16 */ @@ -616,6 +610,9 @@ extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond); /** Debug command number */ #define DBG_CMD_NUM 10 +/** scan GAP value is optional */ +#define GAP_FLAG_OPTIONAL MBIT(15) + /** Info for debug purpose */ typedef struct _wlan_dbg { /** Number of host to card command failures */ @@ -1408,6 +1405,12 @@ typedef struct { mlan_private *priv; } reorder_tmr_cnxt_t; +#define MLAN_SET_BIT(x, val) ((x) |= (1U << (val))) +#define MLAN_CLEAR_BIT(x, val) ((x) &= ~(1U << (val))) +/** default RX reorder table flush time 128 ms for AC_VI, AC_VO*/ +#define DEF_FLUSH_TIME_AC_VI_VO 128 +/** default RX reorder table flush time 500 ms for AC_BE, AC_BK*/ +#define DEF_FLUSH_TIME_AC_BE_BK 500 /** RX reorder table */ struct _RxReorderTbl { /** RxReorderTbl previous node */ @@ -1439,6 +1442,8 @@ struct _RxReorderTbl { t_u8 pkt_count; /** flush data flag */ t_u8 flush_data; + /** BA window bitmap */ + t_u64 bitmap; }; /** BSS priority node */ @@ -2167,7 +2172,12 @@ typedef struct _mlan_pcie_card_reg { t_u32 host_intr_cmd_done; /** Event ready interrupt for host */ t_u32 host_intr_event_rdy; + /** cmd dnld interrupt for host */ t_u32 host_intr_cmd_dnld; + /** adma align size */ + t_u8 adma_align_size; + /** adma min pkt size */ + t_u8 adma_min_pkt_size; /* TX/RX buffer description mask */ t_u32 txrx_rw_ptr_mask; /* TX/RX buffer description wrap mask */ @@ -2282,6 +2292,7 @@ typedef struct _mlan_card_info { t_u8 supp_ps_handshake; /** DEFAULT_11N_TX_BF_CAP */ t_u32 default_11n_tx_bf_cap; + t_u8 support_11mc; } mlan_card_info, *pmlan_card_info; typedef struct _mlan_adapter mlan_adapter, *pmlan_adapter; @@ -2406,13 +2417,9 @@ struct _mlan_adapter { t_u32 fw_cap_info; /** Extended firmware capability information */ t_u32 fw_cap_ext; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) /** High byte for 5G, low byte for 2G, like 0x2211 0x22 for 5G, 0x11 for * 2G */ t_u16 user_htstream; -#endif /** vdll ctrl */ vdll_dnld_ctrl vdll_ctrl; #if defined(SDIO) || defined(PCIE) @@ -2582,6 +2589,9 @@ struct _mlan_adapter { t_u32 num_in_chan_stats; /** index of chan stats */ t_u32 idx_chan_stats; + ChanStatistics_t *pold_chan_stats; + /** index of chan stats */ + t_u32 old_idx_chan_stats; t_u8 bgscan_reported; /** Number of records in the scan table */ @@ -2729,6 +2739,8 @@ struct _mlan_adapter { t_u32 hw_dot_11n_dev_cap; /** Device support for MIMO abstraction of MCSs */ t_u8 hw_dev_mcs_support; + /** mpdu density */ + t_u8 hw_mpdu_density; #ifdef STA_SUPPORT /** Adhoc Secondary Channel Bandwidth */ t_u8 chan_bandwidth; @@ -2852,6 +2864,8 @@ struct _mlan_adapter { t_u32 tp_state_on; /** Packet drop point */ t_u32 tp_state_drop_point; + /** second mac flag */ + t_u8 second_mac; /* lower 8 bytes of uuid */ t_u64 uuid_lo; @@ -3246,6 +3260,14 @@ mlan_status wlan_misc_gpio_tsf_latch_config(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_get_tsf_info(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); +mlan_status wlan_cmd_cross_chip_synch(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, + t_void *pdata_buf); +mlan_status wlan_ret_cross_chip_synch(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); +mlan_status wlan_misc_ioctl_cross_chip_synch(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); /** get ralist info */ int wlan_get_ralist_info(mlan_private *priv, pralist_info buf); /** dump ralist */ @@ -3594,6 +3616,12 @@ mlan_status wlan_cmd_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, t_void *pdata_buf); mlan_status wlan_ret_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf); +mlan_status wlan_cmd_ofdmdesense_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, + t_void *pdata_buf); +mlan_status wlan_ret_ofdmdesense_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); mlan_status wlan_cmd_rxabortcfg_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, t_void *pdata_buf); @@ -3642,6 +3670,8 @@ mlan_status wlan_ret_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, mlan_status wlan_misc_ioctl_rxabortcfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); +mlan_status wlan_misc_ioctl_ofdmdesense_cfg(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_rxabortcfg_ext(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_tx_ampdu_prot_mode(pmlan_adapter pmadapter, @@ -3660,6 +3690,10 @@ mlan_status wlan_misc_ioctl_rf_test_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_range_ext(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); +mlan_status wlan_misc_ioctl_twt_report(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); +mlan_status wlan_ret_twt_report(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); mlan_status wlan_misc_ioctl_arb_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_tp_state(pmlan_adapter pmadapter, @@ -3767,7 +3801,7 @@ sta_node *wlan_add_station_entry(mlan_private *priv, t_u8 *mac); void wlan_check_sta_capability(pmlan_private priv, pmlan_buffer pevent, sta_node *sta_ptr); /** find specific ie */ -t_u8 *wlan_get_specific_ie(pmlan_private priv, t_u8 *ie_buf, t_u8 ie_len, +t_u8 *wlan_get_specific_ie(pmlan_private priv, t_u8 *ie_buf, t_u16 ie_len, IEEEtypes_ElementId_e id, t_u8 ext_id); t_u8 wlan_is_wmm_ie_present(pmlan_adapter pmadapter, t_u8 *pbuf, t_u16 buf_len); /** Ethernet II header */ @@ -3987,6 +4021,33 @@ t_void wlan_tdls_config(pmlan_private pmpriv, t_u8 enable); mlan_status wlan_misc_ioctl_tdls_cs_channel(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); +mlan_status wlan_config_rtt(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); +mlan_status wlan_cancel_rtt(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); +mlan_status wlan_rtt_responder_cfg(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); +mlan_status wlan_cmd_802_11_ftm_config_session_params(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, + t_u32 cmd_oid, + t_void *pdata_buf); +mlan_status +wlan_ret_802_11_ftm_config_session_params(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); +mlan_status wlan_fill_hal_rtt_results(pmlan_private pmpriv, + Event_WLS_FTM_t *event_ftm, + t_u32 event_ftm_len, mlan_event *pevent); +mlan_status wlan_cmd_802_11_ftm_config_responder(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, + t_u32 cmd_oid, + t_void *pdata_buf); +mlan_status wlan_ret_802_11_ftm_config_responder(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); + mlan_status wlan_get_info_ver_ext(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); @@ -4048,7 +4109,7 @@ int wlan_add_supported_oper_class_ie(mlan_private *pmpriv, t_u8 **pptlv_out, mlan_status wlan_get_curr_oper_class(mlan_private *pmpriv, t_u8 channel, t_u8 bw, t_u8 *oper_class); mlan_status wlan_check_operclass_validation(mlan_private *pmpriv, t_u8 channel, - t_u8 oper_class); + t_u8 oper_class, t_u8 bandwidth); mlan_status wlan_misc_ioctl_operclass_validation(pmlan_adapter pmadapter, mlan_ioctl_req *pioctl_req); mlan_status wlan_misc_ioctl_oper_class(pmlan_adapter pmadapter, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_misc.c b/mxm_wifiex/wlan_src/mlan/mlan_misc.c index 3ffa5bb..f53e4fc 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_misc.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_misc.c @@ -4,7 +4,7 @@ * @brief This file include miscellaneous functions for MLAN module * * - * Copyright 2009-2022 NXP + * Copyright 2009-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -695,7 +695,8 @@ t_void wlan_wakeup_card_timeout_func(void *function_context) PRINTM(MERROR, "%s: ps_state=%d\n", __FUNCTION__, pmadapter->ps_state); if (pmadapter->ps_state != PS_STATE_AWAKE) { PRINTM_NETINTF(MERROR, pmpriv); - PRINTM(MERROR, "Wakeup card timeout!\n"); + PRINTM(MERROR, "Wakeup card timeout(%d)!\n", + pmadapter->pm_wakeup_timeout); pmadapter->pm_wakeup_timeout++; wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_DBG_DUMP, MNULL); } @@ -1031,7 +1032,8 @@ pmlan_buffer wlan_alloc_mlan_buffer(mlan_adapter *pmadapter, t_u32 data_len, /* head_room is not implemented for malloc mlan buffer */ if (malloc_flag & MOAL_MALLOC_BUFFER) { - buf_size = sizeof(mlan_buffer) + data_len + DMA_ALIGNMENT; + buf_size = + (t_u32)(sizeof(mlan_buffer) + data_len + DMA_ALIGNMENT); if (malloc_flag & MOAL_MEM_FLAG_ATOMIC) mem_flags |= MLAN_MEM_FLAG_ATOMIC; ret = pcb->moal_malloc(pmadapter->pmoal_handle, buf_size, @@ -1040,7 +1042,6 @@ pmlan_buffer wlan_alloc_mlan_buffer(mlan_adapter *pmadapter, t_u32 data_len, pmbuf = MNULL; goto exit; } - memset(pmadapter, pmbuf, 0, sizeof(mlan_buffer)); pmbuf->pdesc = MNULL; /* Align address */ @@ -1640,27 +1641,15 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter, switch (reg_mem->param.reg_rw.type) { case MLAN_REG_MAC: -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) case MLAN_REG_MAC2: -#endif cmd_no = HostCmd_CMD_MAC_REG_ACCESS; break; case MLAN_REG_BBP: -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) case MLAN_REG_BBP2: -#endif cmd_no = HostCmd_CMD_BBP_REG_ACCESS; break; case MLAN_REG_RF: -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) case MLAN_REG_RF2: -#endif cmd_no = HostCmd_CMD_RF_REG_ACCESS; break; case MLAN_REG_CAU: @@ -1670,21 +1659,12 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter, cmd_no = HostCmd_CMD_TARGET_ACCESS; break; case MLAN_REG_BCA: -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) case MLAN_REG_BCA2: -#endif cmd_no = HostCmd_CMD_BCA_REG_ACCESS; break; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) || \ - defined(SD9177) case MLAN_REG_CIU: cmd_no = HostCmd_CMD_REG_ACCESS; break; -#endif default: pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID; ret = MLAN_STATUS_FAILURE; @@ -1853,7 +1833,6 @@ sta_node *wlan_add_station_entry(mlan_private *priv, t_u8 *mac) LEAVE(); return MNULL; } - memset(priv->adapter, sta_ptr, 0, sizeof(sta_node)); memcpy_ext(priv->adapter, sta_ptr->mac_addr, mac, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); util_enqueue_list_tail(priv->adapter->pmoal_handle, &priv->sta_list, @@ -1945,7 +1924,7 @@ int wlan_get_tdls_list(mlan_private *priv, tdls_peer_info *buf) tdls_peer_info *peer_info = buf; sta_node *sta_ptr = MNULL; int count = 0; - IEEEtypes_Header_t *ieee_hdr; + ENTER(); if (priv->bss_type != MLAN_BSS_TYPE_STA) { LEAVE(); @@ -1976,10 +1955,8 @@ int wlan_get_tdls_list(mlan_private *priv, tdls_peer_info *buf) &sta_ptr->vht_cap, sizeof(IEEEtypes_VHTCap_t), sizeof(peer_info->vht_cap)); - ieee_hdr = (IEEEtypes_Header_t *)peer_info->he_cap; memcpy_ext(priv->adapter, peer_info->he_cap, - &sta_ptr->he_cap, - sizeof(IEEEtypes_Header_t) + ieee_hdr->len, + &sta_ptr->he_cap, sizeof(IEEEtypes_HECap_t), sizeof(peer_info->he_cap)); peer_info++; count++; @@ -2126,8 +2103,6 @@ t_void wlan_tdls_config(pmlan_private pmpriv, t_u8 enable) LEAVE(); return; } - memset(pmadapter, (t_u8 *)tdls_config, 0, - sizeof(mlan_ds_misc_tdls_config)); tdls_all_cfg = (tdls_all_config *)tdls_config->tdls_data; tdls_all_cfg->u.tdls_config.enable = enable; tdls_config->tdls_action = WLAN_TDLS_CONFIG; @@ -2170,8 +2145,6 @@ static t_void wlan_tdls_cs_param_config(pmlan_private pmpriv) LEAVE(); return; } - memset(pmadapter, (t_u8 *)tdls_config, 0, - sizeof(mlan_ds_misc_tdls_config)); tdls_all_cfg = (tdls_all_config *)tdls_config->tdls_data; tdls_config->tdls_action = WLAN_TDLS_CS_PARAMS; @@ -2220,8 +2193,6 @@ static t_void wlan_tdls_cs_start(pmlan_private pmpriv, t_u8 *peer_mac_addr, LEAVE(); return; } - memset(pmadapter, (t_u8 *)tdls_config, 0, - sizeof(mlan_ds_misc_tdls_config)); if (pioctl_buf) { misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; @@ -2964,6 +2935,118 @@ exit: return ret; } +/** + * @brief config rtt + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req A pointer to ioctl request buffer + * + * @return MLAN_STATUS_PENDING --success, otherwise fail + */ +mlan_status wlan_config_rtt(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) +{ + pmlan_private pmpriv = MNULL; + mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_status ret = MLAN_STATUS_SUCCESS; + + ENTER(); + + if (!pioctl_req) { + PRINTM(MERROR, "MLAN IOCTL information is not present\n"); + ret = MLAN_STATUS_FAILURE; + goto exit; + } + + pmpriv = pmadapter->priv[pioctl_req->bss_index]; + + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS, + HostCmd_ACT_GEN_SET, OID_RTT_REQUEST, + (t_void *)pioctl_req, &(misc->param.rtt_params)); + + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + +exit: + LEAVE(); + return ret; +} + +/** + * @brief cancel rtt + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req A pointer to ioctl request buffer + * + * @return MLAN_STATUS_PENDING --success, otherwise fail + */ +mlan_status wlan_cancel_rtt(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) +{ + pmlan_private pmpriv = MNULL; + mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_status ret = MLAN_STATUS_SUCCESS; + + ENTER(); + + if (!pioctl_req) { + PRINTM(MERROR, "MLAN IOCTL information is not present\n"); + ret = MLAN_STATUS_FAILURE; + goto exit; + } + + pmpriv = pmadapter->priv[pioctl_req->bss_index]; + + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS, + HostCmd_ACT_GEN_SET, OID_RTT_CANCEL, + (t_void *)pioctl_req, &(misc->param.rtt_cancel)); + + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + +exit: + LEAVE(); + return ret; +} + +/** + * @brief rtt responder cfg + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req A pointer to ioctl request buffer + * + * @return MLAN_STATUS_PENDING --success, otherwise fail + */ +mlan_status wlan_rtt_responder_cfg(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req) +{ + pmlan_private pmpriv = MNULL; + mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_status ret = MLAN_STATUS_SUCCESS; + + ENTER(); + + if (!pioctl_req) { + PRINTM(MERROR, "MLAN IOCTL information is not present\n"); + ret = MLAN_STATUS_FAILURE; + goto exit; + } + + pmpriv = pmadapter->priv[pioctl_req->bss_index]; + + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_FTM_CONFIG_RESPONDER, + HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, + &(misc->param.rtt_rsp_cfg)); + + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + +exit: + LEAVE(); + return ret; +} + /** * @brief Get TX/RX histogram statistic * @@ -3289,7 +3372,8 @@ mlan_status wlan_process_802dot11_mgmt_pkt(mlan_private *priv, t_u8 *payload, pevent = (pmlan_event)event_buf; pevent->bss_index = priv->bss_index; mgmt = (IEEE80211_MGMT *)payload; - if (!priv->curr_bss_params.host_mlme && sub_type == SUBTYPE_ACTION && + if (priv->bss_role == MLAN_BSS_ROLE_STA && + !priv->curr_bss_params.host_mlme && sub_type == SUBTYPE_ACTION && mgmt->u.ft_resp.category == FT_CATEGORY && mgmt->u.ft_resp.action == FT_ACTION_RESPONSE && mgmt->u.ft_resp.status_code == 0) { @@ -3306,7 +3390,8 @@ mlan_status wlan_process_802dot11_mgmt_pkt(mlan_private *priv, t_u8 *payload, payload + FT_ACTION_HEAD_LEN, payload_len - FT_ACTION_HEAD_LEN, pevent->event_len - MLAN_MAC_ADDR_LENGTH); - } else if (!priv->curr_bss_params.host_mlme && + } else if (priv->bss_role == MLAN_BSS_ROLE_STA && + !priv->curr_bss_params.host_mlme && sub_type == SUBTYPE_AUTH && mgmt->u.auth.auth_alg == MLAN_AUTH_MODE_FT && mgmt->u.auth.auth_transaction == 2 && @@ -3431,6 +3516,28 @@ mlan_status wlan_misc_hotspot_cfg(pmlan_adapter pmadapter, } #ifdef STA_SUPPORT +/** + * @brief This function check if we should enable beacon protection support + * + * @param pbss_desc A pointer to BSSDescriptor_t structure + * + * @return MTRUE/MFALSE + */ +t_u8 wlan_check_beacon_prot_supported(mlan_private *pmpriv, + BSSDescriptor_t *pbss_desc) +{ + if (pbss_desc && pbss_desc->pext_cap) { + if (pbss_desc->pext_cap->ieee_hdr.len < 11) + return MFALSE; + if (!ISSUPP_EXTCAP_EXT_BEACON_PROT( + pbss_desc->pext_cap->ext_cap)) + return MFALSE; + } + if (!IS_FW_SUPPORT_BEACON_PROT(pmpriv->adapter)) + return MFALSE; + return MTRUE; +} + /** * @brief Add Extended Capabilities IE * @@ -3455,10 +3562,18 @@ void wlan_add_ext_capa_info_ie(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, SET_EXTCAP_EXT_CHANNEL_SWITCH(pmpriv->ext_cap); else RESET_EXTCAP_EXT_CHANNEL_SWITCH(pmpriv->ext_cap); + if (pmpriv->adapter->pcard_info->support_11mc) { + SET_EXTCAP_FTMI(pmpriv->ext_cap); + SET_EXTCAP_INTERNETWORKING(pmpriv->ext_cap); + } if (pbss_desc && pbss_desc->multi_bssid_ap) SET_EXTCAP_MULTI_BSSID(pmpriv->ext_cap); if (wlan_check_11ax_twt_supported(pmpriv, pbss_desc)) SET_EXTCAP_TWT_REQ(pmpriv->ext_cap); + + if (wlan_check_beacon_prot_supported(pmpriv, pbss_desc)) + SET_EXTCAP_BEACON_PROT(pmpriv->ext_cap); + memcpy_ext(pmpriv->adapter, &pext_cap->ext_cap, &pmpriv->ext_cap, sizeof(pmpriv->ext_cap), sizeof(pext_cap->ext_cap)); *pptlv_out += sizeof(MrvlIETypes_ExtCap_t); @@ -3804,7 +3919,7 @@ t_u8 wlan_is_wmm_ie_present(pmlan_adapter pmadapter, t_u8 *pbuf, t_u16 buf_len) * * @return ie's poiner or MNULL */ -t_u8 *wlan_get_specific_ie(pmlan_private priv, t_u8 *ie_buf, t_u8 ie_len, +t_u8 *wlan_get_specific_ie(pmlan_private priv, t_u8 *ie_buf, t_u16 ie_len, IEEEtypes_ElementId_e id, t_u8 ext_id) { t_u32 bytes_left = ie_len; @@ -4000,12 +4115,10 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter, if (pioctl_req->action == MLAN_ACT_SET) { /* User input validation */ if (IS_STREAM_2X2(pmadapter->feature_control)) { -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) || - IS_CARDNW62X(pmadapter->card_type)) { + IS_CARDAW693(pmadapter->card_type) || + IS_CARDIW62X(pmadapter->card_type)) { ant_cfg->tx_antenna &= 0x0303; ant_cfg->rx_antenna &= 0x0303; /** 2G antcfg TX */ @@ -4044,15 +4157,9 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter, ant_cfg->tx_antenna, ant_cfg->rx_antenna); } else { -#endif - ant_cfg->tx_antenna &= 0x0003; ant_cfg->rx_antenna &= 0x0003; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) } -#endif if (!ant_cfg->tx_antenna || bitcount(ant_cfg->tx_antenna & 0x00FF) > pmadapter->number_of_antenna || @@ -4766,6 +4873,47 @@ mlan_status wlan_misc_get_tsf_info(pmlan_adapter pmadapter, return ret; } +/** + * @brief Set/Get CROSS CHIP SYNCH config + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req A pointer to ioctl request buffer + * + * @return MLAN_STATUS_SUCCESS --success, otherwise fail + */ +mlan_status wlan_misc_ioctl_cross_chip_synch(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req) +{ + mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_ds_misc_cfg *misc_cfg = MNULL; + t_u16 cmd_action = 0; + mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + + ENTER(); + + misc_cfg = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + if (pioctl_req->action == MLAN_ACT_SET) + cmd_action = HostCmd_ACT_GEN_SET; + else if (pioctl_req->action == MLAN_ACT_GET) + cmd_action = HostCmd_ACT_GEN_GET; + else { + PRINTM(MERROR, "Unsupported cmd_action\n"); + LEAVE(); + return MLAN_STATUS_FAILURE; + } + + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CROSS_CHIP_SYNCH, cmd_action, + 0, (t_void *)pioctl_req, + &misc_cfg->param.gpio_tsf_latch_config); + + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} + /** * @brief Set coalesce config * @@ -5606,7 +5754,6 @@ mlan_status wlan_set_mef_entry(mlan_private *pmpriv, pmlan_adapter pmadapter, } /** Fill the cmd header data*/ - memset(pmadapter, hostcmd, 0, sizeof(mlan_ds_misc_cmd)); buf = hostcmd->cmd; hostcmd_hdr = (HostCmd_DS_GEN *)buf; hostcmd_hdr->command = wlan_cpu_to_le16(HostCmd_CMD_MEF_CFG); @@ -5698,7 +5845,6 @@ mlan_status wlan_process_mef_cfg_cmd(mlan_private *pmpriv, /** Fill mef_cfg structure*/ mef.criteria = pmef->criteria; mef.entry_num = entry_num; - memset(pmadapter, mef.pentry, 0, sizeof(mef_entry_t) * entry_num); pentry = mef.pentry; /** Fill mef_entry_t structure*/ /** Copy Auto arp response entry*/ @@ -6119,6 +6265,7 @@ mlan_status wlan_misc_ioctl_operclass_validation(pmlan_adapter pmadapter, pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; mlan_ds_misc_cfg *misc = MNULL; t_u8 channel, oper_class; + t_u8 bandwidth; mlan_status ret = MLAN_STATUS_SUCCESS; ENTER(); @@ -6126,9 +6273,11 @@ mlan_status wlan_misc_ioctl_operclass_validation(pmlan_adapter pmadapter, misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; channel = misc->param.bw_chan_oper.channel; oper_class = misc->param.bw_chan_oper.oper_class; + bandwidth = misc->param.bw_chan_oper.bandwidth; + if (pioctl_req->action == MLAN_ACT_GET) { ret = wlan_check_operclass_validation(pmpriv, channel, - oper_class); + oper_class, bandwidth); } else { PRINTM(MERROR, "Unsupported cmd_action\n"); LEAVE(); @@ -6635,6 +6784,38 @@ mlan_status wlan_misc_ioctl_rxabortcfg(pmlan_adapter pmadapter, LEAVE(); return ret; } + +/** + * @brief OFDM DESENSE CFG + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req A pointer to ioctl request buffer + * + * @return MLAN_STATUS_PENDING --success, otherwise fail + */ +mlan_status wlan_misc_ioctl_ofdmdesense_cfg(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req) +{ + mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_misc_cfg *pmisc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_status ret = MLAN_STATUS_SUCCESS; + t_u16 cmd_action = 0; + + ENTER(); + + if (pioctl_req->action == MLAN_ACT_SET) + cmd_action = HostCmd_ACT_GEN_SET; + else + cmd_action = HostCmd_ACT_GEN_GET; + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_OFDM_DESENSE_CFG, cmd_action, + 0, (t_void *)pioctl_req, + &(pmisc->param.ofdm_desense_cfg)); + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} /** * @brief Rx Abort Cfg ext * @@ -6995,6 +7176,34 @@ mlan_status wlan_misc_ioctl_range_ext(pmlan_adapter pmadapter, return ret; } +/** + * @brief twt_report cmd + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req A pointer to ioctl request buffer + * + * @return MLAN_STATUS_PENDING --success, otherwise fail + */ +mlan_status wlan_misc_ioctl_twt_report(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req) +{ + mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_misc_cfg *pmisc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_status ret = MLAN_STATUS_SUCCESS; + t_u16 cmd_action = 0; + + ENTER(); + + cmd_action = HostCmd_ACT_GEN_GET; + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_TWT_CFG, cmd_action, 0, + (t_void *)pioctl_req, + &(pmisc->param.twt_report_info)); + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} + /** * @brief Perform warm reset * @@ -7039,8 +7248,16 @@ mlan_status wlan_misc_ioctl_warm_reset(pmlan_adapter pmadapter, /* Initialize private structures */ for (i = 0; i < pmadapter->priv_num; i++) { - if (pmadapter->priv[i]) + if (pmadapter->priv[i]) { + /* Reset to sta role */ +#ifdef WIFI_DIRECT_SUPPORT + if (pmadapter->priv[i]->bss_type == + MLAN_BSS_TYPE_WIFIDIRECT) + pmadapter->priv[i]->bss_role = + MLAN_BSS_ROLE_STA; +#endif wlan_init_priv(pmadapter->priv[i]); + } } mlan_block_rx_process(pmadapter, MFALSE); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_pcie.c b/mxm_wifiex/wlan_src/mlan/mlan_pcie.c index a4a1a07..8196170 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_pcie.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_pcie.c @@ -76,6 +76,7 @@ static const struct _mlan_card_info mlan_card_info_pcie8897 = { .v16_fw_api = 0, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 0, }; #endif @@ -115,10 +116,45 @@ static const struct _mlan_card_info mlan_card_info_pcie8997 = { .v16_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif -#if defined(PCIE9097) || defined(PCIENW62X) +static const struct _mlan_pcie_card_reg mlan_reg_pcieaw693 = { + .reg_txbd_rdptr = PCIE9098_TXBD_RDPTR, + .reg_txbd_wrptr = PCIE9098_TXBD_WRPTR, + .reg_rxbd_rdptr = PCIE9098_RXBD_RDPTR, + .reg_rxbd_wrptr = PCIE9098_RXBD_WRPTR, + .reg_evtbd_rdptr = PCIE9098_EVTBD_RDPTR, + .reg_evtbd_wrptr = PCIE9098_EVTBD_WRPTR, + .reg_host_int_mask = PCIE9097_B0_HOST_INT_MASK, + .reg_host_int_status_mask = PCIE9097_B0_HOST_INT_STATUS_MASK, + .reg_host_int_status = PCIE9097_B0_HOST_INT_STATUS, + .reg_host_int_clr_sel = PCIE9097_B0_HOST_INT_CLR_SEL, + .reg_cpu_int_event = PCIE9098_CPU_INT_EVENT, + .reg_ip_rev = PCIE9098_DEV_ID_REG, + .reg_drv_ready = PCIE9098_DRV_READY, + .reg_cpu_int_status = PCIE9098_CPU_INT_STATUS, + .reg_rev_id = PCIE9098_REV_ID_REG, + .reg_scratch_0 = PCIE9098_SCRATCH_0_REG, + .reg_scratch_1 = PCIE9098_SCRATCH_1_REG, + .reg_scratch_2 = PCIE9098_SCRATCH_2_REG, + .reg_scratch_3 = PCIE9098_SCRATCH_3_REG, + .reg_scratch_6 = PCIE9098_SCRATCH_6_REG, + .reg_scratch_7 = PCIE9098_SCRATCH_7_REG, + .host_intr_mask = PCIE9098_HOST_INTR_MASK, + .host_intr_dnld_done = PCIE9098_HOST_INTR_DNLD_DONE, + .host_intr_upld_rdy = PCIE9098_HOST_INTR_UPLD_RDY, + .host_intr_cmd_done = PCIE9098_HOST_INTR_CMD_DONE, + .host_intr_event_rdy = PCIE9098_HOST_INTR_EVENT_RDY, + .host_intr_cmd_dnld = PCIE9098_HOST_INTR_CMD_DNLD, + .adma_align_size = ADMA_ALIGN_SIZE_1, + .adma_min_pkt_size = ADMA_MIN_PKT_SIZE_32, + .use_adma = MTRUE, + .msi_int_wr_clr = MTRUE, +}; + +#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW62X) static const struct _mlan_pcie_card_reg mlan_reg_pcie9097_b0 = { .reg_txbd_rdptr = PCIE9098_TXBD_RDPTR, .reg_txbd_wrptr = PCIE9098_TXBD_WRPTR, @@ -147,12 +183,13 @@ static const struct _mlan_pcie_card_reg mlan_reg_pcie9097_b0 = { .host_intr_cmd_done = PCIE9098_HOST_INTR_CMD_DONE, .host_intr_event_rdy = PCIE9098_HOST_INTR_EVENT_RDY, .host_intr_cmd_dnld = PCIE9098_HOST_INTR_CMD_DNLD, + .adma_align_size = ADMA_ALIGN_SIZE, + .adma_min_pkt_size = ADMA_MIN_PKT_SIZE, .use_adma = MTRUE, .msi_int_wr_clr = MTRUE, }; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) static const struct _mlan_pcie_card_reg mlan_reg_pcie9098 = { .reg_txbd_rdptr = PCIE9098_TXBD_RDPTR, .reg_txbd_wrptr = PCIE9098_TXBD_WRPTR, @@ -181,6 +218,8 @@ static const struct _mlan_pcie_card_reg mlan_reg_pcie9098 = { .host_intr_cmd_done = PCIE9098_HOST_INTR_CMD_DONE, .host_intr_event_rdy = PCIE9098_HOST_INTR_EVENT_RDY, .host_intr_cmd_dnld = PCIE9098_HOST_INTR_CMD_DNLD, + .adma_align_size = ADMA_ALIGN_SIZE, + .adma_min_pkt_size = ADMA_MIN_PKT_SIZE, .use_adma = MTRUE, .msi_int_wr_clr = MTRUE, }; @@ -191,8 +230,8 @@ static const struct _mlan_card_info mlan_card_info_pcie9098 = { .v17_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; -#endif /******************************************************** Global Variables ********************************************************/ @@ -204,7 +243,6 @@ static const struct _mlan_card_info mlan_card_info_pcie9098 = { static mlan_status wlan_pcie_delete_evtbd_ring(pmlan_adapter pmadapter); static mlan_status wlan_pcie_delete_rxbd_ring(pmlan_adapter pmadapter); -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) /** * @brief This function init the adma setting * @@ -540,9 +578,6 @@ static void wlan_pcie_init_adma_ring_size(mlan_adapter *pmadapter) return; } -#endif - -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) /** * @brief This function set the host interrupt select mask * @@ -588,9 +623,7 @@ static mlan_status wlan_pcie_set_host_int_select_mask(mlan_adapter *pmadapter, LEAVE(); return MLAN_STATUS_SUCCESS; } -#endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) /** * @brief This function handles command response completion * @@ -666,7 +699,6 @@ done: LEAVE(); return ret; } -#endif /** * @brief This function disables the host interrupt @@ -761,9 +793,9 @@ static mlan_status wlan_disable_pcie_host_int(mlan_adapter *pmadapter) LEAVE(); return ret; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || - (pmadapter->card_type == CARD_TYPE_PCIENW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEIW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == CARD_TYPE_PCIE9097)) { ret = wlan_pcie_set_host_int_select_mask(pmadapter, MFALSE); if (ret) { @@ -771,7 +803,6 @@ static mlan_status wlan_disable_pcie_host_int(mlan_adapter *pmadapter) return ret; } } -#endif ret = wlan_pcie_disable_host_int_mask(pmadapter); LEAVE(); return ret; @@ -839,9 +870,9 @@ static mlan_status wlan_enable_pcie_host_int(mlan_adapter *pmadapter) LEAVE(); return ret; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || - (pmadapter->card_type == CARD_TYPE_PCIENW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEIW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == CARD_TYPE_PCIE9097)) { ret = wlan_pcie_set_host_int_select_mask(pmadapter, MTRUE); if (ret) { @@ -849,7 +880,6 @@ static mlan_status wlan_enable_pcie_host_int(mlan_adapter *pmadapter) return ret; } } -#endif ret = wlan_pcie_enable_host_int_mask(pmadapter); LEAVE(); return ret; @@ -870,9 +900,7 @@ static mlan_status wlan_pcie_create_txbd_ring(mlan_adapter *pmadapter) #if defined(PCIE8997) || defined(PCIE8897) pmlan_pcie_data_buf ptx_bd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) padma_dual_desc_buf padma_bd_buf; -#endif ENTER(); /* @@ -892,12 +920,10 @@ static mlan_status wlan_pcie_create_txbd_ring(mlan_adapter *pmadapter) pmadapter->pcard_pcie->txrx_bd_size; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) pmadapter->pcard_pcie->txbd_ring_size = sizeof(adma_dual_desc_buf) * pmadapter->pcard_pcie->txrx_bd_size; -#endif PRINTM(MINFO, "TX ring: allocating %d bytes\n", pmadapter->pcard_pcie->txbd_ring_size); @@ -923,7 +949,6 @@ static mlan_status wlan_pcie_create_txbd_ring(mlan_adapter *pmadapter) for (i = 0; i < pmadapter->pcard_pcie->txrx_bd_size; i++) { pmadapter->pcard_pcie->tx_buf_list[i] = MNULL; -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf @@ -940,7 +965,6 @@ static mlan_status wlan_pcie_create_txbd_ring(mlan_adapter *pmadapter) padma_bd_buf->pkt_size = 0; padma_bd_buf->reserved = 0; } -#endif #if defined(PCIE8997) || defined(PCIE8897) if (!pmadapter->pcard_pcie->reg->use_adma) { @@ -978,9 +1002,7 @@ static mlan_status wlan_pcie_delete_txbd_ring(mlan_adapter *pmadapter) #if defined(PCIE8997) || defined(PCIE8897) mlan_pcie_data_buf *ptx_bd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif ENTER(); @@ -1012,7 +1034,6 @@ static mlan_status wlan_pcie_delete_txbd_ring(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf *) @@ -1026,7 +1047,6 @@ static mlan_status wlan_pcie_delete_txbd_ring(mlan_adapter *pmadapter) padma_bd_buf->reserved = 0; } } -#endif pmadapter->pcard_pcie->txbd_ring[i] = MNULL; } @@ -1064,9 +1084,7 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter) #if defined(PCIE8997) || defined(PCIE8897) mlan_pcie_data_buf *prxbd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif ENTER(); @@ -1088,7 +1106,6 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) /* * driver maintaines the write pointer and firmware maintaines the read * pointer. The read pointer starts at 0 (zero) while the write pointer @@ -1101,7 +1118,6 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter) sizeof(adma_dual_desc_buf) * pmadapter->pcard_pcie->txrx_bd_size; } -#endif PRINTM(MINFO, "RX ring: allocating %d bytes\n", pmadapter->pcard_pcie->rxbd_ring_size); @@ -1180,7 +1196,6 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf @@ -1190,14 +1205,14 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter) pmadapter->pcard_pcie->rxbd_ring[i] = (t_void *)padma_bd_buf; padma_bd_buf->paddr = wlan_cpu_to_le64(pmbuf->buf_pa); - padma_bd_buf->len = wlan_cpu_to_le16( - ALIGN_SZ(pmbuf->data_len, ADMA_ALIGN_SIZE)); + padma_bd_buf->len = wlan_cpu_to_le16(ALIGN_SZ( + pmbuf->data_len, + pmadapter->pcard_pcie->reg->adma_align_size)); padma_bd_buf->flags = wlan_cpu_to_le16( ADMA_BD_FLAG_INT_EN | ADMA_BD_FLAG_DST_HOST); padma_bd_buf->pkt_size = 0; padma_bd_buf->reserved = 0; } -#endif } LEAVE(); @@ -1219,9 +1234,7 @@ static mlan_status wlan_pcie_delete_rxbd_ring(mlan_adapter *pmadapter) #if defined(PCIE8997) || defined(PCIE8897) mlan_pcie_data_buf *prxbd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif ENTER(); for (i = 0; i < pmadapter->pcard_pcie->txrx_bd_size; i++) { @@ -1250,7 +1263,6 @@ static mlan_status wlan_pcie_delete_rxbd_ring(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf *) @@ -1264,7 +1276,6 @@ static mlan_status wlan_pcie_delete_rxbd_ring(mlan_adapter *pmadapter) padma_bd_buf->len = 0; } } -#endif pmadapter->pcard_pcie->rxbd_ring[i] = MNULL; } @@ -1301,9 +1312,7 @@ static mlan_status wlan_pcie_create_evtbd_ring(mlan_adapter *pmadapter) pmlan_pcie_evt_buf pevtbd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif ENTER(); /* @@ -1320,13 +1329,11 @@ static mlan_status wlan_pcie_create_evtbd_ring(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { pmadapter->pcard_pcie->evtbd_wrptr = MLAN_MAX_EVT_BD; pmadapter->pcard_pcie->evtbd_ring_size = sizeof(adma_dual_desc_buf) * MLAN_MAX_EVT_BD; } -#endif PRINTM(MINFO, "Evt ring: allocating %d bytes\n", pmadapter->pcard_pcie->evtbd_ring_size); @@ -1392,7 +1399,6 @@ static mlan_status wlan_pcie_create_evtbd_ring(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf @@ -1402,14 +1408,14 @@ static mlan_status wlan_pcie_create_evtbd_ring(mlan_adapter *pmadapter) pmadapter->pcard_pcie->evtbd_ring[i] = (t_void *)padma_bd_buf; padma_bd_buf->paddr = wlan_cpu_to_le64(pmbuf->buf_pa); - padma_bd_buf->len = wlan_cpu_to_le16( - ALIGN_SZ(pmbuf->data_len, ADMA_ALIGN_SIZE)); + padma_bd_buf->len = wlan_cpu_to_le16(ALIGN_SZ( + pmbuf->data_len, + pmadapter->pcard_pcie->reg->adma_align_size)); padma_bd_buf->flags = wlan_cpu_to_le16( ADMA_BD_FLAG_INT_EN | ADMA_BD_FLAG_DST_HOST); padma_bd_buf->pkt_size = 0; padma_bd_buf->reserved = 0; } -#endif } LEAVE(); @@ -1431,9 +1437,7 @@ static mlan_status wlan_pcie_delete_evtbd_ring(mlan_adapter *pmadapter) #if defined(PCIE8997) || defined(PCIE8897) mlan_pcie_evt_buf *pevtbd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif ENTER(); for (i = 0; i < MLAN_MAX_EVT_BD; i++) { @@ -1461,7 +1465,6 @@ static mlan_status wlan_pcie_delete_evtbd_ring(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf *) @@ -1475,7 +1478,6 @@ static mlan_status wlan_pcie_delete_evtbd_ring(mlan_adapter *pmadapter) padma_bd_buf->reserved = 0; } } -#endif pmadapter->pcard_pcie->evtbd_ring[i] = MNULL; } @@ -1658,7 +1660,6 @@ static t_u8 wlan_check_tx_pending_buffer(mlan_adapter *pmadapter, t_u32 rdptr) return MFALSE; } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { if ((pmadapter->pcard_pcie->txbd_rdptr & ADMA_RW_PTR_WRAP_MASK) != (rdptr & ADMA_RW_PTR_WRAP_MASK)) @@ -1666,7 +1667,6 @@ static t_u8 wlan_check_tx_pending_buffer(mlan_adapter *pmadapter, t_u32 rdptr) else return MFALSE; } -#endif return MFALSE; } @@ -1692,10 +1692,8 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter) pmadapter->pcard_pcie->reg->txrx_rw_ptr_rollover_ind; mlan_pcie_data_buf *ptx_bd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; t_u32 wrptr; -#endif ENTER(); @@ -1716,7 +1714,6 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter) rdptr = rdptr >> TXBD_RW_PTR_START; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { wrptr = rdptr & 0xffff; rdptr = rdptr >> ADMA_RPTR_START; @@ -1724,7 +1721,6 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter) PRINTM(MERROR, "wlan: Unexpected wrptr 0x%x 0x%x\n", wrptr, pmadapter->pcard_pcie->txbd_wrptr); } -#endif /* free from previous txbd_rdptr to current txbd_rdptr */ while (wlan_check_tx_pending_buffer(pmadapter, rdptr)) { @@ -1776,7 +1772,6 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter) txrx_rw_ptr_rollover_ind); } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf *)pmadapter->pcard_pcie @@ -1790,7 +1785,6 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter) pmadapter->pcard_pcie->txbd_rdptr &= ADMA_RW_PTR_WRAP_MASK; } -#endif } if (unmap_count) @@ -1816,11 +1810,9 @@ done: ((wrptr & rollover_ind) == (rdptr & rollover_ind))) #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) #define ADMA_TXBD_IS_FULL(wrptr, rdptr, mask, rollover_ind) \ (((wrptr & mask) == (rdptr & mask)) && \ ((wrptr & rollover_ind) != (rdptr & rollover_ind))) -#endif static t_u8 wlan_check_txbd_not_full(mlan_adapter *pmadapter) { @@ -1840,7 +1832,6 @@ static t_u8 wlan_check_txbd_not_full(mlan_adapter *pmadapter) return MFALSE; } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { txrx_rw_ptr_mask = pmadapter->pcard_pcie->txrx_bd_size - 1; txrx_rw_ptr_rollover_ind = pmadapter->pcard_pcie->txrx_bd_size; @@ -1852,7 +1843,6 @@ static t_u8 wlan_check_txbd_not_full(mlan_adapter *pmadapter) else return MFALSE; } -#endif return MFALSE; } @@ -1878,9 +1868,7 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type, pmadapter->pcard_pcie->reg->txrx_rw_ptr_rollover_ind; mlan_pcie_data_buf *ptx_bd_buf = MNULL; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf = MNULL; -#endif const t_u32 num_tx_buffs = pmadapter->pcard_pcie->txrx_bd_size; mlan_status ret = MLAN_STATUS_PENDING; pmlan_callbacks pcb = &pmadapter->callbacks; @@ -1961,19 +1949,21 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type, } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { wr_ptr_start = ADMA_WPTR_START; padma_bd_buf = (adma_dual_desc_buf *)pmadapter ->pcard_pcie->txbd_ring[wrindx]; padma_bd_buf->paddr = wlan_cpu_to_le64(pmbuf->buf_pa); - padma_bd_buf->len = - ALIGN_SZ(pmbuf->data_len, ADMA_ALIGN_SIZE); + padma_bd_buf->len = ALIGN_SZ( + pmbuf->data_len, + pmadapter->pcard_pcie->reg->adma_align_size); padma_bd_buf->flags = wlan_cpu_to_le16( ADMA_BD_FLAG_SOP | ADMA_BD_FLAG_EOP | ADMA_BD_FLAG_INT_EN | ADMA_BD_FLAG_SRC_HOST); - if (padma_bd_buf->len < ADMA_MIN_PKT_SIZE) - padma_bd_buf->len = ADMA_MIN_PKT_SIZE; + if (padma_bd_buf->len < + pmadapter->pcard_pcie->reg->adma_min_pkt_size) + padma_bd_buf->len = pmadapter->pcard_pcie->reg + ->adma_min_pkt_size; padma_bd_buf->len = wlan_cpu_to_le16(padma_bd_buf->len); padma_bd_buf->pkt_size = padma_bd_buf->len; pmadapter->pcard_pcie->last_tx_pkt_size[wrindx] = @@ -1982,7 +1972,6 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type, pmadapter->pcard_pcie->txbd_wrptr &= ADMA_RW_PTR_WRAP_MASK; } -#endif pmadapter->pcard_pcie->txbd_pending++; PRINTM(MINFO, "REG_TXBD_WRPT(0x%x) = 0x%x\n", reg_txbd_wrptr, ((pmadapter->pcard_pcie->txbd_wrptr << wr_ptr_start) | @@ -2053,7 +2042,6 @@ done_unmap: ptx_bd_buf->offset = 0; } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma && padma_bd_buf) { padma_bd_buf->paddr = 0; padma_bd_buf->len = 0; @@ -2061,7 +2049,6 @@ done_unmap: padma_bd_buf->pkt_size = 0; padma_bd_buf->reserved = 0; } -#endif done: LEAVE(); return ret; @@ -2093,7 +2080,6 @@ static t_u8 wlan_check_rx_pending_buffer(mlan_adapter *pmadapter, t_u32 rdptr) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { if ((pmadapter->pcard_pcie->rxbd_rdptr & ADMA_RW_PTR_WRAP_MASK) != (rdptr & ADMA_RW_PTR_WRAP_MASK)) @@ -2101,7 +2087,6 @@ static t_u8 wlan_check_rx_pending_buffer(mlan_adapter *pmadapter, t_u32 rdptr) else return MFALSE; } -#endif return MFALSE; } @@ -2139,7 +2124,6 @@ static t_u8 wlan_is_rx_pending_full(mlan_adapter *pmadapter, t_u32 rdptr) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { PRINTM(MDATA, "local wrptr: 0x%x -> reg rdptr: 0x%x\n", (pmadapter->pcard_pcie->rxbd_wrptr & @@ -2151,7 +2135,6 @@ static t_u8 wlan_is_rx_pending_full(mlan_adapter *pmadapter, t_u32 rdptr) else return MFALSE; } -#endif return MFALSE; } @@ -2179,9 +2162,7 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter) pmadapter->pcard_pcie->reg->txrx_rw_ptr_rollover_ind; mlan_pcie_data_buf *prxbd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif t_u32 in_ts_sec, in_ts_usec; ENTER(); @@ -2193,10 +2174,8 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter) ret = MLAN_STATUS_FAILURE; goto done; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) rdptr = rdptr >> ADMA_RPTR_START; -#endif if (pmadapter->tp_state_on && wlan_is_rx_pending_full(pmadapter, rdptr)) { @@ -2354,14 +2333,14 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter) txbd_val = txbd_val << TXBD_RW_PTR_START; } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf *)pmadapter->pcard_pcie ->rxbd_ring[rd_index]; padma_bd_buf->paddr = wlan_cpu_to_le64(pmbuf->buf_pa); - padma_bd_buf->len = wlan_cpu_to_le16( - ALIGN_SZ(pmbuf->data_len, ADMA_ALIGN_SIZE)); + padma_bd_buf->len = wlan_cpu_to_le16(ALIGN_SZ( + pmbuf->data_len, + pmadapter->pcard_pcie->reg->adma_align_size)); padma_bd_buf->flags = wlan_cpu_to_le16( ADMA_BD_FLAG_INT_EN | ADMA_BD_FLAG_DST_HOST); padma_bd_buf->pkt_size = 0; @@ -2373,7 +2352,6 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter) pmadapter->pcard_pcie->rxbd_wrptr &= ADMA_RW_PTR_WRAP_MASK; } -#endif PRINTM(MINFO, "RECV DATA: Updated \n", pmadapter->pcard_pcie->rxbd_wrptr, rdptr); @@ -2396,10 +2374,8 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter) ret = MLAN_STATUS_FAILURE; goto done; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) rdptr = rdptr >> ADMA_RPTR_START; -#endif } done: @@ -2542,7 +2518,6 @@ static mlan_status wlan_pcie_send_cmd(mlan_adapter *pmadapter, } } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { /* To send a command, the driver will: 1. driver prepare the cmdrep buffer for adma @@ -2560,7 +2535,6 @@ static mlan_status wlan_pcie_send_cmd(mlan_adapter *pmadapter, pmadapter->pcard_pcie->cmd_buf->data_len, MFALSE); } -#endif done: if ((ret == MLAN_STATUS_FAILURE) && pmadapter) pmadapter->cmd_sent = MFALSE; @@ -2710,7 +2684,6 @@ static mlan_status wlan_pcie_process_cmd_resp(mlan_adapter *pmadapter) } } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { /* Clear the cmd-rsp buffer address in adma registers. This will prevent firmware from writing to the same @@ -2723,7 +2696,6 @@ static mlan_status wlan_pcie_process_cmd_resp(mlan_adapter *pmadapter) goto done; } } -#endif } done: @@ -2778,7 +2750,6 @@ static t_u8 wlan_check_evt_buffer(mlan_adapter *pmadapter, t_u32 rdptr) return MFALSE; } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { if ((pmadapter->pcard_pcie->evtbd_rdptr & ADMA_RW_PTR_WRAP_MASK) != (rdptr & ADMA_RW_PTR_WRAP_MASK)) @@ -2786,7 +2757,6 @@ static t_u8 wlan_check_evt_buffer(mlan_adapter *pmadapter, t_u32 rdptr) else return MFALSE; } -#endif return MFALSE; } @@ -2806,9 +2776,7 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter) #if defined(PCIE8997) || defined(PCIE8897) mlan_pcie_evt_buf *pevtbd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif ENTER(); if (pmadapter->event_received) { @@ -2832,10 +2800,8 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter) LEAVE(); return MLAN_STATUS_FAILURE; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) rdptr = rdptr >> ADMA_RPTR_START; -#endif PRINTM(MINFO, "EvtRdy: Initial \n", pmadapter->pcard_pcie->evtbd_wrptr, rdptr); if (wlan_check_evt_buffer(pmadapter, rdptr)) { @@ -2863,7 +2829,6 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf *)pmadapter->pcard_pcie @@ -2874,7 +2839,6 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter) padma_bd_buf->pkt_size = 0; padma_bd_buf->reserved = 0; } -#endif pmadapter->pcard_pcie->evt_buf_list[rd_index] = MNULL; event = *((t_u32 *)&pmbuf_evt->pbuf[pmbuf_evt->data_offset + @@ -2912,11 +2876,9 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) pmadapter->pcard_pcie->evtbd_rdptr &= ADMA_RW_PTR_WRAP_MASK; -#endif /* Do not update the event write pointer here, wait till the buffer is released. This is just to make things simpler, @@ -2957,9 +2919,7 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter, #if defined(PCIE8997) || defined(PCIE8897) mlan_pcie_evt_buf *pevtbd_buf; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) adma_dual_desc_buf *padma_bd_buf; -#endif ENTER(); if (!pmbuf) { @@ -2981,10 +2941,8 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter, ret = MLAN_STATUS_FAILURE; goto done; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) rdptr = rdptr >> ADMA_RPTR_START; -#endif if (!pmadapter->pcard_pcie->evt_buf_list[wrptr]) { pmbuf->data_len = MAX_EVENT_SIZE; @@ -3012,20 +2970,19 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter, } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { padma_bd_buf = (adma_dual_desc_buf *)pmadapter ->pcard_pcie->evtbd_ring[wrptr]; padma_bd_buf->paddr = wlan_cpu_to_le64(pmbuf->buf_pa); - padma_bd_buf->len = wlan_cpu_to_le16( - ALIGN_SZ(pmbuf->data_len, ADMA_ALIGN_SIZE)); + padma_bd_buf->len = wlan_cpu_to_le16(ALIGN_SZ( + pmbuf->data_len, + pmadapter->pcard_pcie->reg->adma_align_size)); padma_bd_buf->flags = 0; padma_bd_buf->flags = wlan_cpu_to_le16( ADMA_BD_FLAG_INT_EN | ADMA_BD_FLAG_DST_HOST); padma_bd_buf->pkt_size = 0; padma_bd_buf->reserved = 0; } -#endif pmbuf = MNULL; } else { PRINTM(MINFO, @@ -3048,10 +3005,8 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter, } } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) pmadapter->pcard_pcie->evtbd_wrptr &= ADMA_RW_PTR_WRAP_MASK; -#endif PRINTM(MINFO, "EvtCom: Updated \n", pmadapter->pcard_pcie->evtbd_wrptr, rdptr); @@ -3281,8 +3236,8 @@ static mlan_status wlan_pcie_prog_fw_w_helper(mlan_adapter *pmadapter, if (IS_PCIE9097(pmadapter->card_type)) check_fw_status = MTRUE; #endif -#if defined(PCIENW62X) - if (IS_PCIENW62X(pmadapter->card_type)) +#if defined(PCIEIW62X) + if (IS_PCIEIW62X(pmadapter->card_type)) check_fw_status = MTRUE; #endif @@ -3493,23 +3448,29 @@ mlan_status wlan_get_pcie_device(pmlan_adapter pmadapter) pmadapter->pcard_pcie->txrx_bd_size = MAX_TXRX_BD; break; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) +#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW62X) case CARD_TYPE_PCIE9097: case CARD_TYPE_PCIE9098: - case CARD_TYPE_PCIENW62X: + case CARD_TYPE_PCIEIW62X: pmadapter->pcard_pcie->reg = &mlan_reg_pcie9098; pmadapter->pcard_info = &mlan_card_info_pcie9098; pmadapter->pcard_pcie->txrx_bd_size = ADMA_DEF_TXRX_BD; pmadapter->pcard_pcie->txrx_num_desc = TXRX_DEF_NUM_DESC; -#if defined(PCIE9097) || defined(PCIENW62X) +#if defined(PCIE9097) || defined(PCIEIW62X) if ((card_type == CARD_TYPE_PCIE9097 && pmadapter->card_rev == CHIP_9097_REV_B0) || - (card_type == CARD_TYPE_PCIENW62X)) + (card_type == CARD_TYPE_PCIEIW62X)) pmadapter->pcard_pcie->reg = &mlan_reg_pcie9097_b0; #endif break; #endif + case CARD_TYPE_PCIEAW693: + pmadapter->pcard_pcie->reg = &mlan_reg_pcieaw693; + pmadapter->pcard_info = &mlan_card_info_pcie9098; + pmadapter->pcard_pcie->txrx_bd_size = ADMA_DEF_TXRX_BD; + pmadapter->pcard_pcie->txrx_num_desc = TXRX_DEF_NUM_DESC; + break; default: PRINTM(MERROR, "can't get right pcie card type \n"); ret = MLAN_STATUS_FAILURE; @@ -3675,7 +3636,7 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter) goto done; } if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_done) { - if (pmadapter->cmd_sent) { + if (pmadapter->cmd_sent && !pmadapter->vdll_ctrl.vdll_len) { PRINTM(MINFO, "<--- CMD sent Interrupt --->\n"); pmadapter->cmd_sent = MFALSE; } @@ -3683,7 +3644,6 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter) if (ret) goto done; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld && (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_dnld)) { if (pmadapter->cmd_sent) @@ -3692,7 +3652,6 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter) wlan_pcie_send_vdll_complete(pmadapter); PRINTM(MINFO, "<--- CMD DNLD DONE Interrupt --->\n"); } -#endif PRINTM(MINFO, "cmd_sent=%d data_sent=%d\n", pmadapter->cmd_sent, pmadapter->data_sent); @@ -3799,7 +3758,8 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter) pmadapter->pcard_pcie->reg->host_intr_cmd_done) { pcie_ireg &= ~pmadapter->pcard_pcie->reg->host_intr_cmd_done; - if (pmadapter->cmd_sent) { + if (pmadapter->cmd_sent && + !pmadapter->vdll_ctrl.vdll_len) { PRINTM(MINFO, "<--- CMD sent Interrupt --->\n"); pmadapter->cmd_sent = MFALSE; } @@ -3807,7 +3767,6 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter) if (ret) goto done; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld && (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_dnld)) { @@ -3819,7 +3778,6 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter) wlan_pcie_send_vdll_complete(pmadapter); PRINTM(MINFO, "<--- CMD DNLD DONE Interrupt --->\n"); } -#endif if (pmadapter->pcard_pcie->pcie_int_mode == PCIE_INT_MODE_MSI) { pcb->moal_spin_lock(pmadapter->pmoal_handle, pmadapter->pint_lock); @@ -4103,10 +4061,8 @@ mlan_status wlan_pcie_host_to_card(pmlan_private pmpriv, t_u8 type, ret = wlan_pcie_send_data(pmadapter, type, pmbuf, tx_param); else if (type == MLAN_TYPE_CMD) ret = wlan_pcie_send_cmd(pmadapter, pmbuf); -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) else if (type == MLAN_TYPE_VDLL) ret = wlan_pcie_send_vdll(pmadapter, pmbuf); -#endif LEAVE(); return ret; } @@ -4231,13 +4187,12 @@ mlan_status wlan_alloc_pcie_ring_buf(pmlan_adapter pmadapter) mlan_status ret = MLAN_STATUS_SUCCESS; ENTER(); -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || - (pmadapter->card_type == CARD_TYPE_PCIENW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEIW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == CARD_TYPE_PCIE9097)) { wlan_pcie_init_adma_ring_size(pmadapter); } -#endif pmadapter->pcard_pcie->cmdrsp_buf = MNULL; ret = wlan_pcie_create_txbd_ring(pmadapter); if (ret) @@ -4289,8 +4244,9 @@ mlan_status wlan_free_pcie_ring_buf(pmlan_adapter pmadapter) pmadapter->pcard_pcie->cmdrsp_buf = MNULL; #ifdef RPTR_MEM_COP if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || + (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == - CARD_TYPE_PCIENW62X)(pmadapter->card_type == CARD_TYPE_PCIE9097)) + CARD_TYPE_PCIEIW62X)(pmadapter->card_type == CARD_TYPE_PCIE9097)) wlan_pcie_free_rdptrs(pmadapter); #endif @@ -4377,7 +4333,6 @@ mlan_status wlan_set_pcie_buf_config(mlan_private *pmpriv) } } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (pmadapter->pcard_pcie->reg->use_adma) { /** config ADMA for Tx Data */ wlan_init_adma(pmadapter, ADMA_TX_DATA, @@ -4398,7 +4353,6 @@ mlan_status wlan_set_pcie_buf_config(mlan_private *pmpriv) pmadapter->pcard_pcie->cmdrsp_buf->buf_pa, 0, MTRUE); } -#endif wlan_pcie_init_fw(pmadapter); LEAVE(); return ret; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_pcie.h b/mxm_wifiex/wlan_src/mlan/mlan_pcie.h index bd17a18..54f1c5c 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_pcie.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_pcie.h @@ -169,8 +169,12 @@ Change log: #define ADMA_BD_FLAG_DST_HOST MBIT(4) /** ADMA MIN PKT SIZE */ #define ADMA_MIN_PKT_SIZE 128 +/** ADMA MIN PKT SIZE 32 */ +#define ADMA_MIN_PKT_SIZE_32 32 /** ADMA dual descriptor mode requir 8 bytes alignment in buf size */ #define ADMA_ALIGN_SIZE 8 +/** ADMA dual descriptor mode requir 8 bytes alignment in buf size */ +#define ADMA_ALIGN_SIZE_1 1 /** ADMA RW_PTR wrap mask */ #define ADMA_RW_PTR_WRAP_MASK 0x00001FFF /** ADMA MSIX DOORBEEL DATA */ @@ -182,7 +186,6 @@ Change log: /** PF start bit */ #define ADMA_MSIX_PF_BIT 24 -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) /** PCIE9098 dev_id/vendor id reg */ #define PCIE9098_DEV_ID_REG 0x0000 /** PCIE revision ID register */ @@ -319,7 +322,6 @@ Change log: #define PCIE9098_HOST_INTR_SEL_MASK \ (PCIE9098_HOST_INTR_DNLD_DONE | PCIE9098_HOST_INTR_UPLD_RDY | \ PCIE9098_HOST_INTR_CMD_DONE | PCIE9098_HOST_INTR_EVENT_RDY) -#endif #if defined(PCIE8997) || defined(PCIE8897) /* PCIE INTERNAL REGISTERS */ diff --git a/mxm_wifiex/wlan_src/mlan/mlan_scan.c b/mxm_wifiex/wlan_src/mlan/mlan_scan.c index 75beff5..f950e9c 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_scan.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_scan.c @@ -6,7 +6,7 @@ * for sending scan commands to the firmware. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -508,6 +508,7 @@ static t_u8 wlan_scan_create_channel_list( band = pmpriv->config_bands; if (!wlan_is_band_compatible(band, pscan_region->band)) continue; + for (next_chan = 0; next_chan < pscan_region->num_cfp; next_chan++) { /* Set the default scan type to the user specified type, @@ -688,6 +689,7 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf, MrvlIEtypes_Extension_t *phe_cap; t_u16 len = 0; t_u8 radio_type = 0; + t_u8 channel = 0; mlan_callbacks *pcb = (mlan_callbacks *)&pmadapter->callbacks; @@ -711,7 +713,6 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf, /* check expiry before preparing scan list - may affect blacklist */ wlan_11h_get_csa_closed_channel(pmpriv); - pchan_tlv_out->header.type = wlan_cpu_to_le16(TLV_TYPE_CHANLIST); /* Set the temp channel struct pointer to the start of the desired list @@ -763,12 +764,15 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf, first_chan = 0; } radio_type = ptmp_chan_list->bandcfg.chanBand; + channel = ptmp_chan_list->chan_number; PRINTM(MCMD_D, - "Scan: Chan(%3d), bandcfg(%x), Mode(%d,%d), Dur(%d)\n", + "Scan: Chan(%3d), bandcfg(%x), Mode(%d,%d,%d), Dur(%d)\n", ptmp_chan_list->chan_number, ptmp_chan_list->bandcfg, ptmp_chan_list->chan_scan_mode.passive_scan, ptmp_chan_list->chan_scan_mode.disable_chan_filt, + ptmp_chan_list->chan_scan_mode + .passive_to_active_scan, wlan_le16_to_cpu(ptmp_chan_list->max_scan_time)); if (foundJPch14 == MTRUE) { @@ -1128,7 +1132,7 @@ static mlan_status wlan_scan_setup_scan_config( t_u8 *ptlv_pos; t_u32 num_probes; t_u32 ssid_len; - t_u32 chan_idx; + t_u32 chan_idx = 0; t_u32 chan_list_idx = 0; t_u32 scan_type; t_u16 scan_dur; @@ -1594,7 +1598,6 @@ static mlan_status wlan_scan_setup_scan_config( *pscan_current_only = MTRUE; PRINTM(MINFO, "Scan: Scanning current channel only\n"); } - } else { num_of_channel = wlan_scan_create_channel_list(pmpriv, puser_scan_in, @@ -4199,6 +4202,7 @@ mlan_status wlan_scan_networks(mlan_private *pmpriv, t_void *pioctl_buf, t_u8 filtered_scan; t_u8 scan_current_chan_only; t_u8 max_chan_per_scan; + t_u8 i; ENTER(); @@ -4229,10 +4233,6 @@ mlan_status wlan_scan_networks(mlan_private *pmpriv, t_void *pioctl_buf, return MLAN_STATUS_FAILURE; } - memset(pmadapter, pscan_chan_list, 0x00, buf_size); - memset(pmadapter, pscan_cfg_out, 0x00, - sizeof(wlan_scan_cmd_config_tlv)); - keep_previous_scan = MFALSE; ret = wlan_scan_setup_scan_config(pmpriv, puser_scan_in, @@ -4265,6 +4265,17 @@ mlan_status wlan_scan_networks(mlan_private *pmpriv, t_void *pioctl_buf, } else { wlan_scan_delete_ageout_entry(pmpriv); } + + // back up the pchan_stats before reset it + memset(pmadapter, pmadapter->pold_chan_stats, 0x00, + sizeof(ChanStatistics_t) * pmadapter->num_in_chan_stats); + memcpy_ext(pmpriv->adapter, pmadapter->pold_chan_stats, + pmadapter->pchan_stats, + sizeof(ChanStatistics_t) * pmadapter->num_in_chan_stats, + sizeof(ChanStatistics_t) * pmadapter->num_in_chan_stats); + pmadapter->old_idx_chan_stats = pmadapter->idx_chan_stats; + for (i = 0; i < pmadapter->num_in_chan_stats; i++) + pmadapter->pchan_stats[i].cca_scan_duration = 0; pmadapter->idx_chan_stats = 0; ret = wlan_scan_channel_list(pmpriv, pioctl_buf, max_chan_per_scan, @@ -4365,10 +4376,11 @@ static t_bool wlan_active_scan_req_for_passive_chan(mlan_private *pmpriv, t_u32 bss_idx, i; t_u8 null_ssid[MLAN_MAX_SSID_LENGTH] = {0}; mlan_callbacks *pcb = (mlan_callbacks *)&pmpriv->adapter->callbacks; - wlan_user_scan_cfg *user_scan_cfg; + wlan_user_scan_cfg *user_scan_cfg = MNULL; mlan_ds_scan *pscan = (mlan_ds_scan *)pioctl_buf->pbuf; mlan_scan_req *pscan_req = MNULL; wlan_user_scan_cfg *puser_scan_in = MNULL; + t_u16 band; ENTER(); @@ -4392,7 +4404,6 @@ static t_bool wlan_active_scan_req_for_passive_chan(mlan_private *pmpriv, PRINTM(MERROR, "Memory allocation for user_scan_cfg failed\n"); goto done; } - memset(pmadapter, user_scan_cfg, 0, sizeof(wlan_user_scan_cfg)); for (bss_idx = 0; bss_idx < pmadapter->num_in_scan_table; bss_idx++) { scan_reqd = MFALSE; if (!memcmp(pmadapter, @@ -4439,12 +4450,15 @@ static t_bool wlan_active_scan_req_for_passive_chan(mlan_private *pmpriv, if (scan_reqd) { chan_listed = MFALSE; for (i = 0; i < id; i++) { + band = radio_type_to_band( + user_scan_cfg->chan_list[i] + .radio_type); + if ((user_scan_cfg->chan_list[i] .chan_number == pmadapter->pscan_table[bss_idx] .channel) && - (user_scan_cfg->chan_list[i] - .radio_type & + (band & pmadapter->pscan_table[bss_idx] .bss_band)) { chan_listed = MTRUE; @@ -4466,6 +4480,9 @@ static t_bool wlan_active_scan_req_for_passive_chan(mlan_private *pmpriv, user_scan_cfg->chan_list[id].scan_type = MLAN_SCAN_TYPE_ACTIVE; id++; + + if (id >= WLAN_USER_SCAN_CHAN_MAX) + break; } } } @@ -4485,16 +4502,20 @@ static t_bool wlan_active_scan_req_for_passive_chan(mlan_private *pmpriv, MLAN_MAX_SSID_LENGTH); } user_scan_cfg->keep_previous_scan = MTRUE; + if (pmadapter->ext_scan_type == EXT_SCAN_ENHANCE) + user_scan_cfg->ext_scan_type = EXT_SCAN_ENHANCE; + PRINTM(MCMND, "active scan request for passive channel %d\n", + id); if (MLAN_STATUS_SUCCESS != wlan_scan_networks(pmpriv, pioctl_buf, user_scan_cfg)) { goto done; } ret = MTRUE; } +done: if (user_scan_cfg) pcb->moal_mfree(pmadapter->pmoal_handle, (t_u8 *)user_scan_cfg); -done: LEAVE(); return ret; } @@ -4542,7 +4563,7 @@ mlan_status wlan_ret_802_11_scan(mlan_private *pmpriv, HostCmd_DS_COMMAND *resp, t_u32 num_in_table; t_u32 bss_idx; t_u32 idx; - t_u32 tlv_buf_size; + t_u32 tlv_buf_size = 0; t_u64 tsf_val; chan_freq_power_t *cfp; MrvlIEtypes_ChanBandListParamSet_t *pchan_band_tlv = MNULL; @@ -4593,10 +4614,21 @@ mlan_status wlan_ret_802_11_scan(mlan_private *pmpriv, HostCmd_DS_COMMAND *resp, * BSS Descriptions (bss_descript_size as bytesLef) and the command * response header (S_DS_GEN) */ - tlv_buf_size = scan_resp_size - - (bytes_left + sizeof(pscan_rsp->bss_descript_size) + - sizeof(pscan_rsp->number_of_sets) + S_DS_GEN); - if (is_bgscan_resp) + if (scan_resp_size > + (bytes_left + sizeof(pscan_rsp->bss_descript_size) + + sizeof(pscan_rsp->number_of_sets) + S_DS_GEN)) { + tlv_buf_size = + (scan_resp_size - + (bytes_left + sizeof(pscan_rsp->bss_descript_size) + + sizeof(pscan_rsp->number_of_sets) + S_DS_GEN)); + } else { + PRINTM(MERROR, + "scan_resp_size: Incorrect size of TLV buff size.\n"); + } + + if (is_bgscan_resp && + (tlv_buf_size > + sizeof(resp->params.bg_scan_query_resp.report_condition))) tlv_buf_size -= sizeof( resp->params.bg_scan_query_resp.report_condition); @@ -5952,7 +5984,7 @@ mlan_status wlan_handle_event_ext_scan_status(mlan_private *pmpriv, t_u16 tlv_buf_left, tlv_len, tlv_type; MrvlIEtypesHeader_t *tlv; MrvlIEtypes_ChannelStats_t *tlv_chan_stats; - t_u8 status; + t_u8 status = 0; cmd_ctrl_node *pcmd_node = MNULL; ENTER(); @@ -6083,7 +6115,8 @@ done: wlan_release_cmd_lock(pmadapter); wlan_move_cmd_to_cmd_pending_q(pmadapter); pmadapter->bgscan_reported = MFALSE; - wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_SCAN_REPORT, MNULL); + if (!status) + wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_SCAN_REPORT, MNULL); LEAVE(); return ret; } @@ -6130,10 +6163,9 @@ mlan_status wlan_cmd_802_11_bg_scan_query(mlan_private *pmpriv, * * @return channel number */ -static t_u8 -wlan_bgscan_create_channel_list(mlan_private *pmpriv, - const wlan_bgscan_cfg *pbg_scan_in, - MrvlIEtypes_ChanListParamSet_t *tlv_chan_list) +static t_u8 wlan_bgscan_create_channel_list( + mlan_private *pmpriv, const wlan_bgscan_cfg *pbg_scan_in, + MrvlIEtypes_ChanListParamSet_t *tlv_chan_list, t_u8 max_bgscan_chan) { mlan_adapter *pmadapter = pmpriv->adapter; region_chan_t *pscan_region; @@ -6182,7 +6214,7 @@ wlan_bgscan_create_channel_list(mlan_private *pmpriv, continue; for (next_chan = 0; next_chan < pscan_region->num_cfp; next_chan++, chan_idx++) { - if (chan_idx >= WLAN_BG_SCAN_CHAN_MAX) + if (chan_idx >= max_bgscan_chan) break; /* * Set the default scan type to ACTIVE SCAN type, will @@ -6290,6 +6322,7 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv, MrvlIETypes_HTCap_t *pht_cap = MNULL; MrvlIETypes_VHTCap_t *pvht_cap = MNULL; MrvlIEtypes_Extension_t *phe_cap = MNULL; + MrvlIEtypes_ScanChanGap_t *pscan_gap_tlv; t_u16 len = 0; t_u8 index; @@ -6303,10 +6336,21 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv, t_u16 scan_dur; t_u8 scan_type; t_u16 band; + t_u8 max_bgscan_chan = 0; + t_u16 scan_chan_gap = 0; const t_u8 zero_mac[6] = {0, 0, 0, 0, 0, 0}; ENTER(); + max_bgscan_chan = WLAN_BG_SCAN_CHAN_MAX; + +#if defined(SD9177) + if (IS_CARD9177(pmadapter->card_type)) + max_bgscan_chan = WLAN_BG_SCAN_CHAN_MAX_UNII_4; +#endif + + PRINTM(MCMND, "max_bgscan_chan=%d\n", max_bgscan_chan); + pcmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_BG_SCAN_CONFIG); bg_scan->action = wlan_cpu_to_le16(bg_scan_in->action); bg_scan->enable = bg_scan_in->enable; @@ -6374,6 +6418,22 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv, tlv += sizeof(MrvlIEtypes_RepeatCount_t); cmd_size += sizeof(MrvlIEtypes_RepeatCount_t); } + scan_chan_gap = (bg_scan_in->scan_chan_gap ? bg_scan_in->scan_chan_gap : + pmadapter->scan_chan_gap); + if (scan_chan_gap) { + pscan_gap_tlv = (MrvlIEtypes_ScanChanGap_t *)tlv; + PRINTM(MCMND, "bgScan: channel gap = 0x%x\n", scan_chan_gap); + pscan_gap_tlv->header.type = + wlan_cpu_to_le16(TLV_TYPE_SCAN_CHANNEL_GAP); + pscan_gap_tlv->header.len = sizeof(pscan_gap_tlv->gap); + pscan_gap_tlv->gap = + wlan_cpu_to_le16((t_u16)pmadapter->scan_chan_gap); + /** indicate FW, gap is optional */ + pscan_gap_tlv->gap |= GAP_FLAG_OPTIONAL; + tlv += sizeof(pscan_gap_tlv->header) + + pscan_gap_tlv->header.len; + cmd_size += sizeof(MrvlIEtypes_ScanChanGap_t); + } for (ssid_idx = 0; ((ssid_idx < NELEMENTS(bg_scan_in->ssid_list)) && (*bg_scan_in->ssid_list[ssid_idx].ssid || bg_scan_in->ssid_list[ssid_idx].max_len)); @@ -6404,7 +6464,7 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv, tlv_chan_list = (MrvlIEtypes_ChanListParamSet_t *)tlv; PRINTM(MINFO, "Scan: Using supplied channel list\n"); chan_num = 0; - for (chan_idx = 0; chan_idx < WLAN_BG_SCAN_CHAN_MAX && + for (chan_idx = 0; chan_idx < max_bgscan_chan && bg_scan_in->chan_list[chan_idx].chan_number; chan_idx++) { radio_type = bg_scan_in->chan_list[chan_idx].radio_type; @@ -6460,6 +6520,15 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv, pmadapter->specific_scan_time; } } + PRINTM(MCMD_D, + "BGScan: Chan(%3d), bandcfg(%x), Mode(%d), Dur(%d)\n", + tlv_chan_list->chan_scan_param[chan_num] + .chan_number, + tlv_chan_list->chan_scan_param[chan_num].bandcfg, + tlv_chan_list->chan_scan_param[chan_num] + .chan_scan_mode.passive_scan, + scan_dur); + tlv_chan_list->chan_scan_param[chan_num].min_scan_time = wlan_cpu_to_le16(scan_dur); tlv_chan_list->chan_scan_param[chan_num].max_scan_time = @@ -6476,8 +6545,8 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv, sizeof(ChanScanParamSet_t) * chan_num; } else { tlv_chan_list = (MrvlIEtypes_ChanListParamSet_t *)tlv; - chan_num = wlan_bgscan_create_channel_list(pmpriv, bg_scan_in, - tlv_chan_list); + chan_num = wlan_bgscan_create_channel_list( + pmpriv, bg_scan_in, tlv_chan_list, max_bgscan_chan); tlv_chan_list->header.type = wlan_cpu_to_le16(TLV_TYPE_CHANLIST); tlv_chan_list->header.len = @@ -6488,7 +6557,8 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv, sizeof(ChanScanParamSet_t) * chan_num; } if (bg_scan_in->chan_per_scan) { - bg_scan->chan_per_scan = bg_scan_in->chan_per_scan; + bg_scan->chan_per_scan = + MIN(max_bgscan_chan, bg_scan_in->chan_per_scan); } else { if (bg_scan_in->report_condition & BG_SCAN_WAIT_ALL_CHAN_DONE) bg_scan->chan_per_scan = chan_num; @@ -7057,8 +7127,6 @@ mlan_status wlan_scan_specific_ssid(mlan_private *pmpriv, t_void *pioctl_buf, goto done; } - memset(pmpriv->adapter, pscan_cfg, 0x00, sizeof(wlan_user_scan_cfg)); - memcpy_ext(pmpriv->adapter, pscan_cfg->ssid_list[0].ssid, preq_ssid->ssid, preq_ssid->ssid_len, MLAN_MAX_SSID_LENGTH); pscan_cfg->keep_previous_scan = MFALSE; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sdio.c b/mxm_wifiex/wlan_src/mlan/mlan_sdio.c index 8d7436b..bfcb1cb 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sdio.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sdio.c @@ -3,7 +3,7 @@ * @brief This file contains SDIO specific code * * - * Copyright 2008-2021, 2023 NXP + * Copyright 2008-2021 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -107,6 +107,7 @@ static const struct _mlan_card_info mlan_card_info_sd8887 = { .v16_fw_api = 0, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_1X1, + .support_11mc = 0, }; #endif @@ -147,6 +148,7 @@ static const struct _mlan_card_info mlan_card_info_sd8801 = { .v16_fw_api = 0, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_1X1, + .support_11mc = 0, }; #endif @@ -217,12 +219,10 @@ static const struct _mlan_card_info mlan_card_info_sd8897 = { .v16_fw_api = 0, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 0, }; #endif -#if defined(SD8977) || defined(SD8997) || defined(SD8987) || \ - defined(SD9098) || defined(SD9097) || defined(SDNW62X) || \ - defined(SD8978) || defined(SD9177) static const struct _mlan_sdio_card_reg mlan_reg_sd8977_sd8997 = { .start_rd_port = 0, .start_wr_port = 0, @@ -289,7 +289,6 @@ static const struct _mlan_sdio_card_reg mlan_reg_sd8977_sd8997 = { .fw_dnld_status_1_reg = 0xE9, .winner_check_reg = 0xFC, }; -#endif #ifdef SD8997 static const struct _mlan_card_info mlan_card_info_sd8997 = { @@ -297,6 +296,7 @@ static const struct _mlan_card_info mlan_card_info_sd8997 = { .v16_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif @@ -307,19 +307,30 @@ static const struct _mlan_card_info mlan_card_info_sd9097 = { .v17_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif -#ifdef SDNW62X -static const struct _mlan_card_info mlan_card_info_sdnw62x = { +#ifdef SDIW62X +static const struct _mlan_card_info mlan_card_info_sdiw62x = { .max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K, .v16_fw_api = 1, .v17_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif +static const struct _mlan_card_info mlan_card_info_sdaw693 = { + .max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K, + .v16_fw_api = 1, + .v17_fw_api = 1, + .supp_ps_handshake = 0, + .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, +}; + #ifdef SD9098 static const struct _mlan_card_info mlan_card_info_sd9098 = { .max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K, @@ -327,6 +338,7 @@ static const struct _mlan_card_info mlan_card_info_sd9098 = { .v17_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif #ifdef SD9177 @@ -336,6 +348,7 @@ static const struct _mlan_card_info mlan_card_info_sd9177 = { .v17_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_1X1, + .support_11mc = 1, }; #endif @@ -345,6 +358,7 @@ static const struct _mlan_card_info mlan_card_info_sd8977 = { .v16_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_1X1, + .support_11mc = 1, }; #endif @@ -354,6 +368,7 @@ static const struct _mlan_card_info mlan_card_info_sd8987 = { .v16_fw_api = 1, .supp_ps_handshake = 0, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_1X1, + .support_11mc = 1, }; #endif @@ -976,7 +991,7 @@ static mlan_status wlan_sdio_prog_fw_w_helper(pmlan_adapter pmadapter, t_u8 *fw, t_u8 *firmware = fw; t_u32 firmwarelen = fw_len; t_u32 offset = 0; - t_u32 base0 = 0, base1; + t_u32 base0 = 0, base1 = 0; t_void *tmpfwbuf = MNULL; t_u32 tmpfwbufsz; t_u8 *fwbuf; @@ -1015,7 +1030,6 @@ static mlan_status wlan_sdio_prog_fw_w_helper(pmlan_adapter pmadapter, t_u8 *fw, ret = MLAN_STATUS_FAILURE; goto done; } - memset(pmadapter, tmpfwbuf, 0, tmpfwbufsz); /* Ensure 8-byte aligned firmware buffer */ fwbuf = (t_u8 *)ALIGN_ADDR(tmpfwbuf, DMA_ALIGNMENT); #if defined(SD9098) @@ -1035,11 +1049,10 @@ static mlan_status wlan_sdio_prog_fw_w_helper(pmlan_adapter pmadapter, t_u8 *fw, check_fw_status = MTRUE; } #endif -#if defined(SD9097) || defined(SD9177) || defined(SDNW62X) if (IS_SD9097(pmadapter->card_type) || - IS_SDNW62X(pmadapter->card_type) || IS_SD9177(pmadapter->card_type)) + IS_SDIW62X(pmadapter->card_type) || + IS_SDAW693(pmadapter->card_type) || IS_SD9177(pmadapter->card_type)) check_fw_status = MTRUE; -#endif /* Perform firmware data transfer */ do { @@ -1163,7 +1176,7 @@ static mlan_status wlan_sdio_prog_fw_w_helper(pmlan_adapter pmadapter, t_u8 *fw, * for last block */ if (firmwarelen && firmwarelen - offset < txlen) txlen = firmwarelen - offset; - PRINTM(MINFO, "."); + PRINTM(MINFO, ".\n"); tx_blocks = (txlen + MLAN_SDIO_BLOCK_SIZE_FW_DNLD - 1) / MLAN_SDIO_BLOCK_SIZE_FW_DNLD; @@ -1334,7 +1347,7 @@ static mlan_status wlan_decode_rx_packet(mlan_adapter *pmadapter, case MLAN_TYPE_CMD: PRINTM(MINFO, "--- Rx: Cmd Response ---\n"); - if (pmadapter->cmd_sent) + if (pmadapter->cmd_sent && !pmadapter->vdll_ctrl.vdll_len) pmadapter->cmd_sent = MFALSE; /* take care of curr_cmd = NULL case */ if (!pmadapter->curr_cmd) { @@ -2419,12 +2432,16 @@ mlan_status wlan_get_sdio_device(pmlan_adapter pmadapter) pmadapter->pcard_info = &mlan_card_info_sd9097; break; #endif -#ifdef SDNW62X - case CARD_TYPE_SDNW62X: +#ifdef SDIW62X + case CARD_TYPE_SDIW62X: pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997; - pmadapter->pcard_info = &mlan_card_info_sdnw62x; + pmadapter->pcard_info = &mlan_card_info_sdiw62x; break; #endif + case CARD_TYPE_SDAW693: + pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997; + pmadapter->pcard_info = &mlan_card_info_sdaw693; + break; #ifdef SD9177 case CARD_TYPE_SD9177: pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997; @@ -3037,7 +3054,6 @@ exit: return ret; } -#if (defined(SD9098) || defined(SD9097) || defined(SDNW62X) || defined(SD9177)) /** * @brief This function sends vdll data to the card. * @@ -3079,7 +3095,6 @@ static mlan_status wlan_sdio_send_vdll(mlan_adapter *pmadapter, LEAVE(); return ret; } -#endif /** * @brief This function sends data to the card. @@ -3098,10 +3113,8 @@ static mlan_status wlan_sdio_host_to_card_ext(pmlan_private pmpriv, t_u8 type, mlan_status ret = MLAN_STATUS_SUCCESS; mlan_adapter *pmadapter = pmpriv->adapter; -#if (defined(SD9098) || defined(SD9097) || defined(SDNW62X) || defined(SD9177)) if (type == MLAN_TYPE_VDLL) return wlan_sdio_send_vdll(pmadapter, pmbuf); -#endif ret = wlan_sdio_host_to_card(pmadapter, type, pmbuf, tx_param); if (type == MLAN_TYPE_DATA && ret == MLAN_STATUS_FAILURE) @@ -3397,7 +3410,10 @@ static mlan_status wlan_pm_sdio_wakeup_card(pmlan_adapter pmadapter, pmlan_callbacks pcb = &pmadapter->callbacks; ENTER(); - PRINTM(MEVENT, "Wakeup device...\n"); + if (pmadapter->second_mac) + PRINTM(MEVENT, "#2 Wakeup device...\n"); + else + PRINTM(MEVENT, "Wakeup device...\n"); pmadapter->callbacks.moal_get_system_time(pmadapter->pmoal_handle, &pmadapter->pm_wakeup_in_secs, &age_ts_usec); @@ -3560,9 +3576,6 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter) ret = MLAN_STATUS_FAILURE; goto done; } -#if defined(SD8997) || defined(SD8977) || defined(SD8987) || \ - defined(SD9098) || defined(SD9097) || defined(SDNW62X) || \ - defined(SD8978) || defined(SD9177) if (MFALSE #ifdef SD8997 || IS_SD8997(pmadapter->card_type) @@ -3582,9 +3595,10 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter) #ifdef SD9097 || IS_SD9097(pmadapter->card_type) #endif -#ifdef SDNW62X - || IS_SDNW62X(pmadapter->card_type) +#ifdef SDIW62X + || IS_SDIW62X(pmadapter->card_type) #endif + || IS_SDAW693(pmadapter->card_type) #ifdef SD9177 || IS_SD9177(pmadapter->card_type) #endif @@ -3595,7 +3609,6 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter) HOST_TO_CARD_EVENT_REG, value | HOST_POWER_UP); } -#endif /* Poll register around 100 ms */ for (tries = 0; tries < MAX_POLL_TRIES; ++tries) { pcb->moal_read_reg(pmadapter->pmoal_handle, reset_reg, &value); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_shim.c b/mxm_wifiex/wlan_src/mlan/mlan_shim.c index fdd7140..45ba817 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_shim.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_shim.c @@ -441,6 +441,7 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter) pmadapter->multiple_dtim = pmdevice->multi_dtim; pmadapter->inact_tmo = pmdevice->inact_tmo; pmadapter->init_para.drcs_chantime_mode = pmdevice->drcs_chantime_mode; + pmadapter->second_mac = pmdevice->second_mac; pmadapter->hs_wake_interval = pmdevice->hs_wake_interval; if (pmdevice->indication_gpio != 0xff) { pmadapter->ind_gpio = pmdevice->indication_gpio & 0x0f; @@ -1386,7 +1387,8 @@ process_start: exit_main_proc: if (pmadapter->hw_status == WlanHardwareStatusClosing) - mlan_shutdown_fw(pmadapter); + if (MLAN_STATUS_SUCCESS != mlan_shutdown_fw(pmadapter)) + PRINTM(MERROR, "ERR:mlan_shutdown_fw failed\n"); LEAVE(); return ret; } @@ -1488,11 +1490,6 @@ mlan_status mlan_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) wlan_cancel_all_pending_cmd(pmadapter, MFALSE); goto exit; } - if (pioctl_req->action == MLAN_ACT_CANCEL) { - wlan_cancel_pending_ioctl(pmadapter, pioctl_req); - ret = MLAN_STATUS_SUCCESS; - goto exit; - } pmpriv = pmadapter->priv[pioctl_req->bss_index]; ret = pmpriv->ops.ioctl(adapter, pioctl_req); exit: diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c index 3550bff..62b6a85 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c @@ -1281,7 +1281,7 @@ static mlan_status wlan_cmd_802_11_key_material(pmlan_private pmpriv, S_DS_GEN + KEY_PARAMS_FIXED_LEN + sizeof(gcmp_param) + sizeof(pkey_material->action)); - + PRINTM(MCMND, "Set GCMP Key\n"); goto done; } if (pkey->key_flags & KEY_FLAG_CCMP_256) { @@ -1305,7 +1305,7 @@ static mlan_status wlan_cmd_802_11_key_material(pmlan_private pmpriv, S_DS_GEN + KEY_PARAMS_FIXED_LEN + sizeof(ccmp_256_param) + sizeof(pkey_material->action)); - + PRINTM(MCMND, "Set CCMP256 Key\n"); goto done; } if (pkey->key_len == WPA_AES_KEY_LEN && @@ -1372,7 +1372,7 @@ static mlan_status wlan_cmd_802_11_key_material(pmlan_private pmpriv, (KEY_FLAG_RX_SEQ_VALID | KEY_FLAG_TX_SEQ_VALID)) memcpy_ext(pmpriv->adapter, pkey_material->key_param_set.key_params - .cmac_aes.ipn, + .gmac_aes.ipn, pkey->pn, SEQ_MAX_SIZE, IGTK_PN_SIZE); pkey_material->key_param_set.key_info &= ~(wlan_cpu_to_le16(KEY_INFO_MCAST_KEY)); @@ -1380,10 +1380,10 @@ static mlan_status wlan_cmd_802_11_key_material(pmlan_private pmpriv, wlan_cpu_to_le16(KEY_INFO_AES_MCAST_IGTK); pkey_material->key_param_set.key_type = KEY_TYPE_ID_BIP_GMAC_256; - pkey_material->key_param_set.key_params.cmac_aes.key_len = + pkey_material->key_param_set.key_params.gmac_aes.key_len = wlan_cpu_to_le16(pkey->key_len); memcpy_ext(pmpriv->adapter, - pkey_material->key_param_set.key_params.cmac_aes.key, + pkey_material->key_param_set.key_params.gmac_aes.key, pkey->key_material, pkey->key_len, WPA_IGTK_256_KEY_LEN); pkey_material->key_param_set.length = wlan_cpu_to_le16( @@ -2724,7 +2724,7 @@ mlan_status wlan_cmd_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, if (cmd_action == HostCmd_ACT_GEN_SET) { if (net_mon->enable_net_mon) { cmd_net_mon->enable_net_mon = - wlan_cpu_to_le16((t_u16)NET_MON_MODE1); + wlan_cpu_to_le16((t_u16)NET_MON_MODE3); cmd_net_mon->filter_flag = wlan_cpu_to_le16((t_u16)net_mon->filter_flag); } @@ -3315,7 +3315,7 @@ static t_u16 mlan_prepare_roam_offload_tlv(pmlan_private pmpriv, t_u32 type, pos += sizeof(MrvlIEtypes_RepeatCount_t); } LEAVE(); - return (pos - begin); + return ((t_u16)(pos - begin)); } /** * @brief This function sends enable/disable roam offload command to firmware. @@ -3458,6 +3458,8 @@ static mlan_status wlan_cmd_auto_tx(pmlan_private pmpriv, MrvlIEtypes_Keep_Alive_Ctrl_t *ctrl_tlv = MNULL; MrvlIEtypes_Keep_Alive_Pkt_t *pkt_tlv = MNULL; mlan_ds_misc_keep_alive *misc_keep_alive = MNULL; + MrvlIEtypes_Cloud_Keep_Alive_Rx_t *keep_alive_Rx_tlv = MNULL; + mlan_ds_misc_keep_alive_rx *misc_keep_alive_rx = MNULL; t_u8 eth_ip[] = {0x08, 0x00}; ENTER(); @@ -3552,6 +3554,46 @@ static mlan_status wlan_cmd_auto_tx(pmlan_private pmpriv, } keep_alive_tlv->header.len = wlan_cpu_to_le16(len); + cmd->size = cmd->size + len + sizeof(MrvlIEtypesHeader_t); + cmd->size = wlan_cpu_to_le16(cmd->size); + break; + case OID_CLOUD_KEEP_ALIVE_ACK: + misc_keep_alive_rx = (mlan_ds_misc_keep_alive_rx *)pdata_buf; + keep_alive_Rx_tlv = (MrvlIEtypes_Cloud_Keep_Alive_Rx_t *)pos; + keep_alive_Rx_tlv->header.type = + wlan_cpu_to_le16(TLV_TYPE_CLOUD_KEEP_ALIVE_ACK); + keep_alive_Rx_tlv->keep_alive_id = + misc_keep_alive_rx->mkeep_alive_id; + keep_alive_Rx_tlv->enable = misc_keep_alive_rx->enable; + memcpy_ext(pmpriv->adapter, + keep_alive_Rx_tlv->eth_header.dest_addr, + misc_keep_alive_rx->dst_mac, MLAN_MAC_ADDR_LENGTH, + MLAN_MAC_ADDR_LENGTH); + memcpy_ext(pmpriv->adapter, + keep_alive_Rx_tlv->eth_header.src_addr, + misc_keep_alive_rx->src_mac, MLAN_MAC_ADDR_LENGTH, + MLAN_MAC_ADDR_LENGTH); + memcpy_ext(pmpriv->adapter, + (t_u8 *)&keep_alive_Rx_tlv->eth_header.h803_len, + eth_ip, sizeof(t_u16), sizeof(t_u16)); + if (misc_keep_alive_rx->ether_type) + keep_alive_Rx_tlv->eth_header.h803_len = + mlan_htons(misc_keep_alive_rx->ether_type); + else + memcpy_ext( + pmpriv->adapter, + (t_u8 *)&keep_alive_Rx_tlv->eth_header.h803_len, + eth_ip, sizeof(t_u16), sizeof(t_u16)); + memcpy_ext(pmpriv->adapter, + (t_u8 *)&keep_alive_Rx_tlv->ip_packet, + misc_keep_alive_rx->packet, + misc_keep_alive_rx->pkt_len, + MKEEP_ALIVE_ACK_PKT_MAX); + + len = sizeof(MrvlIEtypes_Cloud_Keep_Alive_Rx_t) + + misc_keep_alive_rx->pkt_len - sizeof(MrvlIEtypesHeader_t); + keep_alive_Rx_tlv->header.len = wlan_cpu_to_le16(len); + cmd->size = cmd->size + len + sizeof(MrvlIEtypesHeader_t); cmd->size = wlan_cpu_to_le16(cmd->size); break; @@ -3794,6 +3836,14 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_802_11_link_statistic(pmpriv, cmd_ptr, cmd_action, pioctl_buf); break; + case HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS: + ret = wlan_cmd_802_11_ftm_config_session_params( + pmpriv, cmd_ptr, cmd_action, cmd_oid, pdata_buf); + break; + case HostCmd_CMD_FTM_CONFIG_RESPONDER: + ret = wlan_cmd_802_11_ftm_config_responder( + pmpriv, cmd_ptr, cmd_action, cmd_oid, pdata_buf); + break; case HostCmd_CMD_RSSI_INFO: ret = wlan_cmd_802_11_rssi_info(pmpriv, cmd_ptr, cmd_action); break; @@ -4169,6 +4219,10 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_rxabortcfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_OFDM_DESENSE_CFG: + ret = wlan_cmd_ofdmdesense_cfg(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; case HostCmd_CMD_RX_ABORT_CFG_EXT: ret = wlan_cmd_rxabortcfg_ext(pmpriv, cmd_ptr, cmd_action, pdata_buf); @@ -4211,6 +4265,10 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_get_ch_load(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_CROSS_CHIP_SYNCH: + ret = wlan_cmd_cross_chip_synch(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; default: PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no); ret = MLAN_STATUS_FAILURE; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c index a70b71c..2dce752 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c @@ -888,7 +888,7 @@ static mlan_status wlan_ret_get_log(pmlan_private pmpriv, */ static mlan_status wlan_get_power_level(pmlan_private pmpriv, void *pdata_buf) { - t_u16 length = 0; + t_s32 length = 0; t_s8 max_power = -1, min_power = -1; MrvlTypes_Power_Group_t *ppg_tlv = MNULL; Power_Group_t *pg = MNULL; @@ -907,7 +907,7 @@ static mlan_status wlan_get_power_level(pmlan_private pmpriv, void *pdata_buf) min_power = pg->power_min; length -= sizeof(Power_Group_t); } - while (length) { + while (length > 0) { pg++; if (max_power < pg->power_max) max_power = pg->power_max; @@ -2632,20 +2632,22 @@ static mlan_status wlan_ret_sta_config(pmlan_private pmpriv, if (pioctl_buf->req_id == MLAN_IOCTL_BSS) { bss = (mlan_ds_bss *)pioctl_buf->pbuf; if (bss->sub_command == MLAN_OID_BSS_CHAN_INFO) { + Band_Config_t *bandcfg = + &bss->param.sta_channel.bandcfg; + tlv_band_channel = (MrvlIEtypes_channel_band_t *) cmdrsp_sta_cfg->tlv_buffer; - bss->param.sta_channel.bandcfg = - tlv_band_channel->bandcfg; + *bandcfg = tlv_band_channel->bandcfg; bss->param.sta_channel.channel = tlv_band_channel->channel; bss->param.sta_channel.is_11n_enabled = IS_11N_ENABLED(pmpriv); - if (bss->param.sta_channel.bandcfg.chanWidth == - CHAN_BW_80MHZ) + if (bandcfg->chanWidth == CHAN_BW_80MHZ) bss->param.sta_channel.center_chan = wlan_get_center_freq_idx( - pmpriv, BAND_AAC, + pmpriv, + bandcfg->chanBand, bss->param.sta_channel .channel, CHANNEL_BW_80MHZ); @@ -2752,6 +2754,8 @@ static mlan_status wlan_ret_auto_tx(pmlan_private pmpriv, MrvlIEtypes_Cloud_Keep_Alive_t *keep_alive_tlv = MNULL; MrvlIEtypes_Keep_Alive_Pkt_t *pkt_tlv = MNULL; mlan_ds_misc_keep_alive *misc_keep_alive = MNULL; + MrvlIEtypes_Cloud_Keep_Alive_Rx_t *keep_alive_Rx_tlv = MNULL; + mlan_ds_misc_keep_alive_rx *misc_keep_alive_rx = MNULL; ENTER(); @@ -2828,6 +2832,65 @@ static mlan_status wlan_ret_auto_tx(pmlan_private pmpriv, } } } + if (header->type == TLV_TYPE_CLOUD_KEEP_ALIVE_ACK) { + keep_alive_Rx_tlv = + (MrvlIEtypes_Cloud_Keep_Alive_Rx_t *) + cmdrsp_auto_tx->tlv_buffer; + misc_keep_alive_rx = (mlan_ds_misc_keep_alive_rx *)&misc + ->param.keep_alive_rx; + misc_keep_alive_rx->mkeep_alive_id = + keep_alive_Rx_tlv->keep_alive_id; + misc_keep_alive_rx->enable = keep_alive_Rx_tlv->enable; + if (((action == HostCmd_ACT_GEN_SET) || + (action == HostCmd_ACT_GEN_RESET)) && + !keep_alive_Rx_tlv->enable) { + len = len - + sizeof(keep_alive_Rx_tlv->keep_alive_id) - + sizeof(keep_alive_Rx_tlv->enable); + if (len > sizeof(MrvlIEtypesHeader_t)) { + header = (MrvlIEtypesHeader_t *) + keep_alive_Rx_tlv; + header->type = + wlan_le16_to_cpu(header->type); + len = wlan_le16_to_cpu(header->len) - + sizeof(Eth803Hdr_t); + if (header->type == + TLV_TYPE_CLOUD_KEEP_ALIVE_ACK) { + memcpy_ext( + pmpriv->adapter, + misc_keep_alive_rx + ->dst_mac, + keep_alive_Rx_tlv + ->eth_header + .dest_addr, + MLAN_MAC_ADDR_LENGTH, + sizeof(misc_keep_alive_rx + ->dst_mac)); + memcpy_ext( + pmpriv->adapter, + misc_keep_alive_rx + ->src_mac, + keep_alive_Rx_tlv + ->eth_header + .src_addr, + MLAN_MAC_ADDR_LENGTH, + sizeof(misc_keep_alive + ->src_mac)); + memcpy_ext( + pmpriv->adapter, + misc_keep_alive_rx + ->packet, + keep_alive_Rx_tlv + ->ip_packet, + len, + sizeof(misc_keep_alive + ->packet)); + misc_keep_alive_rx->pkt_len = + len; + } + } + } + } } LEAVE(); @@ -3093,6 +3156,39 @@ cmd_mfg_done: return ret; } +/** + * @brief This function handles the command response of TWT_REPORT + * + * @param pmpriv A pointer to mlan_private structure + * @param resp A pointer to HostCmd_DS_COMMAND + * @param pioctl_buf A pointer to command buffer + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_ret_twt_report(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + mlan_ds_misc_cfg *misc_cfg = MNULL; + HostCmd_DS_TWT_CFG *twt_recfg = &resp->params.twtcfg; + + ENTER(); + + if ((wlan_le16_to_cpu(twt_recfg->action) == HostCmd_ACT_GEN_GET) && + (wlan_le16_to_cpu(twt_recfg->sub_id) == + MLAN_11AX_TWT_REPORT_SUBID)) { + if (pioctl_buf) { + misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; + memcpy_ext(pmpriv->adapter, + &misc_cfg->param.twt_report_info, + &resp->params.twtcfg.param.twt_report, + sizeof(mlan_ds_twt_report), + sizeof(mlan_ds_twt_report)); + } + } + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /** * @brief This function handles the station command response * @@ -3230,6 +3326,14 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_802_11_LINK_STATS: ret = wlan_ret_get_link_statistic(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS: + ret = wlan_ret_802_11_ftm_config_session_params(pmpriv, resp, + pioctl_buf); + break; + case HostCmd_CMD_FTM_CONFIG_RESPONDER: + ret = wlan_ret_802_11_ftm_config_responder(pmpriv, resp, + pioctl_buf); + break; case HostCmd_CMD_RSSI_INFO_EXT: ret = wlan_ret_802_11_rssi_info_ext(pmpriv, resp, pioctl_buf); break; @@ -3536,6 +3640,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, ret = wlan_ret_range_ext(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_TWT_CFG: + ret = wlan_ret_twt_report(pmpriv, resp, pioctl_buf); break; case HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: ret = wlan_ret_gpio_tsf_latch(pmpriv, resp, pioctl_buf); @@ -3543,6 +3648,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_RX_ABORT_CFG: ret = wlan_ret_rxabortcfg(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_OFDM_DESENSE_CFG: + ret = wlan_ret_ofdmdesense_cfg(pmpriv, resp, pioctl_buf); + break; case HostCmd_CMD_RX_ABORT_CFG_EXT: ret = wlan_ret_rxabortcfg_ext(pmpriv, resp, pioctl_buf); break; @@ -3584,6 +3692,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_GET_CH_LOAD: ret = wlan_ret_ch_load(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_CROSS_CHIP_SYNCH: + ret = wlan_ret_cross_chip_synch(pmpriv, resp, pioctl_buf); + break; default: PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n", resp->command); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c index effe3cc..9d3b8fe 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c @@ -474,11 +474,6 @@ t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect) return; } - if (pmadapter->pending_disconnect_priv) { - LEAVE(); - return; - } - pevent->bss_index = priv->bss_index; pevent->event_id = MLAN_EVENT_ID_FW_DISCONNECTED; pevent->event_len = sizeof(priv->disconnect_reason_code); @@ -679,8 +674,10 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) pmlan_callbacks pcb = &pmadapter->callbacks; mlan_event *pevent = MNULL; t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + Event_WLS_FTM_t *event_ftm = MNULL; chan_band_info *pchan_band_info = MNULL; t_u8 radar_chan; + t_u8 bandwidth; t_u16 enable = 0; ENTER(); @@ -775,8 +772,10 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) case EVENT_PS_SLEEP: PRINTM(MINFO, "EVENT: SLEEP\n"); - PRINTM_NETINTF(MEVENT, pmpriv); - PRINTM(MEVENT, "_"); + if (pmadapter->second_mac) + PRINTM(MEVENT, "__"); + else + PRINTM(MEVENT, "_"); /* Handle unexpected PS SLEEP event */ if (pmadapter->ps_state == PS_STATE_SLEEP_CFM) @@ -788,8 +787,10 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) case EVENT_PS_AWAKE: PRINTM(MINFO, "EVENT: AWAKE\n"); - PRINTM_NETINTF(MEVENT, pmpriv); - PRINTM(MEVENT, "|"); + if (pmadapter->second_mac) + PRINTM(MEVENT, "||"); + else + PRINTM(MEVENT, "|"); if (!pmadapter->pps_uapsd_mode && pmpriv->media_connected && (pmpriv->port_open || !pmpriv->port_ctrl_mode) && pmadapter->sleep_period.period) { @@ -958,11 +959,10 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) sizeof(pchan_band_info->bandcfg)); pchan_band_info->channel = pchan_info->channel; if (pchan_band_info->bandcfg.chanWidth == CHAN_BW_80MHZ) - pchan_band_info->center_chan = - wlan_get_center_freq_idx( - priv, BAND_AAC, - pchan_info->channel, - CHANNEL_BW_80MHZ); + pchan_band_info + ->center_chan = wlan_get_center_freq_idx( + priv, pchan_band_info->bandcfg.chanBand, + pchan_info->channel, CHANNEL_BW_80MHZ); wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_CHAN_SWITCH_COMPLETE, pevent); @@ -1011,8 +1011,8 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) sizeof(eventcause), pevent->event_len, pevent->event_len); /* Handle / pass event data */ - ret = wlan_11h_handle_event_chanrpt_ready(pmpriv, pevent, - &radar_chan, 0); + ret = wlan_11h_handle_event_chanrpt_ready( + pmpriv, pevent, &radar_chan, &bandwidth); /* Also send this event as passthru */ pevent->event_id = MLAN_EVENT_ID_DRV_PASSTHRU; pevent->event_len = pmbuf->data_len; @@ -1370,14 +1370,37 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) pevent->bss_index = pmpriv->bss_index; pevent->event_id = MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT; /** Drop event id length and 2 bytes reverved length*/ - pevent->event_len = pmbuf->data_len - sizeof(eventcause) - 2; - memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf, - pmadapter->event_body + 2, pevent->event_len, - pevent->event_len); - wlan_recv_event(pmpriv, pevent->event_id, pevent); + if ((pmbuf->data_len - sizeof(eventcause)) > 2) { + pevent->event_len = + pmbuf->data_len - sizeof(eventcause) - 2; + memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf, + pmadapter->event_body + 2, pevent->event_len, + pevent->event_len); + wlan_recv_event(pmpriv, pevent->event_id, pevent); + } else { + PRINTM(MERROR, + "EVENT: ERR:: ROAM OFFLOAD IN FW has invalid length\n"); + } break; case EVENT_CLOUD_KEEP_ALIVE_RETRY_FAIL: break; + case EVENT_WLS_FTM_COMPLETE: + PRINTM(MEVENT, "EVENT: FTM_GENERIC_EVENT\n"); + pevent->bss_index = pmpriv->bss_index; + event_ftm = + (Event_WLS_FTM_t *)(pmbuf->pbuf + pmbuf->data_offset); + if (event_ftm->sub_event_id == WLS_SUB_EVENT_RTT_RESULTS) + wlan_fill_hal_rtt_results(pmpriv, event_ftm, + pmbuf->data_len, pevent); + else { + pevent->event_id = MLAN_EVENT_ID_DRV_PASSTHRU; + pevent->event_len = pmbuf->data_len; + memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf, + pmbuf->pbuf + pmbuf->data_offset, + pevent->event_len, pevent->event_len); + } + wlan_recv_event(pmpriv, pevent->event_id, pevent); + break; case EVENT_VDLL_IND: wlan_process_vdll_event(pmpriv, pmbuf); break; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c index 8639106..8959f6a 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c @@ -3,7 +3,7 @@ * @brief This file contains the functions for station ioctl. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -428,6 +428,8 @@ static mlan_status wlan_get_info_ioctl(pmlan_adapter pmadapter, pmadapter->getlog_enable; pget_info->param.fw_info.hw_dev_mcs_support = pmadapter->hw_dev_mcs_support; + pget_info->param.fw_info.hw_mpdu_density = + pmadapter->hw_mpdu_density; pget_info->param.fw_info.hw_dot_11n_dev_cap = pmadapter->hw_dot_11n_dev_cap; pget_info->param.fw_info.usr_dev_mcs_support = @@ -467,6 +469,8 @@ static mlan_status wlan_get_info_ioctl(pmlan_adapter pmadapter, 0x00; pget_info->param.fw_info.fw_beacon_prot = IS_FW_SUPPORT_BEACON_PROT(pmadapter) ? 0x01 : 0x00; + pget_info->param.fw_info.rtt_support = + IS_FW_SUPPORT_RTT(pmadapter) ? 0x01 : 0x00; break; case MLAN_OID_GET_BSS_INFO: status = wlan_get_info_bss_info(pmadapter, pioctl_req); @@ -1356,7 +1360,6 @@ static mlan_status wlan_query_passphrase(mlan_private *priv, LEAVE(); return ret; } - memset(pmadapter, sec, 0, sizeof(mlan_ds_sec_cfg)); sec_pp = (mlan_ds_passphrase *)&sec->param.passphrase; sec_pp->psk_type = MLAN_PSK_QUERY; if (ssid_bssid->ssid.ssid_len == 0) { @@ -1772,7 +1775,6 @@ static mlan_status wlan_power_ioctl_set_power(pmlan_adapter pmadapter, ret = MLAN_STATUS_FAILURE; goto exit; } - memset(pmadapter, buf, 0, MRVDRV_SIZE_OF_CMD_BUFFER); txp_cfg = (HostCmd_DS_TXPWR_CFG *)buf; txp_cfg->action = HostCmd_ACT_GEN_SET; if (!power->param.power_cfg.is_power_auto) { @@ -1867,7 +1869,6 @@ static mlan_status wlan_power_ioctl_set_power_ext(pmlan_adapter pmadapter, ret = MLAN_STATUS_FAILURE; goto exit; } - memset(pmadapter, buf, 0, MRVDRV_SIZE_OF_CMD_BUFFER); txp_cfg = (HostCmd_DS_TXPWR_CFG *)buf; txp_cfg->action = HostCmd_ACT_GEN_SET; pwr_grp = &power->param.power_ext.power_group[0]; @@ -5007,6 +5008,48 @@ static mlan_status wlan_misc_cloud_keep_alive(pmlan_adapter pmadapter, return ret; } +/** + * @brief cloud keep alive rx + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req Pointer to the IOCTL request buffer + * + * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE + */ +static mlan_status wlan_misc_cloud_keep_alive_rx(pmlan_adapter pmadapter, + mlan_ioctl_req *pioctl_req) +{ + pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_misc_cfg *misc = MNULL; + t_u16 cmd_action = 0; + mlan_status ret = MLAN_STATUS_SUCCESS; + + ENTER(); + + misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + + if (pioctl_req->action == MLAN_ACT_SET) + cmd_action = HostCmd_ACT_GEN_SET; + else if (pioctl_req->action == MLAN_ACT_GET) { + cmd_action = HostCmd_ACT_GEN_GET; + } else if (pioctl_req->action == MLAN_ACT_RESET) { + cmd_action = HostCmd_ACT_GEN_RESET; + } else { + cmd_action = HostCmd_ACT_GEN_REMOVE; + } + + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_AUTO_TX, cmd_action, + OID_CLOUD_KEEP_ALIVE_ACK, (t_void *)pioctl_req, + &misc->param.keep_alive_rx); + + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} + /** * @brief Miscellaneous configuration handler * @@ -5224,6 +5267,10 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_GET_TSF: status = wlan_misc_ioctl_get_tsf(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_CROSS_CHIP_SYNCH: + status = + wlan_misc_ioctl_cross_chip_synch(pmadapter, pioctl_req); + break; case MLAN_OID_MISC_ROAM_OFFLOAD: status = wlan_misc_roam_offload(pmadapter, pioctl_req); break; @@ -5236,6 +5283,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_CLOUD_KEEP_ALIVE: status = wlan_misc_cloud_keep_alive(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_CLOUD_KEEP_ALIVE_RX: + status = wlan_misc_cloud_keep_alive_rx(pmadapter, pioctl_req); + break; case MLAN_OID_MISC_DYN_BW: status = wlan_misc_ioctl_dyn_bw(pmadapter, pioctl_req); break; @@ -5251,6 +5301,15 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_DMCS_CONFIG: status = wlan_misc_dmcs_config(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_CONFIG_RTT: + status = wlan_config_rtt(pmadapter, pioctl_req); + break; + case MLAN_OID_MISC_CANCEL_RTT: + status = wlan_cancel_rtt(pmadapter, pioctl_req); + break; + case MLAN_OID_MISC_RTT_RESPONDER_CFG: + status = wlan_rtt_responder_cfg(pmadapter, pioctl_req); + break; case MLAN_OID_MISC_GET_TX_RX_HISTOGRAM: status = wlan_get_tx_rx_histogram(pmadapter, pioctl_req); break; @@ -5283,6 +5342,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_RX_ABORT_CFG: status = wlan_misc_ioctl_rxabortcfg(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_OFDM_DESENSE_CFG: + status = wlan_misc_ioctl_ofdmdesense_cfg(pmadapter, pioctl_req); + break; case MLAN_OID_MISC_RX_ABORT_CFG_EXT: status = wlan_misc_ioctl_rxabortcfg_ext(pmadapter, pioctl_req); break; @@ -5319,6 +5381,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_RANGE_EXT: status = wlan_misc_ioctl_range_ext(pmadapter, pioctl_req); break; + case MLAN_OID_11AX_TWT_CFG: + status = wlan_misc_ioctl_twt_report(pmadapter, pioctl_req); + break; case MLAN_OID_MISC_TP_STATE: status = wlan_misc_ioctl_tp_state(pmadapter, pioctl_req); break; @@ -5527,10 +5592,20 @@ start_config: pioctl_req->data_read_written = sizeof(mlan_scan_resp) + MLAN_SUB_COMMAND_SIZE; - pscan->param.scan_resp.pchan_stats = - (t_u8 *)pmadapter->pchan_stats; - pscan->param.scan_resp.num_in_chan_stats = - pmadapter->num_in_chan_stats; + if (pmadapter->scan_processing) { + pscan->param.scan_resp.pchan_stats = + (t_u8 *)pmadapter + ->pold_chan_stats; + pscan->param.scan_resp + .num_in_chan_stats = + pmadapter->old_idx_chan_stats; + } else { + pscan->param.scan_resp.pchan_stats = + (t_u8 *)pmadapter->pchan_stats; + pscan->param.scan_resp + .num_in_chan_stats = + pmadapter->idx_chan_stats; + } } } } diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c index bb9920a..5e49e0a 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c @@ -408,6 +408,8 @@ void wlan_rxpdinfo_to_radiotapinfo(pmlan_private priv, RxPD *prx_pd, t_u8 gi = 0; t_u8 ldpc = 0; t_u8 ext_rate_info = 0; + t_u8 nss = 0; + t_u8 dcm = 0; memset(priv->adapter, &rt_info_tmp, 0x00, sizeof(rt_info_tmp)); rt_info_tmp.snr = prx_pd->snr; @@ -418,10 +420,25 @@ void wlan_rxpdinfo_to_radiotapinfo(pmlan_private priv, RxPD *prx_pd, rt_info_tmp.antenna = prx_pd->antenna; rx_rate_info = prx_pd->rate_info; - if ((rx_rate_info & 0x3) == MLAN_RATE_FORMAT_VHT) { + if ((rx_rate_info & 0x3) == MLAN_RATE_FORMAT_HE) { + t_u8 gi_he = 0; + /* HE rate */ + format = MLAN_RATE_FORMAT_HE; + mcs_index = MIN(prx_pd->rx_rate & 0xF, 0xb); + nss = ((prx_pd->rx_rate & 0xF0) >> 4); + nss = MIN(nss + 1, 2); + /* 20M: bw=0, 40M: bw=1, 80M: bw=2, 160M: bw=3 */ + bw = (rx_rate_info & 0xC) >> 2; + gi = (rx_rate_info & 0x10) >> 4; + gi_he = (rx_rate_info & 0x80) >> 7; + gi = gi | gi_he; + dcm = (prx_pd->rx_info & RXPD_DCM_MASK) >> 16; + } else if ((rx_rate_info & 0x3) == MLAN_RATE_FORMAT_VHT) { /* VHT rate */ format = MLAN_RATE_FORMAT_VHT; mcs_index = MIN(prx_pd->rx_rate & 0xF, 9); + nss = ((prx_pd->rx_rate & 0xF0) >> 4); + nss = MIN(nss + 1, 2); /* 20M: bw=0, 40M: bw=1, 80M: bw=2, 160M: bw=3 */ bw = (rx_rate_info & 0xC) >> 2; /* LGI: gi =0, SGI: gi = 1 */ @@ -444,8 +461,14 @@ void wlan_rxpdinfo_to_radiotapinfo(pmlan_private priv, RxPD *prx_pd, ldpc = rx_rate_info & 0x40; rt_info_tmp.rate_info.mcs_index = mcs_index; - rt_info_tmp.rate_info.rate_info = - (ldpc << 5) | (format << 3) | (bw << 1) | gi; + rt_info_tmp.rate_info.nss_index = nss; + rt_info_tmp.rate_info.dcm = dcm; + if (format == MLAN_RATE_FORMAT_HE) { + rt_info_tmp.rate_info.rate_info = + (ldpc << 5) | (format << 3) | (bw << 1) | (gi << 6); + } else + rt_info_tmp.rate_info.rate_info = + (ldpc << 5) | (format << 3) | (bw << 1) | gi; rt_info_tmp.rate_info.bitrate = wlan_index_to_data_rate(priv->adapter, prx_pd->rx_rate, prx_pd->rate_info, ext_rate_info); @@ -683,6 +706,14 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) mlan_status ret = MLAN_STATUS_SUCCESS; RxPD *prx_pd; RxPacketHdr_t *prx_pkt; + RxPD *prx_pd2; + EthII_Hdr_t *peth_hdr2; + wlan_802_11_header *pwlan_hdr; + IEEEtypes_FrameCtl_t *frmctl; + pmlan_buffer pmbuf2 = MNULL; + mlan_802_11_mac_addr src_addr, dest_addr; + t_u16 hdr_len; + t_u8 snap_eth_hdr[5] = {0xaa, 0xaa, 0x03, 0x00, 0x00}; pmlan_private priv = pmadapter->priv[pmbuf->bss_index]; t_u8 ta[MLAN_MAC_ADDR_LENGTH]; t_u16 rx_pkt_type = 0; @@ -761,6 +792,112 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) } } + if (pmadapter->enable_net_mon && + (prx_pd->flags & RXPD_FLAG_UCAST_PKT)) { + pwlan_hdr = (wlan_802_11_header *)((t_u8 *)prx_pd + + prx_pd->rx_pkt_offset); + frmctl = (IEEEtypes_FrameCtl_t *)pwlan_hdr; + if (frmctl->type == 0x02) { + /* This is a valid unicast destined data packet, with + * 802.11 and rtap headers attached. Duplicate this + * packet and process this copy as a sniffed packet, + * meant for monitor iface + */ + pmbuf2 = wlan_alloc_mlan_buffer(pmadapter, + pmbuf->data_len, + MLAN_RX_HEADER_LEN, + MOAL_ALLOC_MLAN_BUFFER); + if (!pmbuf2) { + PRINTM(MERROR, + "Unable to allocate mlan_buffer for Rx"); + PRINTM(MERROR, "sniffed packet\n"); + } else { + pmbuf2->bss_index = pmbuf->bss_index; + pmbuf2->buf_type = pmbuf->buf_type; + pmbuf2->priority = pmbuf->priority; + pmbuf2->in_ts_sec = pmbuf->in_ts_sec; + pmbuf2->in_ts_usec = pmbuf->in_ts_usec; + pmbuf2->data_len = pmbuf->data_len; + memcpy(pmadapter, + pmbuf2->pbuf + pmbuf2->data_offset, + pmbuf->pbuf + pmbuf->data_offset, + pmbuf->data_len); + + prx_pd2 = (RxPD *)(pmbuf2->pbuf + + pmbuf2->data_offset); + /* set pkt type of duplicated pkt to 802.11 */ + prx_pd2->rx_pkt_type = PKT_TYPE_802DOT11; + wlan_process_rx_packet(pmadapter, pmbuf2); + } + + /* Now, process this pkt as a normal data packet. + * rx_pkt_offset points to the 802.11 hdr. Construct + * 802.3 header from 802.11 hdr fields and attach it + * just before the payload. + */ + memcpy(pmadapter, (t_u8 *)&dest_addr, pwlan_hdr->addr1, + sizeof(pwlan_hdr->addr1)); + memcpy(pmadapter, (t_u8 *)&src_addr, pwlan_hdr->addr2, + sizeof(pwlan_hdr->addr2)); + + hdr_len = sizeof(wlan_802_11_header); + + /* subtract mac addr field size for 3 address mac80211 + * header */ + if (!(frmctl->from_ds && frmctl->to_ds)) + hdr_len -= sizeof(mlan_802_11_mac_addr); + + /* add 2 bytes of qos ctrl flags */ + if (frmctl->sub_type & QOS_DATA) + hdr_len += 2; + + if (prx_pd->rx_pkt_type == PKT_TYPE_AMSDU) { + /* no need to generate 802.3 hdr, update pkt + * offset */ + prx_pd->rx_pkt_offset += hdr_len; + prx_pd->rx_pkt_length -= hdr_len; + } else { + /* skip 6-byte snap and 2-byte type */ + if (memcmp(pmadapter, + (t_u8 *)pwlan_hdr + hdr_len, + snap_eth_hdr, + sizeof(snap_eth_hdr)) == 0) + hdr_len += 8; + + peth_hdr2 = + (EthII_Hdr_t *)((t_u8 *)prx_pd + + prx_pd->rx_pkt_offset + + hdr_len - + sizeof(EthII_Hdr_t)); + memcpy(pmadapter, peth_hdr2->dest_addr, + (t_u8 *)&dest_addr, + sizeof(peth_hdr2->dest_addr)); + memcpy(pmadapter, peth_hdr2->src_addr, + (t_u8 *)&src_addr, + sizeof(peth_hdr2->src_addr)); + + /* Update the rx_pkt_offset to point the 802.3 + * hdr */ + prx_pd->rx_pkt_offset += + (hdr_len - sizeof(EthII_Hdr_t)); + prx_pd->rx_pkt_length -= + (hdr_len - sizeof(EthII_Hdr_t)); + } + /* update the prx_pkt pointer */ + prx_pkt = (RxPacketHdr_t *)((t_u8 *)prx_pd + + prx_pd->rx_pkt_offset); + } else { + pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID; + ret = MLAN_STATUS_FAILURE; + PRINTM(MERROR, + "Drop invalid unicast sniffer pkt, subType=0x%x, flag=0x%x, pkt_type=%d\n", + frmctl->sub_type, prx_pd->flags, + prx_pd->rx_pkt_type); + wlan_free_mlan_buffer(pmadapter, pmbuf); + goto done; + } + } + /* * If the packet is not an unicast packet then send the packet * directly to os. Don't pass thru rx reordering @@ -815,9 +952,14 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) } if ((priv->port_ctrl_mode == MTRUE && priv->port_open == MFALSE) && (rx_pkt_type != PKT_TYPE_BAR)) { - mlan_11n_rxreorder_pkt(priv, prx_pd->seq_num, prx_pd->priority, - ta, (t_u8)prx_pd->rx_pkt_type, - (t_void *)RX_PKT_DROPPED_IN_FW); + if (MLAN_STATUS_SUCCESS != + mlan_11n_rxreorder_pkt(priv, prx_pd->seq_num, + prx_pd->priority, ta, + (t_u8)prx_pd->rx_pkt_type, + (t_void *)RX_PKT_DROPPED_IN_FW)) + PRINTM(MINFO, "RX pkt reordering failure seq_num:%d\n", + prx_pd->seq_num); + if (rx_pkt_type == PKT_TYPE_AMSDU) { pmbuf->data_len = prx_pd->rx_pkt_length; pmbuf->data_offset += prx_pd->rx_pkt_offset; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c b/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c index 8f2b0ef..12cc203 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c @@ -3,7 +3,7 @@ * @brief This file contains the handling of AP mode command and event * * - * Copyright 2009-2022 NXP + * Copyright 2009-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -713,11 +713,7 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, t_u8 zero_mac[] = {0, 0, 0, 0, 0, 0}; t_u16 i; t_u16 ac; -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) int rx_mcs_supp = 0; -#endif ENTER(); if (pioctl_buf == MNULL) { @@ -1344,11 +1340,8 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, memcpy_ext(pmpriv->adapter, tlv_htcap->ht_cap.supported_mcs_set, bss->param.bss_config.supported_mcs_set, 16, sizeof(tlv_htcap->ht_cap.supported_mcs_set)); -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ - defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X) if (IS_CARD9098(pmpriv->adapter->card_type) || - IS_CARDNW62X(pmpriv->adapter->card_type) || + IS_CARDIW62X(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type)) { if (bss->param.bss_config.supported_mcs_set[0]) { if (bss->param.bss_config.bandcfg.chanBand == @@ -1373,7 +1366,6 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, } } } -#endif tlv_htcap->ht_cap.ht_ext_cap = wlan_cpu_to_le16(bss->param.bss_config.ht_ext_cap); tlv_htcap->ht_cap.tx_bf_cap = @@ -1462,7 +1454,7 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, wlan_cpu_to_le16(sizeof(MrvlIEtypes_preamble_t) - sizeof(MrvlIEtypesHeader_t)); tlv_preamble->preamble_type = - wlan_cpu_to_le16(bss->param.bss_config.preamble_type); + bss->param.bss_config.preamble_type; cmd_size += sizeof(MrvlIEtypes_preamble_t); tlv += sizeof(MrvlIEtypes_preamble_t); @@ -1845,8 +1837,7 @@ static mlan_status wlan_uap_cmd_sys_configure(pmlan_private pmpriv, sys_config->tlv_buffer; tlv_chan_switch->header.type = wlan_cpu_to_le16( MRVL_ACTION_CHAN_SWITCH_ANNOUNCE); - // mode reserve for future use - tlv_chan_switch->mode = 0; + tlv_chan_switch->mode = bss->param.chanswitch.mode; tlv_chan_switch->num_pkt = bss->param.chanswitch.chan_switch_count; if (bss->param.chanswitch.new_oper_class) { @@ -2697,7 +2688,9 @@ static mlan_status wlan_uap_ret_sys_config(pmlan_private pmpriv, .center_chan = wlan_get_center_freq_idx( pmpriv, - BAND_AAC, + chan_band_tlv + ->bandcfg + .chanBand, chan_band_tlv ->channel, CHANNEL_BW_80MHZ); @@ -3593,6 +3586,59 @@ static mlan_status wlan_uap_cmd_key_material(pmlan_private pmpriv, pkey_material->key_param_set.key_info |= KEY_INFO_DEFAULT_KEY; pkey_material->key_param_set.key_info = wlan_cpu_to_le16(pkey_material->key_param_set.key_info); + if (pkey->key_flags & KEY_FLAG_GCMP || + pkey->key_flags & KEY_FLAG_GCMP_256) { + if (pkey->key_flags & + (KEY_FLAG_RX_SEQ_VALID | KEY_FLAG_TX_SEQ_VALID)) { + memcpy_ext( + pmpriv->adapter, + pkey_material->key_param_set.key_params.gcmp.pn, + pkey->pn, SEQ_MAX_SIZE, WPA_PN_SIZE); + } + if (pkey->key_flags & KEY_FLAG_GCMP) + pkey_material->key_param_set.key_type = + KEY_TYPE_ID_GCMP; + else + pkey_material->key_param_set.key_type = + KEY_TYPE_ID_GCMP_256; + pkey_material->key_param_set.key_params.gcmp.key_len = + wlan_cpu_to_le16(pkey->key_len); + memcpy_ext(pmpriv->adapter, + pkey_material->key_param_set.key_params.gcmp.key, + pkey->key_material, pkey->key_len, WPA_GCMP_KEY_LEN); + pkey_material->key_param_set.length = wlan_cpu_to_le16( + KEY_PARAMS_FIXED_LEN + sizeof(gcmp_param)); + cmd->size = wlan_cpu_to_le16(sizeof(MrvlIEtypesHeader_t) + + S_DS_GEN + KEY_PARAMS_FIXED_LEN + + sizeof(gcmp_param) + + sizeof(pkey_material->action)); + PRINTM(MCMND, "Set GCMP Key\n"); + goto done; + } + if (pkey->key_flags & KEY_FLAG_CCMP_256) { + if (pkey->key_flags & + (KEY_FLAG_RX_SEQ_VALID | KEY_FLAG_TX_SEQ_VALID)) { + memcpy_ext(pmpriv->adapter, + pkey_material->key_param_set.key_params + .ccmp256.pn, + pkey->pn, SEQ_MAX_SIZE, WPA_PN_SIZE); + } + pkey_material->key_param_set.key_type = KEY_TYPE_ID_CCMP_256; + pkey_material->key_param_set.key_params.ccmp256.key_len = + wlan_cpu_to_le16(pkey->key_len); + memcpy_ext(pmpriv->adapter, + pkey_material->key_param_set.key_params.ccmp256.key, + pkey->key_material, pkey->key_len, + WPA_CCMP_256_KEY_LEN); + pkey_material->key_param_set.length = wlan_cpu_to_le16( + KEY_PARAMS_FIXED_LEN + sizeof(ccmp_256_param)); + cmd->size = wlan_cpu_to_le16(sizeof(MrvlIEtypesHeader_t) + + S_DS_GEN + KEY_PARAMS_FIXED_LEN + + sizeof(ccmp_256_param) + + sizeof(pkey_material->action)); + PRINTM(MCMND, "Set CCMP256 Key\n"); + goto done; + } if (pkey->key_len == WPA_AES_KEY_LEN && !(pkey->key_flags & KEY_FLAG_AES_MCAST_IGTK)) { if (pkey->key_flags & @@ -3657,7 +3703,7 @@ static mlan_status wlan_uap_cmd_key_material(pmlan_private pmpriv, (KEY_FLAG_RX_SEQ_VALID | KEY_FLAG_TX_SEQ_VALID)) memcpy_ext(pmpriv->adapter, pkey_material->key_param_set.key_params - .cmac_aes.ipn, + .gmac_aes.ipn, pkey->pn, SEQ_MAX_SIZE, IGTK_PN_SIZE); pkey_material->key_param_set.key_info &= ~(wlan_cpu_to_le16(KEY_INFO_MCAST_KEY)); @@ -3665,10 +3711,10 @@ static mlan_status wlan_uap_cmd_key_material(pmlan_private pmpriv, wlan_cpu_to_le16(KEY_INFO_AES_MCAST_IGTK); pkey_material->key_param_set.key_type = KEY_TYPE_ID_BIP_GMAC_256; - pkey_material->key_param_set.key_params.cmac_aes.key_len = + pkey_material->key_param_set.key_params.gmac_aes.key_len = wlan_cpu_to_le16(pkey->key_len); memcpy_ext(pmpriv->adapter, - pkey_material->key_param_set.key_params.cmac_aes.key, + pkey_material->key_param_set.key_params.gmac_aes.key, pkey->key_material, pkey->key_len, WPA_IGTK_256_KEY_LEN); pkey_material->key_param_set.length = wlan_cpu_to_le16( @@ -3893,8 +3939,9 @@ static void wlan_check_uap_capability(pmlan_private priv, pmlan_buffer pevent) priv->uap_bandwidth = pchan_info->bandcfg.chanWidth; priv->uap_state_chan_cb.channel = pchan_info->channel; priv->uap_state_chan_cb.bandcfg = pchan_info->bandcfg; - PRINTM(MCMND, "uap_channel FW: 0x%x bw=%d\n", - priv->uap_channel, priv->uap_bandwidth); + PRINTM(MCMND, "uap_channel FW: 0x%x band=%d bw=%d\n", + priv->uap_channel, pchan_info->bandcfg.chanBand, + priv->uap_bandwidth); event->bss_index = priv->bss_index; event->event_id = MLAN_EVENT_ID_DRV_UAP_CHAN_INFO; event->event_len = sizeof(chan_band_info); @@ -3903,11 +3950,10 @@ static void wlan_check_uap_capability(pmlan_private priv, pmlan_buffer pevent) (t_u8 *)&pchan_info->bandcfg, tlv_len, tlv_len); if (pchan_band_info->bandcfg.chanWidth == CHAN_BW_80MHZ) - pchan_band_info->center_chan = - wlan_get_center_freq_idx( - priv, BAND_AAC, - pchan_info->channel, - CHANNEL_BW_80MHZ); + pchan_band_info + ->center_chan = wlan_get_center_freq_idx( + priv, pchan_band_info->bandcfg.chanBand, + pchan_info->channel, CHANNEL_BW_80MHZ); if (priv->adapter->ecsa_enable) { int ret; t_u8 bandwidth = BW_20MHZ; @@ -4709,6 +4755,14 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = MLAN_STATUS_SUCCESS; break; #endif + case HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS: + ret = wlan_cmd_802_11_ftm_config_session_params( + pmpriv, cmd_ptr, cmd_action, cmd_oid, pdata_buf); + break; + case HostCmd_CMD_FTM_CONFIG_RESPONDER: + ret = wlan_cmd_802_11_ftm_config_responder( + pmpriv, cmd_ptr, cmd_action, cmd_oid, pdata_buf); + break; case HostCmd_CMD_VERSION_EXT: cmd_ptr->command = wlan_cpu_to_le16(cmd_no); cmd_ptr->params.verext.version_str_sel = @@ -4722,7 +4776,7 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, cmd_ptr->params.rx_mgmt_ind.action = wlan_cpu_to_le16(cmd_action); cmd_ptr->params.rx_mgmt_ind.mgmt_subtype_mask = - (t_u32)(*((t_u32 *)pdata_buf)); + wlan_cpu_to_le32((t_u32)(*((t_u32 *)pdata_buf))); cmd_ptr->size = wlan_cpu_to_le16( sizeof(HostCmd_DS_RX_MGMT_IND) + S_DS_GEN); break; @@ -4885,6 +4939,10 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_rxabortcfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_OFDM_DESENSE_CFG: + ret = wlan_cmd_ofdmdesense_cfg(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; case HostCmd_CMD_RX_ABORT_CFG_EXT: ret = wlan_cmd_rxabortcfg_ext(pmpriv, cmd_ptr, cmd_action, pdata_buf); @@ -4936,6 +4994,10 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_get_ch_load(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_CROSS_CHIP_SYNCH: + ret = wlan_cmd_cross_chip_synch(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; case HostCmd_DS_GET_SENSOR_TEMP: wlan_cmd_get_sensor_temp(pmpriv, cmd_ptr, cmd_action); break; @@ -4998,7 +5060,6 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, pmpriv->adapter->pmoal_handle, &sec, &usec); pstate_dfs->dfs_report_time_sec = sec; } - wlan_reset_all_chan_dfs_state(priv, BAND_A, DFS_USABLE); if (pmpriv->intf_state_11h.is_11h_host) pmpriv->intf_state_11h.tx_disabled = MFALSE; else { @@ -5040,6 +5101,7 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, AuthenitcatorInitBssConfig(pmpriv->psapriv); #endif ret = wlan_uap_ret_sys_reset(pmpriv, resp, pioctl_buf); + wlan_reset_all_chan_dfs_state(priv, BAND_A, DFS_USABLE); wlan_11h_check_update_radar_det_state(pmpriv); wlan_coex_ampdu_rxwinsize(pmadapter); break; @@ -5173,6 +5235,14 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_TX_BF_CFG: ret = wlan_ret_tx_bf_cfg(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS: + ret = wlan_ret_802_11_ftm_config_session_params(pmpriv, resp, + pioctl_buf); + break; + case HostCmd_CMD_FTM_CONFIG_RESPONDER: + ret = wlan_ret_802_11_ftm_config_responder(pmpriv, resp, + pioctl_buf); + break; case HostCmd_CMD_VERSION_EXT: ret = wlan_ret_ver_ext(pmpriv, resp, pioctl_buf); break; @@ -5298,6 +5368,9 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_RX_ABORT_CFG: ret = wlan_ret_rxabortcfg(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_OFDM_DESENSE_CFG: + ret = wlan_ret_ofdmdesense_cfg(pmpriv, resp, pioctl_buf); + break; case HostCmd_CMD_RX_ABORT_CFG_EXT: ret = wlan_ret_rxabortcfg_ext(pmpriv, resp, pioctl_buf); break; @@ -5341,6 +5414,9 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_GET_CH_LOAD: ret = wlan_ret_ch_load(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_CROSS_CHIP_SYNCH: + ret = wlan_ret_cross_chip_synch(pmpriv, resp, pioctl_buf); + break; case HostCmd_DS_GET_SENSOR_TEMP: ret = wlan_ret_get_sensor_temp(pmpriv, resp, pioctl_buf); break; @@ -5380,6 +5456,7 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) MrvlIEtypes_channel_band_t *pchan_info = MNULL; chan_band_info *pchan_band_info = MNULL; event_exceed_max_p2p_conn *event_excd_p2p = MNULL; + Event_WLS_FTM_t *event_ftm = MNULL; t_u16 enable; ENTER(); @@ -5457,8 +5534,10 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) break; case EVENT_PS_AWAKE: PRINTM(MINFO, "EVENT: AWAKE\n"); - PRINTM_NETINTF(MEVENT, pmpriv); - PRINTM(MEVENT, "||"); + if (pmadapter->second_mac) + PRINTM(MEVENT, "||"); + else + PRINTM(MEVENT, "|"); /* Handle unexpected PS AWAKE event */ if (pmadapter->ps_state == PS_STATE_SLEEP_CFM) break; @@ -5469,8 +5548,10 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) break; case EVENT_PS_SLEEP: PRINTM(MINFO, "EVENT: SLEEP\n"); - PRINTM_NETINTF(MEVENT, pmpriv); - PRINTM(MEVENT, "__"); + if (pmadapter->second_mac) + PRINTM(MEVENT, "__"); + else + PRINTM(MEVENT, "_"); /* Handle unexpected PS SLEEP event */ if (pmadapter->ps_state == PS_STATE_SLEEP_CFM) break; @@ -5607,10 +5688,11 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) if (pmpriv->adapter->dfs_test_params.cac_restart && pmpriv->adapter->state_dfs.dfs_check_pending) { wlan_11h_cancel_radar_detect(pmpriv); - wlan_11h_issue_radar_detect( - pmpriv, MNULL, - pmpriv->adapter->dfs_test_params.chan, - pmpriv->adapter->dfs_test_params.bandcfg); + if (wlan_11h_issue_radar_detect( + pmpriv, MNULL, + pmpriv->adapter->dfs_test_params.chan, + pmpriv->adapter->dfs_test_params.bandcfg)) + PRINTM(MINFO, "RADAR detect returned FALSE\n"); pevent->event_id = 0; break; } @@ -5625,7 +5707,6 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) wlan_recv_event(pmpriv, pevent->event_id, pevent); pevent->event_id = 0; /* clear to avoid resending at end of fcn */ - /* Print event data */ pevent->event_id = MLAN_EVENT_ID_FW_RADAR_DETECTED; pevent->event_len = pmbuf->data_len - sizeof(eventcause); @@ -5638,11 +5719,14 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) *((t_u8 *)pevent->event_buf) = channel; *((t_u8 *)pevent->event_buf + 1) = bandwidth; if (pmpriv->bss_type == MLAN_BSS_TYPE_DFS) { - wlan_recv_event(priv, MLAN_EVENT_ID_FW_RADAR_DETECTED, - pevent); - pevent->event_id = 0; /* clear to avoid - resending at end of fcn - */ + if (!pmpriv->adapter->dfs_test_params + .no_channel_change_on_radar) { + wlan_recv_event(priv, + MLAN_EVENT_ID_FW_RADAR_DETECTED, + pevent); + } + pevent->event_id = 0; /* clear to avoid resending at end + of fcn */ break; } if (!pmpriv->intf_state_11h.is_11h_host) { @@ -5774,7 +5858,8 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) if (pchan_band_info->bandcfg.chanWidth == CHAN_BW_80MHZ) pchan_band_info->center_chan = wlan_get_center_freq_idx( - priv, BAND_AAC, + priv, + pchan_info->bandcfg.chanBand, pchan_info->channel, CHANNEL_BW_80MHZ); pchan_band_info->is_11n_enabled = @@ -5837,6 +5922,22 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) wlan_process_csi_event(pmpriv); break; + case EVENT_WLS_FTM_COMPLETE: + PRINTM(MEVENT, "EVENT: FTM_GENERIC_EVENT\n"); + pevent = (pmlan_event)event_buf; + pevent->bss_index = pmpriv->bss_index; + event_ftm = + (Event_WLS_FTM_t *)(pmbuf->pbuf + pmbuf->data_offset); + if (event_ftm->sub_event_id == WLS_SUB_EVENT_RTT_RESULTS) { + wlan_fill_hal_rtt_results(pmpriv, event_ftm, + pmbuf->data_len, pevent); + wlan_recv_event(pmpriv, pevent->event_id, pevent); + pevent->event_id = 0; /* clear to avoid resending at end + of fcn */ + goto done; + } else + pevent->event_id = MLAN_EVENT_ID_DRV_PASSTHRU; + break; case EVENT_FW_HANG_REPORT: if (pmbuf->data_len < (sizeof(eventcause) + sizeof(t_u16))) { PRINTM(MEVENT, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c b/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c index 439dc01..acb1dc1 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c @@ -2095,6 +2095,8 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) pmadapter->getlog_enable; pget_info->param.fw_info.hw_dev_mcs_support = pmadapter->hw_dev_mcs_support; + pget_info->param.fw_info.hw_mpdu_density = + pmadapter->hw_mpdu_density; pget_info->param.fw_info.hw_dot_11n_dev_cap = pmadapter->hw_dot_11n_dev_cap; pget_info->param.fw_info.usr_dev_mcs_support = @@ -2242,6 +2244,10 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) pioctl_req); if (misc->sub_command == MLAN_OID_MISC_GET_TSF) status = wlan_misc_ioctl_get_tsf(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_CROSS_CHIP_SYNCH) { + status = wlan_misc_ioctl_cross_chip_synch(pmadapter, + pioctl_req); + } if (misc->sub_command == MLAN_OID_MISC_GET_CHAN_REGION_CFG) status = wlan_misc_chan_reg_cfg(pmadapter, pioctl_req); if (misc->sub_command == MLAN_OID_MISC_OPER_CLASS_CHECK) @@ -2264,6 +2270,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) if (misc->sub_command == MLAN_OID_MISC_RX_ABORT_CFG) status = wlan_misc_ioctl_rxabortcfg(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_OFDM_DESENSE_CFG) + status = wlan_misc_ioctl_ofdmdesense_cfg(pmadapter, + pioctl_req); if (misc->sub_command == MLAN_OID_MISC_RX_ABORT_CFG_EXT) status = wlan_misc_ioctl_rxabortcfg_ext(pmadapter, pioctl_req); @@ -2285,6 +2294,12 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) status = wlan_misc_robustcoex(pmadapter, pioctl_req); if (misc->sub_command == MLAN_OID_MISC_DMCS_CONFIG) status = wlan_misc_dmcs_config(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_CONFIG_RTT) + status = wlan_config_rtt(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_CANCEL_RTT) + status = wlan_cancel_rtt(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_RTT_RESPONDER_CFG) + status = wlan_rtt_responder_cfg(pmadapter, pioctl_req); if (misc->sub_command == MLAN_OID_MISC_GET_TX_RX_HISTOGRAM) status = wlan_get_tx_rx_histogram(pmadapter, pioctl_req); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c b/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c index d2aaa9a..b68ae09 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c @@ -65,7 +65,13 @@ static mlan_status wlan_upload_uap_rx_packet(pmlan_adapter pmadapter, prx_pd = (RxPD *)(pmbuf->pbuf + pmbuf->data_offset); /* Chop off RxPD */ - pmbuf->data_len -= prx_pd->rx_pkt_offset; + if (pmbuf->data_len > prx_pd->rx_pkt_offset) { + pmbuf->data_len -= prx_pd->rx_pkt_offset; + } else { + PRINTM(MERROR, + "pmbuf->data_len is smaller than prx_pd->rx_pkt_offset\n"); + pmbuf->status_code = MLAN_ERROR_PKT_INVALID; + } pmbuf->data_offset += prx_pd->rx_pkt_offset; pmbuf->pparent = MNULL; @@ -89,7 +95,6 @@ static mlan_status wlan_upload_uap_rx_packet(pmlan_adapter pmadapter, "uAP Rx Error: moal_recv_packet returned error\n"); pmbuf->status_code = MLAN_ERROR_PKT_INVALID; } - if (ret != MLAN_STATUS_PENDING) pmadapter->ops.data_complete(pmadapter, pmbuf, ret); #ifdef USB @@ -344,6 +349,14 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) t_u32 last_rx_sec = 0; t_u32 last_rx_usec = 0; + RxPD *prx_pd2; + EthII_Hdr_t *peth_hdr2; + wlan_802_11_header *pwlan_hdr; + IEEEtypes_FrameCtl_t *frmctl; + pmlan_buffer pmbuf2 = MNULL; + mlan_802_11_mac_addr src_addr, dest_addr; + t_u16 hdr_len; + t_u8 snap_eth_hdr[5] = {0xaa, 0xaa, 0x03, 0x00, 0x00}; t_u8 ext_rate_info = 0; ENTER(); @@ -420,6 +433,111 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) pmadapter->ops.data_complete(pmadapter, pmbuf, ret); goto done; } + if (pmadapter->enable_net_mon && + (prx_pd->flags & RXPD_FLAG_UCAST_PKT)) { + pwlan_hdr = (wlan_802_11_header *)((t_u8 *)prx_pd + + prx_pd->rx_pkt_offset); + frmctl = (IEEEtypes_FrameCtl_t *)pwlan_hdr; + if (frmctl->type == 0x02) { + /* This is a valid unicast destined data packet, with + * 802.11 and rtap headers attached. Duplicate this + * packet and process this copy as a sniffed packet, + * meant for monitor iface + */ + pmbuf2 = wlan_alloc_mlan_buffer(pmadapter, + MLAN_RX_DATA_BUF_SIZE, + MLAN_RX_HEADER_LEN, + MOAL_ALLOC_MLAN_BUFFER); + if (!pmbuf2) { + PRINTM(MERROR, + "Unable to allocate mlan_buffer for Rx"); + PRINTM(MERROR, "sniffed packet\n"); + } else { + pmbuf2->bss_index = pmbuf->bss_index; + pmbuf2->buf_type = pmbuf->buf_type; + pmbuf2->priority = pmbuf->priority; + pmbuf2->in_ts_sec = pmbuf->in_ts_sec; + pmbuf2->in_ts_usec = pmbuf->in_ts_usec; + pmbuf2->data_len = pmbuf->data_len; + memcpy(pmadapter, + pmbuf2->pbuf + pmbuf2->data_offset, + pmbuf->pbuf + pmbuf->data_offset, + pmbuf->data_len); + + prx_pd2 = (RxPD *)(pmbuf2->pbuf + + pmbuf2->data_offset); + /* set pkt type of duplicated pkt to 802.11 */ + prx_pd2->rx_pkt_type = PKT_TYPE_802DOT11; + wlan_process_uap_rx_packet(priv, pmbuf2); + } + + /* Now, process this pkt as a normal data packet. + * rx_pkt_offset points to the 802.11 hdr. Construct + * 802.3 header from 802.11 hdr fields and attach it + * just before the payload. + */ + memcpy(pmadapter, (t_u8 *)&dest_addr, pwlan_hdr->addr1, + sizeof(pwlan_hdr->addr1)); + memcpy(pmadapter, (t_u8 *)&src_addr, pwlan_hdr->addr2, + sizeof(pwlan_hdr->addr2)); + + hdr_len = sizeof(wlan_802_11_header); + + /* subtract mac addr field size for 3 address mac80211 + * header */ + if (!(frmctl->from_ds && frmctl->to_ds)) + hdr_len -= sizeof(mlan_802_11_mac_addr); + + /* add 2 bytes of qos ctrl flags */ + if (frmctl->sub_type & QOS_DATA) + hdr_len += 2; + + if (prx_pd->rx_pkt_type == PKT_TYPE_AMSDU) { + /* no need to generate 802.3 hdr, update pkt + * offset */ + prx_pd->rx_pkt_offset += hdr_len; + prx_pd->rx_pkt_length -= hdr_len; + } else { + /* skip 6-byte snap and 2-byte type */ + if (memcmp(pmadapter, + (t_u8 *)pwlan_hdr + hdr_len, + snap_eth_hdr, + sizeof(snap_eth_hdr)) == 0) + hdr_len += 8; + + peth_hdr2 = + (EthII_Hdr_t *)((t_u8 *)prx_pd + + prx_pd->rx_pkt_offset + + hdr_len - + sizeof(EthII_Hdr_t)); + memcpy(pmadapter, peth_hdr2->dest_addr, + (t_u8 *)&dest_addr, + sizeof(peth_hdr2->dest_addr)); + memcpy(pmadapter, peth_hdr2->src_addr, + (t_u8 *)&src_addr, + sizeof(peth_hdr2->src_addr)); + + /* Update the rx_pkt_offset to point the 802.3 + * hdr */ + prx_pd->rx_pkt_offset += + (hdr_len - sizeof(EthII_Hdr_t)); + prx_pd->rx_pkt_length -= + (hdr_len - sizeof(EthII_Hdr_t)); + } + /* update the prx_pkt pointer */ + prx_pkt = (RxPacketHdr_t *)((t_u8 *)prx_pd + + prx_pd->rx_pkt_offset); + } else { + pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID; + ret = MLAN_STATUS_FAILURE; + PRINTM(MERROR, + "Drop invalid unicast sniffer pkt, subType=0x%x, flag=0x%x, pkt_type=%d\n", + frmctl->sub_type, prx_pd->flags, + prx_pd->rx_pkt_type); + wlan_free_mlan_buffer(pmadapter, pmbuf); + goto done; + } + } if (rx_pkt_type != PKT_TYPE_BAR) { priv->rxpd_rate = prx_pd->rx_rate; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_usb.c b/mxm_wifiex/wlan_src/mlan/mlan_usb.c index 48be972..4a72647 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_usb.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_usb.c @@ -44,6 +44,7 @@ static const struct _mlan_card_info mlan_card_info_usb8801 = { .v16_fw_api = 0, .supp_ps_handshake = 1, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_1X1, + .support_11mc = 0, }; #endif #ifdef USB8897 @@ -52,6 +53,7 @@ static const struct _mlan_card_info mlan_card_info_usb8897 = { .v16_fw_api = 0, .supp_ps_handshake = 1, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 0, }; #endif @@ -61,6 +63,7 @@ static const struct _mlan_card_info mlan_card_info_usb8997 = { .v16_fw_api = 1, .supp_ps_handshake = 1, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif @@ -70,6 +73,7 @@ static const struct _mlan_card_info mlan_card_info_usb8978 = { .v16_fw_api = 1, .supp_ps_handshake = 1, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif @@ -80,6 +84,7 @@ static const struct _mlan_card_info mlan_card_info_usb9098 = { .v17_fw_api = 1, .supp_ps_handshake = 1, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif @@ -90,16 +95,18 @@ static const struct _mlan_card_info mlan_card_info_usb9097 = { .v17_fw_api = 1, .supp_ps_handshake = 1, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif -#ifdef USBNW62X -static const struct _mlan_card_info mlan_card_info_usbNW62X = { +#ifdef USBIW62X +static const struct _mlan_card_info mlan_card_info_usbIW62X = { .max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K, .v16_fw_api = 1, .v17_fw_api = 1, .supp_ps_handshake = 1, .default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2, + .support_11mc = 1, }; #endif @@ -255,8 +262,8 @@ static mlan_status wlan_usb_prog_fw_w_helper(pmlan_adapter pmadapter, if (IS_USB9097(pmadapter->card_type)) check_fw_status = MTRUE; #endif -#if defined(USBNW62X) - if (IS_USBNW62X(pmadapter->card_type)) +#if defined(USBIW62X) + if (IS_USBIW62X(pmadapter->card_type)) check_fw_status = MTRUE; #endif @@ -480,10 +487,11 @@ static int wlan_usb_deaggr_rx_num_pkts(pmlan_adapter pmadapter, t_u8 *pdata, static inline t_u32 usb_tx_aggr_pad_len(t_u32 len, usb_tx_aggr_params *pusb_tx_aggr) { - return (len % pusb_tx_aggr->aggr_ctrl.aggr_align) ? - (len + (pusb_tx_aggr->aggr_ctrl.aggr_align - - (len % pusb_tx_aggr->aggr_ctrl.aggr_align))) : - len; + return (t_u32)( + (len % pusb_tx_aggr->aggr_ctrl.aggr_align) ? + (len + (pusb_tx_aggr->aggr_ctrl.aggr_align - + (len % pusb_tx_aggr->aggr_ctrl.aggr_align))) : + len); } /** @@ -798,9 +806,9 @@ mlan_status wlan_get_usb_device(pmlan_adapter pmadapter) pmadapter->pcard_info = &mlan_card_info_usb9097; break; #endif -#ifdef USBNW62X - case CARD_TYPE_USBNW62X: - pmadapter->pcard_info = &mlan_card_info_usbNW62X; +#ifdef USBIW62X + case CARD_TYPE_USBIW62X: + pmadapter->pcard_info = &mlan_card_info_usbIW62X; break; #endif default: @@ -1297,7 +1305,7 @@ static mlan_status wlan_usb_host_to_card(pmlan_private pmpriv, t_u8 type, return MLAN_STATUS_FAILURE; } if (type == MLAN_TYPE_CMD -#if (defined(USB9098) || defined(USB9097) || defined(USBNW62X)) +#if (defined(USB9098) || defined(USB9097) || defined(USBIW62X)) || type == MLAN_TYPE_VDLL #endif ) { diff --git a/mxm_wifiex/wlan_src/mlan/mlan_util.h b/mxm_wifiex/wlan_src/mlan/mlan_util.h index 9485f1a..5f96256 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_util.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_util.h @@ -403,8 +403,10 @@ static INLINE t_void util_scalar_decrement( * @param moal_spin_lock A pointer to spin lock handler * @param moal_spin_unlock A pointer to spin unlock handler * - * @return Value after offset + * @return Value after offset or 0 if (scalar_value + offset) + * overflows */ +#define INT_MAX 2147483647 static INLINE t_s32 util_scalar_offset( t_void *pmoal_handle, pmlan_scalar pscalar, t_s32 offset, mlan_status (*moal_spin_lock)(t_void *handle, t_void *plock), @@ -414,7 +416,10 @@ static INLINE t_s32 util_scalar_offset( if (moal_spin_lock) moal_spin_lock(pmoal_handle, pscalar->plock); - newval = (pscalar->value += offset); + if (pscalar->value < (INT_MAX - offset)) + newval = (pscalar->value += offset); + else + newval = 0; if (moal_spin_unlock) moal_spin_unlock(pmoal_handle, pscalar->plock); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_wmm.c b/mxm_wifiex/wlan_src/mlan/mlan_wmm.c index c8aab0f..1f345c0 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_wmm.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_wmm.c @@ -317,8 +317,7 @@ static mlan_wmm_ac_e wlan_wmm_eval_downgrade_ac(pmlan_private priv, * * @return WMM AC Queue mapping of the IP TOS field */ -static INLINE mlan_wmm_ac_e wlan_wmm_convert_tos_to_ac(pmlan_adapter pmadapter, - t_u32 tos) +mlan_wmm_ac_e wlan_wmm_convert_tos_to_ac(pmlan_adapter pmadapter, t_u32 tos) { ENTER(); @@ -1101,7 +1100,7 @@ static int wlan_dequeue_tx_packet(pmlan_adapter pmadapter) pmadapter->pmoal_handle, &ptr->buf_head, MNULL, MNULL); if (pmbuf) { pmadapter->callbacks.moal_tp_accounting( - pmadapter->pmoal_handle, pmbuf->pdesc, 3); + pmadapter->pmoal_handle, pmbuf, 3); if (pmadapter->tp_state_drop_point == 3) { pmbuf = (pmlan_buffer)util_dequeue_list( pmadapter->pmoal_handle, &ptr->buf_head, @@ -1458,8 +1457,9 @@ t_u8 wlan_get_random_ba_threshold(pmlan_adapter pmadapter) sec = (sec & 0xFFFF) + (sec >> 16); usec = (usec & 0xFFFF) + (usec >> 16); - ba_threshold = (((sec << 16) + usec) % BA_SETUP_MAX_PACKET_THRESHOLD) + - pmadapter->min_ba_threshold; + ba_threshold = + (t_u8)((((sec << 16) + usec) % BA_SETUP_MAX_PACKET_THRESHOLD) + + pmadapter->min_ba_threshold); PRINTM(MINFO, "pmadapter->min_ba_threshold = %d\n", pmadapter->min_ba_threshold); PRINTM(MINFO, "setup BA after %d packets\n", ba_threshold); @@ -2263,7 +2263,13 @@ mlan_status wlan_ret_wmm_get_status(pmlan_private priv, t_u8 *ptlv, ENTER(); send_wmm_event = MFALSE; - + if (resp_len < (int)sizeof(ptlv_hdr->header)) { + PRINTM(MINFO, + "WMM: WMM_GET_STATUS err: cmdresp low length received: %d\n", + resp_len); + LEAVE(); + return MLAN_STATUS_FAILURE; + } PRINTM(MINFO, "WMM: WMM_GET_STATUS cmdresp received: %d\n", resp_len); HEXDUMP("CMD_RESP: WMM_GET_STATUS", pcurrent, resp_len); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_wmm.h b/mxm_wifiex/wlan_src/mlan/mlan_wmm.h index 64fcc22..a458948 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_wmm.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_wmm.h @@ -180,6 +180,8 @@ void wlan_wmm_setup_ac_downgrade(pmlan_private priv); /** select WMM queue */ t_u8 wlan_wmm_select_queue(mlan_private *pmpriv, t_u8 tid); t_void wlan_wmm_delete_peer_ralist(pmlan_private priv, t_u8 *mac); +/** Convert the IP TOS to an WMM AC Queue assignment */ +mlan_wmm_ac_e wlan_wmm_convert_tos_to_ac(pmlan_adapter pmadapter, t_u32 tos); #ifdef STA_SUPPORT /* diff --git a/mxm_wifiex/wlan_src/mlinux/mlan_decl.h b/mxm_wifiex/wlan_src/mlinux/mlan_decl.h index 2b496fe..e1b1d42 100644 --- a/mxm_wifiex/wlan_src/mlinux/mlan_decl.h +++ b/mxm_wifiex/wlan_src/mlinux/mlan_decl.h @@ -24,7 +24,7 @@ #define _MLAN_DECL_H_ /** MLAN release version */ -#define MLAN_RELEASE_VERSION "368.p2" +#define MLAN_RELEASE_VERSION "391" /** Re-define generic data types for MLAN/MOAL */ /** Signed char (1-byte) */ @@ -262,11 +262,12 @@ typedef t_s32 t_sval; #define FW_RELOAD_NO_EMULATION 2 /** out band reset with interface re-emulation */ #define FW_RELOAD_WITH_EMULATION 3 -#ifdef PCIE /** pcie card reset */ #define FW_RELOAD_PCIE_RESET 4 -#endif +/** sdio hw reset */ #define FW_RELOAD_SDIO_HW_RESET 5 +/** pcie inband reset */ +#define FW_RELOAD_PCIE_INBAND_RESET 6 #ifdef USB #define MLAN_USB_BLOCK_SIZE (512) @@ -373,7 +374,9 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; /** 8801 card type */ #define CARD_TYPE_8801 0x0a /** OWL card type */ -#define CARD_TYPE_NW62X 0x0b +#define CARD_TYPE_IW62X 0x0b +/** Black bird card type */ +#define CARD_TYPE_AW693 0x0c /** 9098 A0 reverion num */ #define CHIP_9098_REV_A0 1 @@ -405,8 +408,10 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_SD9177 (CARD_TYPE_9177 | (INTF_SD << 8)) /** SD8801 card type */ #define CARD_TYPE_SD8801 (CARD_TYPE_8801 | (INTF_SD << 8)) -/** SD_NW62X card type */ -#define CARD_TYPE_SDNW62X (CARD_TYPE_NW62X | (INTF_SD << 8)) +/** SD_IW62X card type */ +#define CARD_TYPE_SDIW62X (CARD_TYPE_IW62X | (INTF_SD << 8)) +/** SD_IW62X card type */ +#define CARD_TYPE_SDAW693 (CARD_TYPE_AW693 | (INTF_SD << 8)) #define IS_SD8887(ct) (CARD_TYPE_SD8887 == (ct)) #define IS_SD8897(ct) (CARD_TYPE_SD8897 == (ct)) @@ -418,7 +423,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_SD9098(ct) (CARD_TYPE_SD9098 == (ct)) #define IS_SD9177(ct) (CARD_TYPE_SD9177 == (ct)) #define IS_SD8801(ct) (CARD_TYPE_SD8801 == (ct)) -#define IS_SDNW62X(ct) (CARD_TYPE_SDNW62X == (ct)) +#define IS_SDIW62X(ct) (CARD_TYPE_SDIW62X == (ct)) +#define IS_SDAW693(ct) (CARD_TYPE_SDAW693 == (ct)) /** SD8887 Card */ #define CARD_SD8887 "SD8887" @@ -440,8 +446,10 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_SD9177 "SDIW612" /** SD8801 Card */ #define CARD_SD8801 "SD8801" -/** SDNW62X Card */ -#define CARD_SDNW62X "SDNW62X" +/** SDIW62X Card */ +#define CARD_SDIW62X "SDIW62X" +/** SDAW693 Card */ +#define CARD_SDAW693 "SDAW693" #endif #ifdef PCIE @@ -453,14 +461,17 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_PCIE9097 (CARD_TYPE_9097 | (INTF_PCIE << 8)) /** PCIE9098 card type */ #define CARD_TYPE_PCIE9098 (CARD_TYPE_9098 | (INTF_PCIE << 8)) -/** PCIENW62X card type */ -#define CARD_TYPE_PCIENW62X (CARD_TYPE_NW62X | (INTF_PCIE << 8)) +/** PCIEIW62X card type */ +#define CARD_TYPE_PCIEIW62X (CARD_TYPE_IW62X | (INTF_PCIE << 8)) +/** PCIEAW693 card type */ +#define CARD_TYPE_PCIEAW693 (CARD_TYPE_AW693 | (INTF_PCIE << 8)) #define IS_PCIE8897(ct) (CARD_TYPE_PCIE8897 == (ct)) #define IS_PCIE8997(ct) (CARD_TYPE_PCIE8997 == (ct)) #define IS_PCIE9097(ct) (CARD_TYPE_PCIE9097 == (ct)) #define IS_PCIE9098(ct) (CARD_TYPE_PCIE9098 == (ct)) -#define IS_PCIENW62X(ct) (CARD_TYPE_PCIENW62X == (ct)) +#define IS_PCIEIW62X(ct) (CARD_TYPE_PCIEIW62X == (ct)) +#define IS_PCIEAW693(ct) (CARD_TYPE_PCIEAW693 == (ct)) /** PCIE8897 Card */ #define CARD_PCIE8897 "PCIE8897" @@ -474,8 +485,10 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_PCIE9098 "PCIE9098" /** PCIEAW690 Card */ #define CARD_PCIEAW690 "PCIEAW690" -/** PCIENW62X Card */ -#define CARD_PCIENW62X "PCIENW62X" +/** PCIEIW62X Card */ +#define CARD_PCIEIW62X "PCIEIW62X" +/** PCIEAW693 Card */ +#define CARD_PCIEAW693 "PCIEAW693" /** PCIEIW629 Card */ #define CARD_PCIEIW629 "PCIEIW629" #endif @@ -493,8 +506,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_USB9098 (CARD_TYPE_9098 | (INTF_USB << 8)) /** USB9097 card type */ #define CARD_TYPE_USB9097 (CARD_TYPE_9097 | (INTF_USB << 8)) -/** USBNW62X card type */ -#define CARD_TYPE_USBNW62X (CARD_TYPE_NW62X | (INTF_USB << 8)) +/** USBIW62X card type */ +#define CARD_TYPE_USBIW62X (CARD_TYPE_IW62X | (INTF_USB << 8)) #define IS_USB8801(ct) (CARD_TYPE_USB8801 == (ct)) #define IS_USB8897(ct) (CARD_TYPE_USB8897 == (ct)) @@ -502,7 +515,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_USB8978(ct) (CARD_TYPE_USB8978 == (ct)) #define IS_USB9098(ct) (CARD_TYPE_USB9098 == (ct)) #define IS_USB9097(ct) (CARD_TYPE_USB9097 == (ct)) -#define IS_USBNW62X(ct) (CARD_TYPE_USBNW62X == (ct)) +#define IS_USBIW62X(ct) (CARD_TYPE_USBIW62X == (ct)) /** USB8801 Card */ #define CARD_USB8801 "USB8801" @@ -516,8 +529,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_USB9098 "USB9098" /** USB9097 Card */ #define CARD_USB9097 "USBIW620" -/** USBNW62X Card */ -#define CARD_USBNW62X "USBNW62X" +/** USBIW62X Card */ +#define CARD_USBIW62X "USBIW62X" #endif #define IS_CARD8801(ct) (CARD_TYPE_8801 == ((ct)&0xf)) @@ -529,7 +542,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_CARD9098(ct) (CARD_TYPE_9098 == ((ct)&0xf)) #define IS_CARD9097(ct) (CARD_TYPE_9097 == ((ct)&0xf)) #define IS_CARD9177(ct) (CARD_TYPE_9177 == ((ct)&0xf)) -#define IS_CARDNW62X(ct) (CARD_TYPE_NW62X == ((ct)&0xf)) +#define IS_CARDIW62X(ct) (CARD_TYPE_IW62X == ((ct)&0xf)) +#define IS_CARDAW693(ct) (CARD_TYPE_AW693 == ((ct)&0xf)) typedef struct _card_type_entry { t_u16 card_type; @@ -822,6 +836,7 @@ typedef enum _mlan_event_id { MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020, #endif MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023, + MLAN_EVENT_ID_DRV_RTT_RESULT = 0x80000025, MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026, MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027, MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER = 0x80000028, @@ -974,10 +989,10 @@ typedef MLAN_PACK_START struct _Band_Config_t { t_u8 chan2Offset : 2; /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */ t_u8 chanWidth : 2; - /** Band Info - (00)=2.4GHz, (01)=5GHz */ + /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; #else - /** Band Info - (00)=2.4GHz, (01)=5GHz */ + /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */ t_u8 chanWidth : 2; @@ -1152,6 +1167,10 @@ typedef MLAN_PACK_START struct _mix_rate_info { t_u8 mcs_index; /** bitrate, in 500Kbps */ t_u16 bitrate; + /** NSS */ + t_u8 nss_index; + /** DCM */ + t_u8 dcm; } MLAN_PACK_END mix_rate_info, *pmix_rate_info; typedef MLAN_PACK_START struct _rxpd_extra_info { @@ -1163,10 +1182,12 @@ typedef MLAN_PACK_START struct _rxpd_extra_info { t_u8 mcs_known; /** mcs.flags */ t_u8 mcs_flags; - /** vht sig1 */ - t_u32 vht_sig1; - /** vht sig2 */ - t_u32 vht_sig2; + /** vht/he sig1 */ + t_u32 vht_he_sig1; + /** vht/he sig2 */ + t_u32 vht_he_sig2; + /** HE user idx */ + t_u32 user_idx; } MLAN_PACK_END rxpd_extra_info, *prxpd_extra_info; typedef MLAN_PACK_START struct _radiotap_info { @@ -2030,6 +2051,308 @@ typedef struct { 0x00000080 /** all contention (min, max, avg) statistics (within ac \ statisctics) */ +/** =========== Define Copied from HAL START =========== */ +/** Ranging status */ +typedef enum { + RTT_STATUS_SUCCESS = 0, + /** general failure status */ + RTT_STATUS_FAILURE = 1, + /** target STA does not respond to request */ + RTT_STATUS_FAIL_NO_RSP = 2, + /** request rejected. Applies to 2-sided RTT only */ + RTT_STATUS_FAIL_REJECTED = 3, + RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4, + /** timing measurement times out */ + RTT_STATUS_FAIL_TM_TIMEOUT = 5, + /** Target on different channel, cannot range */ + RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6, + /** ranging not supported */ + RTT_STATUS_FAIL_NO_CAPABILITY = 7, + /** request aborted for unknown reason */ + RTT_STATUS_ABORTED = 8, + /** Invalid T1-T4 timestamp */ + RTT_STATUS_FAIL_INVALID_TS = 9, + /** 11mc protocol failed */ + RTT_STATUS_FAIL_PROTOCOL = 10, + /** request could not be scheduled */ + RTT_STATUS_FAIL_SCHEDULE = 11, + /** responder cannot collaborate at time of request */ + RTT_STATUS_FAIL_BUSY_TRY_LATER = 12, + /** bad request args */ + RTT_STATUS_INVALID_REQ = 13, + /** WiFi not enabled */ + RTT_STATUS_NO_WIFI = 14, + /** Responder overrides param info, cannot range with new params */ + RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15 +} wifi_rtt_status; + +/** RTT peer type */ +typedef enum { + RTT_PEER_AP = 0x1, + RTT_PEER_STA = 0x2, + RTT_PEER_P2P_GO = 0x3, + RTT_PEER_P2P_CLIENT = 0x4, + RTT_PEER_NAN = 0x5 +} rtt_peer_type; + +/** RTT Measurement Bandwidth */ +typedef enum { + WIFI_RTT_BW_5 = 0x01, + WIFI_RTT_BW_10 = 0x02, + WIFI_RTT_BW_20 = 0x04, + WIFI_RTT_BW_40 = 0x08, + WIFI_RTT_BW_80 = 0x10, + WIFI_RTT_BW_160 = 0x20 +} wifi_rtt_bw; + +/** RTT Type */ +typedef enum { + RTT_TYPE_1_SIDED = 0x1, + RTT_TYPE_2_SIDED = 0x2, +} wifi_rtt_type; + +/** RTT configuration */ +typedef struct { + /** peer device mac address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** 1-sided or 2-sided RTT */ + wifi_rtt_type type; + /** optional - peer device hint (STA, P2P, AP) */ + rtt_peer_type peer; + /** Required for STA-AP mode, optional for P2P, NBD etc. */ + wifi_channel_info channel; + /** Time interval between bursts (units: 100 ms). + * Applies to 1-sided and 2-sided RTT multi-burst requests. + * Range: 0-31, 0: no preference by initiator (2-sided RTT) */ + t_u32 burst_period; + /** Total number of RTT bursts to be executed. It will be + * specified in the same way as the parameter "Number of + * Burst Exponent" found in the FTM frame format. It + * applies to both: 1-sided RTT and 2-sided RTT. Valid + * values are 0 to 15 as defined in 802.11mc std. + * 0 means single shot + * The implication of this parameter on the maximum + * number of RTT results is the following: + * for 1-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst) + * for 2-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst - 1) */ + t_u32 num_burst; + /** num of frames per burst. Minimum value = 1, Maximum value = 31 + * For 2-sided this equals the number of FTM frames to be attempted in a + * single burst. This also equals the number of FTM frames that the + * initiator will request that the responder send in a single frame. */ + t_u32 num_frames_per_burst; + /** number of retries for a failed RTT frame. Applies + * to 1-sided RTT only. Minimum value = 0, Maximum value = 3 */ + t_u32 num_retries_per_rtt_frame; + + /** following fields are only valid for 2-side RTT */ + /** Maximum number of retries that the initiator can retry an FTMR + * frame. Minimum value = 0, Maximum value = 3 */ + t_u32 num_retries_per_ftmr; + /** 1: request LCI, 0: do not request LCI */ + t_u8 LCI_request; + /** 1: request LCR, 0: do not request LCR */ + t_u8 LCR_request; + /** Applies to 1-sided and 2-sided RTT. Valid values will + * be 2-11 and 15 as specified by the 802.11mc std for + * the FTM parameter burst duration. In a multi-burst + * request, if responder overrides with larger value, + * the initiator will return failure. In a single-burst + * request if responder overrides with larger value, + * the initiator will sent TMR_STOP to terminate RTT + * at the end of the burst_duration it requested. */ + t_u32 burst_duration; + /** RTT preamble to be used in the RTT frames */ + wifi_preamble preamble; + /** RTT BW to be used in the RTT frames */ + wifi_rtt_bw bw; +} wifi_rtt_config; + +/** Format of information elements found in the beacon */ +typedef struct { + /** element identifier */ + t_u8 id; + /** number of bytes to follow */ + t_u8 len; + t_u8 data[]; +} wifi_information_element; + +/** RTT results */ +typedef struct { + /** device mac address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** burst number in a multi-burst request */ + t_u32 burst_num; + /** Total RTT measurement frames attempted */ + t_u32 measurement_number; + /** Total successful RTT measurement frames */ + t_u32 success_number; + /** Maximum number of "FTM frames per burst" supported by + * the responder STA. Applies to 2-sided RTT only. + * If reponder overrides with larger value: + * - for single-burst request initiator will truncate the + * larger value and send a TMR_STOP after receiving as + * many frames as originally requested. + * - for multi-burst request, initiator will return + * failure right away */ + t_u8 number_per_burst_peer; + /** ranging status */ + wifi_rtt_status status; + /** When status == RTT_STATUS_FAIL_BUSY_TRY_LATER, + * this will be the time provided by the responder as to + * when the request can be tried again. Applies to 2-sided + * RTT only. In sec, 1-31sec. */ + t_u8 retry_after_duration; + /** RTT type */ + wifi_rtt_type type; + /** average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB */ + int rssi; + /** rssi spread in 0.5 dB steps e.g. 5 implies 2.5 dB spread (optional) + */ + int rssi_spread; + /** 1-sided RTT: TX rate of RTT frame. + * 2-sided RTT: TX rate of initiator's Ack in response to FTM frame. */ + wifi_rate tx_rate; + /** 1-sided RTT: TX rate of Ack from other side. + * 2-sided RTT: TX rate of FTM frame coming from responder. */ + wifi_rate rx_rate; + /** round trip time in picoseconds */ + t_s64 rtt; + /** rtt standard deviation in picoseconds */ + t_s64 rtt_sd; + /** difference between max and min rtt times recorded in picoseconds */ + t_s64 rtt_spread; + /** distance in mm (optional) */ + int distance_mm; + /** standard deviation in mm (optional) */ + int distance_sd_mm; + /** difference between max and min distance recorded in mm (optional) */ + int distance_spread_mm; + /** time of the measurement (in microseconds since boot) */ + t_s64 ts; + /** in ms, actual time taken by the FW to finish one burst + * measurement. Applies to 1-sided and 2-sided RTT. */ + int burst_duration; + /** Number of bursts allowed by the responder. Applies + * to 2-sided RTT only. */ + int negotiated_burst_num; + /** for 11mc only */ + wifi_information_element *LCI; + /** for 11mc only */ + wifi_information_element *LCR; +} wifi_rtt_result; + +/** Preamble definition for bit mask used in wifi_rtt_capabilities */ +#define PREAMBLE_LEGACY 0x1 +#define PREAMBLE_HT 0x2 +#define PREAMBLE_VHT 0x4 + +/** BW definition for bit mask used in wifi_rtt_capabilities */ +#define BW_5_SUPPORT 0x1 +#define BW_10_SUPPORT 0x2 +#define BW_20_SUPPORT 0x4 +#define BW_40_SUPPORT 0x8 +#define BW_80_SUPPORT 0x10 +#define BW_160_SUPPORT 0x20 + +/** RTT Capabilities */ +typedef struct { + /** if 1-sided rtt data collection is supported */ + t_u8 rtt_one_sided_supported; + /** if ftm rtt data collection is supported */ + t_u8 rtt_ftm_supported; + /** if initiator supports LCI request. Applies to 2-sided RTT */ + t_u8 lci_support; + /** if initiator supports LCR request. Applies to 2-sided RTT */ + t_u8 lcr_support; + /** bit mask indicates what preamble is supported by initiator */ + t_u8 preamble_support; + /** bit mask indicates what BW is supported by initiator */ + t_u8 bw_support; + /** if 11mc responder mode is supported */ + t_u8 responder_supported; + /** draft 11mc spec version supported by chip. For instance, + * version 4.0 should be 40 and version 4.3 should be 43 etc. */ + t_u8 mc_version; +} wifi_rtt_capabilities; + +/** API for setting LCI/LCR information to be provided to a requestor */ +typedef enum { + /** Not expected to change location */ + WIFI_MOTION_NOT_EXPECTED = 0, + /** Expected to change location */ + WIFI_MOTION_EXPECTED = 1, + /** Movement pattern unknown */ + WIFI_MOTION_UNKNOWN = 2, +} wifi_motion_pattern; + +/** LCI information */ +typedef struct { + /** latitude in degrees * 2^25 , 2's complement */ + long latitude; + /** latitude in degrees * 2^25 , 2's complement */ + long longitude; + /** Altitude in units of 1/256 m */ + int altitude; + /** As defined in Section 2.3.2 of IETF RFC 6225 */ + t_u8 latitude_unc; + /** As defined in Section 2.3.2 of IETF RFC 6225 */ + t_u8 longitude_unc; + /** As defined in Section 2.4.5 from IETF RFC 6225: */ + t_u8 altitude_unc; + /** Following element for configuring the Z subelement */ + wifi_motion_pattern motion_pattern; + /** floor in units of 1/16th of floor. 0x80000000 if unknown. */ + int floor; + /** in units of 1/64 m */ + int height_above_floor; + /** in units of 1/64 m. 0 if unknown */ + int height_unc; +} wifi_lci_information; + +/** LCR information */ +typedef struct { + /** country code */ + char country_code[2]; + /** length of the info field */ + int length; + /** Civic info to be copied in FTM frame */ + char civic_info[256]; +} wifi_lcr_information; + +/** + * RTT Responder information + */ +typedef struct { + wifi_channel_info channel; + wifi_preamble preamble; +} wifi_rtt_responder; + +/** =========== Define Copied from HAL END =========== */ + +#define MAX_RTT_CONFIG_NUM 10 + +/** RTT config params */ +typedef struct wifi_rtt_config_params { + t_u8 rtt_config_num; + wifi_rtt_config rtt_config[MAX_RTT_CONFIG_NUM]; +} wifi_rtt_config_params_t; + +#define OID_RTT_REQUEST 0 +#define OID_RTT_CANCEL 1 + +/** Pass RTT result element between mlan and moal */ +typedef struct { + /** element identifier */ + t_u16 id; + /** number of bytes to follow */ + t_u16 len; + /** data: fill with one wifi_rtt_result */ + t_u8 data[]; +} wifi_rtt_result_element; + /** station stats */ typedef struct _sta_stats { /** last_rx_in_msec */ @@ -2351,6 +2674,8 @@ typedef struct _mlan_device { t_u8 ext_scan; /* mcs32 setting */ t_u8 mcs32; + /** second mac flag */ + t_u8 second_mac; } mlan_device, *pmlan_device; /** MLAN API function prototype */ diff --git a/mxm_wifiex/wlan_src/mlinux/mlan_ieee.h b/mxm_wifiex/wlan_src/mlinux/mlan_ieee.h index cf2ef85..e0a73ad 100644 --- a/mxm_wifiex/wlan_src/mlinux/mlan_ieee.h +++ b/mxm_wifiex/wlan_src/mlinux/mlan_ieee.h @@ -4,7 +4,7 @@ * definitions used in MLAN and MOAL module. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -48,7 +48,7 @@ typedef enum _WLAN_802_11_NETWORK_TYPE { #ifdef BIG_ENDIAN_SUPPORT /** Frame control: Type Mgmt frame */ -#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x3000 +#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x0c00 /** Frame control: SubType Mgmt frame */ #define IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(fc) (((fc)&0xF000) >> 12) #else @@ -90,6 +90,8 @@ typedef MLAN_PACK_START enum _IEEEtypes_ElementId_e { EXTEND_CHANNEL_SWITCH_ANN = 60, QUIET = 40, IBSS_DFS = 41, + MEASUREMENT_REQUEST = 38, + MEASUREMENT_REPORT = 39, SUPPORTED_CHANNELS = 36, REGULATORY_CLASS = 59, HT_CAPABILITY = 45, @@ -177,6 +179,33 @@ typedef MLAN_PACK_START struct _IEEEtypes_Generic_t { t_u8 data[IEEE_MAX_IE_SIZE - sizeof(IEEEtypes_Header_t)]; } MLAN_PACK_END IEEEtypes_Generic_t, *pIEEEtypes_Generic_t; +#define MEASURE_TYPE_CLI 8 +#define MEASURE_TYPE_LOCATION_CIVIC 9 + +/** Measurement Report IE */ +typedef MLAN_PACK_START struct _IEEEtypes_MeasurementReport_t { + /** Generic IE header */ + IEEEtypes_Header_t ieee_hdr; + /** Measurement Token */ + t_u8 ms_token; + /** Measurement Report Mode */ + t_u8 ms_rp_mode; + /** Measurement Type, value in MEASURE_TYPE_XXX */ + t_u8 ms_type; + /** variable */ + t_u8 variable[]; +} MLAN_PACK_END IEEEtypes_MeasurementReport_t; + +/** Report */ +typedef MLAN_PACK_START struct _IEEEtypes_Report_t { + /** Subelement ID */ + t_u8 subelement_id; + /** length */ + t_u8 length; + /** variable */ + t_u8 variable[]; +} MLAN_PACK_END IEEEtypes_Report_t; + /**ft capability policy*/ typedef MLAN_PACK_START struct _IEEEtypes_FtCapPolicy_t { #ifdef BIG_ENDIAN_SUPPORT @@ -1718,8 +1747,8 @@ typedef MLAN_PACK_START struct _wlan_user_scan_chan { t_u8 radio_type; /** Scan type: Active = 1, Passive = 2 */ t_u8 scan_type; - /** Reserved */ - t_u8 reserved; + /** rnr_flag */ + t_u8 rnr_flag; /** Scan duration in milliseconds; if 0 default used */ t_u32 scan_time; } MLAN_PACK_END wlan_user_scan_chan; @@ -1834,11 +1863,14 @@ typedef MLAN_PACK_START struct { #define BG_SCAN_SSID_RSSI_MATCH 0x0004 /**wait for all channel scan to complete to report scan result*/ #define BG_SCAN_WAIT_ALL_CHAN_DONE 0x80000000 -/** Maximum number of channels that can be sent in bg scan config */ -#define CHAN_MAX_24G 14 -#define CHAN_MAX_5G 24 -#define CHAN_MAX_UNII4 3 -#define WLAN_BG_SCAN_CHAN_MAX (CHAN_MAX_24G + CHAN_MAX_5G + CHAN_MAX_UNII4) + +#define CHAN_MAX_6G 0 + +/** max bgscan chan number */ +#define WLAN_BG_SCAN_CHAN_MAX 38 + +/** max bgscan chan number, include UNII_4 channel */ +#define WLAN_BG_SCAN_CHAN_MAX_UNII_4 41 /** Enumeration definition */ /** EES MODE */ @@ -1906,7 +1938,7 @@ typedef MLAN_PACK_START struct { /** SSID filter list used in the to limit the scan results */ wlan_user_scan_ssid ssid_list[MRVDRV_MAX_SSID_LIST_LENGTH]; /** Variable number (fixed maximum) of channels to scan up */ - wlan_user_scan_chan chan_list[WLAN_BG_SCAN_CHAN_MAX]; + wlan_user_scan_chan chan_list[WLAN_USER_SCAN_CHAN_MAX]; /** scan channel gap */ t_u16 scan_chan_gap; /** Enable EES configuration */ diff --git a/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h b/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h index 7790db9..062b239 100644 --- a/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h +++ b/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h @@ -3,7 +3,7 @@ * @brief This file declares the IOCTL data structures and APIs. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -328,6 +328,9 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_ROBUSTCOEX = 0x00200056, MLAN_OID_MISC_GET_TX_RX_HISTOGRAM = 0x00200057, + MLAN_OID_MISC_CONFIG_RTT = 0x00200059, + MLAN_OID_MISC_CANCEL_RTT = 0x0020005A, + MLAN_OID_MISC_RTT_RESPONDER_CFG = 0x0020005B, MLAN_OID_MISC_CFP_INFO = 0x00200060, MLAN_OID_MISC_BOOT_SLEEP = 0x00200061, #if defined(PCIE) @@ -365,6 +368,10 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_CH_LOAD = 0x00200087, MLAN_OID_MISC_STATS = 0x00200088, MLAN_OID_MISC_CH_LOAD_RESULTS = 0x00200089, + MLAN_OID_MISC_CLOUD_KEEP_ALIVE_RX = 0x0020008A, + MLAN_OID_MISC_CROSS_CHIP_SYNCH = 0x0020008B, + MLAN_OID_MISC_RF_TEST_CONFIG_TRIGGER_FRAME = 0x0020008C, + MLAN_OID_MISC_OFDM_DESENSE_CFG = 0x0020008D, }; /** Sub command size */ @@ -1181,6 +1188,11 @@ typedef struct _mlan_uap_scan_channels { #define MAX_NUM_PKTS 9 #define DEF_NUM_PKTS 3 + +/** Default channel mode and retry packets for channel switch */ +#define DEFAULT_RETRY_PKTS 9 +#define DEFAULT_CHAN_MODE_MASK 3 + /** mlan_chan_switch_param */ typedef struct _mlan_action_chan_switch { /** mode*/ @@ -1372,8 +1384,6 @@ enum _mlan_band_def { BAND_AAC = 64, BAND_GAX = 256, BAND_AAX = 512, - MLAN_OID_MISC_RF_TEST_CONFIG_TRIGGER_FRAME = 0x0020008C, - }; /** Channel bandwidth */ @@ -1885,6 +1895,8 @@ typedef struct _mlan_fw_info { t_u32 hw_dot_11n_dev_cap; /** Device support for MIMO abstraction of MCSs */ t_u8 hw_dev_mcs_support; + /** mpdu density */ + t_u8 hw_mpdu_density; /** user's MCS setting */ t_u8 usr_dev_mcs_support; /** 802.11ac device capabilities */ @@ -1927,6 +1939,8 @@ typedef struct _mlan_fw_info { t_u8 prohibit_80mhz; /** FW support beacon protection */ t_u8 fw_beacon_prot; + /** FW RTT support */ + t_u8 rtt_support; /* lower 8 bytes of uuid */ t_u64 uuid_lo; @@ -2548,6 +2562,9 @@ typedef struct _sta_info_data { t_u16 ie_len; } sta_info_data; +/** Per station Maximum IE buffer SIZE */ +#define MAX_STA_LIST_IE_SIZE 13 + /** mlan_ds_sta_list structure for MLAN_OID_UAP_STA_LIST */ typedef struct _mlan_ds_sta_list { /** station count */ @@ -4017,6 +4034,7 @@ typedef struct _mlan_ds_11ax_cfg { #define MLAN_11AX_TWT_SETUP_SUBID 0x114 #define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115 +#define MLAN_11AX_TWT_REPORT_SUBID 0x116 #define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322) #define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323) @@ -4153,6 +4171,17 @@ typedef struct MLAN_PACK_START _mlan_ds_twt_teardown { t_u8 teardown_all_twt; } MLAN_PACK_END mlan_ds_twt_teardown, *pmlan_ds_twt_teardown; +/** Type definition of mlan_ds_twt_report for MLAN_OID_11AX_TWT_CFG */ +typedef MLAN_PACK_START struct _mlan_ds_twt_report { + /** TWT report type, 0: BTWT id */ + t_u8 type; + /** TWT report length of value in data */ + t_u8 length; + t_u8 reserve[2]; + /** TWT report payload for FW response to fill */ + t_u8 data[36]; +} MLAN_PACK_END mlan_ds_twt_report, *pmlan_ds_twt_report; + /** Type definition of mlan_ds_twtcfg for MLAN_OID_11AX_TWT_CFG */ typedef struct MLAN_PACK_START _mlan_ds_twtcfg { /** Sub-command */ @@ -4166,6 +4195,8 @@ typedef struct MLAN_PACK_START _mlan_ds_twtcfg { /** TWT Teardown config for Sub ID: MLAN_11AX_TWT_TEARDOWN_SUBID */ mlan_ds_twt_teardown twt_teardown; + /** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */ + mlan_ds_twt_report twt_report; } param; } MLAN_PACK_END mlan_ds_twtcfg, *pmlan_ds_twtcfg; @@ -4243,20 +4274,11 @@ enum _mlan_reg_type { MLAN_REG_CAU = 5, MLAN_REG_PSU = 6, MLAN_REG_BCA = 7, -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) || \ - defined(SD9177) MLAN_REG_CIU = 8, -#endif -#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ - defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \ - defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) MLAN_REG_MAC2 = 0x81, MLAN_REG_BBP2 = 0x82, MLAN_REG_RF2 = 0x83, MLAN_REG_BCA2 = 0x87 -#endif }; /** Type definition of mlan_ds_reg_rw for MLAN_OID_REG_RW */ @@ -4489,6 +4511,12 @@ enum _mlan_func_cmd { #define MLAN_NETMON_CONTROL MBIT(1) /* data frame */ #define MLAN_NETMON_DATA MBIT(2) +/* only unicast destined frame (no promiscuous) */ +#define MLAN_NETMON_NOPROM MBIT(3) +/* capture non-bss Rx beacons */ +#define MLAN_NETMON_NON_BSS_BCN MBIT(5) +/* capture Tx frames */ +#define MLAN_NETMON_TX MBIT(6) typedef struct _mlan_ds_misc_net_monitor { /** Enable/disable network monitor */ @@ -4522,6 +4550,15 @@ typedef struct _mlan_ds_misc_rx_abort_cfg { /** Rx weak RSSI pkt threshold */ t_s8 rssi_threshold; } mlan_ds_misc_rx_abort_cfg; +/** Type definition of mlan_ds_misc_ofdm_desense_cfg + * for MLAN_OID_MISC_OFDM_DESENSE_CFG + */ +typedef struct _mlan_ds_misc_ofdm_desense_cfg { + /** enable/disable ofdm desense cfg */ + t_u8 enable; + /** OFDM CCA pkt threshold */ + t_s8 cca_threshold; +} mlan_ds_misc_ofdm_desense_cfg; /** Type definition of mlan_ds_misc_rx_abort_cfg_ext * for MLAN_OID_MISC_RX_ABORT_CFG_EXT @@ -4533,6 +4570,14 @@ typedef struct _mlan_ds_misc_rx_abort_cfg_ext { t_s8 rssi_margin; /** specify ceil rssi threshold */ t_s8 ceil_rssi_threshold; + /** specify floor rssi threshold */ + t_s8 floor_rssi_threshold; + /** current dynamic rssi threshold */ + t_s8 current_dynamic_rssi_threshold; + /** rssi config: default or user configured */ + t_u8 rssi_default_config; + /** EDMAC status */ + t_u8 edmac_enable; } mlan_ds_misc_rx_abort_cfg_ext; /** Type definition of mlan_ds_misc_rx_abort_cfg_ext @@ -5373,6 +5418,21 @@ typedef struct _mlan_ds_misc_keep_alive { t_u16 ether_type; } mlan_ds_misc_keep_alive, *pmlan_ds_misc_keep_alive; +#define MKEEP_ALIVE_ACK_PKT_MAX 100 +typedef struct _mlan_ds_misc_keep_alive_rx { + t_u8 mkeep_alive_id; + t_u8 enable; + /** enable/disable tcp reset*/ + t_u8 reset; + /**True means saved in driver, false means not saved or download*/ + t_u8 cached; + t_u8 dst_mac[MLAN_MAC_ADDR_LENGTH]; + t_u8 src_mac[MLAN_MAC_ADDR_LENGTH]; + t_u16 pkt_len; + t_u8 packet[MKEEP_ALIVE_ACK_PKT_MAX]; + /** Ethernet type */ + t_u16 ether_type; +} mlan_ds_misc_keep_alive_rx, *pmlan_ds_misc_keep_alive_rx; /** TX and RX histogram statistic parameters*/ typedef MLAN_PACK_START struct _mlan_ds_misc_tx_rx_histogram { /** Enable or disable get tx/rx histogram statistic */ @@ -5427,6 +5487,115 @@ typedef struct _mlan_ds_misc_robustcoex_params { t_u8 gpio_polarity; } mlan_ds_misc_robustcoex_params; +/** RTT configuration */ +typedef struct _mlan_rtt_config { + /** peer device mac address */ + t_u8 addr[MLAN_MAC_ADDR_LENGTH]; + /** 1-sided or 2-sided RTT */ + t_u8 type; + /** optional - peer device hint (STA, P2P, AP) */ + t_u8 peer; + /** Required for STA-AP mode, optional for P2P, NBD etc. */ + t_u8 channel; + /** Required for STA-AP mode, optional for P2P, NBD etc. */ + Band_Config_t bandcfg; + /** Time interval between bursts (units: 100 ms). + * Applies to 1-sided and 2-sided RTT multi-burst requests. + * Range: 0-31, 0: no preference by initiator (2-sided RTT) */ + t_u8 burst_period; + /** Total number of RTT bursts to be executed. It will be + * specified in the same way as the parameter "Number of + * Burst Exponent" found in the FTM frame format. It + * applies to both: 1-sided RTT and 2-sided RTT. Valid + * values are 0 to 15 as defined in 802.11mc std. + * 0 means single shot + * The implication of this parameter on the maximum + * number of RTT results is the following: + * for 1-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst) + * for 2-sided RTT: max num of RTT results = + * (2^num_burst)*(num_frames_per_burst - 1) */ + t_u8 num_burst; + /** num of frames per burst. + * Minimum value = 1, Maximum value = 31 + * For 2-sided this equals the number of FTM frames + * to be attempted in a single burst. This also + * equals the number of FTM frames that the + * initiator will request that the responder send + * in a single frame. */ + t_u8 num_frames_per_burst; + /** number of retries for a failed RTT frame. Applies + * to 1-sided RTT only. Minimum value = 0, Maximum value = 3 */ + t_u8 num_retries_per_rtt_frame; + + /** following fields are only valid for 2-side RTT */ + /** Maximum number of retries that the initiator can + * retry an FTMR frame. + * Minimum value = 0, Maximum value = 3 */ + t_u8 num_retries_per_ftmr; + /** 1: request LCI, 0: do not request LCI */ + t_u8 LCI_request; + /** 1: request LCR, 0: do not request LCR */ + t_u8 LCR_request; + /** Applies to 1-sided and 2-sided RTT. Valid values will + * be 2-11 and 15 as specified by the 802.11mc std for + * the FTM parameter burst duration. In a multi-burst + * request, if responder overrides with larger value, + * the initiator will return failure. In a single-burst + * request if responder overrides with larger value, + * the initiator will sent TMR_STOP to terminate RTT + * at the end of the burst_duration it requested. */ + t_u8 burst_duration; + /** RTT preamble to be used in the RTT frames */ + t_u8 preamble; + /** RTT BW to be used in the RTT frames */ + t_u8 bw; +} mlan_rtt_config, *pmlan_rtt_config; + +/** RTT config params */ +typedef struct _mlan_rtt_config_params { + t_u8 rtt_config_num; + mlan_rtt_config rtt_config[MAX_RTT_CONFIG_NUM]; +} mlan_rtt_config_params; + +/** RTT cancel params */ +typedef struct _mlan_rtt_cancel_params { + t_u8 rtt_cancel_num; + t_u8 rtt_cancel[MAX_RTT_CONFIG_NUM][MLAN_MAC_ADDR_LENGTH]; +} mlan_rtt_cancel_params; + +/** RTT responder info */ +typedef struct _rtt_responder_info { + t_u8 channel; + Band_Config_t bandcfg; + t_u8 preamble; +} rtt_responder_info; + +/** RTT responder enable configure */ +typedef struct _rtt_responder_encfg { + t_u8 channel; + Band_Config_t bandcfg; + t_u32 max_dur_sec; +} rtt_responder_encfg; + +/** Define for mlan_rtt_responder.action */ +#define RTT_GET_RESPONDER_INFO 0 +#define RTT_SET_RESPONDER_ENABLE 1 +#define RTT_SET_RESPONDER_DISABLE 2 +#define RTT_SET_RESPONDER_LCI 3 +#define RTT_SET_RESPONDER_LCR 4 + +/** RTT responder configure for MLAN_OID_MISC_RTT_RESPONDER_CFG */ +typedef struct _mlan_rtt_responder { + t_u8 action; + union { + rtt_responder_info info; + rtt_responder_encfg encfg; + wifi_lci_information lci; + wifi_lcr_information lcr; + } u; +} mlan_rtt_responder; + #if defined(PCIE) typedef struct _mlan_ds_ssu_params { t_u32 nskip; @@ -5885,9 +6054,24 @@ typedef struct _mlan_ds_ch_load { t_s16 noise; t_u16 rx_quality; t_u16 duration; - t_u16 cca_th; } mlan_ds_ch_load; +/** Type definition of mlan_ds_cross_chip_synch */ +typedef struct _mlan_ds_cross_chip_synch { + /**cross chip sync action 0-GET, 1-SET */ + t_u16 action; + /**cross chip sync start or stop */ + t_u8 start_stop; + /**cross chip sync role, master or slave */ + t_u8 role; + /**cross chip sync periodicty of toggle in us */ + t_u32 period; + /**cross chip sync initial TSF low */ + t_u32 init_tsf_low; + /**cross chip sync intial TSF high */ + t_u32 init_tsf_high; +} mlan_ds_cross_chip_synch; + /** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */ typedef struct _mlan_ds_misc_cfg { /** Sub-command */ @@ -6001,11 +6185,18 @@ typedef struct _mlan_ds_misc_cfg { t_u64 misc_tsf; mlan_ds_custom_reg_domain custom_reg_domain; mlan_ds_misc_keep_alive keep_alive; + mlan_ds_misc_keep_alive_rx keep_alive_rx; mlan_ds_misc_tx_rx_histogram tx_rx_histogram; mlan_ds_cw_mode_ctrl cwmode; /** Tx/Rx per-packet control */ t_u8 txrx_pkt_ctrl; mlan_ds_misc_robustcoex_params robustcoexparams; + /** config RTT for MLAN_OID_MISC_CONFIG_RTT */ + mlan_rtt_config_params rtt_params; + /** cancel RTT for MLAN_OID_MISC_CANCEL_RTT */ + mlan_rtt_cancel_params rtt_cancel; + /** config RTT responder for MLAN_OID_MISC_RTT_RESPONDER_CFG */ + mlan_rtt_responder rtt_rsp_cfg; #if defined(PCIE) mlan_ds_ssu_params ssu_params; #endif @@ -6016,6 +6207,7 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_mapping_policy dmcs_policy; mlan_ds_misc_dmcs_status dmcs_status; mlan_ds_misc_rx_abort_cfg rx_abort_cfg; + mlan_ds_misc_ofdm_desense_cfg ofdm_desense_cfg; mlan_ds_misc_rx_abort_cfg_ext rx_abort_cfg_ext; mlan_ds_misc_tx_ampdu_prot_mode tx_ampdu_prot_mode; mlan_ds_misc_rate_adapt_cfg rate_adapt_cfg; @@ -6033,6 +6225,7 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_arb_cfg arb_cfg; mlan_ds_misc_cfp_tbl cfp; t_u8 range_ext_mode; + mlan_ds_twt_report twt_report_info; mlan_ds_misc_dot11mc_unassoc_ftm_cfg dot11mc_unassoc_ftm_cfg; mlan_ds_misc_tp_state tp_state; mlan_ds_hal_phy_cfg_params hal_phy_cfg_params; @@ -6043,6 +6236,7 @@ typedef struct _mlan_ds_misc_cfg { #endif t_u32 ips_ctrl; mlan_ds_ch_load ch_load; + mlan_ds_cross_chip_synch cross_chip_synch; } param; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c index fbce6bb..32e41bf 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c @@ -3,7 +3,7 @@ * @brief This file contains the functions for CFG80211. * * - * Copyright 2011-2022 NXP + * Copyright 2011-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -198,6 +198,27 @@ void *woal_get_netdev_priv(struct net_device *dev) return (void *)netdev_priv(dev); } +/** + * @brief get ieee80211_channel + * + * @param priv A pointer to moal_private structure + * @param pchan_info A pointer to chan_band_info structure + * + * @return radio_type + */ +struct ieee80211_channel *woal_get_ieee80211_channel(moal_private *priv, + chan_band_info *pchan_info) +{ + enum ieee80211_band band = IEEE80211_BAND_2GHZ; + int freq = 0; + if (pchan_info->bandcfg.chanBand == BAND_2GHZ) + band = IEEE80211_BAND_2GHZ; + else if (pchan_info->bandcfg.chanBand == BAND_5GHZ) + band = IEEE80211_BAND_5GHZ; + freq = ieee80211_channel_to_frequency(pchan_info->channel, band); + return ieee80211_get_channel(priv->wdev->wiphy, freq); +} + /** * @brief Get current frequency of active interface * @@ -207,53 +228,20 @@ void *woal_get_netdev_priv(struct net_device *dev) */ int woal_get_active_intf_freq(moal_private *priv) { - moal_handle *handle = priv->phandle; - int i; - - if (priv->media_connected == MTRUE #ifdef UAP_SUPPORT - || priv->bss_started == MTRUE -#endif - ) - return ieee80211_channel_to_frequency( - priv->channel -#if KERNEL_VERSION(2, 6, 39) <= CFG80211_VERSION_CODE - , - (priv->channel <= 14 ? IEEE80211_BAND_2GHZ : - IEEE80211_BAND_5GHZ) -#endif - ); - - for (i = 0; i < handle->priv_num; i++) { -#ifdef STA_SUPPORT - if (GET_BSS_ROLE(handle->priv[i]) == MLAN_BSS_ROLE_STA) { - if (handle->priv[i]->media_connected == MTRUE) - return ieee80211_channel_to_frequency( - handle->priv[i]->channel -#if KERNEL_VERSION(2, 6, 39) <= CFG80211_VERSION_CODE - , - (handle->priv[i]->channel <= 14 ? - IEEE80211_BAND_2GHZ : - IEEE80211_BAND_5GHZ) -#endif - ); - } -#endif -#ifdef UAP_SUPPORT - if (GET_BSS_ROLE(handle->priv[i]) == MLAN_BSS_ROLE_UAP) { - if (handle->priv[i]->bss_started == MTRUE) - return ieee80211_channel_to_frequency( - handle->priv[i]->channel -#if KERNEL_VERSION(2, 6, 39) <= CFG80211_VERSION_CODE - , - (handle->priv[i]->channel <= 14 ? - IEEE80211_BAND_2GHZ : - IEEE80211_BAND_5GHZ) -#endif - ); - } + if (priv->bss_role == MLAN_BSS_ROLE_UAP && priv->bss_started && + priv->uap_host_based) { +#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE + return priv->chan.chan->center_freq; #endif } +#endif +#ifdef STA_SUPPORT + if (priv->bss_role == MLAN_BSS_ROLE_STA && + priv->media_connected == MTRUE && priv->sme_current.ssid_len) { + return priv->conn_chan.center_freq; + } +#endif return 0; } @@ -798,11 +786,13 @@ int woal_cfg80211_init_p2p_client(moal_private *priv) goto done; } - bss_role = MLAN_BSS_ROLE_STA; - if (MLAN_STATUS_SUCCESS != - woal_cfg80211_bss_role_cfg(priv, MLAN_ACT_SET, &bss_role)) { - ret = -EFAULT; - goto done; + if (bss_role != MLAN_BSS_ROLE_STA) { + bss_role = MLAN_BSS_ROLE_STA; + if (MLAN_STATUS_SUCCESS != + woal_cfg80211_bss_role_cfg(priv, MLAN_ACT_SET, &bss_role)) { + ret = -EFAULT; + goto done; + } } wifi_direct_mode = WIFI_DIRECT_MODE_DISABLE; @@ -886,11 +876,13 @@ int woal_cfg80211_init_p2p_go(moal_private *priv) goto done; } - bss_role = MLAN_BSS_ROLE_UAP; - if (MLAN_STATUS_SUCCESS != - woal_cfg80211_bss_role_cfg(priv, MLAN_ACT_SET, &bss_role)) { - ret = -EFAULT; - goto done; + if (bss_role != MLAN_BSS_ROLE_UAP) { + bss_role = MLAN_BSS_ROLE_UAP; + if (MLAN_STATUS_SUCCESS != + woal_cfg80211_bss_role_cfg(priv, MLAN_ACT_SET, &bss_role)) { + ret = -EFAULT; + goto done; + } } /* NoA:-- Interval = 100TUs and Duration= 50TUs, count=255*/ #define DEF_NOA_COUNT 255 @@ -1252,8 +1244,13 @@ int woal_cfg80211_change_virtual_intf(struct wiphy *wiphy, woal_cfg80211_del_beacon(wiphy, dev); #endif bss_role = MLAN_BSS_ROLE_STA; - woal_cfg80211_bss_role_cfg(priv, MLAN_ACT_SET, - &bss_role); + if (MLAN_STATUS_SUCCESS != + woal_cfg80211_bss_role_cfg(priv, MLAN_ACT_SET, + &bss_role)) { + PRINTM(MERROR, + "%s: WLAN set bss role config failed. \n", + __func__); + } PRINTM(MIOCTL, "set bss role for STA\n"); } #endif @@ -1615,7 +1612,11 @@ int woal_cfg80211_set_default_key(struct wiphy *wiphy, ENTER(); memset(&bss_info, 0, sizeof(mlan_bss_info)); if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) { - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MERROR, "%s: WLAN get bss info failed. \n", + __func__); + } if (!bss_info.wep_status) { LEAVE(); return ret; @@ -2596,6 +2597,31 @@ void woal_cancel_chanrpt_event(moal_private *priv) #endif #endif +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) +/* + * @brief check if we need set remain_on_channel + * + * @param priv A pointer moal_private structure + * @param wait Duration to wait + * + * @return MFALSE-no need set remain_on_channel + */ +t_u8 woal_check_mgmt_tx_channel(moal_private *priv, + struct ieee80211_channel *chan, + unsigned int wait) +{ + int freq; + if (priv->bss_type == MLAN_BSS_TYPE_UAP) + return MFALSE; + if (wait) + return MTRUE; + freq = woal_get_active_intf_freq(priv); + if (chan->center_freq == freq) + return MFALSE; + return MTRUE; +} +#endif + #if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(3, 3, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(3, 6, 0) <= CFG80211_VERSION_CODE @@ -2744,6 +2770,7 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy, pmlan_buffer pmbuf = NULL; mlan_status status = MLAN_STATUS_SUCCESS; t_u16 packet_len = 0; + t_u16 pkt_len = 0; t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; t_u32 pkt_type; t_u32 tx_control; @@ -2795,7 +2822,11 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy, if (!priv->bss_started) { PRINTM(MCMND, "Drop deauth packet before AP started\n"); - woal_cancel_cac(priv); +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) + if (!moal_extflg_isset(priv->phandle, + EXT_DFS_OFFLOAD)) +#endif + woal_cancel_cac(priv); goto done; } #endif @@ -2872,7 +2903,7 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy, woal_cancel_scan(priv, MOAL_IOCTL_WAIT); #endif - if (chan && priv->bss_type != MLAN_BSS_ROLE_UAP) { + if (chan && woal_check_mgmt_tx_channel(priv, chan, wait)) { duration = (wait > MGMT_TX_DEFAULT_WAIT_TIME) ? wait : MGMT_TX_DEFAULT_WAIT_TIME; @@ -2963,9 +2994,10 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy, remain_len -= sizeof(tx_control); /* frmctl + durationid + addr1 + addr2 + addr3 + seqctl */ #define PACKET_ADDR4_POS (2 + 2 + 6 + 6 + 6 + 2) + pkt_len = woal_cpu_to_le16(packet_len); moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE, - &packet_len, sizeof(packet_len), remain_len); + &pkt_len, sizeof(pkt_len), remain_len); remain_len -= sizeof(packet_len); moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE + @@ -3469,8 +3501,8 @@ static t_u8 woal_find_ie(const t_u8 *ie, int len, const t_u8 *spec_ie, * * @return out IE length */ -static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, int len, - t_u8 *ie_out, t_u32 ie_out_len, +static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, + size_t len, t_u8 *ie_out, t_u32 ie_out_len, t_u16 wps_flag, const t_u8 *dup_ie, int dup_ie_len) { @@ -3539,8 +3571,6 @@ static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, int len, case EXTENDED_SUPPORTED_RATES: case WLAN_EID_ERP_INFO: /* Fall Through */ - case REGULATORY_CLASS: - /* Fall Through */ case OVERLAPBSSSCANPARAM: /* Fall Through */ case WAPI_IE: @@ -3682,6 +3712,9 @@ static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, int len, "IE too big, fail copy VENDOR_SPECIFIC_221 IE\n"); } break; + case REGULATORY_CLASS: + break; + // fall thru to default to add IE default: if ((out_len + length + 2) < (int)ie_out_len) { moal_memcpy_ext(priv->phandle, ie_out + out_len, @@ -4040,7 +4073,8 @@ int woal_cfg80211_mgmt_frame_ie( beacon_ies_data->ie_length) || (beacon_ies_data->mgmt_subtype_mask == MLAN_CUSTOM_IE_DELETE_MASK && - beacon_vendor_index != MLAN_CUSTOM_IE_AUTO_IDX_MASK)) { + priv->beacon_vendor_index != + MLAN_CUSTOM_IE_AUTO_IDX_MASK)) { if (MLAN_STATUS_FAILURE == woal_cfg80211_custom_ie( priv, beacon_ies_data, &beacon_vendor_index, @@ -4399,13 +4433,13 @@ struct ieee80211_supported_band *woal_setup_wiphy_bands(t_u8 ieee_band) * @return N/A */ void woal_cfg80211_setup_ht_cap(struct ieee80211_sta_ht_cap *ht_info, - t_u32 dev_cap, t_u8 *mcs_set) + t_u32 dev_cap, t_u8 *mcs_set, t_u8 mpdu_density) { ENTER(); ht_info->ht_supported = true; ht_info->ampdu_factor = 0x3; - ht_info->ampdu_density = 0; + ht_info->ampdu_density = mpdu_density; memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); ht_info->cap = 0; @@ -4480,14 +4514,14 @@ void woal_cfg80211_setup_vht_cap(moal_private *priv, } vht_cap->vht_supported = true; vht_cap->cap = cfg_11ac->param.vht_cfg.vht_cap_info; - vht_cap->vht_mcs.rx_mcs_map = - (__force __le16)cfg_11ac->param.vht_cfg.vht_rx_mcs; - vht_cap->vht_mcs.rx_highest = - (__force __le16)cfg_11ac->param.vht_cfg.vht_rx_max_rate; - vht_cap->vht_mcs.tx_mcs_map = - (__force __le16)cfg_11ac->param.vht_cfg.vht_tx_mcs; - vht_cap->vht_mcs.tx_highest = - (__force __le16)cfg_11ac->param.vht_cfg.vht_tx_max_rate; + vht_cap->vht_mcs.rx_mcs_map = (__force __le16)woal_cpu_to_le16( + cfg_11ac->param.vht_cfg.vht_rx_mcs); + vht_cap->vht_mcs.rx_highest = (__force __le16)woal_cpu_to_le16( + cfg_11ac->param.vht_cfg.vht_rx_max_rate); + vht_cap->vht_mcs.tx_mcs_map = (__force __le16)woal_cpu_to_le16( + cfg_11ac->param.vht_cfg.vht_tx_mcs); + vht_cap->vht_mcs.tx_highest = (__force __le16)woal_cpu_to_le16( + cfg_11ac->param.vht_cfg.vht_tx_max_rate); PRINTM(MCMND, "vht_cap=0x%x rx_mcs_map=0x%x rx_max=0x%x tx_mcs_map=0x%x tx_max=0x%x\n", vht_cap->cap, vht_cap->vht_mcs.rx_mcs_map, @@ -4673,6 +4707,8 @@ void woal_cfg80211_setup_he_cap(moal_private *priv, mlan_ds_11ax_he_capa *phe_cap = NULL; t_u8 hw_hecap_len; + memset(&fw_info, 0, sizeof(mlan_fw_info)); + woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info); if (band->band == NL80211_BAND_5GHZ) { phe_cap = (mlan_ds_11ax_he_capa *)fw_info.hw_he_cap; @@ -4987,15 +5023,26 @@ void woal_cfg80211_notify_channel(moal_private *priv, int freq = 0; #endif #endif + struct ieee80211_channel *chan; ENTER(); + /* save the new channel for station interface */ + if (priv->sme_current.ssid_len) { + chan = woal_get_ieee80211_channel(priv, pchan_info); + if (chan) { + moal_memcpy_ext(priv->phandle, &priv->conn_chan, chan, + sizeof(struct ieee80211_channel), + sizeof(struct ieee80211_channel)); + } + } + #if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE if (MLAN_STATUS_SUCCESS == woal_chandef_create(priv, &chandef, pchan_info)) { #if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE mutex_lock(&priv->wdev->mtx); #endif -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 2, 0) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) cfg80211_ch_switch_notify(priv->netdev, &chandef, 0, 0); #elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13) cfg80211_ch_switch_notify(priv->netdev, &chandef, 0); @@ -5137,13 +5184,15 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy, bands->ht_cap.mcs.rx_mask[1] = 0; #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) bands->vht_cap.vht_mcs.rx_mcs_map = - (__force __le16)0xfffe; + (__force __le16)woal_cpu_to_le16( + 0xfffe); bands->vht_cap.vht_mcs.tx_mcs_map = - (__force __le16)0xfffe; + (__force __le16)woal_cpu_to_le16( + 0xfffe); bands->vht_cap.vht_mcs.rx_highest = - (__force __le16)0x186; + (__force __le16)woal_cpu_to_le16(0x186); bands->vht_cap.vht_mcs.tx_highest = - (__force __le16)0x186; + (__force __le16)woal_cpu_to_le16(0x186); #endif #if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) if (bands->n_iftype_data && @@ -5173,13 +5222,15 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy, bands->ht_cap.mcs.rx_mask[1] = 0xff; #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) bands->vht_cap.vht_mcs.rx_mcs_map = - (__force __le16)0xfffa; + (__force __le16)woal_cpu_to_le16( + 0xfffa); bands->vht_cap.vht_mcs.tx_mcs_map = - (__force __le16)0xfffa; + (__force __le16)woal_cpu_to_le16( + 0xfffa); bands->vht_cap.vht_mcs.rx_highest = - (__force __le16)0x30c; + (__force __le16)woal_cpu_to_le16(0x30c); bands->vht_cap.vht_mcs.tx_highest = - (__force __le16)0x30c; + (__force __le16)woal_cpu_to_le16(0x30c); #endif #if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) if (bands->n_iftype_data && diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h index d9ca184..d658442 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h @@ -58,7 +58,6 @@ /* define for custom ie operation */ #define MLAN_CUSTOM_IE_AUTO_IDX_MASK 0xffff -#define MLAN_CUSTOM_IE_NEW_MASK 0x8000 #define IE_MASK_WPS 0x0001 #define IE_MASK_P2P 0x0002 #define IE_MASK_WFD 0x0004 @@ -532,7 +531,8 @@ int woal_cfg80211_mgmt_frame_ie( int woal_get_active_intf_freq(moal_private *priv); void woal_cfg80211_setup_ht_cap(struct ieee80211_sta_ht_cap *ht_info, - t_u32 dev_cap, t_u8 *mcs_set); + t_u32 dev_cap, t_u8 *mcs_set, + t_u8 mpdu_density); #if KERNEL_VERSION(3, 6, 0) <= CFG80211_VERSION_CODE void woal_cfg80211_setup_vht_cap(moal_private *priv, struct ieee80211_sta_vht_cap *vht_cap); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c index 0b885aa..3a01621 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c @@ -116,6 +116,10 @@ static const struct nl80211_vendor_cmd_info vendor_events[] = { .vendor_id = MRVL_VENDOR_ID, .subcmd = event_wake_reason_report, }, + { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = event_rtt_result, + }, /*event_id ???*/ /**add vendor event here*/ }; @@ -149,6 +153,17 @@ static const struct nla_policy }; // clang-format on +static const struct nla_policy woal_rtt_policy[ATTR_RTT_MAX + 1] = { + [ATTR_RTT_TARGET_NUM] = {.type = NLA_U8}, + [ATTR_RTT_TARGET_CONFIG] = {.type = NLA_BINARY}, + [ATTR_RTT_TARGET_ADDR] = {.type = NLA_STRING, .len = ETH_ALEN}, + [ATTR_RTT_CHANNEL_INFO] = {.type = NLA_BINARY}, + [ATTR_RTT_MAX_DUR_SEC] = {.type = NLA_U32}, + [ATTR_RTT_LCI_INFO] = {.type = NLA_BINARY}, + [ATTR_RTT_LCR_INFO] = {.type = NLA_BINARY}, + +}; + static const struct nla_policy woal_rssi_monitor_policy[ATTR_RSSI_MONITOR_MAX + 1] = { [ATTR_RSSI_MONITOR_CONTROL] = {.type = NLA_U32}, @@ -282,6 +297,54 @@ void woal_cfg80211_vendor_event_fw_dump(moal_private *priv) } #endif +/** + * @brief send vendor event to kernel + * + * @param priv A pointer to moal_private + * @param event vendor event + * @param len data length + * + * @return 0: success 1: fail + */ +static struct sk_buff *woal_cfg80211_alloc_vendor_event(moal_private *priv, + int event, int len) +{ + struct wiphy *wiphy = NULL; + struct sk_buff *skb = NULL; + int event_id = 0; + + ENTER(); + + if (!priv || !priv->wdev || !priv->wdev->wiphy) { + PRINTM(MERROR, "Not find this event %d\n", event_id); + goto done; + } + wiphy = priv->wdev->wiphy; + PRINTM(MEVENT, "vendor event :0x%x\n", event); + event_id = woal_get_event_id(event); + if (event_max == event_id) { + PRINTM(MERROR, "Not find this event %d\n", event_id); + goto done; + } + + /**allocate skb*/ +#if KERNEL_VERSION(4, 1, 0) <= CFG80211_VERSION_CODE + skb = cfg80211_vendor_event_alloc(wiphy, priv->wdev, len, event_id, + GFP_ATOMIC); +#else + skb = cfg80211_vendor_event_alloc(wiphy, len, event_id, GFP_ATOMIC); +#endif + + if (!skb) { + PRINTM(MERROR, "allocate memory fail for vendor event\n"); + goto done; + } + +done: + LEAVE(); + return skb; +} + /** * @brief send dfs vendor event to kernel * @@ -734,11 +797,13 @@ static int woal_cfg80211_subcmd_get_drv_dump(struct wiphy *wiphy, priv = (moal_private *)woal_get_netdev_priv(dev); handle = priv->phandle; memset(driver_dump_file, 0, sizeof(driver_dump_file)); - sprintf(driver_dump_file, "/proc/mwlan/"); + snprintf(driver_dump_file, sizeof(driver_dump_file), "/proc/mwlan/"); if (handle->handle_idx) - sprintf(driver_dump_file, "drv_dump%d", handle->handle_idx); + snprintf(driver_dump_file, sizeof(driver_dump_file), + "drv_dump%d", handle->handle_idx); else - sprintf(driver_dump_file, "drv_dump"); + snprintf(driver_dump_file, sizeof(driver_dump_file), + "drv_dump"); PRINTM(MMSG, "driver dump file is %s\n", driver_dump_file); length = sizeof(driver_dump_file); skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, length); @@ -806,6 +871,8 @@ static int woal_cfg80211_subcmd_get_supp_feature_set(struct wiphy *wiphy, } if (fw_info.fw_bands & BAND_A) supp_feature_set |= WLAN_FEATURE_INFRA_5G; + if (fw_info.rtt_support) + supp_feature_set |= WLAN_FEATURE_D2AP_RTT; if (fw_info.fw_roaming_support) supp_feature_set |= WLAN_FEATURE_CONTROL_ROAMING; @@ -1653,6 +1720,7 @@ int woal_ring_push_data(moal_private *priv, int ring_id, if ((ring->wp + w_len) > ring->ring_size || (ring->ctrl.written_bytes + w_len) > ring->ring_size) { + spin_unlock_irqrestore(&ring->lock, flags); PRINTM(MERROR, "Ring push buffer overflow: rp=%d wp=%d, write_bytes=%d\n", ring->rp, ring->wp, ring->ctrl.written_bytes); @@ -2339,7 +2407,7 @@ static int woal_cfg80211_subcmd_set_packet_filter(struct wiphy *wiphy, nla_data(iter), MIN(packet_filter_len, nla_len(iter))); pkt_filter->packet_filter_len = - MIN(packet_filter_len, nla_len(iter)); + (t_u8)MIN(packet_filter_len, nla_len(iter)); pkt_filter->state = PACKET_FILTER_STATE_START; spin_unlock_irqrestore(&pkt_filter->lock, flags); DBG_HEXDUMP(MDAT_D, "packet_filter_program", @@ -3283,7 +3351,47 @@ void woal_cfg80211_rssi_monitor_event(moal_private *priv, t_s16 rssi) done: LEAVE(); } -#endif + +/** + * @brief send driver hang vendor event to kernel + * + * @param priv A pointer to moal_private + * @param reload_mode reload mode + * + * @return N/A + */ +void woal_cfg80211_driver_hang_event(moal_private *priv, t_u8 reload_mode) +{ + struct sk_buff *skb = NULL; + + ENTER(); + + skb = dev_alloc_skb(NLA_HDRLEN + sizeof(t_u8)); + if (!skb) { + PRINTM(MERROR, + "woal_cfg80211_driver_hang_event: Failed to allocate skb"); + goto done; + } + + if (nla_put_u8(skb, ATTR_FW_RELOAD_MODE, reload_mode)) { + PRINTM(MERROR, + "woal_cfg80211_driver_hang_event: nla_put failed!\n"); + kfree(skb); + goto done; + } + + PRINTM(MMSG, + "woal_cfg80211_driver_hang_event: Send event_hang with reload mode: %d", + reload_mode); + woal_cfg80211_vendor_event(priv, event_hang, (t_u8 *)skb->data, + skb->len); + + kfree(skb); +done: + LEAVE(); +} + +#endif // STA_CFG80211 /** * @brief vendor command to key_mgmt_set_key @@ -3771,7 +3879,7 @@ static int woal_cfg80211_subcmd_set_scan_mac_oui(struct wiphy *wiphy, struct net_device *dev = NULL; moal_private *priv = NULL; struct nlattr *tb_vendor[ATTR_WIFI_MAX + 1]; - t_u8 mac_oui[3]; + t_u8 mac_oui[3] = {0}; int ret = MLAN_STATUS_SUCCESS; ENTER(); @@ -4075,6 +4183,793 @@ static int woal_cfg80211_subcmd_set_dfs_offload(struct wiphy *wiphy, return ret; } +/** + * @brief vendor command to get rtt capability + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int woal_cfg80211_subcmd_rtt_get_capa(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + moal_handle *handle = priv->phandle; + struct sk_buff *skb = NULL; + int err = 0; + + ENTER(); + PRINTM(MCMND, "CfgVendor: cfg80211_subcmd_rtt_get_capa\n"); + + DBG_HEXDUMP(MCMD_D, "input data", (t_u8 *)data, len); + + /* Alloc the SKB for vendor_event */ + skb = cfg80211_vendor_cmd_alloc_reply_skb( + wiphy, nla_total_size(sizeof(handle->rtt_capa)) + + VENDOR_REPLY_OVERHEAD); + if (unlikely(!skb)) { + PRINTM(MERROR, "skb alloc failed in %s\n", __func__); + goto done; + } + + /* Put the attribute to the skb */ + nla_put(skb, ATTR_RTT_CAPA, sizeof(handle->rtt_capa), + &(handle->rtt_capa)); + + PRINTM(MCMND, "NL80211_CMD_VENDOR=0x%x\n", NL80211_CMD_VENDOR); + PRINTM(MCMND, "NL80211_ATTR_WIPHY=0x%x\n", NL80211_ATTR_WIPHY); + PRINTM(MCMND, "NL80211_ATTR_VENDOR_ID=0x%x\n", NL80211_ATTR_VENDOR_ID); + PRINTM(MCMND, "NL80211_ATTR_VENDOR_SUBCMD=0x%x\n", + NL80211_ATTR_VENDOR_SUBCMD); + PRINTM(MCMND, "NL80211_ATTR_VENDOR_DATA=0x%x\n", + NL80211_ATTR_VENDOR_DATA); + PRINTM(MCMND, "NL80211_ATTR_VENDOR_EVENTS=0x%x\n", + NL80211_ATTR_VENDOR_EVENTS); + + DBG_HEXDUMP(MCMD_D, "output data skb->head", (t_u8 *)skb->head, 50); + DBG_HEXDUMP(MCMD_D, "output data skb->data", (t_u8 *)skb->data, 50); + err = cfg80211_vendor_cmd_reply(skb); + if (unlikely(err)) + PRINTM(MERROR, "Vendor Command reply failed err:%d\n", err); + +done: + LEAVE(); + return err; +} + +static void woal_dump_rtt_params(wifi_rtt_config_params_t *rtt_params) +{ + int i = 0; + + PRINTM(MMSG, "===== Start DUMP RTT Params =====\n"); + PRINTM(MMSG, "rtt_config_num=%d\n\n", rtt_params->rtt_config_num); + + for (i = 0; i < rtt_params->rtt_config_num; i++) { + PRINTM(MMSG, "----------[%d]----------\n", i); + PRINTM(MMSG, "rtt_config[%d].addr=" MACSTR "\n", i, + MAC2STR(rtt_params->rtt_config[i].addr)); + PRINTM(MMSG, "rtt_config[%d].type=%d\n", i, + rtt_params->rtt_config[i].type); + PRINTM(MMSG, "rtt_config[%d].peer=%d\n", i, + rtt_params->rtt_config[i].peer); + PRINTM(MMSG, "rtt_config[%d].channel=[%d %d %d %d]\n", i, + rtt_params->rtt_config[i].channel.width, + rtt_params->rtt_config[i].channel.center_freq, + rtt_params->rtt_config[i].channel.center_freq0, + rtt_params->rtt_config[i].channel.center_freq1); + PRINTM(MMSG, "rtt_config[%d].burst_period=%d\n", i, + rtt_params->rtt_config[i].burst_period); + PRINTM(MMSG, "rtt_config[%d].num_burst=%d\n", i, + rtt_params->rtt_config[i].num_burst); + PRINTM(MMSG, "rtt_config[%d].num_frames_per_burst=%d\n", i, + rtt_params->rtt_config[i].num_frames_per_burst); + PRINTM(MMSG, "rtt_config[%d].num_retries_per_rtt_frame=%d\n", i, + rtt_params->rtt_config[i].num_retries_per_rtt_frame); + PRINTM(MMSG, "rtt_config[%d].num_retries_per_ftmr=%d\n", i, + rtt_params->rtt_config[i].num_retries_per_ftmr); + PRINTM(MMSG, "rtt_config[%d].LCI_request=%d\n", i, + rtt_params->rtt_config[i].LCI_request); + PRINTM(MMSG, "rtt_config[%d].LCR_request=%d\n", i, + rtt_params->rtt_config[i].LCR_request); + PRINTM(MMSG, "rtt_config[%d].burst_duration=%d\n", i, + rtt_params->rtt_config[i].burst_duration); + PRINTM(MMSG, "rtt_config[%d].preamble=%d\n", i, + rtt_params->rtt_config[i].preamble); + PRINTM(MMSG, "rtt_config[%d].bw=%d\n", i, + rtt_params->rtt_config[i].bw); + PRINTM(MMSG, "\n"); + } +} + +/** + * @brief vendor command to request rtt range + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int woal_cfg80211_subcmd_rtt_range_request(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + moal_handle *handle = priv->phandle; + struct nlattr *tb[ATTR_RTT_MAX + 1]; + t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0}; + t_u8 rtt_config_num = 0; + wifi_rtt_config *rtt_config = NULL; + t_u8 i = 0, j = 0; + wifi_rtt_config_params_t rtt_params; + mlan_status ret = MLAN_STATUS_SUCCESS; + int err = 0; + + ENTER(); + PRINTM(MCMND, "Enter %s()\n", __func__); + + err = nla_parse(tb, ATTR_RTT_MAX, data, len, NULL +#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE + , + NULL +#endif + ); + if (err) { + err = -EFAULT; + PRINTM(MERROR, "%s: nla_parse fail\n", __func__); + goto done; + } + + if (!tb[ATTR_RTT_TARGET_NUM] || !tb[ATTR_RTT_TARGET_CONFIG]) { + PRINTM(MERROR, + "%s: null attr: tb[ATTR_RTT_TARGET_NUM]=%p tb[ATTR_RTT_TARGET_CONFIG]=%p\n", + __func__, tb[ATTR_RTT_TARGET_NUM], + tb[ATTR_RTT_TARGET_CONFIG]); + err = -EINVAL; + goto done; + } + + rtt_config_num = nla_get_u8(tb[ATTR_RTT_TARGET_NUM]); + + if ((rtt_config_num == 0) || ((handle->rtt_params.rtt_config_num + + rtt_config_num) > MAX_RTT_CONFIG_NUM)) { + PRINTM(MERROR, "%s: invalid num=%d num in handle=%d MAX=%d\n", + __func__, rtt_config_num, + handle->rtt_params.rtt_config_num, MAX_RTT_CONFIG_NUM); + err = -EINVAL; + goto done; + } + if (nla_len(tb[ATTR_RTT_TARGET_CONFIG]) != + sizeof(rtt_params.rtt_config[0]) * rtt_config_num) { + PRINTM(MERROR, "%s: invalid %d(total) != %d(num) * %lu(each)\n", + __func__, nla_len(tb[ATTR_RTT_TARGET_CONFIG]), + rtt_config_num, sizeof(rtt_params.rtt_config[0])); + err = -EINVAL; + goto done; + } + + rtt_config = (wifi_rtt_config *)nla_data(tb[ATTR_RTT_TARGET_CONFIG]); + memset(&rtt_params, 0, sizeof(rtt_params)); + /** Strip the zero mac config */ + for (i = 0; i < rtt_config_num; i++) { + if (!memcmp(rtt_config[i].addr, zero_mac, + sizeof(rtt_config[i].addr))) + continue; + else { + moal_memcpy_ext( + handle, + &rtt_params + .rtt_config[rtt_params.rtt_config_num], + &rtt_config[i], + sizeof(rtt_params.rtt_config + [rtt_params.rtt_config_num]), + sizeof(wifi_rtt_config)); + rtt_params.rtt_config_num++; + } + } + if (!rtt_params.rtt_config_num) { + PRINTM(MERROR, "%s: no valid mac addr\n", __func__); + goto done; + } + woal_dump_rtt_params(&rtt_params); + + ret = woal_config_rtt(priv, MOAL_IOCTL_WAIT, &rtt_params); + if (ret != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "%s: woal_config_rtt() failed\n", __func__); + err = -EFAULT; + goto done; + } + + for (i = 0; i < rtt_params.rtt_config_num; i++) { + for (j = 0; j < handle->rtt_params.rtt_config_num; j++) { + if (!memcmp(handle->rtt_params.rtt_config[j].addr, + rtt_params.rtt_config[i].addr, + sizeof(handle->rtt_params.rtt_config[j] + .addr))) + break; + } + moal_memcpy_ext(handle, &(handle->rtt_params.rtt_config[j]), + &(rtt_params.rtt_config[i]), + sizeof(handle->rtt_params.rtt_config[j]), + sizeof(wifi_rtt_config)); + if (j == handle->rtt_params.rtt_config_num) + handle->rtt_params.rtt_config_num++; + } + + woal_dump_rtt_params(&(handle->rtt_params)); + +done: + LEAVE(); + return err; +} + +/** + * @brief vendor command to cancel rtt range + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int woal_cfg80211_subcmd_rtt_range_cancel(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + moal_handle *handle = priv->phandle; + t_u8 rtt_config_num = handle->rtt_params.rtt_config_num; + struct nlattr *tb[ATTR_RTT_MAX + 1]; + t_u32 target_num = 0; + t_u8 addr[MAX_RTT_CONFIG_NUM][MLAN_MAC_ADDR_LENGTH]; + int i = 0, j = 0; + mlan_status ret = MLAN_STATUS_SUCCESS; + int err = 0; + + ENTER(); + PRINTM(MCMND, "Enter %s()\n", __func__); + + err = nla_parse(tb, ATTR_RTT_MAX, data, len, NULL +#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE + , + NULL +#endif + ); + if (err) { + PRINTM(MERROR, "%s: nla_parse fail\n", __func__); + goto done; + } + + if (!tb[ATTR_RTT_TARGET_NUM] || !tb[ATTR_RTT_TARGET_ADDR]) { + PRINTM(MERROR, + "%s: null attr: tb[ATTR_RTT_TARGET_NUM]=%p tb[ATTR_RTT_TARGET_ADDR]=%p\n", + __func__, tb[ATTR_RTT_TARGET_NUM], + tb[ATTR_RTT_TARGET_ADDR]); + err = -EINVAL; + goto done; + } + + target_num = nla_get_u8(tb[ATTR_RTT_TARGET_NUM]); + + if ((target_num <= 0 || target_num > MAX_RTT_CONFIG_NUM) || + (nla_len(tb[ATTR_RTT_TARGET_ADDR]) != + sizeof(t_u8) * MLAN_MAC_ADDR_LENGTH * target_num)) { + PRINTM(MERROR, "%s: Check if %din[1-%d] or %d*%lu=%d\n", + __func__, target_num, MAX_RTT_CONFIG_NUM, target_num, + sizeof(t_u8) * MLAN_MAC_ADDR_LENGTH, + nla_len(tb[ATTR_RTT_TARGET_ADDR])); + err = -EINVAL; + goto done; + } + woal_dump_rtt_params(&(handle->rtt_params)); + + moal_memcpy_ext(handle, addr, nla_data(tb[ATTR_RTT_TARGET_ADDR]), + nla_len(tb[ATTR_RTT_TARGET_ADDR]), sizeof(addr)); + + for (i = 0; i < target_num; i++) + PRINTM(MMSG, "cancel[%d].addr=" MACSTR "\n", i, + MAC2STR(addr[i])); + + for (i = 0; i < target_num; i++) { + for (j = 0; j < handle->rtt_params.rtt_config_num; j++) { + if (!memcmp(addr[i], + handle->rtt_params.rtt_config[j].addr, + sizeof(addr[0]))) { + memset(&(handle->rtt_params.rtt_config[j]), + 0x00, + sizeof(handle->rtt_params.rtt_config[0])); + if ((j + 1) < + handle->rtt_params.rtt_config_num) { + memmove(&(handle->rtt_params + .rtt_config[j]), + &(handle->rtt_params + .rtt_config[j + 1]), + sizeof(handle->rtt_params + .rtt_config[0]) * + (handle->rtt_params + .rtt_config_num - + (j + 1))); + memset(&(handle->rtt_params.rtt_config + [handle->rtt_params + .rtt_config_num - + 1]), + 0x00, + sizeof(handle->rtt_params + .rtt_config[0])); + } + handle->rtt_params.rtt_config_num--; + continue; + } + } + } + + if (handle->rtt_params.rtt_config_num >= rtt_config_num) { + PRINTM(MERROR, "%s: No matched mac addr in rtt_config\n", + __func__); + goto done; + } + + ret = woal_cancel_rtt(priv, MOAL_IOCTL_WAIT, target_num, addr); + if (ret != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "%s: woal_cancel_rtt() failed\n", __func__); + err = -EFAULT; + goto done; + } + woal_dump_rtt_params(&(handle->rtt_params)); + +done: + LEAVE(); + return err; +} + +/** + * @brief vendor event to report RTT Results + * + * @param priv A pointer to moal_private + * @param data a pointer to data + * @param len data length + * + * @return mlan_status + */ +mlan_status woal_cfg80211_event_rtt_result(moal_private *priv, t_u8 *data, + int len) +{ + // moal_handle *handle = priv->phandle; + mlan_status ret = MLAN_STATUS_SUCCESS; + t_u8 *pos = data; + t_u32 event_left_len = len; + struct sk_buff *skb = NULL; + t_u32 vdr_event_len = 0; + t_u32 complete = 0; + wifi_rtt_result_element *rtt_result_elem = NULL; + t_u32 num_results = 0; + + ENTER(); + + PRINTM(MEVENT, "Enter %s()\n", __func__); + + vdr_event_len = nla_total_size(sizeof(complete)) + + nla_total_size(sizeof(num_results)) + + nla_total_size(len) + NLA_ALIGNTO * num_results + + VENDOR_REPLY_OVERHEAD; + PRINTM(MEVENT, "vdr_event_len = %d\n", vdr_event_len); + skb = woal_cfg80211_alloc_vendor_event(priv, event_rtt_result, + vdr_event_len); + if (!skb) + goto done; + + complete = *pos; + nla_put(skb, ATTR_RTT_RESULT_COMPLETE, sizeof(complete), &complete); + pos++; + event_left_len--; + + while (event_left_len > sizeof(wifi_rtt_result_element)) { + rtt_result_elem = (wifi_rtt_result_element *)pos; + + nla_put(skb, ATTR_RTT_RESULT_FULL, rtt_result_elem->len, + rtt_result_elem->data); + num_results++; + + pos += sizeof(*rtt_result_elem) + rtt_result_elem->len; + event_left_len -= + sizeof(*rtt_result_elem) + rtt_result_elem->len; + } + + nla_put(skb, ATTR_RTT_RESULT_NUM, sizeof(num_results), &num_results); + + DBG_HEXDUMP(MEVT_D, "output data skb->data", (t_u8 *)skb->data, + skb->len); + /**send event*/ + cfg80211_vendor_event(skb, GFP_KERNEL); + +done: + LEAVE(); + return ret; +} + +/** + * @brief vendor command to get rtt responder info + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int +woal_cfg80211_subcmd_rtt_get_responder_info(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + mlan_rtt_responder rtt_rsp_cfg; + struct sk_buff *skb = NULL; + wifi_rtt_responder rtt_rsp; + mlan_status ret = MLAN_STATUS_SUCCESS; + int err = 0; + + ENTER(); + PRINTM(MCMND, "Enter %s()\n", __func__); + + memset(&rtt_rsp_cfg, 0x00, sizeof(rtt_rsp_cfg)); + rtt_rsp_cfg.action = RTT_GET_RESPONDER_INFO; + ret = woal_rtt_responder_cfg(priv, MOAL_IOCTL_WAIT, &rtt_rsp_cfg); + if (ret != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "%s: woal_rtt_responder_cfg() failed\n", + __func__); + err = -EFAULT; + goto done; + } + PRINTM(MCMD_D, + "mlan_rtt_responder from FW: channel=%d bandcfg=%d %d %d %d preamble=%d\n", + rtt_rsp_cfg.u.info.channel, rtt_rsp_cfg.u.info.bandcfg.chanBand, + rtt_rsp_cfg.u.info.bandcfg.chanWidth, + rtt_rsp_cfg.u.info.bandcfg.chan2Offset, + rtt_rsp_cfg.u.info.bandcfg.scanMode, + rtt_rsp_cfg.u.info.preamble); + + memset(&rtt_rsp, 0x00, sizeof(rtt_rsp)); + woal_bandcfg_to_channel_info(priv, &(rtt_rsp_cfg.u.info.bandcfg), + rtt_rsp_cfg.u.info.channel, + &(rtt_rsp.channel)); + rtt_rsp.preamble = rtt_rsp_cfg.u.info.preamble; + PRINTM(MCMD_D, "wifi_rtt_responder report to HAL:\n"); + PRINTM(MCMD_D, + "channel: width=%d center_freq=%d center_freq0=%d center_freq1=%d\n", + rtt_rsp.channel.width, rtt_rsp.channel.center_freq, + rtt_rsp.channel.center_freq0, rtt_rsp.channel.center_freq1); + PRINTM(MCMD_D, "preamble=%d\n", rtt_rsp.preamble); + + /* Alloc the SKB for vendor_event */ + skb = cfg80211_vendor_cmd_alloc_reply_skb( + wiphy, nla_total_size(sizeof(rtt_rsp)) + VENDOR_REPLY_OVERHEAD); + if (unlikely(!skb)) { + PRINTM(MERROR, "skb alloc failed in %s\n", __func__); + goto done; + } + + /* Put the attribute to the skb */ + nla_put(skb, ATTR_RTT_CHANNEL_INFO, sizeof(rtt_rsp.channel), + &(rtt_rsp.channel)); + nla_put(skb, ATTR_RTT_PREAMBLE, sizeof(rtt_rsp.preamble), + &(rtt_rsp.preamble)); + DBG_HEXDUMP(MCMD_D, "output data skb->data", (t_u8 *)skb->data, + skb->len); + + err = cfg80211_vendor_cmd_reply(skb); + if (unlikely(err)) + PRINTM(MERROR, "Vendor Command reply failed err:%d\n", err); + +done: + LEAVE(); + return err; +} + +/** + * @brief vendor command to enable rtt responder + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int woal_cfg80211_subcmd_rtt_enable_responder(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + struct nlattr *tb[ATTR_RTT_MAX + 1]; + wifi_channel_info *ch_info = NULL; + t_u32 max_dur_sec = 0; + mlan_rtt_responder rtt_rsp_cfg; + wifi_rtt_responder rtt_rsp; + struct sk_buff *skb = NULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + int err = 0; + + ENTER(); + PRINTM(MCMND, "Enter %s()\n", __func__); + + err = nla_parse(tb, ATTR_RTT_MAX, data, len, NULL +#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE + , + NULL +#endif + ); + if (err) { + err = -EFAULT; + PRINTM(MERROR, "%s: nla_parse fail\n", __func__); + goto done; + } + + if (!tb[ATTR_RTT_CHANNEL_INFO] || !tb[ATTR_RTT_MAX_DUR_SEC]) { + PRINTM(MERROR, + "%s: null attr: tb[ATTR_RTT_TARGET_NUM]=%p tb[ATTR_RTT_TARGET_CONFIG]=%p\n", + __func__, tb[ATTR_RTT_CHANNEL_INFO], + tb[ATTR_RTT_MAX_DUR_SEC]); + err = -EINVAL; + goto done; + } + ch_info = (wifi_channel_info *)nla_data(tb[ATTR_RTT_CHANNEL_INFO]); + max_dur_sec = nla_get_u32(tb[ATTR_RTT_MAX_DUR_SEC]); + PRINTM(MCMD_D, "HAL input:\n"); + PRINTM(MCMD_D, + "wifi_channel_info: width=%d center_freq=%d center_freq0=%d center_freq1=%d\n", + ch_info->width, ch_info->center_freq, ch_info->center_freq0, + ch_info->center_freq1); + PRINTM(MCMD_D, "max_dur_sec=%d\n", max_dur_sec); + + memset(&rtt_rsp_cfg, 0x00, sizeof(rtt_rsp_cfg)); + rtt_rsp_cfg.action = RTT_SET_RESPONDER_ENABLE; + rtt_rsp_cfg.u.encfg.channel = + ieee80211_frequency_to_channel(ch_info->center_freq); + woal_channel_info_to_bandcfg(priv, ch_info, + &(rtt_rsp_cfg.u.encfg.bandcfg)); + rtt_rsp_cfg.u.encfg.max_dur_sec = max_dur_sec; + PRINTM(MCMD_D, "HAL input to rtt_responder_encfg:\n"); + PRINTM(MCMD_D, + "channel=%d bandcfg=[chanBand=%d chanWidth=%d chan2Offset=%d scanMode=%d]\n", + rtt_rsp_cfg.u.encfg.channel, + rtt_rsp_cfg.u.encfg.bandcfg.chanBand, + rtt_rsp_cfg.u.encfg.bandcfg.chanWidth, + rtt_rsp_cfg.u.encfg.bandcfg.chan2Offset, + rtt_rsp_cfg.u.encfg.bandcfg.scanMode); + PRINTM(MCMD_D, "max_dur_sec=%d\n", rtt_rsp_cfg.u.encfg.max_dur_sec); + ret = woal_rtt_responder_cfg(priv, MOAL_IOCTL_WAIT, &rtt_rsp_cfg); + if (ret != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "%s: woal_rtt_responder_cfg() failed\n", + __func__); + err = -EFAULT; + goto done; + } + + memset(&rtt_rsp, 0x00, sizeof(rtt_rsp)); + woal_bandcfg_to_channel_info(priv, &(rtt_rsp_cfg.u.info.bandcfg), + rtt_rsp_cfg.u.info.channel, + &(rtt_rsp.channel)); + rtt_rsp.preamble = rtt_rsp_cfg.u.info.preamble; + PRINTM(MCMD_D, "wifi_rtt_responder report to HAL:\n"); + PRINTM(MCMD_D, + "channel: width=%d center_freq=%d center_freq0=%d center_freq1=%d\n", + rtt_rsp.channel.width, rtt_rsp.channel.center_freq, + rtt_rsp.channel.center_freq0, rtt_rsp.channel.center_freq1); + PRINTM(MCMD_D, "preamble=%d\n", rtt_rsp.preamble); + + /* Alloc the SKB for vendor_event */ + skb = cfg80211_vendor_cmd_alloc_reply_skb( + wiphy, nla_total_size(sizeof(rtt_rsp)) + VENDOR_REPLY_OVERHEAD); + if (unlikely(!skb)) { + PRINTM(MERROR, "skb alloc failed in %s\n", __func__); + goto done; + } + + /* Put the attribute to the skb */ + nla_put(skb, ATTR_RTT_CHANNEL_INFO, sizeof(rtt_rsp.channel), + &(rtt_rsp.channel)); + nla_put(skb, ATTR_RTT_PREAMBLE, sizeof(rtt_rsp.preamble), + &(rtt_rsp.preamble)); + DBG_HEXDUMP(MCMD_D, "output data skb->data", (t_u8 *)skb->data, + skb->len); + + err = cfg80211_vendor_cmd_reply(skb); + if (unlikely(err)) + PRINTM(MERROR, "Vendor Command reply failed err:%d\n", err); + +done: + LEAVE(); + return err; +} + +/** + * @brief vendor command to disable rtt responder + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int woal_cfg80211_subcmd_rtt_disable_responder(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + mlan_rtt_responder rtt_rsp_cfg; + mlan_status ret = MLAN_STATUS_SUCCESS; + int err = 0; + + ENTER(); + PRINTM(MCMND, "Enter %s()\n", __func__); + + memset(&rtt_rsp_cfg, 0x00, sizeof(rtt_rsp_cfg)); + rtt_rsp_cfg.action = RTT_SET_RESPONDER_DISABLE; + ret = woal_rtt_responder_cfg(priv, MOAL_IOCTL_WAIT, &rtt_rsp_cfg); + if (ret != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "%s: woal_rtt_responder_cfg() failed\n", + __func__); + err = -EFAULT; + goto done; + } + +done: + LEAVE(); + return err; +} + +/** + * @brief vendor command to set rtt lci + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int woal_cfg80211_subcmd_rtt_set_lci(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + struct nlattr *tb[ATTR_RTT_MAX + 1]; + mlan_rtt_responder rtt_rsp_cfg; + wifi_lci_information *lci_info; + mlan_status ret = MLAN_STATUS_SUCCESS; + int err = 0; + + ENTER(); + PRINTM(MCMND, "Enter %s()\n", __func__); + + err = nla_parse(tb, ATTR_RTT_MAX, data, len, NULL +#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE + , + NULL +#endif + ); + if (err) { + err = -EFAULT; + PRINTM(MERROR, "%s: nla_parse fail\n", __func__); + goto done; + } + + if (!tb[ATTR_RTT_LCI_INFO]) { + PRINTM(MERROR, "%s: null attr: tb[ATTR_RTT_LCI_INFO]=%p\n", + __func__, tb[ATTR_RTT_LCI_INFO]); + err = -EINVAL; + goto done; + } + lci_info = (wifi_lci_information *)nla_data(tb[ATTR_RTT_LCI_INFO]); + PRINTM(MCMD_D, "HAL input:\n"); + PRINTM(MCMD_D, + "wifi_lci_information: latitude=%lu longitude=%lu altitude=%d latitude_unc=%d longitude_unc=%d altitude_unc=%d\n", + lci_info->latitude, lci_info->longitude, lci_info->altitude, + lci_info->latitude_unc, lci_info->longitude_unc, + lci_info->altitude_unc); + PRINTM(MCMD_D, + "wifi_lci_information: motion_pattern=%d floor=%d height_above_floor=%d height_unc=%d\n", + lci_info->motion_pattern, lci_info->floor, + lci_info->height_above_floor, lci_info->height_unc); + + memset(&rtt_rsp_cfg, 0x00, sizeof(rtt_rsp_cfg)); + rtt_rsp_cfg.action = RTT_SET_RESPONDER_LCI; + moal_memcpy_ext(priv->phandle, &(rtt_rsp_cfg.u.lci), lci_info, + sizeof(rtt_rsp_cfg.u.lci), sizeof(rtt_rsp_cfg.u.lci)); + ret = woal_rtt_responder_cfg(priv, MOAL_IOCTL_WAIT, &rtt_rsp_cfg); + if (ret != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "%s: woal_rtt_responder_cfg() failed\n", + __func__); + err = -EFAULT; + goto done; + } + +done: + LEAVE(); + return err; +} + +/** + * @brief vendor command to set rtt lcr + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param len data length + * + * @return 0: success -1: fail + */ +static int woal_cfg80211_subcmd_rtt_set_lcr(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int len) +{ + struct net_device *dev = wdev->netdev; + moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + struct nlattr *tb[ATTR_RTT_MAX + 1]; + mlan_rtt_responder rtt_rsp_cfg; + wifi_lcr_information *lcr_info; + mlan_status ret = MLAN_STATUS_SUCCESS; + int err = 0; + + ENTER(); + PRINTM(MCMND, "Enter %s()\n", __func__); + + err = nla_parse(tb, ATTR_RTT_MAX, data, len, NULL +#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE + , + NULL +#endif + ); + if (err) { + err = -EFAULT; + PRINTM(MERROR, "%s: nla_parse fail\n", __func__); + goto done; + } + + if (!tb[ATTR_RTT_LCR_INFO]) { + PRINTM(MERROR, "%s: null attr: tb[ATTR_RTT_LCR_INFO]=%p\n", + __func__, tb[ATTR_RTT_LCR_INFO]); + err = -EINVAL; + goto done; + } + lcr_info = (wifi_lcr_information *)nla_data(tb[ATTR_RTT_LCR_INFO]); + PRINTM(MCMD_D, "HAL input:\n"); + PRINTM(MCMD_D, "wifi_lcr_information: country_code='%c' '%c'\n", + lcr_info->country_code[0], lcr_info->country_code[1]); + PRINTM(MCMD_D, "wifi_lci_information: length=%d civic_info=%s\n", + lcr_info->length, lcr_info->civic_info); + + memset(&rtt_rsp_cfg, 0x00, sizeof(rtt_rsp_cfg)); + rtt_rsp_cfg.action = RTT_SET_RESPONDER_LCR; + moal_memcpy_ext(priv->phandle, &(rtt_rsp_cfg.u.lcr), lcr_info, + sizeof(rtt_rsp_cfg.u.lcr), sizeof(rtt_rsp_cfg.u.lcr)); + ret = woal_rtt_responder_cfg(priv, MOAL_IOCTL_WAIT, &rtt_rsp_cfg); + if (ret != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "%s: woal_rtt_responder_cfg() failed\n", + __func__); + err = -EFAULT; + goto done; + } + +done: + LEAVE(); + return err; +} + #define CSI_DUMP_FILE_MAX 1200000 /** @@ -4392,11 +5287,11 @@ mlan_status woal_cfg80211_event_csi_dump(moal_private *priv, t_u8 *data, ENTER(); DBG_HEXDUMP(MCMD_D, "CSI dump data", data, len); - sprintf(path_name, "/data"); + snprintf(path_name, sizeof(path_name), "/data"); if (priv->csi_dump_format == 1) - sprintf(file_name, "csi_dump.bin"); + snprintf(file_name, sizeof(file_name), "csi_dump.bin"); else - sprintf(file_name, "csi_dump.txt"); + snprintf(file_name, sizeof(file_name), "csi_dump.txt"); priv->csi_dump_len += len; if (priv->csi_dump_len > CSI_DUMP_FILE_MAX) { PRINTM(MERROR, @@ -4599,6 +5494,112 @@ static const struct wiphy_vendor_command vendor_commands[] = { }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_GET_CAPA, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_get_capa, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, + +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_RANGE_REQUEST, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_range_request, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_RANGE_CANCEL, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_range_cancel, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_GET_RESPONDER_INFO, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_get_responder_info, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_ENABLE_RESPONDER, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_enable_responder, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_DISABLE_RESPONDER, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_disable_responder, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_SET_LCI, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_set_lci, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = SUBCMD_RTT_SET_LCR, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_rtt_set_lcr, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_rtt_policy, + .maxattr = ATTR_RTT_MAX, +#endif + }, + { .info = { .vendor_id = MRVL_VENDOR_ID, diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h index 8908bc8..bf29b69 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h @@ -620,6 +620,15 @@ enum mrvl_wlan_vendor_attr_wifi_logger { MRVL_WLAN_VENDOR_ATTR_NAME = 10, }; +enum ATTR_FW_RELOAD { + ATTR_FW_RELOAD_INVALID = 0, + ATTR_FW_RELOAD_MODE = 1, + ATTR_FW_RELOAD_AFTER_LAST, + ATTR_FW_RELOAD_MAX = ATTR_FW_RELOAD_AFTER_LAST - 1, +}; + +void woal_cfg80211_driver_hang_event(moal_private *priv, t_u8 reload_mode); + /**vendor event*/ enum vendor_event { event_hang = 0, @@ -628,6 +637,7 @@ enum vendor_event { event_fw_reset_failure = 3, event_fw_reset_start = 4, event_rssi_monitor = 0x1501, + event_rtt_result = 0x07, event_set_key_mgmt_offload = 0x10001, event_fw_roam_success = 0x10002, event_cloud_keep_alive = 0x10003, @@ -700,6 +710,14 @@ enum vendor_sub_command { sub_cmd_set_packet_filter = 0x0011, sub_cmd_get_packet_filter_capability, sub_cmd_nd_offload = 0x0100, + SUBCMD_RTT_GET_CAPA = 0x1100, + SUBCMD_RTT_RANGE_REQUEST, + SUBCMD_RTT_RANGE_CANCEL, + SUBCMD_RTT_GET_RESPONDER_INFO, + SUBCMD_RTT_ENABLE_RESPONDER, + SUBCMD_RTT_DISABLE_RESPONDER, + SUBCMD_RTT_SET_LCI, + SUBCMD_RTT_SET_LCR, sub_cmd_link_statistic_set = 0x1200, sub_cmd_link_statistic_get = 0x1201, sub_cmd_link_statistic_clr = 0x1202, @@ -828,6 +846,29 @@ enum mrvl_wlan_vendor_attr_fw_roaming { MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST - 1 }; +enum attr_rtt { + ATTR_RTT_INVALID = 0, + ATTR_RTT_CAPA, + ATTR_RTT_TARGET_NUM, + ATTR_RTT_TARGET_CONFIG, + ATTR_RTT_TARGET_ADDR, + ATTR_RTT_RESULT_COMPLETE, + ATTR_RTT_RESULT_NUM, + ATTR_RTT_RESULT_FULL, + ATTR_RTT_CHANNEL_INFO, + ATTR_RTT_MAX_DUR_SEC, + ATTR_RTT_PREAMBLE, + ATTR_RTT_LCI_INFO, + ATTR_RTT_LCR_INFO, + + /* keep last */ + ATTR_RTT_AFTER_LAST, + ATTR_RTT_MAX = ATTR_RTT_AFTER_LAST - 1 +}; + +mlan_status woal_cfg80211_event_rtt_result(moal_private *priv, t_u8 *data, + int len); + enum attr_csi { ATTR_CSI_INVALID = 0, ATTR_CSI_CONFIG, diff --git a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c index 31a8106..dbad2ed 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c @@ -4,7 +4,7 @@ * @brief This file contains private ioctl functions * - * Copyright 2014-2022 NXP + * Copyright 2014-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -60,6 +60,8 @@ Change log: #include #endif +#define CMD_BUF_LEN 4096 + /******************************************************** Local Variables ********************************************************/ @@ -160,7 +162,9 @@ mlan_status parse_arguments(t_u8 *pos, int *data, int datalen, data[j] = woal_atox(cdata); is_hex = 0; } else { - woal_atoi(&data[j], cdata); + if (woal_atoi(&data[j], cdata) != + MLAN_STATUS_SUCCESS) + ; } j++; k = 0; @@ -1208,7 +1212,8 @@ static int woal_priv_delba(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen) goto done; } - ret = sprintf(respbuf, "OK. BA deleted successfully.\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK. BA deleted successfully.\n") + + 1; done: if (status != MLAN_STATUS_PENDING) @@ -1282,11 +1287,11 @@ static int woal_priv_rejectaddbareq(moal_private *priv, t_u8 *respbuf, goto done; } if (req->action == MLAN_ACT_GET) { - sprintf(respbuf, "0x%x", - cfg_11n->param.reject_addba_req.conditions); + snprintf(respbuf, CMD_BUF_LEN, "0x%x", + cfg_11n->param.reject_addba_req.conditions); ret = strlen(respbuf) + 1; } else { - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; } done: @@ -2637,34 +2642,36 @@ static int woal_setget_priv_passphrase(moal_private *priv, t_u8 *respbuf, memset(respbuf, 0, respbuflen); if (sec->param.passphrase.ssid.ssid_len) { - len += sprintf(respbuf + len, "ssid:"); + len += snprintf(respbuf + len, CMD_BUF_LEN, "ssid:"); moal_memcpy_ext(priv->phandle, respbuf + len, sec->param.passphrase.ssid.ssid, sec->param.passphrase.ssid.ssid_len, respbuflen - len); len += sec->param.passphrase.ssid.ssid_len; - len += sprintf(respbuf + len, " "); + len += snprintf(respbuf + len, CMD_BUF_LEN, " "); } if (memcmp(&sec->param.passphrase.bssid, zero_mac, sizeof(zero_mac))) { mac = (t_u8 *)&sec->param.passphrase.bssid; - len += sprintf(respbuf + len, "bssid:"); + len += snprintf(respbuf + len, CMD_BUF_LEN, "bssid:"); for (i = 0; i < ETH_ALEN - 1; ++i) - len += sprintf(respbuf + len, "%02x:", mac[i]); - len += sprintf(respbuf + len, "%02x ", mac[i]); + len += snprintf(respbuf + len, CMD_BUF_LEN, + "%02x:", mac[i]); + len += snprintf(respbuf + len, CMD_BUF_LEN, "%02x ", mac[i]); } if (sec->param.passphrase.psk_type == MLAN_PSK_PMK) { - len += sprintf(respbuf + len, "psk:"); + len += snprintf(respbuf + len, CMD_BUF_LEN, "psk:"); for (i = 0; i < MLAN_MAX_KEY_LENGTH; ++i) - len += sprintf(respbuf + len, "%02x", - sec->param.passphrase.psk.pmk.pmk[i]); - len += sprintf(respbuf + len, "\n"); + len += snprintf(respbuf + len, CMD_BUF_LEN, "%02x", + sec->param.passphrase.psk.pmk.pmk[i]); + len += snprintf(respbuf + len, CMD_BUF_LEN, "\n"); } if (sec->param.passphrase.psk_type == MLAN_PSK_PASSPHRASE) - len += sprintf(respbuf + len, "passphrase:%s\n", - sec->param.passphrase.psk.passphrase.passphrase); + len += snprintf( + respbuf + len, CMD_BUF_LEN, "passphrase:%s\n", + sec->param.passphrase.psk.passphrase.passphrase); if (sec->param.passphrase.psk_type == MLAN_PSK_SAE_PASSWORD) - len += sprintf( - respbuf + len, "sae_password:%s\n", + len += snprintf( + respbuf + len, CMD_BUF_LEN, "sae_password:%s\n", sec->param.passphrase.psk.sae_password.sae_password); ret = len; @@ -2793,7 +2800,8 @@ static int woal_priv_get_sta_list(moal_private *priv, t_u8 *respbuf, /* Allocate an IOCTL request buffer */ ioctl_req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_get_info)); + sizeof(mlan_ds_get_info) + + (MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS)); if (ioctl_req == NULL) { ret = -ENOMEM; goto done; @@ -3138,7 +3146,7 @@ static int moal_ret_get_scan_table_ioctl(t_u8 *respbuf, t_u32 respbuflen, } prsp_info->scan_number = num_scans_done; - ret_len = pcurrent - respbuf; + ret_len = (int)(pcurrent - respbuf); LEAVE(); return ret_len; @@ -3323,7 +3331,7 @@ static int woal_priv_setgetdeepsleep(moal_private *priv, t_u8 *respbuf, ret = -EFAULT; goto done; } - sprintf(respbuf, "%d %d", data[0], data[1]); + snprintf(respbuf, CMD_BUF_LEN, "%d %d", data[0], data[1]); ret = strlen(respbuf) + 1; } else { if (data[0] == DEEP_SLEEP_OFF) { @@ -3349,7 +3357,7 @@ static int woal_priv_setgetdeepsleep(moal_private *priv, t_u8 *respbuf, ret = -EINVAL; goto done; } - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; } done: @@ -3379,7 +3387,7 @@ static int woal_priv_setgetipaddr(moal_private *priv, t_u8 *respbuf, if (priv->bss_type != MLAN_BSS_TYPE_STA) { PRINTM(MIOCTL, "Bss type[%d]: Not STA, ignore it\n", priv->bss_type); - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; goto done; } @@ -3442,7 +3450,7 @@ static int woal_priv_setgetipaddr(moal_private *priv, t_u8 *respbuf, misc->param.ipaddr_cfg.ip_addr[0][3]); ret = IPADDR_MAX_BUF + 1; } else { - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; } done: @@ -3513,7 +3521,7 @@ static int woal_priv_setwpssession(moal_private *priv, t_u8 *respbuf, goto done; } - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; done: if (status != MLAN_STATUS_PENDING) kfree(req); @@ -3968,8 +3976,8 @@ static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf, if (MTRUE == woal_is_connected(priv, &ssid_bssid)) { PRINTM(MIOCTL, "Already connect to the network\n"); - ret = sprintf(respbuf, - "Has already connected to this ESSID!\n") + + ret = snprintf(respbuf, CMD_BUF_LEN, + "Has already connected to this ESSID!\n") + 1; goto setessid_ret; } @@ -3988,7 +3996,7 @@ static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf, priv->reassoc_required = MTRUE; priv->phandle->is_reassoc_timer_set = MTRUE; woal_mod_timer(&priv->phandle->reassoc_timer, 0); - ret = sprintf(respbuf, "%s\n", buf) + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "%s\n", buf) + 1; setessid_ret: if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE) @@ -4077,8 +4085,8 @@ static int woal_priv_setgetautoassoc(moal_private *priv, t_u8 *respbuf, .fw_reconn_counter; if (data[2] == 0) { data[1] = 0; - sprintf(respbuf, "%d %d", data[0], - data[1]); + snprintf(respbuf, CMD_BUF_LEN, "%d %d", + data[0], data[1]); ret = strlen(respbuf) + 1; } else { data[1] = 1; @@ -4086,9 +4094,10 @@ static int woal_priv_setgetautoassoc(moal_private *priv, t_u8 *respbuf, .fw_reconn_interval; data[4] = misc->param.fw_auto_reconnect .fw_reconn_flags; - sprintf(respbuf, "%d %d 0x%x 0x%x 0x%x", - data[0], data[1], data[2], - data[3], data[4]); + snprintf(respbuf, CMD_BUF_LEN, + "%d %d 0x%x 0x%x 0x%x", + data[0], data[1], data[2], + data[3], data[4]); ret = strlen(respbuf) + 1; } kfree(req); @@ -4115,12 +4124,14 @@ static int woal_priv_setgetautoassoc(moal_private *priv, t_u8 *respbuf, priv->auto_assoc_priv.drv_assoc .retry_interval; } - sprintf(respbuf, "%d %d 0x%x 0x%x", data[0], - data[1], data[2], data[3]); + snprintf(respbuf, CMD_BUF_LEN, + "%d %d 0x%x 0x%x", data[0], data[1], + data[2], data[3]); ret = strlen(respbuf) + 1; } else { data[1] = 0; - sprintf(respbuf, "%d %d", data[0], data[1]); + snprintf(respbuf, CMD_BUF_LEN, "%d %d", data[0], + data[1]); ret = strlen(respbuf) + 1; } } @@ -4313,7 +4324,7 @@ static int woal_priv_setgetautoassoc(moal_private *priv, t_u8 *respbuf, data[3]; } } - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; } done: @@ -4363,7 +4374,7 @@ static int woal_priv_getwakeupreason(moal_private *priv, t_u8 *respbuf, goto done; } else { data = pm_cfg->param.wakeup_reason.hs_wakeup_reason; - sprintf(respbuf, " %d", data); + snprintf(respbuf, CMD_BUF_LEN, " %d", data); ret = strlen(respbuf) + 1; kfree(req); } @@ -4444,10 +4455,11 @@ static int woal_priv_set_get_listeninterval(moal_private *priv, t_u8 *respbuf, goto done; } if (req->action == MLAN_ACT_GET) { - sprintf(respbuf, "%d", pcfg_bss->param.listen_interval); + snprintf(respbuf, CMD_BUF_LEN, "%d", + pcfg_bss->param.listen_interval); ret = strlen(respbuf) + 1; } else { - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; } done: @@ -4712,7 +4724,11 @@ static int woal_priv_hscfg(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen, if (user_data_len && (data[0] != (int)HOST_SLEEP_CFG_CANCEL || invoke_hostcmd == MFALSE)) { memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + ret = woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (ret != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } if (bss_info.is_hs_configured) { PRINTM(MERROR, "HS already configured\n"); ret = -EFAULT; @@ -4722,8 +4738,11 @@ static int woal_priv_hscfg(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen, /* Do a GET first if some arguments are not provided */ if (user_data_len >= 1 && user_data_len < 11) { - woal_set_get_hs_params(priv, MLAN_ACT_GET, MOAL_IOCTL_WAIT, - &hscfg_temp); + if (MLAN_STATUS_SUCCESS != + woal_set_get_hs_params(priv, MLAN_ACT_GET, MOAL_IOCTL_WAIT, + &hscfg_temp)) { + PRINTM(MERROR, "Unable to get HS params\n"); + } } hscfg.conditions = hscfg_temp.conditions; hscfg.gpio = hscfg_temp.gpio; @@ -4883,7 +4902,7 @@ int woal_process_proc_hssetpara(moal_handle *handle, t_u8 *buf) return -EINVAL; } if (user_data_len >= 1 && user_data_len <= 15) { - sprintf(respbuf, "%s%s%s", CMD_NXP, PRIV_CMD_HSCFG, buf); + snprintf(respbuf, 500, "%s%s%s", CMD_NXP, PRIV_CMD_HSCFG, buf); ret = woal_priv_hscfg(priv, respbuf, sizeof(respbuf), MFALSE); } LEAVE(); @@ -4927,9 +4946,10 @@ static int woal_priv_hssetpara(moal_private *priv, t_u8 *respbuf, } if (user_data_len >= 1 && user_data_len <= 15) { - sprintf(respbuf, "%s%s%s", CMD_NXP, PRIV_CMD_HSCFG, - respbuf + - (strlen(CMD_NXP) + strlen(PRIV_CMD_HSSETPARA))); + snprintf(respbuf, CMD_BUF_LEN, "%s%s%s", CMD_NXP, + PRIV_CMD_HSCFG, + respbuf + (strlen(CMD_NXP) + + strlen(PRIV_CMD_HSSETPARA))); respbuflen = strlen(respbuf); ret = woal_priv_hscfg(priv, respbuf, respbuflen, MFALSE); goto done; @@ -5040,7 +5060,10 @@ static int woal_priv_set_get_scancfg(moal_private *priv, t_u8 *respbuf, sizeof(data), sizeof(scan->param.scan_cfg)); } else req->action = MLAN_ACT_GET; - + if (scan->param.scan_cfg.scan_time.specific_scan_time && + req->action == MLAN_ACT_SET) { + priv->phandle->user_scan_cfg = MTRUE; + } status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); if (status != MLAN_STATUS_SUCCESS) { ret = -EFAULT; @@ -6148,7 +6171,9 @@ static int woal_priv_txpowercfg(moal_private *priv, t_u8 *respbuf, memset(data, 0, sizeof(data)); memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + ret = woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (ret != MLAN_STATUS_SUCCESS) + return -EFAULT; if (strlen(respbuf) == (strlen(CMD_NXP) + strlen(PRIV_CMD_TXPOWERCFG))) { @@ -6716,7 +6741,8 @@ static int woal_priv_regrdwr(moal_private *priv, t_u8 *respbuf, ret = -ENOMEM; goto done; } - strcpy(arguments, respbuf + header_len); + strncpy(arguments, respbuf + header_len, + strlen(respbuf) * sizeof(char)); space_ind = strstr((char *)arguments, " "); if (space_ind) space_ind = strstr(space_ind + 1, " "); @@ -6724,7 +6750,8 @@ static int woal_priv_regrdwr(moal_private *priv, t_u8 *respbuf, if (*(char *)(space_ind + 1) == '-') { is_negative_val = MTRUE; arguments[space_ind + 1 - arguments] = '\0'; - strcat(arguments, space_ind + 2); + strncat(arguments, space_ind + 2, + (strlen(respbuf) * sizeof(char)) - 1); } } parse_arguments(arguments, data, ARRAY_SIZE(data), &user_data_len); @@ -7431,7 +7458,11 @@ static int woal_priv_get_txpwrlimit(moal_private *priv, t_u8 *respbuf, trpc_cfg = (mlan_ds_misc_chan_trpc_cfg *)(respbuf + header_len); if ((trpc_cfg->sub_band != 0) && (trpc_cfg->sub_band != 0x10) && (trpc_cfg->sub_band != 0x11) && (trpc_cfg->sub_band != 0x12) && - (trpc_cfg->sub_band != 0x13)) { + (trpc_cfg->sub_band != 0x13) && (trpc_cfg->sub_band != 0x20) && + (trpc_cfg->sub_band != 0x21) && (trpc_cfg->sub_band != 0x22) && + (trpc_cfg->sub_band != 0x23) && (trpc_cfg->sub_band != 0x24) && + (trpc_cfg->sub_band != 0x25) && (trpc_cfg->sub_band != 0x26) && + (trpc_cfg->sub_band != 0x27)) { PRINTM(MERROR, "Invalid subband=0x%x\n", trpc_cfg->sub_band); ret = -EINVAL; goto done; @@ -7483,6 +7514,7 @@ static int woal_priv_getcfgchanlist(moal_private *priv, t_u8 *respbuf, wlan_ieee80211_chan_list *plist = NULL; struct ieee80211_supported_band *sband; struct wiphy *wiphy = NULL; + t_u8 band; int i; ENTER(); @@ -7494,36 +7526,25 @@ static int woal_priv_getcfgchanlist(moal_private *priv, t_u8 *respbuf, goto done; } plist = (wlan_ieee80211_chan_list *)respbuf; - sband = wiphy->bands[NL80211_BAND_2GHZ]; - if (sband) { - num_chan += sband->n_channels; - for (i = 0; i < sband->n_channels; i++) { - plist->chan_list[i].center_freq = - sband->channels[i].center_freq; - plist->chan_list[i].hw_value = - sband->channels[i].hw_value; - plist->chan_list[i].flags = sband->channels[i].flags; - plist->chan_list[i].max_power = - sband->channels[i].max_power; - } - } - sband = wiphy->bands[NL80211_BAND_5GHZ]; - if (sband) { - for (i = 0; i < sband->n_channels; i++) { - plist->chan_list[i + num_chan].center_freq = - sband->channels[i].center_freq; - plist->chan_list[i + num_chan].hw_value = - sband->channels[i].hw_value; - plist->chan_list[i + num_chan].flags = - sband->channels[i].flags; - plist->chan_list[i + num_chan].max_power = - sband->channels[i].max_power; + for (band = NL80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; ++band) { + sband = wiphy->bands[band]; + if (sband) { + for (i = 0; i < sband->n_channels; i++) { + plist->chan_list[i + num_chan].center_freq = + sband->channels[i].center_freq; + plist->chan_list[i + num_chan].hw_value = + sband->channels[i].hw_value; + plist->chan_list[i + num_chan].flags = + sband->channels[i].flags; + plist->chan_list[i + num_chan].max_power = + sband->channels[i].max_power; #if CFG80211_VERSION_CODE > KERNEL_VERSION(3, 8, 13) - plist->chan_list[i + num_chan].dfs_state = - sband->channels[i].dfs_state; + plist->chan_list[i + num_chan].dfs_state = + sband->channels[i].dfs_state; #endif + } + num_chan += sband->n_channels; } - num_chan += sband->n_channels; } plist->num_chan = num_chan; ret = sizeof(wlan_ieee80211_chan_list) + @@ -8211,7 +8232,9 @@ static int woal_priv_getwap(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen) if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) { memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + ret = woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (ret != MLAN_STATUS_SUCCESS) + return -EFAULT; if (bss_info.media_connected == MTRUE) { moal_memcpy_ext(priv->phandle, respbuf, @@ -8611,12 +8634,14 @@ static int woal_priv_offchannel(moal_private *priv, t_u8 *respbuf, if (header_len == (int)strlen(respbuf)) { /* Query current remain on channel status */ if (priv->phandle->remain_on_channel) - ret = sprintf(respbuf, + ret = snprintf( + respbuf, CMD_BUF_LEN, "There is pending remain on channel from bss %d\n", priv->phandle->remain_bss_index) + 1; else - ret = sprintf(respbuf, + ret = snprintf( + respbuf, CMD_BUF_LEN, "There is no pending remain on channel\n") + 1; goto done; @@ -8689,7 +8714,8 @@ static int woal_priv_offchannel(moal_private *priv, t_u8 *respbuf, if (data[0] == 0) { if (!priv->phandle->remain_on_channel) { - ret = sprintf(respbuf, + ret = snprintf( + respbuf, CMD_BUF_LEN, "There is no pending remain on channel to be canceled\n") + 1; goto done; @@ -8731,7 +8757,7 @@ static int woal_priv_offchannel(moal_private *priv, t_u8 *respbuf, if (status != MLAN_STATUS_SUCCESS) ret = -EFAULT; else - ret = sprintf(respbuf, "OK\n") + 1; + ret = snprintf(respbuf, CMD_BUF_LEN, "OK\n") + 1; done: LEAVE(); @@ -8953,7 +8979,9 @@ static int woal_priv_radio_ctrl(moal_private *priv, t_u8 *respbuf, goto done; } else { /* Get radio status */ - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + ret = woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (ret != MLAN_STATUS_SUCCESS) + return -EFAULT; moal_memcpy_ext(priv->phandle, respbuf, &bss_info.radio_on, sizeof(bss_info.radio_on), respbuflen); ret = sizeof(bss_info.radio_on); @@ -9343,6 +9371,19 @@ static int woal_priv_set_get_reassoc(moal_private *priv, t_u8 *respbuf, respbuflen); ret = sizeof(data); } else { +#ifdef STA_CFG80211 +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME)) { + if (priv->host_mlme) { + PRINTM(MERROR, + "Don't support reassoctrl in host_mlme mode\n"); + ret = -EFAULT; + LEAVE(); + return ret; + } + } +#endif +#endif /* SET operation */ parse_arguments(respbuf + header_len, &data, 1, &user_data_len); if (user_data_len == 1) { @@ -11063,7 +11104,10 @@ static int woal_priv_net_monitor_ioctl(moal_private *priv, t_u8 *respbuf, if (!data[1] || data[1] & ~(MLAN_NETMON_DATA | MLAN_NETMON_MANAGEMENT | - MLAN_NETMON_CONTROL)) { + MLAN_NETMON_CONTROL | + MLAN_NETMON_NOPROM | + MLAN_NETMON_NON_BSS_BCN | + MLAN_NETMON_TX)) { PRINTM(MERROR, "NET_MON: Invalid filter flag\n"); ret = -EINVAL; @@ -11643,222 +11687,98 @@ done: } #ifdef UAP_SUPPORT + /** - * @brief determine the center frquency center index for bandwidth - * of 80 MHz and 160 MHz + * @brief determine the center frequency center index for bandwidth + * of 40/80/160 MHz * - ** @param priv Pointer to moal_private structure + ** @param priv Pointer to moal_private structure * @param band band * @param pri_chan primary channel * @param chan_bw channel bandwidth * * @return channel center frequency center, if found; O, otherwise */ - static t_u8 woal_get_center_freq_idx(moal_private *priv, t_u16 band, t_u32 pri_chan, t_u8 chan_bw) { - t_u8 center_freq_idx = 0; + struct center_freq_desc { + t_u8 pri_chan; + t_u8 ch_40; + t_u8 ch_80; + t_u8 ch_160; + }; - if (band & BAND_AAC) { - switch (pri_chan) { - case 36: - case 40: + static const struct center_freq_desc center_freq_idx_map_5g[] = { + {.pri_chan = 36, .ch_40 = 38, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 40, .ch_40 = 38, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 44, .ch_40 = 46, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 48, .ch_40 = 46, .ch_80 = 42, .ch_160 = 50}, + {.pri_chan = 52, .ch_40 = 54, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 56, .ch_40 = 54, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 60, .ch_40 = 62, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 64, .ch_40 = 62, .ch_80 = 58, .ch_160 = 50}, + {.pri_chan = 68, .ch_40 = 70, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 72, .ch_40 = 70, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 76, .ch_40 = 78, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 80, .ch_40 = 78, .ch_80 = 74, .ch_160 = 0}, + {.pri_chan = 84, .ch_40 = 86, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 88, .ch_40 = 86, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 92, .ch_40 = 94, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 96, .ch_40 = 94, .ch_80 = 90, .ch_160 = 0}, + {.pri_chan = 100, .ch_40 = 102, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 104, .ch_40 = 102, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 108, .ch_40 = 110, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 112, .ch_40 = 110, .ch_80 = 106, .ch_160 = 114}, + {.pri_chan = 116, .ch_40 = 118, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 120, .ch_40 = 118, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 124, .ch_40 = 126, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 128, .ch_40 = 126, .ch_80 = 122, .ch_160 = 114}, + {.pri_chan = 132, .ch_40 = 134, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 136, .ch_40 = 134, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 140, .ch_40 = 142, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 144, .ch_40 = 142, .ch_80 = 138, .ch_160 = 0}, + {.pri_chan = 149, .ch_40 = 151, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 153, .ch_40 = 151, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 157, .ch_40 = 159, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 161, .ch_40 = 159, .ch_80 = 155, .ch_160 = 163}, + {.pri_chan = 165, .ch_40 = 167, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 169, .ch_40 = 167, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 173, .ch_40 = 175, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 177, .ch_40 = 175, .ch_80 = 171, .ch_160 = 163}, + {.pri_chan = 184, .ch_40 = 186, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 188, .ch_40 = 186, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 192, .ch_40 = 194, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 196, .ch_40 = 194, .ch_80 = 190, .ch_160 = 0}, + {.pri_chan = 0, + .ch_40 = 42 /* terminator with default cfreq */}}; + + const struct center_freq_desc *map = NULL; + + if (band == BAND_5GHZ) + map = center_freq_idx_map_5g; + + for (; map != NULL; map++) { + /* reached end of map, return default value for that map */ + if (map->pri_chan == 0) + return map->ch_40; + + if (map->pri_chan == pri_chan) { if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 38; - break; - } - /* fall through */ - case 44: - case 48: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 46; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 42; - break; - } - /* fall through */ - case 52: - case 56: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 54; - break; - } - /* fall through */ - case 60: - case 64: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 62; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 58; - break; - } else if (chan_bw == CHANNEL_BW_160MHZ) { - center_freq_idx = 50; - break; - } - /* fall through */ - case 68: - case 72: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 70; - break; - } - /* fall through */ - case 76: - case 80: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 78; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 74; - break; - } - /* fall through */ - case 84: - case 88: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 86; - break; - } - /* fall through */ - case 92: - case 96: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 94; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 90; - break; - } - /* fall through */ - case 100: - case 104: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 102; - break; - } - /* fall through */ - case 108: - case 112: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 110; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 106; - break; - } - /* fall through */ - case 116: - case 120: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 118; - break; - } - /* fall through */ - case 124: - case 128: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 126; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 122; - } else if (chan_bw == CHANNEL_BW_160MHZ) { - center_freq_idx = 114; - } - break; - case 132: - case 136: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 134; - break; - } - /* fall through */ - case 140: - case 144: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 126; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 138; - } - break; - case 149: - case 153: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 151; - break; - } - /* fall through */ - case 157: - case 161: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 159; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 155; - break; - } - /* fall through */ - case 165: - case 169: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 167; - break; - } - /* fall through */ - case 173: - case 177: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 175; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 171; - break; - } - /* fall through */ - case 184: - case 188: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 186; - break; - } - /* fall through */ - case 192: - case 196: - if (chan_bw == CHANNEL_BW_40MHZ_ABOVE || - chan_bw == CHANNEL_BW_40MHZ_BELOW) { - center_freq_idx = 194; - break; - } else if (chan_bw == CHANNEL_BW_80MHZ) { - center_freq_idx = 190; - break; - } - /* fall through */ - default: /* error. go to the default */ - center_freq_idx = 42; + chan_bw == CHANNEL_BW_40MHZ_BELOW) + return map->ch_40; + + if (chan_bw == CHANNEL_BW_80MHZ) + return map->ch_80; + + if (chan_bw == CHANNEL_BW_160MHZ) + return map->ch_160; } } - return center_freq_idx; + + return 0; } + #endif #if defined(UAP_SUPPORT) @@ -11870,6 +11790,7 @@ static t_u8 woal_get_center_freq_idx(moal_private *priv, t_u16 band, * @param oper_class oper_class * @param channel channel * @param switch count how many csa/ecsa beacon will send out + * @param band see BAND_5GHZ/BAND_6GHZ enum * @param band_width 1-40Mhz above, 3-40Mhz below, 4-80Mhz, 5-160Mhz * @param ecsa MTRUE/MFALSE; * @@ -11877,7 +11798,7 @@ static t_u8 woal_get_center_freq_idx(moal_private *priv, t_u16 band, */ static int woal_channel_switch(moal_private *priv, t_u8 block_tx, t_u8 oper_class, t_u8 channel, t_u8 switch_count, - t_u8 band_width, t_u8 ecsa) + t_u8 band, t_u8 band_width, t_u8 ecsa) { IEEEtypes_ExtChanSwitchAnn_t *ext_chan_switch = NULL; IEEEtypes_ChanSwitchAnn_t *chan_switch = NULL; @@ -11909,18 +11830,25 @@ static int woal_channel_switch(moal_private *priv, t_u8 block_tx, pcust_chansw_ie = (custom_ie *)&misc->param.cust_ie.ie_data_list[0]; pcust_chansw_ie->ie_index = 0xffff; /*Auto index */ - pcust_chansw_ie->ie_length = sizeof(IEEEtypes_ChanSwitchAnn_t); + pcust_chansw_ie->ie_length = 0; pcust_chansw_ie->mgmt_subtype_mask = MGMT_MASK_BEACON | MGMT_MASK_PROBE_RESP; /*Add IE for BEACON/probe resp*/ - chan_switch = (IEEEtypes_ChanSwitchAnn_t *)pcust_chansw_ie->ie_buffer; - chan_switch->element_id = CHANNEL_SWITCH_ANN; - chan_switch->len = 3; - chan_switch->chan_switch_mode = block_tx; - chan_switch->new_channel_num = channel; - chan_switch->chan_switch_count = switch_count; - DBG_HEXDUMP(MCMD_D, "CSA IE", (t_u8 *)pcust_chansw_ie->ie_buffer, - pcust_chansw_ie->ie_length); + pcust_chansw_ie->mgmt_subtype_mask |= MLAN_CUSTOM_IE_NEW_MASK; + + if (band == BAND_2GHZ || band == BAND_5GHZ) { + pcust_chansw_ie->ie_length = sizeof(IEEEtypes_ChanSwitchAnn_t); + chan_switch = + (IEEEtypes_ChanSwitchAnn_t *)pcust_chansw_ie->ie_buffer; + chan_switch->element_id = CHANNEL_SWITCH_ANN; + chan_switch->len = 3; + chan_switch->chan_switch_mode = block_tx; + chan_switch->new_channel_num = channel; + chan_switch->chan_switch_count = switch_count; + DBG_HEXDUMP(MCMD_D, "CSA IE", + (t_u8 *)pcust_chansw_ie->ie_buffer, + pcust_chansw_ie->ie_length); + } switch (band_width) { case CHANNEL_BW_40MHZ_ABOVE: case CHANNEL_BW_40MHZ_BELOW: @@ -11940,27 +11868,23 @@ static int woal_channel_switch(moal_private *priv, t_u8 block_tx, woal_priv_get_nonglobal_operclass_by_bw_channel( priv, bw, channel, &new_oper_class); if (new_oper_class) { - pcust_chansw_ie->ie_length += - sizeof(IEEEtypes_ExtChanSwitchAnn_t); - ext_chan_switch = - (IEEEtypes_ExtChanSwitchAnn_t - *)(pcust_chansw_ie->ie_buffer + - sizeof(IEEEtypes_ChanSwitchAnn_t)); + ext_chan_switch = (IEEEtypes_ExtChanSwitchAnn_t + *)(pcust_chansw_ie->ie_buffer + + pcust_chansw_ie->ie_length); ext_chan_switch->element_id = EXTEND_CHANNEL_SWITCH_ANN; ext_chan_switch->len = 4; ext_chan_switch->chan_switch_mode = block_tx; ext_chan_switch->new_oper_class = new_oper_class; ext_chan_switch->new_channel_num = channel; ext_chan_switch->chan_switch_count = switch_count; - DBG_HEXDUMP(MCMD_D, "ECSA IE", - (t_u8 *)(pcust_chansw_ie->ie_buffer + - sizeof(IEEEtypes_ChanSwitchAnn_t)), - pcust_chansw_ie->ie_length - - sizeof(IEEEtypes_ChanSwitchAnn_t)); + pcust_chansw_ie->ie_length += + sizeof(IEEEtypes_ExtChanSwitchAnn_t); + DBG_HEXDUMP(MCMD_D, "ECSA IE", (t_u8 *)ext_chan_switch, + sizeof(IEEEtypes_ExtChanSwitchAnn_t)); } /* bandwidth 40/80/160 should set channel switch wrapper ie for 11ac 5G * channel*/ - if (band_width && channel > 14) { + if (band_width && (band == BAND_5GHZ)) { pChanSwWrap_ie = (IEEEtypes_Header_t *)(pcust_chansw_ie->ie_buffer + pcust_chansw_ie->ie_length); @@ -11975,8 +11899,8 @@ static int woal_channel_switch(moal_private *priv, t_u8 block_tx, sizeof(IEEEtypes_WideBWChanSwitch_t) - sizeof(IEEEtypes_Header_t); - center_freq_idx = woal_get_center_freq_idx(priv, BAND_AAC, - channel, band_width); + center_freq_idx = woal_get_center_freq_idx(priv, band, channel, + band_width); if (band_width == CHANNEL_BW_40MHZ_ABOVE || band_width == CHANNEL_BW_40MHZ_BELOW) { pbwchansw_ie->new_channel_width = 0; @@ -12382,6 +12306,7 @@ static void woal_auto_uap_channel_switch(moal_private *priv, t_u8 channel) { moal_private *pmpriv = NULL; chan_band_info chaninfo; + t_u8 band = BAND_2GHZ; moal_handle *ref_handle; t_u8 band_width = CHANNEL_BW_20MHZ; @@ -12416,9 +12341,11 @@ static void woal_auto_uap_channel_switch(moal_private *priv, t_u8 channel) band_width = CHANNEL_BW_20MHZ; break; } + if (channel > MAX_BG_CHANNEL) + band = BAND_5GHZ; #define DEF_SWITCH_COUNT 10 woal_channel_switch(pmpriv, MTRUE, 0, channel, - DEF_SWITCH_COUNT, band_width, + DEF_SWITCH_COUNT, band, band_width, MTRUE); } } @@ -12554,12 +12481,24 @@ static int woal_priv_do_dfs_cac(moal_private *priv, t_u8 *respbuf, #ifdef UAP_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) if (!data[0] && priv->chan_rpt_req.chanNum) { - woal_update_channels_dfs_state( - priv, - priv->chan_rpt_req.chanNum, - priv->chan_rpt_req.bandcfg - .chanWidth, - DFS_USABLE); + memset(&ch_dfs_state, 0, + sizeof(ch_dfs_state)); + ch_dfs_state.channel = + priv->chan_rpt_req.chanNum; + if (!woal_11h_chan_dfs_state( + priv, MLAN_ACT_GET, + &ch_dfs_state)) { + if (ch_dfs_state.dfs_state == + DFS_AVAILABLE) + woal_update_channels_dfs_state( + priv, + priv->chan_rpt_req + .chanNum, + priv->chan_rpt_req + .bandcfg + .chanWidth, + DFS_USABLE); + } } #endif #endif @@ -13188,7 +13127,6 @@ static int woal_priv_get_ch_load(moal_private *priv, t_u8 *respbuf, misc->param.ch_load.noise = cl_cfg->noise; misc->param.ch_load.rx_quality = cl_cfg->rx_quality; misc->param.ch_load.duration = cl_cfg->duration; - misc->param.ch_load.cca_th = cl_cfg->cca_th; status = woal_request_ioctl(priv, ioctl_req, MOAL_NO_WAIT); if (status != MLAN_STATUS_SUCCESS && status != MLAN_STATUS_PENDING) { ret = -EFAULT; @@ -13256,7 +13194,8 @@ static int woal_priv_set_get_tx_rx_ant(moal_private *priv, t_u8 *respbuf, radio->param.ant_cfg.rx_antenna = data[1]; #if defined(STA_CFG80211) || defined(UAP_CFG80211) if (IS_CARD9098(priv->phandle->card_type) || - IS_CARD9097(priv->phandle->card_type)) { + IS_CARD9097(priv->phandle->card_type) || + IS_CARDIW62X(priv->phandle->card_type)) { woal_cfg80211_notify_antcfg( priv, priv->phandle->wiphy, radio); } @@ -13640,11 +13579,11 @@ static int woal_priv_get_key(moal_private *priv, t_u8 *respbuf, goto done; } if (sec->param.encrypt_key.key_len) { - sprintf((char *)tmp, "\n%s", "PTK: "); + snprintf((char *)tmp, CMD_BUF_LEN, "\n%s", "PTK: "); tmp += 5; for (i = 0; i < sec->param.encrypt_key.key_len; i++) - tmp += sprintf((char *)tmp, "%02x", - sec->param.encrypt_key.key_material[i]); + tmp += snprintf((char *)tmp, CMD_BUF_LEN, "%02x", + sec->param.encrypt_key.key_material[i]); } /* Get Multicase Key */ @@ -13661,11 +13600,11 @@ static int woal_priv_get_key(moal_private *priv, t_u8 *respbuf, goto done; } if (sec->param.encrypt_key.key_len) { - sprintf((char *)tmp, "\n%s", "GTK: "); + snprintf((char *)tmp, CMD_BUF_LEN, "\n%s", "GTK: "); tmp += 5; for (i = 0; i < sec->param.encrypt_key.key_len; i++) - tmp += sprintf((char *)tmp, "%02x", - sec->param.encrypt_key.key_material[i]); + tmp += snprintf((char *)tmp, CMD_BUF_LEN, "%02x", + sec->param.encrypt_key.key_material[i]); } /* Get IGTK Key */ @@ -13682,11 +13621,11 @@ static int woal_priv_get_key(moal_private *priv, t_u8 *respbuf, goto done; } if (sec->param.encrypt_key.key_len) { - sprintf((char *)tmp, "\n%s", "IGTK: "); + snprintf((char *)tmp, CMD_BUF_LEN, "\n%s", "IGTK: "); tmp += 6; for (i = 0; i < sec->param.encrypt_key.key_len; i++) - tmp += sprintf((char *)tmp, "%02x", - sec->param.encrypt_key.key_material[i]); + tmp += snprintf((char *)tmp, CMD_BUF_LEN, "%02x", + sec->param.encrypt_key.key_material[i]); } copy_len = tmp - key_ascii; @@ -13905,7 +13844,7 @@ static int woal_priv_tx_bf_cfg(moal_private *priv, t_u8 *respbuf, *token = '\0'; str = token + 1; } - woal_atoi(&tmp_val, pos); + (void)woal_atoi(&tmp_val, pos); switch (i) { case BF_ENABLE_PARAM: bf_global->bf_enbl = @@ -13996,11 +13935,11 @@ static int woal_priv_tx_bf_cfg(moal_private *priv, t_u8 *respbuf, bf_cfg.action = BF_CFG_ACT_GET; } else { woal_mac2u8(tx_bf_peer->peer_mac, &buf[2]); - woal_atoi(&tmp_val, &buf[20]); + (void)woal_atoi(&tmp_val, &buf[20]); tx_bf_peer->bf_enbl = (t_u8)tmp_val; - woal_atoi(&tmp_val, &buf[22]); + (void)woal_atoi(&tmp_val, &buf[22]); tx_bf_peer->sounding_enbl = (t_u8)tmp_val; - woal_atoi(&tmp_val, &buf[24]); + (void)woal_atoi(&tmp_val, &buf[24]); tx_bf_peer->fb_type = (t_u8)tmp_val; action = MLAN_ACT_SET; bf_cfg.action = BF_CFG_ACT_SET; @@ -14953,6 +14892,60 @@ done: return ret; } +/** +* @brief Configure TWT Report parameters + + *@param priv Pointer to the mlan_private driver data struct + *@param respbuf A pointer to response buffer + *@param len Length used + *@param respbuflen Available length of response buffer + + *@return Number of bytes written if successful else negative value +*/ +static int woal_priv_twt_report(moal_private *priv, t_u8 *respbuf, t_u8 len, + t_u32 respbuflen) +{ + mlan_ioctl_req *req = NULL; + mlan_ds_twtcfg *cfg = NULL; + int ret = 0; + mlan_status status = MLAN_STATUS_SUCCESS; + + ENTER(); + + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_twtcfg)); + if (req == NULL) { + PRINTM(MERROR, "Failed to allocate ioctl_req!\n"); + ret = -ENOMEM; + goto done; + } + + req->req_id = MLAN_IOCTL_11AX_CFG; + req->action = MLAN_ACT_GET; + cfg = (mlan_ds_twtcfg *)req->pbuf; + cfg->sub_command = MLAN_OID_11AX_TWT_CFG; + cfg->sub_id = MLAN_11AX_TWT_REPORT_SUBID; + + if (len) { + moal_memcpy_ext(priv->phandle, (t_u8 *)&cfg->param.twt_report, + respbuf, len, sizeof(mlan_ds_twt_report)); + } + + status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "woal_request_ioctl failed!\n"); + ret = -EFAULT; + goto done; + } + + ret = sizeof(mlan_ds_twt_report); +done: + if (status != MLAN_STATUS_PENDING) { + kfree(req); + } + LEAVE(); + return ret; +} + #ifdef WIFI_DIRECT_SUPPORT #if defined(UAP_CFG80211) /** @@ -15310,6 +15303,112 @@ done: return ret; } +/** + * @brief Set/Get cross chip sync config parameters + * @param priv Pointer to moal_private structure + * @param respbuf Pointer to response buffer + * @param resplen Response buffer length + * + * @return Number of bytes written, negative for failure. + */ +static int woal_priv_cross_chip_synch(moal_private *priv, t_u8 *respbuf, + t_u32 respbuflen) +{ + mlan_ds_cross_chip_synch *cross_chip_sync = NULL; + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc_cfg = NULL; + mlan_status status = MLAN_STATUS_SUCCESS; + int data[5] = {0}; + int header_len = 0; + int user_data_len = 0; + int ret = 0; + + ENTER(); + + if (!priv || !priv->phandle) { + PRINTM(MERROR, "priv or handle is null\n"); + ret = -EFAULT; + goto done; + } + + if (!respbuf) { + PRINTM(MERROR, "response buffer is not available!\n"); + ret = -EINVAL; + goto done; + } + + header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_CROSS_CHIP_SYNCH); + + memset(data, 0, sizeof(data)); + parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data), + &user_data_len); + + if (user_data_len > 5) { + PRINTM(MERROR, "invalid parameters\n"); + ret = -EINVAL; + goto done; + } + + /* Allocate an IOCTL request buffer */ + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = -ENOMEM; + goto done; + } + + /* Fill request buffer */ + req->req_id = MLAN_IOCTL_MISC_CFG; + misc_cfg = (mlan_ds_misc_cfg *)req->pbuf; + misc_cfg->sub_command = MLAN_OID_MISC_CROSS_CHIP_SYNCH; + cross_chip_sync = &misc_cfg->param.cross_chip_synch; + memset(cross_chip_sync, 0, sizeof(mlan_ds_cross_chip_synch)); + + if ((int)strlen(respbuf) == header_len) { + /* GET operation */ + req->action = MLAN_ACT_GET; + user_data_len = 0; + } else { + req->action = MLAN_ACT_SET; + + if (data[0] < 0 || data[0] > 1) { + PRINTM(MERROR, "Invalid start_stop value\n"); + ret = -EINVAL; + goto done; + } else if (data[1] < 1 || data[1] > 2) { + PRINTM(MERROR, "Invalid role value\n"); + ret = -EINVAL; + goto done; + } else { + cross_chip_sync->start_stop = (t_u8)data[0]; + cross_chip_sync->role = (t_u8)data[1]; + cross_chip_sync->period = (t_u32)data[2]; + cross_chip_sync->init_tsf_low = (t_u32)data[3]; + cross_chip_sync->init_tsf_high = (t_u32)data[4]; + } + } + + /* Send IOCTL request to MLAN */ + status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + + if (!user_data_len) { + /* Copy back to userspace call */ + moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)cross_chip_sync, + sizeof(mlan_ds_cross_chip_synch), respbuflen); + ret = sizeof(mlan_ds_cross_chip_synch); + } + +done: + if (status != MLAN_STATUS_PENDING) + kfree(req); + + LEAVE(); + return ret; +} + #ifdef UAP_SUPPORT /** * @brief Set/Get target channel @@ -16174,8 +16273,8 @@ static int woal_priv_tdls_cs_chan(moal_private *priv, t_u8 *respbuf, goto done; } - ret = sprintf(respbuf, "off channel %d\n", - misc->param.tdls_cs_channel) + + ret = snprintf(respbuf, CMD_BUF_LEN, "off channel %d\n", + misc->param.tdls_cs_channel) + 1; PRINTM(MIOCTL, "tdls CS channel %d\n", misc->param.tdls_cs_channel); @@ -16340,16 +16439,18 @@ done: * @param priv Pointer to moal_private structure * @param channel channel * @param oper_class oper_class - + * @param bandwidth band width + * * @return SUCCESS/FAIL */ static int woal_check_valid_channel_operclass(moal_private *priv, int channel, - int oper_class) + int oper_class, t_u8 bandwidth) { int ret = 0; mlan_ioctl_req *ioctl_req = NULL; mlan_ds_misc_cfg *misc = NULL; mlan_status status = MLAN_STATUS_SUCCESS; + t_u8 bw; ENTER(); @@ -16358,6 +16459,18 @@ static int woal_check_valid_channel_operclass(moal_private *priv, int channel, ret = -ENOMEM; goto done; } + switch (bandwidth) { + case CHANNEL_BW_40MHZ_ABOVE: + case CHANNEL_BW_40MHZ_BELOW: + bw = CHAN_BW_40MHZ; + break; + case CHANNEL_BW_80MHZ: + bw = CHAN_BW_80MHZ; + break; + default: + bw = CHAN_BW_20MHZ; + break; + } misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf; misc->sub_command = MLAN_OID_MISC_OPER_CLASS_CHECK; @@ -16365,6 +16478,7 @@ static int woal_check_valid_channel_operclass(moal_private *priv, int channel, ioctl_req->action = MLAN_ACT_GET; misc->param.bw_chan_oper.oper_class = (t_u8)oper_class; misc->param.bw_chan_oper.channel = (t_u8)channel; + misc->param.bw_chan_oper.bandwidth = (t_u8)bw; status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT); if (status != MLAN_STATUS_SUCCESS) { @@ -16433,7 +16547,8 @@ static void woal_enable_dfs(moal_private *priv, t_u8 channel, t_u8 wait_option) */ static int woal_action_channel_switch(moal_private *priv, t_u8 block_tx, t_u8 oper_class, t_u8 channel, - t_u8 switch_count, t_u8 wait_option) + t_u8 switch_count, t_u8 mode, + t_u8 wait_option) { mlan_status ret = MLAN_STATUS_SUCCESS; mlan_ds_bss *bss = NULL; @@ -16451,13 +16566,16 @@ static int woal_action_channel_switch(moal_private *priv, t_u8 block_tx, bss->sub_command = MLAN_OID_ACTION_CHAN_SWITCH; req->req_id = MLAN_IOCTL_BSS; req->action = MLAN_ACT_SET; + bss->param.chanswitch.mode = mode; bss->param.chanswitch.chan_switch_mode = block_tx; bss->param.chanswitch.new_channel_num = channel; if (!switch_count) bss->param.chanswitch.chan_switch_count = DEF_NUM_PKTS; - else + else if (!mode) /* bcast action frame */ bss->param.chanswitch.chan_switch_count = MIN(switch_count, MAX_NUM_PKTS); + else /* ucast action frame */ + bss->param.chanswitch.chan_switch_count = switch_count; bss->param.chanswitch.new_oper_class = oper_class; ret = woal_request_ioctl(priv, req, wait_option); done: @@ -16494,7 +16612,9 @@ void woal_move_to_next_channel(moal_private *priv) __func__); if (ch_dfs.dfs_required) woal_enable_dfs(priv, next_chan, MOAL_NO_WAIT); - woal_action_channel_switch(priv, MTRUE, 0, next_chan, 0, MOAL_NO_WAIT); + woal_action_channel_switch(priv, MTRUE, 0, next_chan, + priv->chan_num_pkts, priv->chan_mode, + MOAL_NO_WAIT); return; } #endif @@ -16513,9 +16633,11 @@ static int woal_priv_extend_channel_switch(moal_private *priv, t_u8 *respbuf, { int ret = 0; int user_data_len = 0; - int data[5] = {0}; + int data[6] = {0}; + t_u8 band = BAND_2GHZ; t_u8 channel; mlan_ds_11h_chan_dfs_state ch_dfs; + ENTER(); if (!priv || !priv->phandle || (priv->bss_role != MLAN_BSS_ROLE_UAP) || @@ -16544,10 +16666,20 @@ static int woal_priv_extend_channel_switch(moal_private *priv, t_u8 *respbuf, LEAVE(); return ret; } - - /* For 2.4G channels skip the DFS checks */ channel = data[2]; - if (channel > MAX_BG_CHANNEL) { + if (data[1]) { + if (woal_check_valid_channel_operclass(priv, data[2], data[1], + data[4])) { + PRINTM(MERROR, "Wrong channel switch parameters!\n"); + ret = -EINVAL; + goto done; + } + } + + if (channel > MAX_BG_CHANNEL) + band = BAND_5GHZ; + /* For 2.4G/6G channels skip the DFS checks */ + if (band == BAND_5GHZ) { memset(&ch_dfs, 0, sizeof(ch_dfs)); ch_dfs.channel = data[2]; @@ -16570,23 +16702,41 @@ static int woal_priv_extend_channel_switch(moal_private *priv, t_u8 *respbuf, return ret; } - if (ch_dfs.dfs_required) + if (ch_dfs.dfs_required) { +#ifdef UAP_CFG80211 +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) + woal_update_channels_dfs_state(priv, channel, data[4], + DFS_AVAILABLE); +#endif +#endif woal_enable_dfs(priv, data[2], MOAL_IOCTL_WAIT); + } } - if (data[1]) { - if (woal_check_valid_channel_operclass(priv, data[2], - data[1])) { - PRINTM(MERROR, "Wrong channel switch parameters!\n"); + if (data[5] && (data[5] < 0 || data[5] > 3)) { + PRINTM(MERROR, + "Wrong channel switch parameters for ucast action frame!\n"); + ret = -EINVAL; + goto done; + } + + if (!data[3]) { + if (!data[5] && (data[4] < 0 || data[4] > MAX_NUM_PKTS)) { + PRINTM(MERROR, + "Bcast action frame count exceeds maximum %d!\n", + MAX_NUM_PKTS); ret = -EINVAL; goto done; } + priv->chan_mode = data[5] & DEFAULT_CHAN_MODE_MASK; + priv->chan_num_pkts = data[4]; } + if (data[3]) woal_channel_switch(priv, data[0], data[1], data[2], data[3], - data[4], MFALSE); + band, data[4], MFALSE); else woal_action_channel_switch(priv, data[0], data[1], data[2], - data[4], MOAL_IOCTL_WAIT); + data[4], data[5], MOAL_IOCTL_WAIT); done: LEAVE(); return ret; @@ -16713,7 +16863,7 @@ static int woal_priv_p2p_ecsa(moal_private *priv, t_u8 *respbuf, priv->phandle->chsw_wait_q_woken = MFALSE; /* wait for channel switch to complete */ - wait_event_interruptible_timeout( + (void)wait_event_interruptible_timeout( priv->phandle->chsw_wait_q, priv->phandle->chsw_wait_q_woken, (u32)HZ * (ext_chan_switch->chan_switch_count + 2) * 110 / 1000); @@ -16770,8 +16920,8 @@ static int woal_priv_config_random_mac(moal_private *priv, t_u8 *respbuf, strlen("On")) == 0) { if (memcmp(priv->random_mac, zero_mac, MLAN_MAC_ADDR_LENGTH)) { - ret = sprintf(respbuf, - "FAKEMAC has been On\n") + + ret = snprintf(respbuf, CMD_BUF_LEN, + "FAKEMAC has been On\n") + 1; goto done; } @@ -17081,7 +17231,7 @@ static int woal_priv_roam_offload_cfg(moal_private *priv, t_u8 *respbuf, *end = '\0'; if (pvariable_name && begin) { if (strcmp(pvariable_name, "AUTO_RECONNECT") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); } else if (strcmp(pvariable_name, "BSSID") == 0) { woal_mac2u8(mac_addr, begin); moal_memcpy_ext(priv->phandle, @@ -17185,106 +17335,106 @@ static int woal_priv_roam_offload_cfg(moal_private *priv, t_u8 *respbuf, goto done; } } else if (strcmp(pvariable_name, "RETRY_COUNT") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.retry_count = (t_u8)data; } else if (strcmp(pvariable_name, "TRIGGER_CONDITION") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.trigger_condition = (t_u16)data; } else if (strcmp(pvariable_name, "MAX_RSSI") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.max_rssi = (t_u8)data; roam_offload_cfg.rssi_param_set_flag = 1; } else if (strcmp(pvariable_name, "MIN_RSSI") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.min_rssi = (t_u8)data; roam_offload_cfg.rssi_param_set_flag = 1; } else if (strcmp(pvariable_name, "STEP_RSSI") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.step_rssi = (t_u8)data; roam_offload_cfg.rssi_param_set_flag = 1; } else if (strcmp(pvariable_name, "BAND_PREFER") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.band_rssi.band_preferred = (t_u8)data; roam_offload_cfg.band_rssi_flag = 1; } else if (strcmp(pvariable_name, "RSSI_HYSTERESIS") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.band_rssi.rssi_hysteresis = (t_u8)data; roam_offload_cfg.band_rssi_flag = 1; } else if (strcmp(pvariable_name, "BSSTYPE") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.bgscan_cfg.bss_type = (t_u8)data; roam_offload_cfg.bgscan_set_flag++; } else if (strcmp(pvariable_name, "CHANSPERSCAN") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.bgscan_cfg.channels_per_scan = (t_u8)data; roam_offload_cfg.bgscan_set_flag++; } else if (strcmp(pvariable_name, "BGRPTCONDITION") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.bgscan_cfg.bg_rpt_condition = (t_u32)data; roam_offload_cfg.bgscan_set_flag++; } else if (strcmp(pvariable_name, "SCANINTERVAL") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.bgscan_cfg.scan_interval = (t_u32)data; roam_offload_cfg.bgscan_set_flag++; } else if (strcmp(pvariable_name, "EESMODE") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.ees_mode = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; } else if (strcmp(pvariable_name, "EESRPTCONDITION") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.ees_rpt_condition = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; } else if (strcmp(pvariable_name, "HIGHSCANPERIOD") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.high_scan_period = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; } else if (strcmp(pvariable_name, "HIGHSCANCOUNT") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.high_scan_count = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; } else if (strcmp(pvariable_name, "MIDSCANPERIOD") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.mid_scan_period = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; } else if (strcmp(pvariable_name, "MIDSCANCOUNT") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.mid_scan_count = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; } else if (strcmp(pvariable_name, "LOWSCANPERIOD") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.low_scan_period = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; } else if (strcmp(pvariable_name, "LOWSCANCOUNT") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.ees_cfg.low_scan_count = (t_u16)data; roam_offload_cfg.ees_param_set_flag++; @@ -17292,18 +17442,18 @@ static int woal_priv_roam_offload_cfg(moal_private *priv, t_u8 *respbuf, else if (strcmp(pvariable_name, "BCNMISSTHRESHOLD") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.bcn_miss_threshold = (t_u8)data; } else if (strcmp(pvariable_name, "PREBCNMISSTHRESHOLD") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.pre_bcn_miss_threshold = (t_u8)data; } else if (strcmp(pvariable_name, "REPEATCOUNT") == 0) { - woal_atoi(&data, begin); + (void)woal_atoi(&data, begin); roam_offload_cfg.repeat_count = (t_u16)data; } else { PRINTM(MERROR, "Un-support parameter: %s\n", @@ -17840,13 +17990,307 @@ static int woal_priv_cloud_keep_alive(moal_private *priv, t_u8 *respbuf, return ret; } +/** + * @brief Download start keep alive rx parameters + * + * @param priv Pointer to moal_private structure + * @param mkeep_alive_id keep alive ID number + * @param ip_pke IP packet from host + * @param ip_pke_len IP packet length from host + * @param src_mac Source MAC address + * @param dst_mac Destination MAC address + + * @return 0: success fail otherwise + */ +int woal_start_mkeep_alive_rx(moal_private *priv, t_u8 mkeep_alive_id, + t_u8 *ip_pkt, t_u16 ip_pkt_len, t_u8 *src_mac, + t_u8 *dst_mac) +{ + mlan_ioctl_req *ioctl_req = NULL; + mlan_ds_misc_cfg *misc = NULL; + mlan_status status = MLAN_STATUS_SUCCESS; + int ret = 0; + + ENTER(); + + if (!priv || !priv->phandle) { + PRINTM(MERROR, "priv or handle is null\n"); + ret = -EFAULT; + goto done; + } + + ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (ioctl_req == NULL) { + ret = -ENOMEM; + goto done; + } + + misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf; + misc->sub_command = MLAN_OID_MISC_CLOUD_KEEP_ALIVE_RX; + ioctl_req->req_id = MLAN_IOCTL_MISC_CFG; + + if (mkeep_alive_id >= MAX_KEEP_ALIVE_RX_ID) { + PRINTM(MERROR, "Invalid parameters\n"); + ret = -EFAULT; + goto done; + } + + /* SET operation */ + ioctl_req->action = MLAN_ACT_SET; + misc->param.keep_alive_rx.mkeep_alive_id = mkeep_alive_id; + misc->param.keep_alive_rx.enable = true; + moal_memcpy_ext(priv->phandle, misc->param.keep_alive_rx.dst_mac, + dst_mac, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + moal_memcpy_ext(priv->phandle, misc->param.keep_alive_rx.src_mac, + src_mac, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + misc->param.keep_alive_rx.pkt_len = + MIN(ip_pkt_len, MKEEP_ALIVE_ACK_PKT_MAX); + moal_memcpy_ext(priv->phandle, misc->param.keep_alive_rx.packet, ip_pkt, + ip_pkt_len, MKEEP_ALIVE_ACK_PKT_MAX); + + status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + +done: + if (status != MLAN_STATUS_PENDING) + kfree(ioctl_req); + + LEAVE(); + return ret; +} + +/** + * @brief Download stop keep alive rx parameters + * + * @param priv Pointer to moal_private structure + * @param mkeep_alive_id keep alive ID number + * @param ip_pkt Last packet + * @param ip_pkt_len Last packet length + + * @return 0: success fail otherwise + */ +int woal_stop_mkeep_alive_rx(moal_private *priv, t_u8 mkeep_alive_id, + t_u8 reset, t_u8 *ip_pkt, t_u8 *pkt_len) +{ + mlan_ioctl_req *ioctl_req = NULL; + mlan_ds_misc_cfg *misc = NULL; + mlan_status status = MLAN_STATUS_SUCCESS; + mlan_ds_misc_keep_alive_rx *misc_keep_alive_rx = NULL; + int ret = 0; + + ENTER(); + + if (!priv || !priv->phandle) { + PRINTM(MERROR, "priv or handle is null\n"); + ret = -EFAULT; + goto done; + } + + ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (ioctl_req == NULL) { + ret = -ENOMEM; + goto done; + } + + misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf; + misc->sub_command = MLAN_OID_MISC_CLOUD_KEEP_ALIVE_RX; + ioctl_req->req_id = MLAN_IOCTL_MISC_CFG; + misc_keep_alive_rx = &misc->param.keep_alive_rx; + + if (mkeep_alive_id >= MAX_KEEP_ALIVE_RX_ID) { + PRINTM(MERROR, "Invalid parameters\n"); + ret = -EFAULT; + goto done; + } + + /* GET operation */ + ioctl_req->action = MLAN_ACT_GET; + misc_keep_alive_rx->mkeep_alive_id = mkeep_alive_id; + misc_keep_alive_rx->enable = false; + + status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + + if (!misc_keep_alive_rx->enable) { + PRINTM(MERROR, "ID %d is already stop\n", mkeep_alive_id); + goto done; + } + + if (reset) + ioctl_req->action = MLAN_ACT_RESET; + else + /* SET operation */ + ioctl_req->action = MLAN_ACT_SET; + misc_keep_alive_rx->mkeep_alive_id = mkeep_alive_id; + misc_keep_alive_rx->enable = false; + + status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + if (pkt_len) { + *pkt_len = MIN(misc_keep_alive_rx->pkt_len, + (MKEEP_ALIVE_ACK_PKT_MAX - 1)); + PRINTM(MINFO, "keep alive rx stop pkt_len is %d\n", *pkt_len); + } + if (*pkt_len && ip_pkt) + moal_memcpy_ext(priv->phandle, ip_pkt, + misc_keep_alive_rx->packet, *pkt_len, *pkt_len); + +done: + if (status != MLAN_STATUS_PENDING) + kfree(ioctl_req); + + LEAVE(); + return ret; +} + +/** + * @brief Save cloud keep alive params in driver handle + * + * @param priv Pointer to moal_private structure + * @params Other params for keep alive + + * @return Number of bytes written, negative for failure. + */ +int woal_priv_save_cloud_keep_alive_params_rx(moal_private *priv, + t_u8 mkeep_alive_id, t_u8 enable, + t_u16 ether_type, t_u8 *ip_pkt, + t_u16 ip_pkt_len, t_u8 *src_mac, + t_u8 *dst_mac) +{ + mlan_ioctl_req *ioctl_req = NULL; + mlan_ds_misc_cfg *misc = NULL; + int ret = 0; + mlan_ds_misc_keep_alive_rx *keep_alive_rx = NULL; + moal_handle *phandle = NULL; + + ENTER(); + + if (!priv || !priv->phandle) { + PRINTM(MERROR, "priv or handle is null\n"); + ret = -EFAULT; + goto done; + } + phandle = priv->phandle; + + ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (ioctl_req == NULL) { + ret = -ENOMEM; + goto done; + } + + misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf; + misc->sub_command = MLAN_OID_MISC_CLOUD_KEEP_ALIVE_RX; + ioctl_req->req_id = MLAN_IOCTL_MISC_CFG; + + if (mkeep_alive_id >= MAX_KEEP_ALIVE_RX_ID) { + PRINTM(MERROR, "Invalid parameters\n"); + ret = -EINVAL; + goto done; + } + + /* GET operation */ + ioctl_req->action = MLAN_ACT_GET; + misc->param.keep_alive_rx.mkeep_alive_id = mkeep_alive_id; + misc->param.keep_alive_rx.enable = true; + + ret = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT); + if (ret != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + + if (misc->param.keep_alive_rx.enable) { + PRINTM(MERROR, "ID %d is in use\n", mkeep_alive_id); + ret = -EINVAL; + goto done; + } + + keep_alive_rx = &phandle->keep_alive_rx[mkeep_alive_id]; + keep_alive_rx->mkeep_alive_id = mkeep_alive_id; + keep_alive_rx->enable = enable; + if (enable) { + keep_alive_rx->cached = true; + moal_memcpy_ext(phandle, keep_alive_rx->dst_mac, dst_mac, + MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + moal_memcpy_ext(phandle, keep_alive_rx->src_mac, src_mac, + MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + keep_alive_rx->pkt_len = + MIN(ip_pkt_len, MKEEP_ALIVE_ACK_PKT_MAX); + moal_memcpy_ext(phandle, keep_alive_rx->packet, ip_pkt, + ip_pkt_len, MKEEP_ALIVE_ACK_PKT_MAX); + if (ether_type) + keep_alive_rx->ether_type = ether_type; + else + keep_alive_rx->ether_type = 0; + } + +done: + if (ret != MLAN_STATUS_PENDING) + kfree(ioctl_req); + + LEAVE(); + return ret; +} + +/** + * @brief Cloud keep alive rx feature + * + * @param priv Pointer to moal_private structure + * @param respbuf Pointer to response buffer + * @param resplen Response buffer length + + * @return Number of bytes written, negative for failure. + */ +static int woal_priv_cloud_keep_alive_rx(moal_private *priv, t_u8 *respbuf, + t_u32 respbuflen) +{ + int ret = 0; + cloud_keep_alive_rx *keep_alive_rx = NULL; + int header_len = 0; + + ENTER(); + + header_len = strlen(PRIV_CMD_CLOUD_KEEP_ALIVE_RX); + + keep_alive_rx = (cloud_keep_alive_rx *)(respbuf + header_len); + + if (keep_alive_rx->enable) { + ret = woal_priv_save_cloud_keep_alive_params_rx( + priv, keep_alive_rx->mkeep_alive_id, + keep_alive_rx->enable, 0, keep_alive_rx->pkt, + keep_alive_rx->pkt_len, keep_alive_rx->src_mac, + keep_alive_rx->dst_mac); + } else { + if (0 != woal_stop_mkeep_alive_rx( + priv, keep_alive_rx->mkeep_alive_id, + keep_alive_rx->reset, keep_alive_rx->pkt, + &keep_alive_rx->pkt_len)) { + ret = -EFAULT; + return ret; + } + ret = respbuflen; + } + + LEAVE(); + return ret; +} + /** * @brief Set/Get static rx abort config * * @param priv A pointer to moal_private structure * @param respbuf A pointer to response buffer * @param respbuflen Available length of response buffer - * + * @return Number of bytes written, negative for failure. */ static int woal_priv_rx_abort_cfg(moal_private *priv, t_u8 *respbuf, @@ -17923,6 +18367,90 @@ done: LEAVE(); return ret; } +/** + * @brief Set/Get static OFDM DESENSE CFG + * + * @param priv A pointer to moal_private structure + * @param respbuf A pointer to response buffer + * @param respbuflen Available length of response buffer + * + * @return Number of bytes written, negative for failure. + */ +static int woal_priv_ofdm_desense_cfg(moal_private *priv, t_u8 *respbuf, + t_u32 respbuflen) +{ + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc = NULL; + int ret = 0; + int data[2] = {0}; + int header_len = 0, user_data_len = 0; + mlan_status status = MLAN_STATUS_SUCCESS; + + ENTER(); + + if (!respbuf) { + PRINTM(MERROR, "response buffer is not available!\n"); + ret = -EINVAL; + goto done; + } + header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_OFDM_DESENSE_CFG); + user_data_len = strlen(respbuf) - header_len; + + /* Allocate an IOCTL request buffer */ + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = -ENOMEM; + goto done; + } + + /* Fill request buffer */ + misc = (mlan_ds_misc_cfg *)req->pbuf; + misc->sub_command = MLAN_OID_MISC_OFDM_DESENSE_CFG; + req->req_id = MLAN_IOCTL_MISC_CFG; + if ((int)strlen(respbuf) == header_len) { + /* GET operation */ + user_data_len = 0; + req->action = MLAN_ACT_GET; + } else { + /* SET operation */ + parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data), + &user_data_len); + if (user_data_len > 2 || + (data[0] == MTRUE && user_data_len != 2)) { + PRINTM(MERROR, "Invalid number of args!\n"); + ret = -EINVAL; + goto done; + } + if (data[0] == MTRUE && data[1] > 0x7f) { + PRINTM(MERROR, "Invalid threshold value\n"); + ret = -EINVAL; + goto done; + } + misc->param.ofdm_desense_cfg.enable = (t_u8)data[0]; + if (user_data_len == 2) + misc->param.ofdm_desense_cfg.cca_threshold = + (t_s8)data[1]; + req->action = MLAN_ACT_SET; + } + /* Send IOCTL request to MLAN */ + status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + + data[0] = misc->param.ofdm_desense_cfg.enable; + data[1] = misc->param.ofdm_desense_cfg.cca_threshold; + moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)data, sizeof(data), + respbuflen); + ret = sizeof(data); +done: + if (status != MLAN_STATUS_PENDING) + kfree(req); + + LEAVE(); + return ret; +} /** * @brief Set/Get dynamic rx abort config @@ -17939,7 +18467,7 @@ static int woal_priv_rx_abort_cfg_ext(moal_private *priv, t_u8 *respbuf, mlan_ioctl_req *req = NULL; mlan_ds_misc_cfg *misc = NULL; int ret = 0; - int data[3] = {0}; + int data[7] = {0}; int header_len = 0, user_data_len = 0; mlan_status status = MLAN_STATUS_SUCCESS; @@ -17972,8 +18500,9 @@ static int woal_priv_rx_abort_cfg_ext(moal_private *priv, t_u8 *respbuf, /* SET operation */ parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data), &user_data_len); - if (user_data_len > 3 || - (data[0] == MTRUE && user_data_len != 3)) { + if (user_data_len > 4 || + ((data[0] == MTRUE && user_data_len != 3) && + (data[0] == MTRUE && user_data_len != 4))) { PRINTM(MERROR, "Invalid number of args!\n"); ret = -EINVAL; goto done; @@ -17984,12 +18513,18 @@ static int woal_priv_rx_abort_cfg_ext(moal_private *priv, t_u8 *respbuf, ret = -EINVAL; goto done; } - if (data[2] > 0x7f) { + if (data[2] > 0x7f && data[2] != 0xff) { PRINTM(MERROR, "Invalid ceil threshold value\n"); ret = -EINVAL; goto done; } + if (data[3] > 0x7f) { + PRINTM(MERROR, + "Invalid floor threshold value\n"); + ret = -EINVAL; + goto done; + } } misc->param.rx_abort_cfg_ext.enable = (t_u8)data[0]; if (user_data_len > 1) { @@ -17997,6 +18532,19 @@ static int woal_priv_rx_abort_cfg_ext(moal_private *priv, t_u8 *respbuf, (t_s8)data[1]; misc->param.rx_abort_cfg_ext.ceil_rssi_threshold = (t_s8)data[2]; + /** not to update floor_rssi_threshold if not included + * in coammnd */ + if (user_data_len == 3) + misc->param.rx_abort_cfg_ext + .floor_rssi_threshold = 0xff; + else + misc->param.rx_abort_cfg_ext + .floor_rssi_threshold = (t_s8)data[3]; + + misc->param.rx_abort_cfg_ext + .current_dynamic_rssi_threshold = 0; + misc->param.rx_abort_cfg_ext.rssi_default_config = 0; + misc->param.rx_abort_cfg_ext.edmac_enable = 0; } req->action = MLAN_ACT_SET; } @@ -18010,6 +18558,11 @@ static int woal_priv_rx_abort_cfg_ext(moal_private *priv, t_u8 *respbuf, data[0] = misc->param.rx_abort_cfg_ext.enable; data[1] = misc->param.rx_abort_cfg_ext.rssi_margin; data[2] = misc->param.rx_abort_cfg_ext.ceil_rssi_threshold; + data[3] = misc->param.rx_abort_cfg_ext.floor_rssi_threshold; + data[4] = misc->param.rx_abort_cfg_ext.current_dynamic_rssi_threshold; + data[5] = misc->param.rx_abort_cfg_ext.rssi_default_config; + data[6] = misc->param.rx_abort_cfg_ext.edmac_enable; + moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)data, sizeof(data), respbuflen); ret = sizeof(data); @@ -18874,7 +19427,6 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } -#define CMD_BUF_LEN 4096 if (priv_cmd.used_len < 0 || priv_cmd.total_len <= 0 || priv_cmd.used_len > priv_cmd.total_len) { PRINTM(MERROR, @@ -19316,6 +19868,14 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_rx_abort_cfg(priv, buf, priv_cmd.total_len); goto handled; + + } else if (strnicmp(buf + strlen(CMD_NXP), + PRIV_CMD_OFDM_DESENSE_CFG, + strlen(PRIV_CMD_OFDM_DESENSE_CFG)) == 0) { + /* OFDM DESENSE config */ + len = woal_priv_ofdm_desense_cfg(priv, buf, + priv_cmd.total_len); + goto handled; } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_TX_AMPDU_PROT_MODE, strlen(PRIV_CMD_TX_AMPDU_PROT_MODE)) == 0) { @@ -19583,8 +20143,8 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_offchannel(priv, buf, priv_cmd.total_len); } else - len = sprintf(buf, - "CFG80211 is not enabled\n") + + len = snprintf(buf, CMD_BUF_LEN, + "CFG80211 is not enabled\n") + 1; goto handled; #endif @@ -19787,6 +20347,12 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_get_ch_load(priv, buf, priv_cmd.total_len); goto handled; + } else if (strnicmp(buf + strlen(CMD_NXP), + PRIV_CMD_CROSS_CHIP_SYNCH, + strlen(PRIV_CMD_CROSS_CHIP_SYNCH)) == 0) { + len = woal_priv_cross_chip_synch(priv, buf, + priv_cmd.total_len); + goto handled; } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_CH_LOAD_RESULTS, strlen(PRIV_CMD_CH_LOAD_RESULTS)) == 0) { @@ -20050,8 +20616,8 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_dfs_offload_enable( priv, buf, priv_cmd.total_len); else - len = sprintf(buf, - "CFG80211 is not enabled\n") + + len = snprintf(buf, CMD_BUF_LEN, + "CFG80211 is not enabled\n") + 1; goto handled; #endif @@ -20120,6 +20686,17 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) priv_cmd.total_len); len += strlen(PRIV_CMD_TWT_TEARDOWN) + strlen(CMD_NXP); goto handled; + + } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_TWT_REPORT, + strlen(PRIV_CMD_TWT_REPORT)) == 0) { + pdata = buf + strlen(CMD_NXP) + + strlen(PRIV_CMD_TWT_REPORT); + len = priv_cmd.used_len - strlen(PRIV_CMD_TWT_REPORT) - + strlen(CMD_NXP); + len = woal_priv_twt_report(priv, pdata, len, + priv_cmd.total_len); + len += strlen(PRIV_CMD_TWT_REPORT) + strlen(CMD_NXP); + goto handled; #if defined(STA_CFG80211) || defined(UAP_CFG80211) } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_GET_CFG_CHAN_LIST, @@ -20129,8 +20706,8 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_getcfgchanlist( priv, buf, priv_cmd.total_len); else - len = sprintf(buf, - "CFG80211 is not enabled\n") + + len = snprintf(buf, CMD_BUF_LEN, + "CFG80211 is not enabled\n") + 1; goto handled; #endif @@ -20171,7 +20748,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SCAN-CFG", strlen("SCAN-CFG")) == 0) { PRINTM(MIOCTL, "Set SCAN CFG\n"); if (MLAN_STATUS_SUCCESS != @@ -20179,7 +20756,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "RSSI", strlen("RSSI")) == 0) { if (MLAN_STATUS_SUCCESS != woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { @@ -20193,11 +20770,12 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "%.32s rssi %d\n", - bss_info.ssid.ssid, signal.bcn_rssi_avg) + + len = snprintf(buf, CMD_BUF_LEN, "%.32s rssi %d\n", + bss_info.ssid.ssid, + signal.bcn_rssi_avg) + 1; } else { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } } else if (strncmp(buf, "LINKSPEED", strlen("LINKSPEED")) == 0) { if (MLAN_STATUS_SUCCESS != @@ -20206,16 +20784,17 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) goto done; } PRINTM(MIOCTL, "tx rate=%d\n", (int)rate.rate); - len = sprintf(buf, "LinkSpeed %d\n", - (int)(rate.rate * 500000 / 1000000)) + + len = snprintf(buf, CMD_BUF_LEN, "LinkSpeed %d\n", + (int)(rate.rate * 500000 / 1000000)) + 1; } else #endif if (strncmp(buf, "MACADDR", strlen("MACADDR")) == 0) { - len = sprintf(buf, "Macaddr = %02X:%02X:%02X:%02X:%02X:%02X\n", - priv->current_addr[0], priv->current_addr[1], - priv->current_addr[2], priv->current_addr[3], - priv->current_addr[4], priv->current_addr[5]) + + len = snprintf(buf, CMD_BUF_LEN, + "Macaddr = %02X:%02X:%02X:%02X:%02X:%02X\n", + priv->current_addr[0], priv->current_addr[1], + priv->current_addr[2], priv->current_addr[3], + priv->current_addr[4], priv->current_addr[5]) + 1; } #ifdef STA_SUPPORT @@ -20225,7 +20804,9 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "powermode = %d\n", power_mode) + 1; + len = snprintf(buf, CMD_BUF_LEN, "powermode = %d\n", + power_mode) + + 1; } else if (strncmp(buf, "SCAN-ACTIVE", strlen("SCAN-ACTIVE")) == 0) { if (MLAN_STATUS_SUCCESS != woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE)) { @@ -20234,7 +20815,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) } priv->scan_type = MLAN_SCAN_TYPE_ACTIVE; PRINTM(MIOCTL, "Set Active Scan\n"); - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SCAN-PASSIVE", strlen("SCAN-PASSIVE")) == 0) { if (MLAN_STATUS_SUCCESS != woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE)) { @@ -20243,7 +20824,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) } priv->scan_type = MLAN_SCAN_TYPE_PASSIVE; PRINTM(MIOCTL, "Set Passive Scan\n"); - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "POWERMODE", strlen("POWERMODE")) == 0) { pdata = buf + strlen("POWERMODE") + 1; if (!moal_extflg_isset(priv->phandle, EXT_HW_TEST)) { @@ -20253,7 +20834,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) goto done; } } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SETROAMING", strlen("SETROAMING")) == 0) { pdata = buf + strlen("SETROAMING") + 1; #ifdef STA_CFG80211 @@ -20271,7 +20852,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) PRINTM(MIOCTL, "Roaming disabled\n"); } #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "ROAM", strlen("ROAM")) == 0) { pdata = buf + strlen("ROAM") + 1; #ifdef STA_CFG80211 @@ -20289,7 +20870,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) PRINTM(MIOCTL, "Roaming disabled\n"); } #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "COUNTRYCODE", strlen("COUNTRYCODE")) == 0) { memset(country_code, 0, sizeof(country_code)); if (MLAN_STATUS_SUCCESS != @@ -20297,7 +20878,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "%s\n", country_code) + 1; + len = snprintf(buf, CMD_BUF_LEN, "%s\n", country_code) + 1; } else if (strncmp(buf, "COUNTRY", strlen("COUNTRY")) == 0) { copy_len = strlen(buf) - strlen("COUNTRY") - 1; if (copy_len > COUNTRY_CODE_LEN || copy_len <= 0) { @@ -20327,7 +20908,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) regulatory_hint(priv->wdev->wiphy, country_code); - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; goto done; } } @@ -20337,7 +20918,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (memcmp(buf, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE) == 0) { PRINTM(MIOCTL, "Set Combo Scan\n"); @@ -20346,38 +20927,38 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "GETBAND", strlen("GETBAND")) == 0) { if (MLAN_STATUS_SUCCESS != woal_get_band(priv, &band)) { ret = -EFAULT; goto done; } - len = sprintf(buf, "Band %d\n", band) + 1; + len = snprintf(buf, CMD_BUF_LEN, "Band %d\n", band) + 1; } else if (strncmp(buf, "SETBAND", strlen("SETBAND")) == 0) { pband = buf + strlen("SETBAND") + 1; if (MLAN_STATUS_SUCCESS != woal_set_band(priv, pband)) { ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #endif else if (strncmp(buf, "START", strlen("START")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "STOP", strlen("STOP")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #ifdef UAP_SUPPORT else if (strncmp(buf, "AP_BSS_START", strlen("AP_BSS_START")) == 0) { ret = woal_uap_bss_ctrl(priv, MOAL_IOCTL_WAIT, UAP_BSS_START); if (ret) goto done; - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "AP_BSS_STOP", strlen("AP_BSS_STOP")) == 0) { ret = woal_uap_bss_ctrl(priv, MOAL_IOCTL_WAIT, UAP_BSS_STOP); if (ret) goto done; - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "AP_SET_CFG", strlen("AP_SET_CFG")) == 0) { if (priv_cmd.total_len <= (int)strlen("AP_SET_CFG") + 1) goto done; @@ -20387,34 +20968,34 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) strlen("AP_SET_CFG") - 1); if (ret) goto done; - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "WL_FW_RELOAD", strlen("WL_FW_RELOAD")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "AP_GET_STA_LIST", strlen("AP_GET_STA_LIST")) == 0) { /* TODO Add STA list support */ - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #endif else if (strncmp(buf, "SETSUSPENDOPT", strlen("SETSUSPENDOPT")) == 0) { /* it will be done by GUI */ - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SETSUSPENDMODE", strlen("SETSUSPENDMODE")) == 0) { /* it will be done by GUI */ - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BTCOEXMODE", strlen("BTCOEXMODE")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BTCOEXSCAN-START", strlen("BTCOEXSCAN-START")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BTCOEXSCAN-STOP", strlen("BTCOEXSCAN-STOP")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #ifdef STA_SUPPORT else if (strncmp(buf, "BGSCAN-START", strlen("BGSCAN-START")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BGSCAN-CONFIG", strlen("BGSCAN-CONFIG")) == 0) { if (MLAN_STATUS_SUCCESS != @@ -20424,7 +21005,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) } priv->bg_scan_start = MTRUE; priv->bg_scan_reported = MFALSE; - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BGSCAN-STOP", strlen("BGSCAN-STOP")) == 0) { if (priv->bg_scan_start && !priv->scan_cfg.rssi_threshold) { if (MLAN_STATUS_FAILURE == @@ -20435,7 +21016,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) priv->bg_scan_start = MFALSE; priv->bg_scan_reported = MFALSE; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "RXFILTER-START", strlen("RXFILTER-START")) == 0) { #ifdef MEF_CFG_RX_FILTER @@ -20443,7 +21024,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) if (ret) goto done; #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "RXFILTER-STOP", strlen("RXFILTER-STOP")) == 0) { #ifdef MEF_CFG_RX_FILTER @@ -20451,7 +21032,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) if (ret) goto done; #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #ifdef STA_CFG80211 else if (strncmp(buf, "GET_EVENT", strlen("GET_EVENT")) == 0) { @@ -20460,10 +21041,12 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) woal_inform_bss_from_scan_result( priv, NULL, MOAL_IOCTL_WAIT); } - len = sprintf(buf, "EVENT=%d\n", priv->last_event) + 1; + len = snprintf(buf, CMD_BUF_LEN, "EVENT=%d\n", + priv->last_event) + + 1; priv->last_event = 0; } else if (strncmp(buf, "GET_802_11W", strlen("GET_802_11W")) == 0) { - len = sprintf(buf, "802_11W=ENABLED\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "802_11W=ENABLED\n") + 1; } #endif /* STA_CFG80211 */ else if (strncmp(buf, "RXFILTER-ADD", strlen("RXFILTER-ADD")) == 0) { @@ -20472,7 +21055,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "RXFILTER-REMOVE", strlen("RXFILTER-REMOVE")) == 0) { pdata = buf + strlen("RXFILTER-REMOVE") + 1; @@ -20480,7 +21063,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "QOSINFO", strlen("QOSINFO")) == 0) { pdata = buf + strlen("QOSINFO") + 1; #ifdef STA_SUPPORT @@ -20490,14 +21073,14 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) goto done; } #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SLEEPPD", strlen("SLEEPPD")) == 0) { pdata = buf + strlen("SLEEPPD") + 1; if (MLAN_STATUS_SUCCESS != woal_set_sleeppd(priv, pdata)) { ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SET_AP_WPS_P2P_IE", strlen("SET_AP_WPS_P2P_IE")) == 0) { pdata = buf + strlen("SET_AP_WPS_P2P_IE") + 1; @@ -20518,7 +21101,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) } #endif #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #endif else if (strncmp(buf, "P2P_DEV_ADDR", strlen("P2P_DEV_ADDR")) == 0) { @@ -20551,7 +21134,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) } #endif #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strnicmp(buf, "SCAN_TIMING", strlen("SCAN_TIMING")) == 0) { #ifdef WIFI_DIRECT_SUPPORT #if defined(STA_CFG80211) || defined(UAP_CFG80211) @@ -20562,7 +21145,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) } #endif #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strnicmp(buf, "BA_WSIZE_RX", strlen("BA_WSIZE_RX")) == 0) { pdata = buf + strlen("BA_WSIZE_RX") + 1; len = priv_cmd.total_len - strlen("BA_WSIZE_RX") - 1; @@ -20571,7 +21154,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strnicmp(buf, "BA_WSIZE_TX", strlen("BA_WSIZE_TX")) == 0) { pdata = buf + strlen("BA_WSIZE_TX") + 1; len = priv_cmd.total_len - strlen("BA_WSIZE_TX") - 1; @@ -20580,7 +21163,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "FAKE_SCAN_COMPLETE", strlen("FAKE_SCAN_COMPLETE")) == 0) { pdata = buf + strlen("FAKE_SCAN_COMPLETE") + 1; @@ -20593,7 +21176,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) PRINTM(MIOCTL, "fake scan complete disabled\n"); } #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #if defined(STA_CFG80211) || defined(UAP_CFG80211) #ifdef WIFI_DIRECT_SUPPORT @@ -20604,13 +21187,13 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } #endif #endif else if (strncmp(buf, "WLS_BATCHING", strlen("WLS_BATCHING")) == 0) { /* TODO */ - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "TDLS_CS_CHAN", strlen("TDLS_CS_CHAN")) == 0) { len = woal_priv_tdls_cs_chan(priv, buf, priv_cmd.total_len); } @@ -20636,6 +21219,10 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) strlen("SETROAMPASSPHRASE")) == 0) { len = woal_priv_set_roam_passphrase(priv, buf, priv_cmd.total_len); + } else if (strncmp(buf, PRIV_CMD_CLOUD_KEEP_ALIVE_RX, + strlen(PRIV_CMD_CLOUD_KEEP_ALIVE_RX)) == 0) { + len = woal_priv_cloud_keep_alive_rx(priv, buf, + priv_cmd.total_len); } else if (strncmp(buf, PRIV_CMD_CLOUD_KEEP_ALIVE, strlen(PRIV_CMD_CLOUD_KEEP_ALIVE)) == 0) { len = woal_priv_cloud_keep_alive(priv, buf, priv_cmd.total_len); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h index 3013769..e9a09b9 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h @@ -4,7 +4,7 @@ * @brief This file contains definition for private IOCTL call. * * - * Copyright 2008-2022 NXP + * Copyright 2008-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -297,11 +297,14 @@ typedef struct _chan_stats { #define PRIV_CMD_STATS "stats" #define PRIV_CMD_CH_LOAD "getchload" #define PRIV_CMD_CH_LOAD_RESULTS "getloadresults" +#define PRIV_CMD_CROSS_CHIP_SYNCH "crosssynch" #define PRIV_CMD_ARB_CFG "arb" /**Private command to configure static rx abort config */ #define PRIV_CMD_RX_ABORT_CFG "rx_abort_cfg" +/**Private command to configure static OFDM DESENSE config */ +#define PRIV_CMD_OFDM_DESENSE_CFG "ofdm_desense_cfg" /**Private command to configure dynamic rx abort config */ #define PRIV_CMD_RX_ABORT_CFG_EXT "rx_abort_cfg_ext" #define TX_AMPDU_RTS_CTS 0 @@ -390,6 +393,8 @@ typedef struct _ssu_params_cfg { #define PRIV_CMD_TWT_SETUP "twt_setup" /** Private command: TWT Teardown Cfg */ #define PRIV_CMD_TWT_TEARDOWN "twt_teardown" +/** Private command: TWT report Cfg */ +#define PRIV_CMD_TWT_REPORT "twt_report" #define PRIV_CMD_LPM "lpm" @@ -684,6 +689,26 @@ typedef struct _cloud_keep_alive { /** packet content */ t_u8 pkt[255]; } __ATTRIB_PACK__ cloud_keep_alive; +/** cloud keep alive parameters */ +#define PRIV_CMD_CLOUD_KEEP_ALIVE_RX "cloud_keep_alive_rx" +typedef struct _cloud_keep_alive_rx { + /** id */ + t_u8 mkeep_alive_id; + /** enable/disable of this id */ + t_u8 enable; + /** enable/disable reset*/ + t_u8 reset; + /** Reserved */ + t_u8 reserved; + /** Destination MAC address */ + t_u8 dst_mac[ETH_ALEN]; + /** Source MAC address */ + t_u8 src_mac[ETH_ALEN]; + /** packet length */ + t_u8 pkt_len; + /** packet content */ + t_u8 pkt[100]; +} __ATTRIB_PACK__ cloud_keep_alive_rx; #define TLV_TYPE_PER_PKT_CFG 0x0001 #define TX_PKT_CTRL MBIT(0) diff --git a/mxm_wifiex/wlan_src/mlinux/moal_init.c b/mxm_wifiex/wlan_src/mlinux/moal_init.c index cdc57a3..71b087f 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_init.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_init.c @@ -136,7 +136,7 @@ static int slew_rate = 3; int tx_work = 0; #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) /** * RPS to steer packets to specific CPU * Default value of 0 keeps rps disabled by default @@ -161,6 +161,8 @@ static int pmqos = 0; static int chan_track = 0; static int mcs32 = 1; +/** hs_auto_arp setting */ +static int hs_auto_arp = 0; #if defined(STA_SUPPORT) /** 802.11d configuration */ @@ -287,6 +289,19 @@ static t_u16 multi_dtim; static t_u16 inact_tmo; +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) +/* default filter flag 0x27 Stands for + (MLAN_NETMON_NON_BSS_BCN | \ + MLAN_NETMON_DATA | \ + MLAN_NETMON_CONTROL | \ + MLAN_NETMON_MANAGEMENT) +*/ +#define DEFAULT_NETMON_FILTER 0x27 +static int mon_filter = DEFAULT_NETMON_FILTER; +#endif +#endif + #ifdef DEBUG_LEVEL1 #ifdef DEBUG_LEVEL2 #define DEFAULT_DEBUG_MASK (0xffffffff) @@ -328,9 +343,10 @@ static card_type_entry card_type_map_tbl[] = { #ifdef SD9177 {CARD_TYPE_SD9177, 0, CARD_SD9177}, #endif -#ifdef SDNW62X - {CARD_TYPE_SDNW62X, 0, CARD_SDNW62X}, +#ifdef SDIW62X + {CARD_TYPE_SDIW62X, 0, CARD_SDIW62X}, #endif + {CARD_TYPE_SDAW693, 0, CARD_SDAW693}, #ifdef PCIE8897 {CARD_TYPE_PCIE8897, 0, CARD_PCIE8897}, #endif @@ -343,8 +359,9 @@ static card_type_entry card_type_map_tbl[] = { #ifdef PCIE9098 {CARD_TYPE_PCIE9098, 0, CARD_PCIE9098}, #endif -#ifdef PCIENW62X - {CARD_TYPE_PCIENW62X, 0, CARD_PCIENW62X}, + {CARD_TYPE_PCIEAW693, 0, CARD_PCIEAW693}, +#ifdef PCIEIW62X + {CARD_TYPE_PCIEIW62X, 0, CARD_PCIEIW62X}, #endif #ifdef USB8801 {CARD_TYPE_USB8801, 0, CARD_USB8801}, @@ -365,8 +382,8 @@ static card_type_entry card_type_map_tbl[] = { #ifdef USB9097 {CARD_TYPE_USB9097, 0, CARD_USB9097}, #endif -#ifdef USBNW62X - {CARD_TYPE_USBNW62X, 0, CARD_USBNW62X}, +#ifdef USBIW62X + {CARD_TYPE_USBIW62X, 0, CARD_USBIW62X}, #endif }; @@ -374,7 +391,7 @@ static card_type_entry card_type_map_tbl[] = { static int dfs53cfg = DFS_W53_DEFAULT_FW; static int keep_previous_scan = 1; - +static int auto_11ax = 1; /** * @brief This function read a line in module parameter file * @@ -390,7 +407,8 @@ static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos) ENTER(); - if (pos >= (t_s32)size) { /* reach the end */ + if ((pos >= (t_s32)size) || (data == NULL) || + (line_pos == NULL)) { /* reach the end */ pos = 0; /* Reset position for rfkill */ LEAVE(); return -1; @@ -535,7 +553,7 @@ static mlan_status parse_line_read_card_info(t_u8 *line, char **type, *p = '\0'; p = strstr(line, "_"); - if (p != NULL) { + if ((p != NULL) && ((p + 1) != NULL)) { *p++ = '\0'; *if_id = p; } else { @@ -683,6 +701,18 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size, params->drv_mode = out_data; PRINTM(MMSG, "drv_mode = %d\n", params->drv_mode); } +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + else if (strncmp(line, "mon_filter", strlen("mon_filter")) == + 0) { + if (parse_line_read_int(line, &out_data) != + MLAN_STATUS_SUCCESS) + goto err; + params->mon_filter = out_data; + PRINTM(MMSG, "mon_filter = %d\n", params->mon_filter); + } +#endif +#endif #ifdef DEBUG_LEVEL1 else if (strncmp(line, "drvdbg", strlen("drvdbg")) == 0) { if (parse_line_read_int(line, &out_data) != @@ -1210,7 +1240,7 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size, "off"); } #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) else if (strncmp(line, "rps", strlen("rps")) == 0) { if (parse_line_read_int(line, &out_data) != MLAN_STATUS_SUCCESS) @@ -1380,6 +1410,13 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size, goto err; params->mcs32 = out_data; PRINTM(MMSG, "mcs32=%d\n", params->mcs32); + } else if (strncmp(line, "hs_auto_arp", + strlen("hs_auto_arp")) == 0) { + if (parse_line_read_int(line, &out_data) != + MLAN_STATUS_SUCCESS) + goto err; + params->hs_auto_arp = out_data; + PRINTM(MMSG, "hs_auto_arp=%d\n", params->hs_auto_arp); } #if defined(STA_CFG80211) || defined(UAP_CFG80211) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) @@ -1423,6 +1460,13 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size, params->keep_previous_scan = out_data; PRINTM(MMSG, "keep_previous_scan=%d\n", params->keep_previous_scan); + } else if (strncmp(line, "auto_11ax", strlen("auto_11ax")) == + 0) { + if (parse_line_read_int(line, &out_data) != + MLAN_STATUS_SUCCESS) + goto err; + params->auto_11ax = out_data; + PRINTM(MMSG, "auto_11ax=%d\n", params->auto_11ax); } } if (end) @@ -1488,6 +1532,13 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params) handle->params.drv_mode = drv_mode; if (params) handle->params.drv_mode = params->drv_mode; +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + handle->params.mon_filter = mon_filter; + if (params) + handle->params.mon_filter = params->mon_filter; +#endif +#endif #ifdef DEBUG_LEVEL1 handle->params.drvdbg = drvdbg; if (params) @@ -1516,6 +1567,11 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params) handle->params.mcs32 = params->mcs32; } #endif /* UAP_SUPPORT */ + + handle->params.hs_auto_arp = hs_auto_arp; + if (params) { + handle->params.hs_auto_arp = params->hs_auto_arp; + } #ifdef WIFI_DIRECT_SUPPORT handle->params.max_wfd_bss = max_wfd_bss; woal_dup_string(&handle->params.wfd_name, wfd_name); @@ -1694,7 +1750,7 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params) moal_extflg_set(handle, EXT_TX_WORK); #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) handle->params.rps = rps & RPS_CPU_MASK; PRINTM(MMSG, "rps set to %x from module param\n", handle->params.rps); #endif @@ -1764,6 +1820,7 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params) handle->params.dfs53cfg = params->dfs53cfg; } handle->params.keep_previous_scan = keep_previous_scan; + handle->params.auto_11ax = auto_11ax; } /** @@ -1850,6 +1907,7 @@ static mlan_status woal_req_mod_param(moal_handle *handle, char *mod_file) { mlan_status ret = MLAN_STATUS_SUCCESS; struct device *dev = handle->hotplug_device; + int status; if (dev == NULL) { PRINTM(MERROR, "No device attached\n"); @@ -1857,10 +1915,12 @@ static mlan_status woal_req_mod_param(moal_handle *handle, char *mod_file) goto out; } - ret = request_firmware(&handle->param_data, mod_file, dev); - if (ret < 0) + status = request_firmware(&handle->param_data, mod_file, dev); + if (status < 0) { PRINTM(MERROR, "Request firmware: %s failed, error: %d\n", mod_file, ret); + ret = MLAN_STATUS_FAILURE; + } out: return ret; } @@ -1935,7 +1995,7 @@ void woal_init_from_dev_tree(void) } } #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) else if (!strncmp(prop->name, "rps", strlen("rps"))) { if (!of_property_read_u32(dt_node, prop->name, &data)) { PRINTM(MIOCTL, "rps=0x%x\n", data); @@ -1961,6 +2021,14 @@ void woal_init_from_dev_tree(void) mcs32 = data; } } + + else if (!strncmp(prop->name, "hs_auto_arp", + strlen("hs_auto_arp"))) { + if (!of_property_read_u32(dt_node, prop->name, &data)) { + PRINTM(MIOCTL, "hs_auto_arp=0x%x\n", data); + hs_auto_arp = data; + } + } #ifdef MFG_CMD_SUPPORT else if (!strncmp(prop->name, "mfg_mode", strlen("mfg_mode"))) { if (!of_property_read_u32(dt_node, prop->name, &data)) { @@ -2274,7 +2342,24 @@ void woal_init_from_dev_tree(void) data); keep_previous_scan = data; } + } else if (!strncmp(prop->name, "auto_11ax", + strlen("auto_11ax"))) { + if (!of_property_read_u32(dt_node, prop->name, &data)) { + PRINTM(MERROR, "auto_11ax=0x%x\n", data); + auto_11ax = data; + } } +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + else if (!strncmp(prop->name, "mon_filter", + strlen("mon_filter"))) { + if (!of_property_read_u32(dt_node, prop->name, &data)) { + PRINTM(MERROR, "mon_filter=0x%x\n", data); + mon_filter = data; + } + } +#endif +#endif } LEAVE(); return; @@ -2417,7 +2502,8 @@ mlan_status woal_init_module_param(moal_handle *handle) if (blk_id == NULL) handle->blk_id = 0; else - woal_atoi(&handle->blk_id, blk_id); + (void)woal_atoi(&handle->blk_id, + blk_id); PRINTM(MINFO, "Validation check, %s, config block: %d\n", card_type, handle->blk_id); @@ -2450,7 +2536,7 @@ out: if (handle->param_data) { release_firmware(handle->param_data); /* rewind pos */ - parse_cfg_get_line(NULL, 0, NULL); + (void)parse_cfg_get_line(NULL, 0, NULL); } if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Invalid block: %s\n", line); @@ -2481,8 +2567,13 @@ module_param(fw_reload, int, 0); MODULE_PARM_DESC(fw_reload, "0: disable fw_reload; 1: enable fw reload feature"); module_param(auto_fw_reload, int, 0); +#ifdef PCIE MODULE_PARM_DESC(auto_fw_reload, - "0: disable auto_fw_reload; 1: enable auto fw reload feature"); + "BIT0: enable auto fw_reload; BIT1:enable PCIe in-band reset"); +#else +MODULE_PARM_DESC(auto_fw_reload, "BIT0: enable auto fw_reload"); +#endif + module_param(fw_serial, int, 0); MODULE_PARM_DESC( fw_serial, @@ -2582,7 +2673,7 @@ MODULE_PARM_DESC( module_param(tx_work, uint, 0660); MODULE_PARM_DESC(tx_work, "1: Enable tx_work; 0: Disable tx_work"); #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) module_param(rps, uint, 0660); MODULE_PARM_DESC( rps, @@ -2596,6 +2687,8 @@ module_param(pmqos, uint, 0660); MODULE_PARM_DESC(pmqos, "1: Enable pmqos; 0: Disable pmqos"); module_param(mcs32, uint, 0660); MODULE_PARM_DESC(mcs32, "1: Enable mcs32; 0: Disable mcs32"); +module_param(hs_auto_arp, uint, 0660); +MODULE_PARM_DESC(hs_auto_arp, "1: Enable hs_auto_arp; 0: Disable hs_auto_arp"); module_param(dpd_data_cfg, charp, 0); MODULE_PARM_DESC(dpd_data_cfg, "DPD data file name"); @@ -2799,3 +2892,15 @@ module_param(keep_previous_scan, int, 0); MODULE_PARM_DESC( keep_previous_scan, "1: keep previous scan result; 0: flush previous scan result before start scan "); + +module_param(auto_11ax, int, 0); +MODULE_PARM_DESC(auto_11ax, "1: enable auto_11ax; 0: disable auto_11ax "); + +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) +module_param(mon_filter, int, 0); +MODULE_PARM_DESC( + mon_filter, + "Bit6:TX frames excluding control; Bit5:non-bss beacons; Bit3:unicast destined non-promiscuous frames only; Bit2:data frames; Bit1:control frames; Bit0:management frames"); +#endif +#endif diff --git a/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c b/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c index 848bfea..4fc7873 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c @@ -269,7 +269,9 @@ t_u8 woal_get_second_channel_offset(moal_private *priv, int chan) memset(&bss_info, 0, sizeof(bss_info)); /* Special Case: 20Mhz-only Channel */ - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) + return chan2Offset; if (bss_info.region_code != COUNTRY_CODE_US && chan == 165) return chan2Offset; @@ -3618,6 +3620,8 @@ mlan_status woal_cancel_hs(moal_private *priv, t_u8 wait_option) #endif ENTER(); + memset(&hscfg, 0, sizeof(mlan_ds_hs_cfg)); + if (!priv) { LEAVE(); return MLAN_STATUS_FAILURE; @@ -3862,6 +3866,7 @@ int woal_enable_hs(moal_private *priv) mlan_ds_ps_info pm_info; #endif pmlan_ds_misc_keep_alive keep_alive = NULL; + pmlan_ds_misc_keep_alive_rx keep_alive_rx = NULL; t_u8 media_connected = MFALSE; ENTER(); @@ -3883,8 +3888,13 @@ int woal_enable_hs(moal_private *priv) EXT_DISCONNECT_ON_SUSPEND) && handle->priv[i]->media_connected == MTRUE) { PRINTM(MIOCTL, "disconnect on suspend\n"); - woal_disconnect(handle->priv[i], MOAL_NO_WAIT, - NULL, DEF_DEAUTH_REASON_CODE); + if (MLAN_STATUS_SUCCESS != + woal_disconnect(handle->priv[i], + MOAL_NO_WAIT, NULL, + DEF_DEAUTH_REASON_CODE)) { + PRINTM(MIOCTL, + "disconnect on suspend failed\n"); + } } } if (handle->priv[i]) { @@ -3905,10 +3915,12 @@ int woal_enable_hs(moal_private *priv) moal_private *remain_priv = priv->phandle->priv[priv->phandle->remain_bss_index]; if (remain_priv) { - woal_cfg80211_remain_on_channel_cfg(remain_priv, - MOAL_NO_WAIT, MTRUE, - &channel_status, - NULL, 0, 0); + if (woal_cfg80211_remain_on_channel_cfg( + remain_priv, MOAL_NO_WAIT, MTRUE, + &channel_status, NULL, 0, 0)) { + PRINTM(MIOCTL, + "Failed to cancel pending remain on channel\n"); + } if (priv->phandle->cookie) { cfg80211_remain_on_channel_expired( #if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 6, 0) @@ -4012,6 +4024,21 @@ int woal_enable_hs(moal_private *priv) memset(keep_alive->packet, 0, MKEEP_ALIVE_IP_PKT_MAX); } } + for (i = 0; i < MAX_KEEP_ALIVE_RX_ID; i++) { + keep_alive_rx = &handle->keep_alive_rx[i]; + if (keep_alive_rx && keep_alive_rx->cached && + keep_alive_rx->enable) { + keep_alive_rx->cached = MFALSE; + woal_start_mkeep_alive_rx( + woal_get_priv(handle, MLAN_BSS_ROLE_ANY), + keep_alive_rx->mkeep_alive_id, + keep_alive_rx->packet, keep_alive_rx->pkt_len, + keep_alive_rx->src_mac, keep_alive_rx->dst_mac); + keep_alive_rx->pkt_len = 0; + memset(keep_alive_rx->packet, 0, + MKEEP_ALIVE_ACK_PKT_MAX); + } + } /* Enable Host Sleep */ handle->hs_activate_wait_q_woken = MFALSE; memset(&hscfg, 0, sizeof(mlan_ds_hs_cfg)); @@ -6084,6 +6111,8 @@ int woal_find_essid(moal_private *priv, mlan_ssid_bssid *ssid_bssid, wifi_timeval t; ENTER(); + memset(&scan_resp, 0, sizeof(scan_resp)); + if (MLAN_STATUS_SUCCESS != woal_get_scan_table(priv, wait_option, &scan_resp)) { LEAVE(); @@ -6422,7 +6451,12 @@ void woal_config_bgscan_and_rssi(moal_private *priv, t_u8 set_rssi) return; } memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MIOCTL, "Get BSS Info Failed\n"); + LEAVE(); + return; + } if (!bss_info.media_connected) { PRINTM(MIOCTL, "We already lost connection\n"); LEAVE(); @@ -6487,15 +6521,20 @@ void woal_config_bgscan_and_rssi(moal_private *priv, t_u8 set_rssi) */ mlan_status woal_stop_bg_scan(moal_private *priv, t_u8 wait_option) { - wlan_bgscan_cfg scan_cfg; + wlan_bgscan_cfg *scan_cfg; mlan_status ret = MLAN_STATUS_SUCCESS; ENTER(); - memset(&scan_cfg, 0, sizeof(scan_cfg)); - scan_cfg.action = BG_SCAN_ACT_SET; - scan_cfg.enable = MFALSE; - ret = woal_request_bgscan(priv, wait_option, &scan_cfg); - + scan_cfg = kmalloc(sizeof(wlan_bgscan_cfg), GFP_KERNEL); + if (!scan_cfg) { + LEAVE(); + return ret; + } + memset(scan_cfg, 0, sizeof(wlan_bgscan_cfg)); + scan_cfg->action = BG_SCAN_ACT_SET; + scan_cfg->enable = MFALSE; + ret = woal_request_bgscan(priv, wait_option, scan_cfg); + kfree(scan_cfg); LEAVE(); return ret; } @@ -6599,8 +6638,7 @@ mlan_status woal_set_rssi_threshold(moal_private *priv, t_u32 event_id, mlan_ds_misc_cfg *misc = NULL; ENTER(); - if (priv->media_connected == MFALSE) - goto done; + if (priv->mrvl_rssi_low || !priv->cqm_rssi_thold) goto done; if (event_id == MLAN_EVENT_ID_FW_BCN_RSSI_LOW) { @@ -7730,6 +7768,279 @@ done: return ret; } +/** + * @brief config RTT to mlan layer + * + * @param priv A pointer to moal_private structure + * @param ch_info A pointer to wifi_channel_info + * @param bandcfg A pointer to Band_Config_t + * + * @return void + */ +void woal_channel_info_to_bandcfg(moal_private *priv, + wifi_channel_info *ch_info, + Band_Config_t *bandcfg) +{ + t_u8 channel = 0; + + if (!ch_info || !bandcfg) + return; +#if defined(STA_CFG80211) || defined(UAP_CFG80211) + channel = ieee80211_frequency_to_channel(ch_info->center_freq); +#endif + + switch (ch_info->width) { + case WIFI_CHAN_WIDTH_10: + bandcfg->chanWidth = CHAN_BW_10MHZ; + break; + case WIFI_CHAN_WIDTH_20: + bandcfg->chanWidth = CHAN_BW_20MHZ; + break; + case WIFI_CHAN_WIDTH_40: + bandcfg->chanWidth = CHAN_BW_40MHZ; + break; + case WIFI_CHAN_WIDTH_80: + bandcfg->chanWidth = CHAN_BW_80MHZ; + break; + default: + bandcfg->chanWidth = CHAN_BW_20MHZ; + break; + } + bandcfg->chan2Offset = SEC_CHAN_NONE; + if (bandcfg->chanWidth == CHAN_BW_40MHZ) { + if (ch_info->center_freq0 < ch_info->center_freq) + bandcfg->chan2Offset = SEC_CHAN_BELOW; + else + bandcfg->chan2Offset = SEC_CHAN_ABOVE; + } else if (bandcfg->chanWidth == CHAN_BW_80MHZ) + bandcfg->chan2Offset = + woal_get_second_channel_offset(priv, channel); + bandcfg->chanBand = (channel <= MAX_BG_CHANNEL) ? BAND_2GHZ : BAND_5GHZ; + bandcfg->scanMode = SCAN_MODE_MANUAL; + + return; +} + +/** + * @brief config RTT to mlan layer + * + * @param priv A pointer to moal_private structure + * @param ch_info A pointer to wifi_channel_info + * @param bandcfg A pointer to Band_Config_t + * + * @return void + */ +void woal_bandcfg_to_channel_info(moal_private *priv, Band_Config_t *bandcfg, + t_u8 channel, wifi_channel_info *ch_info) +{ + if (!ch_info || !bandcfg) + return; +#if defined(STA_CFG80211) || defined(UAP_CFG80211) + ch_info->center_freq = ieee80211_channel_to_frequency( + channel, (channel <= MAX_BG_CHANNEL) ? NL80211_BAND_2GHZ : + NL80211_BAND_5GHZ); +#endif + + switch (bandcfg->chanWidth) { + case CHAN_BW_10MHZ: + ch_info->width = WIFI_CHAN_WIDTH_10; + break; + case CHAN_BW_20MHZ: + ch_info->width = WIFI_CHAN_WIDTH_20; + break; + case CHAN_BW_40MHZ: + ch_info->width = WIFI_CHAN_WIDTH_40; + break; + case CHAN_BW_80MHZ: + ch_info->width = WIFI_CHAN_WIDTH_80; + break; + default: + ch_info->width = WIFI_CHAN_WIDTH_20; + break; + } + + return; +} + +/** + * @brief config RTT to mlan layer + * + * @param priv A pointer to moal_private structure + * @param wait_option wait option + * @param hotspotcfg A pointer to rtt_config_params_t + * + * @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING -- success, + * otherwise fail + */ +mlan_status woal_config_rtt(moal_private *priv, t_u8 wait_option, + wifi_rtt_config_params_t *rtt_params_in) +{ + mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc = NULL; + mlan_rtt_config_params *rtt_params = NULL; + t_u32 i = 0; + + ENTER(); + + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = MLAN_STATUS_FAILURE; + goto done; + } + + req->action = MLAN_ACT_SET; + req->req_id = MLAN_IOCTL_MISC_CFG; + + misc = (mlan_ds_misc_cfg *)req->pbuf; + misc->sub_command = MLAN_OID_MISC_CONFIG_RTT; + rtt_params = &(misc->param.rtt_params); + rtt_params->rtt_config_num = rtt_params_in->rtt_config_num; + for (i = 0; i < MIN(rtt_params->rtt_config_num, MAX_RTT_CONFIG_NUM); + i++) { + moal_memcpy_ext(priv->phandle, rtt_params->rtt_config[i].addr, + rtt_params_in->rtt_config[i].addr, + sizeof(rtt_params->rtt_config[i].addr), + sizeof(rtt_params->rtt_config[i].addr)); + rtt_params->rtt_config[i].type = + rtt_params_in->rtt_config[i].type; + rtt_params->rtt_config[i].peer = + rtt_params_in->rtt_config[i].peer; +#if defined(STA_CFG80211) || defined(UAP_CFG80211) + rtt_params->rtt_config[i] + .channel = ieee80211_frequency_to_channel( + rtt_params_in->rtt_config[i].channel.center_freq); +#endif + woal_channel_info_to_bandcfg( + priv, &(rtt_params_in->rtt_config[i].channel), + &(rtt_params->rtt_config[i].bandcfg)); + rtt_params->rtt_config[i].burst_period = + rtt_params_in->rtt_config[i].burst_period; + rtt_params->rtt_config[i].num_burst = + rtt_params_in->rtt_config[i].num_burst; + rtt_params->rtt_config[i].num_frames_per_burst = + rtt_params_in->rtt_config[i].num_frames_per_burst; + rtt_params->rtt_config[i].num_retries_per_rtt_frame = + rtt_params_in->rtt_config[i].num_retries_per_rtt_frame; + rtt_params->rtt_config[i].num_retries_per_ftmr = + rtt_params_in->rtt_config[i].num_retries_per_ftmr; + rtt_params->rtt_config[i].LCI_request = + rtt_params_in->rtt_config[i].LCI_request; + rtt_params->rtt_config[i].LCR_request = + rtt_params_in->rtt_config[i].LCR_request; + rtt_params->rtt_config[i].burst_duration = + rtt_params_in->rtt_config[i].burst_duration; + rtt_params->rtt_config[i].preamble = + rtt_params_in->rtt_config[i].preamble; + rtt_params->rtt_config[i].bw = rtt_params_in->rtt_config[i].bw; + } + + ret = woal_request_ioctl(priv, req, wait_option); + if (ret != MLAN_STATUS_SUCCESS) + goto done; + +done: + if (ret != MLAN_STATUS_PENDING) + kfree(req); + LEAVE(); + return ret; +} + +/** + * @brief cancel RTT to mlan layer + * + * @param priv A pointer to moal_private structure + * @param wait_option wait option + * @param hotspotcfg A pointer to rtt_config_params_t + * + * @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING -- success, + * otherwise fail + */ +mlan_status woal_cancel_rtt(moal_private *priv, t_u8 wait_option, + t_u32 addr_num, t_u8 addr[][MLAN_MAC_ADDR_LENGTH]) +{ + mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc = NULL; + mlan_rtt_cancel_params *rtt_cancel = NULL; + + ENTER(); + + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = MLAN_STATUS_FAILURE; + goto done; + } + + req->action = MLAN_ACT_SET; + req->req_id = MLAN_IOCTL_MISC_CFG; + + misc = (mlan_ds_misc_cfg *)req->pbuf; + misc->sub_command = MLAN_OID_MISC_CANCEL_RTT; + rtt_cancel = &(misc->param.rtt_cancel); + rtt_cancel->rtt_cancel_num = addr_num; + moal_memcpy_ext(priv->phandle, rtt_cancel->rtt_cancel, addr, + sizeof(rtt_cancel->rtt_cancel[0]) * + rtt_cancel->rtt_cancel_num, + sizeof(rtt_cancel->rtt_cancel[0]) * MAX_RTT_CONFIG_NUM); + ret = woal_request_ioctl(priv, req, wait_option); + if (ret != MLAN_STATUS_SUCCESS) + goto done; + +done: + if (ret != MLAN_STATUS_PENDING) + kfree(req); + LEAVE(); + return ret; +} + +/** + * @brief cancel RTT to mlan layer + * + * @param priv A pointer to moal_private structure + * @param wait_option wait option + * @param hotspotcfg A pointer to rtt_config_params_t + * + * @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING -- success, + * otherwise fail + */ +mlan_status woal_rtt_responder_cfg(moal_private *priv, t_u8 wait_option, + mlan_rtt_responder *rtt_rsp_cfg) +{ + mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc = NULL; + + ENTER(); + + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = MLAN_STATUS_FAILURE; + goto done; + } + + req->action = MLAN_ACT_SET; + req->req_id = MLAN_IOCTL_MISC_CFG; + + misc = (mlan_ds_misc_cfg *)req->pbuf; + misc->sub_command = MLAN_OID_MISC_RTT_RESPONDER_CFG; + moal_memcpy_ext(priv->phandle, &(misc->param.rtt_rsp_cfg), rtt_rsp_cfg, + sizeof(misc->param.rtt_rsp_cfg), + sizeof(misc->param.rtt_rsp_cfg)); + + ret = woal_request_ioctl(priv, req, wait_option); + if (ret != MLAN_STATUS_SUCCESS) + goto done; + moal_memcpy_ext(priv->phandle, rtt_rsp_cfg, &(misc->param.rtt_rsp_cfg), + sizeof(*rtt_rsp_cfg), sizeof(*rtt_rsp_cfg)); + +done: + if (ret != MLAN_STATUS_PENDING) + kfree(req); + LEAVE(); + return ret; +} + /** * @brief Send 11d enable/disable command to firmware. * @@ -7944,9 +8255,10 @@ static int parse_tx_pwr_string(moal_handle *handle, const char *s, size_t len, d->data3 = (t_u32)woal_string_to_number(pos); #ifdef SD9177 - if (((!fc_card) && (d->data1 > 24)) || (d->data2 > 2)) + if (((!fc_card) && ((d->data1 > 24) && (d->data1 != 0xffffffff))) || + (d->data2 > 2)) #else - if ((d->data1 > 24) || (d->data2 > 2)) + if (((d->data1 > 24) && (d->data1 != 0xffffffff)) || (d->data2 > 2)) #endif ret = -EINVAL; @@ -8383,6 +8695,7 @@ static int parse_he_tb_tx_string(const char *s, size_t len, int ret = MLAN_STATUS_SUCCESS; char *string = NULL; char *pos = NULL; + char *tmp = NULL; gfp_t flag; ENTER(); @@ -8398,6 +8711,7 @@ static int parse_he_tb_tx_string(const char *s, size_t len, moal_memcpy_ext(NULL, string, s + strlen("he_tb_tx="), len - strlen("he_tb_tx="), HE_TB_TX_STR_LEN - 1); + tmp = string; pos = strsep(&string, " \t"); if (pos) d->enable = (t_u32)woal_string_to_number(pos); @@ -8424,7 +8738,7 @@ static int parse_he_tb_tx_string(const char *s, size_t len, ret = -EINVAL; done: - kfree(string); + kfree(tmp); LEAVE(); return ret; } diff --git a/mxm_wifiex/wlan_src/mlinux/moal_main.c b/mxm_wifiex/wlan_src/mlinux/moal_main.c index 8d3c16d..0286c43 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_main.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_main.c @@ -437,8 +437,8 @@ static struct _card_info card_info_SD9097 = { }; #endif -#ifdef SDNW62X -static struct _card_info card_info_SDNW62X = { +#ifdef SDIW62X +static struct _card_info card_info_SDIW62X = { .embedded_supp = 1, .drcs = 1, .go_noa = 1, @@ -453,8 +453,8 @@ static struct _card_info card_info_SDNW62X = { .rev_id_reg = 0xc8, .host_strap_reg = 0xf4, .magic_reg = 0xf0, - .fw_name = SDNW62X_DEFAULT_COMBO_FW_NAME, - .fw_name_wlan = SDNW62X_DEFAULT_WLAN_FW_NAME, + .fw_name = SDIW62X_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = SDIW62X_DEFAULT_WLAN_FW_NAME, #ifdef SDIO .dump_fw_info = DUMP_FW_SDIO_V3, .dump_fw_ctrl_reg = 0xf9, @@ -477,6 +477,44 @@ static struct _card_info card_info_SDNW62X = { }; #endif +static struct _card_info card_info_SDAW693 = { + .embedded_supp = 1, + .drcs = 1, + .go_noa = 1, + .v16_fw_api = 1, + .v17_fw_api = 1, + .pmic = 1, + .cal_data_cfg = 0, + .low_power_enable = 0, + .rx_rate_max = 412, + .histogram_table_num = 3, + .feature_control = FEATURE_CTRL_DEFAULT, + .rev_id_reg = 0xc8, + .host_strap_reg = 0xf4, + .magic_reg = 0xf0, + .fw_name = SDAW693_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = SDAW693_DEFAULT_WLAN_FW_NAME, +#ifdef SDIO + .dump_fw_info = DUMP_FW_SDIO_V3, + .dump_fw_ctrl_reg = 0xf9, + .dump_fw_start_reg = 0xf1, + .dump_fw_end_reg = 0xf8, + .dump_fw_host_ready = 0xcc, + .dump_reg.reg_table = {0x08, 0x58, 0x5C, 0x5D, 0x60, 0x61, 0x62, 0x64, + 0x65, 0x66, 0x68, 0x69, 0x6a}, + .dump_reg.reg_table_size = 13, + .scratch_reg = 0xe8, + .func1_reg_start = 0x10, + .func1_reg_end = 0x17, + .fw_reset_reg = 0x0EE, + .fw_reset_val = 0x99, + .slew_rate_reg = 0x90002328, + .slew_rate_bit_offset = 12, +#endif + .sniffer_support = 1, + .per_pkt_cfg_support = 1, +}; + #ifdef SD9177 static struct _card_info card_info_SD9177 = { .embedded_supp = 1, @@ -557,6 +595,8 @@ static struct _card_info card_info_PCIE9097 = { .magic_reg = 0x1c74, .fw_name = PCIE9097_DEFAULT_COMBO_FW_NAME, .fw_name_wlan = PCIE9097_DEFAULT_WLAN_FW_NAME, + .fw_reset_reg = 0x1c94, + .fw_reset_val = 0x98, .sniffer_support = 1, .per_pkt_cfg_support = 1, }; @@ -580,13 +620,15 @@ static struct _card_info card_info_PCIE9098 = { .magic_reg = 0x1c74, .fw_name = PCIE9098_DEFAULT_COMBO_FW_NAME, .fw_name_wlan = PCIE9098_DEFAULT_WLAN_FW_NAME, + .fw_reset_reg = 0x1c94, + .fw_reset_val = 0x98, .sniffer_support = 1, .per_pkt_cfg_support = 1, }; #endif -#ifdef PCIENW62X -static struct _card_info card_info_PCIENW62X = { +#ifdef PCIEIW62X +static struct _card_info card_info_PCIEIW62X = { .embedded_supp = 1, .drcs = 1, .go_noa = 1, @@ -601,13 +643,39 @@ static struct _card_info card_info_PCIENW62X = { .rev_id_reg = 0x8, .host_strap_reg = 0x1c70, .magic_reg = 0x1c74, - .fw_name = PCIENW62X_DEFAULT_COMBO_FW_NAME, - .fw_name_wlan = PCIENW62X_DEFAULT_WLAN_FW_NAME, + .boot_mode_reg = 0x1c8c, + .fw_name = PCIEIW62X_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = PCIEIW62X_DEFAULT_WLAN_FW_NAME, + .fw_reset_reg = 0x1c94, + .fw_reset_val = 0x98, .sniffer_support = 1, .per_pkt_cfg_support = 1, }; #endif +static struct _card_info card_info_PCIEAW693 = { + .embedded_supp = 1, + .drcs = 1, + .go_noa = 1, + .v16_fw_api = 1, + .v17_fw_api = 1, + .pmic = 1, + .cal_data_cfg = 0, + .low_power_enable = 0, + .rx_rate_max = 412, + .histogram_table_num = 3, + .feature_control = FEATURE_CTRL_DEFAULT, + .rev_id_reg = 0x8, + .host_strap_reg = 0x1c70, + .magic_reg = 0x1c74, + .fw_name = PCIEAW693_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = PCIEAW693_DEFAULT_WLAN_FW_NAME, + .fw_reset_reg = 0x1c94, + .fw_reset_val = 0x98, + .sniffer_support = 1, + .per_pkt_cfg_support = 1, +}; + #ifdef USB8801 static struct _card_info card_info_USB8801 = { .embedded_supp = 0, @@ -707,8 +775,8 @@ static struct _card_info card_info_USB9097 = { }; #endif -#ifdef USBNW62X -static struct _card_info card_info_USBNW62X = { +#ifdef USBIW62X +static struct _card_info card_info_USBIW62X = { .embedded_supp = 1, .drcs = 1, .go_noa = 1, @@ -720,8 +788,8 @@ static struct _card_info card_info_USBNW62X = { .rx_rate_max = 412, .feature_control = FEATURE_CTRL_DEFAULT, .histogram_table_num = 3, - .fw_name = USBNW62X_DEFAULT_COMBO_FW_NAME, - .fw_name_wlan = USBNW62X_DEFAULT_WLAN_FW_NAME, + .fw_name = USBIW62X_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = USBIW62X_DEFAULT_WLAN_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 1, }; @@ -1014,6 +1082,7 @@ static void woal_hang_work_queue(struct work_struct *work) moal_private *priv; int cfg80211_wext = 0; int ret = 0; + t_u8 reload_mode = 0; ENTER(); if (!reset_handle) { LEAVE(); @@ -1080,7 +1149,7 @@ static void woal_hang_work_queue(struct work_struct *work) #ifdef STA_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) if (IS_STA_CFG80211(cfg80211_wext) && - priv->sched_scanning) { + priv->sched_scanning && priv->wdev) { priv->bg_scan_start = MFALSE; priv->bg_scan_reported = MFALSE; cfg80211_sched_scan_stopped(priv->wdev->wiphy @@ -1118,19 +1187,30 @@ static void woal_hang_work_queue(struct work_struct *work) } #ifdef PCIE else if (IS_PCIE(reset_handle->card_type)) { - reset_handle->init_wait_q_woken = MFALSE; - PRINTM(MMSG, "WIFI auto_fw_reload: fw_reload=4\n"); - ret = woal_request_fw_reload(reset_handle, - FW_RELOAD_PCIE_RESET); - if (!ret) { - /* Wait for FLR to complete */ - wait_event_timeout( - reset_handle->init_wait_q, - reset_handle->init_wait_q_woken, - 10 * HZ); - if (reset_handle->hardware_status != - HardwareStatusReady) - ret = -1; +#define FW_RELOAD_PCIE_IN_BAND_RESET 3 + if (reset_handle->params.auto_fw_reload == + FW_RELOAD_PCIE_IN_BAND_RESET) { + PRINTM(MMSG, + "WIFI auto_fw_reload: fw_reload=6\n"); + ret = woal_request_fw_reload( + reset_handle, + FW_RELOAD_PCIE_INBAND_RESET); + } else { + reset_handle->init_wait_q_woken = MFALSE; + PRINTM(MMSG, + "WIFI auto_fw_reload: fw_reload=4\n"); + ret = woal_request_fw_reload( + reset_handle, FW_RELOAD_PCIE_RESET); + if (!ret) { + /* Wait for FLR to complete */ + wait_event_timeout( + reset_handle->init_wait_q, + reset_handle->init_wait_q_woken, + 10 * HZ); + if (reset_handle->hardware_status != + HardwareStatusReady) + ret = -1; + } } } #endif @@ -1174,10 +1254,17 @@ static void woal_hang_work_queue(struct work_struct *work) strlen(CUS_EVT_DRIVER_HANG)); #ifdef STA_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) - if (IS_STA_OR_UAP_CFG80211(cfg80211_wext)) - woal_cfg80211_vendor_event(priv, event_hang, - CUS_EVT_DRIVER_HANG, - strlen(CUS_EVT_DRIVER_HANG)); + if (IS_STA_OR_UAP_CFG80211(cfg80211_wext)) { + PRINTM(MMSG, "Send event_hang(0x0) vendor event"); + if (IS_SD(reset_handle->card_type)) { + reload_mode = FW_RELOAD_SDIO_INBAND_RESET; + } else if (IS_PCIE(reset_handle->card_type)) { + reload_mode = FW_RELOAD_PCIE_INBAND_RESET; + // Todo: add check for FW_RELOAD_PCIE_RESET - + // FLR + } + woal_cfg80211_driver_hang_event(priv, reload_mode); + } #endif #endif } @@ -1201,7 +1288,7 @@ void woal_process_hang(moal_handle *handle) queue_work(hang_workqueue, &hang_work); #ifdef ANDROID_KERNEL #define WAKE_LOCK_HANG 5000 -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) __pm_wakeup_event(&reset_handle->ws, WAKE_LOCK_HANG); #else wake_lock_timeout(&reset_handle->wake_lock, @@ -2057,7 +2144,7 @@ mlan_status woal_init_sw(moal_handle *handle) handle->is_suspended = MFALSE; handle->hs_activated = MFALSE; - handle->hs_auto_arp = MFALSE; + handle->hs_auto_arp = (t_u8)handle->params.hs_auto_arp; handle->suspend_fail = MFALSE; handle->hs_skip_count = 0; handle->hs_force_count = 0; @@ -2157,6 +2244,17 @@ mlan_status woal_init_sw(moal_handle *handle) #endif #endif + handle->rtt_capa.rtt_one_sided_supported = MTRUE; + handle->rtt_capa.rtt_ftm_supported = MTRUE; + handle->rtt_capa.lci_support = MTRUE; + handle->rtt_capa.lcr_support = MTRUE; + handle->rtt_capa.preamble_support = + PREAMBLE_LEGACY | PREAMBLE_HT | PREAMBLE_VHT; + handle->rtt_capa.bw_support = + BW_20_SUPPORT | BW_40_SUPPORT | BW_80_SUPPORT; + handle->rtt_capa.responder_supported = MTRUE; + handle->rtt_capa.mc_version = 60; + /* Register to MLAN */ memset(&device, 0, sizeof(mlan_device)); device.pmoal_handle = handle; @@ -2257,6 +2355,7 @@ mlan_status woal_init_sw(moal_handle *handle) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) device.dfs_offload = moal_extflg_isset(handle, EXT_DFS_OFFLOAD); #endif + device.second_mac = handle->second_mac; for (i = 0; i < handle->drv_mode.intf_num; i++) { device.bss_attr[i].bss_type = @@ -2533,6 +2632,7 @@ static t_u32 woal_set_sdio_slew_rate(moal_handle *handle) moal_private *priv = NULL; t_u32 new_value = 0; t_u32 reg_type = MLAN_REG_MAC; + int status; priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY); if (!priv) @@ -2541,15 +2641,13 @@ static t_u32 woal_set_sdio_slew_rate(moal_handle *handle) if ((handle->card_info->slew_rate_reg != 0) && (handle->params.slew_rate > 3 || handle->params.slew_rate < 0)) return MLAN_STATUS_FAILURE; -#if defined(SD9098) || defined(SD9097) || defined(SDNW62X) || defined(SD9177) if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) || - IS_SDNW62X(handle->card_type) || IS_SD9177(handle->card_type)) + IS_SDIW62X(handle->card_type) || IS_SD9177(handle->card_type)) reg_type = MLAN_REG_CIU; -#endif - ret = woal_getset_regrdwr(priv, MLAN_ACT_GET, reg_type, - handle->card_info->slew_rate_reg, &value); - if (ret < 0) { + status = woal_getset_regrdwr(priv, MLAN_ACT_GET, reg_type, + handle->card_info->slew_rate_reg, &value); + if (status < 0) { PRINTM(MERROR, "woal_getset_regrdwr get REG_MAC failed\n"); ret = MLAN_STATUS_FAILURE; goto done; @@ -2562,10 +2660,10 @@ static t_u32 woal_set_sdio_slew_rate(moal_handle *handle) PRINTM(MMSG, "Set REG 0x%8x: 0x%x slew_rate=%d\n", handle->card_info->slew_rate_reg, new_value, handle->params.slew_rate); - ret = woal_getset_regrdwr(priv, MLAN_ACT_SET, reg_type, - handle->card_info->slew_rate_reg, - &new_value); - if (ret < 0) { + status = woal_getset_regrdwr(priv, MLAN_ACT_SET, reg_type, + handle->card_info->slew_rate_reg, + &new_value); + if (status < 0) { PRINTM(MERROR, "woal_getset_regrdwr get REG_MAC failed\n"); ret = MLAN_STATUS_FAILURE; @@ -2846,7 +2944,7 @@ static mlan_status woal_process_hostcmd_cfg(moal_handle *handle, t_u8 *data, goto done; } ptr = buf; - strcpy(ptr, CMD_STR); + strncpy(ptr, CMD_STR, CMD_BUF_LEN); ptr = buf + strlen(CMD_STR) + sizeof(t_u32); while ((pos - data) < size) { while (*pos == ' ' || *pos == '\t') @@ -3399,7 +3497,7 @@ static t_u32 woal_set_user_init_data(moal_handle *handle, int type, } if (handle->user_data) { cfg_data = (t_u8 *)(handle->user_data)->data; - len = (handle->user_data)->size; + len = (t_size)((handle->user_data)->size); if (type == INIT_HOSTCMD_CFG_DATA || type == BAND_STEER_CFG_DATA || type == COUNTRY_POWER_TABLE) { @@ -3520,7 +3618,7 @@ done: } #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) static ssize_t woal_set_rps_map(struct netdev_rx_queue *queue, const char *buf, size_t len) { @@ -3545,7 +3643,7 @@ static ssize_t woal_set_rps_map(struct netdev_rx_queue *queue, const char *buf, PRINTM(MERROR, "%s: bitmap_parse fail err=%d.\n", __func__, err); free_cpumask_var(mask); - return err; + return -EINVAL; } map = kzalloc(max_t(unsigned int, RPS_MAP_SIZE(cpumask_weight(mask)), @@ -3614,7 +3712,7 @@ static mlan_status woal_add_card_dpc(moal_handle *handle) char str_buf[MLAN_MAX_VER_STR_LEN]; #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) moal_private *priv_rps = NULL; t_u8 rps_buf[2]; #endif @@ -3738,10 +3836,10 @@ static mlan_status woal_add_card_dpc(moal_handle *handle) #endif #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) if (handle->params.rps) { priv_rps = woal_get_priv_bss_type(handle, MLAN_BSS_TYPE_STA); - sprintf(rps_buf, "%x", handle->params.rps); + snprintf(rps_buf, sizeof(rps_buf), "%x", handle->params.rps); if (priv_rps) { PRINTM(MCMND, "num_rx_queues=%u real_num_rx_queues=%u\n", @@ -3797,10 +3895,10 @@ err: static mlan_status woal_req_dpd_data(moal_handle *handle, mlan_init_param *param) { - int ret = MLAN_STATUS_SUCCESS; + mlan_status ret = MLAN_STATUS_SUCCESS; t_u8 req_fw_nowait = moal_extflg_isset(handle, EXT_REQ_FW_NOWAIT); char *dpd_data_cfg = handle->params.dpd_data_cfg; - mlan_status status = MLAN_STATUS_SUCCESS; + int status = MLAN_STATUS_SUCCESS; ENTER(); @@ -4123,7 +4221,7 @@ static mlan_status woal_init_fw_dpc(moal_handle *handle) if (!IS_USB8997(handle->card_type) && !IS_USB9098(handle->card_type) && !IS_USB9097(handle->card_type) && - !IS_USBNW62X(handle->card_type) && + !IS_USBIW62X(handle->card_type) && !IS_USB8978(handle->card_type)) ret = woal_reset_usb_dev(handle); goto done; @@ -5247,8 +5345,8 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index, } } #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0) - strcpy(csa_str, "CSA"); - strcat(csa_str, name); + strncpy(csa_str, "CSA", sizeof(csa_str)); + strncat(csa_str, name, sizeof(csa_str) - 1); priv->csa_workqueue = alloc_workqueue( csa_str, WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1); if (!priv->csa_workqueue) { @@ -5297,25 +5395,34 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index, if (bss_type == MLAN_BSS_TYPE_STA || priv->bss_type == MLAN_BSS_TYPE_UAP) { +#ifdef MFG_CMD_SUPPORT + if (priv->phandle->params.mfg_mode != MLAN_INIT_PARA_ENABLED) { +#endif #if defined(SD8887) || defined(SD8987) - mlan_fw_info fw_info; - memset(&fw_info, 0, sizeof(mlan_fw_info)); - if (MLAN_STATUS_SUCCESS != - woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info)) { - PRINTM(MERROR, "%s: get_fw_info failed \n", __func__); - goto error; - } - if (MFALSE + mlan_fw_info fw_info; + memset(&fw_info, 0, sizeof(mlan_fw_info)); + if (MLAN_STATUS_SUCCESS != + woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, + &fw_info)) { + PRINTM(MERROR, "%s: get_fw_info failed \n", + __func__); + goto error; + } + if (MFALSE #ifdef SD8887 - || IS_SD8887(handle->card_type) + || IS_SD8887(handle->card_type) #endif #ifdef SD8987 - || IS_SD8987(handle->card_type) + || IS_SD8987(handle->card_type) #endif - ) { - if ((fw_info.antinfo & ANT_DIVERSITY_2G) && - (fw_info.antinfo & ANT_DIVERSITY_5G)) - handle->card_info->histogram_table_num = 4; + ) { + if ((fw_info.antinfo & ANT_DIVERSITY_2G) && + (fw_info.antinfo & ANT_DIVERSITY_5G)) + handle->card_info->histogram_table_num = + 4; + } +#endif +#ifdef MFG_CMD_SUPPORT } #endif @@ -5586,7 +5693,8 @@ mlan_status woal_set_user_antcfg(moal_handle *handle, t_u8 wait_option) if (handle->feature_control & FEATURE_CTRL_STREAM_2X2) { if (IS_CARD9098(handle->card_type) || - IS_CARD9097(handle->card_type)) { + IS_CARD9097(handle->card_type) || + IS_CARDIW62X(handle->card_type)) { radio->param.ant_cfg.tx_antenna = radio->param.ant_cfg.rx_antenna = antcfg; #if defined(STA_CFG80211) || defined(UAP_CFG80211) @@ -6304,18 +6412,19 @@ void woal_mlan_debug_info(moal_private *priv) PRINTM(MERROR, "last_cmd_index = %d\n", info->last_cmd_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_cmd_id[i]); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", info->last_cmd_id[i]); PRINTM(MERROR, "last_cmd_id = %s\n", str); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_cmd_act[i]); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", info->last_cmd_act[i]); PRINTM(MERROR, "last_cmd_act = %s\n", str); PRINTM(MERROR, "last_cmd_resp_index = %d\n", info->last_cmd_resp_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_cmd_resp_id[i]); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", + info->last_cmd_resp_id[i]); PRINTM(MERROR, "last_cmd_resp_id = %s\n", str); PRINTM(MERROR, "last_event_index = %d\n", info->last_event_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_event[i]); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", info->last_event[i]); PRINTM(MERROR, "last_event = %s", str); PRINTM(MERROR, "num_data_h2c_failure = %d\n", @@ -6350,8 +6459,8 @@ void woal_mlan_debug_info(moal_private *priv) info->last_recv_wr_bitmap, info->last_mp_index); for (i = 0; i < SDIO_MP_DBG_NUM; i++) { for (s = str, j = 0; j < mp_aggr_pkt_limit; j++) - s += sprintf( - s, "0x%02x ", + s += snprintf( + s, MAX_BUF_LEN, "0x%02x ", info->last_mp_wr_info [i * mp_aggr_pkt_limit + j]); @@ -6779,7 +6888,7 @@ t_u8 woal_find_mcast_node_tx(moal_private *priv, struct sk_buff *skb) struct mcast_node *node = NULL; unsigned long flags; t_u8 ret = MFALSE; - t_u8 ra[MLAN_MAC_ADDR_LENGTH]; + t_u8 ra[MLAN_MAC_ADDR_LENGTH] = {0}; ENTER(); moal_memcpy_ext(priv->phandle, ra, skb->data, MLAN_MAC_ADDR_LENGTH, sizeof(ra)); @@ -7290,6 +7399,112 @@ done: return ret; } +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) +/** + * @brief This function sends Tx pkt to monitor iface + * + * @param priv A pointer to moal_private structure + * + * @param pmbuf A mlan buffer + * @return N/A + */ +void woal_send_tx_pkt_to_mon_if(moal_private *priv, pmlan_buffer pmbuf) +{ + struct ieee80211_hdr *dot11_hdr = NULL; + struct radiotap_info *rt = NULL; + pmlan_buffer pmbuf2 = NULL; + t_u8 *ptr = NULL; + int len, hdr_len; + t_u16 fc; + t_u8 rfc1042_eth_hdr[ETH_ALEN] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; + moal_handle *handle = priv->phandle; + + if (!priv || !pmbuf) + return; + + /* Only STA and uAP mode are supported */ + if (!(priv->bss_type == MLAN_BSS_TYPE_STA || + priv->bss_type == MLAN_BSS_TYPE_UAP)) + return; + + ENTER(); + pmbuf2 = woal_alloc_mlan_buffer(handle, pmbuf->data_len + 64); + if (!pmbuf2) { + PRINTM(MERROR, + "Failed to allocate mlan_buffer for Tx sniffer packet"); + goto done; + } + pmbuf2->bss_index = pmbuf->bss_index; + pmbuf2->buf_type = pmbuf->buf_type; + pmbuf2->priority = pmbuf->priority; + pmbuf2->in_ts_sec = pmbuf->in_ts_sec; + pmbuf2->in_ts_usec = pmbuf->in_ts_usec; + pmbuf2->flags |= MLAN_BUF_FLAG_NET_MONITOR; + + /* attach 802.11 hdr */ + dot11_hdr = (struct ieee80211_hdr *)((t_u8 *)pmbuf2->pbuf + + pmbuf2->data_offset); + memset((t_u8 *)dot11_hdr, 0, sizeof(struct ieee80211_hdr)); + + fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA); + + ptr = (t_u8 *)pmbuf->pbuf + pmbuf->data_offset; + hdr_len = sizeof(struct ieee80211_hdr); + + switch (priv->bss_type) { + case MLAN_BSS_TYPE_STA: + fc |= cpu_to_le16(IEEE80211_FCTL_TODS); + /* BSSID SA DA */ + memcpy(dot11_hdr->addr1, priv->cfg_bssid, ETH_ALEN); + memcpy(dot11_hdr->addr2, ptr + ETH_ALEN, ETH_ALEN); + memcpy(dot11_hdr->addr3, ptr, ETH_ALEN); + hdr_len -= ETH_ALEN; + break; + case MLAN_BSS_TYPE_UAP: + fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS); + /* DA BSSID SA */ + memcpy(dot11_hdr->addr1, ptr, ETH_ALEN); + memcpy(dot11_hdr->addr2, priv->current_addr, ETH_ALEN); + memcpy(dot11_hdr->addr3, ptr + ETH_ALEN, ETH_ALEN); + /* subtract mac addr field size for 3 address 802.11 header */ + hdr_len -= ETH_ALEN; + break; + default: + woal_free_mlan_buffer(priv->phandle, pmbuf2); + goto done; + } + + dot11_hdr->frame_control = fc; + /* add 2 bytes for qos ctrl flags */ + hdr_len += 2; + + /* Add LLC/SNAP rfc1042 header after 802.11 hdr */ + memcpy((t_u8 *)dot11_hdr + hdr_len, &rfc1042_eth_hdr, ETH_ALEN); + + /* Copy out rest of the data frame */ + len = pmbuf->data_len - 2 * ETH_ALEN; + ptr += 2 * ETH_ALEN; + memcpy(pmbuf2->pbuf + pmbuf2->data_offset + hdr_len + + sizeof(rfc1042_eth_hdr), + ptr, len); + + pmbuf2->data_len = hdr_len + sizeof(rfc1042_eth_hdr) + len; + + rt = (struct radiotap_info *)((t_u8 *)pmbuf2->pbuf + + pmbuf2->data_offset - + sizeof(radiotap_info)); + memset(rt, 0x00, sizeof(radiotap_info)); + /* TODO: Fill radiotap header here */ + /* Send this duplicated packet to Rx monitor pkt handler */ + if (moal_recv_packet(handle, pmbuf2) != MLAN_STATUS_PENDING) + woal_free_mlan_buffer(priv->phandle, pmbuf2); +done: + LEAVE(); +} +#endif +#endif + /** * @brief This function handles packet transmission * @@ -7357,6 +7572,14 @@ static void woal_start_xmit(moal_private *priv, struct sk_buff *skb) if (ret) goto done; } +#if defined(STA_CFG80211) && defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + if (priv->phandle->mon_if && + (priv->phandle->mon_if->flag & MLAN_NETMON_DATA) && + (priv->phandle->mon_if->flag & MLAN_NETMON_TX)) + woal_send_tx_pkt_to_mon_if(priv, pmbuf); +#endif +#endif #ifdef STA_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) if (priv->enable_auto_tdls && priv->tdls_check_tx) @@ -7869,6 +8092,8 @@ void woal_init_priv(moal_private *priv, t_u8 wait_option) #ifdef UAP_SUPPORT priv->target_chan = 0; priv->backup_chan = 0; + priv->chan_mode = DEFAULT_CHAN_MODE_MASK; + priv->chan_num_pkts = DEFAULT_RETRY_PKTS; priv->user_cac_period_msec = 0; priv->chan_under_nop = MFALSE; #endif @@ -8064,12 +8289,12 @@ done: * * @return moal_private pointer or NULL */ -moal_private *woal_bss_index_to_priv(moal_handle *handle, t_u8 bss_index) +moal_private *woal_bss_index_to_priv(moal_handle *handle, t_u32 bss_index) { int i; ENTER(); - if (!handle || !handle->priv_num) { + if (!handle) { LEAVE(); return NULL; } @@ -8241,9 +8466,12 @@ static int woal_get_card_info(moal_handle *phandle) phandle->card_info = &card_info_SD9097; break; #endif -#ifdef SDNW62X - case CARD_TYPE_SDNW62X: - phandle->card_info = &card_info_SDNW62X; + case CARD_TYPE_SDAW693: + phandle->card_info = &card_info_SDAW693; + break; +#ifdef SDIW62X + case CARD_TYPE_SDIW62X: + phandle->card_info = &card_info_SDIW62X; break; #endif #ifdef SD9177 @@ -8262,9 +8490,12 @@ static int woal_get_card_info(moal_handle *phandle) phandle->card_info = &card_info_PCIE9097; break; #endif -#ifdef PCIENW62X - case CARD_TYPE_PCIENW62X: - phandle->card_info = &card_info_PCIENW62X; + case CARD_TYPE_PCIEAW693: + phandle->card_info = &card_info_PCIEAW693; + break; +#ifdef PCIEIW62X + case CARD_TYPE_PCIEIW62X: + phandle->card_info = &card_info_PCIEIW62X; break; #endif #ifdef PCIE9098 @@ -8298,9 +8529,9 @@ static int woal_get_card_info(moal_handle *phandle) phandle->card_info = &card_info_USB9097; break; #endif -#ifdef USBNW62X - case CARD_TYPE_USBNW62X: - phandle->card_info = &card_info_USBNW62X; +#ifdef USBIW62X + case CARD_TYPE_USBIW62X: + phandle->card_info = &card_info_USBIW62X; break; #endif #ifdef SD8987 @@ -9182,6 +9413,7 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent) t_u16 seqnum; t_u16 type = 0; t_u8 *pos; + moal_private *priv = NULL; ENTER(); @@ -9247,8 +9479,9 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent) phandle->is_fw_dump_timer_set = MFALSE; } if (phandle->priv_num) { - woal_send_fw_dump_complete_event( - woal_get_priv(phandle, MLAN_BSS_ROLE_ANY)); + priv = woal_get_priv(phandle, MLAN_BSS_ROLE_ANY); + if (priv) + woal_send_fw_dump_complete_event(priv); mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); woal_process_hang(phandle); } @@ -9292,10 +9525,10 @@ static int woal_save_hex_dump(int rowsize, const void *buf, size_t len, hex_dump_to_buffer(ptr + i, linelen, rowsize, 1, linebuf, sizeof(linebuf), false); - pos += sprintf(pos, "%s\n", linebuf); + pos += snprintf(pos, MAX_BUF_LEN, "%s\n", linebuf); } - return pos - (char *)save_buf; + return (int)(pos - (char *)save_buf); } /** @@ -9325,31 +9558,37 @@ static int woal_dump_priv_drv_info(moal_handle *handle, t_u8 *buf) index++) { priv = handle->priv[index]; if (priv) { - ptr += sprintf(ptr, "[Interface : %s]\n", - priv->proc_entry_name); + ptr += snprintf(ptr, MAX_BUF_LEN, "[Interface : %s]\n", + priv->proc_entry_name); #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29) - ptr += sprintf(ptr, "wmm_tx_pending[0] = %d\n", - atomic_read(&priv->wmm_tx_pending[0])); - ptr += sprintf(ptr, "wmm_tx_pending[1] = %d\n", - atomic_read(&priv->wmm_tx_pending[1])); - ptr += sprintf(ptr, "wmm_tx_pending[2] = %d\n", - atomic_read(&priv->wmm_tx_pending[2])); - ptr += sprintf(ptr, "wmm_tx_pending[3] = %d\n", - atomic_read(&priv->wmm_tx_pending[3])); + ptr += snprintf(ptr, MAX_BUF_LEN, + "wmm_tx_pending[0] = %d\n", + atomic_read(&priv->wmm_tx_pending[0])); + ptr += snprintf(ptr, MAX_BUF_LEN, + "wmm_tx_pending[1] = %d\n", + atomic_read(&priv->wmm_tx_pending[1])); + ptr += snprintf(ptr, MAX_BUF_LEN, + "wmm_tx_pending[2] = %d\n", + atomic_read(&priv->wmm_tx_pending[2])); + ptr += snprintf(ptr, MAX_BUF_LEN, + "wmm_tx_pending[3] = %d\n", + atomic_read(&priv->wmm_tx_pending[3])); #endif - ptr += sprintf(ptr, "Media state = \"%s\"\n", - ((priv->media_connected == MFALSE) ? - "Disconnected" : - "Connected")); - ptr += sprintf(ptr, "carrier %s\n", - ((netif_carrier_ok(priv->netdev)) ? - "on" : - "off")); + ptr += snprintf(ptr, MAX_BUF_LEN, + "Media state = \"%s\"\n", + ((priv->media_connected == MFALSE) ? + "Disconnected" : + "Connected")); + ptr += snprintf(ptr, MAX_BUF_LEN, "carrier %s\n", + ((netif_carrier_ok(priv->netdev)) ? + "on" : + "off")); #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29) for (i = 0; i < (int)(priv->netdev->num_tx_queues); i++) { - ptr += sprintf( - ptr, "tx queue %d: %s\n", i, + ptr += snprintf( + ptr, MAX_BUF_LEN, "tx queue %d: %s\n", + i, ((netif_tx_queue_stopped( netdev_get_tx_queue( priv->netdev, i))) ? @@ -9357,19 +9596,20 @@ static int woal_dump_priv_drv_info(moal_handle *handle, t_u8 *buf) "started")); } #else - ptr += sprintf(ptr, "tx queue %s\n", - ((netif_queue_stopped(priv->netdev)) ? - "stopped" : - "started")); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx queue %s\n", + ((netif_queue_stopped(priv->netdev)) ? + "stopped" : + "started")); #endif - ptr += sprintf(ptr, "%s: num_tx_timeout = %d\n", - priv->netdev->name, - priv->num_tx_timeout); + ptr += snprintf(ptr, MAX_BUF_LEN, + "%s: num_tx_timeout = %d\n", + priv->netdev->name, + priv->num_tx_timeout); } } LEAVE(); - return ptr - (char *)buf; + return (int)(ptr - (char *)buf); } /** @@ -9399,55 +9639,60 @@ static int woal_dump_moal_drv_info(moal_handle *phandle, t_u8 *buf) cardp = (struct usb_card_rec *)phandle->card; #endif ptr = (char *)buf; - ptr += sprintf(ptr, "------------moal_debug_info-------------\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, + "------------moal_debug_info-------------\n"); woal_get_version(phandle, str_buf, sizeof(str_buf) - 1); - ptr += sprintf(ptr, "Driver version = %s\n", str_buf); - ptr += sprintf(ptr, "main_state = %d\n", phandle->main_state); + ptr += snprintf(ptr, MAX_BUF_LEN, "Driver version = %s\n", str_buf); + ptr += snprintf(ptr, MAX_BUF_LEN, "main_state = %d\n", + phandle->main_state); #ifdef USB if (IS_USB(phandle->card_type)) { - ptr += sprintf(ptr, "tx_cmd_urb_pending = %d\n", - atomic_read(&cardp->tx_cmd_urb_pending)); - ptr += sprintf(ptr, "tx_data_urb_pending = %d\n", - atomic_read(&cardp->tx_data_urb_pending)); - ptr += sprintf(ptr, "tx_data2_urb_pending = %d\n", - atomic_read(&cardp->tx_data2_urb_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx_cmd_urb_pending = %d\n", + atomic_read(&cardp->tx_cmd_urb_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx_data_urb_pending = %d\n", + atomic_read(&cardp->tx_data_urb_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx_data2_urb_pending = %d\n", + atomic_read(&cardp->tx_data2_urb_pending)); #ifdef USB_CMD_DATA_EP - ptr += sprintf(ptr, "rx_cmd_urb_pending = %d\n", - atomic_read(&cardp->rx_cmd_urb_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "rx_cmd_urb_pending = %d\n", + atomic_read(&cardp->rx_cmd_urb_pending)); #endif - ptr += sprintf(ptr, "rx_data_urb_pending = %d\n", - atomic_read(&cardp->rx_data_urb_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "rx_data_urb_pending = %d\n", + atomic_read(&cardp->rx_data_urb_pending)); } #endif - ptr += sprintf(ptr, "ioctl_pending = %d\n", - atomic_read(&phandle->ioctl_pending)); - ptr += sprintf(ptr, "tx_pending = %d\n", - atomic_read(&phandle->tx_pending)); - ptr += sprintf(ptr, "rx_pending = %d\n", - atomic_read(&phandle->rx_pending)); - ptr += sprintf(ptr, "lock_count = %d\n", - atomic_read(&phandle->lock_count)); - ptr += sprintf(ptr, "malloc_count = %d\n", - atomic_read(&phandle->malloc_count)); - ptr += sprintf(ptr, "mbufalloc_count = %d\n", - atomic_read(&phandle->mbufalloc_count)); + ptr += snprintf(ptr, MAX_BUF_LEN, "ioctl_pending = %d\n", + atomic_read(&phandle->ioctl_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx_pending = %d\n", + atomic_read(&phandle->tx_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "rx_pending = %d\n", + atomic_read(&phandle->rx_pending)); + ptr += snprintf(ptr, MAX_BUF_LEN, "lock_count = %d\n", + atomic_read(&phandle->lock_count)); + ptr += snprintf(ptr, MAX_BUF_LEN, "malloc_count = %d\n", + atomic_read(&phandle->malloc_count)); + ptr += snprintf(ptr, MAX_BUF_LEN, "mbufalloc_count = %d\n", + atomic_read(&phandle->mbufalloc_count)); #ifdef PCIE if (IS_PCIE(phandle->card_type)) { - ptr += sprintf(ptr, "malloc_cons_count = %d\n", - atomic_read(&phandle->malloc_cons_count)); + ptr += snprintf(ptr, MAX_BUF_LEN, "malloc_cons_count = %d\n", + atomic_read(&phandle->malloc_cons_count)); } #endif - ptr += sprintf(ptr, "hs_skip_count = %u\n", phandle->hs_skip_count); - ptr += sprintf(ptr, "hs_force_count = %u\n", phandle->hs_force_count); + ptr += snprintf(ptr, MAX_BUF_LEN, "hs_skip_count = %u\n", + phandle->hs_skip_count); + ptr += snprintf(ptr, MAX_BUF_LEN, "hs_force_count = %u\n", + phandle->hs_force_count); ptr += woal_dump_priv_drv_info(phandle, ptr); - ptr += sprintf(ptr, "------------moal_debug_info End-------------\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, + "------------moal_debug_info End-------------\n"); if (phandle->ops.dump_reg_info) ptr += phandle->ops.dump_reg_info(phandle, ptr); LEAVE(); - return ptr - (char *)buf; + return (int)(ptr - (char *)buf); } /** @@ -9483,80 +9728,97 @@ static int woal_dump_mlan_drv_info(moal_private *priv, t_u8 *buf) LEAVE(); return 0; } - ptr += sprintf(ptr, "------------mlan_debug_info-------------\n"); - ptr += sprintf(ptr, "mlan_processing =%d\n", info->mlan_processing); - ptr += sprintf(ptr, "main_lock_flag =%d\n", info->main_lock_flag); - ptr += sprintf(ptr, "main_process_cnt =%d\n", info->main_process_cnt); - ptr += sprintf(ptr, "delay_task_flag =%d\n", info->delay_task_flag); - ptr += sprintf(ptr, "mlan_rx_processing =%d\n", - info->mlan_rx_processing); - ptr += sprintf(ptr, "rx_pkts_queued =%d\n", info->rx_pkts_queued); - ptr += sprintf(ptr, "tx_pkts_queued =%d\n", info->tx_pkts_queued); - ptr += sprintf(ptr, "fw_hang_report = %d\n", info->fw_hang_report); - ptr += sprintf(ptr, "num_cmd_timeout = %d\n", info->num_cmd_timeout); - ptr += sprintf(ptr, "Timeout cmd id = 0x%x, act = 0x%x\n", - info->timeout_cmd_id, info->timeout_cmd_act); - ptr += sprintf(ptr, "last_cmd_index = %d\n", info->last_cmd_index); + ptr += snprintf(ptr, MAX_BUF_LEN, + "------------mlan_debug_info-------------\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "mlan_processing =%d\n", + info->mlan_processing); + ptr += snprintf(ptr, MAX_BUF_LEN, "main_lock_flag =%d\n", + info->main_lock_flag); + ptr += snprintf(ptr, MAX_BUF_LEN, "main_process_cnt =%d\n", + info->main_process_cnt); + ptr += snprintf(ptr, MAX_BUF_LEN, "delay_task_flag =%d\n", + info->delay_task_flag); + ptr += snprintf(ptr, MAX_BUF_LEN, "mlan_rx_processing =%d\n", + info->mlan_rx_processing); + ptr += snprintf(ptr, MAX_BUF_LEN, "rx_pkts_queued =%d\n", + info->rx_pkts_queued); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx_pkts_queued =%d\n", + info->tx_pkts_queued); + ptr += snprintf(ptr, MAX_BUF_LEN, "fw_hang_report = %d\n", + info->fw_hang_report); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_cmd_timeout = %d\n", + info->num_cmd_timeout); + ptr += snprintf(ptr, MAX_BUF_LEN, "Timeout cmd id = 0x%x, act = 0x%x\n", + info->timeout_cmd_id, info->timeout_cmd_act); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_cmd_index = %d\n", + info->last_cmd_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_cmd_id[i]); - ptr += sprintf(ptr, "last_cmd_id = %s\n", str); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", info->last_cmd_id[i]); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_cmd_id = %s\n", str); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_cmd_act[i]); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", info->last_cmd_act[i]); - ptr += sprintf(ptr, "last_cmd_act = %s\n", str); - ptr += sprintf(ptr, "last_cmd_resp_index = %d\n", - info->last_cmd_resp_index); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_cmd_act = %s\n", str); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_cmd_resp_index = %d\n", + info->last_cmd_resp_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_cmd_resp_id[i]); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", + info->last_cmd_resp_id[i]); - ptr += sprintf(ptr, "last_cmd_resp_id = %s\n", str); - ptr += sprintf(ptr, "last_event_index = %d\n", info->last_event_index); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_cmd_resp_id = %s\n", str); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_event_index = %d\n", + info->last_event_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) - s += sprintf(s, "0x%x ", info->last_event[i]); + s += snprintf(s, MAX_BUF_LEN, "0x%x ", info->last_event[i]); - ptr += sprintf(ptr, "last_event = %s\n", str); - ptr += sprintf(ptr, "num_data_h2c_failure = %d\n", - info->num_tx_host_to_card_failure); - ptr += sprintf(ptr, "num_cmd_h2c_failure = %d\n", - info->num_cmd_host_to_card_failure); - ptr += sprintf(ptr, "num_alloc_buffer_failure = %d\n", - info->num_alloc_buffer_failure); - ptr += sprintf(ptr, "num_pkt_dropped = %d\n", info->num_pkt_dropped); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_event = %s\n", str); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_data_h2c_failure = %d\n", + info->num_tx_host_to_card_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_cmd_h2c_failure = %d\n", + info->num_cmd_host_to_card_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_alloc_buffer_failure = %d\n", + info->num_alloc_buffer_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_pkt_dropped = %d\n", + info->num_pkt_dropped); #ifdef SDIO if (IS_SD(priv->phandle->card_type)) { - ptr += sprintf(ptr, "num_data_c2h_failure = %d\n", - info->num_rx_card_to_host_failure); - ptr += sprintf(ptr, "num_cmdevt_c2h_failure = %d\n", - info->num_cmdevt_card_to_host_failure); - ptr += sprintf(ptr, "num_int_read_failure = %d\n", - info->num_int_read_failure); - ptr += sprintf(ptr, "last_int_status = %d\n", - info->last_int_status); - ptr += sprintf(ptr, "mp_rd_bitmap=0x%x curr_rd_port=0x%x\n", - (unsigned int)info->mp_rd_bitmap, - info->curr_rd_port); - ptr += sprintf(ptr, "mp_wr_bitmap=0x%x curr_wr_port=0x%x\n", - (unsigned int)info->mp_wr_bitmap, - info->curr_wr_port); - ptr += sprintf(ptr, "mp_data_port_mask=0x%x\n", - info->mp_data_port_mask); - ptr += sprintf( - ptr, "last_recv_rd_bitmap=0x%x mp_invalid_update=%d\n", + ptr += snprintf(ptr, MAX_BUF_LEN, "num_data_c2h_failure = %d\n", + info->num_rx_card_to_host_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, + "num_cmdevt_c2h_failure = %d\n", + info->num_cmdevt_card_to_host_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_int_read_failure = %d\n", + info->num_int_read_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_int_status = %d\n", + info->last_int_status); + ptr += snprintf(ptr, MAX_BUF_LEN, + "mp_rd_bitmap=0x%x curr_rd_port=0x%x\n", + (unsigned int)info->mp_rd_bitmap, + info->curr_rd_port); + ptr += snprintf(ptr, MAX_BUF_LEN, + "mp_wr_bitmap=0x%x curr_wr_port=0x%x\n", + (unsigned int)info->mp_wr_bitmap, + info->curr_wr_port); + ptr += snprintf(ptr, MAX_BUF_LEN, "mp_data_port_mask=0x%x\n", + info->mp_data_port_mask); + ptr += snprintf( + ptr, MAX_BUF_LEN, + "last_recv_rd_bitmap=0x%x mp_invalid_update=%d\n", info->last_recv_rd_bitmap, info->mp_invalid_update); mp_aggr_pkt_limit = info->mp_aggr_pkt_limit; - ptr += sprintf(ptr, - "last_recv_wr_bitmap=0x%x last_mp_index = %d\n", - info->last_recv_wr_bitmap, info->last_mp_index); + ptr += snprintf(ptr, MAX_BUF_LEN, + "last_recv_wr_bitmap=0x%x last_mp_index = %d\n", + info->last_recv_wr_bitmap, info->last_mp_index); for (i = 0; i < SDIO_MP_DBG_NUM; i++) { for (s = str, j = 0; j < mp_aggr_pkt_limit; j++) - s += sprintf( - s, "0x%02x ", + s += snprintf( + s, MAX_BUF_LEN, "0x%02x ", info->last_mp_wr_info [i * mp_aggr_pkt_limit + j]); - ptr += sprintf( - ptr, + ptr += snprintf( + ptr, MAX_BUF_LEN, "mp_wr_bitmap: 0x%x mp_wr_ports=0x%x len=%d curr_wr_port=0x%x\n%s\n", info->last_mp_wr_bitmap[i], info->last_mp_wr_ports[i], @@ -9567,75 +9829,95 @@ static int woal_dump_mlan_drv_info(moal_private *priv, t_u8 *buf) #endif #ifdef PCIE if (IS_PCIE(priv->phandle->card_type)) { - ptr += sprintf(ptr, "txbd_rdptr=0x%x txbd_wrptr=0x%x\n", - info->txbd_rdptr, info->txbd_wrptr); - ptr += sprintf(ptr, "rxbd_rdptr=0x%x rxbd_wrptr=0x%x\n", - info->rxbd_rdptr, info->rxbd_wrptr); - ptr += sprintf(ptr, "eventbd_rdptr=0x%x event_wrptr=0x%x\n", - info->eventbd_rdptr, info->eventbd_wrptr); - ptr += sprintf(ptr, "last_wr_index:%d\n", - info->txbd_wrptr & (info->txrx_bd_size - 1)); - ptr += sprintf(ptr, "TxRx BD size:%d\n", info->txrx_bd_size); + ptr += snprintf(ptr, MAX_BUF_LEN, + "txbd_rdptr=0x%x txbd_wrptr=0x%x\n", + info->txbd_rdptr, info->txbd_wrptr); + ptr += snprintf(ptr, MAX_BUF_LEN, + "rxbd_rdptr=0x%x rxbd_wrptr=0x%x\n", + info->rxbd_rdptr, info->rxbd_wrptr); + ptr += snprintf(ptr, MAX_BUF_LEN, + "eventbd_rdptr=0x%x event_wrptr=0x%x\n", + info->eventbd_rdptr, info->eventbd_wrptr); + ptr += snprintf(ptr, MAX_BUF_LEN, "last_wr_index:%d\n", + info->txbd_wrptr & (info->txrx_bd_size - 1)); + ptr += snprintf(ptr, MAX_BUF_LEN, "TxRx BD size:%d\n", + info->txrx_bd_size); } #endif - ptr += sprintf(ptr, "num_event_deauth = %d\n", info->num_event_deauth); - ptr += sprintf(ptr, "num_event_disassoc = %d\n", - info->num_event_disassoc); - ptr += sprintf(ptr, "num_event_link_lost = %d\n", - info->num_event_link_lost); - ptr += sprintf(ptr, "num_cmd_deauth = %d\n", info->num_cmd_deauth); - ptr += sprintf(ptr, "num_cmd_assoc_success = %d\n", - info->num_cmd_assoc_success); - ptr += sprintf(ptr, "num_cmd_assoc_failure = %d\n", - info->num_cmd_assoc_failure); - ptr += sprintf(ptr, "num_cons_assoc_failure = %d\n", - info->num_cons_assoc_failure); - ptr += sprintf(ptr, "cmd_resp_received = %d\n", - info->cmd_resp_received); - ptr += sprintf(ptr, "event_received = %d\n", info->event_received); - ptr += sprintf(ptr, "max_tx_buf_size = %d\n", info->max_tx_buf_size); - ptr += sprintf(ptr, "tx_buf_size = %d\n", info->tx_buf_size); - ptr += sprintf(ptr, "curr_tx_buf_size = %d\n", info->curr_tx_buf_size); - ptr += sprintf(ptr, "bypass_pkt_count=%d\n", info->bypass_pkt_count); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_event_deauth = %d\n", + info->num_event_deauth); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_event_disassoc = %d\n", + info->num_event_disassoc); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_event_link_lost = %d\n", + info->num_event_link_lost); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_cmd_deauth = %d\n", + info->num_cmd_deauth); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_cmd_assoc_success = %d\n", + info->num_cmd_assoc_success); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_cmd_assoc_failure = %d\n", + info->num_cmd_assoc_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_cons_assoc_failure = %d\n", + info->num_cons_assoc_failure); + ptr += snprintf(ptr, MAX_BUF_LEN, "cmd_resp_received = %d\n", + info->cmd_resp_received); + ptr += snprintf(ptr, MAX_BUF_LEN, "event_received = %d\n", + info->event_received); + ptr += snprintf(ptr, MAX_BUF_LEN, "max_tx_buf_size = %d\n", + info->max_tx_buf_size); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx_buf_size = %d\n", + info->tx_buf_size); + ptr += snprintf(ptr, MAX_BUF_LEN, "curr_tx_buf_size = %d\n", + info->curr_tx_buf_size); + ptr += snprintf(ptr, MAX_BUF_LEN, "bypass_pkt_count=%d\n", + info->bypass_pkt_count); - ptr += sprintf(ptr, "data_sent=%d cmd_sent=%d\n", info->data_sent, - info->cmd_sent); - ptr += sprintf(ptr, "data_sent_cnt=%u\n", info->data_sent_cnt); - ptr += sprintf(ptr, "ps_mode=%d ps_state=%d\n", info->ps_mode, - info->ps_state); - ptr += sprintf( - ptr, "wakeup_dev_req=%d wakeup_tries=%d pm_wakeup_timeout=%d\n", + ptr += snprintf(ptr, MAX_BUF_LEN, "data_sent=%d cmd_sent=%d\n", + info->data_sent, info->cmd_sent); + ptr += snprintf(ptr, MAX_BUF_LEN, "data_sent_cnt=%u\n", + info->data_sent_cnt); + ptr += snprintf(ptr, MAX_BUF_LEN, "ps_mode=%d ps_state=%d\n", + info->ps_mode, info->ps_state); + ptr += snprintf( + ptr, MAX_BUF_LEN, + "wakeup_dev_req=%d wakeup_tries=%d pm_wakeup_timeout=%d\n", info->pm_wakeup_card_req, info->pm_wakeup_fw_try, info->pm_wakeup_timeout); - ptr += sprintf(ptr, "hs_configured=%d hs_activated=%d\n", - info->is_hs_configured, info->hs_activated); - ptr += sprintf(ptr, "pps_uapsd_mode=%d sleep_pd=%d\n", - info->pps_uapsd_mode, info->sleep_pd); - ptr += sprintf(ptr, "tx_lock_flag = %d\n", info->tx_lock_flag); - ptr += sprintf(ptr, "port_open = %d\n", info->port_open); - ptr += sprintf(ptr, "scan_processing = %d\n", info->scan_processing); - ptr += sprintf(ptr, "scan_state = %d\n", info->scan_state); + ptr += snprintf(ptr, MAX_BUF_LEN, "hs_configured=%d hs_activated=%d\n", + info->is_hs_configured, info->hs_activated); + ptr += snprintf(ptr, MAX_BUF_LEN, "pps_uapsd_mode=%d sleep_pd=%d\n", + info->pps_uapsd_mode, info->sleep_pd); + ptr += snprintf(ptr, MAX_BUF_LEN, "tx_lock_flag = %d\n", + info->tx_lock_flag); + ptr += snprintf(ptr, MAX_BUF_LEN, "port_open = %d\n", info->port_open); + ptr += snprintf(ptr, MAX_BUF_LEN, "scan_processing = %d\n", + info->scan_processing); + ptr += snprintf(ptr, MAX_BUF_LEN, "scan_state = %d\n", + info->scan_state); #ifdef PCIE if (IS_PCIE(priv->phandle->card_type)) { - ptr += sprintf(ptr, "txbd: rdptr=0x%x wrptr=0x%x\n", - info->txbd_rdptr, info->txbd_wrptr); - ptr += sprintf(ptr, "rxbd: rdptr=0x%x wrptr=0x%x\n", - info->rxbd_rdptr, info->rxbd_wrptr); - ptr += sprintf(ptr, "eventbd: rdptr=0x%x wrptr=0x%x\n", - info->eventbd_rdptr, info->eventbd_wrptr); - ptr += sprintf(ptr, "TXBD Ring:\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, + "txbd: rdptr=0x%x wrptr=0x%x\n", + info->txbd_rdptr, info->txbd_wrptr); + ptr += snprintf(ptr, MAX_BUF_LEN, + "rxbd: rdptr=0x%x wrptr=0x%x\n", + info->rxbd_rdptr, info->rxbd_wrptr); + ptr += snprintf(ptr, MAX_BUF_LEN, + "eventbd: rdptr=0x%x wrptr=0x%x\n", + info->eventbd_rdptr, info->eventbd_wrptr); + ptr += snprintf(ptr, MAX_BUF_LEN, "TXBD Ring:\n"); ptr += woal_save_hex_dump(ROW_SIZE_16, info->txbd_ring_vbase, info->txbd_ring_size, MTRUE, ptr); - ptr += sprintf(ptr, "RXBD Ring:\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "RXBD Ring:\n"); ptr += woal_save_hex_dump(ROW_SIZE_16, info->rxbd_ring_vbase, info->rxbd_ring_size, MTRUE, ptr); - ptr += sprintf(ptr, "EVTBD Ring:\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "EVTBD Ring:\n"); ptr += woal_save_hex_dump(ROW_SIZE_16, info->evtbd_ring_vbase, info->evtbd_ring_size, MTRUE, ptr); } #endif - ptr += sprintf(ptr, "------------mlan_debug_info End-------------\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, + "------------mlan_debug_info End-------------\n"); LEAVE(); return ptr - (char *)buf; @@ -9661,30 +9943,32 @@ static int woal_dump_moal_hex(moal_handle *phandle, t_u8 *buf) return 0; } - ptr += sprintf(ptr, "<--moal_handle-->\n"); - ptr += sprintf(ptr, "moal_handle=%p, size=%ld(0x%lx)\n", phandle, - (long int)sizeof(*phandle), - (long unsigned int)sizeof(*phandle)); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--moal_handle-->\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "moal_handle=%p, size=%ld(0x%lx)\n", + phandle, (long int)sizeof(*phandle), + (long unsigned int)sizeof(*phandle)); ptr += woal_save_hex_dump(ROW_SIZE_16, phandle, sizeof(*phandle), MTRUE, ptr); - ptr += sprintf(ptr, "<--moal_handle End-->\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--moal_handle End-->\n"); for (i = 0; i < phandle->priv_num; i++) { if (!phandle->priv[i]) continue; - ptr += sprintf(ptr, "<--moal_private(%d) %s-->\n", i, - phandle->priv[i]->netdev->name); - ptr += sprintf(ptr, "moal_private=%p, size=%ld(0x%lx)\n", - phandle->priv[i], - (long int)sizeof(*(phandle->priv[i])), - (long unsigned int)sizeof(*(phandle->priv[i]))); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--moal_private(%d) %s-->\n", + i, phandle->priv[i]->netdev->name); + ptr += snprintf(ptr, MAX_BUF_LEN, + "moal_private=%p, size=%ld(0x%lx)\n", + phandle->priv[i], + (long int)sizeof(*(phandle->priv[i])), + (long unsigned int)sizeof(*(phandle->priv[i]))); ptr += woal_save_hex_dump(ROW_SIZE_16, phandle->priv[i], sizeof(*(phandle->priv[i])), MTRUE, ptr); - ptr += sprintf(ptr, "<--moal_private(%d) End-->\n", i); + ptr += snprintf(ptr, MAX_BUF_LEN, + "<--moal_private(%d) End-->\n", i); } LEAVE(); - return ptr - (char *)buf; + return (int)(ptr - (char *)buf); } /** @@ -9715,33 +9999,37 @@ static int woal_dump_mlan_hex(moal_private *priv, t_u8 *buf) return 0; } - ptr += sprintf(ptr, "<--mlan_adapter-->\n"); - ptr += sprintf(ptr, "mlan_adapter=%p, size=%d(0x%x)\n", - info->mlan_adapter, info->mlan_adapter_size, - info->mlan_adapter_size); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--mlan_adapter-->\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "mlan_adapter=%p, size=%d(0x%x)\n", + info->mlan_adapter, info->mlan_adapter_size, + info->mlan_adapter_size); ptr += woal_save_hex_dump(ROW_SIZE_16, info->mlan_adapter, info->mlan_adapter_size, MTRUE, ptr); - ptr += sprintf(ptr, "<--mlan_adapter End-->\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--mlan_adapter End-->\n"); #ifdef SDIO if (IS_SD(priv->phandle->card_type) && info->mpa_buf && info->mpa_buf_size) { - ptr += sprintf(ptr, "<--mlan_mpa_buf-->\n"); - ptr += sprintf(ptr, "mlan_mpa_buf=%p, size=%d(0x%x)\n", - info->mpa_buf, info->mpa_buf_size, - info->mpa_buf_size); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--mlan_mpa_buf-->\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, + "mlan_mpa_buf=%p, size=%d(0x%x)\n", + info->mpa_buf, info->mpa_buf_size, + info->mpa_buf_size); ptr += woal_save_hex_dump(ROW_SIZE_16, info->mpa_buf, info->mpa_buf_size, MTRUE, ptr); - ptr += sprintf(ptr, "<--mlan_mpa_buf End-->\n"); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--mlan_mpa_buf End-->\n"); } #endif for (i = 0; i < info->mlan_priv_num; i++) { - ptr += sprintf(ptr, "<--mlan_private(%d)-->\n", i); - ptr += sprintf(ptr, "mlan_private=%p, size=%d(0x%x)\n", - info->mlan_priv[i], info->mlan_priv_size[i], - info->mlan_priv_size[i]); + ptr += snprintf(ptr, MAX_BUF_LEN, "<--mlan_private(%d)-->\n", + i); + ptr += snprintf(ptr, MAX_BUF_LEN, + "mlan_private=%p, size=%d(0x%x)\n", + info->mlan_priv[i], info->mlan_priv_size[i], + info->mlan_priv_size[i]); ptr += woal_save_hex_dump(ROW_SIZE_16, info->mlan_priv[i], info->mlan_priv_size[i], MTRUE, ptr); - ptr += sprintf(ptr, "<--mlan_private(%d) End-->\n", i); + ptr += snprintf(ptr, MAX_BUF_LEN, + "<--mlan_private(%d) End-->\n", i); } LEAVE(); @@ -10063,8 +10351,8 @@ mlan_status woal_request_country_power_table(moal_private *priv, char *country) handle = priv->phandle; memset(country_name, 0, sizeof(country_name)); if (handle->params.hw_name) - sprintf(country_name, "%s_txpower_XX.bin", - handle->params.hw_name); + snprintf(country_name, sizeof(country_name), + "%s_txpower_XX.bin", handle->params.hw_name); else memcpy(country_name, "txpower_XX.bin", strlen("txpower_XX.bin")); @@ -10073,8 +10361,8 @@ mlan_status woal_request_country_power_table(moal_private *priv, char *country) if (handle->params.cntry_txpwr == CNTRY_RGPOWER_MODE) { memset(country_name, 0, sizeof(country_name)); if (handle->params.hw_name) - sprintf(country_name, "%s_rgpower_XX.bin", - handle->params.hw_name); + snprintf(country_name, sizeof(country_name), + "%s_rgpower_XX.bin", handle->params.hw_name); else memcpy(country_name, "rgpower_XX.bin", strlen("rgpower_XX.bin")); @@ -10122,8 +10410,8 @@ mlan_status woal_request_country_power_table(moal_private *priv, char *country) (ret == MLAN_STATUS_FILE_ERR)) { memset(country_name, 0, sizeof(country_name)); if (handle->params.hw_name) - sprintf(country_name, "%s_rgpower_WW.bin", - handle->params.hw_name); + snprintf(country_name, sizeof(country_name), + "%s_rgpower_WW.bin", handle->params.hw_name); else memcpy(country_name, "rgpower_WW.bin", strlen("rgpower_WW.bin")); @@ -10517,7 +10805,7 @@ t_void woal_main_work_queue(struct work_struct *work) #endif handle->main_state = MOAL_START_MAIN_PROCESS; /* Call MLAN main process */ - mlan_main_process(handle->pmlan_adapter); + (void)mlan_main_process(handle->pmlan_adapter); handle->main_state = MOAL_END_MAIN_PROCESS; LEAVE(); @@ -10961,7 +11249,7 @@ moal_handle *woal_add_card(void *card, struct device *dev, moal_if_ops *if_ops, } woal_update_firmware_name(handle); #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) wakeup_source_init(&handle->ws, "mwlan"); #else wake_lock_init(&handle->wake_lock, WAKE_LOCK_SUSPEND, "mwlan"); @@ -11002,7 +11290,7 @@ err_init_fw: handle->init_wait_q_woken); } #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) wakeup_source_trash(&handle->ws); #else wake_lock_destroy(&handle->wake_lock); @@ -11211,7 +11499,7 @@ mlan_status woal_remove_card(void *card) PRINTM(MINFO, "unregister device\n"); handle->ops.unregister_dev(handle); #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) wakeup_source_trash(&handle->ws); #else wake_lock_destroy(&handle->wake_lock); @@ -11351,8 +11639,8 @@ exit_sem_err: } #endif -#ifdef SDIO_MMC #define FW_POLL_TRIES 100 +#ifdef SDIO /** * @brief This function reload fw @@ -11370,11 +11658,13 @@ static int woal_reset_and_reload_fw(moal_handle *handle, t_u8 mode) t_u8 reset_val = handle->card_info->fw_reset_val; ENTER(); +#ifdef SDIO_MMC if (mode == FW_RELOAD_SDIO_HW_RESET) { PRINTM(MCMND, "woal_sdio_reset_fw...\n"); woal_sdio_reset_hw(handle); goto reload_fw; } +#endif mlan_pm_wakeup_card(handle->pmlan_adapter, MTRUE); /** wait SOC fully wake up */ for (tries = 0; tries < FW_POLL_TRIES; ++tries) { @@ -11395,11 +11685,10 @@ static int woal_reset_and_reload_fw(moal_handle *handle, t_u8 mode) ret = -EFAULT; goto done; } -#if defined(SD9098) || defined(SD9097) || defined(SDNW62X) || defined(SD9177) if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) || - IS_SDNW62X(handle->card_type) || IS_SD9177(handle->card_type)) + IS_SDIW62X(handle->card_type) || IS_SD9177(handle->card_type) || + IS_SDAW693(handle->card_type)) handle->ops.write_reg(handle, 0x00, 0x10); -#endif /* Poll register around 100 ms */ for (tries = 0; tries < FW_POLL_TRIES; ++tries) { handle->ops.read_reg(handle, reset_reg, &value); @@ -11430,6 +11719,68 @@ done: } #endif +#ifdef PCIE +/** + * @brief This function reload fw for pcie + * + * @param handle A pointer to moal_handle structure + * + * @return 0--success, otherwise failure + */ +static int woal_pcie_reset_and_reload_fw(moal_handle *handle) +{ + int ret = 0, tries = 0; + t_u32 value = 1; + t_u32 reset_reg = handle->card_info->fw_reset_reg; + t_u8 reset_val = handle->card_info->fw_reset_val; + + ENTER(); + if (!IS_PCIE9098(handle->card_type) && + !IS_PCIEIW62X(handle->card_type) && + !IS_PCIEAW693(handle->card_type) && + !IS_PCIE9097(handle->card_type)) { + PRINTM(MERROR, "HW don't support PCIE in-band reset\n"); + return -EFAULT; + } + + mlan_pm_wakeup_card(handle->pmlan_adapter, MTRUE); + + /* Write register to notify FW */ + if (handle->ops.write_reg(handle, reset_reg, reset_val) != + MLAN_STATUS_SUCCESS) { + PRINTM(MERROR, "Failed to write reregister.\n"); + ret = -EFAULT; + goto done; + } + /* Poll register around 100 ms */ + for (tries = 0; tries < FW_POLL_TRIES; ++tries) { + handle->ops.read_reg(handle, reset_reg, &value); + if (value == 0) + /* FW is ready */ + break; + udelay(1000); + } + + if (value) { + PRINTM(MERROR, "Failed to poll FW reset register %X=0x%x\n", + reset_reg, value); + ret = -EFAULT; + goto done; + } + mlan_pm_wakeup_card(handle->pmlan_adapter, MFALSE); + /* Download FW */ + ret = woal_request_fw(handle); + if (ret) { + ret = -EFAULT; + goto done; + } + PRINTM(MMSG, "PCIE FW Reload successfully."); +done: + LEAVE(); + return ret; +} +#endif + /** * @brief This function reload fw * @@ -11571,8 +11922,9 @@ static void woal_post_reset(moal_handle *handle) #ifdef STA_CFG80211 handle->scan_timeout = SCAN_TIMEOUT_25S; #endif - if (MLAN_STATUS_SUCCESS != - woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info)) { + if (priv && + (MLAN_STATUS_SUCCESS != + woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info))) { PRINTM(MERROR, "%s: get_fw_info failed \n", __func__); } woal_get_version(handle, str_buf, sizeof(str_buf) - 1); @@ -11663,7 +12015,12 @@ static void woal_post_reset(moal_handle *handle) } if (handle->params.cntry_txpwr && priv) - woal_request_country_power_table(priv, country_code); + if (MLAN_STATUS_SUCCESS != + woal_request_country_power_table(priv, + country_code)) { + PRINTM(MERROR, + "Failed to get country power table\n"); + } #if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) if (handle->params.cntry_txpwr == CNTRY_RGPOWER_MODE) queue_work(handle->evt_workqueue, @@ -11757,7 +12114,7 @@ int woal_request_fw_reload(moal_handle *phandle, t_u8 mode) } } } -#ifdef SDIO_MMC +#ifdef SDIO else if ((mode == FW_RELOAD_SDIO_INBAND_RESET || mode == FW_RELOAD_SDIO_HW_RESET) && IS_SD(handle->card_type)) { @@ -11774,6 +12131,23 @@ int woal_request_fw_reload(moal_handle *phandle, t_u8 mode) } } } +#endif +#ifdef PCIE + else if (mode == FW_RELOAD_PCIE_INBAND_RESET && + IS_PCIE(handle->card_type)) { + ret = woal_pcie_reset_and_reload_fw(handle); + if (ret) { + PRINTM(MERROR, "woal_pcie_reset_and_reload_fw fail\n"); + goto done; + } + if (ref_handle) { + ret = woal_reload_fw(ref_handle); + if (ret) { + PRINTM(MERROR, "woal_reload_fw fail\n"); + goto done; + } + } + } #endif else ret = -EFAULT; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_main.h b/mxm_wifiex/wlan_src/mlinux/moal_main.h index 8fa4eac..69f7db7 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_main.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_main.h @@ -105,7 +105,7 @@ Change log: #include #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) #include #include #else @@ -160,7 +160,7 @@ Change log: #if defined(IMX_SUPPORT) #if defined(IMX_ANDROID) -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 15, 41) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 15, 52) #undef IMX_ANDROID_13 #define IMX_ANDROID_13 1 #endif @@ -278,6 +278,9 @@ typedef t_u8 BOOLEAN; /** card type SD9177_UART */ #define CARD_TYPE_SD9177_UART 1 // As per datasheet/SoC design +/* Max buffer size */ +#define MAX_BUF_LEN 512 + /** Driver version */ extern char driver_version[]; @@ -423,7 +426,6 @@ static inline void woal_timer_handler(unsigned long fcontext) mod_timer(&timer->tl, jiffies + ((timer->time_period * HZ) / 1000)); } else { - timer->timer_is_canceled = MTRUE; timer->time_period = 0; } } @@ -848,6 +850,8 @@ typedef enum { #define CUS_EVT_RADAR_DETECTED "EVENT=RADAR_DETECTED" /** Custom event : CAC finished */ #define CUS_EVT_CAC_FINISHED "EVENT=CAC_FINISHED" +/** Custom event : CAC start */ +#define CUS_EVT_CAC_START "EVENT=CAC_START" #ifdef UAP_SUPPORT void woal_move_to_next_channel(moal_private *priv); void woal_chan_event(moal_private *priv, t_u8 type, t_u8 channel, t_u8 radar); @@ -1445,6 +1449,10 @@ struct _moal_private { t_u8 target_chan; /** backup channel */ t_u8 backup_chan; + /** channel mode for channel switch */ + t_u8 chan_mode; + /** number of csa for channel switch */ + t_u8 chan_num_pkts; /** uAP skip CAC*/ BOOLEAN skip_cac; /** tx block flag */ @@ -1828,6 +1836,8 @@ typedef struct _card_info { t_u32 host_strap_reg; /* Chip Magic Register */ t_u32 magic_reg; + /** Chip boot mode reg */ + t_u32 boot_mode_reg; /* FW Name */ char fw_name[FW_NAMW_MAX_LEN]; char fw_name_wlan[FW_NAMW_MAX_LEN]; @@ -1841,10 +1851,12 @@ typedef struct _card_info { t_u8 scratch_reg; t_u8 func1_reg_start; t_u8 func1_reg_end; - t_u32 fw_reset_reg; - t_u8 fw_reset_val; t_u32 slew_rate_reg; t_u8 slew_rate_bit_offset; +#endif +#if defined(SDIO) || defined(PCIE) + t_u32 fw_reset_reg; + t_u8 fw_reset_val; #endif t_u8 sniffer_support; t_u8 per_pkt_cfg_support; @@ -1881,6 +1893,10 @@ struct channel_field { #define RX_BW_20L 2 #define RX_BW_20U 3 #define RX_BW_80 4 +#define RX_HE_BW_20 0 +#define RX_HE_BW_40 1 +#define RX_HE_BW_80 2 +#define RX_HE_BW_160 3 /** mcs_field.flags The flags field is any combination of the following: 0x03 bandwidth - 0: 20, 1: 40, 2: 20L, 3: 20U @@ -1943,6 +1959,165 @@ struct vht_field { t_u16 partial_aid; } __packed; +#define HE_BSS_COLOR_KNOWN 0x0002 +#define HE_BEAM_CHANGE_KNOWN 0x0004 +#define HE_UL_DL_KNOWN 0x0008 +#define HE_MCS_KNOWN 0x0020 +#define HE_DCM_KNOWN 0x0040 +#define HE_CODING_KNOWN 0x0080 +#define HE_BW_KNOWN 0x4000 +#define HE_DATA_GI_KNOWN 0x0002 +#define HE_MU_DATA 0x0002 +#define HE_CODING_LDPC_USER0 0x2000 +/** he_field - COCO */ +struct he_field { + t_u8 pad; + t_u16 data1; + t_u16 data2; + t_u16 data3; + t_u16 data4; + t_u16 data5; + t_u16 data6; +} __packed; + +extern t_u8 ru_signal[16][9]; +extern t_u8 ru_signal_106[14][9]; +extern t_u8 ru_signal_52[9]; + +#define MLAN_20_BIT_CH1P 0xC0000000 +#define MLAN_20_BIT_CH1S 0x0000003F +#define MLAN_20_BIT_CH2 0x007F8000 +#define MLAN_80_CENTER_RU 0x00004000 +#define MLAN_160_CENTER_RU 0x40000000 +#define MLAN_20_BIT_CH3 0x00003FC0 +#define MLAN_20_BIT_CH4 0x7F800000 +#define MLAN_BIT_160_CH3 0x003FC000 +#define MLAN_BIT_160_CH4 0x03FC0000 + +#define MLAN_DECODE_RU_SIGNALING_CH1(out, x, y) \ + { \ + x = (((x << 8) & MLAN_20_BIT_CH1P)) >> 30; \ + out = x | ((y & MLAN_20_BIT_CH1S) << 2); \ + } + +#define MLAN_DECODE_RU_SIGNALING_CH3(out, x, y) \ + { \ + out = ((y & MLAN_20_BIT_CH3) >> 6); \ + } + +#define MLAN_DECODE_RU_SIGNALING_CH2(out, x, y) \ + { \ + out = ((y & MLAN_20_BIT_CH2) >> 15); \ + } + +#define MLAN_DECODE_RU_SIGNALING_CH4(out, x, y) \ + { \ + out = ((y & MLAN_20_BIT_CH4) >> 23); \ + } + +#define MLAN_DECODING_160_RU_CH3(out, x, y) \ + { \ + out = ((y & MLAN_BIT_160_CH3) >> 5); \ + } + +#define MLAN_DECODING_160_RU_CH4(out, x, y) \ + { \ + out = ((y & MLAN_BIT_160_CH4) >> 22); \ + } + +#define RU_SIGNAL_52_TONE 112 +#define TONE_MAX_USERS_52 4 +#define TONE_MAX_USERS_242 3 +#define RU_SIGNAL_26_TONE 0 +#define TONE_MAX_USERS_26 8 +#define RU_26_TONE_LIMIT 15 +#define RU_TONE_LIMIT 96 +#define RU_80_106_TONE 128 +#define RU_40_242_TONE 192 +#define RU_80_484_TONE 200 +#define RU_160_996_TONE 208 +#define RU_TONE_26 4 +#define RU_TONE_52 5 +#define RU_TONE_106 6 +#define RU_TONE_242 7 +#define RU_TONE_484 8 +#define RU_TONE_996 9 + +#define MLAN_DECODE_RU_TONE(x, y, tone) \ + { \ + if ((x == RU_SIGNAL_52_TONE)) { \ + if (((y + 1) <= TONE_MAX_USERS_52)) { \ + tone = RU_TONE_52; \ + } else { \ + y = (y + 1) - TONE_MAX_USERS_52; \ + } \ + } else if (x == RU_SIGNAL_26_TONE) { \ + if ((y + 1) <= TONE_MAX_USERS_26) { \ + tone = RU_TONE_26; \ + } else { \ + y = (y + 1) - TONE_MAX_USERS_26; \ + } \ + } else if (x <= RU_TONE_LIMIT) { \ + t_u32 ru_arr_idx; \ + ru_arr_idx = x > RU_26_TONE_LIMIT ? 1 : 0; \ + if ((y + 1) > (ru_arr_idx ? ru_signal_106[x / 8][8] : \ + ru_signal[x][8])) { \ + y = (y + 1) - \ + (ru_arr_idx ? ru_signal_106[x / 8][8] : \ + ru_signal[x][8]); \ + } else { \ + t_u32 ind = 0; \ + t_u32 idx = 0; \ + while (ind < 8) { \ + t_u32 tn = \ + ru_arr_idx ? \ + ru_signal_106[x / 8] \ + [7 - ind] : \ + ru_signal[x][7 - ind]; \ + ind++; \ + if (tn == 0x1 || tn == 0x0 || \ + tn == 0x2) { \ + if (idx == y) { \ + tone = tn ? (tn == \ + 2) ? \ + RU_TONE_106 : \ + RU_TONE_52 : \ + RU_TONE_26; \ + break; \ + } else { \ + idx++; \ + } \ + } \ + } \ + } \ + } else if (x == RU_80_106_TONE) { \ + if ((y + 1) > TONE_MAX_USERS_242) { \ + y = (y + 1) - TONE_MAX_USERS_242; \ + } else { \ + tone = (y == 2) ? RU_TONE_106 : \ + (y == 1) ? 0 : RU_TONE_106; \ + } \ + } else if (x == RU_40_242_TONE) { \ + if (!y) { \ + tone = RU_TONE_242; \ + } else { \ + y--; \ + } \ + } else if (x == RU_80_484_TONE) { \ + if (!y) { \ + tone = RU_TONE_484; \ + } else { \ + y--; \ + } \ + } else if (x == RU_160_996_TONE) { \ + if (!y) { \ + tone = RU_TONE_996; \ + } else { \ + y--; \ + } \ + } \ + } + /** radiotap_body.flags */ #define RADIOTAP_FLAGS_DURING_CFG 0x01 #define RADIOTAP_FLAGS_SHORT_PREAMBLE 0x02 @@ -1975,6 +2150,8 @@ struct radiotap_body { struct mcs_field mcs; /** vht field */ struct vht_field vht; + /** he field */ + struct he_field he; } u; } __packed; @@ -2076,6 +2253,7 @@ typedef struct _monitor_iface { #endif #define MAX_KEEP_ALIVE_ID 4 +#define MAX_KEEP_ALIVE_RX_ID 4 /** Operation data structure for MOAL bus interfaces */ typedef struct _moal_if_ops { @@ -2161,6 +2339,9 @@ typedef struct _moal_mod_para { int rf_test_mode; char *hw_name; int drv_mode; +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + int mon_filter; +#endif #ifdef DEBUG_LEVEL1 int drvdbg; #endif @@ -2240,12 +2421,15 @@ typedef struct _moal_mod_para { t_u8 mcs32; #if defined(CONFIG_RPS) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) /* rps module param */ int rps; #endif #endif int keep_previous_scan; + int auto_11ax; + /** hs_auto_arp setting */ + int hs_auto_arp; } moal_mod_para; void woal_tp_acnt_timer_func(void *context); @@ -2256,7 +2440,7 @@ void woal_set_tp_state(moal_private *priv); #define RX_DROP_P3 (MAX_TP_ACCOUNT_DROP_POINT_NUM + 2) #define RX_DROP_P4 (MAX_TP_ACCOUNT_DROP_POINT_NUM + 3) #define RX_DROP_P5 (MAX_TP_ACCOUNT_DROP_POINT_NUM + 4) -#define TXRX_MAX_SAMPLE 60 +#define TXRX_MAX_SAMPLE 50 #define RX_TIME_PKT (MAX_TP_ACCOUNT_DROP_POINT_NUM + 5) #define TX_TIME_PKT (MAX_TP_ACCOUNT_DROP_POINT_NUM + 6) @@ -2281,6 +2465,8 @@ typedef struct _moal_tp_acnt_t { unsigned long tx_xmit_skb_realloc_cnt; unsigned long tx_stop_queue_cnt; unsigned long tx_delay_driver[TXRX_MAX_SAMPLE]; + /* drop_point1 to drop_point3 time */ + unsigned long tx_delay1_driver[TXRX_MAX_SAMPLE]; /** RX accounting */ unsigned long rx_packets[MAX_TP_ACCOUNT_DROP_POINT_NUM]; @@ -2463,6 +2649,10 @@ struct _moal_handle { /** Bitmap for re-association on/off */ t_u8 reassoc_on; #endif /* REASSOCIATION */ + /** RTT capability */ + wifi_rtt_capabilities rtt_capa; + /** RTT config */ + wifi_rtt_config_params_t rtt_params; /** Driver workqueue */ struct workqueue_struct *workqueue; /** main work */ @@ -2612,6 +2802,8 @@ struct _moal_handle { struct semaphore async_sem; /** scan channel gap */ t_u16 scan_chan_gap; + /** flag to check if specific scan time set by scancfg */ + t_u8 user_scan_cfg; #ifdef STA_CFG80211 /** CFG80211 scan request description */ struct cfg80211_scan_request *scan_request; @@ -2680,7 +2872,7 @@ struct _moal_handle { t_s8 driver_version[MLAN_MAX_VER_STR_LEN]; char *fwdump_fname; #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) struct wakeup_source ws; #else struct wake_lock wake_lock; @@ -2696,6 +2888,7 @@ struct _moal_handle { #endif #endif mlan_ds_misc_keep_alive keep_alive[MAX_KEEP_ALIVE_ID]; + mlan_ds_misc_keep_alive_rx keep_alive_rx[MAX_KEEP_ALIVE_RX_ID]; struct net_device napi_dev; struct napi_struct napi_rx; /* bus interface operations */ @@ -3338,7 +3531,7 @@ pmlan_ioctl_req woal_alloc_mlan_ioctl_req(int size); /** Free buffer */ void woal_free_mlan_buffer(moal_handle *handle, pmlan_buffer pmbuf); /** Get private structure of a BSS by index */ -moal_private *woal_bss_index_to_priv(moal_handle *handle, t_u8 bss_index); +moal_private *woal_bss_index_to_priv(moal_handle *handle, t_u32 bss_index); /* Functions in init module */ /** init module parameters */ mlan_status woal_init_module_param(moal_handle *handle); @@ -3653,6 +3846,8 @@ mlan_status woal_reset_intf(moal_private *priv, t_u8 wait_option, int all_intf); #define MGMT_MASK_ASSOC_RESP_QOS_MAP 0x4000 #define MGMT_MASK_BEACON_WPS_P2P 0x8000 #define MLAN_CUSTOM_IE_DELETE_MASK 0x0 +#define MLAN_CUSTOM_IE_NEW_MASK 0x8000 + /** common ioctl for uap, station */ int woal_custom_ie_ioctl(struct net_device *dev, struct ifreq *req); #ifdef UAP_SUPPORT @@ -3890,6 +4085,27 @@ int woal_priv_save_cloud_keep_alive_params( moal_private *priv, t_u8 mkeep_alive_id, t_u8 enable, t_u16 ether_type, t_u8 *ip_pkt, t_u16 ip_pkt_len, t_u8 *src_mac, t_u8 *dst_mac, t_u32 period_msec, t_u32 retry_interval, t_u8 retry_cnt); +int woal_start_mkeep_alive_rx(moal_private *priv, t_u8 mkeep_alive_id, + t_u8 *ip_pkt, t_u16 ip_pkt_len, t_u8 *src_mac, + t_u8 *dst_mac); +int woal_stop_mkeep_alive_rx(moal_private *priv, t_u8 mkeep_alive_id, + t_u8 reset, t_u8 *ip_pkt, t_u8 *pkt_len); +int woal_priv_save_cloud_keep_alive_params_rx(moal_private *priv, + t_u8 mkeep_alive_id, t_u8 enable, + t_u16 ether_type, t_u8 *ip_pkt, + t_u16 ip_pkt_len, t_u8 *src_mac, + t_u8 *dst_mac); +void woal_channel_info_to_bandcfg(moal_private *priv, + wifi_channel_info *ch_info, + Band_Config_t *bandcfg); +void woal_bandcfg_to_channel_info(moal_private *priv, Band_Config_t *bandcfg, + t_u8 channel, wifi_channel_info *ch_info); +mlan_status woal_config_rtt(moal_private *priv, t_u8 wait_option, + wifi_rtt_config_params_t *rtt_params); +mlan_status woal_cancel_rtt(moal_private *priv, t_u8 wait_option, + t_u32 addr_num, t_u8 addr[][MLAN_MAC_ADDR_LENGTH]); +mlan_status woal_rtt_responder_cfg(moal_private *priv, t_u8 wait_option, + mlan_rtt_responder *rtt_rsp_cfg); #ifdef UAP_SUPPORT mlan_status woal_set_wacp_mode(moal_private *priv, t_u8 wait_option); #endif diff --git a/mxm_wifiex/wlan_src/mlinux/moal_pcie.c b/mxm_wifiex/wlan_src/mlinux/moal_pcie.c index 0a1d7eb..e7d60e1 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_pcie.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_pcie.c @@ -116,10 +116,26 @@ static const struct pci_device_id wlan_ids[] = { 0, }, #endif -#ifdef PCIENW62X { PCIE_VENDOR_ID_NXP, - PCIE_DEVICE_ID_88WNW62X, + PCIE_DEVICE_ID_88WAW693_FN0, + PCI_ANY_ID, + PCI_ANY_ID, + 0, + 0, + }, + { + PCIE_VENDOR_ID_NXP, + PCIE_DEVICE_ID_88WAW693_FN1, + PCI_ANY_ID, + PCI_ANY_ID, + 0, + 0, + }, +#ifdef PCIEIW62X + { + PCIE_VENDOR_ID_NXP, + PCIE_DEVICE_ID_88WIW62X, PCI_ANY_ID, PCI_ANY_ID, 0, @@ -141,11 +157,8 @@ static moal_if_ops pcie_ops; ********************************************************/ static mlan_status woal_pcie_preinit(struct pci_dev *pdev); -#if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \ - defined(PCIE9097) || defined(PCIENW62X) static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, t_u8 resetflag); -#endif /** @brief This function updates the card types * @@ -213,11 +226,11 @@ static t_u16 woal_update_card_type(t_void *card) strlen(KERN_VERSION)); } #endif -#ifdef PCIENW62X - if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WNW62X) { - card_type = CARD_TYPE_PCIENW62X; - moal_memcpy_ext(NULL, driver_version, CARD_PCIENW62X, - strlen(CARD_PCIENW62X), strlen(driver_version)); + if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WAW693_FN0 || + cardp_pcie->dev->device == PCIE_DEVICE_ID_88WAW693_FN1) { + card_type = CARD_TYPE_PCIEAW693; + moal_memcpy_ext(NULL, driver_version, CARD_PCIEAW693, + strlen(CARD_PCIEAW693), strlen(driver_version)); moal_memcpy_ext(NULL, driver_version + strlen(INTF_CARDTYPE) + strlen(KERN_VERSION), @@ -225,6 +238,18 @@ static t_u16 woal_update_card_type(t_void *card) strlen(driver_version) - strlen(INTF_CARDTYPE) - strlen(KERN_VERSION)); } +#ifdef PCIEIW62X + if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WIW62X) { + card_type = CARD_TYPE_PCIEIW62X; + moal_memcpy_ext(NULL, driver_version, CARD_PCIEIW62X, + strlen(CARD_PCIEIW62X), strlen(driver_version)); + moal_memcpy_ext(NULL, + driver_version + strlen(INTF_CARDTYPE) + + strlen(KERN_VERSION), + V18, strlen(V18), + strlen(driver_version) - strlen(INTF_CARDTYPE) - + strlen(KERN_VERSION)); + } #endif return card_type; @@ -273,7 +298,8 @@ static mlan_status woal_do_flr(moal_handle *handle, bool prepare, bool flr_flag) if (!IS_PCIE8997(handle->card_type) && !IS_PCIE9097(handle->card_type) && - !IS_PCIENW62X(handle->card_type) && + !IS_PCIEIW62X(handle->card_type) && + !IS_PCIEAW693(handle->card_type) && !IS_PCIE9098(handle->card_type)) { LEAVE(); return status; @@ -359,11 +385,10 @@ perform_init: goto err_init_fw; } -#ifdef PCIE9098 - if (card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) + if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) || + (card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1)) mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1); else -#endif /* Update pcie_int_mode in mlan adapter */ mlan_set_int_mode(handle->pmlan_adapter, handle->params.pcie_int_mode, 0); @@ -404,7 +429,7 @@ err_init_fw: handle->init_wait_q_woken); } #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) wakeup_source_trash(&handle->ws); #else wake_lock_destroy(&handle->wake_lock); @@ -573,14 +598,12 @@ static void woal_pcie_shutdown(struct pci_dev *dev) handle = card->handle; if (handle->second_mac) goto done; -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) - if (IS_PCIE9098(handle->card_type) || IS_PCIENW62X(handle->card_type) || - IS_PCIE9097(handle->card_type)) { + if (IS_PCIE9098(handle->card_type) || IS_PCIEIW62X(handle->card_type) || + IS_PCIEAW693(handle->card_type) || IS_PCIE9097(handle->card_type)) { if (RDWR_STATUS_FAILURE != woal_pcie_rdwr_firmware(handle, 0, 1)) PRINTM(MMSG, "wlan: start in-bound IR...\n"); } -#endif done: handle->surprise_removed = MTRUE; pci_disable_device(dev); @@ -1418,11 +1441,10 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle) break; } -#ifdef PCIE9098 - if (card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) + if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) || + (card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1)) mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1); else -#endif mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 0); done: @@ -1545,24 +1567,20 @@ void woal_pcie_bus_unregister(void) LEAVE(); } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) #define PCIE9098_DUMP_CTRL_REG 0x1C94 #define PCIE9098_DUMP_START_REG 0x1C98 #define PCIE9098_DUMP_END_REG 0x1C9F -#endif #if defined(PCIE8897) || defined(PCIE8997) #define DEBUG_DUMP_CTRL_REG 0xCF4 #define DEBUG_DUMP_START_REG 0xCF8 #define DEBUG_DUMP_END_REG 0xCFF #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) #define PCIE9098_SCRATCH_12_REG 0x1C90 #define PCIE9098_SCRATCH_14_REG 0x1C98 #define PCIE9098_SCRATCH_15_REG 0x1C9C #define PCIE9098_DUMP_REG_START 0x1C20 #define PCIE9098_DUMP_REG_END 0x1C9C -#endif #if defined(PCIE8997) || defined(PCIE8897) #define PCIE_SCRATCH_12_REG 0x0CF0; @@ -1592,11 +1610,9 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) t_u32 dump_end_reg = 0; t_u32 scratch_14_reg = 0; t_u32 scratch_15_reg = 0; -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) /* Tx/Rx/Event AMDA start address */ t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080}; t_u8 j; -#endif ENTER(); mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE); drv_ptr += sprintf(drv_ptr, @@ -1620,9 +1636,9 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { reg = PCIE9098_SCRATCH_12_REG; dump_start_reg = PCIE9098_DUMP_REG_START; @@ -1630,7 +1646,6 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) scratch_14_reg = PCIE9098_SCRATCH_14_REG; scratch_15_reg = PCIE9098_SCRATCH_15_REG; } -#endif woal_pcie_read_reg(phandle, reg, &value); drv_ptr += sprintf(drv_ptr, "reg:0x%x value=0x%x\n", reg, value); @@ -1664,9 +1679,9 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) } i++; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { drv_ptr += sprintf( drv_ptr, @@ -1687,7 +1702,8 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) drv_ptr += sprintf(drv_ptr, "%s\n", buf); } if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { drv_ptr += sprintf(drv_ptr, "ADMA Tx/Rx/Event/Cmd/CmdResp registers:\n"); @@ -1714,7 +1730,6 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) drv_ptr += sprintf(drv_ptr, "%s\n", buf); } } -#endif drv_ptr += sprintf(drv_ptr, "-----------PCIe Registers dump End-----------\n"); mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); @@ -1741,11 +1756,9 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) t_u32 dump_end_reg = 0; t_u32 scratch_14_reg = 0; t_u32 scratch_15_reg = 0; -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) /* Tx/Rx/Event AMDA start address */ t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080}; t_u8 j; -#endif mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE); PRINTM(MMSG, "Config Space Registers:\n"); for (i = 0; i < ARRAY_SIZE(config_reg_table); i++) { @@ -1765,9 +1778,9 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { reg = PCIE9098_SCRATCH_12_REG; dump_start_reg = PCIE9098_DUMP_START_REG; @@ -1775,7 +1788,6 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) scratch_14_reg = PCIE9098_SCRATCH_14_REG; scratch_15_reg = PCIE9098_SCRATCH_15_REG; } -#endif woal_pcie_read_reg(phandle, reg, &value); PRINTM(MERROR, "reg:0x%x value=0x%x\n", reg, value); for (i = 0; i < 2; i++) { @@ -1804,9 +1816,9 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) } i++; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { PRINTM(MMSG, "PCIE registers from offset 0x1c20 to 0x1c9c:\n"); memset(buf, 0, sizeof(buf)); @@ -1825,7 +1837,8 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) PRINTM(MMSG, "%s\n", buf); } if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { PRINTM(MMSG, "ADMA Tx/Rx/Event/Cmd/CmdResp registers:\n"); for (j = 0; j < ARRAY_SIZE(adma_reg_table); j++) { @@ -1849,7 +1862,6 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) PRINTM(MMSG, "%s\n", buf); } } -#endif mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); } @@ -1892,18 +1904,12 @@ static memory_type_mapping mem_type_mapping_tbl_8897[] = { }; #endif -#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ - defined(PCIENW62X) #define DEBUG_HOST_READY_8997 0xCC #define DEBUG_HOST_EVENT_READY 0xAA #define DEBUG_HOST_RESET_READY 0x99 static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL, 0xDD, 0x00}; -#endif - -#if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \ - defined(PCIE9097) || defined(PCIENW62X) /** * @brief This function reads data by 8 bit from card register * @@ -1953,9 +1959,9 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, } #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { if (phandle->event_fw_dump) debug_host_ready = DEBUG_HOST_EVENT_READY; @@ -1965,7 +1971,6 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, debug_host_ready = DEBUG_HOST_RESET_READY; dump_ctrl_reg = PCIE9098_DUMP_CTRL_REG; } -#endif ret = woal_pcie_write_reg(phandle, dump_ctrl_reg, debug_host_ready); if (ret) { @@ -1973,14 +1978,13 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, dump_ctrl_reg, debug_host_ready); return RDWR_STATUS_FAILURE; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { if (phandle->event_fw_dump || resetflag) return RDWR_STATUS_SUCCESS; } -#endif ret = woal_pcie_read_reg(phandle, dump_ctrl_reg, ®_data); if (ret) { PRINTM(MERROR, "PCIE Read DEBUG_DUMP_CTRL_REG 0x%x fail\n", @@ -2023,7 +2027,6 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, } return RDWR_STATUS_SUCCESS; } -#endif #ifdef PCIE8897 /** @@ -2185,8 +2188,6 @@ done: } #endif -#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ - defined(PCIENW62X) /** * @brief This function dump firmware memory to file * @@ -2214,9 +2215,9 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) PRINTM(MERROR, "Could not dump firmwware info\n"); return; } -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { if (phandle->event_fw_dump) { if (RDWR_STATUS_FAILURE != @@ -2227,7 +2228,6 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) } } } -#endif /* start dump fw memory */ moal_get_system_time(phandle, &sec, &usec); @@ -2237,14 +2237,13 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) if (RDWR_STATUS_FAILURE == woal_pcie_rdwr_firmware(phandle, doneflag, 0)) goto done; -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) if (IS_PCIE9098(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { dump_start_reg = PCIE9098_DUMP_START_REG; dump_end_reg = PCIE9098_DUMP_END_REG; } -#endif #ifdef PCIE8997 if (IS_PCIE8997(phandle->card_type)) { dump_start_reg = DEBUG_DUMP_START_REG; @@ -2351,7 +2350,6 @@ done: return; } -#endif /** * @brief This function check if this is second mac @@ -2362,26 +2360,28 @@ done: */ static t_u8 woal_pcie_is_second_mac(moal_handle *handle) { -#ifdef PCIE9098 pcie_service_card *card = (pcie_service_card *)handle->card; - if (card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) + if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) || + (card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1)) return MTRUE; -#endif return MFALSE; } static void woal_pcie_dump_fw_info(moal_handle *phandle) { + if (phandle->fw_dump_buf) { + PRINTM(MERROR, "FW dump already exist\n"); + return; + } mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE); phandle->fw_dump = MTRUE; #ifdef PCIE8897 if (IS_PCIE8897(phandle->card_type)) woal_pcie_dump_fw_info_v1(phandle); #endif -#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ - defined(PCIENW62X) if (IS_PCIE8997(phandle->card_type) || - IS_PCIENW62X(phandle->card_type) || + IS_PCIEAW693(phandle->card_type) || + IS_PCIEIW62X(phandle->card_type) || IS_PCIE9098(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { woal_pcie_dump_fw_info_v2(phandle); @@ -2393,7 +2393,6 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle) return; } } -#endif phandle->fw_dump = MFALSE; if (!phandle->priv_num) return; @@ -2407,23 +2406,19 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle) static mlan_status woal_pcie_get_fw_name(moal_handle *handle) { mlan_status ret = MLAN_STATUS_SUCCESS; -#ifdef PCIE9098 pcie_service_card *card = (pcie_service_card *)handle->card; moal_handle *ref_handle = NULL; -#endif -#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ - defined(PCIENW62X) t_u32 rev_id_reg = handle->card_info->rev_id_reg; t_u32 revision_id = 0; -#endif -#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ - defined(PCIENW62X) t_u32 host_strap_reg = handle->card_info->host_strap_reg; t_u32 magic_reg = handle->card_info->magic_reg; t_u32 strap = 0; t_u32 magic = 0; +#ifdef PCIEIW62X + t_u32 boot_mode_reg = handle->card_info->boot_mode_reg; + t_u32 boot_mode; #endif ENTER(); @@ -2577,24 +2572,56 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle) } } #endif -#ifdef PCIENW62X - if (IS_PCIENW62X(handle->card_type)) { + if (IS_PCIEAW693(handle->card_type)) { + if (card->dev->device == PCIE_DEVICE_ID_88WAW693_FN0) { + woal_pcie_read_reg(handle, rev_id_reg, &revision_id); + woal_pcie_read_reg(handle, host_strap_reg, &strap); + woal_pcie_read_reg(handle, magic_reg, &magic); + revision_id &= 0xff; + strap &= 0x7; + magic &= 0xff; + PRINTM(MCMND, + "magic=0x%x, strap=0x%x, revision_id=0x%x\n", + magic, strap, revision_id); + if (magic == CHIP_MAGIC_VALUE) { + if (strap == CARD_TYPE_PCIE_UART) + strcpy(handle->card_info->fw_name, + PCIEUARTAW693_DEFAULT_COMBO_FW_NAME); + else + strcpy(handle->card_info->fw_name, + PCIEAW693_DEFAULT_COMBO_FW_NAME); + } + } else { + ref_handle = (moal_handle *)handle->pref_mac; + if (ref_handle) { + strcpy(handle->card_info->fw_name, + ref_handle->card_info->fw_name); + strcpy(handle->card_info->fw_name_wlan, + ref_handle->card_info->fw_name_wlan); + } + } + } +#ifdef PCIEIW62X + if (IS_PCIEIW62X(handle->card_type)) { woal_pcie_read_reg(handle, rev_id_reg, &revision_id); woal_pcie_read_reg(handle, host_strap_reg, &strap); woal_pcie_read_reg(handle, magic_reg, &magic); + woal_pcie_read_reg(handle, boot_mode_reg, &boot_mode); revision_id &= 0xff; strap &= 0x7; magic &= 0xff; - PRINTM(MCMND, "magic=0x%x, strap=0x%x, revision_id=0x%x\n", - magic, strap, revision_id); - if (magic == CHIP_MAGIC_VALUE) { - if (strap == CARD_TYPE_PCIE_UART) - strcpy(handle->card_info->fw_name, - PCIEUARTNW62X_DEFAULT_COMBO_FW_NAME); - else - strcpy(handle->card_info->fw_name, - PCIEUSBNW62X_DEFAULT_COMBO_FW_NAME); - } + boot_mode &= 0x03; + PRINTM(MCMND, + "magic=0x%x boot_mode=0x%x, strap=0x%x, revision_id=0x%x\n", + magic, boot_mode, strap, revision_id); + if (boot_mode == 0x03) + PRINTM(MMSG, "wlan: PCIE-IW62X in secure-boot mode\n"); + if (strap == CARD_TYPE_PCIE_UART) + strcpy(handle->card_info->fw_name, + PCIEUARTIW62X_DEFAULT_COMBO_FW_NAME); + else + strcpy(handle->card_info->fw_name, + PCIEUSBIW62X_DEFAULT_COMBO_FW_NAME); } #endif done: diff --git a/mxm_wifiex/wlan_src/mlinux/moal_pcie.h b/mxm_wifiex/wlan_src/mlinux/moal_pcie.h index dfa1e2e..006fc5d 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_pcie.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_pcie.h @@ -47,17 +47,20 @@ Change log: #define PCIE_DEVICE_ID_88W9097 (0x2b56) #endif -#ifdef PCIE9098 /** PCIE device ID for 9098 card FN0 */ #define PCIE_DEVICE_ID_88W9098P_FN0 (0x2b43) /** PCIE device ID for 9098 card FN1 */ #define PCIE_DEVICE_ID_88W9098P_FN1 (0x2b44) + +#ifdef PCIEIW62X +/** PCIE device ID for IW62X card FN0 */ +#define PCIE_DEVICE_ID_88WIW62X (0x3000) #endif -#ifdef PCIENW62X -/** PCIE device ID for NW62X card FN0 */ -#define PCIE_DEVICE_ID_88WNW62X (0x3000) -#endif +/** PCIE device ID for AW693 card FN0 */ +#define PCIE_DEVICE_ID_88WAW693_FN0 (0x3003) +/** PCIE device ID for AW693 card FN1 */ +#define PCIE_DEVICE_ID_88WAW693_FN1 (0x3004) #include #include @@ -84,6 +87,10 @@ Change log: #define PCIE8897_DEFAULT_WLAN_FW_NAME "nxp/pcie8897_wlan.bin" #endif /* PCIE8897*/ +#define PCIEUARTAW693_DEFAULT_COMBO_FW_NAME "nxp/pcieuartAW693_combo.bin" +#define PCIEAW693_DEFAULT_COMBO_FW_NAME "nxp/pcieAW693_wlan.bin" +#define PCIEAW693_DEFAULT_WLAN_FW_NAME "nxp/pcieAW693_wlan.bin" + #ifdef PCIE9098 #define PCIE9098_Z1Z2 0x00 #define PCIE9098_A0 0x01 @@ -113,18 +120,14 @@ Change log: #define PCIE9097_WLAN_V1_FW_NAME "nxp/pcieiw620_wlan_v1.bin" #endif /* PCIE9097 */ -#ifdef PCIENW62X -#define PCIENW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbnw62x_combo.bin" -#define PCIEUARTNW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieuartnw62x_combo.bin" -#define PCIEUSBNW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbnw62x_combo.bin" -#define PCIENW62X_DEFAULT_WLAN_FW_NAME "nxp/pcienw62x_wlan.bin" -#endif /* PCIENW62X */ +#ifdef PCIEIW62X +#define PCIEIW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw62x_combo.bin" +#define PCIEUARTIW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieuartiw62x_combo.bin" +#define PCIEUSBIW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw62x_combo.bin" +#define PCIEIW62X_DEFAULT_WLAN_FW_NAME "nxp/pcieiw62x_wlan.bin" +#endif /* PCIEIW62X */ -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) #define PCIE_NUM_MSIX_VECTORS 32 -#else -#define PCIE_NUM_MSIX_VECTORS 4 -#endif typedef struct _msix_context { /** pci_dev structure pointer */ diff --git a/mxm_wifiex/wlan_src/mlinux/moal_priv.c b/mxm_wifiex/wlan_src/mlinux/moal_priv.c index fdab5cd..ce182ab 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_priv.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_priv.c @@ -515,7 +515,7 @@ static int woal_deep_sleep_ioctl(moal_private *priv, struct iwreq *wrq) */ static int woal_11n_htcap_cfg(moal_private *priv, struct iwreq *wrq) { - int data[2], copy_len; + int data[2] = {0}, copy_len; mlan_ioctl_req *req = NULL; mlan_ds_11n_cfg *cfg_11n = NULL; int ret = 0; @@ -886,7 +886,7 @@ error: */ static int woal_addba_reject(moal_private *priv, struct iwreq *wrq) { - int data[MAX_NUM_TID], ret = 0, i, copy_len; + int data[MAX_NUM_TID] = {0}, ret = 0, i, copy_len; mlan_ioctl_req *req = NULL; mlan_ds_11n_cfg *cfg_11n = NULL; int data_length = wrq->u.data.length; @@ -1160,7 +1160,9 @@ static int woal_hs_cfg(moal_private *priv, struct iwreq *wrq, if (data_length && (data[0] != (int)HOST_SLEEP_CFG_CANCEL || invoke_hostcmd == MFALSE)) { memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) + PRINTM(MINFO, "Fail to get bss_info\n"); if (bss_info.is_hs_configured) { PRINTM(MERROR, "HS already configured\n"); ret = -EFAULT; @@ -1170,8 +1172,11 @@ static int woal_hs_cfg(moal_private *priv, struct iwreq *wrq, /* Do a GET first if some arguments are not provided */ if (data_length >= 1 && data_length < 3) { - woal_set_get_hs_params(priv, MLAN_ACT_GET, MOAL_IOCTL_WAIT, - &hscfg); + if (MLAN_STATUS_SUCCESS != + woal_set_get_hs_params(priv, MLAN_ACT_GET, MOAL_IOCTL_WAIT, + &hscfg)) { + PRINTM(MERROR, "Unable to get HS params\n"); + } } if (data_length) @@ -1963,130 +1968,144 @@ static int woal_get_log(moal_private *priv, struct iwreq *wrq) } if (wrq->u.data.pointer) { - sprintf(buf, - "\n" - "mcasttxframe %u\n" - "failed %u\n" - "retry %u\n" - "multiretry %u\n" - "framedup %u\n" - "rtssuccess %u\n" - "rtsfailure %u\n" - "ackfailure %u\n" - "rxfrag %u\n" - "mcastrxframe %u\n" - "fcserror %u\n" - "txframe %u\n" - "wepicverrcnt-1 %u\n" - "wepicverrcnt-2 %u\n" - "wepicverrcnt-3 %u\n" - "wepicverrcnt-4 %u\n" - "beacon_rcnt %u\n" - "beacon_mcnt %u\n", - stats.mcast_tx_frame, stats.failed, stats.retry, - stats.multi_retry, stats.frame_dup, stats.rts_success, - stats.rts_failure, stats.ack_failure, stats.rx_frag, - stats.mcast_rx_frame, stats.fcs_error, stats.tx_frame, - stats.wep_icv_error[0], stats.wep_icv_error[1], - stats.wep_icv_error[2], stats.wep_icv_error[3], - stats.bcn_rcv_cnt, stats.bcn_miss_cnt); + snprintf(buf, GETLOG_BUFSIZE, + "\n" + "mcasttxframe %u\n" + "failed %u\n" + "retry %u\n" + "multiretry %u\n" + "framedup %u\n" + "rtssuccess %u\n" + "rtsfailure %u\n" + "ackfailure %u\n" + "rxfrag %u\n" + "mcastrxframe %u\n" + "fcserror %u\n" + "txframe %u\n" + "wepicverrcnt-1 %u\n" + "wepicverrcnt-2 %u\n" + "wepicverrcnt-3 %u\n" + "wepicverrcnt-4 %u\n" + "beacon_rcnt %u\n" + "beacon_mcnt %u\n", + stats.mcast_tx_frame, stats.failed, stats.retry, + stats.multi_retry, stats.frame_dup, stats.rts_success, + stats.rts_failure, stats.ack_failure, stats.rx_frag, + stats.mcast_rx_frame, stats.fcs_error, stats.tx_frame, + stats.wep_icv_error[0], stats.wep_icv_error[1], + stats.wep_icv_error[2], stats.wep_icv_error[3], + stats.bcn_rcv_cnt, stats.bcn_miss_cnt); if (priv->phandle->fw_getlog_enable) { - sprintf(buf + strlen(buf), "tx_frag_cnt %u\n", - stats.tx_frag_cnt); - sprintf(buf + strlen(buf), "qos_tx_frag_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "tx_frag_cnt %u\n", stats.tx_frag_cnt); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "qos_tx_frag_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_tx_frag_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_tx_frag_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_failed_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_failed_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_failed_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_failed_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_retry_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_retry_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_retry_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_retry_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_multi_retry_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_multi_retry_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_multi_retry_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_multi_retry_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_frm_dup_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_frm_dup_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_frm_dup_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_frm_dup_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_rts_suc_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_rts_suc_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_rts_suc_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_rts_suc_cnt[i]); } - sprintf(buf + strlen(buf), - "\nqos_rts_failure_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_rts_failure_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_rts_failure_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_rts_failure_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_ack_failure_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_ack_failure_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_ack_failure_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_ack_failure_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_rx_frag_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_rx_frag_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_rx_frag_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_rx_frag_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_tx_frm_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_tx_frm_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_tx_frm_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_tx_frm_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_discarded_frm_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_discarded_frm_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_discarded_frm_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_discarded_frm_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_mpdus_rx_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_mpdus_rx_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_mpdus_rx_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_mpdus_rx_cnt[i]); } - sprintf(buf + strlen(buf), "\nqos_retries_rx_cnt "); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nqos_retries_rx_cnt "); for (i = 0; i < 8; i++) { - sprintf(buf + strlen(buf), "%u ", - stats.qos_retries_rx_cnt[i]); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "%u ", stats.qos_retries_rx_cnt[i]); } - sprintf(buf + strlen(buf), - "\nmgmt_ccmp_replays %u\n" - "tx_amsdu_cnt %u\n" - "failed_amsdu_cnt %u\n" - "retry_amsdu_cnt %u\n" - "multi_retry_amsdu_cnt %u\n" - "tx_octets_in_amsdu_cnt %llu\n" - "amsdu_ack_failure_cnt %u\n" - "rx_amsdu_cnt %u\n" - "rx_octets_in_amsdu_cnt %llu\n" - "tx_ampdu_cnt %u\n" - "tx_mpdus_in_ampdu_cnt %u\n" - "tx_octets_in_ampdu_cnt %llu\n" - "ampdu_rx_cnt %u\n" - "mpdu_in_rx_ampdu_cnt %u\n" - "rx_octets_in_ampdu_cnt %llu\n" - "ampdu_delimiter_crc_error_cnt %u\n", - stats.mgmt_ccmp_replays, stats.tx_amsdu_cnt, - stats.failed_amsdu_cnt, stats.retry_amsdu_cnt, - stats.multi_retry_amsdu_cnt, - stats.tx_octets_in_amsdu_cnt, - stats.amsdu_ack_failure_cnt, stats.rx_amsdu_cnt, - stats.rx_octets_in_amsdu_cnt, - stats.tx_ampdu_cnt, stats.tx_mpdus_in_ampdu_cnt, - stats.tx_octets_in_ampdu_cnt, - stats.ampdu_rx_cnt, stats.mpdu_in_rx_ampdu_cnt, - stats.rx_octets_in_ampdu_cnt, - stats.ampdu_delimiter_crc_error_cnt); + snprintf(buf + strlen(buf), GETLOG_BUFSIZE, + "\nmgmt_ccmp_replays %u\n" + "tx_amsdu_cnt %u\n" + "failed_amsdu_cnt %u\n" + "retry_amsdu_cnt %u\n" + "multi_retry_amsdu_cnt %u\n" + "tx_octets_in_amsdu_cnt %llu\n" + "amsdu_ack_failure_cnt %u\n" + "rx_amsdu_cnt %u\n" + "rx_octets_in_amsdu_cnt %llu\n" + "tx_ampdu_cnt %u\n" + "tx_mpdus_in_ampdu_cnt %u\n" + "tx_octets_in_ampdu_cnt %llu\n" + "ampdu_rx_cnt %u\n" + "mpdu_in_rx_ampdu_cnt %u\n" + "rx_octets_in_ampdu_cnt %llu\n" + "ampdu_delimiter_crc_error_cnt %u\n", + stats.mgmt_ccmp_replays, stats.tx_amsdu_cnt, + stats.failed_amsdu_cnt, stats.retry_amsdu_cnt, + stats.multi_retry_amsdu_cnt, + stats.tx_octets_in_amsdu_cnt, + stats.amsdu_ack_failure_cnt, + stats.rx_amsdu_cnt, + stats.rx_octets_in_amsdu_cnt, + stats.tx_ampdu_cnt, + stats.tx_mpdus_in_ampdu_cnt, + stats.tx_octets_in_ampdu_cnt, + stats.ampdu_rx_cnt, stats.mpdu_in_rx_ampdu_cnt, + stats.rx_octets_in_ampdu_cnt, + stats.ampdu_delimiter_crc_error_cnt); } wrq->u.data.length = MIN(GETLOG_BUFSIZE - 1, strlen(buf) + 1); if (copy_to_user(wrq->u.data.pointer, buf, @@ -2164,8 +2183,9 @@ static int woal_tx_power_cfg(moal_private *priv, struct iwreq *wrq) ENTER(); memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); - + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) + PRINTM(MINFO, "Fail to get bss_info\n"); memset(data, 0, sizeof(data)); user_data_len = wrq->u.data.length; copy_len = MIN(sizeof(data), sizeof(int) * user_data_len); @@ -2686,7 +2706,9 @@ static int woal_set_get_radio(moal_private *priv, struct iwreq *wrq) ret = -EFAULT; } else { /* Get radio status */ - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) + PRINTM(MINFO, "Fail to get bss_info\n"); wrq->u.data.length = 1; if (copy_to_user(wrq->u.data.pointer, &bss_info.radio_on, sizeof(bss_info.radio_on))) { @@ -3825,33 +3847,35 @@ static int woal_passphrase(moal_private *priv, struct iwreq *wrq) if (action == 0) { memset(buf, 0, sizeof(buf)); if (sec->param.passphrase.ssid.ssid_len) { - len += sprintf(buf + len, "ssid:"); + len += snprintf(buf + len, sizeof(buf), "ssid:"); moal_memcpy_ext(priv->phandle, buf + len, sec->param.passphrase.ssid.ssid, sec->param.passphrase.ssid.ssid_len, sizeof(buf) - len); len += sec->param.passphrase.ssid.ssid_len; - len += sprintf(buf + len, " "); + len += snprintf(buf + len, sizeof(buf), " "); } if (memcmp(&sec->param.passphrase.bssid, zero_mac, sizeof(zero_mac))) { mac = (t_u8 *)&sec->param.passphrase.bssid; - len += sprintf(buf + len, "bssid:"); + len += snprintf(buf + len, sizeof(buf), "bssid:"); for (i = 0; i < ETH_ALEN - 1; ++i) - len += sprintf(buf + len, "%02x:", mac[i]); - len += sprintf(buf + len, "%02x ", mac[i]); + len += snprintf(buf + len, sizeof(buf), + "%02x:", mac[i]); + len += snprintf(buf + len, sizeof(buf), "%02x ", + mac[i]); } if (sec->param.passphrase.psk_type == MLAN_PSK_PMK) { - len += sprintf(buf + len, "psk:"); + len += snprintf(buf + len, sizeof(buf), "psk:"); for (i = 0; i < MLAN_MAX_KEY_LENGTH; ++i) - len += sprintf( - buf + len, "%02x", + len += snprintf( + buf + len, sizeof(buf), "%02x", sec->param.passphrase.psk.pmk.pmk[i]); - len += sprintf(buf + len, "\n"); + len += snprintf(buf + len, sizeof(buf), "\n"); } if (sec->param.passphrase.psk_type == MLAN_PSK_PASSPHRASE) { - len += sprintf( - buf + len, "passphrase:%s\n", + len += snprintf( + buf + len, sizeof(buf), "passphrase:%s\n", sec->param.passphrase.psk.passphrase.passphrase); } if (wrq->u.data.pointer) { @@ -3971,11 +3995,11 @@ static int woal_get_key_ioctl(moal_private *priv, struct iwreq *wrq) goto done; } if (sec->param.encrypt_key.key_len) { - sprintf((char *)tmp, "\n%s", "PTK: "); + snprintf((char *)tmp, sizeof(key_ascii), "\n%s", "PTK: "); tmp += 5; for (i = 0; i < sec->param.encrypt_key.key_len; i++) - tmp += sprintf((char *)tmp, "%02x", - sec->param.encrypt_key.key_material[i]); + tmp += snprintf((char *)tmp, sizeof(key_ascii), "%02x", + sec->param.encrypt_key.key_material[i]); } /* Get Multicase Key */ @@ -3992,11 +4016,11 @@ static int woal_get_key_ioctl(moal_private *priv, struct iwreq *wrq) goto done; } if (sec->param.encrypt_key.key_len) { - sprintf((char *)tmp, "\n%s", "GTK: "); + snprintf((char *)tmp, sizeof(key_ascii), "\n%s", "GTK: "); tmp += 5; for (i = 0; i < sec->param.encrypt_key.key_len; i++) - tmp += sprintf((char *)tmp, "%02x", - sec->param.encrypt_key.key_material[i]); + tmp += snprintf((char *)tmp, sizeof(key_ascii), "%02x", + sec->param.encrypt_key.key_material[i]); } /* Get IGTK Key */ @@ -4013,11 +4037,11 @@ static int woal_get_key_ioctl(moal_private *priv, struct iwreq *wrq) goto done; } if (sec->param.encrypt_key.key_len) { - sprintf((char *)tmp, "\n%s", "IGTK: "); + snprintf((char *)tmp, sizeof(key_ascii), "\n%s", "IGTK: "); tmp += 6; for (i = 0; i < sec->param.encrypt_key.key_len; i++) - tmp += sprintf((char *)tmp, "%02x", - sec->param.encrypt_key.key_material[i]); + tmp += snprintf((char *)tmp, sizeof(key_ascii), "%02x", + sec->param.encrypt_key.key_material[i]); } wrq->u.data.length = sizeof(key_ascii) + 1; @@ -4335,7 +4359,7 @@ static int woal_tx_bf_cfg_ioctl(moal_private *priv, struct iwreq *wrq) *token = '\0'; str = token + 1; } - woal_atoi(&tmp_val, pos); + (void)woal_atoi(&tmp_val, pos); switch (i) { case BF_ENABLE_PARAM: bf_global->bf_enbl = @@ -4432,11 +4456,11 @@ static int woal_tx_bf_cfg_ioctl(moal_private *priv, struct iwreq *wrq) bf_cfg.action = BF_CFG_ACT_GET; } else { woal_mac2u8(tx_bf_peer->peer_mac, &buf[2]); - woal_atoi(&tmp_val, &buf[20]); + (void)woal_atoi(&tmp_val, &buf[20]); tx_bf_peer->bf_enbl = (t_u8)tmp_val; - woal_atoi(&tmp_val, &buf[22]); + (void)woal_atoi(&tmp_val, &buf[22]); tx_bf_peer->sounding_enbl = (t_u8)tmp_val; - woal_atoi(&tmp_val, &buf[24]); + (void)woal_atoi(&tmp_val, &buf[24]); tx_bf_peer->fb_type = (t_u8)tmp_val; action = MLAN_ACT_SET; bf_cfg.action = BF_CFG_ACT_SET; @@ -4491,73 +4515,89 @@ static int woal_tx_bf_cfg_ioctl(moal_private *priv, struct iwreq *wrq) memset(buf, 0, sizeof(buf)); switch (bf_action) { case BF_GLOBAL_CONFIGURATION: - data_length += sprintf(buf + data_length, "%d ", - (int)bf_global->bf_enbl); - data_length += sprintf(buf + data_length, "%d ", - (int)bf_global->sounding_enbl); - data_length += sprintf(buf + data_length, "%d ", - (int)bf_global->fb_type); - data_length += sprintf(buf + data_length, "%d ", - (int)bf_global->snr_threshold); data_length += - sprintf(buf + data_length, "%d ", - (int)bf_global->sounding_interval); - data_length += sprintf(buf + data_length, "%d ", - (int)bf_global->bf_mode); + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%d ", (int)bf_global->bf_enbl); + data_length += + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%d ", (int)bf_global->sounding_enbl); + data_length += + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%d ", (int)bf_global->fb_type); + data_length += + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%d ", (int)bf_global->snr_threshold); + data_length += + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%d ", + (int)bf_global->sounding_interval); + data_length += + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%d ", (int)bf_global->bf_mode); break; case SET_GET_BF_PERIODICITY: - data_length += sprintf(buf + data_length, - "%02x:%02x:%02x:%02x:%02x:%02x", - bf_periodicity->peer_mac[0], - bf_periodicity->peer_mac[1], - bf_periodicity->peer_mac[2], - bf_periodicity->peer_mac[3], - bf_periodicity->peer_mac[4], - bf_periodicity->peer_mac[5]); - data_length += sprintf(buf + data_length, "%c", ' '); - data_length += sprintf(buf + data_length, "%d", - bf_periodicity->interval); + data_length += + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%02x:%02x:%02x:%02x:%02x:%02x", + bf_periodicity->peer_mac[0], + bf_periodicity->peer_mac[1], + bf_periodicity->peer_mac[2], + bf_periodicity->peer_mac[3], + bf_periodicity->peer_mac[4], + bf_periodicity->peer_mac[5]); + data_length += snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%c", ' '); + data_length += + snprintf(buf + data_length, MAX_IN_OUT_CHAR, + "%d", bf_periodicity->interval); break; case TX_BF_FOR_PEER_ENBL: for (i = 0; i < (int)bf_cfg.no_of_peers; i++) { + data_length += snprintf( + buf + data_length, MAX_IN_OUT_CHAR, + "%02x:%02x:%02x:%02x:%02x:%02x", + tx_bf_peer->peer_mac[0], + tx_bf_peer->peer_mac[1], + tx_bf_peer->peer_mac[2], + tx_bf_peer->peer_mac[3], + tx_bf_peer->peer_mac[4], + tx_bf_peer->peer_mac[5]); data_length += - sprintf(buf + data_length, - "%02x:%02x:%02x:%02x:%02x:%02x", - tx_bf_peer->peer_mac[0], - tx_bf_peer->peer_mac[1], - tx_bf_peer->peer_mac[2], - tx_bf_peer->peer_mac[3], - tx_bf_peer->peer_mac[4], - tx_bf_peer->peer_mac[5]); + snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%c", ' '); + data_length += snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%d;", + tx_bf_peer->bf_enbl); data_length += - sprintf(buf + data_length, "%c", ' '); - data_length += sprintf(buf + data_length, "%d;", - tx_bf_peer->bf_enbl); - data_length += - sprintf(buf + data_length, "%d;", - tx_bf_peer->sounding_enbl); - data_length += sprintf(buf + data_length, "%d ", - tx_bf_peer->fb_type); + snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%d;", + tx_bf_peer->sounding_enbl); + data_length += snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%d ", + tx_bf_peer->fb_type); tx_bf_peer++; } break; case SET_SNR_THR_PEER: for (i = 0; i < (int)bf_cfg.no_of_peers; i++) { + data_length += snprintf( + buf + data_length, MAX_IN_OUT_CHAR, + "%02x:%02x:%02x:%02x:%02x:%02x", + bf_snr->peer_mac[0], + bf_snr->peer_mac[1], + bf_snr->peer_mac[2], + bf_snr->peer_mac[3], + bf_snr->peer_mac[4], + bf_snr->peer_mac[5]); data_length += - sprintf(buf + data_length, - "%02x:%02x:%02x:%02x:%02x:%02x", - bf_snr->peer_mac[0], - bf_snr->peer_mac[1], - bf_snr->peer_mac[2], - bf_snr->peer_mac[3], - bf_snr->peer_mac[4], - bf_snr->peer_mac[5]); + snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%c", ';'); + data_length += snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%d", + bf_snr->snr); data_length += - sprintf(buf + data_length, "%c", ';'); - data_length += sprintf(buf + data_length, "%d", - bf_snr->snr); - data_length += - sprintf(buf + data_length, "%c", ' '); + snprintf(buf + data_length, + MAX_IN_OUT_CHAR, "%c", ' '); bf_snr++; } break; @@ -6095,7 +6135,7 @@ static int woal_dfs_testing(moal_private *priv, struct iwreq *wrq) mlan_ioctl_req *req = NULL; mlan_ds_11h_cfg *ds_11hcfg = NULL; int ret = 0; - int data[4], copy_len; + int data[4] = {0}, copy_len; int data_length = wrq->u.data.length; mlan_status status = MLAN_STATUS_SUCCESS; ENTER(); @@ -6258,7 +6298,7 @@ done: static int woal_cfp_code(moal_private *priv, struct iwreq *wrq) { int ret = 0; - int data[2], copy_len; + int data[2] = {0}, copy_len; int data_length = wrq->u.data.length; mlan_ioctl_req *req = NULL; mlan_ds_misc_cfg *misc_cfg = NULL; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_proc.c b/mxm_wifiex/wlan_src/mlinux/moal_proc.c index 8cff3c5..93f9708 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_proc.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_proc.c @@ -565,7 +565,8 @@ mlan_status woal_priv_set_tx_rx_ant(moal_handle *handle, char *line) radio->param.ant_cfg.rx_antenna = data[1]; #if defined(STA_CFG80211) || defined(UAP_CFG80211) if (IS_CARD9098(priv->phandle->card_type) || - IS_CARD9097(priv->phandle->card_type)) { + IS_CARD9097(priv->phandle->card_type) || + IS_CARDIW62X(priv->phandle->card_type)) { woal_cfg80211_notify_antcfg(priv, priv->phandle->wiphy, radio); } @@ -597,6 +598,7 @@ static ssize_t woal_config_write(struct file *f, const char __user *buf, { char databuf[200]; char *line = NULL; + int ret = 0; t_u32 config_data = 0; struct seq_file *sfp = f->private_data; moal_handle *handle = (moal_handle *)sfp->private; @@ -706,7 +708,7 @@ static ssize_t woal_config_write(struct file *f, const char __user *buf, config_data = FW_RELOAD_SDIO_INBAND_RESET; #endif PRINTM(MMSG, "Request fw_reload=%d\n", config_data); - woal_request_fw_reload(handle, config_data); + ret = woal_request_fw_reload(handle, config_data); } if (!strncmp(databuf, "drop_point=", strlen("drop_point="))) { line += strlen("drop_point") + 1; @@ -814,6 +816,8 @@ static ssize_t woal_config_write(struct file *f, const char __user *buf, MODULE_PUT; LEAVE(); + if (ret < 0) + return ret; return (int)count; } @@ -844,8 +848,8 @@ static int woal_config_read(struct seq_file *sfp, void *data) seq_printf(sfp, "drv_mode=%d\n", (int)handle->params.drv_mode); if (priv) { memset(&hscfg, 0, sizeof(mlan_ds_hs_cfg)); - woal_set_get_hs_params(priv, MLAN_ACT_GET, MOAL_IOCTL_WAIT, - &hscfg); + (void)woal_set_get_hs_params(priv, MLAN_ACT_GET, + MOAL_IOCTL_WAIT, &hscfg); seq_printf(sfp, "hssetpara=%d,0x%x,%d,%d\n", hscfg.conditions, hscfg.gpio, hscfg.gap, hscfg.hs_wake_interval); } @@ -1426,7 +1430,7 @@ void woal_proc_init(moal_handle *handle) goto done; } - strcpy(config_proc_dir, "config"); + strncpy(config_proc_dir, "config", sizeof(config_proc_dir)); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26) r = proc_create_data(config_proc_dir, 0666, handle->proc_wlan, &config_proc_fops, handle); @@ -1440,7 +1444,7 @@ void woal_proc_init(moal_handle *handle) if (!r) PRINTM(MERROR, "Fail to create proc config\n"); - strcpy(drv_dump_dir, "drv_dump"); + strncpy(drv_dump_dir, "drv_dump", sizeof(drv_dump_dir)); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26) r = proc_create_data(drv_dump_dir, 0644, handle->proc_wlan, &drv_dump_fops, handle); @@ -1454,7 +1458,7 @@ void woal_proc_init(moal_handle *handle) if (!r) PRINTM(MERROR, "Failed to create proc drv dump\n"); - strcpy(fw_dump_dir, "fw_dump"); + strncpy(fw_dump_dir, "fw_dump", sizeof(fw_dump_dir)); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26) r = proc_create_data(fw_dump_dir, 0644, handle->proc_wlan, &fw_dump_fops, handle); @@ -1489,11 +1493,11 @@ void woal_proc_exit(moal_handle *handle) PRINTM(MINFO, "Remove Proc Interface %s\n", handle->proc_wlan_name); if (handle->proc_wlan) { - strcpy(config_proc_dir, "config"); + strncpy(config_proc_dir, "config", sizeof(config_proc_dir)); remove_proc_entry(config_proc_dir, handle->proc_wlan); - strcpy(drv_dump_dir, "drv_dump"); + strncpy(drv_dump_dir, "drv_dump", sizeof(drv_dump_dir)); remove_proc_entry(drv_dump_dir, handle->proc_wlan); - strcpy(fw_dump_dir, "fw_dump"); + strncpy(fw_dump_dir, "fw_dump", sizeof(fw_dump_dir)); remove_proc_entry(fw_dump_dir, handle->proc_wlan); #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) @@ -1556,7 +1560,7 @@ void woal_create_proc_entry(moal_private *priv) LEAVE(); return; } - strcat(proc_dir_name, dev->name); + strncat(proc_dir_name, dev->name, sizeof(proc_dir_name) - 1); /* Try to create adapterX/dev_name directory first under * /proc/mwlan/ */ priv->proc_entry = proc_mkdir(proc_dir_name, proc_mwlan); @@ -1595,7 +1599,7 @@ void woal_create_proc_entry(moal_private *priv) atomic_inc(&(priv->phandle->proc_wlan->count)); #endif /* < 3.10.0 */ #endif /* < 2.6.26 */ - strcpy(priv->proc_entry_name, dev->name); + strncpy(priv->proc_entry_name, dev->name, IFNAMSIZ); if (priv->proc_entry) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26) r = proc_create_data("info", 0, priv->proc_entry, diff --git a/mxm_wifiex/wlan_src/mlinux/moal_sdio.h b/mxm_wifiex/wlan_src/mlinux/moal_sdio.h index 139a45e..550d56b 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_sdio.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_sdio.h @@ -139,12 +139,17 @@ Change log: #define SD9097_WLAN_V1_FW_NAME "nxp/sdiw620_wlan_v1.bin" #endif /* SD9097 */ -#ifdef SDNW62X -#define SDNW62X_DEFAULT_COMBO_FW_NAME "nxp/sdsd_nw62x.bin" -#define SDUARTNW62X_COMBO_FW_NAME "nxp/sduart_nw62x.bin" -#define SDSDNW62X_COMBO_FW_NAME "sdsd_nw62x.bin" -#define SDNW62X_DEFAULT_WLAN_FW_NAME "nxp/sd_nw62x.bin" -#endif /* SDNW62X */ +#ifdef SDIW62X +#define SDIW62X_DEFAULT_COMBO_FW_NAME "nxp/sdsd_iw62x.bin" +#define SDUARTIW62X_COMBO_FW_NAME "nxp/sduart_iw62x.bin" +#define SDSDIW62X_COMBO_FW_NAME "sdsd_iw62x.bin" +#define SDIW62X_DEFAULT_WLAN_FW_NAME "nxp/sd_iw62x.bin" +#endif /* SDIW62X */ + +#define SDAW693_DEFAULT_COMBO_FW_NAME "nxp/sdsd_aw693.bin" +#define SDUARTAW693_COMBO_FW_NAME "nxp/sduart_aw693.bin" +#define SDSDAW693_COMBO_FW_NAME "sdsd_aw693.bin" +#define SDAW693_DEFAULT_WLAN_FW_NAME "nxp/sd_aw693.bin" #ifdef SD9177 #define SD9177_A0 0x00 diff --git a/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c b/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c index 28b1267..9bd634e 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c @@ -71,6 +71,10 @@ static moal_if_ops sdiommc_ops; /** Device ID for SD8987 */ #define SD_DEVICE_ID_8987 (0x9149) #endif +/** Device ID for SDAW693 */ +#define SD_DEVICE_ID_AW693_FN1 (0x0211) +/** Device ID for SDAW693 */ +#define SD_DEVICE_ID_AW693_FN2 (0x0212) #ifdef SD9098 /** Device ID for SD9098 */ #define SD_DEVICE_ID_9098_FN1 (0x914D) @@ -85,9 +89,9 @@ static moal_if_ops sdiommc_ops; /** Device ID for SD9177 */ #define SD_DEVICE_ID_9177 (0x0205) #endif -#ifdef SDNW62X -/** Device ID for SDNW62X */ -#define SD_DEVICE_ID_NW62X (0x020D) +#ifdef SDIW62X +/** Device ID for SDIW62X */ +#define SD_DEVICE_ID_IW62X (0x020D) #endif /** WLAN IDs */ @@ -113,6 +117,8 @@ static const struct sdio_device_id wlan_ids[] = { #ifdef SD8987 {SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_8987)}, #endif + {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN1)}, + {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN2)}, #ifdef SD9098 {SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_9098_FN1)}, {SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_9098_FN2)}, @@ -123,8 +129,8 @@ static const struct sdio_device_id wlan_ids[] = { #ifdef SD9177 {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_9177)}, #endif -#ifdef SDNW62X - {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_NW62X)}, +#ifdef SDIW62X + {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_IW62X)}, #endif {}, }; @@ -390,11 +396,25 @@ static t_u16 woal_update_card_type(t_void *card) (strlen(INTF_CARDTYPE) + strlen(KERN_VERSION))); } #endif -#ifdef SDNW62X - if (cardp_sd->func->device == SD_DEVICE_ID_NW62X) { - card_type = CARD_TYPE_SDNW62X; - moal_memcpy_ext(NULL, driver_version, CARD_SDNW62X, - strlen(CARD_SDNW62X), strlen(driver_version)); +#ifdef SDIW62X + if (cardp_sd->func->device == SD_DEVICE_ID_IW62X) { + card_type = CARD_TYPE_SDIW62X; + moal_memcpy_ext(NULL, driver_version, CARD_SDIW62X, + strlen(CARD_SDIW62X), strlen(driver_version)); + moal_memcpy_ext( + NULL, + driver_version + strlen(INTF_CARDTYPE) + + strlen(KERN_VERSION), + V18, strlen(V18), + strlen(driver_version) - + (strlen(INTF_CARDTYPE) + strlen(KERN_VERSION))); + } +#endif + if (cardp_sd->func->device == SD_DEVICE_ID_AW693_FN1 || + cardp_sd->func->device == SD_DEVICE_ID_AW693_FN2) { + card_type = CARD_TYPE_SDAW693; + moal_memcpy_ext(NULL, driver_version, CARD_SDAW693, + strlen(CARD_SDAW693), strlen(driver_version)); moal_memcpy_ext( NULL, driver_version + strlen(INTF_CARDTYPE) + @@ -403,7 +423,6 @@ static t_u16 woal_update_card_type(t_void *card) strlen(driver_version) - (strlen(INTF_CARDTYPE) + strlen(KERN_VERSION))); } -#endif #ifdef SD9097 if (cardp_sd->func->device == SD_DEVICE_ID_9097) { card_type = CARD_TYPE_SD9097; @@ -1346,8 +1365,11 @@ int woal_sdio_read_write_cmd52(moal_handle *handle, int func, int reg, int val) */ static t_u8 woal_sdiommc_is_second_mac(moal_handle *handle) { -#ifdef SD9098 struct sdio_mmc_card *card = (struct sdio_mmc_card *)handle->card; + + if (card->func->device == SD_DEVICE_ID_AW693_FN2) + return MTRUE; +#ifdef SD9098 if (card->func->device == SD_DEVICE_ID_9098_FN2) return MTRUE; #endif @@ -1363,14 +1385,10 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) t_u32 revision_id = 0; t_u32 rev_id_reg = handle->card_info->rev_id_reg; -#if defined(SD8987) || defined(SD8997) || defined(SD9098) || \ - defined(SD9097) || defined(SDNW62X) || defined(SD8978) || \ - defined(SD9177) t_u32 magic_reg = handle->card_info->magic_reg; t_u32 magic = 0; t_u32 host_strap_reg = handle->card_info->host_strap_reg; t_u32 strap = 0; -#endif ENTER(); @@ -1384,9 +1402,6 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) woal_sdiommc_read_reg(handle, rev_id_reg, &revision_id); PRINTM(MCMND, "revision_id=0x%x\n", revision_id); -#if defined(SD8987) || defined(SD8997) || defined(SD9098) || \ - defined(SD9097) || defined(SDNW62X) || defined(SD8978) || \ - defined(SD9177) /** Revision ID register */ woal_sdiommc_read_reg(handle, magic_reg, &magic); /** Revision ID register */ @@ -1395,24 +1410,26 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) magic &= 0xFF; /* 1 = SDSD, 0 --SD UART */ PRINTM(MCMND, "magic=0x%x strap=0x%x\n", magic, strap); -#endif #if defined(SD8977) if (IS_SD8977(handle->card_type)) { switch (revision_id) { case SD8977_V0: - strcpy(handle->card_info->fw_name, SD8977_V0_FW_NAME); - strcpy(handle->card_info->fw_name_wlan, - SD8977_WLAN_V0_FW_NAME); + strncpy(handle->card_info->fw_name, SD8977_V0_FW_NAME, + FW_NAMW_MAX_LEN); + strncpy(handle->card_info->fw_name_wlan, + SD8977_WLAN_V0_FW_NAME, FW_NAMW_MAX_LEN); break; case SD8977_V1: - strcpy(handle->card_info->fw_name, SD8977_V1_FW_NAME); - strcpy(handle->card_info->fw_name_wlan, - SD8977_WLAN_V1_FW_NAME); + strncpy(handle->card_info->fw_name, SD8977_V1_FW_NAME, + FW_NAMW_MAX_LEN); + strncpy(handle->card_info->fw_name_wlan, + SD8977_WLAN_V1_FW_NAME, FW_NAMW_MAX_LEN); break; case SD8977_V2: - strcpy(handle->card_info->fw_name, SD8977_V2_FW_NAME); - strcpy(handle->card_info->fw_name_wlan, - SD8977_WLAN_V2_FW_NAME); + strncpy(handle->card_info->fw_name, SD8977_V2_FW_NAME, + FW_NAMW_MAX_LEN); + strncpy(handle->card_info->fw_name_wlan, + SD8977_WLAN_V2_FW_NAME, FW_NAMW_MAX_LEN); break; default: break; @@ -1424,14 +1441,16 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) /* Check revision ID */ switch (revision_id) { case SD8887_A0: - strcpy(handle->card_info->fw_name, SD8887_A0_FW_NAME); - strcpy(handle->card_info->fw_name_wlan, - SD8887_WLAN_A0_FW_NAME); + strncpy(handle->card_info->fw_name, SD8887_A0_FW_NAME, + FW_NAMW_MAX_LEN); + strncpy(handle->card_info->fw_name_wlan, + SD8887_WLAN_A0_FW_NAME, FW_NAMW_MAX_LEN); break; case SD8887_A2: - strcpy(handle->card_info->fw_name, SD8887_A2_FW_NAME); - strcpy(handle->card_info->fw_name_wlan, - SD8887_WLAN_A2_FW_NAME); + strncpy(handle->card_info->fw_name, SD8887_A2_FW_NAME, + FW_NAMW_MAX_LEN); + strncpy(handle->card_info->fw_name_wlan, + SD8887_WLAN_A2_FW_NAME, FW_NAMW_MAX_LEN); break; default: break; @@ -1443,11 +1462,13 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) if (IS_SD8997(handle->card_type)) { if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD_UART) - strcpy(handle->card_info->fw_name, - SDUART8997_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUART8997_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSD8997_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSD8997_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } } #endif @@ -1456,11 +1477,13 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) if (IS_SD8987(handle->card_type)) { if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD_UART) - strcpy(handle->card_info->fw_name, - SDUART8987_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUART8987_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSD8987_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSD8987_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } } #endif @@ -1469,11 +1492,13 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) if (IS_SD8978(handle->card_type)) { if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD_UART) - strcpy(handle->card_info->fw_name, - SDUART8978_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUART8978_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSD8978_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSD8978_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } } #endif @@ -1485,28 +1510,32 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) case SD9098_Z1Z2: if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD_UART) - strcpy(handle->card_info->fw_name, - SDUART9098_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUART9098_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSD9098_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSD9098_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } - strcpy(handle->card_info->fw_name_wlan, - SD9098_DEFAULT_WLAN_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + SD9098_DEFAULT_WLAN_FW_NAME, FW_NAMW_MAX_LEN); break; case SD9098_A0: case SD9098_A1: case SD9098_A2: if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD_UART) - strcpy(handle->card_info->fw_name, - SDUART9098_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUART9098_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSD9098_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSD9098_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); } - strcpy(handle->card_info->fw_name_wlan, - SD9098_WLAN_V1_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + SD9098_WLAN_V1_FW_NAME, FW_NAMW_MAX_LEN); break; default: break; @@ -1520,31 +1549,47 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) case SD9097_B1: if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD_UART) - strcpy(handle->card_info->fw_name, - SDUART9097_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUART9097_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSD9097_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSD9097_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); } - strcpy(handle->card_info->fw_name_wlan, - SD9097_WLAN_V1_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + SD9097_WLAN_V1_FW_NAME, FW_NAMW_MAX_LEN); break; default: break; } } #endif -#ifdef SDNW62X - if (IS_SDNW62X(handle->card_type)) { + if (IS_SDAW693(handle->card_type)) { if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD_UART) - strcpy(handle->card_info->fw_name, - SDUARTNW62X_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUARTAW693_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSDNW62X_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSDAW693_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } } + +#ifdef SDIW62X + if (IS_SDIW62X(handle->card_type)) { + magic &= 0x03; + if (magic == 0x03) + PRINTM(MMSG, "wlan: SDIW62X in secure-boot mode\n"); + if (strap == CARD_TYPE_SD_UART) + strncpy(handle->card_info->fw_name, + SDUARTIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); + else + strncpy(handle->card_info->fw_name, + SDSDIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); + } #endif #ifdef SD9177 @@ -1553,43 +1598,51 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) case SD9177_A0: if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD9177_UART) - strcpy(handle->card_info->fw_name, - SDUART9177_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDUART9177_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - SDSD9177_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + SDSD9177_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } - strcpy(handle->card_info->fw_name_wlan, - SD9177_DEFAULT_WLAN_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + SD9177_DEFAULT_WLAN_FW_NAME, FW_NAMW_MAX_LEN); break; case SD9177_A1: if (magic == CHIP_MAGIC_VALUE) { if (strap == CARD_TYPE_SD9177_UART) { if (handle->params.rf_test_mode) - strcpy(handle->card_info - ->fw_name, - SDUART9177_DEFAULT_RFTM_COMBO_V1_FW_NAME); + strncpy(handle->card_info + ->fw_name, + SDUART9177_DEFAULT_RFTM_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info - ->fw_name, - SDUART9177_DEFAULT_COMBO_V1_FW_NAME); + strncpy(handle->card_info + ->fw_name, + SDUART9177_DEFAULT_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); } else { if (handle->params.rf_test_mode) - strcpy(handle->card_info - ->fw_name, - SDSD9177_DEFAULT_RFTM_COMBO_V1_FW_NAME); + strncpy(handle->card_info + ->fw_name, + SDSD9177_DEFAULT_RFTM_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info - ->fw_name, - SDSD9177_DEFAULT_COMBO_V1_FW_NAME); + strncpy(handle->card_info + ->fw_name, + SDSD9177_DEFAULT_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); } } if (handle->params.rf_test_mode) - strcpy(handle->card_info->fw_name, - SD9177_DEFAULT_RFTM_WLAN_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + SD9177_DEFAULT_RFTM_WLAN_V1_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name_wlan, - SD9177_DEFAULT_WLAN_V1_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + SD9177_DEFAULT_WLAN_V1_FW_NAME, + FW_NAMW_MAX_LEN); break; default: break; @@ -2311,21 +2364,25 @@ static void woal_sdiommc_reg_dbg(moal_handle *phandle) reg_end = scratch_reg + 10; } if (loop != 2) - ptr += sprintf(ptr, "SDIO Func%d (%#x-%#x): ", func, - reg_start, reg_end); + ptr += snprintf(ptr, sizeof(buf), + "SDIO Func%d (%#x-%#x): ", func, + reg_start, reg_end); else - ptr += sprintf(ptr, "SDIO Func%d: ", func); + ptr += snprintf(ptr, sizeof(buf), + "SDIO Func%d: ", func); for (reg = reg_start; reg <= reg_end;) { if (func == 0) ret = woal_sdio_f0_readb(phandle, reg, &data); else ret = woal_sdio_readb(phandle, reg, &data); if (loop == 2) - ptr += sprintf(ptr, "(%#x) ", reg); + ptr += snprintf(ptr, sizeof(buf), "(%#x) ", + reg); if (!ret) - ptr += sprintf(ptr, "%02x ", data); + ptr += snprintf(ptr, sizeof(buf), "%02x ", + data); else { - ptr += sprintf(ptr, "ERR"); + ptr += snprintf(ptr, sizeof(buf), "ERR"); break; } if (loop == 2 && reg < reg_end) @@ -2351,6 +2408,10 @@ static void woal_sdiommc_dump_fw_info(moal_handle *phandle) PRINTM(MERROR, "Could not dump firmwware info\n"); return; } + if (phandle->fw_dump_buf) { + PRINTM(MERROR, "FW dump already exist\n"); + return; + } /** cancel all pending commands */ mlan_ioctl(phandle->pmlan_adapter, NULL); @@ -2417,7 +2478,8 @@ static int woal_sdiommc_dump_reg_info(moal_handle *phandle, t_u8 *drv_buf) mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE); - drv_ptr += sprintf(drv_ptr, "--------sdio_reg_debug_info---------\n"); + drv_ptr += snprintf(drv_ptr, MAX_BUF_LEN, + "--------sdio_reg_debug_info---------\n"); for (loop = 0; loop < 5; loop++) { memset(buf, 0, sizeof(buf)); ptr = buf; @@ -2447,10 +2509,12 @@ static int woal_sdiommc_dump_reg_info(moal_handle *phandle, t_u8 *drv_buf) reg_end = scratch_reg + 10; } if (loop != 2) - ptr += sprintf(ptr, "SDIO Func%d (%#x-%#x): ", func, - reg_start, reg_end); + ptr += snprintf(ptr, MAX_BUF_LEN, + "SDIO Func%d (%#x-%#x): ", func, + reg_start, reg_end); else - ptr += sprintf(ptr, "SDIO Func%d: ", func); + ptr += snprintf(ptr, MAX_BUF_LEN, + "SDIO Func%d: ", func); for (reg = reg_start; reg <= reg_end;) { if (func == 0) ret = woal_sdio_f0_readb(phandle, reg, &data); @@ -2458,11 +2522,13 @@ static int woal_sdiommc_dump_reg_info(moal_handle *phandle, t_u8 *drv_buf) ret = woal_sdio_readb(phandle, reg, &data); if (loop == 2) - ptr += sprintf(ptr, "(%#x) ", reg); + ptr += snprintf(ptr, MAX_BUF_LEN, "(%#x) ", + reg); if (!ret) - ptr += sprintf(ptr, "%02x ", data); + ptr += snprintf(ptr, MAX_BUF_LEN, "%02x ", + data); else { - ptr += sprintf(ptr, "ERR"); + ptr += snprintf(ptr, MAX_BUF_LEN, "ERR"); break; } if (loop == 2 && reg < reg_end) @@ -2470,11 +2536,11 @@ static int woal_sdiommc_dump_reg_info(moal_handle *phandle, t_u8 *drv_buf) else reg++; } - drv_ptr += sprintf(drv_ptr, "%s\n", buf); + drv_ptr += snprintf(drv_ptr, MAX_BUF_LEN, "%s\n", buf); } - drv_ptr += - sprintf(drv_ptr, "--------sdio_reg_debug_info End---------\n"); + drv_ptr += snprintf(drv_ptr, MAX_BUF_LEN, + "--------sdio_reg_debug_info End---------\n"); mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); LEAVE(); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_shim.c b/mxm_wifiex/wlan_src/mlinux/moal_shim.c index 432df6c..ec5395b 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_shim.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_shim.c @@ -708,13 +708,18 @@ void moal_tp_accounting(t_void *pmoal, void *buf, t_u32 drop_point) wifi_timeval t; if (drop_point < MAX_TP_ACCOUNT_DROP_POINT_NUM) { - if (drop_point == 4) { + if (drop_point == 4 || drop_point == 3) { handle->tp_acnt.tx_bytes[drop_point] += pmbuf->data_len; } else { skb = (struct sk_buff *)buf; handle->tp_acnt.tx_bytes[drop_point] += skb->len; } handle->tp_acnt.tx_packets[drop_point]++; + if (drop_point == 3) { + woal_get_monotonic_time(&t); + pmbuf->extra_ts_sec = t.time_sec; + pmbuf->extra_ts_usec = t.time_usec; + } } else if (drop_point <= RX_DROP_P5) { t_u16 rx_len = 0; if (drop_point == RX_DROP_P1 || drop_point == RX_DROP_P2) @@ -755,10 +760,17 @@ void moal_tp_accounting(t_void *pmoal, void *buf, t_u32 drop_point) if (handle->tp_acnt.rx_index >= TXRX_MAX_SAMPLE) handle->tp_acnt.rx_index = 0; } else if (drop_point == TX_TIME_PKT) { + delay = (t_s32)(pmbuf->extra_ts_sec - pmbuf->in_ts_sec) * + 1000000; + delay += (t_s32)(pmbuf->extra_ts_usec - pmbuf->in_ts_usec); + handle->tp_acnt.tx_delay1_driver[handle->tp_acnt.tx_index] = + delay; + delay = (t_s32)(pmbuf->out_ts_sec - pmbuf->in_ts_sec) * 1000000; delay += (t_s32)(pmbuf->out_ts_usec - pmbuf->in_ts_usec); handle->tp_acnt.tx_delay_driver[handle->tp_acnt.tx_index] = delay; + handle->tp_acnt.tx_index++; if (handle->tp_acnt.tx_index >= TXRX_MAX_SAMPLE) handle->tp_acnt.tx_index = 0; @@ -1389,6 +1401,45 @@ mlan_status moal_read_reg(t_void *pmoal, t_u32 reg, t_u32 *data) #if defined(STA_CFG80211) && defined(UAP_CFG80211) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + +#define DOT11_MAX_PRIORITY 8 +#define IEEE80211_RADIOTAP_HE 23 + +t_u8 ru_signal[16][9] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x07}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x07}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0xff, 0x01, 0x06}, + {0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07}, + {0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x06}, + {0x00, 0x00, 0xff, 0x01, 0xff, 0x01, 0x00, 0x00, 0x06}, + {0x00, 0x00, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0x05}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x06}, + {0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x06}, + {0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0xff, 0x01, 0x05}, + {0xff, 0x01, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06}, + {0xff, 0x01, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x05}, + {0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0x00, 0x00, 0x05}, + {0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, + 0x04}}; + +t_u8 ru_signal_106[14][9] = { + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0x01, 0xff, 0x01, 0xff, 0xff, 0xff, 0x02, 0x03}, + {0xff, 0xff, 0xff, 0x02, 0xff, 0x01, 0xff, 0x01, 0x03}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x05}, + {0x00, 0x00, 0xff, 0x01, 0xff, 0xff, 0xff, 0x02, 0x04}, + {0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x04}, + {0xff, 0x01, 0xff, 0x01, 0xff, 0xff, 0xff, 0x02, 0x03}, + {0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05}, + {0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0xff, 0x01, 0x04}, + {0xff, 0xff, 0xff, 0x02, 0xff, 0x01, 0x00, 0x00, 0x04}, + {0xff, 0xff, 0xff, 0x02, 0xff, 0x01, 0xff, 0x01, 0x03}, + {0xff, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0x02, 0x02}, + {0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0x04}}; + +t_u8 ru_signal_52[9] = {0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0xff, 0x01, 0x04}; /** * @brief This function uploads the packet to the network stack monitor * interface @@ -1406,6 +1457,8 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle, struct radiotap_header *rth = NULL; radiotap_info rt_info = {}; t_u8 format = 0; + t_u8 mcs = 0; + t_u8 nss = 0; t_u8 bw = 0; t_u8 gi = 0; t_u8 ldpc = 0; @@ -1415,6 +1468,12 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle, t_u8 *payload = NULL; t_u32 vht_sig1 = 0; t_u32 vht_sig2 = 0; + t_u32 he_sig1 = 0; + t_u32 he_sig2 = 0; + t_u32 usr_idx = 0; + t_u32 out = 0; + t_u32 tone = 0; + t_u8 dcm = 0; ENTER(); if (!pmbuf->pdesc) { LEAVE(); @@ -1443,7 +1502,15 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle, ldpc = (rt_info.rate_info.rate_info & 0x20) >> 5; format = (rt_info.rate_info.rate_info & 0x18) >> 3; bw = (rt_info.rate_info.rate_info & 0x06) >> 1; - gi = rt_info.rate_info.rate_info & 0x01; + dcm = rt_info.rate_info.dcm; + if (format == MLAN_RATE_FORMAT_HE) + gi = (rt_info.rate_info.rate_info & 0xC0) >> 6; + else + + gi = rt_info.rate_info.rate_info & 0x01; + mcs = rt_info.rate_info.mcs_index; + nss = rt_info.rate_info.nss_index; + skb_push(skb, sizeof(*rth)); rth = (struct radiotap_header *)skb->data; memset(skb->data, 0, sizeof(*rth)); @@ -1500,13 +1567,19 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle, } /** Channel */ rth->body.channel.flags = 0; - if (rt_info.chan_num) - chan_num = rt_info.chan_num; - else - chan_num = - handle->mon_if->band_chan_cfg.channel; + if (rt_info.chan_num && + (handle->mon_if->band_chan_cfg.channel != + rt_info.chan_num)) + handle->mon_if->band_chan_cfg.channel = + rt_info.chan_num; + chan_num = handle->mon_if->band_chan_cfg.channel; + band = (chan_num <= 14) ? IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; + /** update the band, if different in the Rx frame */ + if (handle->mon_if->band_chan_cfg.band != band) + handle->mon_if->band_chan_cfg.band = band; + rth->body.channel.frequency = woal_cpu_to_le16( ieee80211_channel_to_frequency(chan_num, band)); rth->body.channel.flags |= @@ -1565,8 +1638,8 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle, } /** VHT */ if (format == MLAN_RATE_FORMAT_VHT) { - vht_sig1 = rt_info.extra_info.vht_sig1; - vht_sig2 = rt_info.extra_info.vht_sig2; + vht_sig1 = rt_info.extra_info.vht_he_sig1; + vht_sig2 = rt_info.extra_info.vht_he_sig2; /** Present Flag */ rth->hdr.it_present |= cpu_to_le32( 1 << IEEE80211_RADIOTAP_VHT); @@ -1615,11 +1688,173 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle, /* Convert FW NSS value to radiotap spec */ rth->body.u.vht.mcs_nss[0] |= ((vht_sig1 & (0x1C00)) >> 10) + 1; + /** gi */ + rth->body.u.vht.known |= + woal_cpu_to_le16(VHT_KNOWN_GI); + if (gi) + rth->body.u.vht.flags |= VHT_FLAG_SGI; /** coding */ if (vht_sig2 & MBIT(2)) rth->body.u.vht.coding |= VHT_CODING_LDPC_USER0; } + if (format == MLAN_RATE_FORMAT_HE) { + he_sig1 = rt_info.extra_info.vht_he_sig1; + he_sig2 = rt_info.extra_info.vht_he_sig2; + usr_idx = rt_info.extra_info.user_idx; + rth->hdr.it_present |= + cpu_to_le32(1 << IEEE80211_RADIOTAP_HE); + rth->body.u.he.data1 |= (HE_CODING_KNOWN); + if (ldpc) + rth->body.u.he.data3 |= + HE_CODING_LDPC_USER0; + rth->body.u.he.data1 |= (HE_BW_KNOWN); + if (he_sig1) + rth->body.u.he.data1 |= (HE_MU_DATA); + if (bw == 1) { + rth->body.u.he.data5 |= RX_HE_BW_40; + if (he_sig2) { + MLAN_DECODE_RU_SIGNALING_CH1( + out, he_sig1, he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, tone); + if (!tone) { + MLAN_DECODE_RU_SIGNALING_CH3( + out, he_sig1, + he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, + tone); + } + if (tone != 0) { + rth->body.u.he.data5 &= + ~RX_HE_BW_40; + rth->body.u.he.data5 |= + tone; + } + } + } else if (bw == 2) { + rth->body.u.he.data5 |= RX_HE_BW_80; + if (he_sig2) { + MLAN_DECODE_RU_SIGNALING_CH1( + out, he_sig1, he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, tone); + if (!tone) { + MLAN_DECODE_RU_SIGNALING_CH2( + out, he_sig1, + he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, + tone); + } + if (!tone) { + if ((he_sig2 & + MLAN_80_CENTER_RU) && + !usr_idx) { + tone = RU_TONE_26; + } else { + usr_idx--; + } + } + if (!tone) { + MLAN_DECODE_RU_SIGNALING_CH3( + out, he_sig1, + he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, + tone); + } + if (!tone) { + MLAN_DECODE_RU_SIGNALING_CH4( + out, he_sig1, + he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, + tone); + } + if (tone != 0) { + rth->body.u.he.data5 &= + ~RX_HE_BW_80; + rth->body.u.he.data5 |= + tone; + } + } + } else if (bw == 3) { + rth->body.u.he.data5 |= RX_HE_BW_160; + if (he_sig2) { + MLAN_DECODE_RU_SIGNALING_CH1( + out, he_sig1, he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, tone); + if (!tone) { + MLAN_DECODE_RU_SIGNALING_CH2( + out, he_sig1, + he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, + tone); + } + if (!tone) { + if ((he_sig2 & + MLAN_160_CENTER_RU) && + !usr_idx) { + tone = RU_TONE_26; + } else { + usr_idx--; + } + } + if (!tone) { + MLAN_DECODING_160_RU_CH3( + out, he_sig1, + he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, + tone); + } + if (!tone) { + MLAN_DECODING_160_RU_CH3( + out, he_sig1, + he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, + tone); + } + if (tone != 0) { + rth->body.u.he.data5 &= + ~RX_HE_BW_160; + rth->body.u.he.data5 |= + tone; + } + } + } else { + if (he_sig2) { + MLAN_DECODE_RU_SIGNALING_CH1( + out, he_sig1, he_sig2); + MLAN_DECODE_RU_TONE( + out, usr_idx, tone); + if (tone) { + rth->body.u.he.data5 |= + tone; + } + } + } + + rth->body.u.he.data2 |= (HE_DATA_GI_KNOWN); + rth->body.u.he.data5 |= ((gi & 3) << 4); + rth->body.u.he.data1 |= (HE_MCS_KNOWN); + + rth->body.u.he.data3 |= (mcs << 8); + rth->body.u.he.data6 |= nss; + rth->body.u.he.data1 |= (HE_DCM_KNOWN); + rth->body.u.he.data1 = + cpu_to_le16(rth->body.u.he.data1); + rth->body.u.he.data5 |= (dcm << 12); + rth->body.u.he.data5 = + cpu_to_le16(rth->body.u.he.data5); + rth->body.u.he.data3 = + cpu_to_le16(rth->body.u.he.data3); + } } skb_set_mac_header(skb, 0); skb->ip_summed = CHECKSUM_UNNECESSARY; @@ -1752,6 +1987,12 @@ mlan_status moal_recv_amsdu_packet(t_void *pmoal, pmlan_buffer pmbuf) status = MLAN_STATUS_PENDING; } else { frame = skb_clone(skb, GFP_ATOMIC); + if (!frame) { + PRINTM(MERROR, + " AMSDU RECV:skb_clone returned NULL\n"); + break; + } + skb_trim(frame, len); eth = (struct ethhdr *)skb_pull(skb, len + padding); if (!eth) { @@ -2439,9 +2680,11 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) if (IS_STA_CFG80211(cfg80211_wext)) { moal_memcpy_ext(priv->phandle, priv->cfg_bssid, pmevent->event_buf, ETH_ALEN, ETH_ALEN); - woal_set_scan_time(priv, ACTIVE_SCAN_CHAN_TIME, - PASSIVE_SCAN_CHAN_TIME, - MIN_SPECIFIC_SCAN_CHAN_TIME); + + if (!priv->phandle->user_scan_cfg) + woal_set_scan_time(priv, ACTIVE_SCAN_CHAN_TIME, + PASSIVE_SCAN_CHAN_TIME, + MIN_SPECIFIC_SCAN_CHAN_TIME); } #endif custom_len = strlen(CUS_EVT_AP_CONNECTED); @@ -2474,6 +2717,12 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) case MLAN_EVENT_ID_DRV_SCAN_REPORT: PRINTM(MINFO, "Scan report\n"); + if (priv->phandle->scan_pending_on_block == MTRUE) { + priv->phandle->scan_pending_on_block = MFALSE; + priv->phandle->scan_priv = NULL; + MOAL_REL_SEMAPHORE(&priv->phandle->async_sem); + } + if (priv->report_scan_result) { priv->report_scan_result = MFALSE; #ifdef STA_CFG80211 @@ -2486,11 +2735,13 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) if (!priv->phandle->first_scan_done) { priv->phandle->first_scan_done = MTRUE; - woal_set_scan_time( - priv, - ACTIVE_SCAN_CHAN_TIME, - PASSIVE_SCAN_CHAN_TIME, - SPECIFIC_SCAN_CHAN_TIME); + if (!priv->phandle + ->user_scan_cfg) + woal_set_scan_time( + priv, + ACTIVE_SCAN_CHAN_TIME, + PASSIVE_SCAN_CHAN_TIME, + SPECIFIC_SCAN_CHAN_TIME); } spin_lock_irqsave( &priv->phandle->scan_req_lock, @@ -2546,11 +2797,6 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) priv->phandle->scan_time_start.time_usec = 0; } - if (priv->phandle->scan_pending_on_block == MTRUE) { - priv->phandle->scan_pending_on_block = MFALSE; - priv->phandle->scan_priv = NULL; - MOAL_REL_SEMAPHORE(&priv->phandle->async_sem); - } break; case MLAN_EVENT_ID_DRV_OBSS_SCAN_PARAM: @@ -2602,8 +2848,9 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) break; case MLAN_EVENT_ID_FW_DISCONNECTED: - woal_send_disconnect_to_system(priv, - (t_u16)*pmevent->event_buf); + if (priv->media_connected) + woal_send_disconnect_to_system( + priv, (t_u16)*pmevent->event_buf); #ifdef STA_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) priv->auth_flag = 0; @@ -2989,7 +3236,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) ) { priv->roaming_required = MTRUE; #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) __pm_wakeup_event(&priv->phandle->ws, ROAMING_WAKE_LOCK_TIMEOUT); #else @@ -3191,7 +3438,14 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) snprintf(event_buf, sizeof(event_buf) - 1, "%s %d", CUS_EVT_RADAR_DETECTED, radar_chan); woal_broadcast_event(priv, event_buf, strlen(event_buf)); - PRINTM(MEVENT, "Radar detected on channel %d\n", radar_chan); + PRINTM(MEVENT, "%s: Radar detected on channel %d\n", + priv->netdev->name, radar_chan); +#ifdef UAP_SUPPORT + if (priv->chan_rpt_req.chanNum && priv->chan_rpt_pending) { + woal_11h_cancel_chan_report_ioctl(priv, MOAL_NO_WAIT); + priv->chan_rpt_pending = MFALSE; + } +#endif #ifdef UAP_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0) @@ -3213,9 +3467,9 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) DFS_UNAVAILABLE); #endif #ifdef UAP_SUPPORT - if ((priv->target_chan && priv->bss_started && - (priv->target_chan != radar_chan)) || - priv->backup_chan) { + if (priv->bss_started && + ((priv->target_chan && (priv->target_chan != radar_chan)) || + priv->backup_chan)) { PRINTM(MEVENT, "Move to target or backup chan %d %d\n", priv->target_chan, priv->backup_chan); woal_move_to_next_channel(priv); @@ -3326,6 +3580,11 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) #endif if (priv->channel == pchan_info->channel) break; +#ifdef UAP_CFG80211 +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) + woal_update_uap_channel_dfs_state(priv); +#endif +#endif priv->channel = pchan_info->channel; #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) @@ -3334,7 +3593,11 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) || priv->uap_host_based #endif #ifdef STA_CFG80211 - || priv->sme_current.ssid_len +#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13) + || priv->wdev->connected +#else + || priv->wdev->current_bss +#endif #endif ) { PRINTM(MEVENT, @@ -3459,10 +3722,14 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) #ifdef STA_SUPPORT #ifdef STA_CFG80211 pmpriv = woal_get_priv((moal_handle *)pmoal, MLAN_BSS_ROLE_STA); - if (IS_STA_CFG80211(cfg80211_wext) && pmpriv) - woal_set_scan_time(pmpriv, ACTIVE_SCAN_CHAN_TIME, - PASSIVE_SCAN_CHAN_TIME, - MIN_SPECIFIC_SCAN_CHAN_TIME); + if (IS_STA_CFG80211(cfg80211_wext) && pmpriv) { + if (!priv->phandle->user_scan_cfg) { + woal_set_scan_time(pmpriv, + ACTIVE_SCAN_CHAN_TIME, + PASSIVE_SCAN_CHAN_TIME, + MIN_SPECIFIC_SCAN_CHAN_TIME); + } + } #endif #endif #ifdef UAP_CFG80211 @@ -3471,8 +3738,9 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) PRINTM(MMSG, "Channel Under Nop: notify cfg80211 new channel=%d\n", priv->channel); -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 2, 0) - cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, 0); +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) + cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, + 0); #elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13) cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0); #else @@ -4068,10 +4336,13 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) priv->phandle->priv [priv->phandle->remain_bss_index]; if (remain_priv) { - woal_cfg80211_remain_on_channel_cfg( - remain_priv, MOAL_NO_WAIT, - MTRUE, &channel_status, NULL, 0, - 0); + if (woal_cfg80211_remain_on_channel_cfg( + remain_priv, MOAL_NO_WAIT, + MTRUE, &channel_status, + NULL, 0, 0)) + PRINTM(MERROR, + "remain_on_channel: Failed to cancel\n"); + priv->phandle->remain_on_channel = MFALSE; } @@ -4233,6 +4504,17 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) PRINTM(MMSG, "FW Roamed to bssid " MACSTR " successfully\n", MAC2STR(pmevent->event_buf)); break; + case MLAN_EVENT_ID_DRV_RTT_RESULT: + DBG_HEXDUMP(MEVT_D, "RTT result", pmevent->event_buf, + pmevent->event_len); +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) +#ifdef STA_CFG80211 + if (IS_STA_CFG80211(cfg80211_wext)) + woal_cfg80211_event_rtt_result(priv, pmevent->event_buf, + pmevent->event_len); +#endif +#endif + break; case MLAN_EVENT_ID_CSI: DBG_HEXDUMP(MEVT_D, "CSI dump", pmevent->event_buf, pmevent->event_len); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c b/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c index 95acf12..84ab167 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c @@ -3,7 +3,7 @@ * @brief This file contains the functions for STA CFG80211. * * - * Copyright 2011-2022 NXP + * Copyright 2011-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -894,8 +894,8 @@ done: * * @return 0 -- success, otherwise fail */ -static int woal_cfg80211_assoc_ies_cfg(moal_private *priv, t_u8 *ie, int ie_len, - t_u8 wait_option) +static int woal_cfg80211_assoc_ies_cfg(moal_private *priv, t_u8 *ie, + size_t ie_len, t_u8 wait_option) { int bytes_left = ie_len; t_u8 *pcurrent_ptr = ie; @@ -2148,17 +2148,29 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy, pmlan_buffer pmbuf = NULL; t_u32 pkt_type, tx_control; t_u16 packet_len = 0, auth_alg; + t_u16 pkt_len; t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; int ret = 0; t_u8 trans = 1, status_code = 0; t_u8 *varptr = NULL; - mlan_ssid_bssid *ssid_bssid; moal_handle *handle = priv->phandle; + mlan_ssid_bssid *ssid_bssid; int i; ENTER(); +#ifdef REASSOCIATION + // disable reassoc_on + handle->reassoc_on &= ~MBIT(priv->bss_index); + priv->reassoc_on = MFALSE; + priv->reassoc_required = MFALSE; + if (!handle->reassoc_on && handle->is_reassoc_timer_set == MTRUE) { + woal_cancel_timer(&handle->reassoc_timer); + handle->is_reassoc_timer_set = MFALSE; + } +#endif + priv->cfg_disconnect = MFALSE; #ifdef UAP_CFG80211 if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) { @@ -2423,15 +2435,16 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy, } #endif /*Add packet len*/ + pkt_len = woal_cpu_to_le16(packet_len); moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE, - &packet_len, sizeof(packet_len), sizeof(packet_len)); + &pkt_len, sizeof(pkt_len), sizeof(pkt_len)); /**Authentication Frame: Authentication Alg*/ mgmt->u.auth.auth_alg = woal_cpu_to_le16(auth_alg); - mgmt->u.auth.auth_transaction = trans; + mgmt->u.auth.auth_transaction = woal_cpu_to_le16(trans); /**Authentication Frame: Status code*/ - mgmt->u.auth.status_code = status_code; + mgmt->u.auth.status_code = woal_cpu_to_le16(status_code); if (req->ie && req->ie_len) { if (!varptr) { @@ -2488,9 +2501,12 @@ done: if (ret) { woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MFALSE); if (priv->phandle->remain_on_channel) { - woal_cfg80211_remain_on_channel_cfg( - priv, MOAL_IOCTL_WAIT, MTRUE, (t_u8 *)&status, - NULL, 0, 0); + if (woal_cfg80211_remain_on_channel_cfg( + priv, MOAL_IOCTL_WAIT, MTRUE, + (t_u8 *)&status, NULL, 0, 0)) { + PRINTM(MERROR, + "Fail to cancel remain on channel\n"); + } priv->phandle->remain_on_channel = MFALSE; } } @@ -2519,9 +2535,12 @@ void woal_host_mlme_work_queue(struct work_struct *work) MFALSE); if (priv->phandle->remain_on_channel) { - woal_cfg80211_remain_on_channel_cfg( - priv, MOAL_IOCTL_WAIT, MTRUE, - (t_u8 *)&status, NULL, 0, 0); + if (woal_cfg80211_remain_on_channel_cfg( + priv, MOAL_IOCTL_WAIT, MTRUE, + (t_u8 *)&status, NULL, 0, 0)) { + PRINTM(MERROR, + "failed to cancel remain on channel\n"); + } priv->phandle->remain_on_channel = MFALSE; } PRINTM(MCMND, "wlan: HostMlme %s auth success\n", @@ -2879,7 +2898,11 @@ done: woal_save_assoc_params(priv, req, ssid_bssid); memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MERROR, + "woal_get_bss_info Fails to get bss info\n"); + } priv->channel = bss_info.bss_chan; } @@ -4255,6 +4278,9 @@ static mlan_status woal_uap_scan(moal_private *priv, mlan_ds_band_cfg bandcfg; u8 band_change = MFALSE; ENTER(); + memset(&org_bandcfg, 0, sizeof(mlan_ds_band_cfg)); + memset(&bandcfg, 0, sizeof(mlan_ds_band_cfg)); + if (priv->bss_index > 0) tmp_priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY); else @@ -4326,7 +4352,7 @@ done: } #endif -static int woal_find_wps_ie_in_probereq(const t_u8 *ie, int len) +static int woal_find_wps_ie_in_probereq(const t_u8 *ie, size_t len) { int left_len = len; const t_u8 *pos = ie; @@ -4556,7 +4582,9 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev, #endif memset(&scan_cfg, 0, sizeof(mlan_scan_cfg)); - woal_get_scan_config(priv, &scan_cfg); + if (MLAN_STATUS_SUCCESS != woal_get_scan_config(priv, &scan_cfg)) { + PRINTM(MERROR, "Fail to get scan request IE\n"); + } #ifdef WIFI_DIRECT_SUPPORT if (priv->phandle->miracast_mode) scan_req->scan_chan_gap = priv->phandle->scan_chan_gap; @@ -4643,8 +4671,9 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev, scan_req->chan_list[i].scan_time = INIT_PASSIVE_SCAN_CHAN_TIME; else - scan_req->chan_list[i].scan_time = - MIN_SPECIFIC_SCAN_CHAN_TIME; + scan_req->chan_list[i].scan_time = MIN( + MIN_SPECIFIC_SCAN_CHAN_TIME, + scan_cfg.scan_time.specific_scan_time); } #endif #ifdef UAP_CFG80211 @@ -4783,6 +4812,7 @@ static int woal_send_ft_action_requst(moal_private *priv, t_u8 *ie, t_u8 len, t_u32 pkt_type; t_u32 tx_control; t_u16 packet_len = 0; + t_u16 pkt_len = 0; t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; int ret = 0; @@ -4814,9 +4844,10 @@ static int woal_send_ft_action_requst(moal_private *priv, t_u8 *ie, t_u8 len, pmbuf->pbuf + pmbuf->data_offset + sizeof(pkt_type), &tx_control, sizeof(tx_control), sizeof(tx_control)); /*Add packet len*/ + pkt_len = woal_cpu_to_le16(packet_len); moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE, - &packet_len, sizeof(packet_len), sizeof(packet_len)); + &pkt_len, sizeof(pkt_len), sizeof(pkt_len)); mgmt = (IEEE80211_MGMT *)(pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE + sizeof(packet_len)); @@ -4890,6 +4921,7 @@ static int woal_send_ft_auth_requst(moal_private *priv, t_u8 *ie, t_u8 len, t_u32 pkt_type; t_u32 tx_control; t_u16 packet_len = 0; + t_u16 pkt_len; t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; int ret = 0; @@ -4920,9 +4952,10 @@ static int woal_send_ft_auth_requst(moal_private *priv, t_u8 *ie, t_u8 len, pmbuf->pbuf + pmbuf->data_offset + sizeof(pkt_type), &tx_control, sizeof(tx_control), sizeof(tx_control)); /*Add packet len*/ + pkt_len = woal_cpu_to_le16(packet_len); moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE, - &packet_len, sizeof(packet_len), sizeof(packet_len)); + &pkt_len, sizeof(pkt_len), sizeof(pkt_len)); mgmt = (IEEE80211_MGMT *)(pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE + sizeof(packet_len)); @@ -5005,8 +5038,11 @@ static int woal_connect_ft_over_air(moal_private *priv, t_u8 *bssid, woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MTRUE); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - woal_cfg80211_remain_on_channel_cfg(priv, wait_option, MFALSE, &status, - chan, 0, AUTH_TX_DEFAULT_WAIT_TIME); + if (woal_cfg80211_remain_on_channel_cfg(priv, wait_option, MFALSE, + &status, chan, 0, + AUTH_TX_DEFAULT_WAIT_TIME)) { + PRINTM(MERROR, "Failed remain on channel config\n"); + } #endif /*construct auth request and send out*/ @@ -5036,8 +5072,10 @@ static int woal_connect_ft_over_air(moal_private *priv, t_u8 *bssid, } #if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - woal_cfg80211_remain_on_channel_cfg(priv, wait_option, MTRUE, &status, - NULL, 0, 0); + if (woal_cfg80211_remain_on_channel_cfg(priv, wait_option, MTRUE, + &status, NULL, 0, 0)) { + PRINTM(MERROR, "Failed to cancel remain on channel\n"); + } #endif woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MFALSE); @@ -5069,8 +5107,12 @@ static int woal_connect_ft_over_ds(moal_private *priv, t_u8 *bssid, if (priv->media_connected) { #if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - woal_cfg80211_remain_on_channel_cfg(priv, wait_option, MFALSE, - &status, pchan, 0, 1200); + if (woal_cfg80211_remain_on_channel_cfg(priv, wait_option, + MFALSE, &status, pchan, + 0, 1200)) { + PRINTM(MERROR, + "Failed to configure remain on channel\n"); + } #endif /*construct ft action request and send out*/ woal_send_ft_action_requst(priv, priv->ft_ie, priv->ft_ie_len, @@ -5085,8 +5127,12 @@ static int woal_connect_ft_over_ds(moal_private *priv, t_u8 *bssid, /*go over air, as current AP may be unreachable */ PRINTM(MMSG, "wlan: go over air\n"); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - woal_cfg80211_remain_on_channel_cfg( - priv, wait_option, MTRUE, &status, NULL, 0, 0); + if (woal_cfg80211_remain_on_channel_cfg( + priv, wait_option, MTRUE, &status, NULL, 0, + 0)) { + PRINTM(MERROR, + "Failed to cancel remain on channel\n"); + } #endif woal_connect_ft_over_air(priv, bssid, pchan); LEAVE(); @@ -5098,8 +5144,10 @@ static int woal_connect_ft_over_ds(moal_private *priv, t_u8 *bssid, sizeof(priv->target_ap_bssid)); } #if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - woal_cfg80211_remain_on_channel_cfg(priv, wait_option, MTRUE, - &status, NULL, 0, 0); + if (woal_cfg80211_remain_on_channel_cfg( + priv, wait_option, MTRUE, &status, NULL, 0, 0)) { + PRINTM(MERROR, "Failed to cancel remain on channel\n"); + } #endif } @@ -5260,7 +5308,10 @@ static int woal_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, !(priv->ft_cap & MBIT(0))) { /** get current bss info */ memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MERROR, "Fail to get bss info\n"); + } /** get target bss info */ if (MLAN_STATUS_SUCCESS != woal_find_essid(priv, ssid_bssid, MOAL_IOCTL_WAIT)) { @@ -5966,6 +6017,7 @@ static int woal_cfg80211_set_tx_power(struct wiphy *wiphy, mlan_power_cfg_t power_cfg; ENTER(); + memset(&power_cfg, 0, sizeof(power_cfg)); priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY); if (!priv) { @@ -6002,6 +6054,7 @@ static int woal_cfg80211_set_cqm_rssi_config(struct wiphy *wiphy, struct net_device *dev, s32 rssi_thold, u32 rssi_hyst) { + int ret = 0; moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); ENTER(); priv->cqm_rssi_thold = rssi_thold; @@ -6010,9 +6063,12 @@ static int woal_cfg80211_set_cqm_rssi_config(struct wiphy *wiphy, PRINTM(MIOCTL, "rssi_thold=%d rssi_hyst=%d\n", (int)rssi_thold, (int)rssi_hyst); - woal_set_rssi_threshold(priv, 0, MOAL_IOCTL_WAIT); + if (MLAN_STATUS_SUCCESS != + woal_set_rssi_threshold(priv, 0, MOAL_IOCTL_WAIT)) { + PRINTM(MERROR, "Fail to set rssi thresold.\n"); + } LEAVE(); - return 0; + return ret; } #endif @@ -6445,7 +6501,7 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev, /** Add broadcast scan, when n_match_sets = 0 */ if (!request->n_match_sets) priv->scan_cfg.ssid_list[0].max_len = 0xff; - for (i = 0; i < (int)MIN(WLAN_BG_SCAN_CHAN_MAX, request->n_channels); + for (i = 0; i < (int)MIN(WLAN_USER_SCAN_CHAN_MAX, request->n_channels); i++) { chan = request->channels[i]; priv->scan_cfg.chan_list[i].chan_number = chan->hw_value; @@ -6458,6 +6514,8 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev, else priv->scan_cfg.chan_list[i].scan_type = MLAN_SCAN_TYPE_ACTIVE; + PRINTM(MCMD_D, "cfg80211_sched_scan: chan=%d chan->flag=0x%x\n", + chan->hw_value, chan->flags); priv->scan_cfg.chan_list[i].scan_time = 0; #ifdef WIFI_DIRECT_SUPPORT if (priv->phandle->miracast_mode) @@ -6466,7 +6524,7 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev, #endif } priv->scan_cfg.chan_per_scan = - MIN(WLAN_BG_SCAN_CHAN_MAX, request->n_channels); + MIN(WLAN_USER_SCAN_CHAN_MAX, request->n_channels); /** set scan request IES */ if (request->ie && request->ie_len) { @@ -6653,7 +6711,7 @@ int woal_cfg80211_resume(struct wiphy *wiphy) handle->priv[i]->roaming_required = MTRUE; #ifdef ANDROID_KERNEL -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) __pm_wakeup_event( &handle->ws, ROAMING_WAKE_LOCK_TIMEOUT); @@ -7899,6 +7957,7 @@ static int woal_send_tdls_action_frame(struct wiphy *wiphy, t_u32 pkt_type; t_u32 tx_control; t_u16 pkt_len; + t_u16 packet_len; int ret = 0; ENTER(); @@ -7958,9 +8017,10 @@ static int woal_send_tdls_action_frame(struct wiphy *wiphy, pmbuf->bss_index = priv->bss_index; pkt_len = pmbuf->data_len - HEADER_SIZE - sizeof(pkt_len); + packet_len = woal_cpu_to_le16(pkt_len); moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE, - &pkt_len, sizeof(pkt_len), sizeof(pkt_len)); + &packet_len, sizeof(packet_len), sizeof(packet_len)); DBG_HEXDUMP(MDAT_D, "TDLS action:", pmbuf->pbuf + pmbuf->data_offset, pmbuf->data_len); @@ -8222,7 +8282,10 @@ int woal_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev, /* check if AP prohited TDLS */ memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MERROR, "WLAN, %s: Failed to get bss info.\n", __func__); + } if (IS_EXTCAP_TDLS_PROHIBITED(bss_info.ext_cap)) { PRINTM(MMSG, "TDLS is prohibited by AP\n"); LEAVE(); @@ -8406,7 +8469,10 @@ static int woal_cfg80211_tdls_channel_switch(struct wiphy *wiphy, /* check if AP prohited TDLS channel switch */ memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MERROR, "WLAN, %s: Failed to get bss info.\n", __func__); + } if (IS_EXTCAP_TDLS_CHLSWITCHPROHIB(bss_info.ext_cap)) { PRINTM(MMSG, "TDLS Channel Switching is prohibited by AP\n"); LEAVE(); @@ -8631,7 +8697,7 @@ int woal_cfg80211_update_ft_ies(struct wiphy *wiphy, struct net_device *dev, PRINTM(MINFO, "==>woal_cfg80211_update_ft_ies %x \n", ftie->ie_len); #endif md_ie = (IEEEtypes_MobilityDomain_t *)woal_parse_ie_tlv( - ftie->ie, ftie->ie_len, MOBILITY_DOMAIN); + ftie->ie, (int)ftie->ie_len, MOBILITY_DOMAIN); if (!md_ie) { PRINTM(MERROR, "No Mobility domain IE\n"); kfree(assoc_rsp); @@ -9193,7 +9259,7 @@ done: /* config rssi low threshold again */ priv->last_event = 0; priv->rssi_low = DEFAULT_RSSI_LOW_THRESHOLD; - sprintf(rssi_low, "%d", priv->rssi_low); + snprintf(rssi_low, sizeof(rssi_low), "%d", priv->rssi_low); if (MLAN_STATUS_FAILURE == woal_set_rssi_low_threshold(priv, rssi_low, MOAL_IOCTL_WAIT)) PRINTM(MERROR, "set_rssi_low_threshold fail\n"); @@ -9444,6 +9510,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev, params->link_sta_params.he_capa_len; tlv = (MrvlIEtypes_Data_t *)pos; } + #elif CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) if (params->he_capa_len) { ext_tlv = (MrvlExtIEtypes_Data_t *)pos; @@ -9665,11 +9732,13 @@ mlan_status woal_register_sta_cfg80211(struct net_device *dev, t_u8 bss_type) * * @param priv A pointer to moal_private structure * @param wiphy A pointer to structure wiphy + * @param fw_info A pointer to mlan_fw_info * @param wait_option Wait option * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv, struct wiphy *wiphy, + mlan_fw_info *fw_info, t_u8 wait_option) { mlan_status ret = MLAN_STATUS_SUCCESS; @@ -9726,7 +9795,8 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv, } woal_cfg80211_setup_ht_cap( &wiphy->bands[IEEE80211_BAND_2GHZ]->ht_cap, hw_dev_cap, - cfg_11n->param.supported_mcs_set); + cfg_11n->param.supported_mcs_set, + fw_info->hw_mpdu_density); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) woal_cfg80211_setup_vht_cap( priv, &wiphy->bands[IEEE80211_BAND_2GHZ]->vht_cap); @@ -9746,7 +9816,8 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv, } woal_cfg80211_setup_ht_cap( &wiphy->bands[IEEE80211_BAND_5GHZ]->ht_cap, hw_dev_cap, - cfg_11n->param.supported_mcs_set); + cfg_11n->param.supported_mcs_set, + fw_info->hw_mpdu_density); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) woal_cfg80211_setup_vht_cap( priv, &wiphy->bands[IEEE80211_BAND_5GHZ]->vht_cap); @@ -9782,7 +9853,8 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv, } #endif if (IS_CARD9098(priv->phandle->card_type) || - IS_CARD9097(priv->phandle->card_type)) { + IS_CARD9097(priv->phandle->card_type) || + IS_CARDIW62X(priv->phandle->card_type)) { woal_cfg80211_notify_antcfg(priv, wiphy, radio); } wiphy->available_antennas_tx = radio->param.ant_cfg.tx_antenna; @@ -10246,7 +10318,8 @@ mlan_status woal_register_cfg80211(moal_private *priv) (t_u8 *)&priv->extended_capabilities; wiphy->extended_capabilities_len = sizeof(priv->extended_capabilities); #endif - woal_cfg80211_init_wiphy(priv, wiphy, MOAL_IOCTL_WAIT); + + woal_cfg80211_init_wiphy(priv, wiphy, &fw_info, MOAL_IOCTL_WAIT); if (wiphy_register(wiphy) < 0) { PRINTM(MERROR, "Wiphy device registration failed!\n"); ret = MLAN_STATUS_FAILURE; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap.c b/mxm_wifiex/wlan_src/mlinux/moal_uap.c index 8a033ba..fe5d259 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap.c @@ -432,7 +432,7 @@ static int woal_uap_band_steer(struct net_device *dev, struct ifreq *req) } DBG_HEXDUMP(MCMD_D, "band_steer_para", (t_u8 *)¶m, sizeof(param)); - ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_band_steer_cfg)); + ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); if (ioctl_req == NULL) { LEAVE(); return -ENOMEM; @@ -508,8 +508,7 @@ static int woal_uap_beacon_stuck(struct net_device *dev, struct ifreq *req) DBG_HEXDUMP(MCMD_D, "beacon_stuck_detect_para", (t_u8 *)¶m, sizeof(param)); - ioctl_req = woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_beacon_stuck_param_cfg)); + ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); if (ioctl_req == NULL) { LEAVE(); return -ENOMEM; @@ -918,7 +917,7 @@ static int woal_uap_domain_info(struct net_device *dev, struct ifreq *req) DBG_HEXDUMP(MCMD_D, "domain_info_para", (t_u8 *)¶m, sizeof(param)); if (param.action) { /* get tlv header */ - if (copy_from_user(tlv, req->ifr_data + sizeof(param), + if (copy_from_user(&tlv[0], req->ifr_data + sizeof(param), TLV_HEADER_LEN)) { PRINTM(MERROR, "Copy from user failed\n"); ret = -EFAULT; @@ -1550,7 +1549,12 @@ static int woal_uap_hs_cfg(struct net_device *dev, struct ifreq *req, (hs_cfg.conditions != HOST_SLEEP_CFG_CANCEL || invoke_hostcmd == MFALSE)) { memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MERROR, "ERR: failed in getting bss info\n"); + ret = -EFAULT; + goto done; + } if (bss_info.is_hs_configured) { PRINTM(MERROR, "HS already configured\n"); ret = -EFAULT; @@ -1561,8 +1565,12 @@ static int woal_uap_hs_cfg(struct net_device *dev, struct ifreq *req, if (hs_cfg.flags & HS_CFG_FLAG_SET) { action = MLAN_ACT_SET; if (hs_cfg.flags != HS_CFG_FLAG_ALL) { - woal_set_get_hs_params(priv, MLAN_ACT_GET, - MOAL_IOCTL_WAIT, &hscfg); + if (MLAN_STATUS_SUCCESS != + woal_set_get_hs_params(priv, MLAN_ACT_GET, + MOAL_IOCTL_WAIT, &hscfg)) { + PRINTM(MERROR, + "Unable to get HS Configuration\n"); + } } if (hs_cfg.flags & HS_CFG_FLAG_CONDITION) hscfg.conditions = hs_cfg.conditions; @@ -1919,7 +1927,8 @@ static int woal_uap_antenna_cfg(struct net_device *dev, struct ifreq *req) radio->param.ant_cfg.rx_antenna = antenna_config.rx_mode; #if defined(STA_CFG80211) || defined(UAP_CFG80211) if (IS_CARD9098(priv->phandle->card_type) || - IS_CARD9097(priv->phandle->card_type)) { + IS_CARD9097(priv->phandle->card_type) || + IS_CARDIW62X(priv->phandle->card_type)) { if (IS_STA_CFG80211( priv->phandle->params.cfg80211_wext)) woal_cfg80211_notify_antcfg( @@ -2103,27 +2112,8 @@ int woal_11h_chan_dfs_state(moal_private *priv, t_u8 action, mlan_ioctl_req *req = NULL; mlan_ds_11h_cfg *ds_11hcfg = NULL; mlan_status status = MLAN_STATUS_SUCCESS; -#ifdef UAP_CFG80211 -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) - int cfg80211_wext = priv->phandle->params.cfg80211_wext; -#endif -#endif ENTER(); -#ifdef UAP_CFG80211 -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) - if (action == MLAN_ACT_GET) { - if (IS_UAP_CFG80211(cfg80211_wext)) { - ret = woal_get_wiphy_chan_dfs_state( - priv->phandle->wiphy, ch_dfs_state); - if (!ret) { - LEAVE(); - return ret; - } - } - } -#endif -#endif req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_11h_cfg)); if (req == NULL) { ret = -ENOMEM; @@ -2222,9 +2212,41 @@ static int woal_uap_get_dfs_chan(t_u8 pri_chan, t_u8 bw, #ifdef UAP_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) +/** + * @brief update channel dfs state in mlan module + * + * @param channel given radar channel + * @param dfs_state dfs_state + * + * @return N/A + */ +void woal_set_channel_dfs_state(t_u8 channel, t_u8 dfs_state) +{ + int index; + mlan_ds_11h_chan_dfs_state ch_dfs_state; + moal_private *priv; + memset(&ch_dfs_state, 0, sizeof(ch_dfs_state)); + ch_dfs_state.channel = channel; + ch_dfs_state.dfs_state = dfs_state; + for (index = 0; index < MAX_MLAN_ADAPTER; index++) { + if (m_handle[index]) { + priv = woal_get_priv(m_handle[index], + MLAN_BSS_ROLE_UAP); + if (priv) { + if (woal_11h_chan_dfs_state(priv, MLAN_ACT_SET, + &ch_dfs_state)) + PRINTM(MERROR, + "Set DFS state for chan:%d failed\n", + ch_dfs_state.channel); + } + } + } +} + /** * @brief update channel dfs state to all wiphy * + * @param priv Pointer to the moal_private driver data struct * @param channel given radar channel * @param bandwidth channel's bandwidth * @param dfs_state dfs_state @@ -2247,9 +2269,62 @@ void woal_update_channels_dfs_state(moal_private *priv, t_u8 channel, dfs_state); } } + for (i = 0; i < n_chan; i++) { + woal_set_channel_dfs_state(ch_dfs_state[i].channel, dfs_state); + } LEAVE(); return; } + +/** + * @brief reset uap channel dfs_state to DFS_USABLE + * + * @param priv Pointer to the moal_private driver data struct + * + * @return N/A + */ +void woal_update_uap_channel_dfs_state(moal_private *priv) +{ + mlan_ds_11h_chan_dfs_state ch_dfs_state; + t_u8 channel; + t_u8 bandwidth; + ENTER(); + if (woal_is_etsi_country(priv->phandle->country_code)) { + LEAVE(); + return; + } + if (priv->bss_role == MLAN_BSS_ROLE_UAP && priv->bss_started && + priv->uap_host_based) { + channel = priv->chan.chan->hw_value; + memset(&ch_dfs_state, 0, sizeof(ch_dfs_state)); + ch_dfs_state.channel = channel; + if (woal_11h_chan_dfs_state(priv, MLAN_ACT_GET, + &ch_dfs_state)) { + PRINTM(MERROR, "%s: woal_11h_chan_dfs_state failed \n", + __func__); + LEAVE(); + return; + } + + if (ch_dfs_state.dfs_required && + ch_dfs_state.dfs_state == DFS_AVAILABLE) { + switch (priv->chan.width) { + case NL80211_CHAN_WIDTH_40: + bandwidth = CHAN_BW_40MHZ; + break; + case NL80211_CHAN_WIDTH_80: + bandwidth = CHAN_BW_80MHZ; + break; + default: + bandwidth = CHAN_BW_20MHZ; + break; + } + woal_update_channels_dfs_state(priv, channel, bandwidth, + DFS_USABLE); + } + } + LEAVE(); +} #endif #endif @@ -2713,7 +2788,12 @@ static int woal_uap_radio_ctl(struct net_device *dev, struct ifreq *req) } else { /* Get radio status */ memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + PRINTM(MERROR, "ERR: failed in getting bss info\n"); + ret = -EFAULT; + goto done; + } data[1] = bss_info.radio_on; if (copy_to_user(req->ifr_data, data, sizeof(data))) { @@ -3160,7 +3240,8 @@ static int woal_uap_get_sta_list_ioctl(struct net_device *dev, /* Allocate an IOCTL request buffer */ ioctl_req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_get_info)); + sizeof(mlan_ds_get_info) + + (MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS)); if (ioctl_req == NULL) { ret = -ENOMEM; goto done; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap.h b/mxm_wifiex/wlan_src/mlinux/moal_uap.h index 8f5b699..5719f66 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap.h @@ -28,9 +28,6 @@ Change log: #ifndef _MOAL_UAP_H #define _MOAL_UAP_H -/** Maximum buffer length for WOAL_UAP_SET_GET_256_CHAR */ -#define MAX_BUF_LEN 256 - /** Private command ID to send ioctl */ #define UAP_IOCTL_CMD (SIOCDEVPRIVATE + 2) /** Updating ADDBA variables */ @@ -546,6 +543,7 @@ int woal_11h_chan_dfs_state(moal_private *priv, t_u8 action, #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) void woal_update_channels_dfs_state(moal_private *priv, t_u8 channel, t_u8 bandwidth, t_u8 dfs_state); +void woal_update_uap_channel_dfs_state(moal_private *priv); #endif #endif diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c b/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c index eafbcc2..798a8b9 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c @@ -3,7 +3,7 @@ * @brief This file contains the functions for uAP CFG80211. * * - * Copyright 2011-2022 NXP + * Copyright 2011-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -108,7 +108,8 @@ static int woal_deauth_assoc_station(moal_private *priv, u8 *mac_addr, } ioctl_req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_get_info)); + sizeof(mlan_ds_get_info) + + (MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS)); if (ioctl_req == NULL) { LEAVE(); return -ENOMEM; @@ -178,7 +179,8 @@ static int woal_deauth_all_station(moal_private *priv) PRINTM(MIOCTL, "del all station\n"); /* Allocate an IOCTL request buffer */ ioctl_req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_get_info)); + sizeof(mlan_ds_get_info) + + (MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS)); if (ioctl_req == NULL) { ret = -ENOMEM; goto done; @@ -241,6 +243,9 @@ static t_u8 woal_check_rsn_ie(IEEEtypes_Rsn_t *rsn_ie, break; } count = woal_le16_to_cpu(rsn_ie->pairwise_cipher.count); + if (count < 1) + return MFALSE; + for (i = 0; i < count; i++) { switch (rsn_ie->pairwise_cipher.list[i].type) { case WPA_CIPHER_TKIP: @@ -318,6 +323,9 @@ static t_u8 woal_check_wpa_ie(IEEEtypes_Wpa_t *wpa_ie, break; } count = woal_le16_to_cpu(wpa_ie->pairwise_cipher.count); + if (count < 1) + return MFALSE; + for (i = 0; i < count; i++) { switch (wpa_ie->pairwise_cipher.list[i].type) { case WPA_CIPHER_TKIP: @@ -576,6 +584,11 @@ static t_u8 woal_check_11ax_capability(moal_private *priv, t_u8 band, else enable_11ax = MFALSE; #else + if (priv->phandle->params.auto_11ax == 0) { + PRINTM(MCMND, "auto_11ax is disabled\n"); + LEAVE(); + return enable_11ax; + } memset(&he_cfg, 0, sizeof(he_cfg)); if (band == BAND_5GHZ) he_cfg.band = MBIT(1); @@ -788,9 +801,12 @@ static void woal_set_uap_rates(moal_private *priv, mlan_uap_bss_param *bss_cfg, pIEEEtypes_Header_t ext_rate_ie; int var_offset = offsetof(struct ieee80211_mgmt, u.beacon.variable); const u8 *var_pos = head_ie + var_offset; - int len = head_len - var_offset; + int len = 0; int rate_len = 0; + if (var_offset > head_len) + return; + len = head_len - var_offset; rate_ie = (void *)woal_parse_ie_tlv(var_pos, len, WLAN_EID_SUPP_RATES); if (rate_ie) { memset(bss_cfg->rates, 0, sizeof(bss_cfg->rates)); @@ -880,17 +896,16 @@ static int woal_cfg80211_beacon_config(moal_private *priv, } #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ie = ((struct cfg80211_ap_settings *)params)->beacon.tail; - ie_len = ((struct cfg80211_ap_settings *)params)->beacon.tail_len; + ie_len = (int)((struct cfg80211_ap_settings *)params)->beacon.tail_len; #else ie = ((struct beacon_parameters *)params)->tail; - ie_len = ((struct beacon_parameters *)params)->tail_len; + ie_len = (int)((struct beacon_parameters *)params)->tail_len; #endif #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) - wapi_ie = (t_u8 *)woal_parse_ie_tlv(params->beacon.tail, - params->beacon.tail_len, WAPI_IE); + wapi_ie = + (t_u8 *)woal_parse_ie_tlv(params->beacon.tail, ie_len, WAPI_IE); #else - wapi_ie = (t_u8 *)woal_parse_ie_tlv(params->tail, params->tail_len, - WAPI_IE); + wapi_ie = (t_u8 *)woal_parse_ie_tlv(params->tail, ie_len, WAPI_IE); #endif if (wapi_ie) { wapi_ie_len = *(wapi_ie + 1) + 2; @@ -1357,12 +1372,23 @@ static int woal_cfg80211_beacon_config(moal_private *priv, /*find and set wmm ie*/ woal_set_wmm_ies(priv, ie, ie_len, sys_config); } - /* If the security mode is configured as WEP or WPA-PSK, - * it will disable 11n automatically, and if configured as - * open(off) or wpa2-psk, it will automatically enable 11n */ - if ((sys_config->protocol == PROTOCOL_STATIC_WEP) || - (sys_config->protocol == PROTOCOL_WPA)) + + /** If the security mode is configured as WEP or + * WPA/WPA2 with TKIP only, disable 11n*/ + if (sys_config->protocol == PROTOCOL_STATIC_WEP) enable_11n = MFALSE; +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) + else if (sys_config->protocol & (PROTOCOL_WPA | PROTOCOL_WPA2)) { + if ((params->crypto.wpa_versions & NL80211_WPA_VERSION_1) && + sys_config->wpa_cfg.pairwise_cipher_wpa == CIPHER_TKIP) + enable_11n = MFALSE; + + if ((params->crypto.wpa_versions & NL80211_WPA_VERSION_2) && + sys_config->wpa_cfg.pairwise_cipher_wpa2 == CIPHER_TKIP) + enable_11n = MFALSE; + } +#endif + if (!enable_11n) { if (woal_set_uap_ht_tx_cfg(priv, sys_config->bandcfg, ht_cap, MFALSE)) { @@ -1394,7 +1420,7 @@ static int woal_cfg80211_beacon_config(moal_private *priv, woal_uap_set_11ac_status(priv, MLAN_ACT_DISABLE, vht20_40, NULL); } - if (enable_11ax && enable_11n) { + if (enable_11ax) { #if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) hecap_ie = (IEEEtypes_HECap_t *)woal_parse_ext_ie_tlv( ie, ie_len, HE_CAPABILITY); @@ -1548,7 +1574,7 @@ static int woal_cfg80211_add_mon_if(struct wiphy *wiphy, chan_info.channel = 1; chan_info.is_11n_enabled = MTRUE; } - mon_if->flag = 0x7; + mon_if->flag = handle->params.mon_filter; if (MLAN_STATUS_SUCCESS != woal_set_net_monitor(priv, MOAL_IOCTL_WAIT, MTRUE, mon_if->flag, &mon_if->band_chan_cfg)) { @@ -1860,10 +1886,13 @@ int woal_cfg80211_add_virt_if(struct wiphy *wiphy, /* Initialize priv structure */ woal_init_priv(new_priv, MOAL_IOCTL_WAIT); /** Init to GO/CLIENT mode */ - if (type == NL80211_IFTYPE_P2P_CLIENT) - woal_cfg80211_init_p2p_client(new_priv); - else if (type == NL80211_IFTYPE_P2P_GO) - woal_cfg80211_init_p2p_go(new_priv); + if (type == NL80211_IFTYPE_P2P_CLIENT) { + if (woal_cfg80211_init_p2p_client(new_priv)) + PRINTM(MERROR, "%s: Fail to init p2p go", __func__); + } else if (type == NL80211_IFTYPE_P2P_GO) { + if (woal_cfg80211_init_p2p_go(new_priv)) + PRINTM(MERROR, "%s: Fail to init p2p client", __func__); + } #if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) ret = cfg80211_register_netdevice(ndev); #else @@ -2730,19 +2759,16 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev) if (priv->bss_started == MTRUE) { if (woal_uap_bss_ctrl(priv, MOAL_NO_WAIT, UAP_BSS_STOP)) { PRINTM(MERROR, "%s: stop uap failed \n", __func__); - ret = -EFAULT; goto done; } if (woal_uap_bss_ctrl(priv, MOAL_NO_WAIT, UAP_BSS_RESET)) { PRINTM(MERROR, "%s: reset uap failed \n", __func__); - ret = -EFAULT; goto done; } /* Set WLAN MAC addresses */ if (MLAN_STATUS_FAILURE == woal_request_set_mac_address(priv, MOAL_NO_WAIT)) { PRINTM(MERROR, "Set MAC address failed\n"); - ret = -EFAULT; goto done; } #if CFG80211_VERSION_CODE < KERNEL_VERSION(4, 20, 0) @@ -2754,10 +2780,11 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev) if (!woal_is_any_interface_active(priv->phandle)) { pmpriv = woal_get_priv((moal_handle *)priv->phandle, MLAN_BSS_ROLE_STA); - if (pmpriv) + if (pmpriv && !priv->phandle->user_scan_cfg) { woal_set_scan_time(pmpriv, ACTIVE_SCAN_CHAN_TIME, PASSIVE_SCAN_CHAN_TIME, SPECIFIC_SCAN_CHAN_TIME); + } } #endif @@ -2829,12 +2856,14 @@ int woal_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev, PRINTM(MERROR, "%s: stop uap failed \n", __func__); } + if (params->use_short_preamble == 1) sys_config->preamble_type = 1; else if (params->use_short_preamble == 0) sys_config->preamble_type = 2; else sys_config->preamble_type = 0; + if (MLAN_STATUS_SUCCESS == woal_set_get_sys_config(priv, MLAN_ACT_SET, MOAL_IOCTL_WAIT, sys_config)) @@ -2966,7 +2995,8 @@ int woal_uap_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, /* Allocate an IOCTL request buffer */ ioctl_req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_get_info)); + sizeof(mlan_ds_get_info) + + (MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS)); if (ioctl_req == NULL) { ret = -ENOMEM; goto done; @@ -3065,7 +3095,8 @@ int woal_uap_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev, /* Allocate an IOCTL request buffer */ ioctl_req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_get_info)); + sizeof(mlan_ds_get_info) + + (MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS)); if (ioctl_req == NULL) { ret = -ENOMEM; goto done; @@ -3467,7 +3498,7 @@ static void woal_switch_uap_channel(moal_private *priv, t_u8 wait_option) priv->channel = uap_channel.channel; moal_memcpy_ext(priv->phandle, &priv->chan, &priv->csa_chan, sizeof(struct cfg80211_chan_def), sizeof(priv->chan)); -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 2, 0) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, 0); #elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13) cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0); @@ -3573,7 +3604,7 @@ int woal_cfg80211_start_radar_detection(struct wiphy *wiphy, mlan_status status = MLAN_STATUS_SUCCESS; chan_band_info channel; t_u16 enable = 0; - + t_u8 event_buf[64] = {0}; ENTER(); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 15, 0) @@ -3595,6 +3626,9 @@ int woal_cfg80211_start_radar_detection(struct wiphy *wiphy, ret = -EBUSY; goto done; } + snprintf(event_buf, sizeof(event_buf) - 1, "%s %d", CUS_EVT_CAC_START, + chandef->chan->hw_value); + woal_broadcast_event(priv, event_buf, strlen(event_buf)); if (MLAN_STATUS_SUCCESS == woal_mc_policy_cfg(priv, &enable, MOAL_IOCTL_WAIT, MLAN_ACT_GET)) { if (enable) { diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c b/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c index 806a600..aa4dc78 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c @@ -197,7 +197,7 @@ static int woal_get_name(struct net_device *dev, struct iw_request_info *info, { char *cwrq = wrqu->name; ENTER(); - strcpy(cwrq, "IEEE 802.11-DS"); + strncpy(cwrq, "IEEE 802.11-DS", IFNAMSIZ); LEAVE(); return 0; } @@ -405,7 +405,7 @@ static int woal_get_freq(struct net_device *dev, struct iw_request_info *info, return -EFAULT; } - band = (ap_cfg->bandcfg.chanBand == BAND_5GHZ); + band = (((ap_cfg->bandcfg.chanBand == BAND_5GHZ) ? 1 : 0)); fwrq->m = (long)channel_to_frequency(ap_cfg->channel, band); fwrq->i = (long)ap_cfg->channel; fwrq->e = 6; @@ -1130,7 +1130,8 @@ static int woal_set_mlme(struct net_device *dev, struct iw_request_info *info, if (!memcmp(bc_addr, sta_addr, ETH_ALEN)) { PRINTM(MIOCTL, "Deauth all stations\n"); req = woal_alloc_mlan_ioctl_req( - sizeof(mlan_ds_get_info)); + sizeof(mlan_ds_get_info) + + (MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS)); if (req == NULL) { LEAVE(); return -ENOMEM; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_usb.c b/mxm_wifiex/wlan_src/mlinux/moal_usb.c index 0f5d3fd..16ccf1a 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_usb.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_usb.c @@ -35,7 +35,7 @@ extern struct semaphore AddRemoveCardSem; ********************************************************/ #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBNW62X) + defined(USB8978) || defined(USBIW62X) /** Card-type detection frame response */ typedef struct { /** 32-bit ACK+WINNER field */ @@ -95,10 +95,10 @@ static struct usb_device_id woal_usb_table[] = { {NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_1, "NXP WLAN USB Adapter")}, {NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_2, "NXP WLAN USB Adapter")}, #endif -#ifdef USBNW62X - {NXP_USB_DEVICE(USBNW62X_VID_1, USBNW62X_PID_1, +#ifdef USBIW62X + {NXP_USB_DEVICE(USBIW62X_VID_1, USBIW62X_PID_1, "NXP WLAN USB Adapter")}, - {NXP_USB_DEVICE(USBNW62X_VID_1, USBNW62X_PID_2, + {NXP_USB_DEVICE(USBIW62X_VID_1, USBIW62X_PID_2, "NXP WLAN USB Adapter")}, #endif /* Terminating entry */ @@ -128,8 +128,8 @@ static struct usb_device_id woal_usb_table_skip_fwdnld[] = { #ifdef USB9097 {NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_2, "NXP WLAN USB Adapter")}, #endif -#ifdef USBNW62X - {NXP_USB_DEVICE(USBNW62X_VID_1, USBNW62X_PID_2, +#ifdef USBIW62X + {NXP_USB_DEVICE(USBIW62X_VID_1, USBIW62X_PID_2, "NXP WLAN USB Adapter")}, #endif /* Terminating entry */ @@ -497,19 +497,20 @@ rx_ret: ********************************************************/ #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBNW62X) + defined(USB8978) || defined(USBIW62X) /** * @brief Check chip revision * * @param handle A pointer to moal_handle structure * @param usb_chip_rev A pointer to usb_chip_rev variable * @param usb_strap A pointer to usb_strap + * @param boot_mode A pointer to boot_mode * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ static mlan_status woal_check_chip_revision(moal_handle *handle, t_u32 *usb_chip_rev, - t_u32 *usb_strap) + t_u32 *usb_strap, t_u32 *boot_mode) { mlan_status ret = MLAN_STATUS_SUCCESS; mlan_buffer mbuf; @@ -582,7 +583,7 @@ static mlan_status woal_check_chip_revision(moal_handle *handle, ack_pkt.strap = woal_le32_to_cpu(ack_pkt.strap); if ((ack_pkt.extend & 0xffff0000) == EXTEND_HDR) { - extend_ver = ack_pkt.extend & 0x0000ffff; + extend_ver = ack_pkt.extend & 0x000000ff; *usb_chip_rev = ack_pkt.chip_rev & 0x000000ff; if (extend_ver >= EXTEND_V2) { PRINTM(MINFO, "chip_rev=0x%x, strap=0x%x\n", @@ -590,6 +591,8 @@ static mlan_status woal_check_chip_revision(moal_handle *handle, *usb_strap = ack_pkt.strap & 0x7; } else PRINTM(MINFO, "chip_rev=0x%x\n", *usb_chip_rev); + if (extend_ver >= EXTEND_V3) + *boot_mode = (ack_pkt.extend & 0x0000ff00) >> 8; } cleanup: kfree(recv_buff); @@ -807,18 +810,18 @@ static t_u16 woal_update_card_type(t_void *card) strlen(KERN_VERSION)); } #endif -#ifdef USBNW62X +#ifdef USBIW62X if (woal_cpu_to_le16(cardp_usb->udev->descriptor.idProduct) == - (__force __le16)USBNW62X_PID_1 || + (__force __le16)USBIW62X_PID_1 || woal_cpu_to_le16(cardp_usb->udev->descriptor.idProduct) == - (__force __le16)USBNW62X_PID_2) { - card_type = CARD_TYPE_USBNW62X; - moal_memcpy_ext(NULL, driver_version, CARD_USBNW62X, - strlen(CARD_USBNW62X), strlen(driver_version)); + (__force __le16)USBIW62X_PID_2) { + card_type = CARD_TYPE_USBIW62X; + moal_memcpy_ext(NULL, driver_version, CARD_USBIW62X, + strlen(CARD_USBIW62X), strlen(driver_version)); moal_memcpy_ext(NULL, driver_version + strlen(INTF_CARDTYPE) + strlen(KERN_VERSION), - V17, strlen(V17), + V18, strlen(V18), strlen(driver_version) - strlen(INTF_CARDTYPE) - strlen(KERN_VERSION)); } @@ -890,9 +893,9 @@ static int woal_usb_probe(struct usb_interface *intf, #ifdef USB9097 case (__force __le16)USB9097_PID_1: #endif /* USB9097 */ -#ifdef USBNW62X - case (__force __le16)USBNW62X_PID_1: -#endif /* USBNW62X */ +#ifdef USBIW62X + case (__force __le16)USBIW62X_PID_1: +#endif /* USBIW62X */ /* If skip FW is set, we must return error so * the next driver can download the FW */ @@ -920,9 +923,9 @@ static int woal_usb_probe(struct usb_interface *intf, #ifdef USB9097 case (__force __le16)USB9097_PID_2: #endif /* USB9097 */ -#ifdef USBNW62X - case (__force __le16)USBNW62X_PID_2: -#endif /* USBNW62X */ +#ifdef USBIW62X + case (__force __le16)USBIW62X_PID_2: +#endif /* USBIW62X */ usb_cardp->boot_state = USB_FW_READY; break; @@ -2040,9 +2043,10 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) { mlan_status ret = MLAN_STATUS_SUCCESS; #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBNW62X) + defined(USB8978) || defined(USBIW62X) t_u32 revision_id = 0; t_u32 strap = 0; + t_u32 boot_mode = 0; #endif struct usb_card_rec *cardp = (struct usb_card_rec *)handle->card; #if defined(USB9098) @@ -2060,8 +2064,9 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) #endif #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBNW62X) - ret = woal_check_chip_revision(handle, &revision_id, &strap); + defined(USB8978) || defined(USBIW62X) + ret = woal_check_chip_revision(handle, &revision_id, &strap, + &boot_mode); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MFATAL, "Chip revision check failure!\n"); ret = MLAN_STATUS_FAILURE; @@ -2073,22 +2078,26 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) #ifdef USB8997 if (IS_USB8997(handle->card_type)) { if (strap == CARD_TYPE_USB_UART) - strcpy(handle->card_info->fw_name, - USBUART8997_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUART8997_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else if (strap != 0) - strcpy(handle->card_info->fw_name, - USBUSB8997_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUSB8997_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } #endif #ifdef USB8978 if (IS_USB8978(handle->card_type)) { if (strap == CARD_TYPE_USB_UART) - strcpy(handle->card_info->fw_name, - USBUART8978_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUART8978_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else if (strap != 0) - strcpy(handle->card_info->fw_name, - USBUSB8978_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUSB8978_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } #endif @@ -2097,10 +2106,12 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) if (cardp->second_mac) { ref_handle = (moal_handle *)handle->pref_mac; if (ref_handle) { - strcpy(handle->card_info->fw_name, - ref_handle->card_info->fw_name); - strcpy(handle->card_info->fw_name_wlan, - ref_handle->card_info->fw_name_wlan); + strncpy(handle->card_info->fw_name, + ref_handle->card_info->fw_name, + FW_NAMW_MAX_LEN); + strncpy(handle->card_info->fw_name_wlan, + ref_handle->card_info->fw_name_wlan, + FW_NAMW_MAX_LEN); } goto done; } @@ -2108,28 +2119,32 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) case USB9098_Z1Z2: if (strap != 0) { if (strap == CARD_TYPE_USB_UART) - strcpy(handle->card_info->fw_name, - USBUART9098_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUART9098_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - USBUSB9098_DEFAULT_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUSB9098_DEFAULT_COMBO_FW_NAME, + FW_NAMW_MAX_LEN); } - strcpy(handle->card_info->fw_name_wlan, - USB9098_DEFAULT_WLAN_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + USB9098_DEFAULT_WLAN_FW_NAME, FW_NAMW_MAX_LEN); break; case USB9098_A0: case USB9098_A1: case USB9098_A2: if (strap != 0) { if (strap == CARD_TYPE_USB_UART) - strcpy(handle->card_info->fw_name, - USBUART9098_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUART9098_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - USBUSB9098_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUSB9098_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); } - strcpy(handle->card_info->fw_name_wlan, - USB9098_WLAN_V1_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + USB9098_WLAN_V1_FW_NAME, FW_NAMW_MAX_LEN); break; } } @@ -2141,26 +2156,30 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) case USB9097_B1: if (strap != 0) { if (strap == CARD_TYPE_USB_UART) - strcpy(handle->card_info->fw_name, - USBUART9097_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUART9097_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - USBUSB9097_COMBO_V1_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUSB9097_COMBO_V1_FW_NAME, + FW_NAMW_MAX_LEN); } - strcpy(handle->card_info->fw_name_wlan, - USB9097_WLAN_V1_FW_NAME); + strncpy(handle->card_info->fw_name_wlan, + USB9097_WLAN_V1_FW_NAME, FW_NAMW_MAX_LEN); break; } } #endif -#ifdef USBNW62X - if (IS_USBNW62X(handle->card_type)) { +#ifdef USBIW62X + if (IS_USBIW62X(handle->card_type)) { + if (boot_mode == 0x03) + PRINTM(MMSG, "wlan: USB-IW62X in secure-boot mode\n"); if (strap == CARD_TYPE_USB_UART) - strcpy(handle->card_info->fw_name, - USBUARTNW62X_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUARTIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); else - strcpy(handle->card_info->fw_name, - USBUSBNW62X_COMBO_FW_NAME); + strncpy(handle->card_info->fw_name, + USBUSBIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); } #endif diff --git a/mxm_wifiex/wlan_src/mlinux/moal_usb.h b/mxm_wifiex/wlan_src/mlinux/moal_usb.h index 5e10133..7a03364 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_usb.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_usb.h @@ -89,14 +89,14 @@ Change Log: #define USB9097_PID_2 0x2061 #endif /* USB9097 */ -#ifdef USBNW62X +#ifdef USBIW62X /** USB VID 1 */ -#define USBNW62X_VID_1 0x0471 +#define USBIW62X_VID_1 0x0471 /** USB PID 1 */ -#define USBNW62X_PID_1 0x020E +#define USBIW62X_PID_1 0x020E /** USB PID 2 */ -#define USBNW62X_PID_2 0x020F -#endif /* USBNW62X */ +#define USBIW62X_PID_2 0x020F +#endif /* USBIW62X */ /** Boot state: FW download */ #define USB_FW_DNLD 1 @@ -110,7 +110,7 @@ Change Log: #define MVUSB_RX_DATA_URB 6 #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USB8801) || defined(USBNW62X) + defined(USB8978) || defined(USB8801) || defined(USBIW62X) /* Transmit buffer size for chip revision check */ #define CHIP_REV_TX_BUF_SIZE 16 /* Receive buffer size for chip revision check */ @@ -120,6 +120,7 @@ Change Log: #define EXTEND_HDR (0xAB950000) #define EXTEND_V1 (0x00000001) #define EXTEND_V2 (0x00000002) +#define EXTEND_V3 (0x00000003) #ifdef USB8801 #define USB8801_DEFAULT_WLAN_FW_NAME "nxp/usb8801_uapsta.bin" #endif /* USB8801 */ @@ -171,12 +172,12 @@ Change Log: #define USBUSB9097_COMBO_V1_FW_NAME "nxp/usbusbiw620_combo_v1.bin" #endif /* USB9097 */ -#ifdef USBNW62X -#define USBNW62X_DEFAULT_COMBO_FW_NAME "nxp/usbusbnw62x_combo.bin" -#define USBUARTNW62X_COMBO_FW_NAME "nxp/usbuartnw62x_combo.bin" -#define USBUSBNW62X_COMBO_FW_NAME "nxp/usbusbnw62x_combo.bin" -#define USBNW62X_DEFAULT_WLAN_FW_NAME "nxp/usbnw62x_wlan.bin" -#endif /* USBNW62X */ +#ifdef USBIW62X +#define USBIW62X_DEFAULT_COMBO_FW_NAME "nxp/usbusbiw62x_combo.bin" +#define USBUARTIW62X_COMBO_FW_NAME "nxp/usbuartiw62x_combo.bin" +#define USBUSBIW62X_COMBO_FW_NAME "nxp/usbusbiw62x_combo.bin" +#define USBIW62X_DEFAULT_WLAN_FW_NAME "nxp/usbiw62x_wlan.bin" +#endif /* USBIW62X */ /** urb context */ typedef struct _urb_context { diff --git a/mxm_wifiex/wlan_src/mlinux/moal_wext.c b/mxm_wifiex/wlan_src/mlinux/moal_wext.c index aefca6e..f37f485 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_wext.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_wext.c @@ -417,7 +417,7 @@ static int woal_get_name(struct net_device *dev, struct iw_request_info *info, { char *cwrq = wrqu->name; ENTER(); - strcpy(cwrq, "IEEE 802.11-DS"); + strncpy(cwrq, "IEEE 802.11-DS", IFNAMSIZ); LEAVE(); return 0; } @@ -608,19 +608,24 @@ static int woal_get_wap(struct net_device *dev, struct iw_request_info *info, memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + ret = -EFAULT; + goto done; + } if (bss_info.media_connected == MTRUE) moal_memcpy_ext(priv->phandle, awrq->sa_data, &bss_info.bssid, #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0) - MLAN_MAC_ADDR_LENGTH, sizeof(awrq->sa_data_min)); + MLAN_MAC_ADDR_LENGTH, + sizeof(awrq->sa_data_min)); #else MLAN_MAC_ADDR_LENGTH, sizeof(awrq->sa_data)); #endif else memset(awrq->sa_data, 0, MLAN_MAC_ADDR_LENGTH); awrq->sa_family = ARPHRD_ETHER; - +done: LEAVE(); return ret; } @@ -808,6 +813,7 @@ static int woal_set_txpow(struct net_device *dev, struct iw_request_info *info, mlan_power_cfg_t power_cfg; ENTER(); + memset(&power_cfg, 0, sizeof(mlan_power_cfg_t)); if (vwrq_->disabled) { woal_set_radio(priv, 0); goto done; @@ -855,7 +861,11 @@ static int woal_get_txpow(struct net_device *dev, struct iw_request_info *info, memset(&power_cfg, 0, sizeof(mlan_power_cfg_t)); memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + ret = -EFAULT; + goto done; + } if (MLAN_STATUS_SUCCESS != woal_set_get_tx_power(priv, MLAN_ACT_GET, &power_cfg)) { @@ -1268,6 +1278,8 @@ static int woal_set_rate(struct net_device *dev, struct iw_request_info *info, ENTER(); + memset(&rate_cfg, 0, sizeof(mlan_rate_cfg_t)); + if (vwrq->value == -1) { rate_cfg.is_rate_auto = 1; } else { @@ -1976,6 +1988,7 @@ static int woal_get_range(struct net_device *dev, struct iw_request_info *info, mlan_chan_list *pchan_list = NULL; mlan_bss_info bss_info; gfp_t flag; + int ret = 0; ENTER(); @@ -2105,7 +2118,11 @@ static int woal_get_range(struct net_device *dev, struct iw_request_info *info, memset(&bss_info, 0, sizeof(bss_info)); - woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); + if (MLAN_STATUS_SUCCESS != + woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) { + ret = -EFAULT; + goto done; + } range->txpower[0] = bss_info.min_power_level; range->txpower[1] = bss_info.max_power_level; @@ -2116,8 +2133,9 @@ static int woal_get_range(struct net_device *dev, struct iw_request_info *info, range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | IW_ENC_CAPA_CIPHER_CCMP | IW_ENC_CAPA_CIPHER_TKIP; #endif +done: LEAVE(); - return 0; + return ret; } #ifdef MEF_CFG_RX_FILTER @@ -2220,7 +2238,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else { ret = -EFAULT; goto done; @@ -2238,11 +2256,12 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "%s rssi %d\n", bss_info.ssid.ssid, - signal.bcn_rssi_avg) + + len = snprintf(buf, MAX_BUF_LEN, "%s rssi %d\n", + bss_info.ssid.ssid, + signal.bcn_rssi_avg) + 1; } else { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } } else if (strncmp(buf, "LINKSPEED", strlen("LINKSPEED")) == 0) { if (MLAN_STATUS_SUCCESS != @@ -2251,14 +2270,15 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, goto done; } PRINTM(MIOCTL, "tx rate=%d\n", (int)rate.rate); - len = sprintf(buf, "LinkSpeed %d\n", - (int)(rate.rate * 500000 / 1000000)) + + len = snprintf(buf, MAX_BUF_LEN, "LinkSpeed %d\n", + (int)(rate.rate * 500000 / 1000000)) + 1; } else if (strncmp(buf, "MACADDR", strlen("MACADDR")) == 0) { - len = sprintf(buf, "Macaddr = %02X:%02X:%02X:%02X:%02X:%02X\n", - priv->current_addr[0], priv->current_addr[1], - priv->current_addr[2], priv->current_addr[3], - priv->current_addr[4], priv->current_addr[5]) + + len = snprintf(buf, MAX_BUF_LEN, + "Macaddr = %02X:%02X:%02X:%02X:%02X:%02X\n", + priv->current_addr[0], priv->current_addr[1], + priv->current_addr[2], priv->current_addr[3], + priv->current_addr[4], priv->current_addr[5]) + 1; } else if (strncmp(buf, "GETPOWER", strlen("GETPOWER")) == 0) { if (MLAN_STATUS_SUCCESS != @@ -2266,7 +2286,9 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "powermode = %d\n", power_mode) + 1; + len = snprintf(buf, MAX_BUF_LEN, "powermode = %d\n", + power_mode) + + 1; } else if (strncmp(buf, "SCAN-ACTIVE", strlen("SCAN-ACTIVE")) == 0) { if (MLAN_STATUS_SUCCESS != woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE)) { @@ -2275,7 +2297,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, } priv->scan_type = MLAN_SCAN_TYPE_ACTIVE; PRINTM(MIOCTL, "Set Active Scan\n"); - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SCAN-PASSIVE", strlen("SCAN-PASSIVE")) == 0) { if (MLAN_STATUS_SUCCESS != woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE)) { @@ -2284,7 +2306,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, } priv->scan_type = MLAN_SCAN_TYPE_PASSIVE; PRINTM(MIOCTL, "Set Passive Scan\n"); - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "POWERMODE", strlen("POWERMODE")) == 0) { if (dwrq->length > strlen("POWERMODE") + 1) { pdata = buf + strlen("POWERMODE") + 1; @@ -2295,7 +2317,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, goto done; } } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else { ret = -EFAULT; goto done; @@ -2315,7 +2337,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (memcmp(buf, WEXT_CSCAN_HEADER, strlen(WEXT_CSCAN_HEADER)) == 0) { PRINTM(MIOCTL, "Set Combo Scan\n"); @@ -2324,38 +2346,38 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "GETBAND", strlen("GETBAND")) == 0) { if (MLAN_STATUS_SUCCESS != woal_get_band(priv, &band)) { ret = -EFAULT; goto done; } - len = sprintf(buf, "Band %d\n", band) + 1; + len = snprintf(buf, MAX_BUF_LEN, "Band %d\n", band) + 1; } else if (strncmp(buf, "SETBAND", strlen("SETBAND")) == 0) { pband = buf + strlen("SETBAND") + 1; if (MLAN_STATUS_SUCCESS != woal_set_band(priv, pband)) { ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "START", strlen("START")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "STOP", strlen("STOP")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "SETSUSPENDOPT", strlen("SETSUSPENDOPT")) == 0) { /* it will be done by GUI */ - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BTCOEXMODE", strlen("BTCOEXMODE")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BTCOEXSCAN-START", strlen("BTCOEXSCAN-START")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BTCOEXSCAN-STOP", strlen("BTCOEXSCAN-STOP")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BGSCAN-START", strlen("BGSCAN-START")) == 0) { - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BGSCAN-CONFIG", strlen("BGSCAN-CONFIG")) == 0) { if (MLAN_STATUS_SUCCESS != @@ -2365,7 +2387,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, } priv->bg_scan_start = MTRUE; priv->bg_scan_reported = MFALSE; - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BGSCAN-STOP", strlen("BGSCAN-STOP")) == 0) { if (priv->bg_scan_start && !priv->scan_cfg.rssi_threshold) { if (MLAN_STATUS_SUCCESS != @@ -2376,7 +2398,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, priv->bg_scan_start = MFALSE; priv->bg_scan_reported = MFALSE; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "RXFILTER-START", strlen("RXFILTER-START")) == 0) { #ifdef MEF_CFG_RX_FILTER @@ -2384,7 +2406,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, if (ret) goto done; #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "RXFILTER-STOP", strlen("RXFILTER-STOP")) == 0) { #ifdef MEF_CFG_RX_FILTER @@ -2392,7 +2414,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, if (ret) goto done; #endif - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "RXFILTER-ADD", strlen("RXFILTER-ADD")) == 0) { if (dwrq->length > strlen("RXFILTER-ADD") + 1) { pdata = buf + strlen("RXFILTER-ADD") + 1; @@ -2401,7 +2423,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else { ret = -EFAULT; goto done; @@ -2415,7 +2437,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else { ret = -EFAULT; goto done; @@ -2428,7 +2450,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else { ret = -EFAULT; goto done; @@ -2441,7 +2463,7 @@ static int woal_set_priv(struct net_device *dev, struct iw_request_info *info, ret = -EFAULT; goto done; } - len = sprintf(buf, "OK\n") + 1; + len = snprintf(buf, MAX_BUF_LEN, "OK\n") + 1; } else { ret = -EFAULT; goto done; @@ -2497,7 +2519,9 @@ static mlan_status woal_wext_request_scan(moal_private *priv, t_u8 wait_option, MLAN_MAX_SSID_LENGTH); scan_req->ssid_list[0].max_len = 0; } - woal_get_scan_config(priv, &scan_cfg); + if (MLAN_STATUS_SUCCESS != woal_get_scan_config(priv, &scan_cfg)) { + PRINTM(MERROR, "Unable to get scan configuration\n"); + } if (scan_cfg.scan_chan_gap) scan_req->scan_chan_gap = scan_cfg.scan_chan_gap; else @@ -2625,7 +2649,8 @@ static int woal_owe_specific_scan(moal_private *priv, scan_req->keep_previous_scan = MTRUE; moal_memcpy_ext(priv->phandle, scan_req->ssid_list[0].ssid, ssid_bssid->trans_ssid.ssid, - ssid_bssid->trans_ssid.ssid_len, + MIN(ssid_bssid->trans_ssid.ssid_len, + MLAN_MAX_SSID_LENGTH), sizeof(scan_req->ssid_list[0].ssid)); scan_req->ssid_list[0].max_len = 0; scan_req->chan_list[0].chan_number = ssid_bssid->channel; @@ -2790,8 +2815,12 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info, mode = woal_get_mode(priv, MOAL_IOCTL_WAIT); if (mode == IW_MODE_ADHOC) /* disconnect before try to associate */ - woal_disconnect(priv, MOAL_IOCTL_WAIT, NULL, - DEF_DEAUTH_REASON_CODE); + if (MLAN_STATUS_SUCCESS != + woal_disconnect(priv, MOAL_IOCTL_WAIT, NULL, + DEF_DEAUTH_REASON_CODE)) { + PRINTM(MERROR, + "Disconnect before association failed\n"); + } if (mode != IW_MODE_ADHOC) { if (MLAN_STATUS_SUCCESS != @@ -3158,8 +3187,8 @@ static int woal_get_scan(struct net_device *dev, struct iw_request_info *info, /* Beacon Interval */ memset(&iwe, 0, sizeof(iwe)); ptr = buf; - ptr += sprintf(ptr, "Beacon interval=%d", - scan_table[i].beacon_period); + ptr += snprintf(ptr, MAX_BUF_LEN, "Beacon interval=%d", + scan_table[i].beacon_period); iwe.u.data.length = strlen(buf); iwe.cmd = IWEVCUSTOM; @@ -3234,12 +3263,12 @@ static int woal_get_scan(struct net_device *dev, struct iw_request_info *info, memset(&iwe, 0, sizeof(iwe)); memset(buf, 0, buf_size); ptr = buf; - ptr += sprintf(ptr, "band="); + ptr += snprintf(ptr, MAX_BUF_LEN, "band="); memset(&iwe, 0, sizeof(iwe)); if (scan_table[i].bss_band == BAND_A) - sprintf(ptr, "a"); + snprintf(ptr, MAX_BUF_LEN, "a"); else - sprintf(ptr, "bg"); + snprintf(ptr, MAX_BUF_LEN, "bg"); iwe.u.data.length = strlen(buf); PRINTM(MINFO, "iwe.u.data.length %d\n", iwe.u.data.length); PRINTM(MINFO, "BUF: %s\n", buf);