USB: let both new_id and remove_id show dynamic id list
authorBjørn Mork <bjorn@mork.no>
Sun, 13 May 2012 10:34:59 +0000 (12:34 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 May 2012 16:30:40 +0000 (09:30 -0700)
This enables the current list of dynamic IDs to be read out through
either new_id or remove_id.

Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/ABI/testing/sysfs-bus-usb
drivers/usb/core/driver.c

index 7c22a532fdfb8c978a6c3c44b4a86ef88dc66b36..6ae9fec8e07d76440314e4067b3858584adb3512 100644 (file)
@@ -135,6 +135,17 @@ Description:
                for the device and attempt to bind to it.  For example:
                # echo "8086 10f5" > /sys/bus/usb/drivers/foo/new_id
 
+               Reading from this file will list all dynamically added
+               device IDs in the same format, with one entry per
+               line. For example:
+               # cat /sys/bus/usb/drivers/foo/new_id
+               8086 10f5
+               dead beef 06
+               f00d cafe
+
+               The list will be truncated at PAGE_SIZE bytes due to
+               sysfs restrictions.
+
 What:          /sys/bus/usb-serial/drivers/.../new_id
 Date:          October 2011
 Contact:       linux-usb@vger.kernel.org
@@ -157,6 +168,10 @@ Description:
                match the driver to the device.  For example:
                # echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id
 
+               Reading from this file will list the dynamically added
+               device IDs, exactly like reading from the entry
+               "/sys/bus/usb/drivers/.../new_id"
+
 What:          /sys/bus/usb/device/.../avoid_reset_quirk
 Date:          December 2009
 Contact:       Oliver Neukum <oliver@neukum.org>
index 112a7ae5095c0b9c715b087ab602b02ced25d6f2..69919b25777580bc79d397a0ab80bf9cd5260a86 100644 (file)
@@ -79,6 +79,23 @@ ssize_t usb_store_new_id(struct usb_dynids *dynids,
 }
 EXPORT_SYMBOL_GPL(usb_store_new_id);
 
+static ssize_t show_dynids(struct device_driver *driver, char *buf)
+{
+       struct usb_dynid *dynid;
+       struct usb_driver *usb_drv = to_usb_driver(driver);
+       size_t count = 0;
+
+       list_for_each_entry(dynid, &usb_drv->dynids.list, node)
+               if (dynid->id.bInterfaceClass != 0)
+                       count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x %02x\n",
+                                          dynid->id.idVendor, dynid->id.idProduct,
+                                          dynid->id.bInterfaceClass);
+               else
+                       count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x\n",
+                                          dynid->id.idVendor, dynid->id.idProduct);
+       return count;
+}
+
 static ssize_t store_new_id(struct device_driver *driver,
                            const char *buf, size_t count)
 {
@@ -86,7 +103,7 @@ static ssize_t store_new_id(struct device_driver *driver,
 
        return usb_store_new_id(&usb_drv->dynids, driver, buf, count);
 }
-static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
+static DRIVER_ATTR(new_id, S_IRUGO | S_IWUSR, show_dynids, store_new_id);
 
 /**
  * store_remove_id - remove a USB device ID from this driver
@@ -127,7 +144,7 @@ store_remove_id(struct device_driver *driver, const char *buf, size_t count)
                return retval;
        return count;
 }
-static DRIVER_ATTR(remove_id, S_IWUSR, NULL, store_remove_id);
+static DRIVER_ATTR(remove_id, S_IRUGO | S_IWUSR, show_dynids, store_remove_id);
 
 static int usb_create_newid_files(struct usb_driver *usb_drv)
 {