All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] dm9601: improve support for dm962x based devices
@ 2013-12-16 10:35 Peter Korsgaard
  2013-12-16 10:35 ` [PATCH 1/4] dm9601: add support for dm9621a based dongle Peter Korsgaard
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Peter Korsgaard @ 2013-12-16 10:35 UTC (permalink / raw)
  To: netdev, davem; +Cc: joseph_chang, Peter Korsgaard

This series contain a number of improvements/fixes for the USB 2.0
dm962x based devices. Two of them are bugfixes, so are also marked for
stable.

Peter Korsgaard (4):
  dm9601: add support for dm9621a based dongle
  dm9601: fix reception of full size ethernet frames on dm9620/dm9621a
  dm9601: make it clear that dm9620/dm9621a are also supported
  dm9601: work around tx fifo sync issue on dm962x

 drivers/net/usb/Kconfig  |  6 +++---
 drivers/net/usb/dm9601.c | 44 ++++++++++++++++++++++++++++++++------------
 2 files changed, 35 insertions(+), 15 deletions(-)

-- 
1.8.5.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/4] dm9601: add support for dm9621a based dongle
  2013-12-16 10:35 [PATCH 0/4] dm9601: improve support for dm962x based devices Peter Korsgaard
@ 2013-12-16 10:35 ` Peter Korsgaard
  2013-12-18 22:47   ` David Miller
  2013-12-16 10:35 ` [PATCH 2/4] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a Peter Korsgaard
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Peter Korsgaard @ 2013-12-16 10:35 UTC (permalink / raw)
  To: netdev, davem; +Cc: joseph_chang, Peter Korsgaard

dm9621a is functionally identical to dm9620, so the existing handling can
directly be used.

Thanks to Davicom for sending me a dongle.

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
---
 drivers/net/usb/dm9601.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
index c6867f9..8e88572 100644
--- a/drivers/net/usb/dm9601.c
+++ b/drivers/net/usb/dm9601.c
@@ -594,6 +594,10 @@ static const struct usb_device_id products[] = {
 	 USB_DEVICE(0x0a46, 0x9620),	/* DM9620 USB to Fast Ethernet Adapter */
 	 .driver_info = (unsigned long)&dm9601_info,
 	 },
+	{
+	 USB_DEVICE(0x0a46, 0x9621),	/* DM9621A USB to Fast Ethernet Adapter */
+	 .driver_info = (unsigned long)&dm9601_info,
+	},
 	{},			// END
 };
 
-- 
1.8.5.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/4] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a
  2013-12-16 10:35 [PATCH 0/4] dm9601: improve support for dm962x based devices Peter Korsgaard
  2013-12-16 10:35 ` [PATCH 1/4] dm9601: add support for dm9621a based dongle Peter Korsgaard
@ 2013-12-16 10:35 ` Peter Korsgaard
  2013-12-18 22:47   ` David Miller
  2013-12-16 10:35 ` [PATCH 3/4] dm9601: make it clear that dm9620/dm9621a are also supported Peter Korsgaard
  2013-12-16 10:35 ` [PATCH 4/4] dm9601: work around tx fifo sync issue on dm962x Peter Korsgaard
  3 siblings, 1 reply; 9+ messages in thread
From: Peter Korsgaard @ 2013-12-16 10:35 UTC (permalink / raw)
  To: netdev, davem; +Cc: joseph_chang, Peter Korsgaard, stable

dm9620/dm9621a require room for 4 byte padding even in dm9601 (3 byte
header) mode.

Cc: <stable@vger.kernel.org>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
---
 drivers/net/usb/dm9601.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
index 8e88572..aca0285 100644
--- a/drivers/net/usb/dm9601.c
+++ b/drivers/net/usb/dm9601.c
@@ -364,7 +364,12 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
 	dev->net->ethtool_ops = &dm9601_ethtool_ops;
 	dev->net->hard_header_len += DM_TX_OVERHEAD;
 	dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
-	dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD;
+
+	/* dm9620/21a require room for 4 byte padding, even in dm9601
+	 * mode, so we need +1 to be able to receive full size
+	 * ethernet frames.
+	 */
+	dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD + 1;
 
 	dev->mii.dev = dev->net;
 	dev->mii.mdio_read = dm9601_mdio_read;
-- 
1.8.5.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/4] dm9601: make it clear that dm9620/dm9621a are also supported
  2013-12-16 10:35 [PATCH 0/4] dm9601: improve support for dm962x based devices Peter Korsgaard
  2013-12-16 10:35 ` [PATCH 1/4] dm9601: add support for dm9621a based dongle Peter Korsgaard
  2013-12-16 10:35 ` [PATCH 2/4] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a Peter Korsgaard
@ 2013-12-16 10:35 ` Peter Korsgaard
  2013-12-18 22:47   ` David Miller
  2013-12-16 10:35 ` [PATCH 4/4] dm9601: work around tx fifo sync issue on dm962x Peter Korsgaard
  3 siblings, 1 reply; 9+ messages in thread
From: Peter Korsgaard @ 2013-12-16 10:35 UTC (permalink / raw)
  To: netdev, davem; +Cc: joseph_chang, Peter Korsgaard

The driver nowadays also support dm9620/dm9621a based USB 2.0 ethernet
adapters, so adjust module/driver description and Kconfig help text to
match.

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
---
 drivers/net/usb/Kconfig  | 6 +++---
 drivers/net/usb/dm9601.c | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 85e4a016..47b0f73 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -276,12 +276,12 @@ config USB_NET_CDC_MBIM
 	  module will be called cdc_mbim.
 
 config USB_NET_DM9601
-	tristate "Davicom DM9601 based USB 1.1 10/100 ethernet devices"
+	tristate "Davicom DM96xx based USB 10/100 ethernet devices"
 	depends on USB_USBNET
 	select CRC32
 	help
-	  This option adds support for Davicom DM9601 based USB 1.1
-	  10/100 Ethernet adapters.
+	  This option adds support for Davicom DM9601/DM9620/DM9621A
+	  based USB 10/100 Ethernet adapters.
 
 config USB_NET_SR9700
 	tristate "CoreChip-sz SR9700 based USB 1.1 10/100 ethernet devices"
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
index aca0285..ca99c35 100644
--- a/drivers/net/usb/dm9601.c
+++ b/drivers/net/usb/dm9601.c
@@ -1,5 +1,5 @@
 /*
- * Davicom DM9601 USB 1.1 10/100Mbps ethernet devices
+ * Davicom DM96xx USB 10/100Mbps ethernet devices
  *
  * Peter Korsgaard <jacmet@sunsite.dk>
  *
@@ -548,7 +548,7 @@ static int dm9601_link_reset(struct usbnet *dev)
 }
 
 static const struct driver_info dm9601_info = {
-	.description	= "Davicom DM9601 USB Ethernet",
+	.description	= "Davicom DM96xx USB 10/100 Ethernet",
 	.flags		= FLAG_ETHER | FLAG_LINK_INTR,
 	.bind		= dm9601_bind,
 	.rx_fixup	= dm9601_rx_fixup,
@@ -621,5 +621,5 @@ static struct usb_driver dm9601_driver = {
 module_usb_driver(dm9601_driver);
 
 MODULE_AUTHOR("Peter Korsgaard <jacmet@sunsite.dk>");
-MODULE_DESCRIPTION("Davicom DM9601 USB 1.1 ethernet devices");
+MODULE_DESCRIPTION("Davicom DM96xx USB 10/100 ethernet devices");
 MODULE_LICENSE("GPL");
-- 
1.8.5.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/4] dm9601: work around tx fifo sync issue on dm962x
  2013-12-16 10:35 [PATCH 0/4] dm9601: improve support for dm962x based devices Peter Korsgaard
                   ` (2 preceding siblings ...)
  2013-12-16 10:35 ` [PATCH 3/4] dm9601: make it clear that dm9620/dm9621a are also supported Peter Korsgaard
@ 2013-12-16 10:35 ` Peter Korsgaard
  2013-12-18 22:48   ` David Miller
  3 siblings, 1 reply; 9+ messages in thread
From: Peter Korsgaard @ 2013-12-16 10:35 UTC (permalink / raw)
  To: netdev, davem; +Cc: joseph_chang, Peter Korsgaard, stable

Certain dm962x revisions contain an bug, where if a USB bulk transfer retry
(E.G. if bulk crc mismatch) happens right after a transfer with odd or
maxpacket length, the internal tx hardware fifo gets out of sync causing
the interface to stop working.

Work around it by adding up to 3 bytes of padding to ensure this situation
cannot trigger.

This workaround also means we never pass multiple-of-maxpacket size skb's
to usbnet, so the length adjustment to handle usbnet's padding of those can
be removed.

Cc: <stable@vger.kernel.org>
Reported-by: Joseph Chang <joseph_chang@davicom.com.tw>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
---
 drivers/net/usb/dm9601.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
index ca99c35..14aa48f 100644
--- a/drivers/net/usb/dm9601.c
+++ b/drivers/net/usb/dm9601.c
@@ -473,7 +473,7 @@ static int dm9601_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
 static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
 				       gfp_t flags)
 {
-	int len;
+	int len, pad;
 
 	/* format:
 	   b1: packet length low
@@ -481,12 +481,23 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
 	   b3..n: packet data
 	*/
 
-	len = skb->len;
+	len = skb->len + DM_TX_OVERHEAD;
+
+	/* workaround for dm962x errata with tx fifo getting out of
+	 * sync if a USB bulk transfer retry happens right after a
+	 * packet with odd / maxpacket length by adding up to 3 bytes
+	 * padding.
+	 */
+	while ((len & 1) || !(len % dev->maxpacket))
+		len++;
 
