Commit 1ff8ed78 authored by Govind Singh's avatar Govind Singh Committed by Kalle Valo

ath11k: use remoteproc only with AHB devices

QCA6390 and other PCI devices use MHI based firmware loading and do not use
remoteproc, so enable it only for AHB devices.

Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.1.0.1-01238-QCAHKSWPL_SILICONZ-2
Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1597309466-19688-11-git-send-email-kvalo@codeaurora.org
parent 7f4beda2
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
config ATH11K config ATH11K
tristate "Qualcomm Technologies 802.11ax chipset support" tristate "Qualcomm Technologies 802.11ax chipset support"
depends on MAC80211 && HAS_DMA depends on MAC80211 && HAS_DMA
depends on REMOTEPROC
depends on CRYPTO_MICHAEL_MIC depends on CRYPTO_MICHAEL_MIC
select ATH_COMMON select ATH_COMMON
select QCOM_QMI_HELPERS select QCOM_QMI_HELPERS
...@@ -15,6 +14,7 @@ config ATH11K ...@@ -15,6 +14,7 @@ config ATH11K
config ATH11K_AHB config ATH11K_AHB
tristate "Atheros ath11k AHB support" tristate "Atheros ath11k AHB support"
depends on ATH11K depends on ATH11K
depends on REMOTEPROC
help help
This module adds support for AHB bus This module adds support for AHB bus
......
...@@ -25,6 +25,10 @@ static const struct of_device_id ath11k_ahb_of_match[] = { ...@@ -25,6 +25,10 @@ static const struct of_device_id ath11k_ahb_of_match[] = {
MODULE_DEVICE_TABLE(of, ath11k_ahb_of_match); MODULE_DEVICE_TABLE(of, ath11k_ahb_of_match);
static const struct ath11k_bus_params ath11k_ahb_bus_params = {
.mhi_support = false,
};
/* Target firmware's Copy Engine configuration. */ /* Target firmware's Copy Engine configuration. */
static const struct ce_pipe_config target_ce_config_wlan[] = { static const struct ce_pipe_config target_ce_config_wlan[] = {
/* CE0: host->target HTC control and raw streams */ /* CE0: host->target HTC control and raw streams */
...@@ -855,7 +859,7 @@ static int ath11k_ahb_probe(struct platform_device *pdev) ...@@ -855,7 +859,7 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
return ret; return ret;
} }
ab = ath11k_core_alloc(&pdev->dev, 0, ATH11K_BUS_AHB); ab = ath11k_core_alloc(&pdev->dev, 0, ATH11K_BUS_AHB, &ath11k_ahb_bus_params);
if (!ab) { if (!ab) {
dev_err(&pdev->dev, "failed to allocate ath11k base\n"); dev_err(&pdev->dev, "failed to allocate ath11k base\n");
return -ENOMEM; return -ENOMEM;
......
...@@ -756,12 +756,14 @@ int ath11k_core_pre_init(struct ath11k_base *ab) ...@@ -756,12 +756,14 @@ int ath11k_core_pre_init(struct ath11k_base *ab)
} }
EXPORT_SYMBOL(ath11k_core_pre_init); EXPORT_SYMBOL(ath11k_core_pre_init);
int ath11k_core_init(struct ath11k_base *ab) static int ath11k_core_get_rproc(struct ath11k_base *ab)
{ {
struct device *dev = ab->dev; struct device *dev = ab->dev;
struct rproc *prproc; struct rproc *prproc;
phandle rproc_phandle; phandle rproc_phandle;
int ret;
if (ab->bus_params.mhi_support)
return 0;
if (of_property_read_u32(dev->of_node, "qcom,rproc", &rproc_phandle)) { if (of_property_read_u32(dev->of_node, "qcom,rproc", &rproc_phandle)) {
ath11k_err(ab, "failed to get q6_rproc handle\n"); ath11k_err(ab, "failed to get q6_rproc handle\n");
...@@ -775,6 +777,25 @@ int ath11k_core_init(struct ath11k_base *ab) ...@@ -775,6 +777,25 @@ int ath11k_core_init(struct ath11k_base *ab)
} }
ab->tgt_rproc = prproc; ab->tgt_rproc = prproc;
return 0;
}
int ath11k_core_init(struct ath11k_base *ab)
{
int ret;
ret = ath11k_core_get_rproc(ab);
if (ret) {
ath11k_err(ab, "failed to get rproc: %d\n", ret);
return ret;
}
ret = ath11k_init_hw_params(ab);
if (ret) {
ath11k_err(ab, "failed to get hw params %d\n", ret);
return ret;
}
ret = ath11k_core_soc_create(ab); ret = ath11k_core_soc_create(ab);
if (ret) { if (ret) {
ath11k_err(ab, "failed to create soc core: %d\n", ret); ath11k_err(ab, "failed to create soc core: %d\n", ret);
...@@ -807,7 +828,8 @@ void ath11k_core_free(struct ath11k_base *ab) ...@@ -807,7 +828,8 @@ void ath11k_core_free(struct ath11k_base *ab)
EXPORT_SYMBOL(ath11k_core_free); EXPORT_SYMBOL(ath11k_core_free);
struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size, struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
enum ath11k_bus bus) enum ath11k_bus bus,
const struct ath11k_bus_params *bus_params)
{ {
struct ath11k_base *ab; struct ath11k_base *ab;
...@@ -830,6 +852,7 @@ struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size, ...@@ -830,6 +852,7 @@ struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
INIT_WORK(&ab->restart_work, ath11k_core_restart); INIT_WORK(&ab->restart_work, ath11k_core_restart);
timer_setup(&ab->rx_replenish_retry, ath11k_ce_rx_replenish_retry, 0); timer_setup(&ab->rx_replenish_retry, ath11k_ce_rx_replenish_retry, 0);
ab->dev = dev; ab->dev = dev;
ab->bus_params = *bus_params;
return ab; return ab;
......
...@@ -580,6 +580,10 @@ struct ath11k_board_data { ...@@ -580,6 +580,10 @@ struct ath11k_board_data {
size_t len; size_t len;
}; };
struct ath11k_bus_params {
bool mhi_support;
};
/* IPQ8074 HW channel counters frequency value in hertz */ /* IPQ8074 HW channel counters frequency value in hertz */
#define IPQ8074_CC_FREQ_HERTZ 320000 #define IPQ8074_CC_FREQ_HERTZ 320000
...@@ -668,7 +672,10 @@ struct ath11k_base { ...@@ -668,7 +672,10 @@ struct ath11k_base {
u32 ext_service_bitmap[WMI_SERVICE_EXT_BM_SIZE]; u32 ext_service_bitmap[WMI_SERVICE_EXT_BM_SIZE];
bool pdevs_macaddr_valid; bool pdevs_macaddr_valid;
int bd_api; int bd_api;
struct ath11k_hw_params hw_params; struct ath11k_hw_params hw_params;
struct ath11k_bus_params bus_params;
const struct firmware *cal_file; const struct firmware *cal_file;
/* Below regd's are protected by ab->data_lock */ /* Below regd's are protected by ab->data_lock */
...@@ -845,7 +852,8 @@ int ath11k_core_pre_init(struct ath11k_base *ab); ...@@ -845,7 +852,8 @@ int ath11k_core_pre_init(struct ath11k_base *ab);
int ath11k_core_init(struct ath11k_base *ath11k); int ath11k_core_init(struct ath11k_base *ath11k);
void ath11k_core_deinit(struct ath11k_base *ath11k); void ath11k_core_deinit(struct ath11k_base *ath11k);
struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size, struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
enum ath11k_bus bus); enum ath11k_bus bus,
const struct ath11k_bus_params *bus_params);
void ath11k_core_free(struct ath11k_base *ath11k); void ath11k_core_free(struct ath11k_base *ath11k);
int ath11k_core_fetch_bdf(struct ath11k_base *ath11k, int ath11k_core_fetch_bdf(struct ath11k_base *ath11k,
struct ath11k_board_data *bd); struct ath11k_board_data *bd);
......
...@@ -27,6 +27,10 @@ static const struct pci_device_id ath11k_pci_id_table[] = { ...@@ -27,6 +27,10 @@ static const struct pci_device_id ath11k_pci_id_table[] = {
MODULE_DEVICE_TABLE(pci, ath11k_pci_id_table); MODULE_DEVICE_TABLE(pci, ath11k_pci_id_table);
static const struct ath11k_bus_params ath11k_pci_bus_params = {
.mhi_support = true,
};
static const struct ath11k_msi_config msi_config = { static const struct ath11k_msi_config msi_config = {
.total_vectors = 32, .total_vectors = 32,
.total_users = 4, .total_users = 4,
...@@ -594,7 +598,8 @@ static int ath11k_pci_probe(struct pci_dev *pdev, ...@@ -594,7 +598,8 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
return -ENOTSUPP; return -ENOTSUPP;
} }
ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI); ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI,
&ath11k_pci_bus_params);
if (!ab) { if (!ab) {
dev_err(&pdev->dev, "failed to allocate ath11k base\n"); dev_err(&pdev->dev, "failed to allocate ath11k base\n");
return -ENOMEM; return -ENOMEM;
......
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