This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

WL1837MOD: Can power save be configured differently using wlconf

Part Number: WL1837MOD
Other Parts Discussed in Thread: WL1837

Some modes in our application are "bursty" in nature. Meaning we send small amounts of data (5Kb) followed by a quiet period (20ms). The receiving device is graphing this information as it is received. But in this particular mode it seems the power save behavior of the wi-fi module kicks in periodically and the receiving device gets the data in larger blocks (the update of the graph jumps instead of smoothly scrolling the data). We've used Wireshark to confirm the timestamps of the data on receiving device point to the sending device (this is an AP connection with just the two devices, sender and receiver, on the network). In this case the sender is our device with:

Processor: i.MX 7 Dual

Kernel: 5.4.3

wlcore: PHY firmware version: Rev 8.2.0.0.246

wlcore: firmware booted (Rev 8.9.0.0.90)

And the receiving device is an iPhone 11 running iOS 16.4. 

Enabling kernel logging for the wlcore and use dmesg while the graph update is stuttering, we see the log being flooded with messages like below. If the graph is updating smoothly without stuttering, we don’t see these messages.

[Tue May 9 07:35:32 2023] wlcore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:32 20231 wicore: link ps prev 0x0 cur Oxc changed 0xc
[Tue May 9 07:35:32 20231 wicore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:32 20231 wicore: link ps prev 0x0 cur Oxc changed 0xc
[Tue May 9 07:35:32 2023] wicore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:32 2023] wicore: link ps prev 0x0 cur Oxc changed Oxc
[Tue May 9 07:35:33 20231 wicore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:33 2023] wicore: link ps prev 0x0 cur Oxc changed Oxc
[Tue May 9 07:35:33 2023] wicore: link ps prev Oxc cur 0x0 changed Oxc
[Tue May 9 07:35:33 20231 wIcore: link ps prev 0x0 cur Oxc changed 0xc
[Tue May 9 07:35:33 20231 wIcore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:33 20231 wIcore: link ps prev 0x0 cur Oxc changed 0xc
[Tue May 9 07:35:33 20231 wicore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:33 20231 wIcore: link ps prev 0x0 cur Oxc changed 0xc
[Tue May 9 07:35:33 20231 wicore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:33 20231 wicore: link ps prev 0x0 cur Oxc changed 0xc
[Tue May 9 07:35:33 20231 wIcore: link ps prev Oxc cur 0x0 changed 0xc
[Tue May 9 07:35:33 20231 wicore: link ps prev 0x0 cur Oxc changed 0xc
[Tue May 9 07:35:33 20231 wicore: link ps prev Oxc cur 0x0 changed 0xc

My question is whether there are parameters in the conf file we can tweak to affect the power save behavior (e.g. . Attached is the output of wlconf --get for how our product is configured).

melody_wl18xx-conf.txt
header.magic = 0x10e100ca
header.version = 0x00070007
header.checksum = 0x00000000
core.sg.params = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000f, 0x0000001b, 0x00000011, 0x000000aa, 0x00000032, 0x00000064, 0x00000320, 0x000000c8, 0x000000c8, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0000003c, 0x00001388, 0x000004b0, 0x000003e8, 0x00000001, 0x00000003, 0x00000006, 0x0000000a, 0x0000000a, 0x00000002, 0x00000005, 0x0000001e, 0x00000003, 0x0000000a, 0x00000002, 0x00000000, 0x00000019, 0x00000019, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000
core.sg.state = 0x01
core.rx.rx_msdu_life_time = 0x0007d000
core.rx.packet_detection_threshold = 0x00000000
core.rx.ps_poll_timeout = 0x000f
core.rx.upsd_timeout = 0x000f
core.rx.rts_threshold = 0x0931
core.rx.rx_cca_threshold = 0x0000
core.rx.irq_blk_threshold = 0xffff
core.rx.irq_pkt_threshold = 0x0000
core.rx.irq_timeout = 0x0258
core.rx.queue_type = 0x00
core.tx.tx_energy_detection = 0x00
core.tx.sta_rc_conf.enabled_rates = 0x00000000
core.tx.sta_rc_conf.short_retry_limit = 0x0a
core.tx.sta_rc_conf.long_retry_limit = 0x0a
core.tx.sta_rc_conf.aflags = 0x00
core.tx.ac_conf_count = 0x04
core.tx.ac_conf0.ac = 0x00
core.tx.ac_conf0.cw_min = 0x0f
core.tx.ac_conf0.cw_max = 0x003f
core.tx.ac_conf0.aifsn = 0x03
core.tx.ac_conf0.tx_op_limit = 0x0000
core.tx.ac_conf1.ac = 0x01
core.tx.ac_conf1.cw_min = 0x0f
core.tx.ac_conf1.cw_max = 0x003f
core.tx.ac_conf1.aifsn = 0x07
core.tx.ac_conf1.tx_op_limit = 0x0000
core.tx.ac_conf2.ac = 0x02
core.tx.ac_conf2.cw_min = 0x0f
core.tx.ac_conf2.cw_max = 0x003f
core.tx.ac_conf2.aifsn = 0x01
core.tx.ac_conf2.tx_op_limit = 0x0bc0
core.tx.ac_conf3.ac = 0x03
core.tx.ac_conf3.cw_min = 0x0f
core.tx.ac_conf3.cw_max = 0x003f
core.tx.ac_conf3.aifsn = 0x01
core.tx.ac_conf3.tx_op_limit = 0x05e0
core.tx.max_tx_retries = 0x64
core.tx.ap_aging_period = 0x012c
core.tx.tid_conf_count = 0x04
core.tx.tid_conf0.queue_id = 0x00
core.tx.tid_conf0.channel_type = 0x01
core.tx.tid_conf0.tsid = 0x00
core.tx.tid_conf0.ps_scheme = 0x00
core.tx.tid_conf0.ack_policy = 0x00
core.tx.tid_conf0.apsd_conf = 0x00000000, 0x00000000
core.tx.tid_conf1.queue_id = 0x01
core.tx.tid_conf1.channel_type = 0x01
core.tx.tid_conf1.tsid = 0x01
core.tx.tid_conf1.ps_scheme = 0x00
core.tx.tid_conf1.ack_policy = 0x00
core.tx.tid_conf1.apsd_conf = 0x00000000, 0x00000000
core.tx.tid_conf2.queue_id = 0x02
core.tx.tid_conf2.channel_type = 0x01
core.tx.tid_conf2.tsid = 0x02
core.tx.tid_conf2.ps_scheme = 0x00
core.tx.tid_conf2.ack_policy = 0x00
core.tx.tid_conf2.apsd_conf = 0x00000000, 0x00000000
core.tx.tid_conf3.queue_id = 0x03
core.tx.tid_conf3.channel_type = 0x01
core.tx.tid_conf3.tsid = 0x03
core.tx.tid_conf3.ps_scheme = 0x00
core.tx.tid_conf3.ack_policy = 0x00
core.tx.tid_conf3.apsd_conf = 0x00000000, 0x00000000
core.tx.tid_conf4.queue_id = 0x00
core.tx.tid_conf4.channel_type = 0x00
core.tx.tid_conf4.tsid = 0x00
core.tx.tid_conf4.ps_scheme = 0x00
core.tx.tid_conf4.ack_policy = 0x00
core.tx.tid_conf4.apsd_conf = 0x00000000, 0x00000000
core.tx.tid_conf5.queue_id = 0x00
core.tx.tid_conf5.channel_type = 0x00
core.tx.tid_conf5.tsid = 0x00
core.tx.tid_conf5.ps_scheme = 0x00
core.tx.tid_conf5.ack_policy = 0x00
core.tx.tid_conf5.apsd_conf = 0x00000000, 0x00000000
core.tx.tid_conf6.queue_id = 0x00
core.tx.tid_conf6.channel_type = 0x00
core.tx.tid_conf6.tsid = 0x00
core.tx.tid_conf6.ps_scheme = 0x00
core.tx.tid_conf6.ack_policy = 0x00
core.tx.tid_conf6.apsd_conf = 0x00000000, 0x00000000
core.tx.tid_conf7.queue_id = 0x00
core.tx.tid_conf7.channel_type = 0x00
core.tx.tid_conf7.tsid = 0x00
core.tx.tid_conf7.ps_scheme = 0x00
core.tx.tid_conf7.ack_policy = 0x00
core.tx.tid_conf7.apsd_conf = 0x00000000, 0x00000000
core.tx.frag_threshold = 0x0930
core.tx.tx_compl_timeout = 0x015e
core.tx.tx_compl_threshold = 0x000a
core.tx.basic_rate = 0x00000001
core.tx.basic_rate_5 = 0x00000008
core.tx.tmpl_short_retry_limit = 0x0a
core.tx.tmpl_long_retry_limit = 0x0a
core.tx.tx_watchdog_timeout = 0x00001388
core.tx.slow_link_thold = 0x03
core.tx.fast_link_thold = 0x1e
core.conn.wake_up_event = 0x02
core.conn.listen_interval = 0x01
core.conn.suspend_wake_up_event = 0x04
core.conn.suspend_listen_interval = 0x03
core.conn.bcn_filt_mode = 0x01
core.conn.bcn_filt_ie_count = 0x03
core.conn.bcn_filt_ie0.ie = 0x25
core.conn.bcn_filt_ie0.rule = 0x02
core.conn.bcn_filt_ie0.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie0.type = 0x00
core.conn.bcn_filt_ie0.version = 0x00, 0x00
core.conn.bcn_filt_ie1.ie = 0x3d
core.conn.bcn_filt_ie1.rule = 0x01
core.conn.bcn_filt_ie1.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie1.type = 0x00
core.conn.bcn_filt_ie1.version = 0x00, 0x00
core.conn.bcn_filt_ie2.ie = 0x2a
core.conn.bcn_filt_ie2.rule = 0x01
core.conn.bcn_filt_ie2.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie2.type = 0x00
core.conn.bcn_filt_ie2.version = 0x00, 0x00
core.conn.bcn_filt_ie3.ie = 0x00
core.conn.bcn_filt_ie3.rule = 0x00
core.conn.bcn_filt_ie3.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie3.type = 0x00
core.conn.bcn_filt_ie3.version = 0x00, 0x00
core.conn.bcn_filt_ie4.ie = 0x00
core.conn.bcn_filt_ie4.rule = 0x00
core.conn.bcn_filt_ie4.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie4.type = 0x00
core.conn.bcn_filt_ie4.version = 0x00, 0x00
core.conn.bcn_filt_ie5.ie = 0x00
core.conn.bcn_filt_ie5.rule = 0x00
core.conn.bcn_filt_ie5.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie5.type = 0x00
core.conn.bcn_filt_ie5.version = 0x00, 0x00
core.conn.bcn_filt_ie6.ie = 0x00
core.conn.bcn_filt_ie6.rule = 0x00
core.conn.bcn_filt_ie6.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie6.type = 0x00
core.conn.bcn_filt_ie6.version = 0x00, 0x00
core.conn.bcn_filt_ie7.ie = 0x00
core.conn.bcn_filt_ie7.rule = 0x00
core.conn.bcn_filt_ie7.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie7.type = 0x00
core.conn.bcn_filt_ie7.version = 0x00, 0x00
core.conn.bcn_filt_ie8.ie = 0x00
core.conn.bcn_filt_ie8.rule = 0x00
core.conn.bcn_filt_ie8.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie8.type = 0x00
core.conn.bcn_filt_ie8.version = 0x00, 0x00
core.conn.bcn_filt_ie9.ie = 0x00
core.conn.bcn_filt_ie9.rule = 0x00
core.conn.bcn_filt_ie9.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie9.type = 0x00
core.conn.bcn_filt_ie9.version = 0x00, 0x00
core.conn.bcn_filt_ie10.ie = 0x00
core.conn.bcn_filt_ie10.rule = 0x00
core.conn.bcn_filt_ie10.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie10.type = 0x00
core.conn.bcn_filt_ie10.version = 0x00, 0x00
core.conn.bcn_filt_ie11.ie = 0x00
core.conn.bcn_filt_ie11.rule = 0x00
core.conn.bcn_filt_ie11.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie11.type = 0x00
core.conn.bcn_filt_ie11.version = 0x00, 0x00
core.conn.bcn_filt_ie12.ie = 0x00
core.conn.bcn_filt_ie12.rule = 0x00
core.conn.bcn_filt_ie12.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie12.type = 0x00
core.conn.bcn_filt_ie12.version = 0x00, 0x00
core.conn.bcn_filt_ie13.ie = 0x00
core.conn.bcn_filt_ie13.rule = 0x00
core.conn.bcn_filt_ie13.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie13.type = 0x00
core.conn.bcn_filt_ie13.version = 0x00, 0x00
core.conn.bcn_filt_ie14.ie = 0x00
core.conn.bcn_filt_ie14.rule = 0x00
core.conn.bcn_filt_ie14.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie14.type = 0x00
core.conn.bcn_filt_ie14.version = 0x00, 0x00
core.conn.bcn_filt_ie15.ie = 0x00
core.conn.bcn_filt_ie15.rule = 0x00
core.conn.bcn_filt_ie15.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie15.type = 0x00
core.conn.bcn_filt_ie15.version = 0x00, 0x00
core.conn.bcn_filt_ie16.ie = 0x00
core.conn.bcn_filt_ie16.rule = 0x00
core.conn.bcn_filt_ie16.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie16.type = 0x00
core.conn.bcn_filt_ie16.version = 0x00, 0x00
core.conn.bcn_filt_ie17.ie = 0x00
core.conn.bcn_filt_ie17.rule = 0x00
core.conn.bcn_filt_ie17.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie17.type = 0x00
core.conn.bcn_filt_ie17.version = 0x00, 0x00
core.conn.bcn_filt_ie18.ie = 0x00
core.conn.bcn_filt_ie18.rule = 0x00
core.conn.bcn_filt_ie18.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie18.type = 0x00
core.conn.bcn_filt_ie18.version = 0x00, 0x00
core.conn.bcn_filt_ie19.ie = 0x00
core.conn.bcn_filt_ie19.rule = 0x00
core.conn.bcn_filt_ie19.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie19.type = 0x00
core.conn.bcn_filt_ie19.version = 0x00, 0x00
core.conn.bcn_filt_ie20.ie = 0x00
core.conn.bcn_filt_ie20.rule = 0x00
core.conn.bcn_filt_ie20.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie20.type = 0x00
core.conn.bcn_filt_ie20.version = 0x00, 0x00
core.conn.bcn_filt_ie21.ie = 0x00
core.conn.bcn_filt_ie21.rule = 0x00
core.conn.bcn_filt_ie21.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie21.type = 0x00
core.conn.bcn_filt_ie21.version = 0x00, 0x00
core.conn.bcn_filt_ie22.ie = 0x00
core.conn.bcn_filt_ie22.rule = 0x00
core.conn.bcn_filt_ie22.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie22.type = 0x00
core.conn.bcn_filt_ie22.version = 0x00, 0x00
core.conn.bcn_filt_ie23.ie = 0x00
core.conn.bcn_filt_ie23.rule = 0x00
core.conn.bcn_filt_ie23.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie23.type = 0x00
core.conn.bcn_filt_ie23.version = 0x00, 0x00
core.conn.bcn_filt_ie24.ie = 0x00
core.conn.bcn_filt_ie24.rule = 0x00
core.conn.bcn_filt_ie24.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie24.type = 0x00
core.conn.bcn_filt_ie24.version = 0x00, 0x00
core.conn.bcn_filt_ie25.ie = 0x00
core.conn.bcn_filt_ie25.rule = 0x00
core.conn.bcn_filt_ie25.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie25.type = 0x00
core.conn.bcn_filt_ie25.version = 0x00, 0x00
core.conn.bcn_filt_ie26.ie = 0x00
core.conn.bcn_filt_ie26.rule = 0x00
core.conn.bcn_filt_ie26.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie26.type = 0x00
core.conn.bcn_filt_ie26.version = 0x00, 0x00
core.conn.bcn_filt_ie27.ie = 0x00
core.conn.bcn_filt_ie27.rule = 0x00
core.conn.bcn_filt_ie27.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie27.type = 0x00
core.conn.bcn_filt_ie27.version = 0x00, 0x00
core.conn.bcn_filt_ie28.ie = 0x00
core.conn.bcn_filt_ie28.rule = 0x00
core.conn.bcn_filt_ie28.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie28.type = 0x00
core.conn.bcn_filt_ie28.version = 0x00, 0x00
core.conn.bcn_filt_ie29.ie = 0x00
core.conn.bcn_filt_ie29.rule = 0x00
core.conn.bcn_filt_ie29.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie29.type = 0x00
core.conn.bcn_filt_ie29.version = 0x00, 0x00
core.conn.bcn_filt_ie30.ie = 0x00
core.conn.bcn_filt_ie30.rule = 0x00
core.conn.bcn_filt_ie30.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie30.type = 0x00
core.conn.bcn_filt_ie30.version = 0x00, 0x00
core.conn.bcn_filt_ie31.ie = 0x00
core.conn.bcn_filt_ie31.rule = 0x00
core.conn.bcn_filt_ie31.oui = 0x00, 0x00, 0x00
core.conn.bcn_filt_ie31.type = 0x00
core.conn.bcn_filt_ie31.version = 0x00, 0x00
core.conn.synch_fail_thold = 0x0000000c
core.conn.bss_lose_timeout = 0x00000190
core.conn.beacon_rx_timeout = 0x00002710
core.conn.broadcast_timeout = 0x00004e20
core.conn.rx_broadcast_in_ps = 0x01
core.conn.ps_poll_threshold = 0x0a
core.conn.sig_weights.rssi_bcn_avg_weight = 0x00
core.conn.sig_weights.rssi_pkt_avg_weight = 0x00
core.conn.sig_weights.snr_bcn_avg_weight = 0x00
core.conn.sig_weights.snr_pkt_avg_weight = 0x00
core.conn.bet_enable = 0x01
core.conn.bet_max_consecutive = 0x32
core.conn.psm_entry_retries = 0x08
core.conn.psm_exit_retries = 0x10
core.conn.psm_entry_nullfunc_retries = 0x03
core.conn.dynamic_ps_timeout = 0x0096
core.conn.forced_ps = 0x00
core.conn.keep_alive_interval = 0x0000d6d8
core.conn.max_listen_interval = 0x14
core.conn.sta_sleep_auth = 0xff
core.conn.suspend_rx_ba_activity = 0x01
core.itrim.enable = 0x00
core.itrim.timeout = 0x0000c350
core.pm_config.host_clk_settling_time = 0x00001388
core.pm_config.host_fast_wakeup_support = 0x01
core.roam_trigger.trigger_pacing = 0x0001
core.roam_trigger.avg_weight_rssi_beacon = 0x14
core.roam_trigger.avg_weight_rssi_data = 0x0a
core.roam_trigger.avg_weight_snr_beacon = 0x14
core.roam_trigger.avg_weight_snr_data = 0x0a
core.scan.min_dwell_time_active = 0x00001d4c
core.scan.max_dwell_time_active = 0x00007530
core.scan.min_dwell_time_active_long = 0x000061a8
core.scan.max_dwell_time_active_long = 0x0000c350
core.scan.dwell_time_passive = 0x000186a0
core.scan.dwell_time_dfs = 0x000249f0
core.scan.num_probe_reqs = 0x0002
core.scan.split_scan_timeout = 0x0000c350
core.sched_scan.base_dwell_time = 0x00001d4c
core.sched_scan.max_dwell_time_delta = 0x000057e4
core.sched_scan.dwell_time_delta_per_probe = 0x000007d0
core.sched_scan.dwell_time_delta_per_probe_5 = 0x0000015e
core.sched_scan.dwell_time_passive = 0x000186a0
core.sched_scan.dwell_time_dfs = 0x000249f0
core.sched_scan.num_probe_reqs = 0x02
core.sched_scan.rssi_threshold = 0xa6
core.sched_scan.snr_threshold = 0x00
core.sched_scan.num_short_intervals = 0x0d
core.sched_scan.long_interval = 0x7530
core.ht.rx_ba_win_size = 0x20
core.ht.tx_ba_win_size = 0x40
core.ht.inactivity_timeout = 0x2710
core.ht.tx_ba_tid_bitmap = 0x3f
core.mem.num_stations = 0x01
core.mem.ssid_profiles = 0x01
core.mem.rx_block_num = 0x28
core.mem.tx_min_block_num = 0x28
core.mem.dynamic_memory = 0x01
core.mem.min_req_tx_blocks = 0x2d
core.mem.min_req_rx_blocks = 0x16
core.mem.tx_min = 0x1b
core.fm_coex.enable = 0x01
core.fm_coex.swallow_period = 0x05
core.fm_coex.n_divider_fref_set_1 = 0xff
core.fm_coex.n_divider_fref_set_2 = 0x0c
core.fm_coex.m_divider_fref_set_1 = 0xffff
core.fm_coex.m_divider_fref_set_2 = 0x0094
core.fm_coex.coex_pll_stabilization_time = 0xffffffff
core.fm_coex.ldo_stabilization_time = 0xffff
core.fm_coex.fm_disturbed_band_margin = 0xff
core.fm_coex.swallow_clk_diff = 0xff
core.rx_streaming.duration = 0x00000096
core.rx_streaming.queues = 0x01
core.rx_streaming.interval = 0x14
core.rx_streaming.always = 0x00
core.fwlog.mode = 0x00
core.fwlog.mem_blocks = 0x02
core.fwlog.severity = 0x00
core.fwlog.timestamp = 0x00
core.fwlog.output = 0x01
core.fwlog.threshold = 0x00
core.rate.rate_retry_score = 0x7d00
core.rate.per_add = 0x2000
core.rate.per_th1 = 0x0800
core.rate.per_th2 = 0x1000
core.rate.max_per = 0x1fa4
core.rate.inverse_curiosity_factor = 0x05
core.rate.tx_fail_low_th = 0x04
core.rate.tx_fail_high_th = 0x0a
core.rate.per_alpha_shift = 0x04
core.rate.per_add_shift = 0x0d
core.rate.per_beta1_shift = 0x0a
core.rate.per_beta2_shift = 0x08
core.rate.rate_check_up = 0x02
core.rate.rate_check_down = 0x0c
core.rate.rate_retry_policy = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
core.hangover.recover_time = 0x00000000
core.hangover.hangover_period = 0x14
core.hangover.dynamic_mode = 0x01
core.hangover.early_termination_mode = 0x01
core.hangover.max_period = 0x14
core.hangover.min_period = 0x01
core.hangover.increase_delta = 0x01
core.hangover.decrease_delta = 0x02
core.hangover.quiet_time = 0x04
core.hangover.increase_time = 0x01
core.hangover.window_size = 0x10
core.recovery.bug_on_recovery = 0x00
core.recovery.no_recovery = 0x00
wl18xx.ht.mode = 0x01
wl18xx.phy.phy_standalone = 0x00
wl18xx.phy.spare0 = 0x08
wl18xx.phy.enable_clpc = 0x00
wl18xx.phy.enable_tx_low_pwr_on_siso_rdl = 0x00
wl18xx.phy.auto_detect = 0x00
wl18xx.phy.dedicated_fem = 0x00
wl18xx.phy.low_band_component = 0x02
wl18xx.phy.low_band_component_type = 0x05
wl18xx.phy.high_band_component = 0x01
wl18xx.phy.high_band_component_type = 0x0a
wl18xx.phy.number_of_assembled_ant2_4 = 0x01
wl18xx.phy.number_of_assembled_ant5 = 0x01
wl18xx.phy.pin_muxing_platform_options = 0x00, 0x00
wl18xx.phy.external_pa_dc2dc = 0x00
wl18xx.phy.tcxo_ldo_voltage = 0x00
wl18xx.phy.xtal_itrim_val = 0x04
wl18xx.phy.srf_state = 0x00
wl18xx.phy.srf1 = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
wl18xx.phy.srf2 = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
wl18xx.phy.srf3 = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
wl18xx.phy.io_configuration = 0x01
wl18xx.phy.sdio_configuration = 0x00
wl18xx.phy.settings = 0x00
wl18xx.phy.rx_profile = 0x00
wl18xx.phy.per_chan_pwr_limit_arr_11abg = 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x88, 0x18, 0x78, 0x88, 0x88, 0x78, 0x88, 0x82, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x22, 0x22, 0xff, 0xff, 0xff, 0xf7, 0x22, 0x22, 0xff, 0xff, 0xff, 0xf7, 0x66, 0x66, 0xff, 0xff, 0xff, 0xf7, 0x66, 0x66, 0xf4, 0x44, 0x55, 0xf4, 0x44, 0x55, 0xf4, 0x22, 0x22, 0xf4, 0x22, 0x22, 0xf6, 0x44, 0x44, 0xff, 0x44, 0x44, 0xf7, 0x66, 0x66, 0xf7, 0x66, 0x66, 0xf7, 0x66, 0x66, 0xf7, 0x66, 0x66, 0xf7, 0x66, 0x66, 0xf7, 0x66, 0x66, 0xf7, 0x66, 0x55, 0xf7, 0x44, 0x55, 0xf4, 0xff, 0xff, 0xff, 0x33, 0x22, 0xff, 0x33, 0x22, 0xff, 0x66, 0x66, 0xff, 0x44, 0x66, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff
wl18xx.phy.pwr_limit_reference_11_abg = 0x55
wl18xx.phy.per_chan_pwr_limit_arr_11p = 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
wl18xx.phy.pwr_limit_reference_11p = 0x64
wl18xx.phy.spare1 = 0x00
wl18xx.phy.per_chan_bo_mode_11_abg = 0x40, 0x00, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x19
wl18xx.phy.per_chan_bo_mode_11_p = 0x00, 0x00, 0x00, 0x01
wl18xx.phy.primary_clock_setting_time = 0x05
wl18xx.phy.clock_valid_on_wake_up = 0x00
wl18xx.phy.secondary_clock_setting_time = 0x05
wl18xx.phy.board_type = 0x02
wl18xx.phy.psat = 0x00
wl18xx.phy.low_power_val = 0xff
wl18xx.phy.med_power_val = 0xff
wl18xx.phy.high_power_val = 0xff
wl18xx.phy.per_sub_band_tx_trace_loss = 0x08, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10
wl18xx.phy.per_sub_band_rx_trace_loss = 0x08, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
wl18xx.phy.tx_rf_margin = 0x01
wl18xx.phy.low_power_val_2nd = 0xff
wl18xx.phy.med_power_val_2nd = 0xff
wl18xx.phy.high_power_val_2nd = 0xff
wl18xx.phy.padding = 0x00
wl18xx.ap_sleep.idle_duty_cycle = 0x00
wl18xx.ap_sleep.connected_duty_cycle = 0x00
wl18xx.ap_sleep.max_stations_thresh = 0x04
wl18xx.ap_sleep.idle_conn_thresh = 0x08

I am speaking about things like core.tx.tid_confX.ps_scheme, core.conn.dynamic_ps_timeout, core.conn.sta_sleep_auth, wl18xx.ap_sleep.connected_duty_cycle and the like.

I have looked through:

SWRA489 WiLink 8 Solutions WiLink8 – wlconf

SWRU422A WL18xx.INI FILE

And there are some details about the various parameter in the header file:

https://git.ti.com/cgit/wilink8-wlan/18xx-ti-utils/tree/wlconf/conf.h?h=master

But there aren’t any details about how they are related that setting A means that B must be set in a particular manner, or whether they're actually used or not. 

Lastly, I've tried turning off power save just to see if this makes this behavior go away using iw wlan0 set power_save off but it doesn't seem to work.

  • Also potentially of interest is the output of tcpdump on our device. The delta between the start of each fragmented packet (offset 0) doesn't vary much from 20ms:

    15:37:53.527731 IP (tos 0x0, ttl 64, id 3382, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.20.1.53027 > 192.168.20.20.49200: UDP, bad length 6180 > 1472
    15:37:53.527820 IP (tos 0x0, ttl 64, id 3382, offset 1480, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.527837 IP (tos 0x0, ttl 64, id 3382, offset 2960, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.527849 IP (tos 0x0, ttl 64, id 3382, offset 4440, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.527856 IP (tos 0x0, ttl 64, id 3382, offset 5920, flags [none], proto UDP (17), length 288)
    192.168.20.1 > 192.168.20.20: ip-proto-17


    15:37:53.547730 IP (tos 0x0, ttl 64, id 3384, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.20.1.53027 > 192.168.20.20.49200: UDP, bad length 6180 > 1472
    15:37:53.547812 IP (tos 0x0, ttl 64, id 3384, offset 1480, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.547830 IP (tos 0x0, ttl 64, id 3384, offset 2960, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.547842 IP (tos 0x0, ttl 64, id 3384, offset 4440, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.547850 IP (tos 0x0, ttl 64, id 3384, offset 5920, flags [none], proto UDP (17), length 288)
    192.168.20.1 > 192.168.20.20: ip-proto-17


    15:37:53.567731 IP (tos 0x0, ttl 64, id 3386, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.20.1.53027 > 192.168.20.20.49200: UDP, bad length 6180 > 1472
    15:37:53.567811 IP (tos 0x0, ttl 64, id 3386, offset 1480, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.567828 IP (tos 0x0, ttl 64, id 3386, offset 2960, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.567839 IP (tos 0x0, ttl 64, id 3386, offset 4440, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.567847 IP (tos 0x0, ttl 64, id 3386, offset 5920, flags [none], proto UDP (17), length 288)
    192.168.20.1 > 192.168.20.20: ip-proto-17


    15:37:53.587736 IP (tos 0x0, ttl 64, id 3388, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.20.1.53027 > 192.168.20.20.49200: UDP, bad length 6180 > 1472
    15:37:53.587822 IP (tos 0x0, ttl 64, id 3388, offset 1480, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.587839 IP (tos 0x0, ttl 64, id 3388, offset 2960, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.587849 IP (tos 0x0, ttl 64, id 3388, offset 4440, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.587857 IP (tos 0x0, ttl 64, id 3388, offset 5920, flags [none], proto UDP (17), length 288)
    192.168.20.1 > 192.168.20.20: ip-proto-17


    15:37:53.607732 IP (tos 0x0, ttl 64, id 3390, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.20.1.53027 > 192.168.20.20.49200: UDP, bad length 6180 > 1472
    15:37:53.607783 IP (tos 0x0, ttl 64, id 3390, offset 1480, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.607812 IP (tos 0x0, ttl 64, id 3390, offset 2960, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.607838 IP (tos 0x0, ttl 64, id 3390, offset 4440, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.607863 IP (tos 0x0, ttl 64, id 3390, offset 5920, flags [none], proto UDP (17), length 288)
    192.168.20.1 > 192.168.20.20: ip-proto-17


    15:37:53.627737 IP (tos 0x0, ttl 64, id 3392, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.20.1.53027 > 192.168.20.20.49200: UDP, bad length 6180 > 1472
    15:37:53.627794 IP (tos 0x0, ttl 64, id 3392, offset 1480, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.627821 IP (tos 0x0, ttl 64, id 3392, offset 2960, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.627847 IP (tos 0x0, ttl 64, id 3392, offset 4440, flags [+], proto UDP (17), length 1500)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.627871 IP (tos 0x0, ttl 64, id 3392, offset 5920, flags [none], proto UDP (17), length 288)
    192.168.20.1 > 192.168.20.20: ip-proto-17
    15:37:53.647734 IP (tos 0x0, ttl 64, id 3393, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.20.1.53027 > 192.168.20.20.49200: UDP, bad length 6180 > 1472

  • Hi Thomas,

    Let me summarize to see if I got this configuration and setup right.

    • WL1837 is set as an AP and an iPhone is connected to it.
    • WL1837 is doing the transmissions to the iPhone, 50Kb every 20mSec.
    • iPhone seems to get larger chunks of data instead of 50Kb every 20mSec

    If this is the case, can you verify if what the iPhone gets is ~250Kb every ~100mSec?

    From the PS logs it seems as the iPhone enters PS and wakes up prior to every beacon so the data gets accumulated on the AP side (WL1837) until the iPhone wakes up and fetch it. Placing the WL1837 in awake is meaningless for AP since it is always in awake anyway. The right test is to place the station in awake but since it is an iPhone, I don't think it is possible.

    Let me know if this what you see.

    Regards,

    Shlomi

  • Hi Shlomi,

    Some corrections:

    in this mode we are sending 5Kb every 20mSec, not 50Kb. 

    What appears to happen is that the iPhone eventually receives all of the data, but it is apparently queued up on the sending side. So it does not appear to be reliably transmitted every 20mSec, but a collection of these 5Kb data packets are delayed and then sent.

    For my information, can you help me understand the meaning of the wlcore messages above that indicate it is the iPhone's power save that is kicking in and not that of the WL 1837? Or is it just your point that in AP mode the WL 1837 does not employ enhanced power save mechanisms?

    Regards,

    Tom

  • Hi Thomas,

    In AP role, the device is awake and does not go to sleep mainly because it needs to serve station at all times.

    A station can decide to go to sleep (using power save against the AP), usually if it is not expecting any data soon and in such a way save power.

    When a station goes into power save mode, the AP should keep the pending data in queues and signal the data every beacon in the TIM IE so the station can pull it.

    What happens in your case is that the iPhone goes to power save since 20mSec without receiving anything would normally cause the device to go into power save. In this case, it would need to wait to the next beacon which is the remaining 80mSec (if the beacon interval is 102.4mSec). And then all the pending frames are sent to the iPhone.

    The reason I believe this is the case is:

    • 20mSec is considered long enough for station to go back to powersave
    • the messages "wicore: link ps prev Oxc cur 0x0 changed 0xc" and then "wicore: link ps prev Oxc cur 0xc changed 0x0" show that the iPhone toggles  the power save back and forth

    Regards,

    Shlomi

  • Hi Shlomi,

    Thanks for this information. One last question before I think this can be closed. In P2P mode if the WL 1837 is the GO (I'm thinking of connection to Android), is it the same story there? Meaning if our devices is the GO then it will not enter power save?

    Regards,

    Tom

  • Yes, if eventually the device goes into GO mode, it acts as an AP.

    Regards,

    Shlomi