Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a34d7bcb authored by Sergei Maksimenko's avatar Sergei Maksimenko Committed by Kalle Valo
Browse files

qtnfmac: enable reloading of qtnfmac kernel modules



This patch enables rmmod/insmod for qtnfmac kernel modules:
- do not 'pin' pci device in order to disable it on module unload
- implement card reset procedure
- restore PCI bar addresses for restarted wireless card

Signed-off-by: default avatarSergei Maksimenko <smaksimenko@quantenna.com>
Signed-off-by: default avatarSergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 1d5e3b90
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -162,6 +162,17 @@ static void qtnf_deassert_intx(struct qtnf_pcie_bus_priv *priv)
	qtnf_non_posted_write(cfg, reg);
}

static void qtnf_reset_card(struct qtnf_pcie_bus_priv *priv)
{
	const u32 data = QTN_PEARL_IPC_IRQ_WORD(QTN_PEARL_LHOST_EP_RESET);
	void __iomem *reg = priv->sysctl_bar +
			    QTN_PEARL_SYSCTL_LHOST_IRQ_OFFSET;

	qtnf_non_posted_write(data, reg);
	msleep(QTN_EP_RESET_WAIT_MS);
	pci_restore_state(priv->pdev);
}

static void qtnf_ipc_gen_ep_int(void *arg)
{
	const struct qtnf_pcie_bus_priv *priv = arg;
@@ -1308,7 +1319,6 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
		goto err_base;
	}

	pcim_pin_device(pdev);
	pci_set_master(pdev);

	ret = qtnf_pcie_init_irq(pcie_priv);
@@ -1323,6 +1333,8 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
		goto err_base;
	}

	pci_save_state(pdev);

	ret = qtnf_pcie_init_shm_ipc(pcie_priv);
	if (ret < 0) {
		pr_err("PCIE SHM IPC init failed\n");
@@ -1425,6 +1437,7 @@ static void qtnf_pcie_remove(struct pci_dev *pdev)
	qtnf_debugfs_remove(bus);

	qtnf_pcie_free_shm_ipc(priv);
	qtnf_reset_card(priv);
}

#ifdef CONFIG_PM_SLEEP
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@
/* state transition timeouts */
#define QTN_FW_DL_TIMEOUT_MS	3000
#define QTN_FW_QLINK_TIMEOUT_MS	30000
#define QTN_EP_RESET_WAIT_MS	1000

#define PCIE_HDP_INT_RX_BITS (0		\
	| PCIE_HDP_INT_EP_TXDMA		\
+1 −0
Original line number Diff line number Diff line
@@ -351,5 +351,6 @@

#define QTN_PEARL_IPC_IRQ_WORD(irq)	(BIT(irq) | BIT(irq + 16))
#define QTN_PEARL_LHOST_IPC_IRQ		(6)
#define QTN_PEARL_LHOST_EP_RESET	(7)

#endif /* __PEARL_PCIE_H */