diff for duplicates of <20190212093035.GB12906@redhat.com> diff --git a/a/1.txt b/N1/1.txt index 62f593e..a4fb20f 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -51,169 +51,3 @@ still use SG allocation. Attached patch do this, please check if it works on rpi. Patch is on top of your error path fixes. Stanislaw -From f79ac0df967d406523d0a1c03a138d1394e7665a Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka <sgruszka@redhat.com> -Date: Tue, 12 Feb 2019 10:02:53 +0100 -Subject: [PATCH] mt76usb: do not set urb->num_sgs to 1 for non SG usb host - drivers - -Track number of segments in mt76u_buf structure and do not -submit urbs with urb->num_sgs = 1 if usb host driver -sg_tablesize is zero. - -This suppose fix problem of mt76 not working with some usb -host controllers like dwc2. - -Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> ---- - drivers/net/wireless/mediatek/mt76/mt76.h | 1 + - drivers/net/wireless/mediatek/mt76/usb.c | 55 ++++++++++++++--------- - 2 files changed, 36 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h -index 2e5bcb3fdff7..eadc913c37b6 100644 ---- a/drivers/net/wireless/mediatek/mt76/mt76.h -+++ b/drivers/net/wireless/mediatek/mt76/mt76.h -@@ -86,6 +86,7 @@ struct mt76_queue_buf { - struct mt76u_buf { - struct mt76_dev *dev; - struct urb *urb; -+ int num_sgs; - size_t len; - bool done; - }; -diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c -index a1811c39415e..d82de59ec6dc 100644 ---- a/drivers/net/wireless/mediatek/mt76/usb.c -+++ b/drivers/net/wireless/mediatek/mt76/usb.c -@@ -299,14 +299,14 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76u_buf *buf, - if (i < nsgs) { - int j; - -- for (j = nsgs; j < urb->num_sgs; j++) -+ for (j = nsgs; j < buf->num_sgs; j++) - skb_free_frag(sg_virt(&urb->sg[j])); -- urb->num_sgs = i; -+ buf->num_sgs = i; - } - -- urb->num_sgs = max_t(int, i, urb->num_sgs); -- buf->len = urb->num_sgs * sglen, -- sg_init_marker(urb->sg, urb->num_sgs); -+ buf->num_sgs = max_t(int, i, buf->num_sgs); -+ buf->len = buf->num_sgs * sglen, -+ sg_init_marker(urb->sg, buf->num_sgs); - - return i ? : -ENOMEM; - } -@@ -325,6 +325,7 @@ int mt76u_buf_alloc(struct mt76_dev *dev, struct mt76u_buf *buf, - - sg_init_table(buf->urb->sg, nsgs); - buf->dev = dev; -+ buf->num_sgs = nsgs; - - return mt76u_fill_rx_sg(dev, buf, nsgs, len, sglen); - } -@@ -336,7 +337,7 @@ void mt76u_buf_free(struct mt76u_buf *buf) - struct scatterlist *sg; - int i; - -- for (i = 0; i < urb->num_sgs; i++) { -+ for (i = 0; i < buf->num_sgs; i++) { - sg = &urb->sg[i]; - if (!sg) - continue; -@@ -347,9 +348,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); -@@ -360,9 +362,25 @@ int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index, - else - pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[index]); - -- usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, buf->len, -- complete_fn, context); -+ usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, buf->len, complete_fn, -+ context); -+ -+ if (udev->bus->sg_tablesize > 0) { -+ buf->urb->num_sgs = buf->num_sgs; -+ } else { -+ WARN_ON_ONCE(buf->num_sgs != 1); -+ /* See usb_sg_init() */ -+ buf->urb->num_sgs = 0; -+ if (!PageHighMem(sg_page(buf->urb->sg))) -+ buf->urb->transfer_buffer = sg_virt(buf->urb->sg); -+ } -+} - -+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); - return usb_submit_urb(buf->urb, gfp); - } - EXPORT_SYMBOL_GPL(mt76u_submit_buf); -@@ -672,10 +690,11 @@ 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 sk_buff *skb, struct mt76u_buf *buf) - { - int nsgs = 1 + skb_shinfo(skb)->nr_frags; - struct sk_buff *iter; -+ struct urb *urb = buf->urb; - - skb_walk_frags(skb, iter) - nsgs += 1 + skb_shinfo(iter)->nr_frags; -@@ -684,7 +703,8 @@ mt76u_tx_build_sg(struct sk_buff *skb, struct urb *urb) - - nsgs = min_t(int, MT_SG_MAX_SIZE, nsgs); - sg_init_marker(urb->sg, nsgs); -- urb->num_sgs = nsgs; -+ buf->num_sgs = nsgs; -+ buf->len = skb->len; - - return skb_to_sgvec_nomark(skb, urb->sg, 0, skb->len); - } -@@ -694,12 +714,9 @@ 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 ep = q2ep(q->hw_idx); - struct mt76u_buf *buf; - u16 idx = q->tail; -- unsigned int pipe; - int err; - - if (q->queued == q->ndesc) -@@ -712,13 +729,11 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, - buf = &q->entry[idx].ubuf; - buf->done = false; - -- err = mt76u_tx_build_sg(skb, buf->urb); -+ err = mt76u_tx_build_sg(skb, buf); - if (err < 0) - return err; - -- pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[ep]); -- usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, skb->len, -- mt76u_complete_tx, buf); -+ mt76u_fill_bulk_urb(dev, USB_DIR_OUT, ep, buf, mt76u_complete_tx, buf); - - q->tail = (q->tail + 1) % q->ndesc; - q->entry[idx].skb = skb; diff --git a/N1/2.hdr b/N1/2.hdr new file mode 100644 index 0000000..f97ea33 --- /dev/null +++ b/N1/2.hdr @@ -0,0 +1,2 @@ +Content-Type: text/plain; charset=us-ascii +Content-Disposition: attachment; filename="0001-mt76usb-do-not-set-urb-num_sgs-to-1-for-non-SG-usb-h.patch" diff --git a/N1/2.txt b/N1/2.txt new file mode 100644 index 0000000..3f6491c --- /dev/null +++ b/N1/2.txt @@ -0,0 +1,168 @@ +From f79ac0df967d406523d0a1c03a138d1394e7665a Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka <sgruszka@redhat.com> +Date: Tue, 12 Feb 2019 10:02:53 +0100 +Subject: [PATCH] mt76usb: do not set urb->num_sgs to 1 for non SG usb host + drivers + +Track number of segments in mt76u_buf structure and do not +submit urbs with urb->num_sgs = 1 if usb host driver +sg_tablesize is zero. + +This suppose fix problem of mt76 not working with some usb +host controllers like dwc2. + +Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> +--- + drivers/net/wireless/mediatek/mt76/mt76.h | 1 + + drivers/net/wireless/mediatek/mt76/usb.c | 55 ++++++++++++++--------- + 2 files changed, 36 insertions(+), 20 deletions(-) + +diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h +index 2e5bcb3fdff7..eadc913c37b6 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76.h ++++ b/drivers/net/wireless/mediatek/mt76/mt76.h +@@ -86,6 +86,7 @@ struct mt76_queue_buf { + struct mt76u_buf { + struct mt76_dev *dev; + struct urb *urb; ++ int num_sgs; + size_t len; + bool done; + }; +diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c +index a1811c39415e..d82de59ec6dc 100644 +--- a/drivers/net/wireless/mediatek/mt76/usb.c ++++ b/drivers/net/wireless/mediatek/mt76/usb.c +@@ -299,14 +299,14 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76u_buf *buf, + if (i < nsgs) { + int j; + +- for (j = nsgs; j < urb->num_sgs; j++) ++ for (j = nsgs; j < buf->num_sgs; j++) + skb_free_frag(sg_virt(&urb->sg[j])); +- urb->num_sgs = i; ++ buf->num_sgs = i; + } + +- urb->num_sgs = max_t(int, i, urb->num_sgs); +- buf->len = urb->num_sgs * sglen, +- sg_init_marker(urb->sg, urb->num_sgs); ++ buf->num_sgs = max_t(int, i, buf->num_sgs); ++ buf->len = buf->num_sgs * sglen, ++ sg_init_marker(urb->sg, buf->num_sgs); + + return i ? : -ENOMEM; + } +@@ -325,6 +325,7 @@ int mt76u_buf_alloc(struct mt76_dev *dev, struct mt76u_buf *buf, + + sg_init_table(buf->urb->sg, nsgs); + buf->dev = dev; ++ buf->num_sgs = nsgs; + + return mt76u_fill_rx_sg(dev, buf, nsgs, len, sglen); + } +@@ -336,7 +337,7 @@ void mt76u_buf_free(struct mt76u_buf *buf) + struct scatterlist *sg; + int i; + +- for (i = 0; i < urb->num_sgs; i++) { ++ for (i = 0; i < buf->num_sgs; i++) { + sg = &urb->sg[i]; + if (!sg) + continue; +@@ -347,9 +348,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); +@@ -360,9 +362,25 @@ int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index, + else + pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[index]); + +- usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, buf->len, +- complete_fn, context); ++ usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, buf->len, complete_fn, ++ context); ++ ++ if (udev->bus->sg_tablesize > 0) { ++ buf->urb->num_sgs = buf->num_sgs; ++ } else { ++ WARN_ON_ONCE(buf->num_sgs != 1); ++ /* See usb_sg_init() */ ++ buf->urb->num_sgs = 0; ++ if (!PageHighMem(sg_page(buf->urb->sg))) ++ buf->urb->transfer_buffer = sg_virt(buf->urb->sg); ++ } ++} + ++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); + return usb_submit_urb(buf->urb, gfp); + } + EXPORT_SYMBOL_GPL(mt76u_submit_buf); +@@ -672,10 +690,11 @@ 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 sk_buff *skb, struct mt76u_buf *buf) + { + int nsgs = 1 + skb_shinfo(skb)->nr_frags; + struct sk_buff *iter; ++ struct urb *urb = buf->urb; + + skb_walk_frags(skb, iter) + nsgs += 1 + skb_shinfo(iter)->nr_frags; +@@ -684,7 +703,8 @@ mt76u_tx_build_sg(struct sk_buff *skb, struct urb *urb) + + nsgs = min_t(int, MT_SG_MAX_SIZE, nsgs); + sg_init_marker(urb->sg, nsgs); +- urb->num_sgs = nsgs; ++ buf->num_sgs = nsgs; ++ buf->len = skb->len; + + return skb_to_sgvec_nomark(skb, urb->sg, 0, skb->len); + } +@@ -694,12 +714,9 @@ 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 ep = q2ep(q->hw_idx); + struct mt76u_buf *buf; + u16 idx = q->tail; +- unsigned int pipe; + int err; + + if (q->queued == q->ndesc) +@@ -712,13 +729,11 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, + buf = &q->entry[idx].ubuf; + buf->done = false; + +- err = mt76u_tx_build_sg(skb, buf->urb); ++ err = mt76u_tx_build_sg(skb, buf); + if (err < 0) + return err; + +- pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[ep]); +- usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, skb->len, +- mt76u_complete_tx, buf); ++ mt76u_fill_bulk_urb(dev, USB_DIR_OUT, ep, buf, mt76u_complete_tx, buf); + + q->tail = (q->tail + 1) % q->ndesc; + q->entry[idx].skb = skb; +-- +2.19.2 diff --git a/a/content_digest b/N1/content_digest index 014f3f0..3e19668 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,5 +1,8 @@ + "ref\020190211173315.GE6292@redhat.com\0" + "ref\0Pine.LNX.4.44L0.1902111246410.1543-100000@iolanthe.rowland.org\0" + "ref\0CAJ0CqmVFVBXi5E07-ZsYojC7mP4ogpwbcDkDTeebHwX+ayz2DQ@mail.gmail.com\0" "From\0Stanislaw Gruszka <sgruszka@redhat.com>\0" - "Subject\0[BUG] mt76x0u: Probing issues on Raspberry Pi 3 B+\0" + "Subject\0Re: [BUG] mt76x0u: Probing issues on Raspberry Pi 3 B+\0" "Date\0Tue, 12 Feb 2019 10:30:36 +0100\0" "To\0Lorenzo Bianconi <lorenzo.bianconi@redhat.com>\0" "Cc\0Alan Stern <stern@rowland.harvard.edu>" @@ -9,7 +12,7 @@ Minas Harutyunyan <hminas@synopsys.com> USB list <linux-usb@vger.kernel.org> " linux-wireless <linux-wireless@vger.kernel.org>\0" - "\00:1\0" + "\01:1\0" "b\0" "On Tue, Feb 12, 2019 at 01:06:00AM +0100, Lorenzo Bianconi wrote:\n" "> >\n" @@ -63,7 +66,10 @@ "still use SG allocation. Attached patch do this, please check if it works\n" "on rpi. Patch is on top of your error path fixes.\n" "\n" - "Stanislaw\n" + Stanislaw + "\01:2\0" + "fn\00001-mt76usb-do-not-set-urb-num_sgs-to-1-for-non-SG-usb-h.patch\0" + "b\0" "From f79ac0df967d406523d0a1c03a138d1394e7665a Mon Sep 17 00:00:00 2001\n" "From: Stanislaw Gruszka <sgruszka@redhat.com>\n" "Date: Tue, 12 Feb 2019 10:02:53 +0100\n" @@ -229,6 +235,8 @@ "+\tmt76u_fill_bulk_urb(dev, USB_DIR_OUT, ep, buf, mt76u_complete_tx, buf);\n" " \n" " \tq->tail = (q->tail + 1) % q->ndesc;\n" - " \tq->entry[idx].skb = skb;" + " \tq->entry[idx].skb = skb;\n" + "-- \n" + 2.19.2 -30ea9c8db47de5a1bc319c0ad8ff12b01c56ae7afeb87f32381d94b8bd038d39 +905f97b022e2ced8813e2feaaf4276eac8dd3b201d20d32e735e8090422f4bc2
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.