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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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


+5 −1
Original line number Original line Diff line number Diff line
@@ -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;
+26 −3
Original line number Original line Diff line number Diff line
@@ -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;


+9 −1
Original line number Original line Diff line number Diff line
@@ -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);
+6 −1
Original line number Original line Diff line number Diff line
@@ -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;