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.