OSDN Git Service

wifi: wcn36xx: add support for pronto-v3
authorVladimir Lypak <vladimir.lypak@gmail.com>
Sat, 11 Mar 2023 15:06:47 +0000 (20:36 +0530)
committerKalle Valo <quic_kvalo@quicinc.com>
Wed, 15 Mar 2023 10:15:50 +0000 (12:15 +0200)
Pronto v3 has a different DXE address than prior Pronto versions. This
patch changes the macro to return the correct register address based on
the pronto version.

Signed-off-by: Vladimir Lypak <vladimir.lypak@gmail.com>
Signed-off-by: Sireesh Kodali <sireeshkodali1@gmail.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230311150647.22935-2-sireeshkodali1@gmail.com
drivers/net/wireless/ath/wcn36xx/dxe.c
drivers/net/wireless/ath/wcn36xx/dxe.h
drivers/net/wireless/ath/wcn36xx/main.c
drivers/net/wireless/ath/wcn36xx/wcn36xx.h

index 4e9e139..9013f05 100644 (file)
@@ -112,8 +112,8 @@ int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn)
        wcn->dxe_rx_l_ch.desc_num = WCN36XX_DXE_CH_DESC_NUMB_RX_L;
        wcn->dxe_rx_h_ch.desc_num = WCN36XX_DXE_CH_DESC_NUMB_RX_H;
 
-       wcn->dxe_tx_l_ch.dxe_wq =  WCN36XX_DXE_WQ_TX_L;
-       wcn->dxe_tx_h_ch.dxe_wq =  WCN36XX_DXE_WQ_TX_H;
+       wcn->dxe_tx_l_ch.dxe_wq =  WCN36XX_DXE_WQ_TX_L(wcn);
+       wcn->dxe_tx_h_ch.dxe_wq =  WCN36XX_DXE_WQ_TX_H(wcn);
 
        wcn->dxe_tx_l_ch.ctrl_bd = WCN36XX_DXE_CTRL_TX_L_BD;
        wcn->dxe_tx_h_ch.ctrl_bd = WCN36XX_DXE_CTRL_TX_H_BD;
@@ -165,8 +165,9 @@ void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn)
        wcn36xx_dxe_free_ctl_block(&wcn->dxe_rx_h_ch);
 }
 
