All of lore.kernel.org
 help / color / mirror / Atom feed
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.