aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/650-0013-rtl8xxxu-Enable-aggregation-for-rtl8723au.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/650-0013-rtl8xxxu-Enable-aggregation-for-rtl8723au.patch')
-rw-r--r--package/kernel/mac80211/patches/650-0013-rtl8xxxu-Enable-aggregation-for-rtl8723au.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/650-0013-rtl8xxxu-Enable-aggregation-for-rtl8723au.patch b/package/kernel/mac80211/patches/650-0013-rtl8xxxu-Enable-aggregation-for-rtl8723au.patch
new file mode 100644
index 0000000000..a8f151b6d8
--- /dev/null
+++ b/package/kernel/mac80211/patches/650-0013-rtl8xxxu-Enable-aggregation-for-rtl8723au.patch
@@ -0,0 +1,89 @@
+From 7e9f37893c874ff2a01dfbf73d31d3de37359fc7 Mon Sep 17 00:00:00 2001
+From: Jes Sorensen <Jes.Sorensen@redhat.com>
+Date: Mon, 16 May 2016 21:50:57 -0400
+Subject: [PATCH] rtl8xxxu: Enable aggregation for rtl8723au
+
+Implement rtl8xxxu_gen1_init_aggregation(). Aggregation should be the
+same for all gen1 parts. We may want to allow for tuning parameters in
+the fileopes struct. For now this is based allocating 16KB RX buffers,
+leaving 16000 bytes for actual packets, and the rest for the skb
+overhead.
+
+Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
+---
+ drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
+ .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c | 2 ++
+ .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 34 ++++++++++++++++++++++
+ 3 files changed, 37 insertions(+)
+
+--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+@@ -1412,6 +1412,7 @@ void rtl8xxxu_gen1_report_connect(struct
+ u8 macid, bool connect);
+ void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
+ u8 macid, bool connect);
++void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv);
+ void rtl8xxxu_gen1_enable_rf(struct rtl8xxxu_priv *priv);
+ void rtl8xxxu_gen1_disable_rf(struct rtl8xxxu_priv *priv);
+ void rtl8xxxu_gen2_disable_rf(struct rtl8xxxu_priv *priv);
+--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
+@@ -377,6 +377,7 @@ struct rtl8xxxu_fileops rtl8723au_fops =
+ .phy_iq_calibrate = rtl8xxxu_gen1_phy_iq_calibrate,
+ .config_channel = rtl8xxxu_gen1_config_channel,
+ .parse_rx_desc = rtl8xxxu_parse_rxdesc16,
++ .init_aggregation = rtl8xxxu_gen1_init_aggregation,
+ .enable_rf = rtl8xxxu_gen1_enable_rf,
+ .disable_rf = rtl8xxxu_gen1_disable_rf,
+ .usb_quirks = rtl8xxxu_gen1_usb_quirks,
+@@ -384,6 +385,7 @@ struct rtl8xxxu_fileops rtl8723au_fops =
+ .update_rate_mask = rtl8xxxu_update_rate_mask,
+ .report_connect = rtl8xxxu_gen1_report_connect,
+ .writeN_block_size = 1024,
++ .rx_agg_buf_size = 16000,
+ .tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
+ .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
+ .adda_1t_init = 0x0b1b25a0,
+--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+@@ -4405,6 +4405,40 @@ void rtl8xxxu_gen2_report_connect(struct
+ rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt));
+ }
+
++void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv)
++{
++ u8 agg_ctrl, usb_spec, page_thresh;
++
++ usb_spec = rtl8xxxu_read8(priv, REG_USB_SPECIAL_OPTION);
++ usb_spec &= ~USB_SPEC_USB_AGG_ENABLE;
++
++ agg_ctrl = rtl8xxxu_read8(priv, REG_TRXDMA_CTRL);
++ agg_ctrl &= ~TRXDMA_CTRL_RXDMA_AGG_EN;
++
++ agg_ctrl |= TRXDMA_CTRL_RXDMA_AGG_EN;
++
++ rtl8xxxu_write8(priv, REG_TRXDMA_CTRL, agg_ctrl);
++ rtl8xxxu_write8(priv, REG_USB_SPECIAL_OPTION, usb_spec);
++
++ /*
++ * The number of packets we can take looks to be buffer size / 512
++ * which matches the 512 byte rounding we have to do when de-muxing
++ * the packets.
++ *
++ * Sample numbers from the vendor driver:
++ * USB High-Speed mode values:
++ * RxAggBlockCount = 8 : 512 byte unit
++ * RxAggBlockTimeout = 6
++ * RxAggPageCount = 48 : 128 byte unit
++ * RxAggPageTimeout = 4 or 6 (absolute time 34ms/(2^6))
++ */
++
++ page_thresh = (priv->fops->rx_agg_buf_size / 512);
++ rtl8xxxu_write8(priv, REG_RXDMA_AGG_PG_TH, page_thresh);
++ rtl8xxxu_write8(priv, REG_USB_DMA_AGG_TO, 4);
++ priv->rx_buf_aggregation = 1;
++}
++
+ static void rtl8xxxu_set_basic_rates(struct rtl8xxxu_priv *priv, u32 rate_cfg)
+ {
+ u32 val32;