Commit f9455715 authored by Vladimir Lypak's avatar Vladimir Lypak Committed by Kalle Valo

wifi: wcn36xx: add support for pronto-v3

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: default avatarVladimir Lypak <vladimir.lypak@gmail.com>
Signed-off-by: default avatarSireesh Kodali <sireeshkodali1@gmail.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230311150647.22935-2-sireeshkodali1@gmail.com
parent f94d7a3a
...@@ -112,8 +112,8 @@ int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn) ...@@ -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_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_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_l_ch.dxe_wq = WCN36XX_DXE_WQ_TX_L(wcn);
wcn->dxe_tx_h_ch.dxe_wq = WCN36XX_DXE_WQ_TX_H; 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_l_ch.ctrl_bd = WCN36XX_DXE_CTRL_TX_L_BD;
wcn->dxe_tx_h_ch.ctrl_bd = WCN36XX_DXE_CTRL_TX_H_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) ...@@ -165,8 +165,9 @@ void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn)
wcn36xx_dxe_free_ctl_block(&wcn->dxe_rx_h_ch); 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 *cur_dxe = NULL;
struct wcn36xx_dxe_desc *prev_dxe = NULL; struct wcn36xx_dxe_desc *prev_dxe = NULL;
struct wcn36xx_dxe_ctl *cur_ctl = 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 ...@@ -190,11 +191,11 @@ static int wcn36xx_dxe_init_descs(struct device *dev, struct wcn36xx_dxe_ch *wcn
switch (wcn_ch->ch_type) { switch (wcn_ch->ch_type) {
case WCN36XX_DXE_CH_TX_L: case WCN36XX_DXE_CH_TX_L:
cur_dxe->ctrl = WCN36XX_DXE_CTRL_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; break;
case WCN36XX_DXE_CH_TX_H: case WCN36XX_DXE_CH_TX_H:
cur_dxe->ctrl = WCN36XX_DXE_CTRL_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; break;
case WCN36XX_DXE_CH_RX_L: case WCN36XX_DXE_CH_RX_L:
cur_dxe->ctrl = WCN36XX_DXE_CTRL_RX_L; cur_dxe->ctrl = WCN36XX_DXE_CTRL_RX_L;
...@@ -914,7 +915,7 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) ...@@ -914,7 +915,7 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
/***************************************/ /***************************************/
/* Init descriptors for TX LOW channel */ /* 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) { if (ret) {
dev_err(wcn->dev, "Error allocating descriptor\n"); dev_err(wcn->dev, "Error allocating descriptor\n");
return ret; return ret;
...@@ -928,14 +929,14 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) ...@@ -928,14 +929,14 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
/* Program DMA destination addr for TX LOW */ /* Program DMA destination addr for TX LOW */
wcn36xx_dxe_write_register(wcn, wcn36xx_dxe_write_register(wcn,
WCN36XX_DXE_CH_DEST_ADDR_TX_L, 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); wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, &reg_data);
/***************************************/ /***************************************/
/* Init descriptors for TX HIGH channel */ /* 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) { if (ret) {
dev_err(wcn->dev, "Error allocating descriptor\n"); dev_err(wcn->dev, "Error allocating descriptor\n");
goto out_err_txh_ch; goto out_err_txh_ch;
...@@ -950,14 +951,14 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) ...@@ -950,14 +951,14 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
/* Program DMA destination addr for TX HIGH */ /* Program DMA destination addr for TX HIGH */
wcn36xx_dxe_write_register(wcn, wcn36xx_dxe_write_register(wcn,
WCN36XX_DXE_CH_DEST_ADDR_TX_H, 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); wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, &reg_data);
/***************************************/ /***************************************/
/* Init descriptors for RX LOW channel */ /* 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) { if (ret) {
dev_err(wcn->dev, "Error allocating descriptor\n"); dev_err(wcn->dev, "Error allocating descriptor\n");
goto out_err_rxl_ch; goto out_err_rxl_ch;
...@@ -988,7 +989,7 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) ...@@ -988,7 +989,7 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
/***************************************/ /***************************************/
/* Init descriptors for RX HIGH channel */ /* 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) { if (ret) {
dev_err(wcn->dev, "Error allocating descriptor\n"); dev_err(wcn->dev, "Error allocating descriptor\n");
goto out_err_rxh_ch; goto out_err_rxh_ch;
......
...@@ -135,8 +135,8 @@ H2H_TEST_RX_TX = DMA2 ...@@ -135,8 +135,8 @@ H2H_TEST_RX_TX = DMA2
WCN36xx_DXE_CTRL_ENDIANNESS) WCN36xx_DXE_CTRL_ENDIANNESS)
/* TODO This must calculated properly but not hardcoded */ /* TODO This must calculated properly but not hardcoded */
#define WCN36XX_DXE_WQ_TX_L 0x17 #define WCN36XX_DXE_WQ_TX_L(wcn) ((wcn)->is_pronto_v3 ? 0x6 : 0x17)
#define WCN36XX_DXE_WQ_TX_H 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_L 0xB
#define WCN36XX_DXE_WQ_RX_H 0x4 #define WCN36XX_DXE_WQ_RX_H 0x4
......
...@@ -1508,6 +1508,7 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, ...@@ -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 = !!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 */ /* Map the CCU memory */
index = of_property_match_string(mmio_node, "reg-names", "ccu"); index = of_property_match_string(mmio_node, "reg-names", "ccu");
......
...@@ -217,6 +217,7 @@ struct wcn36xx { ...@@ -217,6 +217,7 @@ struct wcn36xx {
u8 fw_major; u8 fw_major;
u32 fw_feat_caps[WCN36XX_HAL_CAPS_SIZE]; u32 fw_feat_caps[WCN36XX_HAL_CAPS_SIZE];
bool is_pronto; bool is_pronto;
bool is_pronto_v3;
/* extra byte for the NULL termination */ /* extra byte for the NULL termination */
u8 crm_version[WCN36XX_HAL_VERSION_LENGTH + 1]; u8 crm_version[WCN36XX_HAL_VERSION_LENGTH + 1];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment