diff for duplicates of <20190214092530.GA17273@redhat.com> diff --git a/a/1.txt b/N1/1.txt index 54fe206..78e2970 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -31,184 +31,3 @@ integrating mt76x0u in mt76-usb (things do not work from day 0 for mt76x2u). We should find fix(es) that will be proper for -stable. Stanislaw -From 2b20054fc424e0bb33962bbb05509a7ca16d01bc Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka <sgruszka@redhat.com> -Date: Thu, 14 Feb 2019 10:01:06 +0100 -Subject: [PATCH v5] 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 + - .../net/wireless/mediatek/mt76/mt76x02_usb_mcu.c | 1 + - drivers/net/wireless/mediatek/mt76/usb.c | 57 ++++++++++++++-------- - 3 files changed, 38 insertions(+), 21 deletions(-) - -diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h -index 2bb9db4ed80a..97ad0270f8a6 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/mt76x02_usb_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c -index 6db789f90269..80a259e1e931 100644 ---- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c -+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c -@@ -292,6 +292,7 @@ __mt76x02u_mcu_fw_send_data(struct mt76x02_dev *dev, struct mt76u_buf *buf, - MT_FCE_DMA_LEN, len << 16); - - buf->len = MT_CMD_HDR_LEN + len + sizeof(info); -+ buf->urb->sg[0].length = buf->len; - err = mt76u_submit_buf(&dev->mt76, USB_DIR_OUT, - MT_EP_OUT_INBAND_CMD, - buf, GFP_KERNEL, -diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c -index 6a2507524c6c..4f92732506cc 100644 ---- a/drivers/net/wireless/mediatek/mt76/usb.c -+++ b/drivers/net/wireless/mediatek/mt76/usb.c -@@ -297,14 +297,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; - } -@@ -323,6 +323,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); - } -@@ -333,15 +334,16 @@ void mt76u_buf_free(struct mt76u_buf *buf) - struct urb *urb = buf->urb; - int i; - -- for (i = 0; i < urb->num_sgs; i++) -+ for (i = 0; i < buf->num_sgs; i++) - skb_free_frag(sg_virt(&urb->sg[i])); - usb_free_urb(buf->urb); - } - 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); -@@ -352,12 +354,28 @@ 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); -- trace_submit_urb(dev, buf->urb); -+ 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); - - static inline struct mt76u_buf -@@ -667,10 +685,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; -@@ -679,7 +698,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); - } -@@ -689,12 +709,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) -@@ -708,13 +725,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..c2212f7 --- /dev/null +++ b/N1/2.txt @@ -0,0 +1,183 @@ +From 2b20054fc424e0bb33962bbb05509a7ca16d01bc Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka <sgruszka@redhat.com> +Date: Thu, 14 Feb 2019 10:01:06 +0100 +Subject: [PATCH v5] 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 + + .../net/wireless/mediatek/mt76/mt76x02_usb_mcu.c | 1 + + drivers/net/wireless/mediatek/mt76/usb.c | 57 ++++++++++++++-------- + 3 files changed, 38 insertions(+), 21 deletions(-) + +diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h +index 2bb9db4ed80a..97ad0270f8a6 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/mt76x02_usb_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c +index 6db789f90269..80a259e1e931 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c +@@ -292,6 +292,7 @@ __mt76x02u_mcu_fw_send_data(struct mt76x02_dev *dev, struct mt76u_buf *buf, + MT_FCE_DMA_LEN, len << 16); + + buf->len = MT_CMD_HDR_LEN + len + sizeof(info); ++ buf->urb->sg[0].length = buf->len; + err = mt76u_submit_buf(&dev->mt76, USB_DIR_OUT, + MT_EP_OUT_INBAND_CMD, + buf, GFP_KERNEL, +diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c +index 6a2507524c6c..4f92732506cc 100644 +--- a/drivers/net/wireless/mediatek/mt76/usb.c ++++ b/drivers/net/wireless/mediatek/mt76/usb.c +@@ -297,14 +297,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; + } +@@ -323,6 +323,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); + } +@@ -333,15 +334,16 @@ void mt76u_buf_free(struct mt76u_buf *buf) + struct urb *urb = buf->urb; + int i; + +- for (i = 0; i < urb->num_sgs; i++) ++ for (i = 0; i < buf->num_sgs; i++) + skb_free_frag(sg_virt(&urb->sg[i])); + usb_free_urb(buf->urb); + } + 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); +@@ -352,12 +354,28 @@ 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); +- trace_submit_urb(dev, buf->urb); ++ 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); + + static inline struct mt76u_buf +@@ -667,10 +685,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; +@@ -679,7 +698,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); + } +@@ -689,12 +709,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) +@@ -708,13 +725,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.7.5 diff --git a/a/content_digest b/N1/content_digest index 4e2a8e4..3c29c69 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,5 +1,10 @@ + "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" + "ref\020190212093035.GB12906@redhat.com\0" + "ref\0404607590.373282.1550126997144@email.ionos.de\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\0Thu, 14 Feb 2019 10:25:32 +0100\0" "To\0Stefan Wahren <stefan.wahren@i2se.com>\0" "Cc\0Lorenzo Bianconi <lorenzo.bianconi@redhat.com>" @@ -9,7 +14,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 Thu, Feb 14, 2019 at 07:49:57AM +0100, Stefan Wahren wrote:\n" "> Hi Stanislaw,\n" @@ -43,7 +48,10 @@ "integrating mt76x0u in mt76-usb (things do not work from day 0\n" "for mt76x2u). We should find fix(es) that will be proper for -stable.\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 2b20054fc424e0bb33962bbb05509a7ca16d01bc Mon Sep 17 00:00:00 2001\n" "From: Stanislaw Gruszka <sgruszka@redhat.com>\n" "Date: Thu, 14 Feb 2019 10:01:06 +0100\n" @@ -224,6 +232,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.7.5 -d74cecf839fb67bbc6438c76f7c52aba46e4d24c7d595b972528cce8c30329be +0bf3c3af1219cb9a5c6cf7b4542f9e8ebc1c521ca49936aefb984100aab2eecd
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.