mt76usb: allocate urb and sg as linear data
authorStanislaw Gruszka <sgruszka@redhat.com>
Thu, 21 Mar 2019 15:25:36 +0000 (16:25 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 1 May 2019 11:03:57 +0000 (13:03 +0200)
Alloc sg table at the end of urb structure. This will increase
cache usage.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/usb.c

index 0ae69c2..a80d6ab 100644 (file)
@@ -336,19 +336,19 @@ 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)
 {
-       struct urb *urb;
+       unsigned int size = sizeof(struct urb);
+
+       if (dev->usb.sg_en)
+               size += MT_SG_MAX_SIZE * sizeof(struct scatterlist);
 
-       urb = usb_alloc_urb(0, GFP_KERNEL);
-       if (!urb)
+       e->urb = kzalloc(size, GFP_KERNEL);
+       if (!e->urb)
                return -ENOMEM;
-       e->urb = urb;
 
-       if (dev->usb.sg_en) {
-               urb->sg = devm_kcalloc(dev->dev, MT_SG_MAX_SIZE,
-                                      sizeof(*urb->sg), GFP_KERNEL);
-               if (!urb->sg)
-                       return -ENOMEM;
-       }
+       usb_init_urb(e->urb);
+
+       if (dev->usb.sg_en)
+               e->urb->sg = (struct scatterlist *)(e->urb + 1);
 
        return 0;
 }