Re: [PATCH 3/4] wcn36xx: Transition driver to SMD client
On Mon, Jan 11, 2016 at 1:02 AM, Eugene Krasnikovwrote: > Better late than never! Looks good to me. > Unfortunately I ran into an issue with ordering of operations between the WiFi driver and the wcnss_ctrl driver. So an updated series is on the way, but this depends on changes to the wcnss_ctrl driver, which are being reviewed right now. Regards, Bjorn > 2015-12-28 1:34 GMT+00:00 Bjorn Andersson : >> The wcn36xx wifi driver follows the life cycle of the WLAN_CTRL SMD >> channel, as such it should be a SMD client. This patch makes this >> transition, now that we have the necessary frameworks available. >> >> Signed-off-by: Bjorn Andersson >> --- >> drivers/net/wireless/ath/wcn36xx/Kconfig | 2 +- >> drivers/net/wireless/ath/wcn36xx/dxe.c | 16 +++-- >> drivers/net/wireless/ath/wcn36xx/main.c| 111 >> + >> drivers/net/wireless/ath/wcn36xx/smd.c | 26 --- >> drivers/net/wireless/ath/wcn36xx/smd.h | 4 ++ >> drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 21 ++ >> 6 files changed, 99 insertions(+), 81 deletions(-) >> >> diff --git a/drivers/net/wireless/ath/wcn36xx/Kconfig >> b/drivers/net/wireless/ath/wcn36xx/Kconfig >> index 591ebaea8265..394fe5b77c90 100644 >> --- a/drivers/net/wireless/ath/wcn36xx/Kconfig >> +++ b/drivers/net/wireless/ath/wcn36xx/Kconfig >> @@ -1,6 +1,6 @@ >> config WCN36XX >> tristate "Qualcomm Atheros WCN3660/3680 support" >> - depends on MAC80211 && HAS_DMA >> + depends on MAC80211 && HAS_DMA && QCOM_SMD >> ---help--- >> This module adds support for wireless adapters based on >> Qualcomm Atheros WCN3660 and WCN3680 mobile chipsets. >> diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c >> b/drivers/net/wireless/ath/wcn36xx/dxe.c >> index f8dfa05b290a..47f3937a7ab9 100644 >> --- a/drivers/net/wireless/ath/wcn36xx/dxe.c >> +++ b/drivers/net/wireless/ath/wcn36xx/dxe.c >> @@ -23,6 +23,7 @@ >> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt >> >> #include >> +#include >> #include "wcn36xx.h" >> #include "txrx.h" >> >> @@ -150,9 +151,12 @@ int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn) >> goto out_err; >> >> /* Initialize SMSM state Clear TX Enable RING EMPTY STATE */ >> - ret = wcn->ctrl_ops->smsm_change_state( >> - WCN36XX_SMSM_WLAN_TX_ENABLE, >> - WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); >> + ret = qcom_smem_state_update_bits(wcn->tx_enable_state, >> + WCN36XX_SMSM_WLAN_TX_ENABLE | >> + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY, >> + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); >> + if (ret) >> + goto out_err; >> >> return 0; >> >> @@ -676,9 +680,9 @@ int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn, >> * notify chip about new frame through SMSM bus. >> */ >> if (is_low && vif_priv->pw_state == WCN36XX_BMPS) { >> - wcn->ctrl_ops->smsm_change_state( >> - 0, >> - WCN36XX_SMSM_WLAN_TX_ENABLE); >> + qcom_smem_state_update_bits(wcn->tx_rings_empty_state, >> + WCN36XX_SMSM_WLAN_TX_ENABLE, >> + WCN36XX_SMSM_WLAN_TX_ENABLE); >> } else { >> /* indicate End Of Packet and generate interrupt on >> descriptor >> * done. >> diff --git a/drivers/net/wireless/ath/wcn36xx/main.c >> b/drivers/net/wireless/ath/wcn36xx/main.c >> index 7c169abdbafe..8659e3f997d2 100644 >> --- a/drivers/net/wireless/ath/wcn36xx/main.c >> +++ b/drivers/net/wireless/ath/wcn36xx/main.c >> @@ -19,6 +19,9 @@ >> #include >> #include >> #include >> +#include >> +#include >> +#include >> #include "wcn36xx.h" >> >> unsigned int wcn36xx_dbg_mask; >> @@ -981,48 +984,63 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) >> } >> >> static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, >> - struct platform_device *pdev) >> + struct device *dev) >> { >> - struct resource *res; >> + u32 mmio[2]; >> + int ret; >> + >> /* Set TX IRQ */ >> - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, >> - "wcnss_wlantx_irq"); >> - if (!res) { >> + wcn->tx_irq = irq_of_parse_and_map(dev->of_node, 0); >> + if (!wcn->tx_irq) { >> wcn36xx_err("failed to get tx_irq\n"); >> return -ENOENT; >> } >> - wcn->tx_irq = res->start; >> >> /* Set RX IRQ */ >> - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, >> - "wcnss_wlanrx_irq"); >> -
Re: [PATCH 3/4] wcn36xx: Transition driver to SMD client
On Mon, Jan 11, 2016 at 1:02 AM, Eugene Krasnikov wrote: > Better late than never! Looks good to me. > Unfortunately I ran into an issue with ordering of operations between the WiFi driver and the wcnss_ctrl driver. So an updated series is on the way, but this depends on changes to the wcnss_ctrl driver, which are being reviewed right now. Regards, Bjorn > 2015-12-28 1:34 GMT+00:00 Bjorn Andersson : >> The wcn36xx wifi driver follows the life cycle of the WLAN_CTRL SMD >> channel, as such it should be a SMD client. This patch makes this >> transition, now that we have the necessary frameworks available. >> >> Signed-off-by: Bjorn Andersson >> --- >> drivers/net/wireless/ath/wcn36xx/Kconfig | 2 +- >> drivers/net/wireless/ath/wcn36xx/dxe.c | 16 +++-- >> drivers/net/wireless/ath/wcn36xx/main.c| 111 >> + >> drivers/net/wireless/ath/wcn36xx/smd.c | 26 --- >> drivers/net/wireless/ath/wcn36xx/smd.h | 4 ++ >> drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 21 ++ >> 6 files changed, 99 insertions(+), 81 deletions(-) >> >> diff --git a/drivers/net/wireless/ath/wcn36xx/Kconfig >> b/drivers/net/wireless/ath/wcn36xx/Kconfig >> index 591ebaea8265..394fe5b77c90 100644 >> --- a/drivers/net/wireless/ath/wcn36xx/Kconfig >> +++ b/drivers/net/wireless/ath/wcn36xx/Kconfig >> @@ -1,6 +1,6 @@ >> config WCN36XX >> tristate "Qualcomm Atheros WCN3660/3680 support" >> - depends on MAC80211 && HAS_DMA >> + depends on MAC80211 && HAS_DMA && QCOM_SMD >> ---help--- >> This module adds support for wireless adapters based on >> Qualcomm Atheros WCN3660 and WCN3680 mobile chipsets. >> diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c >> b/drivers/net/wireless/ath/wcn36xx/dxe.c >> index f8dfa05b290a..47f3937a7ab9 100644 >> --- a/drivers/net/wireless/ath/wcn36xx/dxe.c >> +++ b/drivers/net/wireless/ath/wcn36xx/dxe.c >> @@ -23,6 +23,7 @@ >> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt >> >> #include >> +#include >> #include "wcn36xx.h" >> #include "txrx.h" >> >> @@ -150,9 +151,12 @@ int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn) >> goto out_err; >> >> /* Initialize SMSM state Clear TX Enable RING EMPTY STATE */ >> - ret = wcn->ctrl_ops->smsm_change_state( >> - WCN36XX_SMSM_WLAN_TX_ENABLE, >> - WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); >> + ret = qcom_smem_state_update_bits(wcn->tx_enable_state, >> + WCN36XX_SMSM_WLAN_TX_ENABLE | >> + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY, >> + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); >> + if (ret) >> + goto out_err; >> >> return 0; >> >> @@ -676,9 +680,9 @@ int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn, >> * notify chip about new frame through SMSM bus. >> */ >> if (is_low && vif_priv->pw_state == WCN36XX_BMPS) { >> - wcn->ctrl_ops->smsm_change_state( >> - 0, >> - WCN36XX_SMSM_WLAN_TX_ENABLE); >> + qcom_smem_state_update_bits(wcn->tx_rings_empty_state, >> + WCN36XX_SMSM_WLAN_TX_ENABLE, >> + WCN36XX_SMSM_WLAN_TX_ENABLE); >> } else { >> /* indicate End Of Packet and generate interrupt on >> descriptor >> * done. >> diff --git a/drivers/net/wireless/ath/wcn36xx/main.c >> b/drivers/net/wireless/ath/wcn36xx/main.c >> index 7c169abdbafe..8659e3f997d2 100644 >> --- a/drivers/net/wireless/ath/wcn36xx/main.c >> +++ b/drivers/net/wireless/ath/wcn36xx/main.c >> @@ -19,6 +19,9 @@ >> #include >> #include >> #include >> +#include >> +#include >> +#include >> #include "wcn36xx.h" >> >> unsigned int wcn36xx_dbg_mask; >> @@ -981,48 +984,63 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) >> } >> >> static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, >> - struct platform_device *pdev) >> + struct device *dev) >> { >> - struct resource *res; >> + u32 mmio[2]; >> + int ret; >> + >> /* Set TX IRQ */ >> - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, >> - "wcnss_wlantx_irq"); >> - if (!res) { >> + wcn->tx_irq = irq_of_parse_and_map(dev->of_node, 0); >> + if (!wcn->tx_irq) { >> wcn36xx_err("failed to get tx_irq\n"); >> return -ENOENT; >> } >> - wcn->tx_irq = res->start; >> >> /* Set RX IRQ */ >> - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, >> - "wcnss_wlanrx_irq"); >> - if (!res) { >> + wcn->rx_irq =
[PATCH 3/4] wcn36xx: Transition driver to SMD client
The wcn36xx wifi driver follows the life cycle of the WLAN_CTRL SMD channel, as such it should be a SMD client. This patch makes this transition, now that we have the necessary frameworks available. Signed-off-by: Bjorn Andersson --- drivers/net/wireless/ath/wcn36xx/Kconfig | 2 +- drivers/net/wireless/ath/wcn36xx/dxe.c | 16 +++-- drivers/net/wireless/ath/wcn36xx/main.c| 111 + drivers/net/wireless/ath/wcn36xx/smd.c | 26 --- drivers/net/wireless/ath/wcn36xx/smd.h | 4 ++ drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 21 ++ 6 files changed, 99 insertions(+), 81 deletions(-) diff --git a/drivers/net/wireless/ath/wcn36xx/Kconfig b/drivers/net/wireless/ath/wcn36xx/Kconfig index 591ebaea8265..394fe5b77c90 100644 --- a/drivers/net/wireless/ath/wcn36xx/Kconfig +++ b/drivers/net/wireless/ath/wcn36xx/Kconfig @@ -1,6 +1,6 @@ config WCN36XX tristate "Qualcomm Atheros WCN3660/3680 support" - depends on MAC80211 && HAS_DMA + depends on MAC80211 && HAS_DMA && QCOM_SMD ---help--- This module adds support for wireless adapters based on Qualcomm Atheros WCN3660 and WCN3680 mobile chipsets. diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c index f8dfa05b290a..47f3937a7ab9 100644 --- a/drivers/net/wireless/ath/wcn36xx/dxe.c +++ b/drivers/net/wireless/ath/wcn36xx/dxe.c @@ -23,6 +23,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include +#include #include "wcn36xx.h" #include "txrx.h" @@ -150,9 +151,12 @@ int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn) goto out_err; /* Initialize SMSM state Clear TX Enable RING EMPTY STATE */ - ret = wcn->ctrl_ops->smsm_change_state( - WCN36XX_SMSM_WLAN_TX_ENABLE, - WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); + ret = qcom_smem_state_update_bits(wcn->tx_enable_state, + WCN36XX_SMSM_WLAN_TX_ENABLE | + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY, + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); + if (ret) + goto out_err; return 0; @@ -676,9 +680,9 @@ int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn, * notify chip about new frame through SMSM bus. */ if (is_low && vif_priv->pw_state == WCN36XX_BMPS) { - wcn->ctrl_ops->smsm_change_state( - 0, - WCN36XX_SMSM_WLAN_TX_ENABLE); + qcom_smem_state_update_bits(wcn->tx_rings_empty_state, + WCN36XX_SMSM_WLAN_TX_ENABLE, + WCN36XX_SMSM_WLAN_TX_ENABLE); } else { /* indicate End Of Packet and generate interrupt on descriptor * done. diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c index 7c169abdbafe..8659e3f997d2 100644 --- a/drivers/net/wireless/ath/wcn36xx/main.c +++ b/drivers/net/wireless/ath/wcn36xx/main.c @@ -19,6 +19,9 @@ #include #include #include +#include +#include +#include #include "wcn36xx.h" unsigned int wcn36xx_dbg_mask; @@ -981,48 +984,63 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) } static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, - struct platform_device *pdev) + struct device *dev) { - struct resource *res; + u32 mmio[2]; + int ret; + /* Set TX IRQ */ - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, - "wcnss_wlantx_irq"); - if (!res) { + wcn->tx_irq = irq_of_parse_and_map(dev->of_node, 0); + if (!wcn->tx_irq) { wcn36xx_err("failed to get tx_irq\n"); return -ENOENT; } - wcn->tx_irq = res->start; /* Set RX IRQ */ - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, - "wcnss_wlanrx_irq"); - if (!res) { + wcn->rx_irq = irq_of_parse_and_map(dev->of_node, 1); + if (!wcn->rx_irq) { wcn36xx_err("failed to get rx_irq\n"); return -ENOENT; } - wcn->rx_irq = res->start; + + /* Acquire SMSM tx enable handle */ + wcn->tx_enable_state = qcom_smem_state_get(dev, "tx-enable", + >tx_enable_state_bit); + if (IS_ERR(wcn->tx_enable_state)) { + wcn36xx_err("failed to get tx-enable state\n"); + return -ENOENT; + } + + /* Acquire SMSM tx rings empty handle */ + wcn->tx_rings_empty_state = qcom_smem_state_get(dev, "tx-rings-empty", + >tx_rings_empty_state_bit); + if (IS_ERR(wcn->tx_rings_empty_state)) { +
[PATCH 3/4] wcn36xx: Transition driver to SMD client
The wcn36xx wifi driver follows the life cycle of the WLAN_CTRL SMD channel, as such it should be a SMD client. This patch makes this transition, now that we have the necessary frameworks available. Signed-off-by: Bjorn Andersson--- drivers/net/wireless/ath/wcn36xx/Kconfig | 2 +- drivers/net/wireless/ath/wcn36xx/dxe.c | 16 +++-- drivers/net/wireless/ath/wcn36xx/main.c| 111 + drivers/net/wireless/ath/wcn36xx/smd.c | 26 --- drivers/net/wireless/ath/wcn36xx/smd.h | 4 ++ drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 21 ++ 6 files changed, 99 insertions(+), 81 deletions(-) diff --git a/drivers/net/wireless/ath/wcn36xx/Kconfig b/drivers/net/wireless/ath/wcn36xx/Kconfig index 591ebaea8265..394fe5b77c90 100644 --- a/drivers/net/wireless/ath/wcn36xx/Kconfig +++ b/drivers/net/wireless/ath/wcn36xx/Kconfig @@ -1,6 +1,6 @@ config WCN36XX tristate "Qualcomm Atheros WCN3660/3680 support" - depends on MAC80211 && HAS_DMA + depends on MAC80211 && HAS_DMA && QCOM_SMD ---help--- This module adds support for wireless adapters based on Qualcomm Atheros WCN3660 and WCN3680 mobile chipsets. diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c index f8dfa05b290a..47f3937a7ab9 100644 --- a/drivers/net/wireless/ath/wcn36xx/dxe.c +++ b/drivers/net/wireless/ath/wcn36xx/dxe.c @@ -23,6 +23,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include +#include #include "wcn36xx.h" #include "txrx.h" @@ -150,9 +151,12 @@ int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn) goto out_err; /* Initialize SMSM state Clear TX Enable RING EMPTY STATE */ - ret = wcn->ctrl_ops->smsm_change_state( - WCN36XX_SMSM_WLAN_TX_ENABLE, - WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); + ret = qcom_smem_state_update_bits(wcn->tx_enable_state, + WCN36XX_SMSM_WLAN_TX_ENABLE | + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY, + WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY); + if (ret) + goto out_err; return 0; @@ -676,9 +680,9 @@ int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn, * notify chip about new frame through SMSM bus. */ if (is_low && vif_priv->pw_state == WCN36XX_BMPS) { - wcn->ctrl_ops->smsm_change_state( - 0, - WCN36XX_SMSM_WLAN_TX_ENABLE); + qcom_smem_state_update_bits(wcn->tx_rings_empty_state, + WCN36XX_SMSM_WLAN_TX_ENABLE, + WCN36XX_SMSM_WLAN_TX_ENABLE); } else { /* indicate End Of Packet and generate interrupt on descriptor * done. diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c index 7c169abdbafe..8659e3f997d2 100644 --- a/drivers/net/wireless/ath/wcn36xx/main.c +++ b/drivers/net/wireless/ath/wcn36xx/main.c @@ -19,6 +19,9 @@ #include #include #include +#include +#include +#include #include "wcn36xx.h" unsigned int wcn36xx_dbg_mask; @@ -981,48 +984,63 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) } static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, - struct platform_device *pdev) + struct device *dev) { - struct resource *res; + u32 mmio[2]; + int ret; + /* Set TX IRQ */ - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, - "wcnss_wlantx_irq"); - if (!res) { + wcn->tx_irq = irq_of_parse_and_map(dev->of_node, 0); + if (!wcn->tx_irq) { wcn36xx_err("failed to get tx_irq\n"); return -ENOENT; } - wcn->tx_irq = res->start; /* Set RX IRQ */ - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, - "wcnss_wlanrx_irq"); - if (!res) { + wcn->rx_irq = irq_of_parse_and_map(dev->of_node, 1); + if (!wcn->rx_irq) { wcn36xx_err("failed to get rx_irq\n"); return -ENOENT; } - wcn->rx_irq = res->start; + + /* Acquire SMSM tx enable handle */ + wcn->tx_enable_state = qcom_smem_state_get(dev, "tx-enable", + >tx_enable_state_bit); + if (IS_ERR(wcn->tx_enable_state)) { + wcn36xx_err("failed to get tx-enable state\n"); + return -ENOENT; + } + + /* Acquire SMSM tx rings empty handle */ + wcn->tx_rings_empty_state = qcom_smem_state_get(dev, "tx-rings-empty", + >tx_rings_empty_state_bit); + if