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: Govind Singh <govinds@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1597309466-19688-11-git-send-email-kvalo@codeaurora.org
This commit is contained in:
Govind Singh 2020-08-13 12:04:26 +03:00 коммит произвёл Kalle Valo
Родитель 7f4beda2ba
Коммит 1ff8ed786d
5 изменённых файлов: 47 добавлений и 7 удалений

Просмотреть файл

@ -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
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[] = {
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)
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)
} }
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)
} }
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)
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,
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 {
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 {
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);
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[] = {
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,
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;