This patch:
- Removes Pavel's Zaurus-private crc32 code; the base patch
was from Pavel.
- Addresses two issues Toby Milne reported against the Zaurus:
(a) if skbs had extra framing added (z, net1080, gl620a),
the original size (now too small) was used on tx;
(b) added FLAG_FRAMING_Z so rx packets had enough space
- Removes an oops from the driver model conversion (saved
the wrong pointer). Disconnecting wasn't healthy.
- Forward-ports some ethtool support from the 2.4 version:
PDAs are always connected, so report them that way.
- Stubs in some PXA-250 support for non-Zaurus PDAs.
This is currently commented out; so far those PDAs
only run Linux for bleeding edge developers.
- Minor cleanups.
Please merge. Toby, Pavel ... if you see any issues
along the lines of what Toby reported, please patch
against this. (I did sanity checks, it behaved, but
then it always did so ... and I didn't touch the logic
to change the MTU since I don't know what the Z does.)
- Dave
--- ./drivers/usb-dist/net/usbnet.c Sat Dec 14 10:48:52 2002
+++ ./drivers/usb/net/usbnet.c Sun Dec 15 13:01:30 2002
@@ -36,5 +36,5 @@
* - NetChip 1080 (interoperates with NetChip Win32 drivers)
* - Prolific PL-2301/2302 (replaces "plusb" driver)
- * - SA-1100 based Linux PDAs like iPaq, Yopy, and Zaurus
+ * - PXA-250 or SA-1100 Linux PDAs like iPaq, Yopy, and Zaurus
*
* USB devices can implement their side of this protocol at the cost
@@ -62,6 +62,7 @@
* not responded to repeated support/information requests.
*
- * - SA-1100 PDAs ... the www.handhelds.org SA-1100 support works nicely.
- * Zaurus support has some problems; it's made UHCI die.
+ * - SA-1100 PDAs ... the standard ARM Linux SA-1100 support works nicely,
+ * as found in www.handhelds.org and other kernels. The Sharp/Lineo
+ * kernels use different drivers, which also talk to this code.
*
* Interop with more Win32 drivers may be a good thing.
@@ -117,5 +118,8 @@
* for USB 2.0 TTs) and memory shortages (potential) too. (db)
* Use "locally assigned" IEEE802 address space. (Brad Hards)
- * 18-oct-2002 Support for Zaurus (Pavel Machek), related cleanup (db).
+ * 18-oct-2002 Support for Zaurus (Pavel Machek), related cleanup (db).
+ * 14-dec-2002 Remove Zaurus-private crc32 code (Pavel); 2.5 oops fix,
+ * cleanups and stubbed PXA-250 support (db), fix for framing
+ * issues on Z, net1080, and gl620a (Toby Milne)
*
*-------------------------------------------------------------------------*/
@@ -151,5 +155,6 @@
#define CONFIG_USB_NET1080
#define CONFIG_USB_PL2301
-#define CONFIG_USB_SA1110
+// #define CONFIG_USB_PXA
+#define CONFIG_USB_SA1100
#define CONFIG_USB_ZAURUS
@@ -163,4 +168,6 @@
* Several dozen bytes of IPv4 data can fit in two such transactions.
* One maximum size Ethernet packet takes twenty four of them.
+ * For high speed, each frame comfortably fits almost 36 max size
+ * Ethernet packets (so queues should be bigger).
*/
#ifdef REALLY_QUEUE
@@ -234,4 +241,5 @@ struct driver_info {
#define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */
#define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */
+#define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */
#define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */
@@ -288,4 +296,10 @@ MODULE_PARM_DESC (msg_level, "Initial me
: (in_interrupt () ? "in_interrupt" : "can sleep"))
+/* mostly for PDA style devices, which are always present */
+static int always_connected (struct usbnet *dev)
+{
+ return 0;
+}
+
/*-------------------------------------------------------------------------*/
@@ -365,4 +379,5 @@ static const struct driver_info belkin_i
static const struct driver_info epson2888_info = {
.description = "Epson USB Device",
+ .check_connect = always_connected,
.in = 4, .out = 3,
@@ -458,8 +473,10 @@ static void gl_interrupt_complete (struc
case -ESHUTDOWN:
/* this urb is terminated, clean up */
- dbg("%s - urb shutting down with status: %d", __FUNCTION__, status);
+ dbg("%s - urb shutting down with status: %d",
+ __FUNCTION__, status);
return;
default:
- dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
+ dbg("%s - nonzero urb status received: %d",
+ __FUNCTION__, urb->status);
}
@@ -1225,4 +1242,25 @@ static const struct driver_info prolific
+#ifdef CONFIG_USB_PXA
+
+/*-------------------------------------------------------------------------
+ *
+ * PXA250 and PXA210 use XScale cores (ARM v5TE) with better USB support,
+ * and different USB endpoint numbering than the SA1100 devices.
+ *
+ *-------------------------------------------------------------------------*/
+
+static const struct driver_info pxa_info = {
+ .description = "PXA-250 Linux Device",
+ .check_connect = always_connected,
+
+ .in = 1, .out = 2,
+ .epsize = 64,
+};
+
+#endif /* CONFIG_USB_PXA */
+
+
+
#ifdef CONFIG_USB_SA1100
@@ -1231,8 +1269,8 @@ static const struct driver_info prolific
* Intel's SA-1100 chip integrates basic USB support, and is used
* in PDAs like some iPaqs, the Yopy, some Zaurus models, and more.
- * When they runs Linux, arch/arm/sa1100/usb-eth.c may be used to
+ * When they run Linux, arch/arm/mach-sa1100/usb-eth.c may be used to
* network using minimal USB framing data.
*
- * This describes the driver currently in www.handhelds.org kernels.
+ * This describes the driver currently in standard ARM Linux kernels.
* The Zaurus uses a different driver (see later).
*
@@ -1241,4 +1279,5 @@ static const struct driver_info prolific
static const struct driver_info linuxdev_info = {
.description = "SA-1100 Linux Device",
+ .check_connect = always_connected,
.in = 2, .out = 1,
@@ -1248,4 +1287,5 @@ static const struct driver_info linuxdev
static const struct driver_info yopy_info = {
.description = "Yopy",
+ .check_connect = always_connected,
.in = 2, .out = 1,
@@ -1258,63 +1298,18 @@ static const struct driver_info yopy_inf
#ifdef CONFIG_USB_ZAURUS
+#include <linux/crc32.h>
+
/*-------------------------------------------------------------------------
*
* Zaurus is also a SA-1110 based PDA, but one using a different driver
- * for its USB slave/target controller than the case above.
+ * (and framing) for its USB slave/gadget controller than the case above.
*
- * The key differences are that (a) it's got a msft-friendly configuration,
- * and (b) the linux-friendly framing adds a crc32 to cope with some
- * memory corruption observed with usb-to-memory DMA in some cases.
+ * For the current version of that driver, the main way that framing is
+ * nonstandard (also from perspective of the CDC ethernet model!) is a
+ * crc32, added to help detect when some sa1100 usb-to-memory DMA errata
+ * haven't been fully worked around.
*
*-------------------------------------------------------------------------*/
-static const u32 crc32_table [256] = {
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3,
- 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd,
0xe7b82d07, 0x90bf1d91,
- 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb,
0xf4d4b551, 0x83d385c7,
- 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5,
- 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447,
0xd20d85fd, 0xa50ab56b,
- 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75,
0xdcd60dcf, 0xabd13d59,
- 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f,
- 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11,
0xc1611dab, 0xb6662d3d,
- 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
0x9fbfe4a5, 0xe8b8d433,
- 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01,
- 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b,
0x8208f4c1, 0xf50fc457,
- 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49,
0x8cd37cf3, 0xfbd44c65,
- 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb,
- 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
0xaa0a4c5f, 0xdd0d7cc9,
- 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3,
0xb966d409, 0xce61e49f,
- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad,
- 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af,
0x04db2615, 0x73dc1683,
- 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d,
0x0a00ae27, 0x7d079eb1,
- 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7,
- 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9,
0x17b7be43, 0x60b08ed5,
- 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767,
0x3fb506dd, 0x48b2364b,
- 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79,
- 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703,
0x220216b9, 0x5505262f,
- 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
0x2cd99e8b, 0x5bdeae1d,
- 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713,
- 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d,
0x7cdcefb7, 0x0bdbdf21,
- 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b,
0x6fb077e1, 0x18b74777,
- 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45,
- 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d, 0x3e6e77db,
- 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5,
0x47b2cf7f, 0x30b5ffe9,
- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf,
- 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1,
0x5a05df1b, 0x2d02ef8d
-};
-
-#define CRC32_INITFCS 0xffffffff // Initial FCS value
-#define CRC32_FCS(fcs, c) (((fcs) >> 8) ^ crc32_table[((fcs) ^ (c)) & 0xff])
-
-/* fcs_compute32 - memcpy and calculate fcs
- * Perform a memcpy and calculate fcs using ppp 32bit CRC algorithm.
- */
-static inline u32 fcs_compute32 (unsigned char *sp, int len, u32 fcs)
-{
- for (;len-- > 0; fcs = CRC32_FCS (fcs, *sp++))
- continue;
- return fcs;
-}
-
static struct sk_buff *
zaurus_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags)
@@ -1335,9 +1330,7 @@ zaurus_tx_fixup (struct usbnet *dev, str
u32 fcs;
done:
- fcs = fcs_compute32 (skb->data, skb->len, CRC32_INITFCS);
+ fcs = crc32_le (~0, skb->data, skb->len);
fcs = ~fcs;
- // ? add optional byte make addr even ?
-
*skb_put (skb, 1) = fcs & 0xff;
*skb_put (skb, 1) = (fcs>> 8) & 0xff;
@@ -1350,4 +1343,6 @@ done:
static const struct driver_info zaurus_sl5x00_info = {
.description = "Sharp Zaurus SL-5x00",
+ .flags = FLAG_FRAMING_Z,
+ .check_connect = always_connected,
.tx_fixup = zaurus_tx_fixup,
@@ -1357,4 +1352,6 @@ static const struct driver_info zaurus_s
static const struct driver_info zaurus_sla300_info = {
.description = "Sharp Zaurus SL-A300",
+ .flags = FLAG_FRAMING_Z,
+ .check_connect = always_connected,
.tx_fixup = zaurus_tx_fixup,
@@ -1362,4 +1359,7 @@ static const struct driver_info zaurus_s
.epsize = 64,
};
+
+// SL-5600 and C-700 are PXA based; should resemble A300
+
#endif
@@ -1404,5 +1404,5 @@ static struct net_device_stats *usbnet_g
/*-------------------------------------------------------------------------*/
-/* urb completions are currently in_irq; avoid doing real work then. */
+/* urb completions may be in_irq; avoid doing real work then. */
static void defer_bh (struct usbnet *dev, struct sk_buff *skb)
@@ -1458,4 +1458,9 @@ static void rx_submit (struct usbnet *de
else
#endif
+#ifdef CONFIG_USB_ZAURUS
+ if (dev->driver_info->flags & FLAG_FRAMING_Z)
+ size = 6 + (sizeof (struct ethhdr) + dev->net.mtu);
+ else
+#endif
size = (sizeof (struct ethhdr) + dev->net.mtu);
@@ -1477,9 +1482,4 @@ static void rx_submit (struct usbnet *de
skb->data, size, rx_complete, skb);
urb->transfer_flags |= URB_ASYNC_UNLINK;
-#if 0
- // Idle-but-posted reads with UHCI really chew up
- // PCI bandwidth unless FSBR is disabled
- urb->transfer_flags |= URB_NO_FSBR;
-#endif
spin_lock_irqsave (&dev->rxq.lock, lockflags);
@@ -1525,6 +1525,4 @@ static inline void rx_process (struct us
int status;
-// FIXME: eth_copy_and_csum "small" packets to new SKB (small < ~200 bytes) ?
-
skb->dev = &dev->net;
skb->protocol = eth_type_trans (skb, &dev->net);
@@ -1905,5 +1903,5 @@ static int usbnet_start_xmit (struct sk_
{
struct usbnet *dev = (struct usbnet *) net->priv;
- int length = skb->len;
+ int length;
int retval = NET_XMIT_SUCCESS;
struct urb *urb = 0;
@@ -1925,4 +1923,5 @@ static int usbnet_start_xmit (struct sk_
}
}
+ length = skb->len;
if (!(urb = usb_alloc_urb (0, GFP_ATOMIC))) {
@@ -1939,4 +1938,5 @@ static int usbnet_start_xmit (struct sk_
// FIXME: reorganize a bit, so that fixup() fills out NetChip
// framing too. (Packet ID update needs the spinlock...)
+ // [ BETTER: we already own net->xmit_lock, that's enough ]
#ifdef CONFIG_USB_NET1080
@@ -1959,5 +1959,4 @@ static int usbnet_start_xmit (struct sk_
skb->data, skb->len, tx_complete, skb);
urb->transfer_flags |= URB_ASYNC_UNLINK;
- // FIXME urb->timeout = ... jiffies ... ;
spin_lock_irqsave (&dev->txq.lock, flags);
@@ -2199,5 +2198,5 @@ usbnet_probe (struct usb_interface *udev
// ok, it's ready to go.
- dev_set_drvdata (&udev->dev, net);
+ dev_set_drvdata (&udev->dev, dev);
mutex_lock (&usbnet_mutex);
list_add (&dev->dev_list, &usbnet_list);
@@ -2281,7 +2280,19 @@ static const struct usb_device_id produc
#endif
+#ifdef CONFIG_USB_PXA
+/*
+ * PXA250 or PXA210 ... these use a "usb-eth" driver much like
+ * the sa1100 one.
+ */
+{
+ // Compaq "Itsy" vendor/product id, version "2.0"
+ USB_DEVICE_VER (0x049F, 0x505A, 0x0200, 0x0200),
+ .driver_info = (unsigned long) &pxa_info,
+},
+#endif
+
#ifdef CONFIG_USB_SA1100
/*
- * SA-1100 using www.handhelds.org kernels, or compatible.
+ * SA-1100 using standard ARM Linux kernels, or compatible.
* Often used when talking to Linux PDAs (iPaq, Yopy, etc).
* The sa-1100 "usb-eth" driver handles the basic framing.
@@ -2289,5 +2300,6 @@ static const struct usb_device_id produc
{
// 1183 = 0x049F, both used as hex values?
- USB_DEVICE (0x049F, 0x505A), // iPaq: Compaq "Itsy"
+ // Compaq "Itsy" vendor/product id, version "0.0"
+ USB_DEVICE_VER (0x049F, 0x505A, 0, 0),
.driver_info = (unsigned long) &linuxdev_info,
}, {
@@ -2324,6 +2336,4 @@ static const struct usb_device_id produc
#endif
-/* KC2190 from www.sepoong.co.kr "InstaNET" */
-
{ }, // END
};