diff options
author | Bjørn Mork <bjorn@mork.no> | 2012-05-13 06:34:59 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-05-14 12:30:40 -0400 |
commit | e6bbcef0211ed75db1ca3017551a584aed4e00be (patch) | |
tree | 67143d849f6338e2398fad06b2ca9a97534608da | |
parent | 581791f5c7a480b2cc3431af9a6e799ffd51eb5e (diff) |
USB: let both new_id and remove_id show dynamic id list
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>
-rw-r--r-- | Documentation/ABI/testing/sysfs-bus-usb | 15 | ||||
-rw-r--r-- | drivers/usb/core/driver.c | 21 |
2 files changed, 34 insertions, 2 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-usb b/Documentation/ABI/testing/sysfs-bus-usb index 7c22a532fdfb..6ae9fec8e07d 100644 --- a/Documentation/ABI/testing/sysfs-bus-usb +++ b/Documentation/ABI/testing/sysfs-bus-usb | |||
@@ -135,6 +135,17 @@ Description: | |||
135 | for the device and attempt to bind to it. For example: | 135 | for the device and attempt to bind to it. For example: |
136 | # echo "8086 10f5" > /sys/bus/usb/drivers/foo/new_id | 136 | # echo "8086 10f5" > /sys/bus/usb/drivers/foo/new_id |
137 | 137 | ||
138 | Reading from this file will list all dynamically added | ||
139 | device IDs in the same format, with one entry per | ||
140 | line. For example: | ||
141 | # cat /sys/bus/usb/drivers/foo/new_id | ||
142 | 8086 10f5 | ||
143 | dead beef 06 | ||
144 | f00d cafe | ||
145 | |||
146 | The list will be truncated at PAGE_SIZE bytes due to | ||
147 | sysfs restrictions. | ||
148 | |||
138 | What: /sys/bus/usb-serial/drivers/.../new_id | 149 | What: /sys/bus/usb-serial/drivers/.../new_id |
139 | Date: October 2011 | 150 | Date: October 2011 |
140 | Contact: linux-usb@vger.kernel.org | 151 | Contact: linux-usb@vger.kernel.org |
@@ -157,6 +168,10 @@ Description: | |||
157 | match the driver to the device. For example: | 168 | match the driver to the device. For example: |
158 | # echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id | 169 | # echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id |
159 | 170 | ||
171 | Reading from this file will list the dynamically added | ||
172 | device IDs, exactly like reading from the entry | ||
173 | "/sys/bus/usb/drivers/.../new_id" | ||
174 | |||
160 | What: /sys/bus/usb/device/.../avoid_reset_quirk | 175 | What: /sys/bus/usb/device/.../avoid_reset_quirk |
161 | Date: December 2009 | 176 | Date: December 2009 |
162 | Contact: Oliver Neukum <oliver@neukum.org> | 177 | Contact: Oliver Neukum <oliver@neukum.org> |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 112a7ae5095c..69919b257775 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -79,6 +79,23 @@ ssize_t usb_store_new_id(struct usb_dynids *dynids, | |||
79 | } | 79 | } |
80 | EXPORT_SYMBOL_GPL(usb_store_new_id); | 80 | EXPORT_SYMBOL_GPL(usb_store_new_id); |
81 | 81 | ||
82 | static ssize_t show_dynids(struct device_driver *driver, char *buf) | ||
83 | { | ||
84 | struct usb_dynid *dynid; | ||
85 | struct usb_driver *usb_drv = to_usb_driver(driver); | ||
86 | size_t count = 0; | ||
87 | |||
88 | list_for_each_entry(dynid, &usb_drv->dynids.list, node) | ||
89 | if (dynid->id.bInterfaceClass != 0) | ||
90 | count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x %02x\n", | ||
91 | dynid->id.idVendor, dynid->id.idProduct, | ||
92 | dynid->id.bInterfaceClass); | ||
93 | else | ||
94 | count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x\n", | ||
95 | dynid->id.idVendor, dynid->id.idProduct); | ||
96 | return count; | ||
97 | } | ||
98 | |||
82 | static ssize_t store_new_id(struct device_driver *driver, | 99 | static ssize_t store_new_id(struct device_driver *driver, |
83 | const char *buf, size_t count) | 100 | const char *buf, size_t count) |
84 | { | 101 | { |
@@ -86,7 +103,7 @@ static ssize_t store_new_id(struct device_driver *driver, | |||
86 | 103 | ||
87 | return usb_store_new_id(&usb_drv->dynids, driver, buf, count); | 104 | return usb_store_new_id(&usb_drv->dynids, driver, buf, count); |
88 | } | 105 | } |
89 | static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id); | 106 | static DRIVER_ATTR(new_id, S_IRUGO | S_IWUSR, show_dynids, store_new_id); |
90 | 107 | ||
91 | /** | 108 | /** |
92 | * store_remove_id - remove a USB device ID from this driver | 109 | * 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) | |||
127 | return retval; | 144 | return retval; |
128 | return count; | 145 | return count; |
129 | } | 146 | } |
130 | static DRIVER_ATTR(remove_id, S_IWUSR, NULL, store_remove_id); | 147 | static DRIVER_ATTR(remove_id, S_IRUGO | S_IWUSR, show_dynids, store_remove_id); |
131 | 148 | ||
132 | static int usb_create_newid_files(struct usb_driver *usb_drv) | 149 | static int usb_create_newid_files(struct usb_driver *usb_drv) |
133 | { | 150 | { |