ChangeSet 1.1087.1.4, 2003/02/27 09:16:13-08:00, baldrick@wanadoo.fr [PATCH] USB speedtouch: better proc info Output the correct device name, show the state of the device (for debugging) and of the ADSL line (anyone want to write a graphical utility to show this, like under windows?). We no longer consult the usb_device struct in udsl_atm_proc_read, so don't take a reference to it. Against Greg's current 2.5 USB tree. drivers/usb/misc/speedtouch.c | 68 +++++++++++++++++++++++++++++++++++------- 1 files changed, 58 insertions(+), 10 deletions(-) diff -Nru a/drivers/usb/misc/speedtouch.c b/drivers/usb/misc/speedtouch.c --- a/drivers/usb/misc/speedtouch.c Fri Feb 28 14:48:43 2003 +++ b/drivers/usb/misc/speedtouch.c Fri Feb 28 14:48:43 2003 @@ -156,6 +156,7 @@ /* usb device part */ struct usb_device *usb_dev; + char description [64]; int firmware_loaded; /* atm device part */ @@ -698,8 +699,6 @@ dbg ("udsl_atm_dev_close: killing tasklet"); tasklet_kill (&instance->send_tasklet); - dbg ("udsl_atm_dev_close: freeing USB device"); - usb_put_dev (instance->usb_dev); dbg ("udsl_atm_dev_close: freeing instance"); kfree (instance); } @@ -722,8 +721,10 @@ } if (!left--) - return sprintf (page, "SpeedTouch USB %s-%s (%02x:%02x:%02x:%02x:%02x:%02x)\n", - instance->usb_dev->bus->bus_name, instance->usb_dev->devpath, + return sprintf (page, "%s\n", instance->description); + + if (!left--) + return sprintf (page, "MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", atm_dev->esi[0], atm_dev->esi[1], atm_dev->esi[2], atm_dev->esi[3], atm_dev->esi[4], atm_dev->esi[5]); @@ -735,6 +736,30 @@ atomic_read (&atm_dev->stats.aal5.rx_err), atomic_read (&atm_dev->stats.aal5.rx_drop)); + if (!left--) { + switch (atm_dev->signal) { + case ATM_PHY_SIG_FOUND: + sprintf (page, "Line up"); + break; + case ATM_PHY_SIG_LOST: + sprintf (page, "Line down"); + break; + default: + sprintf (page, "Line state unknown"); + break; + } + + if (instance->usb_dev) { + if (!instance->firmware_loaded) + strcat (page, ", no firmware\n"); + else + strcat (page, ", firmware loaded\n"); + } else + strcat (page, ", disconnected\n"); + + return strlen (page); + } + return 0; } @@ -867,7 +892,8 @@ struct udsl_instance_data *instance; unsigned char mac_str [13]; unsigned char mac [6]; - int i; + int i, length; + char *buf; dbg ("Trying device with Vendor=0x%x, Product=0x%x, ifnum %d", dev->descriptor.idVendor, dev->descriptor.idProduct, ifnum); @@ -962,7 +988,7 @@ instance->atm_dev->ci_range.vpi_bits = ATM_CI_MAX; instance->atm_dev->ci_range.vci_bits = ATM_CI_MAX; - instance->atm_dev->signal = ATM_PHY_SIG_LOST; + instance->atm_dev->signal = ATM_PHY_SIG_UNKNOWN; /* tmp init atm device, set to 128kbit */ instance->atm_dev->link_rate = 128 * 1000 / 424; @@ -976,14 +1002,34 @@ memcpy (instance->atm_dev->esi, mac, 6); - wmb (); + /* device description */ + buf = instance->description; + length = sizeof (instance->description); + + if ((i = usb_string (dev, dev->descriptor.iProduct, buf, length)) < 0) + goto finish; + + buf += i; + length -= i; + + i = snprintf (buf, length, " ("); + buf += i; + length -= i; + + if (length <= 0 || (i = usb_make_path (dev, buf, length)) < 0) + goto finish; + buf += i; + length -= i; + + snprintf (buf, length, ")"); + +finish: + /* ready for ATM callbacks */ instance->atm_dev->dev_data = instance; usb_set_intfdata (intf, instance); - usb_get_dev (dev); - return 0; fail: @@ -1116,8 +1162,10 @@ for (i = 0; i < UDSL_NUMBER_SND_BUFS; i++) kfree (instance->all_buffers[i].base); + instance->usb_dev = NULL; + /* atm finalize */ - shutdown_atm_dev (instance->atm_dev); + shutdown_atm_dev (instance->atm_dev); /* frees instance */ }