mt76: mt76u: reduce rx memory footprint
authorLorenzo Bianconi <lorenzo@kernel.org>
Thu, 20 Jun 2019 10:39:36 +0000 (12:39 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 27 Jun 2019 10:58:13 +0000 (12:58 +0200)
Reduce rx memory footprint allocating just one SG buffer since for the
moment we support just 3839B as maximal size of an A-MSDU.
Introduce different SG_MAX_SIZE definitions for TX and RX sides.
Moreover set q->buf_size to PAGE_SIZE even for SG case.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c
drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c
drivers/net/wireless/mediatek/mt76/usb.c

index 00ae1d6..e10ecbb 100644 (file)
@@ -382,7 +382,8 @@ enum mt76u_out_ep {
        __MT_EP_OUT_MAX,
 };
 
-#define MT_SG_MAX_SIZE         8
+#define MT_TX_SG_MAX_SIZE      8
+#define MT_RX_SG_MAX_SIZE      1
 #define MT_NUM_TX_ENTRIES      256
 #define MT_NUM_RX_ENTRIES      128
 #define MCU_RESP_URB_SIZE      1024
index 7c38ec4..5b9701c 100644 (file)
@@ -191,7 +191,7 @@ static int mt76x0u_register_device(struct mt76x02_dev *dev)
 
        /* check hw sg support in order to enable AMSDU */
        if (dev->mt76.usb.sg_en)
-               hw->max_tx_fragments = MT_SG_MAX_SIZE;
+               hw->max_tx_fragments = MT_TX_SG_MAX_SIZE;
        else
                hw->max_tx_fragments = 1;
 
index f2c57d5..94f52f9 100644 (file)
@@ -225,7 +225,7 @@ int mt76x2u_register_device(struct mt76x02_dev *dev)
 
        /* check hw sg support in order to enable AMSDU */
        if (dev->mt76.usb.sg_en)
-               hw->max_tx_fragments = MT_SG_MAX_SIZE;
+               hw->max_tx_fragments = MT_TX_SG_MAX_SIZE;
        else
                hw->max_tx_fragments = 1;
 
index bbaa136..5a501e5 100644 (file)
@@ -333,12 +333,13 @@ mt76u_refill_rx(struct mt76_dev *dev, struct urb *urb, int nsgs, gfp_t gfp)
 }
 
 static int
-mt76u_urb_alloc(struct mt76_dev *dev, struct mt76_queue_entry *e)
+mt76u_urb_alloc(struct mt76_dev *dev, struct mt76_queue_entry *e,
+               int sg_max_size)
 {
        unsigned int size = sizeof(struct urb);
 
        if (dev->usb.sg_en)
-               size += MT_SG_MAX_SIZE * sizeof(struct scatterlist);
+               size += sg_max_size * sizeof(struct scatterlist);
 
        e->urb = kzalloc(size, GFP_KERNEL);
        if (!e->urb)
@@ -357,11 +358,12 @@ mt76u_rx_urb_alloc(struct mt76_dev *dev, struct mt76_queue_entry *e)
 {
        int err;
 
-       err = mt76u_urb_alloc(dev, e);
+       err = mt76u_urb_alloc(dev, e, MT_RX_SG_MAX_SIZE);
        if (err)
                return err;
 
-       return mt76u_refill_rx(dev, e->urb, MT_SG_MAX_SIZE, GFP_KERNEL);
+       return mt76u_refill_rx(dev, e->urb, MT_RX_SG_MAX_SIZE,
+                              GFP_KERNEL);
 }
 
 static void mt76u_urb_free(struct urb *urb)
@@ -577,8 +579,9 @@ static int mt76u_alloc_rx(struct mt76_dev *dev)
        if (!q->entry)
                return -ENOMEM;
 
-       q->buf_size = dev->usb.sg_en ? MT_RX_BUF_SIZE : PAGE_SIZE;
        q->ndesc = MT_NUM_RX_ENTRIES;
+       q->buf_size = PAGE_SIZE;
+
        for (i = 0; i < q->ndesc; i++) {
                err = mt76u_rx_urb_alloc(dev, &q->entry[i]);
                if (err < 0)
@@ -735,7 +738,7 @@ mt76u_tx_setup_buffers(struct mt76_dev *dev, struct sk_buff *skb,
                urb->transfer_buffer = skb->data;
                return 0;
        } else {
-               sg_init_table(urb->sg, MT_SG_MAX_SIZE);
+               sg_init_table(urb->sg, MT_TX_SG_MAX_SIZE);
                urb->num_sgs = skb_to_sgvec(skb, urb->sg, 0, skb->len);
                if (urb->num_sgs == 0)
                        return -ENOMEM;
@@ -829,7 +832,8 @@ static int mt76u_alloc_tx(struct mt76_dev *dev)
 
                q->ndesc = MT_NUM_TX_ENTRIES;
                for (j = 0; j < q->ndesc; j++) {
-                       err = mt76u_urb_alloc(dev, &q->entry[j]);
+                       err = mt76u_urb_alloc(dev, &q->entry[j],
+                                             MT_TX_SG_MAX_SIZE);
                        if (err < 0)
                                return err;
                }