All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <4C642AA9.1060404@parrot.com>

diff --git a/a/1.txt b/N1/1.txt
index 3c96c96..b0ad38c 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,4 +1,4 @@
-Martin Fuzzey a ?crit :
+Martin Fuzzey a écrit :
 >> We don't want to add support for this to DMA bounce.  DMA bounce is already
 >> a pain in the backside and causes its own set of problems - please let it
 >> die a long slow but quite death.
@@ -28,10 +28,3 @@ Matthieu
 
 
 [1] http://article.gmane.org/gmane.linux.usb.general/28700
--------------- next part --------------
-A non-text attachment was scrubbed...
-Name: gadget-align.diff
-Type: text/x-diff
-Size: 2251 bytes
-Desc: not available
-URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20100812/7bf8e096/attachment.bin>
diff --git a/N1/2.hdr b/N1/2.hdr
new file mode 100644
index 0000000..95649bb
--- /dev/null
+++ b/N1/2.hdr
@@ -0,0 +1,3 @@
+Content-Type: text/x-diff; name="gadget-align.diff"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline; filename="gadget-align.diff"
diff --git a/N1/2.txt b/N1/2.txt
new file mode 100644
index 0000000..b56c4a7
--- /dev/null
+++ b/N1/2.txt
@@ -0,0 +1,75 @@
+diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h
+index 1edbc12..ed3ee67 100644
+--- a/drivers/usb/gadget/gadget_chips.h
++++ b/drivers/usb/gadget/gadget_chips.h
+@@ -214,4 +214,14 @@ static inline bool gadget_supports_altsettings(struct usb_gadget *gadget)
+ 	return true;
+ }
+ 
++/**
++ * gadget_dma32 - return true if we want buffer aligned on 32 bits (for dma)
++ * @gadget: the gadget in question
++ */
++static inline bool gadget_dma32(struct usb_gadget *gadget)
++{
++	if (gadget_is_musbhdrc(gadget))
++		return true;
++	return false;
++}
+ #endif /* __GADGET_CHIPS_H */
+diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
+index 84ca195..697af90 100644
+--- a/drivers/usb/gadget/u_ether.c
++++ b/drivers/usb/gadget/u_ether.c
+@@ -249,7 +249,12 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
+ 	 * but on at least one, checksumming fails otherwise.  Note:
+ 	 * RNDIS headers involve variable numbers of LE32 values.
+ 	 */
+-	skb_reserve(skb, NET_IP_ALIGN);
++	/*
++	 * RX: Do not move data by IP_ALIGN:
++	 * if your DMA controller cannot handle it
++	 */
++	if (!gadget_dma32(dev->gadget))
++		skb_reserve(skb, NET_IP_ALIGN);
+ 
+ 	req->buf = skb->data;
+ 	req->length = size;
+@@ -282,6 +287,12 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req)
+ 	/* normal completion */
+ 	case 0:
+ 		skb_put(skb, req->actual);
++		if (gadget_dma32(dev->gadget) && NET_IP_ALIGN) {
++			u8 *data = skb->data;
++			size_t len = skb_headlen(skb);
++			skb_reserve(skb, NET_IP_ALIGN);
++			memmove(skb->data, data, len);
++		}
+ 
+ 		if (dev->unwrap) {
+ 			unsigned long	flags;
+@@ -573,6 +584,24 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
+ 
+ 		length = skb->len;
+ 	}
++
++	/*
++	 * Align data to 32bit if the dma controller requires it
++	 */
++	if (gadget_dma32(dev->gadget)) {
++		unsigned long align = (unsigned long)skb->data & 3;
++		if (WARN_ON(skb_headroom(skb) < align)) {
++			dev_kfree_skb_any(skb);
++			goto drop;
++		} else if (align) {
++			u8 *data = skb->data;
++			size_t len = skb_headlen(skb);
++			skb->data -= align;
++			memmove(skb->data, data, len);
++			skb_set_tail_pointer(skb, len);
++		}
++	}
++
+ 	req->buf = skb->data;
+ 	req->context = skb;
+ 	req->complete = tx_complete;
diff --git a/a/content_digest b/N1/content_digest
index c1ff641..fa13c1a 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -4,13 +4,20 @@
  "ref\04C62C7B3.2030706@nvidia.com\0"
  "ref\020100811203505.GA463@n2100.arm.linux.org.uk\0"
  "ref\04C632217.9000608@gmail.com\0"
- "From\0matthieu.castet@parrot.com (Matthieu CASTET)\0"
- "Subject\0Problem with non aligned DMA in usbnet on ARM\0"
+ "ref\04C632217.9000608-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org\0"
+ "From\0Matthieu CASTET <matthieu.castet-ITF29qwbsa/QT0dZR+AlfA@public.gmane.org>\0"
+ "Subject\0Re: Problem with non aligned DMA in usbnet on ARM\0"
  "Date\0Thu, 12 Aug 2010 19:08:57 +0200\0"
- "To\0linux-arm-kernel@lists.infradead.org\0"
- "\00:1\0"
+ "To\0mfuzzey-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org <mfuzzey-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>\0"
+ "Cc\0Russell King - ARM Linux <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>"
+  Gary King <GKing-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
+  linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org <linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
+  linux-usb <linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
+  netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org <netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
+ " Greg KH <greg-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>\0"
+ "\01:1\0"
  "b\0"
