]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
rtl8xxxu: Remove misleading warning from rtl8192eu_phy_iqcalibrate()
[karo-tx-linux.git] / drivers / net / wireless / realtek / rtl8xxxu / rtl8xxxu.c
index 9e9d3e351e6595aefa697cfde4bb7dff923d6e93..71d375c5ffa37e3cb4eda7e23c3d4942f5d1a86a 100644 (file)
@@ -2555,6 +2555,82 @@ rtl8723b_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
        rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS07_MCS04, mcs);
 }
 
+static void
+rtl8192e_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
+{
+       u32 val32, ofdm, mcs;
+       u8 cck, ofdmbase, mcsbase;
+       int group, tx_idx;
+
+       tx_idx = 0;
+       group = rtl8723b_channel_to_group(channel);
+
+       cck = priv->cck_tx_power_index_A[group];
+
+       val32 = rtl8xxxu_read32(priv, REG_TX_AGC_A_CCK1_MCS32);
+       val32 &= 0xffff00ff;
+       val32 |= (cck << 8);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_CCK1_MCS32, val32);
+
+       val32 = rtl8xxxu_read32(priv, REG_TX_AGC_B_CCK11_A_CCK2_11);
+       val32 &= 0xff;
+       val32 |= ((cck << 8) | (cck << 16) | (cck << 24));
+       rtl8xxxu_write32(priv, REG_TX_AGC_B_CCK11_A_CCK2_11, val32);
+
+       ofdmbase = priv->ht40_1s_tx_power_index_A[group];
+       ofdmbase += priv->ofdm_tx_power_diff[tx_idx].a;
+       ofdm = ofdmbase | ofdmbase << 8 | ofdmbase << 16 | ofdmbase << 24;
+
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_RATE18_06, ofdm);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_RATE54_24, ofdm);
+
+       mcsbase = priv->ht40_1s_tx_power_index_A[group];
+       if (ht40)
+               mcsbase += priv->ht40_tx_power_diff[tx_idx++].a;
+       else
+               mcsbase += priv->ht20_tx_power_diff[tx_idx++].a;
+       mcs = mcsbase | mcsbase << 8 | mcsbase << 16 | mcsbase << 24;
+
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS03_MCS00, mcs);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS07_MCS04, mcs);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS11_MCS08, mcs);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS15_MCS12, mcs);
+
+       if (priv->tx_paths > 1) {
+               cck = priv->cck_tx_power_index_B[group];
+
+               val32 = rtl8xxxu_read32(priv, REG_TX_AGC_B_CCK1_55_MCS32);
+               val32 &= 0xff;
+               val32 |= ((cck << 8) | (cck << 16) | (cck << 24));
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_CCK1_55_MCS32, val32);
+
+               val32 = rtl8xxxu_read32(priv, REG_TX_AGC_B_CCK11_A_CCK2_11);
+               val32 &= 0xffffff00;
+               val32 |= cck;
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_CCK11_A_CCK2_11, val32);
+
+               ofdmbase = priv->ht40_1s_tx_power_index_B[group];
+               ofdmbase += priv->ofdm_tx_power_diff[tx_idx].b;
+               ofdm = ofdmbase | ofdmbase << 8 |
+                       ofdmbase << 16 | ofdmbase << 24;
+
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_RATE18_06, ofdm);
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_RATE54_24, ofdm);
+
+               mcsbase = priv->ht40_1s_tx_power_index_B[group];
+               if (ht40)
+                       mcsbase += priv->ht40_tx_power_diff[tx_idx++].b;
+               else
+                       mcsbase += priv->ht20_tx_power_diff[tx_idx++].b;
+               mcs = mcsbase | mcsbase << 8 | mcsbase << 16 | mcsbase << 24;
+
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_MCS03_MCS00, mcs);
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_MCS07_MCS04, mcs);
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_MCS11_MCS08, mcs);
+               rtl8xxxu_write32(priv, REG_TX_AGC_B_MCS15_MCS12, mcs);
+       }
+}
+
 static void rtl8xxxu_set_linktype(struct rtl8xxxu_priv *priv,
                                  enum nl80211_iftype linktype)
 {
@@ -2682,7 +2758,8 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
        } else if (val32 & SYS_CFG_TYPE_ID) {
                bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
                bonding &= HPON_FSM_BONDING_MASK;
-               if (priv->fops->has_s0s1) {
+               if (priv->fops->tx_desc_size ==
+                   sizeof(struct rtl8xxxu_txdesc40)) {
                        if (bonding == HPON_FSM_BONDING_1T2R) {
                                sprintf(priv->chip_name, "8191EU");
                                priv->rf_paths = 2;
@@ -5820,8 +5897,6 @@ static void rtl8192eu_phy_iqcalibrate(struct rtl8xxxu_priv *priv,
                dev_dbg(dev, "%s: Path A RX IQK failed!\n", __func__);
 
        if (priv->rf_paths > 1) {
-               dev_warn(dev, "%s: Path B ongoing\n", __func__);
-
                /* Path A into standby */
                rtl8xxxu_write32(priv, REG_FPGA0_IQK, 0x00000000);
                rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_AC, 0x10000);
@@ -7641,7 +7716,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
                goto exit;
 
        /* RFSW Control - clear bit 14 ?? */
-       if (priv->rtl_chip != RTL8723B)
+       if (priv->rtl_chip != RTL8723B && priv->rtl_chip != RTL8192E)
                rtl8xxxu_write32(priv, REG_FPGA0_TX_INFO, 0x00000003);
        /* 0x07000760 */
        if (priv->rtl_chip == RTL8192E) {
@@ -7688,7 +7763,8 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        else
                val8 = (PBP_PAGE_SIZE_128 << PBP_PAGE_SIZE_RX_SHIFT) |
                        (PBP_PAGE_SIZE_128 << PBP_PAGE_SIZE_TX_SHIFT);
-       rtl8xxxu_write8(priv, REG_PBP, val8);
+       if (priv->rtl_chip != RTL8192E)
+               rtl8xxxu_write8(priv, REG_PBP, val8);
 
        dev_dbg(dev, "%s: macpower %i\n", __func__, macpower);
        if (!macpower) {
@@ -7879,9 +7955,11 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        priv->fops->set_tx_power(priv, 1, false);
 
        /* Let the 8051 take control of antenna setting */
-       val8 = rtl8xxxu_read8(priv, REG_LEDCFG2);
-       val8 |= LEDCFG2_DPDT_SELECT;
-       rtl8xxxu_write8(priv, REG_LEDCFG2, val8);
+       if (priv->rtl_chip != RTL8192E) {
+               val8 = rtl8xxxu_read8(priv, REG_LEDCFG2);
+               val8 |= LEDCFG2_DPDT_SELECT;
+               rtl8xxxu_write8(priv, REG_LEDCFG2, val8);
+       }
 
        rtl8xxxu_write8(priv, REG_HWSEQ_CTRL, 0xff);
 
@@ -7914,7 +7992,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        /*
         * This should enable thermal meter
         */
-       if (priv->fops->has_s0s1)
+       if (priv->fops->tx_desc_size == sizeof(struct rtl8xxxu_txdesc40))
                rtl8xxxu_write_rfreg(priv,
                                     RF_A, RF6052_REG_T_METER_8723B, 0x37cf8);
        else
@@ -8746,15 +8824,22 @@ static void rtl8xxxu_rx_urb_work(struct work_struct *work)
        }
 }
 
-static int rtl8723au_parse_rx_desc(struct rtl8xxxu_priv *priv,
+static int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv,
                                   struct sk_buff *skb,
                                   struct ieee80211_rx_status *rx_status)
 {
-       struct rtl8xxxu_rx_desc *rx_desc = (struct rtl8xxxu_rx_desc *)skb->data;
+       struct rtl8xxxu_rxdesc16 *rx_desc =
+               (struct rtl8xxxu_rxdesc16 *)skb->data;
        struct rtl8723au_phy_stats *phy_stats;
+       __le32 *_rx_desc_le = (__le32 *)skb->data;
+       u32 *_rx_desc = (u32 *)skb->data;
        int drvinfo_sz, desc_shift;
+       int i;
+
+       for (i = 0; i < (sizeof(struct rtl8xxxu_rxdesc16) / sizeof(u32)); i++)
+               _rx_desc[i] = le32_to_cpu(_rx_desc_le[i]);
 
-       skb_pull(skb, sizeof(struct rtl8xxxu_rx_desc));
+       skb_pull(skb, sizeof(struct rtl8xxxu_rxdesc16));
 
        phy_stats = (struct rtl8723au_phy_stats *)skb->data;
 
@@ -8786,16 +8871,22 @@ static int rtl8723au_parse_rx_desc(struct rtl8xxxu_priv *priv,
        return RX_TYPE_DATA_PKT;
 }
 
-static int rtl8723bu_parse_rx_desc(struct rtl8xxxu_priv *priv,
+static int rtl8xxxu_parse_rxdesc24(struct rtl8xxxu_priv *priv,
                                   struct sk_buff *skb,
                                   struct ieee80211_rx_status *rx_status)
 {
-       struct rtl8723bu_rx_desc *rx_desc =
-               (struct rtl8723bu_rx_desc *)skb->data;
+       struct rtl8xxxu_rxdesc24 *rx_desc =
+               (struct rtl8xxxu_rxdesc24 *)skb->data;
        struct rtl8723au_phy_stats *phy_stats;
+       __le32 *_rx_desc_le = (__le32 *)skb->data;
+       u32 *_rx_desc = (u32 *)skb->data;
        int drvinfo_sz, desc_shift;
+       int i;
 
-       skb_pull(skb, sizeof(struct rtl8723bu_rx_desc));
+       for (i = 0; i < (sizeof(struct rtl8xxxu_rxdesc24) / sizeof(u32)); i++)
+               _rx_desc[i] = le32_to_cpu(_rx_desc_le[i]);
+
+       skb_pull(skb, sizeof(struct rtl8xxxu_rxdesc24));
 
        phy_stats = (struct rtl8723au_phy_stats *)skb->data;
 
@@ -8887,12 +8978,7 @@ static void rtl8xxxu_rx_complete(struct urb *urb)
        struct sk_buff *skb = (struct sk_buff *)urb->context;
        struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
        struct device *dev = &priv->udev->dev;
-       __le32 *_rx_desc_le = (__le32 *)skb->data;
-       u32 *_rx_desc = (u32 *)skb->data;
-       int rx_type, i;
-
-       for (i = 0; i < (sizeof(struct rtl8xxxu_rx_desc) / sizeof(u32)); i++)
-               _rx_desc[i] = le32_to_cpu(_rx_desc_le[i]);
+       int rx_type;
 
        skb_put(skb, urb->actual_length);
 
@@ -8931,14 +9017,15 @@ static int rtl8xxxu_submit_rx_urb(struct rtl8xxxu_priv *priv,
 {
        struct sk_buff *skb;
        int skb_size;
-       int ret;
+       int ret, rx_desc_sz;
 
-       skb_size = sizeof(struct rtl8xxxu_rx_desc) + RTL_RX_BUFFER_SIZE;
+       rx_desc_sz = priv->fops->rx_desc_size;
+       skb_size = rx_desc_sz + RTL_RX_BUFFER_SIZE;
        skb = __netdev_alloc_skb(NULL, skb_size, GFP_KERNEL);
        if (!skb)
                return -ENOMEM;
 
-       memset(skb->data, 0, sizeof(struct rtl8xxxu_rx_desc));
+       memset(skb->data, 0, rx_desc_sz);
        usb_fill_bulk_urb(&rx_urb->urb, priv->udev, priv->pipe_in, skb->data,
                          skb_size, rtl8xxxu_rx_complete, skb);
        usb_anchor_urb(&rx_urb->urb, &priv->rx_anchor);
@@ -9692,7 +9779,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
        .llt_init = rtl8xxxu_init_llt_table,
        .phy_iq_calibrate = rtl8723au_phy_iq_calibrate,
        .config_channel = rtl8723au_config_channel,
-       .parse_rx_desc = rtl8723au_parse_rx_desc,
+       .parse_rx_desc = rtl8xxxu_parse_rxdesc16,
        .enable_rf = rtl8723a_enable_rf,
        .disable_rf = rtl8723a_disable_rf,
        .set_tx_power = rtl8723a_set_tx_power,
@@ -9702,6 +9789,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
        .mbox_ext_reg = REG_HMBOX_EXT_0,
        .mbox_ext_width = 2,
        .tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
+       .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
        .adda_1t_init = 0x0b1b25a0,
        .adda_1t_path_on = 0x0bdb25a0,
        .adda_2t_path_on_a = 0x04db25a4,
@@ -9719,7 +9807,7 @@ static struct rtl8xxxu_fileops rtl8723bu_fops = {
        .phy_init_antenna_selection = rtl8723bu_phy_init_antenna_selection,
        .phy_iq_calibrate = rtl8723bu_phy_iq_calibrate,
        .config_channel = rtl8723bu_config_channel,
-       .parse_rx_desc = rtl8723bu_parse_rx_desc,
+       .parse_rx_desc = rtl8xxxu_parse_rxdesc24,
        .init_aggregation = rtl8723bu_init_aggregation,
        .init_statistics = rtl8723bu_init_statistics,
        .enable_rf = rtl8723b_enable_rf,
@@ -9731,6 +9819,7 @@ static struct rtl8xxxu_fileops rtl8723bu_fops = {
        .mbox_ext_reg = REG_HMBOX_EXT0_8723B,
        .mbox_ext_width = 4,
        .tx_desc_size = sizeof(struct rtl8xxxu_txdesc40),
+       .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc24),
        .has_s0s1 = 1,
        .adda_1t_init = 0x01c00014,
        .adda_1t_path_on = 0x01c00014,
@@ -9750,7 +9839,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
        .llt_init = rtl8xxxu_init_llt_table,
        .phy_iq_calibrate = rtl8723au_phy_iq_calibrate,
        .config_channel = rtl8723au_config_channel,
-       .parse_rx_desc = rtl8723au_parse_rx_desc,
+       .parse_rx_desc = rtl8xxxu_parse_rxdesc16,
        .enable_rf = rtl8723a_enable_rf,
        .disable_rf = rtl8723a_disable_rf,
        .set_tx_power = rtl8723a_set_tx_power,
@@ -9760,6 +9849,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
        .mbox_ext_reg = REG_HMBOX_EXT_0,
        .mbox_ext_width = 2,
        .tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
+       .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
        .adda_1t_init = 0x0b1b25a0,
        .adda_1t_path_on = 0x0bdb25a0,
        .adda_2t_path_on_a = 0x04db25a4,
@@ -9778,17 +9868,18 @@ static struct rtl8xxxu_fileops rtl8192eu_fops = {
        .llt_init = rtl8xxxu_auto_llt_table,
        .phy_iq_calibrate = rtl8192eu_phy_iq_calibrate,
        .config_channel = rtl8723bu_config_channel,
-       .parse_rx_desc = rtl8723bu_parse_rx_desc,
+       .parse_rx_desc = rtl8xxxu_parse_rxdesc24,
        .enable_rf = rtl8723b_enable_rf,
        .disable_rf = rtl8723b_disable_rf,
-       .set_tx_power = rtl8723b_set_tx_power,
+       .set_tx_power = rtl8192e_set_tx_power,
        .update_rate_mask = rtl8723bu_update_rate_mask,
        .report_connect = rtl8723bu_report_connect,
        .writeN_block_size = 128,
        .mbox_ext_reg = REG_HMBOX_EXT0_8723B,
        .mbox_ext_width = 4,
        .tx_desc_size = sizeof(struct rtl8xxxu_txdesc40),
-       .has_s0s1 = 1,
+       .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc24),
+       .has_s0s1 = 0,
        .adda_1t_init = 0x0fc01616,
        .adda_1t_path_on = 0x0fc01616,
        .adda_2t_path_on_a = 0x0fc01616,