* [RFC 0/3] simplify usb layer buffer allocation
@ 2019-02-20 14:05 lorenzo
2019-02-20 14:05 ` [RFC 1/3] mt76: usb: introduce mt76u_fill_bulk_urb routine lorenzo
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: lorenzo @ 2019-02-20 14:05 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sgruszka, lorenzo.bianconi
From: Lorenzo Bianconi <lorenzo@kernel.org>
Simplify usb rx buffer allocation.
Simplify mt76u_tx_build_sg routine
Lorenzo Bianconi (3):
mt76: usb: introduce mt76u_fill_bulk_urb routine
mt76: usb: simplify rx buffer allocation
mt76: usb: simplify mt76u_tx_build_sg routine
drivers/net/wireless/mediatek/mt76/mt76.h | 2 -
drivers/net/wireless/mediatek/mt76/usb.c | 134 +++++++++-------------
2 files changed, 55 insertions(+), 81 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [RFC 1/3] mt76: usb: introduce mt76u_fill_bulk_urb routine
2019-02-20 14:05 [RFC 0/3] simplify usb layer buffer allocation lorenzo
@ 2019-02-20 14:05 ` lorenzo
2019-02-20 14:05 ` [RFC 2/3] mt76: usb: simplify rx buffer allocation lorenzo
2019-02-20 14:05 ` [RFC 3/3] mt76: usb: simplify mt76u_tx_build_sg routine lorenzo
2 siblings, 0 replies; 4+ messages in thread
From: lorenzo @ 2019-02-20 14:05 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sgruszka, lorenzo.bianconi
From: Lorenzo Bianconi <lorenzo@kernel.org>
Add mt76u_fill_bulk_urb routine and remove duplicate code
use to initialize tx/rx urb
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/usb.c | 45 ++++++++++++++----------
1 file changed, 26 insertions(+), 19 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index 62dfd70232fe..c84415caaeaf 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -381,9 +381,10 @@ void mt76u_buf_free(struct mt76u_buf *buf)
}
EXPORT_SYMBOL_GPL(mt76u_buf_free);
-int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index,
- struct mt76u_buf *buf, gfp_t gfp,
- usb_complete_t complete_fn, void *context)
+static void
+mt76u_fill_bulk_urb(struct mt76_dev *dev, int dir, int index,
+ struct mt76u_buf *buf, usb_complete_t complete_fn,
+ void *context)
{
struct usb_interface *intf = to_usb_interface(dev->dev);
struct usb_device *udev = interface_to_usbdev(intf);
@@ -397,6 +398,14 @@ int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index,
usb_fill_bulk_urb(buf->urb, udev, pipe, data, buf->len,
complete_fn, context);
+}
+
+int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index,
+ struct mt76u_buf *buf, gfp_t gfp,
+ usb_complete_t complete_fn, void *context)
+{
+ mt76u_fill_bulk_urb(dev, dir, index, buf, complete_fn,
+ context);
trace_submit_urb(dev, buf->urb);
return usb_submit_urb(buf->urb, gfp);
@@ -732,11 +741,16 @@ static void mt76u_complete_tx(struct urb *urb)
}
static int
-mt76u_tx_build_sg(struct sk_buff *skb, struct urb *urb)
+mt76u_tx_build_sg(struct mt76_dev *dev, struct sk_buff *skb,
+ struct urb *urb)
{
- int nsgs = 1 + skb_shinfo(skb)->nr_frags;
struct sk_buff *iter;
+ int nsgs;
+
+ if (!dev->usb.sg_en)
+ return 0;
+ nsgs = 1 + skb_shinfo(skb)->nr_frags;
skb_walk_frags(skb, iter)
nsgs += 1 + skb_shinfo(iter)->nr_frags;
@@ -754,12 +768,8 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
struct sk_buff *skb, struct mt76_wcid *wcid,
struct ieee80211_sta *sta)
{
- struct usb_interface *intf = to_usb_interface(dev->dev);
- struct usb_device *udev = interface_to_usbdev(intf);
- u8 *data = NULL, ep = q2ep(q->hw_idx);
struct mt76u_buf *buf;
u16 idx = q->tail;
- unsigned int pipe;
int err;
if (q->queued == q->ndesc)
@@ -771,19 +781,16 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
return err;
buf = &q->entry[idx].ubuf;
+ buf->buf = skb->data;
+ buf->len = skb->len;
buf->done = false;
- if (dev->usb.sg_en) {
- err = mt76u_tx_build_sg(skb, buf->urb);
- if (err < 0)
- return err;
- } else {
- data = skb->data;
- }
+ err = mt76u_tx_build_sg(dev, skb, buf->urb);
+ if (err < 0)
+ return err;
- pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[ep]);
- usb_fill_bulk_urb(buf->urb, udev, pipe, data, skb->len,
- mt76u_complete_tx, buf);
+ mt76u_fill_bulk_urb(dev, USB_DIR_OUT, q2ep(q->hw_idx),
+ buf, mt76u_complete_tx, buf);
q->tail = (q->tail + 1) % q->ndesc;
q->entry[idx].skb = skb;
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [RFC 2/3] mt76: usb: simplify rx buffer allocation
2019-02-20 14:05 [RFC 0/3] simplify usb layer buffer allocation lorenzo
2019-02-20 14:05 ` [RFC 1/3] mt76: usb: introduce mt76u_fill_bulk_urb routine lorenzo
@ 2019-02-20 14:05 ` lorenzo
2019-02-20 14:05 ` [RFC 3/3] mt76: usb: simplify mt76u_tx_build_sg routine lorenzo
2 siblings, 0 replies; 4+ messages in thread
From: lorenzo @ 2019-02-20 14:05 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sgruszka, lorenzo.bianconi
From: Lorenzo Bianconi <lorenzo@kernel.org>
Squash mt76u_buf_alloc_sg and mt76u_buf_alloc and remove duplicated code
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/mt76.h | 2 -
drivers/net/wireless/mediatek/mt76/usb.c | 78 +++++++++--------------
2 files changed, 29 insertions(+), 51 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 972f0ca7c818..51a4721df400 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -754,8 +754,6 @@ void mt76u_single_wr(struct mt76_dev *dev, const u8 req,
const u16 offset, const u32 val);
int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf);
void mt76u_deinit(struct mt76_dev *dev);
-int mt76u_buf_alloc(struct mt76_dev *dev, struct mt76u_buf *buf,
- int len, int data_len, gfp_t gfp);
void mt76u_buf_free(struct mt76u_buf *buf);
int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index,
struct mt76u_buf *buf, gfp_t gfp,
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index c84415caaeaf..24bf96de9f9d 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -324,41 +324,42 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76u_buf *buf,
}
static int
-mt76u_buf_alloc_sg(struct mt76_dev *dev, struct mt76u_buf *buf,
- int nsgs, int len, int sglen, gfp_t gfp)
+mt76u_refill_rx(struct mt76_dev *dev, struct mt76_queue *q,
+ struct mt76u_buf *buf, int nsgs, gfp_t gfp)
{
- buf->urb = usb_alloc_urb(0, gfp);
- if (!buf->urb)
- return -ENOMEM;
-
- buf->urb->sg = devm_kcalloc(dev->dev, nsgs, sizeof(*buf->urb->sg),
- gfp);
- if (!buf->urb->sg)
- return -ENOMEM;
-
- sg_init_table(buf->urb->sg, nsgs);
- buf->dev = dev;
-
- return mt76u_fill_rx_sg(dev, buf, nsgs, len, sglen);
+ if (dev->usb.sg_en) {
+ return mt76u_fill_rx_sg(dev, buf, nsgs, q->buf_size,
+ SKB_WITH_OVERHEAD(q->buf_size));
+ } else {
+ buf->buf = page_frag_alloc(&q->rx_page, q->buf_size, gfp);
+ return buf->buf ? 0 : -ENOMEM;
+ }
}
-int mt76u_buf_alloc(struct mt76_dev *dev, struct mt76u_buf *buf,
- int len, int data_len, gfp_t gfp)
+static int
+mt76u_buf_alloc(struct mt76_dev *dev, struct mt76u_buf *buf,
+ gfp_t gfp)
{
struct mt76_queue *q = &dev->q_rx[MT_RXQ_MAIN];
- buf->urb = usb_alloc_urb(0, gfp);
+ buf->len = SKB_WITH_OVERHEAD(q->buf_size);
+ buf->dev = dev;
+
+ buf->urb = usb_alloc_urb(0, GFP_KERNEL);
if (!buf->urb)
return -ENOMEM;
- buf->buf = page_frag_alloc(&q->rx_page, len, gfp);
- if (!buf->buf)
- return -ENOMEM;
+ if (dev->usb.sg_en) {
+ buf->urb->sg = devm_kcalloc(dev->dev, MT_SG_MAX_SIZE,
+ sizeof(*buf->urb->sg),
+ GFP_KERNEL);
+ if (!buf->urb->sg)
+ return -ENOMEM;
- buf->len = data_len;
- buf->dev = dev;
+ sg_init_table(buf->urb->sg, MT_SG_MAX_SIZE);
+ }
- return 0;
+ return mt76u_refill_rx(dev, q, buf, MT_SG_MAX_SIZE, gfp);
}
void mt76u_buf_free(struct mt76u_buf *buf)
@@ -519,20 +520,6 @@ static void mt76u_complete_rx(struct urb *urb)
spin_unlock_irqrestore(&q->lock, flags);
}
-static int
-mt76u_refill_rx(struct mt76_dev *dev, struct mt76_queue *q,
- struct mt76u_buf *buf, int nsgs)
-{
- if (dev->usb.sg_en) {
- return mt76u_fill_rx_sg(dev, buf, nsgs, q->buf_size,
- SKB_WITH_OVERHEAD(q->buf_size));
- } else {
- buf->buf = page_frag_alloc(&q->rx_page, q->buf_size,
- GFP_ATOMIC);
- return buf->buf ? 0 : -ENOMEM;
- }
-}
-
static void mt76u_rx_tasklet(unsigned long data)
{
struct mt76_dev *dev = (struct mt76_dev *)data;
@@ -549,7 +536,8 @@ static void mt76u_rx_tasklet(unsigned long data)
count = mt76u_process_rx_entry(dev, buf);
if (count > 0) {
- err = mt76u_refill_rx(dev, q, buf, count);
+ err = mt76u_refill_rx(dev, q, buf, count,
+ GFP_ATOMIC);
if (err < 0)
break;
}
@@ -605,16 +593,8 @@ static int mt76u_alloc_rx(struct mt76_dev *dev)
q->buf_size = dev->usb.sg_en ? MT_RX_BUF_SIZE : PAGE_SIZE;
q->ndesc = MT_NUM_RX_ENTRIES;
for (i = 0; i < q->ndesc; i++) {
- if (dev->usb.sg_en)
- err = mt76u_buf_alloc_sg(dev, &q->entry[i].ubuf,
- MT_SG_MAX_SIZE, q->buf_size,
- SKB_WITH_OVERHEAD(q->buf_size),
- GFP_KERNEL);
- else
- err = mt76u_buf_alloc(dev, &q->entry[i].ubuf,
- q->buf_size,
- SKB_WITH_OVERHEAD(q->buf_size),
- GFP_KERNEL);
+ err = mt76u_buf_alloc(dev, &q->entry[i].ubuf,
+ GFP_KERNEL);
if (err < 0)
return err;
}
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [RFC 3/3] mt76: usb: simplify mt76u_tx_build_sg routine
2019-02-20 14:05 [RFC 0/3] simplify usb layer buffer allocation lorenzo
2019-02-20 14:05 ` [RFC 1/3] mt76: usb: introduce mt76u_fill_bulk_urb routine lorenzo
2019-02-20 14:05 ` [RFC 2/3] mt76: usb: simplify rx buffer allocation lorenzo
@ 2019-02-20 14:05 ` lorenzo
2 siblings, 0 replies; 4+ messages in thread
From: lorenzo @ 2019-02-20 14:05 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sgruszka, lorenzo.bianconi
From: Lorenzo Bianconi <lorenzo@kernel.org>
Use skb_to_sgvec instad of skb_to_sgvec_nomark in mt76u_tx_build_sg.
Moreover remove nsgs check since it is already performed in skb_to_sgvec
Suggested-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/usb.c | 17 +++--------------
1 file changed, 3 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index 24bf96de9f9d..87b89d5f1d03 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -724,23 +724,12 @@ static int
mt76u_tx_build_sg(struct mt76_dev * dev, struct sk_buff *skb,
struct urb *urb)
{
- struct sk_buff *iter;
- int nsgs;
-
if (!dev->usb.sg_en)
return 0;
- nsgs = 1 + skb_shinfo(skb)->nr_frags;
- skb_walk_frags(skb, iter)
- nsgs += 1 + skb_shinfo(iter)->nr_frags;
-
- memset(urb->sg, 0, sizeof(*urb->sg) * MT_SG_MAX_SIZE);
-
- nsgs = min_t(int, MT_SG_MAX_SIZE, nsgs);
- sg_init_marker(urb->sg, nsgs);
- urb->num_sgs = nsgs;
-
- return skb_to_sgvec_nomark(skb, urb->sg, 0, skb->len);
+ sg_init_table(urb->sg, MT_SG_MAX_SIZE);
+ urb->num_sgs = skb_to_sgvec(skb, urb->sg, 0, skb->len);
+ return urb->num_sgs;
}
static int
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-02-20 14:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-20 14:05 [RFC 0/3] simplify usb layer buffer allocation lorenzo
2019-02-20 14:05 ` [RFC 1/3] mt76: usb: introduce mt76u_fill_bulk_urb routine lorenzo
2019-02-20 14:05 ` [RFC 2/3] mt76: usb: simplify rx buffer allocation lorenzo
2019-02-20 14:05 ` [RFC 3/3] mt76: usb: simplify mt76u_tx_build_sg routine lorenzo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).