-static int wcn36xx_dxe_init_descs(struct device *dev, struct wcn36xx_dxe_ch *wcn_ch)
+static int wcn36xx_dxe_init_descs(struct wcn36xx *wcn, struct wcn36xx_dxe_ch *wcn_ch)
 {
+       struct device *dev = wcn->dev;
        struct wcn36xx_dxe_desc *cur_dxe = NULL;
        struct wcn36xx_dxe_desc *prev_dxe = NULL;
        struct wcn36xx_dxe_ctl *cur_ctl = NULL;
@@ -190,11 +191,11 @@ static int wcn36xx_dxe_init_descs(struct device *dev, struct wcn36xx_dxe_ch *wcn
                switch (wcn_ch->ch_type) {
                case WCN36XX_DXE_CH_TX_L:
                        cur_dxe->ctrl = WCN36XX_DXE_CTRL_TX_L;
-                       cur_dxe->dst_addr_l = WCN36XX_DXE_WQ_TX_L;
+                       cur_dxe->dst_addr_l = WCN36XX_DXE_WQ_TX_L(wcn);
                        break;
                case WCN36XX_DXE_CH_TX_H:
                        cur_dxe->ctrl = WCN36XX_DXE_CTRL_TX_H;
-                       cur_dxe->dst_addr_l = WCN36XX_DXE_WQ_TX_H;
+                       cur_dxe->dst_addr_l = WCN36XX_DXE_WQ_TX_H(wcn);
                        break;
                case WCN36XX_DXE_CH_RX_L:
                        cur_dxe->ctrl = WCN36XX_DXE_CTRL_RX_L;
@@ -914,7 +915,7 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
        /***************************************/
        /* Init descriptors for TX LOW channel */
        /***************************************/
-       ret = wcn36xx_dxe_init_descs(wcn->dev, &wcn->dxe_tx_l_ch);
+       ret = wcn36xx_dxe_init_descs(wcn, &wcn->dxe_tx_l_ch);
        if (ret) {
                dev_err(wcn->dev, "Error allocating descriptor\n");
                return ret;
@@ -928,14 +929,14 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
        /* Program DMA destination addr for TX LOW */
        wcn36xx_dxe_write_register(wcn,
                WCN36XX_DXE_CH_DEST_ADDR_TX_L,
-               WCN36XX_DXE_WQ_TX_L);
+               WCN36XX_DXE_WQ_TX_L(wcn));
 
        wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, &reg_data);
 
        /***************************************/
        /* Init descriptors for TX HIGH channel */
        /***************************************/
-       ret = wcn36xx_dxe_init_descs(wcn->dev, &wcn->dxe_tx_h_ch);
+       ret = wcn36xx_dxe_init_descs(wcn, &wcn->dxe_tx_h_ch);
        if (ret) {
                dev_err(wcn->dev, "Error allocating descriptor\n");
                goto out_err_txh_ch;
@@ -950,14 +951,14 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
        /* Program DMA destination addr for TX HIGH */
        wcn36xx_dxe_write_register(wcn,
                WCN36XX_DXE_CH_DEST_ADDR_TX_H,
-               WCN36XX_DXE_WQ_TX_H);
+               WCN36XX_DXE_WQ_TX_H(wcn));
 
        wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, &reg_data);
 
        /***************************************/
        /* Init descriptors for RX LOW channel */
        /***************************************/
-       ret = wcn36xx_dxe_init_descs(wcn->dev, &wcn->dxe_rx_l_ch);
+       ret = wcn36xx_dxe_init_descs(wcn, &wcn->dxe_rx_l_ch);
        if (ret) {
                dev_err(wcn->dev, "Error allocating descriptor\n");
                goto out_err_rxl_ch;
@@ -988,7 +989,7 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
        /***************************************/
        /* Init descriptors for RX HIGH channel */
        /***************************************/
-       ret = wcn36xx_dxe_init_descs(wcn->dev, &wcn->dxe_rx_h_ch);
+       ret = wcn36xx_dxe_init_descs(wcn, &wcn->dxe_rx_h_ch);
        if (ret) {
                dev_err(wcn->dev, "Error allocating descriptor\n");
                goto out_err_rxh_ch;
index 26a31ed..dd8c684 100644 (file)
@@ -135,8 +135,8 @@ H2H_TEST_RX_TX = DMA2
        WCN36xx_DXE_CTRL_ENDIANNESS)
 
 /* TODO This must calculated properly but not hardcoded */
-#define WCN36XX_DXE_WQ_TX_L                    0x17
-#define WCN36XX_DXE_WQ_TX_H                    0x17
+#define WCN36XX_DXE_WQ_TX_L(wcn)    ((wcn)->is_pronto_v3 ? 0x6 : 0x17)
+#define WCN36XX_DXE_WQ_TX_H(wcn)    ((wcn)->is_pronto_v3 ? 0x6 : 0x17)
 #define WCN36XX_DXE_WQ_RX_L                    0xB
 #define WCN36XX_DXE_WQ_RX_H                    0x4
 
index 3b79cc1..8dbd115 100644 (file)
@@ -1508,6 +1508,7 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn,
        }
 
        wcn->is_pronto = !!of_device_is_compatible(mmio_node, "qcom,pronto");
+       wcn->is_pronto_v3 = !!of_device_is_compatible(mmio_node, "qcom,pronto-v3-pil");
 
        /* Map the CCU memory */
        index = of_property_match_string(mmio_node, "reg-names", "ccu");
index 9aa08b6..ff4a8e5 100644 (file)
@@ -217,6 +217,7 @@ struct wcn36xx {
        u8                      fw_major;
        u32                     fw_feat_caps[WCN36XX_HAL_CAPS_SIZE];
        bool                    is_pronto;
+       bool                    is_pronto_v3;
 
        /* extra byte for the NULL termination */
        u8                      crm_version[WCN36XX_HAL_VERSION_LENGTH + 1];