- "Martin Fuzzey a ?crit :\n"
+ "Martin Fuzzey a \303\251crit :\n"
  ">> We don't want to add support for this to DMA bounce.  DMA bounce is already\n"
  ">> a pain in the backside and causes its own set of problems - please let it\n"
  ">> die a long slow but quite death.\n"
@@ -39,13 +46,84 @@
  "\n"
  "\n"
  "\n"
- "[1] http://article.gmane.org/gmane.linux.usb.general/28700\n"
- "-------------- next part --------------\n"
- "A non-text attachment was scrubbed...\n"
- "Name: gadget-align.diff\n"
- "Type: text/x-diff\n"
- "Size: 2251 bytes\n"
- "Desc: not available\n"
- URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20100812/7bf8e096/attachment.bin>
+ [1] http://article.gmane.org/gmane.linux.usb.general/28700
+ "\01:2\0"
+ "fn\0gadget-align.diff\0"
+ "b\0"
+ "diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h\n"
+ "index 1edbc12..ed3ee67 100644\n"
+ "--- a/drivers/usb/gadget/gadget_chips.h\n"
+ "+++ b/drivers/usb/gadget/gadget_chips.h\n"
+ "@@ -214,4 +214,14 @@ static inline bool gadget_supports_altsettings(struct usb_gadget *gadget)\n"
+ " \treturn true;\n"
+ " }\n"
+ " \n"
+ "+/**\n"
+ "+ * gadget_dma32 - return true if we want buffer aligned on 32 bits (for dma)\n"
+ "+ * @gadget: the gadget in question\n"
+ "+ */\n"
+ "+static inline bool gadget_dma32(struct usb_gadget *gadget)\n"
+ "+{\n"
+ "+\tif (gadget_is_musbhdrc(gadget))\n"
+ "+\t\treturn true;\n"
+ "+\treturn false;\n"
+ "+}\n"
+ " #endif /* __GADGET_CHIPS_H */\n"
+ "diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c\n"
+ "index 84ca195..697af90 100644\n"
+ "--- a/drivers/usb/gadget/u_ether.c\n"
+ "+++ b/drivers/usb/gadget/u_ether.c\n"
+ "@@ -249,7 +249,12 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)\n"
+ " \t * but on at least one, checksumming fails otherwise.  Note:\n"
+ " \t * RNDIS headers involve variable numbers of LE32 values.\n"
+ " \t */\n"
+ "-\tskb_reserve(skb, NET_IP_ALIGN);\n"
+ "+\t/*\n"
+ "+\t * RX: Do not move data by IP_ALIGN:\n"
+ "+\t * if your DMA controller cannot handle it\n"
+ "+\t */\n"
+ "+\tif (!gadget_dma32(dev->gadget))\n"
+ "+\t\tskb_reserve(skb, NET_IP_ALIGN);\n"
+ " \n"
+ " \treq->buf = skb->data;\n"
+ " \treq->length = size;\n"
+ "@@ -282,6 +287,12 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req)\n"
+ " \t/* normal completion */\n"
+ " \tcase 0:\n"
+ " \t\tskb_put(skb, req->actual);\n"
+ "+\t\tif (gadget_dma32(dev->gadget) && NET_IP_ALIGN) {\n"
+ "+\t\t\tu8 *data = skb->data;\n"
+ "+\t\t\tsize_t len = skb_headlen(skb);\n"
+ "+\t\t\tskb_reserve(skb, NET_IP_ALIGN);\n"
+ "+\t\t\tmemmove(skb->data, data, len);\n"
+ "+\t\t}\n"
+ " \n"
+ " \t\tif (dev->unwrap) {\n"
+ " \t\t\tunsigned long\tflags;\n"
+ "@@ -573,6 +584,24 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,\n"
+ " \n"
+ " \t\tlength = skb->len;\n"
+ " \t}\n"
+ "+\n"
+ "+\t/*\n"
+ "+\t * Align data to 32bit if the dma controller requires it\n"
+ "+\t */\n"
+ "+\tif (gadget_dma32(dev->gadget)) {\n"
+ "+\t\tunsigned long align = (unsigned long)skb->data & 3;\n"
+ "+\t\tif (WARN_ON(skb_headroom(skb) < align)) {\n"
+ "+\t\t\tdev_kfree_skb_any(skb);\n"
+ "+\t\t\tgoto drop;\n"
+ "+\t\t} else if (align) {\n"
+ "+\t\t\tu8 *data = skb->data;\n"
+ "+\t\t\tsize_t len = skb_headlen(skb);\n"
+ "+\t\t\tskb->data -= align;\n"
+ "+\t\t\tmemmove(skb->data, data, len);\n"
+ "+\t\t\tskb_set_tail_pointer(skb, len);\n"
+ "+\t\t}\n"
+ "+\t}\n"
+ "+\n"
+ " \treq->buf = skb->data;\n"
+ " \treq->context = skb;\n"
+ " \treq->complete = tx_complete;"
 
-b41fcf373e0320bd1e46448831c62cfdf744227387cd7ec8ccead398e76d1273
+847a0bb0d7e48cfda0b0afa7ce157668dbd2f7319b5dcc5e5c012e278ace0a64

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.