-	if (skb_headroom(skb) < DM_TX_OVERHEAD) {
+	len -= DM_TX_OVERHEAD; /* hw header doesn't count as part of length */
+	pad = len - skb->len;
+
+	if (skb_headroom(skb) < DM_TX_OVERHEAD || skb_tailroom(skb) < pad) {
 		struct sk_buff *skb2;
 
-		skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, 0, flags);
+		skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, pad, flags);
 		dev_kfree_skb_any(skb);
 		skb = skb2;
 		if (!skb)
@@ -495,10 +506,10 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
 
 	__skb_push(skb, DM_TX_OVERHEAD);
 
-	/* usbnet adds padding if length is a multiple of packet size
-	   if so, adjust length value in header */
-	if ((skb->len % dev->maxpacket) == 0)
-		len++;
+	if (pad) {
+		memset(skb->data + skb->len, 0, pad);
+		__skb_put(skb, pad);
+	}
 
 	skb->data[0] = len;
 	skb->data[1] = len >> 8;
-- 
1.8.5.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/4] dm9601: add support for dm9621a based dongle
  2013-12-16 10:35 ` [PATCH 1/4] dm9601: add support for dm9621a based dongle Peter Korsgaard
@ 2013-12-18 22:47   ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2013-12-18 22:47 UTC (permalink / raw)
  To: peter; +Cc: netdev, joseph_chang

From: Peter Korsgaard <peter@korsgaard.com>
Date: Mon, 16 Dec 2013 11:35:32 +0100

> dm9621a is functionally identical to dm9620, so the existing handling can
> directly be used.
> 
> Thanks to Davicom for sending me a dongle.
> 
> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>

Applied.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/4] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a
  2013-12-16 10:35 ` [PATCH 2/4] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a Peter Korsgaard
@ 2013-12-18 22:47   ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2013-12-18 22:47 UTC (permalink / raw)
  To: peter; +Cc: netdev, joseph_chang, stable

From: Peter Korsgaard <peter@korsgaard.com>
Date: Mon, 16 Dec 2013 11:35:33 +0100

> dm9620/dm9621a require room for 4 byte padding even in dm9601 (3 byte
> header) mode.
> 
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>

Applied.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/4] dm9601: make it clear that dm9620/dm9621a are also supported
  2013-12-16 10:35 ` [PATCH 3/4] dm9601: make it clear that dm9620/dm9621a are also supported Peter Korsgaard
@ 2013-12-18 22:47   ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2013-12-18 22:47 UTC (permalink / raw)
  To: peter; +Cc: netdev, joseph_chang

From: Peter Korsgaard <peter@korsgaard.com>
Date: Mon, 16 Dec 2013 11:35:34 +0100

> The driver nowadays also support dm9620/dm9621a based USB 2.0 ethernet
> adapters, so adjust module/driver description and Kconfig help text to
> match.
> 
> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>

Applied.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] dm9601: work around tx fifo sync issue on dm962x
  2013-12-16 10:35 ` [PATCH 4/4] dm9601: work around tx fifo sync issue on dm962x Peter Korsgaard
@ 2013-12-18 22:48   ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2013-12-18 22:48 UTC (permalink / raw)
  To: peter; +Cc: netdev, joseph_chang, stable

From: Peter Korsgaard <peter@korsgaard.com>
Date: Mon, 16 Dec 2013 11:35:35 +0100

> Certain dm962x revisions contain an bug, where if a USB bulk transfer retry
> (E.G. if bulk crc mismatch) happens right after a transfer with odd or
> maxpacket length, the internal tx hardware fifo gets out of sync causing
> the interface to stop working.
> 
> Work around it by adding up to 3 bytes of padding to ensure this situation
> cannot trigger.
> 
> This workaround also means we never pass multiple-of-maxpacket size skb's
> to usbnet, so the length adjustment to handle usbnet's padding of those can
> be removed.
> 
> Cc: <stable@vger.kernel.org>
> Reported-by: Joseph Chang <joseph_chang@davicom.com.tw>
> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>

Applied.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-12-18 22:48 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-16 10:35 [PATCH 0/4] dm9601: improve support for dm962x based devices Peter Korsgaard
2013-12-16 10:35 ` [PATCH 1/4] dm9601: add support for dm9621a based dongle Peter Korsgaard
2013-12-18 22:47   ` David Miller
2013-12-16 10:35 ` [PATCH 2/4] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a Peter Korsgaard
2013-12-18 22:47   ` David Miller
2013-12-16 10:35 ` [PATCH 3/4] dm9601: make it clear that dm9620/dm9621a are also supported Peter Korsgaard
2013-12-18 22:47   ` David Miller
2013-12-16 10:35 ` [PATCH 4/4] dm9601: work around tx fifo sync issue on dm962x Peter Korsgaard
2013-12-18 22:48   ` David Miller

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.