OSDN Git Service

qtnfmac: modify Rx descriptors queue setup
authorSergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Wed, 13 Nov 2019 11:06:53 +0000 (11:06 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 14 Nov 2019 15:28:50 +0000 (17:28 +0200)
Rx descriptors queue length is hardware specific. Current common default
value is no more than an accident. So move Rx descriptor queue setup to
platform PCIe backend in the same way as it is already done for Tx.

Signed-off-by: Sergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c
drivers/net/wireless/quantenna/qtnfmac/pcie/pcie_priv.h
drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c
drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie.c

index 4824be0..3360b83 100644 (file)
@@ -33,7 +33,7 @@ static unsigned int tx_bd_size_param;
 module_param(tx_bd_size_param, uint, 0644);
 MODULE_PARM_DESC(tx_bd_size_param, "Tx descriptors queue size");
 
-static unsigned int rx_bd_size_param = 256;
+static unsigned int rx_bd_size_param;
 module_param(rx_bd_size_param, uint, 0644);
 MODULE_PARM_DESC(rx_bd_size_param, "Rx descriptors queue size");
 
@@ -341,7 +341,6 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        bus->fw_state = QTNF_FW_STATE_DETACHED;
        pcie_priv->pdev = pdev;
        pcie_priv->tx_stopped = 0;
-       pcie_priv->rx_bd_num = rx_bd_size_param;
        pcie_priv->flashboot = flashboot;
 
        if (fw_blksize_param > QTN_PCIE_MAX_FW_BUFSZ)
@@ -381,7 +380,7 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        pcie_priv->epmem_bar = epmem_bar;
        pci_save_state(pdev);
 
-       ret = pcie_priv->probe_cb(bus, tx_bd_size_param);
+       ret = pcie_priv->probe_cb(bus, tx_bd_size_param, rx_bd_size_param);
        if (ret)
                goto error;
 
index 5e8b9cb..8bc4300 100644 (file)
@@ -23,7 +23,8 @@
 struct qtnf_pcie_bus_priv {
        struct pci_dev *pdev;
 
-       int (*probe_cb)(struct qtnf_bus *bus, unsigned int tx_bd_size);
+       int (*probe_cb)(struct qtnf_bus *bus, unsigned int tx_bd_size,
+                       unsigned int rx_bd_size);
        void (*remove_cb)(struct qtnf_bus *bus);
        int (*suspend_cb)(struct qtnf_bus *bus);
        int (*resume_cb)(struct qtnf_bus *bus);
index 5ec1c9b..a501a1f 100644 (file)
@@ -24,6 +24,7 @@
 #include "debug.h"
 
 #define PEARL_TX_BD_SIZE_DEFAULT       32
+#define PEARL_RX_BD_SIZE_DEFAULT       256
 
 struct qtnf_pearl_bda {
        __le16 bda_len;
@@ -397,7 +398,8 @@ static int pearl_hhbm_init(struct qtnf_pcie_pearl_state *ps)
 }
 
 static int qtnf_pcie_pearl_init_xfer(struct qtnf_pcie_pearl_state *ps,
-                                    unsigned int tx_bd_size)
+                                    unsigned int tx_bd_size,
+                                    unsigned int rx_bd_size)
 {
        struct qtnf_pcie_bus_priv *priv = &ps->base;
        int ret;
@@ -409,28 +411,29 @@ static int qtnf_pcie_pearl_init_xfer(struct qtnf_pcie_pearl_state *ps,
        val = tx_bd_size * sizeof(struct qtnf_pearl_tx_bd);
 
        if (!is_power_of_2(tx_bd_size) || val > PCIE_HHBM_MAX_SIZE) {
-               pr_warn("bad tx_bd_size value %u\n", tx_bd_size);
+               pr_warn("invalid tx_bd_size value %u, use default %u\n",
+                       tx_bd_size, PEARL_TX_BD_SIZE_DEFAULT);
                priv->tx_bd_num = PEARL_TX_BD_SIZE_DEFAULT;
        } else {
                priv->tx_bd_num = tx_bd_size;
        }
 
-       priv->rx_bd_w_index = 0;
-       priv->rx_bd_r_index = 0;
+       if (rx_bd_size == 0)
+               rx_bd_size = PEARL_RX_BD_SIZE_DEFAULT;
 
-       if (!priv->rx_bd_num || !is_power_of_2(priv->rx_bd_num)) {
-               pr_err("rx_bd_size_param %u is not power of two\n",
-                      priv->rx_bd_num);
-               return -EINVAL;
-       }
+       val = rx_bd_size * sizeof(dma_addr_t);
 
-       val = priv->rx_bd_num * sizeof(dma_addr_t);
-       if (val > PCIE_HHBM_MAX_SIZE) {
-               pr_err("rx_bd_size_param %u is too large\n",
-                      priv->rx_bd_num);
-               return -EINVAL;
+       if (!is_power_of_2(rx_bd_size) || val > PCIE_HHBM_MAX_SIZE) {
+               pr_warn("invalid rx_bd_size value %u, use default %u\n",
+                       rx_bd_size, PEARL_RX_BD_SIZE_DEFAULT);
+               priv->rx_bd_num = PEARL_RX_BD_SIZE_DEFAULT;
+       } else {
+               priv->rx_bd_num = rx_bd_size;
        }
 
+       priv->rx_bd_w_index = 0;
+       priv->rx_bd_r_index = 0;
+
        ret = pearl_hhbm_init(ps);
        if (ret) {
                pr_err("failed to init h/w queues\n");
@@ -1064,7 +1067,8 @@ static u64 qtnf_pearl_dma_mask_get(void)
 #endif
 }
 
-static int qtnf_pcie_pearl_probe(struct qtnf_bus *bus, unsigned int tx_bd_size)
+static int qtnf_pcie_pearl_probe(struct qtnf_bus *bus, unsigned int tx_bd_size,
+                                unsigned int rx_bd_size)
 {
        struct qtnf_shm_ipc_int ipc_int;
        struct qtnf_pcie_pearl_state *ps = get_bus_priv(bus);
@@ -1079,7 +1083,7 @@ static int qtnf_pcie_pearl_probe(struct qtnf_bus *bus, unsigned int tx_bd_size)
        ps->bda = ps->base.epmem_bar;
        writel(ps->base.msi_enabled, &ps->bda->bda_rc_msi_enabled);
 
-       ret = qtnf_pcie_pearl_init_xfer(ps, tx_bd_size);
+       ret = qtnf_pcie_pearl_init_xfer(ps, tx_bd_size, rx_bd_size);
        if (ret) {
                pr_err("PCIE xfer init failed\n");
                return ret;
index 1f91088..ef255fb 100644 (file)
@@ -23,6 +23,7 @@
 #include "debug.h"
 
 #define TOPAZ_TX_BD_SIZE_DEFAULT       128
+#define TOPAZ_RX_BD_SIZE_DEFAULT       256
 
 struct qtnf_topaz_tx_bd {
        __le32 addr;
@@ -331,7 +332,8 @@ static void qtnf_topaz_free_xfer_buffers(struct qtnf_pcie_topaz_state *ts)
 }
 
 static int qtnf_pcie_topaz_init_xfer(struct qtnf_pcie_topaz_state *ts,
-                                    unsigned int tx_bd_size)
+                                    unsigned int tx_bd_size,
+                                    unsigned int rx_bd_size)
 {
        struct qtnf_topaz_bda __iomem *bda = ts->bda;
        struct qtnf_pcie_bus_priv *priv = &ts->base;
@@ -349,6 +351,17 @@ static int qtnf_pcie_topaz_init_xfer(struct qtnf_pcie_topaz_state *ts,
 
        priv->tx_bd_num = tx_bd_size;
        qtnf_non_posted_write(priv->tx_bd_num, &bda->bda_rc_tx_bd_num);
+
+       if (rx_bd_size == 0)
+               rx_bd_size = TOPAZ_RX_BD_SIZE_DEFAULT;
+
+       if (rx_bd_size > TOPAZ_RX_BD_SIZE_DEFAULT) {
+               pr_warn("RX BD queue cannot exceed %d\n",
+                       TOPAZ_RX_BD_SIZE_DEFAULT);
+               rx_bd_size = TOPAZ_RX_BD_SIZE_DEFAULT;
+       }
+
+       priv->rx_bd_num = rx_bd_size;
        qtnf_non_posted_write(priv->rx_bd_num, &bda->bda_rc_rx_bd_num);
 
        priv->rx_bd_w_index = 0;
@@ -1111,7 +1124,8 @@ static u64 qtnf_topaz_dma_mask_get(void)
        return DMA_BIT_MASK(32);
 }
 
-static int qtnf_pcie_topaz_probe(struct qtnf_bus *bus, unsigned int tx_bd_num)
+static int qtnf_pcie_topaz_probe(struct qtnf_bus *bus,
+                                unsigned int tx_bd_num, unsigned int rx_bd_num)
 {
        struct qtnf_pcie_topaz_state *ts = get_bus_priv(bus);
        struct pci_dev *pdev = ts->base.pdev;
@@ -1145,7 +1159,7 @@ static int qtnf_pcie_topaz_probe(struct qtnf_bus *bus, unsigned int tx_bd_num)
                return ret;
        }
 
-       ret = qtnf_pcie_topaz_init_xfer(ts, tx_bd_num);
+       ret = qtnf_pcie_topaz_init_xfer(ts, tx_bd_num, rx_bd_num);
        if (ret) {
                pr_err("PCIE xfer init failed\n");
                return ret;