diff options
Diffstat (limited to 'sys/contrib/dev/rtw88/pci.c')
| -rw-r--r-- | sys/contrib/dev/rtw88/pci.c | 55 | 
1 files changed, 47 insertions, 8 deletions
diff --git a/sys/contrib/dev/rtw88/pci.c b/sys/contrib/dev/rtw88/pci.c index 6f2fedea116c..e4cbaae4646f 100644 --- a/sys/contrib/dev/rtw88/pci.c +++ b/sys/contrib/dev/rtw88/pci.c @@ -16,6 +16,7 @@  #include "fw.h"  #include "ps.h"  #include "debug.h" +#include "mac.h"  #if defined(__FreeBSD__)  #include <sys/rman.h>  #include <linux/pm.h> @@ -28,7 +29,7 @@ module_param_named(disable_aspm, rtw_pci_disable_aspm, bool, 0644);  MODULE_PARM_DESC(disable_msi, "Set Y to disable MSI interrupt support");  MODULE_PARM_DESC(disable_aspm, "Set Y to disable PCI ASPM support"); -static u32 rtw_pci_tx_queue_idx_addr[] = { +static const u32 rtw_pci_tx_queue_idx_addr[] = {  	[RTW_TX_QUEUE_BK]	= RTK_PCI_TXBD_IDX_BKQ,  	[RTW_TX_QUEUE_BE]	= RTK_PCI_TXBD_IDX_BEQ,  	[RTW_TX_QUEUE_VI]	= RTK_PCI_TXBD_IDX_VIQ, @@ -451,7 +452,7 @@ static void rtw_pci_reset_buf_desc(struct rtw_dev *rtwdev)  	dma = rtwpci->tx_rings[RTW_TX_QUEUE_BCN].r.dma;  	rtw_write32(rtwdev, RTK_PCI_TXBD_DESA_BCNQ, dma); -	if (!rtw_chip_wcpu_11n(rtwdev)) { +	if (!rtw_chip_wcpu_8051(rtwdev)) {  		len = rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.len;  		dma = rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.dma;  		rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.rp = 0; @@ -513,7 +514,7 @@ static void rtw_pci_reset_buf_desc(struct rtw_dev *rtwdev)  	rtw_write32(rtwdev, RTK_PCI_TXBD_RWPTR_CLR, 0xffffffff);  	/* reset H2C Queue index in a single write */ -	if (rtw_chip_wcpu_11ac(rtwdev)) +	if (rtw_chip_wcpu_3081(rtwdev))  		rtw_write32_set(rtwdev, RTK_PCI_TXBD_H2CQ_CSR,  				BIT_CLR_H2CQ_HOST_IDX | BIT_CLR_H2CQ_HW_IDX);  } @@ -533,7 +534,7 @@ static void rtw_pci_enable_interrupt(struct rtw_dev *rtwdev,  	rtw_write32(rtwdev, RTK_PCI_HIMR0, rtwpci->irq_mask[0] & ~imr0_unmask);  	rtw_write32(rtwdev, RTK_PCI_HIMR1, rtwpci->irq_mask[1]); -	if (rtw_chip_wcpu_11ac(rtwdev)) +	if (rtw_chip_wcpu_3081(rtwdev))  		rtw_write32(rtwdev, RTK_PCI_HIMR3, rtwpci->irq_mask[3]);  	rtwpci->irq_enabled = true; @@ -553,7 +554,7 @@ static void rtw_pci_disable_interrupt(struct rtw_dev *rtwdev,  	rtw_write32(rtwdev, RTK_PCI_HIMR0, 0);  	rtw_write32(rtwdev, RTK_PCI_HIMR1, 0); -	if (rtw_chip_wcpu_11ac(rtwdev)) +	if (rtw_chip_wcpu_3081(rtwdev))  		rtw_write32(rtwdev, RTK_PCI_HIMR3, 0);  	rtwpci->irq_enabled = false; @@ -1181,7 +1182,7 @@ static void rtw_pci_irq_recognized(struct rtw_dev *rtwdev,  	irq_status[0] = rtw_read32(rtwdev, RTK_PCI_HISR0);  	irq_status[1] = rtw_read32(rtwdev, RTK_PCI_HISR1); -	if (rtw_chip_wcpu_11ac(rtwdev)) +	if (rtw_chip_wcpu_3081(rtwdev))  		irq_status[3] = rtw_read32(rtwdev, RTK_PCI_HISR3);  	else  		irq_status[3] = 0; @@ -1190,7 +1191,7 @@ static void rtw_pci_irq_recognized(struct rtw_dev *rtwdev,  	irq_status[3] &= rtwpci->irq_mask[3];  	rtw_write32(rtwdev, RTK_PCI_HISR0, irq_status[0]);  	rtw_write32(rtwdev, RTK_PCI_HISR1, irq_status[1]); -	if (rtw_chip_wcpu_11ac(rtwdev)) +	if (rtw_chip_wcpu_3081(rtwdev))  		rtw_write32(rtwdev, RTK_PCI_HISR3, irq_status[3]);  	spin_unlock_irqrestore(&rtwpci->hwirq_lock, flags); @@ -1670,7 +1671,7 @@ static void rtw_pci_destroy(struct rtw_dev *rtwdev, struct pci_dev *pdev)  	rtw_pci_io_unmapping(rtwdev, pdev);  } -static struct rtw_hci_ops rtw_pci_ops = { +static const struct rtw_hci_ops rtw_pci_ops = {  	.tx_write = rtw_pci_tx_write,  	.tx_kick_off = rtw_pci_tx_kick_off,  	.flush_queues = rtw_pci_flush_queues, @@ -1681,6 +1682,7 @@ static struct rtw_hci_ops rtw_pci_ops = {  	.link_ps = rtw_pci_link_ps,  	.interface_cfg = rtw_pci_interface_cfg,  	.dynamic_rx_agg = NULL, +	.write_firmware_page = rtw_write_firmware_page,  	.read8 = rtw_pci_read8,  	.read16 = rtw_pci_read16, @@ -1784,6 +1786,43 @@ static void rtw_pci_napi_deinit(struct rtw_dev *rtwdev)  	free_netdev(rtwpci->netdev);  } +static pci_ers_result_t rtw_pci_io_err_detected(struct pci_dev *pdev, +						pci_channel_state_t state) +{ +	struct net_device *netdev = pci_get_drvdata(pdev); + +	netif_device_detach(netdev); + +	return PCI_ERS_RESULT_NEED_RESET; +} + +static pci_ers_result_t rtw_pci_io_slot_reset(struct pci_dev *pdev) +{ +	struct ieee80211_hw *hw = pci_get_drvdata(pdev); +	struct rtw_dev *rtwdev = hw->priv; + +	rtw_fw_recovery(rtwdev); + +	return PCI_ERS_RESULT_RECOVERED; +} + +static void rtw_pci_io_resume(struct pci_dev *pdev) +{ +	struct net_device *netdev = pci_get_drvdata(pdev); + +	/* ack any pending wake events, disable PME */ +	pci_enable_wake(pdev, PCI_D0, 0); + +	netif_device_attach(netdev); +} + +const struct pci_error_handlers rtw_pci_err_handler = { +	.error_detected = rtw_pci_io_err_detected, +	.slot_reset = rtw_pci_io_slot_reset, +	.resume = rtw_pci_io_resume, +}; +EXPORT_SYMBOL(rtw_pci_err_handler); +  int rtw_pci_probe(struct pci_dev *pdev,  		  const struct pci_device_id *id)  {  | 
