rtl8xxxu: Add rtl8xxxu_auto_llt_table()
authorJes Sorensen <Jes.Sorensen@redhat.com>
Mon, 29 Feb 2016 22:04:04 +0000 (17:04 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 10 Mar 2016 13:28:53 +0000 (15:28 +0200)
Newer chips can auto load the LLT table, it is no longer necessary to
build it manually in the driver.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h

index 55d12fbb0345165f6547696f9562d12bcf52e2c7..b2e4eac4d14fbed4f1de814b1fb186cbda85f337 100644 (file)
@@ -2774,6 +2774,34 @@ exit:
        return ret;
 }
 
+static int rtl8xxxu_auto_llt_table(struct rtl8xxxu_priv *priv, u8 last_tx_page)
+{
+       u32 val32;
+       int ret = 0;
+       int i;
+
+       val32 = rtl8xxxu_read32(priv, REG_AUTO_LLT);
+       pr_info("AUTO_LLT = %08x\n", val32);
+       val32 |= AUTO_LLT_INIT_LLT;
+       rtl8xxxu_write32(priv, REG_AUTO_LLT, val32);
+
+       for (i = 500; i; i--) {
+               val32 = rtl8xxxu_read32(priv, REG_AUTO_LLT);
+               if (!(val32 & AUTO_LLT_INIT_LLT))
+                       break;
+               usleep_range(2, 4);
+       }
+
+       if (i) {
+               ret = -EBUSY;
+               dev_warn(&priv->udev->dev, "LLT table init failed\n");
+       }
+       else
+               dev_warn(&priv->udev->dev, "LLT table init success\n");
+
+       return ret;
+}
+
 static int rtl8xxxu_init_queue_priority(struct rtl8xxxu_priv *priv)
 {
        u16 val16, hi, lo;
@@ -4287,7 +4315,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
 
        dev_dbg(dev, "%s: macpower %i\n", __func__, macpower);
        if (!macpower) {
-               ret = rtl8xxxu_init_llt_table(priv, TX_TOTAL_PAGE_NUM);
+               ret = priv->fops->llt_init(priv, TX_TOTAL_PAGE_NUM);
                if (ret) {
                        dev_warn(dev, "%s: LLT table init failed\n", __func__);
                        goto exit;
@@ -6079,6 +6107,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
        .parse_efuse = rtl8723au_parse_efuse,
        .load_firmware = rtl8723au_load_firmware,
        .power_on = rtl8723au_power_on,
+       .llt_init = rtl8xxxu_init_llt_table,
        .writeN_block_size = 1024,
 };
 
@@ -6088,6 +6117,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
        .parse_efuse = rtl8192cu_parse_efuse,
        .load_firmware = rtl8192cu_load_firmware,
        .power_on = rtl8192cu_power_on,
+       .llt_init = rtl8xxxu_init_llt_table,
        .writeN_block_size = 128,
 };
 
@@ -6097,6 +6127,7 @@ static struct rtl8xxxu_fileops rtl8192eu_fops = {
        .parse_efuse = rtl8192eu_parse_efuse,
        .load_firmware = rtl8192eu_load_firmware,
        .power_on = rtl8192eu_power_on,
+       .llt_init = rtl8xxxu_auto_llt_table,
        .writeN_block_size = 128,
 };
 
index 0d4ff80f0ab177f959ac2cf36a97e370b85deeb4..56c4e0a7c07dfca3905d5df80435ff8dac5b0790 100644 (file)
@@ -718,5 +718,6 @@ struct rtl8xxxu_fileops {
        int (*parse_efuse) (struct rtl8xxxu_priv *priv);
        int (*load_firmware) (struct rtl8xxxu_priv *priv);
        int (*power_on) (struct rtl8xxxu_priv *priv);
+       int (*llt_init) (struct rtl8xxxu_priv *priv, u8 last_tx_page);
        int writeN_block_size;
 };
index 02c7d6c6f62dbbb33932c10955cad33f67c1d034..b83bd34bdd76c698d20841bb8edd85bd3ba73384 100644 (file)
 #define  RQPN_NPQ_SHIFT                        0
 #define  RQPN_EPQ_SHIFT                        16
 
+#define REG_AUTO_LLT                   0x0224
+#define  AUTO_LLT_INIT_LLT             BIT(16)
+
 /* 0x0280 ~ 0x02FF     RXDMA Configuration */
 #define REG_RXDMA_AGG_PG_TH            0x0280
 #define REG_RXPKT_NUM                  0x0284