1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00
linux/drivers/net/wireless/silabs/wfx
Felipe Negrelli Wolter ea2274ab0b wifi: wfx: fix case where rates are out of order
When frames are sent over the air, the device always applies the data
rates in descending order. The driver assumed Minstrel also provided
rate in descending order.

However, in some cases, Minstrel can a choose a fallback rate greater
than the primary rate. In this case, the two rates was inverted, the
device try highest rate first and we get many retries.

Since the device always applies rates in descending order, the
workaround is to drop the rate when it higher than its predecessor in
the rate list. Thus [ 4, 5, 3 ] becomes [ 4, 3 ].

This patch has been tested in isolated room with a series of
attenuators. Here are the Minstrel statistics with 80dBm of attenuation:

  Without the fix:

                  best    ____________rate__________    ____statistics___    _____last____    ______sum-of________
    mode guard #  rate   [name   idx airtime  max_tp]  [avg(tp) avg(prob)]  [retry|suc|att]  [#success | #attempts]
    HT20  LGI  1       S  MCS0     0    1477     5.6       5.2      82.7       3     0 0             3   4
    HT20  LGI  1          MCS1     1     738    10.6       0.0       0.0       0     0 0             0   1
    HT20  LGI  1     D    MCS2     2     492    14.9      13.5      81.5       5     0 0             5   9
    HT20  LGI  1    C     MCS3     3     369    18.8      17.6      84.3       5     0 0            76   96
    HT20  LGI  1  A   P   MCS4     4     246    25.4      22.4      79.5       5     0 0         11268   14026
    HT20  LGI  1   B   S  MCS5     5     185    30.7      19.7      57.7       5     8 9          3918   9793
    HT20  LGI  1          MCS6     6     164    33.0       0.0       0.0       5     0 0             6   102
    HT20  LGI  1          MCS7     7     148    35.1       0.0       0.0       0     0 0             0   44

  With the fix:

                  best    ____________rate__________    ____statistics___    _____last____    ______sum-of________
    mode guard #  rate   [name   idx airtime  max_tp]  [avg(tp) avg(prob)]  [retry|suc|att]  [#success | #attempts]
    HT20  LGI  1       S  MCS0     0    1477     5.6       1.8      28.6       1     0 0             1   5
    HT20  LGI  1     DP   MCS1     1     738    10.6       9.7      82.6       4     0 0            14   34
    HT20  LGI  1          MCS2     2     492    14.9       9.2      55.4       5     0 0            52   77
    HT20  LGI  1   B   S  MCS3     3     369    18.8      15.6      74.9       5     1 1           417   554
    HT20  LGI  1  A       MCS4     4     246    25.4      16.7      59.2       5     1 1         13812   17951
    HT20  LGI  1    C  S  MCS5     5     185    30.7      14.0      41.0       5     1 5            57   640
    HT20  LGI  1          MCS6     6     164    33.0       0.0       0.0       0     0 1             0   48
    HT20  LGI  1       S  MCS7     7     148    35.1       0.0       0.0       0     0 0             0   36

We can notice the device try now to send with lower rates (and high
success rates). At the end, we measured 20-25% better throughput with
this patch.

Fixes: 9bca45f3d6 ("staging: wfx: allow to send 802.11 frames")
Tested-by: Olivier Souloumiac <olivier.souloumiac@silabs.com>
Tested-by: Alexandr Suslenko <suslenko.o@ajax.systems>
Reported-by: Alexandr Suslenko <suslenko.o@ajax.systems>
Co-developed-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
Signed-off-by: Felipe Negrelli Wolter <felipe.negrelliwolter@silabs.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20231004123039.157112-1-jerome.pouiller@silabs.com
2023-10-09 09:54:14 +03:00
..
bh.c
bh.h
bus.h
bus_sdio.c wifi: drivers: Explicitly include correct DT includes 2023-08-01 17:48:38 +03:00
bus_spi.c net: Replace all spi->chip_select and spi->cs_gpiod references with function call 2023-03-11 12:34:02 +00:00
data_rx.c wfx: use container_of() to get vif 2022-05-11 08:32:57 +03:00
data_rx.h
data_tx.c wifi: wfx: fix case where rates are out of order 2023-10-09 09:54:14 +03:00
data_tx.h wifi: wfx: allow to send frames during ROC 2023-10-09 09:53:07 +03:00
debug.c
debug.h
fwio.c wifi: wfx: Remove redundant NULL check before release_firmware() call 2022-06-10 10:38:55 +03:00
fwio.h
hif_api_cmd.h
hif_api_general.h
hif_api_mib.h
hif_rx.c
hif_rx.h
hif_tx.c wifi: wfx: introduce hif_scan_uniq() 2023-10-09 09:53:07 +03:00
hif_tx.h wifi: wfx: introduce hif_scan_uniq() 2023-10-09 09:53:07 +03:00
hif_tx_mib.c
hif_tx_mib.h
hwio.c
hwio.h
Kconfig
key.c wfx: use container_of() to get vif 2022-05-11 08:32:57 +03:00
key.h
main.c wifi: wfx: implement wfx_remain_on_channel() 2023-10-09 09:53:08 +03:00
main.h
Makefile
queue.c wifi: wfx: allow to send frames during ROC 2023-10-09 09:53:07 +03:00
queue.h wifi: wfx: allow to send frames during ROC 2023-10-09 09:53:07 +03:00
scan.c wifi: wfx: implement wfx_remain_on_channel() 2023-10-09 09:53:08 +03:00
scan.h wifi: wfx: implement wfx_remain_on_channel() 2023-10-09 09:53:08 +03:00
sta.c wifi: wfx: implement wfx_remain_on_channel() 2023-10-09 09:53:08 +03:00
sta.h wifi: wfx: relocate wfx_rate_mask_to_hw() 2023-10-09 09:53:06 +03:00
traces.h
wfx.h wifi: wfx: implement wfx_remain_on_channel() 2023-10-09 09:53:08 +03:00