mt76: mt76u: reduce rx memory footprint
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>
This commit is contained in:
parent
e991c4c299
commit
14663f0c8d
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue