]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
UBUNTU: SAUCE: rtw88: 8723d: 11N chips don't support H2C queue
authorPing-Ke Shih <pkshih@realtek.com>
Wed, 14 Aug 2019 12:38:32 +0000 (20:38 +0800)
committerSeth Forshee <seth.forshee@canonical.com>
Fri, 20 Mar 2020 21:31:30 +0000 (16:31 -0500)
BugLink: https://bugs.launchpad.net/bugs/1780590
H2C queue is used to send command to firmware. Since 8723D doesn't support
this queue, this commit check wlan_cpu flag to avoid to set H2C related
registers.

Change-Id: I6d9014fa0c533f15c6bd8a25c320d0d5ed6afb0a
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/net/wireless/realtek/rtw88/mac.c
drivers/net/wireless/realtek/rtw88/pci.c

index f841606a91278ccaacbd86bc4a1a951d24c31fc0..161c60d8df793d018e53973d1675f5e4ed4f7c60 100644 (file)
@@ -1015,7 +1015,8 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev)
 
        rtw_write8(rtwdev, REG_CR, 0);
        rtw_write8(rtwdev, REG_CR, MAC_TRX_ENABLE);
-       rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL);
+       if (rtw_chip_wcpu_11ac(rtwdev))
+               rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL);
 
        return 0;
 }
@@ -1134,6 +1135,9 @@ static int init_h2c(struct rtw_dev *rtwdev)
        u32 h2cq_free;
        u32 wp, rp;
 
+       if (rtw_chip_wcpu_11n(rtwdev))
+               return 0;
+
        h2cq_addr = fifo->rsvd_h2cq_addr << TX_PAGE_SIZE_SHIFT;
        h2cq_size = RSVD_PG_H2CQ_NUM << TX_PAGE_SIZE_SHIFT;
 
index f36c4682ffa85524270364874b37c4c376955b39..af5094e7976f75572e38daaf4ad1227d28d2c04b 100644 (file)
@@ -401,12 +401,14 @@ 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);
 
-       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;
-       rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.wp = 0;
-       rtw_write16(rtwdev, RTK_PCI_TXBD_NUM_H2CQ, len);
-       rtw_write32(rtwdev, RTK_PCI_TXBD_DESA_H2CQ, dma);
+       if (!rtw_chip_wcpu_11n(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;
+               rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.wp = 0;
+               rtw_write16(rtwdev, RTK_PCI_TXBD_NUM_H2CQ, len);
+               rtw_write32(rtwdev, RTK_PCI_TXBD_DESA_H2CQ, dma);
+       }
 
        len = rtwpci->tx_rings[RTW_TX_QUEUE_BK].r.len;
        dma = rtwpci->tx_rings[RTW_TX_QUEUE_BK].r.dma;
@@ -461,8 +463,9 @@ 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 */
-       rtw_write32_set(rtwdev, RTK_PCI_TXBD_H2CQ_CSR,
-                       BIT_CLR_H2CQ_HOST_IDX | BIT_CLR_H2CQ_HW_IDX);
+       if (rtw_chip_wcpu_11ac(rtwdev))
+               rtw_write32_set(rtwdev, RTK_PCI_TXBD_H2CQ_CSR,
+                               BIT_CLR_H2CQ_HOST_IDX | BIT_CLR_H2CQ_HW_IDX);
 }
 
 static void rtw_pci_reset_trx_ring(struct rtw_dev *rtwdev)
@@ -479,7 +482,9 @@ static void rtw_pci_enable_interrupt(struct rtw_dev *rtwdev,
 
        rtw_write32(rtwdev, RTK_PCI_HIMR0, rtwpci->irq_mask[0]);
        rtw_write32(rtwdev, RTK_PCI_HIMR1, rtwpci->irq_mask[1]);
-       rtw_write32(rtwdev, RTK_PCI_HIMR3, rtwpci->irq_mask[3]);
+       if (rtw_chip_wcpu_11ac(rtwdev))
+               rtw_write32(rtwdev, RTK_PCI_HIMR3, rtwpci->irq_mask[3]);
+
        rtwpci->irq_enabled = true;
 
        spin_unlock_irqrestore(&rtwpci->hwirq_lock, flags);
@@ -497,7 +502,9 @@ static void rtw_pci_disable_interrupt(struct rtw_dev *rtwdev,
 
        rtw_write32(rtwdev, RTK_PCI_HIMR0, 0);
        rtw_write32(rtwdev, RTK_PCI_HIMR1, 0);
-       rtw_write32(rtwdev, RTK_PCI_HIMR3, 0);
+       if (rtw_chip_wcpu_11ac(rtwdev))
+               rtw_write32(rtwdev, RTK_PCI_HIMR3, 0);
+
        rtwpci->irq_enabled = false;
 
 out:
@@ -961,13 +968,17 @@ 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);
-       irq_status[3] = rtw_read32(rtwdev, RTK_PCI_HISR3);
+       if (rtw_chip_wcpu_11ac(rtwdev))
+               irq_status[3] = rtw_read32(rtwdev, RTK_PCI_HISR3);
+       else
+               irq_status[3] = 0;
        irq_status[0] &= rtwpci->irq_mask[0];
        irq_status[1] &= rtwpci->irq_mask[1];
        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]);
-       rtw_write32(rtwdev, RTK_PCI_HISR3, irq_status[3]);
+       if (rtw_chip_wcpu_11ac(rtwdev))
+               rtw_write32(rtwdev, RTK_PCI_HISR3, irq_status[3]);
 
        spin_unlock_irqrestore(&rtwpci->hwirq_lock, flags);
 }