diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-08-23 19:05:26 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-08-25 18:12:03 -0400 |
commit | d03f254f2ee2a708af9a7347402d9aed7f6cc4c1 (patch) | |
tree | f07afa1896e3d87385f3aa0bcc475ed5874ac210 /drivers/usb/core/sysfs.c | |
parent | 598d03610a0169eb88d2b08d6743be31b3b9c258 (diff) |
USB: core: be specific about attribute permissions
Instead of having to audit all sysfs attributes, to ensure we get them
right, use the default macros the driver core provides us (read-only,
read-write) to make the code simpler, and to prevent any mistakes from
ever happening.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/core/sysfs.c')
-rw-r--r-- | drivers/usb/core/sysfs.c | 303 |
1 files changed, 139 insertions, 164 deletions
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index d9284b998bd7..6d2c8edb1ffe 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
@@ -18,8 +18,8 @@ | |||
18 | 18 | ||
19 | /* Active configuration fields */ | 19 | /* Active configuration fields */ |
20 | #define usb_actconfig_show(field, format_string) \ | 20 | #define usb_actconfig_show(field, format_string) \ |
21 | static ssize_t show_##field(struct device *dev, \ | 21 | static ssize_t field##_show(struct device *dev, \ |
22 | struct device_attribute *attr, char *buf) \ | 22 | struct device_attribute *attr, char *buf) \ |
23 | { \ | 23 | { \ |
24 | struct usb_device *udev; \ | 24 | struct usb_device *udev; \ |
25 | struct usb_host_config *actconfig; \ | 25 | struct usb_host_config *actconfig; \ |
@@ -35,12 +35,12 @@ static ssize_t show_##field(struct device *dev, \ | |||
35 | 35 | ||
36 | #define usb_actconfig_attr(field, format_string) \ | 36 | #define usb_actconfig_attr(field, format_string) \ |
37 | usb_actconfig_show(field, format_string) \ | 37 | usb_actconfig_show(field, format_string) \ |
38 | static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); | 38 | static DEVICE_ATTR_RO(field) |
39 | 39 | ||
40 | usb_actconfig_attr(bNumInterfaces, "%2d\n") | 40 | usb_actconfig_attr(bNumInterfaces, "%2d\n"); |
41 | usb_actconfig_attr(bmAttributes, "%2x\n") | 41 | usb_actconfig_attr(bmAttributes, "%2x\n"); |
42 | 42 | ||
43 | static ssize_t show_bMaxPower(struct device *dev, | 43 | static ssize_t bMaxPower_show(struct device *dev, |
44 | struct device_attribute *attr, char *buf) | 44 | struct device_attribute *attr, char *buf) |
45 | { | 45 | { |
46 | struct usb_device *udev; | 46 | struct usb_device *udev; |
@@ -52,9 +52,9 @@ static ssize_t show_bMaxPower(struct device *dev, | |||
52 | return 0; | 52 | return 0; |
53 | return sprintf(buf, "%dmA\n", usb_get_max_power(udev, actconfig)); | 53 | return sprintf(buf, "%dmA\n", usb_get_max_power(udev, actconfig)); |
54 | } | 54 | } |
55 | static DEVICE_ATTR(bMaxPower, S_IRUGO, show_bMaxPower, NULL); | 55 | static DEVICE_ATTR_RO(bMaxPower); |
56 | 56 | ||
57 | static ssize_t show_configuration_string(struct device *dev, | 57 | static ssize_t configuration_show(struct device *dev, |
58 | struct device_attribute *attr, char *buf) | 58 | struct device_attribute *attr, char *buf) |
59 | { | 59 | { |
60 | struct usb_device *udev; | 60 | struct usb_device *udev; |
@@ -66,14 +66,14 @@ static ssize_t show_configuration_string(struct device *dev, | |||
66 | return 0; | 66 | return 0; |
67 | return sprintf(buf, "%s\n", actconfig->string); | 67 | return sprintf(buf, "%s\n", actconfig->string); |
68 | } | 68 | } |
69 | static DEVICE_ATTR(configuration, S_IRUGO, show_configuration_string, NULL); | 69 | static DEVICE_ATTR_RO(configuration); |
70 | 70 | ||
71 | /* configuration value is always present, and r/w */ | 71 | /* configuration value is always present, and r/w */ |
72 | usb_actconfig_show(bConfigurationValue, "%u\n"); | 72 | usb_actconfig_show(bConfigurationValue, "%u\n"); |
73 | 73 | ||
74 | static ssize_t | 74 | static ssize_t bConfigurationValue_store(struct device *dev, |
75 | set_bConfigurationValue(struct device *dev, struct device_attribute *attr, | 75 | struct device_attribute *attr, |
76 | const char *buf, size_t count) | 76 | const char *buf, size_t count) |
77 | { | 77 | { |
78 | struct usb_device *udev = to_usb_device(dev); | 78 | struct usb_device *udev = to_usb_device(dev); |
79 | int config, value; | 79 | int config, value; |
@@ -85,13 +85,12 @@ set_bConfigurationValue(struct device *dev, struct device_attribute *attr, | |||
85 | usb_unlock_device(udev); | 85 | usb_unlock_device(udev); |
86 | return (value < 0) ? value : count; | 86 | return (value < 0) ? value : count; |
87 | } | 87 | } |
88 | |||
89 | static DEVICE_ATTR_IGNORE_LOCKDEP(bConfigurationValue, S_IRUGO | S_IWUSR, | 88 | static DEVICE_ATTR_IGNORE_LOCKDEP(bConfigurationValue, S_IRUGO | S_IWUSR, |
90 | show_bConfigurationValue, set_bConfigurationValue); | 89 | bConfigurationValue_show, bConfigurationValue_store); |
91 | 90 | ||
92 | /* String fields */ | 91 | /* String fields */ |
93 | #define usb_string_attr(name) \ | 92 | #define usb_string_attr(name) \ |
94 | static ssize_t show_##name(struct device *dev, \ | 93 | static ssize_t name##_show(struct device *dev, \ |
95 | struct device_attribute *attr, char *buf) \ | 94 | struct device_attribute *attr, char *buf) \ |
96 | { \ | 95 | { \ |
97 | struct usb_device *udev; \ | 96 | struct usb_device *udev; \ |
@@ -103,14 +102,14 @@ static ssize_t show_##name(struct device *dev, \ | |||
103 | usb_unlock_device(udev); \ | 102 | usb_unlock_device(udev); \ |
104 | return retval; \ | 103 | return retval; \ |
105 | } \ | 104 | } \ |
106 | static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL); | 105 | static DEVICE_ATTR_RO(name) |
107 | 106 | ||
108 | usb_string_attr(product); | 107 | usb_string_attr(product); |
109 | usb_string_attr(manufacturer); | 108 | usb_string_attr(manufacturer); |
110 | usb_string_attr(serial); | 109 | usb_string_attr(serial); |
111 | 110 | ||
112 | static ssize_t | 111 | static ssize_t speed_show(struct device *dev, struct device_attribute *attr, |
113 | show_speed(struct device *dev, struct device_attribute *attr, char *buf) | 112 | char *buf) |
114 | { | 113 | { |
115 | struct usb_device *udev; | 114 | struct usb_device *udev; |
116 | char *speed; | 115 | char *speed; |
@@ -139,40 +138,40 @@ show_speed(struct device *dev, struct device_attribute *attr, char *buf) | |||
139 | } | 138 | } |
140 | return sprintf(buf, "%s\n", speed); | 139 | return sprintf(buf, "%s\n", speed); |
141 | } | 140 | } |
142 | static DEVICE_ATTR(speed, S_IRUGO, show_speed, NULL); | 141 | static DEVICE_ATTR_RO(speed); |
143 | 142 | ||
144 | static ssize_t | 143 | static ssize_t busnum_show(struct device *dev, struct device_attribute *attr, |
145 | show_busnum(struct device *dev, struct device_attribute *attr, char *buf) | 144 | char *buf) |
146 | { | 145 | { |
147 | struct usb_device *udev; | 146 | struct usb_device *udev; |
148 | 147 | ||
149 | udev = to_usb_device(dev); | 148 | udev = to_usb_device(dev); |
150 | return sprintf(buf, "%d\n", udev->bus->busnum); | 149 | return sprintf(buf, "%d\n", udev->bus->busnum); |
151 | } | 150 | } |
152 | static DEVICE_ATTR(busnum, S_IRUGO, show_busnum, NULL); | 151 | static DEVICE_ATTR_RO(busnum); |
153 | 152 | ||
154 | static ssize_t | 153 | static ssize_t devnum_show(struct device *dev, struct device_attribute *attr, |
155 | show_devnum(struct device *dev, struct device_attribute *attr, char *buf) | 154 | char *buf) |
156 | { | 155 | { |
157 | struct usb_device *udev; | 156 | struct usb_device *udev; |
158 | 157 | ||
159 | udev = to_usb_device(dev); | 158 | udev = to_usb_device(dev); |
160 | return sprintf(buf, "%d\n", udev->devnum); | 159 | return sprintf(buf, "%d\n", udev->devnum); |
161 | } | 160 | } |
162 | static DEVICE_ATTR(devnum, S_IRUGO, show_devnum, NULL); | 161 | static DEVICE_ATTR_RO(devnum); |
163 | 162 | ||
164 | static ssize_t | 163 | static ssize_t devpath_show(struct device *dev, struct device_attribute *attr, |
165 | show_devpath(struct device *dev, struct device_attribute *attr, char *buf) | 164 | char *buf) |
166 | { | 165 | { |
167 | struct usb_device *udev; | 166 | struct usb_device *udev; |
168 | 167 | ||
169 | udev = to_usb_device(dev); | 168 | udev = to_usb_device(dev); |
170 | return sprintf(buf, "%s\n", udev->devpath); | 169 | return sprintf(buf, "%s\n", udev->devpath); |
171 | } | 170 | } |
172 | static DEVICE_ATTR(devpath, S_IRUGO, show_devpath, NULL); | 171 | static DEVICE_ATTR_RO(devpath); |
173 | 172 | ||
174 | static ssize_t | 173 | static ssize_t version_show(struct device *dev, struct device_attribute *attr, |
175 | show_version(struct device *dev, struct device_attribute *attr, char *buf) | 174 | char *buf) |
176 | { | 175 | { |
177 | struct usb_device *udev; | 176 | struct usb_device *udev; |
178 | u16 bcdUSB; | 177 | u16 bcdUSB; |
@@ -181,30 +180,30 @@ show_version(struct device *dev, struct device_attribute *attr, char *buf) | |||
181 | bcdUSB = le16_to_cpu(udev->descriptor.bcdUSB); | 180 | bcdUSB = le16_to_cpu(udev->descriptor.bcdUSB); |
182 | return sprintf(buf, "%2x.%02x\n", bcdUSB >> 8, bcdUSB & 0xff); | 181 | return sprintf(buf, "%2x.%02x\n", bcdUSB >> 8, bcdUSB & 0xff); |
183 | } | 182 | } |
184 | static DEVICE_ATTR(version, S_IRUGO, show_version, NULL); | 183 | static DEVICE_ATTR_RO(version); |
185 | 184 | ||
186 | static ssize_t | 185 | static ssize_t maxchild_show(struct device *dev, struct device_attribute *attr, |
187 | show_maxchild(struct device *dev, struct device_attribute *attr, char *buf) | 186 | char *buf) |
188 | { | 187 | { |
189 | struct usb_device *udev; | 188 | struct usb_device *udev; |
190 | 189 | ||
191 | udev = to_usb_device(dev); | 190 | udev = to_usb_device(dev); |
192 | return sprintf(buf, "%d\n", udev->maxchild); | 191 | return sprintf(buf, "%d\n", udev->maxchild); |
193 | } | 192 | } |
194 | static DEVICE_ATTR(maxchild, S_IRUGO, show_maxchild, NULL); | 193 | static DEVICE_ATTR_RO(maxchild); |
195 | 194 | ||
196 | static ssize_t | 195 | static ssize_t quirks_show(struct device *dev, struct device_attribute *attr, |
197 | show_quirks(struct device *dev, struct device_attribute *attr, char *buf) | 196 | char *buf) |
198 | { | 197 | { |
199 | struct usb_device *udev; | 198 | struct usb_device *udev; |
200 | 199 | ||
201 | udev = to_usb_device(dev); | 200 | udev = to_usb_device(dev); |
202 | return sprintf(buf, "0x%x\n", udev->quirks); | 201 | return sprintf(buf, "0x%x\n", udev->quirks); |
203 | } | 202 | } |
204 | static DEVICE_ATTR(quirks, S_IRUGO, show_quirks, NULL); | 203 | static DEVICE_ATTR_RO(quirks); |
205 | 204 | ||
206 | static ssize_t | 205 | static ssize_t avoid_reset_quirk_show(struct device *dev, |
207 | show_avoid_reset_quirk(struct device *dev, struct device_attribute *attr, char *buf) | 206 | struct device_attribute *attr, char *buf) |
208 | { | 207 | { |
209 | struct usb_device *udev; | 208 | struct usb_device *udev; |
210 | 209 | ||
@@ -212,9 +211,9 @@ show_avoid_reset_quirk(struct device *dev, struct device_attribute *attr, char * | |||
212 | return sprintf(buf, "%d\n", !!(udev->quirks & USB_QUIRK_RESET)); | 211 | return sprintf(buf, "%d\n", !!(udev->quirks & USB_QUIRK_RESET)); |
213 | } | 212 | } |
214 | 213 | ||
215 | static ssize_t | 214 | static ssize_t avoid_reset_quirk_store(struct device *dev, |
216 | set_avoid_reset_quirk(struct device *dev, struct device_attribute *attr, | 215 | struct device_attribute *attr, |
217 | const char *buf, size_t count) | 216 | const char *buf, size_t count) |
218 | { | 217 | { |
219 | struct usb_device *udev = to_usb_device(dev); | 218 | struct usb_device *udev = to_usb_device(dev); |
220 | int val; | 219 | int val; |
@@ -229,22 +228,20 @@ set_avoid_reset_quirk(struct device *dev, struct device_attribute *attr, | |||
229 | usb_unlock_device(udev); | 228 | usb_unlock_device(udev); |
230 | return count; | 229 | return count; |
231 | } | 230 | } |
231 | static DEVICE_ATTR_RW(avoid_reset_quirk); | ||
232 | 232 | ||
233 | static DEVICE_ATTR(avoid_reset_quirk, S_IRUGO | S_IWUSR, | 233 | static ssize_t urbnum_show(struct device *dev, struct device_attribute *attr, |
234 | show_avoid_reset_quirk, set_avoid_reset_quirk); | 234 | char *buf) |
235 | |||
236 | static ssize_t | ||
237 | show_urbnum(struct device *dev, struct device_attribute *attr, char *buf) | ||
238 | { | 235 | { |
239 | struct usb_device *udev; | 236 | struct usb_device *udev; |
240 | 237 | ||
241 | udev = to_usb_device(dev); | 238 | udev = to_usb_device(dev); |
242 | return sprintf(buf, "%d\n", atomic_read(&udev->urbnum)); | 239 | return sprintf(buf, "%d\n", atomic_read(&udev->urbnum)); |
243 | } | 240 | } |
244 | static DEVICE_ATTR(urbnum, S_IRUGO, show_urbnum, NULL); | 241 | static DEVICE_ATTR_RO(urbnum); |
245 | 242 | ||
246 | static ssize_t | 243 | static ssize_t removable_show(struct device *dev, struct device_attribute *attr, |
247 | show_removable(struct device *dev, struct device_attribute *attr, char *buf) | 244 | char *buf) |
248 | { | 245 | { |
249 | struct usb_device *udev; | 246 | struct usb_device *udev; |
250 | char *state; | 247 | char *state; |
@@ -264,30 +261,29 @@ show_removable(struct device *dev, struct device_attribute *attr, char *buf) | |||
264 | 261 | ||
265 | return sprintf(buf, "%s\n", state); | 262 | return sprintf(buf, "%s\n", state); |
266 | } | 263 | } |
267 | static DEVICE_ATTR(removable, S_IRUGO, show_removable, NULL); | 264 | static DEVICE_ATTR_RO(removable); |
268 | 265 | ||
269 | static ssize_t | 266 | static ssize_t ltm_capable_show(struct device *dev, |
270 | show_ltm_capable(struct device *dev, struct device_attribute *attr, char *buf) | 267 | struct device_attribute *attr, char *buf) |
271 | { | 268 | { |
272 | if (usb_device_supports_ltm(to_usb_device(dev))) | 269 | if (usb_device_supports_ltm(to_usb_device(dev))) |
273 | return sprintf(buf, "%s\n", "yes"); | 270 | return sprintf(buf, "%s\n", "yes"); |
274 | return sprintf(buf, "%s\n", "no"); | 271 | return sprintf(buf, "%s\n", "no"); |
275 | } | 272 | } |
276 | static DEVICE_ATTR(ltm_capable, S_IRUGO, show_ltm_capable, NULL); | 273 | static DEVICE_ATTR_RO(ltm_capable); |
277 | 274 | ||
278 | #ifdef CONFIG_PM | 275 | #ifdef CONFIG_PM |
279 | 276 | ||
280 | static ssize_t | 277 | static ssize_t persist_show(struct device *dev, struct device_attribute *attr, |
281 | show_persist(struct device *dev, struct device_attribute *attr, char *buf) | 278 | char *buf) |
282 | { | 279 | { |
283 | struct usb_device *udev = to_usb_device(dev); | 280 | struct usb_device *udev = to_usb_device(dev); |
284 | 281 | ||
285 | return sprintf(buf, "%d\n", udev->persist_enabled); | 282 | return sprintf(buf, "%d\n", udev->persist_enabled); |
286 | } | 283 | } |
287 | 284 | ||
288 | static ssize_t | 285 | static ssize_t persist_store(struct device *dev, struct device_attribute *attr, |
289 | set_persist(struct device *dev, struct device_attribute *attr, | 286 | const char *buf, size_t count) |
290 | const char *buf, size_t count) | ||
291 | { | 287 | { |
292 | struct usb_device *udev = to_usb_device(dev); | 288 | struct usb_device *udev = to_usb_device(dev); |
293 | int value; | 289 | int value; |
@@ -304,8 +300,7 @@ set_persist(struct device *dev, struct device_attribute *attr, | |||
304 | usb_unlock_device(udev); | 300 | usb_unlock_device(udev); |
305 | return count; | 301 | return count; |
306 | } | 302 | } |
307 | 303 | static DEVICE_ATTR_RW(persist); | |
308 | static DEVICE_ATTR(persist, S_IRUGO | S_IWUSR, show_persist, set_persist); | ||
309 | 304 | ||
310 | static int add_persist_attributes(struct device *dev) | 305 | static int add_persist_attributes(struct device *dev) |
311 | { | 306 | { |
@@ -340,17 +335,15 @@ static void remove_persist_attributes(struct device *dev) | |||
340 | 335 | ||
341 | #ifdef CONFIG_PM_RUNTIME | 336 | #ifdef CONFIG_PM_RUNTIME |
342 | 337 | ||
343 | static ssize_t | 338 | static ssize_t connected_duration_show(struct device *dev, |
344 | show_connected_duration(struct device *dev, struct device_attribute *attr, | 339 | struct device_attribute *attr, char *buf) |
345 | char *buf) | ||
346 | { | 340 | { |
347 | struct usb_device *udev = to_usb_device(dev); | 341 | struct usb_device *udev = to_usb_device(dev); |
348 | 342 | ||
349 | return sprintf(buf, "%u\n", | 343 | return sprintf(buf, "%u\n", |
350 | jiffies_to_msecs(jiffies - udev->connect_time)); | 344 | jiffies_to_msecs(jiffies - udev->connect_time)); |
351 | } | 345 | } |
352 | 346 | static DEVICE_ATTR_RO(connected_duration); | |
353 | static DEVICE_ATTR(connected_duration, S_IRUGO, show_connected_duration, NULL); | ||
354 | 347 | ||
355 | /* | 348 | /* |
356 | * If the device is resumed, the last time the device was suspended has | 349 | * If the device is resumed, the last time the device was suspended has |
@@ -359,9 +352,8 @@ static DEVICE_ATTR(connected_duration, S_IRUGO, show_connected_duration, NULL); | |||
359 | * | 352 | * |
360 | * If the device is suspended, the active_duration is up-to-date. | 353 | * If the device is suspended, the active_duration is up-to-date. |
361 | */ | 354 | */ |
362 | static ssize_t | 355 | static ssize_t active_duration_show(struct device *dev, |
363 | show_active_duration(struct device *dev, struct device_attribute *attr, | 356 | struct device_attribute *attr, char *buf) |
364 | char *buf) | ||
365 | { | 357 | { |
366 | struct usb_device *udev = to_usb_device(dev); | 358 | struct usb_device *udev = to_usb_device(dev); |
367 | int duration; | 359 | int duration; |
@@ -372,18 +364,17 @@ show_active_duration(struct device *dev, struct device_attribute *attr, | |||
372 | duration = jiffies_to_msecs(udev->active_duration); | 364 | duration = jiffies_to_msecs(udev->active_duration); |
373 | return sprintf(buf, "%u\n", duration); | 365 | return sprintf(buf, "%u\n", duration); |
374 | } | 366 | } |
367 | static DEVICE_ATTR_RO(active_duration); | ||
375 | 368 | ||
376 | static DEVICE_ATTR(active_duration, S_IRUGO, show_active_duration, NULL); | 369 | static ssize_t autosuspend_show(struct device *dev, |
377 | 370 | struct device_attribute *attr, char *buf) | |
378 | static ssize_t | ||
379 | show_autosuspend(struct device *dev, struct device_attribute *attr, char *buf) | ||
380 | { | 371 | { |
381 | return sprintf(buf, "%d\n", dev->power.autosuspend_delay / 1000); | 372 | return sprintf(buf, "%d\n", dev->power.autosuspend_delay / 1000); |
382 | } | 373 | } |
383 | 374 | ||
384 | static ssize_t | 375 | static ssize_t autosuspend_store(struct device *dev, |
385 | set_autosuspend(struct device *dev, struct device_attribute *attr, | 376 | struct device_attribute *attr, const char *buf, |
386 | const char *buf, size_t count) | 377 | size_t count) |
387 | { | 378 | { |
388 | int value; | 379 | int value; |
389 | 380 | ||
@@ -394,9 +385,7 @@ set_autosuspend(struct device *dev, struct device_attribute *attr, | |||
394 | pm_runtime_set_autosuspend_delay(dev, value * 1000); | 385 | pm_runtime_set_autosuspend_delay(dev, value * 1000); |
395 | return count; | 386 | return count; |
396 | } | 387 | } |
397 | 388 | static DEVICE_ATTR_RW(autosuspend); | |
398 | static DEVICE_ATTR(autosuspend, S_IRUGO | S_IWUSR, | ||
399 | show_autosuspend, set_autosuspend); | ||
400 | 389 | ||
401 | static const char on_string[] = "on"; | 390 | static const char on_string[] = "on"; |
402 | static const char auto_string[] = "auto"; | 391 | static const char auto_string[] = "auto"; |
@@ -411,8 +400,8 @@ static void warn_level(void) { | |||
411 | } | 400 | } |
412 | } | 401 | } |
413 | 402 | ||
414 | static ssize_t | 403 | static ssize_t level_show(struct device *dev, struct device_attribute *attr, |
415 | show_level(struct device *dev, struct device_attribute *attr, char *buf) | 404 | char *buf) |
416 | { | 405 | { |
417 | struct usb_device *udev = to_usb_device(dev); | 406 | struct usb_device *udev = to_usb_device(dev); |
418 | const char *p = auto_string; | 407 | const char *p = auto_string; |
@@ -423,9 +412,8 @@ show_level(struct device *dev, struct device_attribute *attr, char *buf) | |||
423 | return sprintf(buf, "%s\n", p); | 412 | return sprintf(buf, "%s\n", p); |
424 | } | 413 | } |
425 | 414 | ||
426 | static ssize_t | 415 | static ssize_t level_store(struct device *dev, struct device_attribute *attr, |
427 | set_level(struct device *dev, struct device_attribute *attr, | 416 | const char *buf, size_t count) |
428 | const char *buf, size_t count) | ||
429 | { | 417 | { |
430 | struct usb_device *udev = to_usb_device(dev); | 418 | struct usb_device *udev = to_usb_device(dev); |
431 | int len = count; | 419 | int len = count; |
@@ -453,12 +441,10 @@ set_level(struct device *dev, struct device_attribute *attr, | |||
453 | usb_unlock_device(udev); | 441 | usb_unlock_device(udev); |
454 | return rc; | 442 | return rc; |
455 | } | 443 | } |
444 | static DEVICE_ATTR_RW(level); | ||
456 | 445 | ||
457 | static DEVICE_ATTR(level, S_IRUGO | S_IWUSR, show_level, set_level); | 446 | static ssize_t usb2_hardware_lpm_show(struct device *dev, |
458 | 447 | struct device_attribute *attr, char *buf) | |
459 | static ssize_t | ||
460 | show_usb2_hardware_lpm(struct device *dev, struct device_attribute *attr, | ||
461 | char *buf) | ||
462 | { | 448 | { |
463 | struct usb_device *udev = to_usb_device(dev); | 449 | struct usb_device *udev = to_usb_device(dev); |
464 | const char *p; | 450 | const char *p; |
@@ -471,9 +457,9 @@ show_usb2_hardware_lpm(struct device *dev, struct device_attribute *attr, | |||
471 | return sprintf(buf, "%s\n", p); | 457 | return sprintf(buf, "%s\n", p); |
472 | } | 458 | } |
473 | 459 | ||
474 | static ssize_t | 460 | static ssize_t usb2_hardware_lpm_store(struct device *dev, |
475 | set_usb2_hardware_lpm(struct device *dev, struct device_attribute *attr, | 461 | struct device_attribute *attr, |
476 | const char *buf, size_t count) | 462 | const char *buf, size_t count) |
477 | { | 463 | { |
478 | struct usb_device *udev = to_usb_device(dev); | 464 | struct usb_device *udev = to_usb_device(dev); |
479 | bool value; | 465 | bool value; |
@@ -493,21 +479,19 @@ set_usb2_hardware_lpm(struct device *dev, struct device_attribute *attr, | |||
493 | 479 | ||
494 | return ret; | 480 | return ret; |
495 | } | 481 | } |
482 | static DEVICE_ATTR_RW(usb2_hardware_lpm); | ||
496 | 483 | ||
497 | static DEVICE_ATTR(usb2_hardware_lpm, S_IRUGO | S_IWUSR, show_usb2_hardware_lpm, | 484 | static ssize_t usb2_lpm_l1_timeout_show(struct device *dev, |
498 | set_usb2_hardware_lpm); | 485 | struct device_attribute *attr, |
499 | 486 | char *buf) | |
500 | static ssize_t | ||
501 | show_usb2_lpm_l1_timeout(struct device *dev, struct device_attribute *attr, | ||
502 | char *buf) | ||
503 | { | 487 | { |
504 | struct usb_device *udev = to_usb_device(dev); | 488 | struct usb_device *udev = to_usb_device(dev); |
505 | return sprintf(buf, "%d\n", udev->l1_params.timeout); | 489 | return sprintf(buf, "%d\n", udev->l1_params.timeout); |
506 | } | 490 | } |
507 | 491 | ||
508 | static ssize_t | 492 | static ssize_t usb2_lpm_l1_timeout_store(struct device *dev, |
509 | set_usb2_lpm_l1_timeout(struct device *dev, struct device_attribute *attr, | 493 | struct device_attribute *attr, |
510 | const char *buf, size_t count) | 494 | const char *buf, size_t count) |
511 | { | 495 | { |
512 | struct usb_device *udev = to_usb_device(dev); | 496 | struct usb_device *udev = to_usb_device(dev); |
513 | u16 timeout; | 497 | u16 timeout; |
@@ -519,21 +503,18 @@ set_usb2_lpm_l1_timeout(struct device *dev, struct device_attribute *attr, | |||
519 | 503 | ||
520 | return count; | 504 | return count; |
521 | } | 505 | } |
506 | static DEVICE_ATTR_RW(usb2_lpm_l1_timeout); | ||
522 | 507 | ||
523 | static DEVICE_ATTR(usb2_lpm_l1_timeout, S_IRUGO | S_IWUSR, | 508 | static ssize_t usb2_lpm_besl_show(struct device *dev, |
524 | show_usb2_lpm_l1_timeout, set_usb2_lpm_l1_timeout); | 509 | struct device_attribute *attr, char *buf) |
525 | |||
526 | static ssize_t | ||
527 | show_usb2_lpm_besl(struct device *dev, struct device_attribute *attr, | ||
528 | char *buf) | ||
529 | { | 510 | { |
530 | struct usb_device *udev = to_usb_device(dev); | 511 | struct usb_device *udev = to_usb_device(dev); |
531 | return sprintf(buf, "%d\n", udev->l1_params.besl); | 512 | return sprintf(buf, "%d\n", udev->l1_params.besl); |
532 | } | 513 | } |
533 | 514 | ||
534 | static ssize_t | 515 | static ssize_t usb2_lpm_besl_store(struct device *dev, |
535 | set_usb2_lpm_besl(struct device *dev, struct device_attribute *attr, | 516 | struct device_attribute *attr, |
536 | const char *buf, size_t count) | 517 | const char *buf, size_t count) |
537 | { | 518 | { |
538 | struct usb_device *udev = to_usb_device(dev); | 519 | struct usb_device *udev = to_usb_device(dev); |
539 | u8 besl; | 520 | u8 besl; |
@@ -545,9 +526,7 @@ set_usb2_lpm_besl(struct device *dev, struct device_attribute *attr, | |||
545 | 526 | ||
546 | return count; | 527 | return count; |
547 | } | 528 | } |
548 | 529 | static DEVICE_ATTR_RW(usb2_lpm_besl); | |
549 | static DEVICE_ATTR(usb2_lpm_besl, S_IRUGO | S_IWUSR, | ||
550 | show_usb2_lpm_besl, set_usb2_lpm_besl); | ||
551 | 530 | ||
552 | static struct attribute *usb2_hardware_lpm_attr[] = { | 531 | static struct attribute *usb2_hardware_lpm_attr[] = { |
553 | &dev_attr_usb2_hardware_lpm.attr, | 532 | &dev_attr_usb2_hardware_lpm.attr, |
@@ -604,7 +583,7 @@ static void remove_power_attributes(struct device *dev) | |||
604 | /* Descriptor fields */ | 583 | /* Descriptor fields */ |
605 | #define usb_descriptor_attr_le16(field, format_string) \ | 584 | #define usb_descriptor_attr_le16(field, format_string) \ |
606 | static ssize_t \ | 585 | static ssize_t \ |
607 | show_##field(struct device *dev, struct device_attribute *attr, \ | 586 | field##_show(struct device *dev, struct device_attribute *attr, \ |
608 | char *buf) \ | 587 | char *buf) \ |
609 | { \ | 588 | { \ |
610 | struct usb_device *udev; \ | 589 | struct usb_device *udev; \ |
@@ -613,15 +592,15 @@ show_##field(struct device *dev, struct device_attribute *attr, \ | |||
613 | return sprintf(buf, format_string, \ | 592 | return sprintf(buf, format_string, \ |
614 | le16_to_cpu(udev->descriptor.field)); \ | 593 | le16_to_cpu(udev->descriptor.field)); \ |
615 | } \ | 594 | } \ |
616 | static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); | 595 | static DEVICE_ATTR_RO(field) |
617 | 596 | ||
618 | usb_descriptor_attr_le16(idVendor, "%04x\n") | 597 | usb_descriptor_attr_le16(idVendor, "%04x\n"); |
619 | usb_descriptor_attr_le16(idProduct, "%04x\n") | 598 | usb_descriptor_attr_le16(idProduct, "%04x\n"); |
620 | usb_descriptor_attr_le16(bcdDevice, "%04x\n") | 599 | usb_descriptor_attr_le16(bcdDevice, "%04x\n"); |
621 | 600 | ||
622 | #define usb_descriptor_attr(field, format_string) \ | 601 | #define usb_descriptor_attr(field, format_string) \ |
623 | static ssize_t \ | 602 | static ssize_t \ |
624 | show_##field(struct device *dev, struct device_attribute *attr, \ | 603 | field##_show(struct device *dev, struct device_attribute *attr, \ |
625 | char *buf) \ | 604 | char *buf) \ |
626 | { \ | 605 | { \ |
627 | struct usb_device *udev; \ | 606 | struct usb_device *udev; \ |
@@ -629,34 +608,31 @@ show_##field(struct device *dev, struct device_attribute *attr, \ | |||
629 | udev = to_usb_device(dev); \ | 608 | udev = to_usb_device(dev); \ |
630 | return sprintf(buf, format_string, udev->descriptor.field); \ | 609 | return sprintf(buf, format_string, udev->descriptor.field); \ |
631 | } \ | 610 | } \ |
632 | static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); | 611 | static DEVICE_ATTR_RO(field) |
633 | |||
634 | usb_descriptor_attr(bDeviceClass, "%02x\n") | ||
635 | usb_descriptor_attr(bDeviceSubClass, "%02x\n") | ||
636 | usb_descriptor_attr(bDeviceProtocol, "%02x\n") | ||
637 | usb_descriptor_attr(bNumConfigurations, "%d\n") | ||
638 | usb_descriptor_attr(bMaxPacketSize0, "%d\n") | ||
639 | 612 | ||
613 | usb_descriptor_attr(bDeviceClass, "%02x\n"); | ||
614 | usb_descriptor_attr(bDeviceSubClass, "%02x\n"); | ||
615 | usb_descriptor_attr(bDeviceProtocol, "%02x\n"); | ||
616 | usb_descriptor_attr(bNumConfigurations, "%d\n"); | ||
617 | usb_descriptor_attr(bMaxPacketSize0, "%d\n"); | ||
640 | 618 | ||
641 | 619 | ||
642 | /* show if the device is authorized (1) or not (0) */ | 620 | /* show if the device is authorized (1) or not (0) */ |
643 | static ssize_t usb_dev_authorized_show(struct device *dev, | 621 | static ssize_t authorized_show(struct device *dev, |
644 | struct device_attribute *attr, | 622 | struct device_attribute *attr, char *buf) |
645 | char *buf) | ||
646 | { | 623 | { |
647 | struct usb_device *usb_dev = to_usb_device(dev); | 624 | struct usb_device *usb_dev = to_usb_device(dev); |
648 | return snprintf(buf, PAGE_SIZE, "%u\n", usb_dev->authorized); | 625 | return snprintf(buf, PAGE_SIZE, "%u\n", usb_dev->authorized); |
649 | } | 626 | } |
650 | 627 | ||
651 | |||
652 | /* | 628 | /* |
653 | * Authorize a device to be used in the system | 629 | * Authorize a device to be used in the system |
654 | * | 630 | * |
655 | * Writing a 0 deauthorizes the device, writing a 1 authorizes it. | 631 | * Writing a 0 deauthorizes the device, writing a 1 authorizes it. |
656 | */ | 632 | */ |
657 | static ssize_t usb_dev_authorized_store(struct device *dev, | 633 | static ssize_t authorized_store(struct device *dev, |
658 | struct device_attribute *attr, | 634 | struct device_attribute *attr, const char *buf, |
659 | const char *buf, size_t size) | 635 | size_t size) |
660 | { | 636 | { |
661 | ssize_t result; | 637 | ssize_t result; |
662 | struct usb_device *usb_dev = to_usb_device(dev); | 638 | struct usb_device *usb_dev = to_usb_device(dev); |
@@ -670,14 +646,12 @@ static ssize_t usb_dev_authorized_store(struct device *dev, | |||
670 | result = usb_authorize_device(usb_dev); | 646 | result = usb_authorize_device(usb_dev); |
671 | return result < 0? result : size; | 647 | return result < 0? result : size; |
672 | } | 648 | } |
673 | 649 | static DEVICE_ATTR_IGNORE_LOCKDEP(authorized, S_IRUGO | S_IWUSR, | |
674 | static DEVICE_ATTR_IGNORE_LOCKDEP(authorized, 0644, | 650 | authorized_show, authorized_store); |
675 | usb_dev_authorized_show, usb_dev_authorized_store); | ||
676 | 651 | ||
677 | /* "Safely remove a device" */ | 652 | /* "Safely remove a device" */ |
678 | static ssize_t usb_remove_store(struct device *dev, | 653 | static ssize_t remove_store(struct device *dev, struct device_attribute *attr, |
679 | struct device_attribute *attr, | 654 | const char *buf, size_t count) |
680 | const char *buf, size_t count) | ||
681 | { | 655 | { |
682 | struct usb_device *udev = to_usb_device(dev); | 656 | struct usb_device *udev = to_usb_device(dev); |
683 | int rc = 0; | 657 | int rc = 0; |
@@ -694,7 +668,7 @@ static ssize_t usb_remove_store(struct device *dev, | |||
694 | usb_unlock_device(udev); | 668 | usb_unlock_device(udev); |
695 | return rc; | 669 | return rc; |
696 | } | 670 | } |
697 | static DEVICE_ATTR_IGNORE_LOCKDEP(remove, 0200, NULL, usb_remove_store); | 671 | static DEVICE_ATTR_IGNORE_LOCKDEP(remove, S_IWUSR, NULL, remove_store); |
698 | 672 | ||
699 | 673 | ||
700 | static struct attribute *dev_attrs[] = { | 674 | static struct attribute *dev_attrs[] = { |
@@ -853,7 +827,7 @@ void usb_remove_sysfs_dev_files(struct usb_device *udev) | |||
853 | /* Interface Accociation Descriptor fields */ | 827 | /* Interface Accociation Descriptor fields */ |
854 | #define usb_intf_assoc_attr(field, format_string) \ | 828 | #define usb_intf_assoc_attr(field, format_string) \ |
855 | static ssize_t \ | 829 | static ssize_t \ |
856 | show_iad_##field(struct device *dev, struct device_attribute *attr, \ | 830 | iad_##field##_show(struct device *dev, struct device_attribute *attr, \ |
857 | char *buf) \ | 831 | char *buf) \ |
858 | { \ | 832 | { \ |
859 | struct usb_interface *intf = to_usb_interface(dev); \ | 833 | struct usb_interface *intf = to_usb_interface(dev); \ |
@@ -861,18 +835,18 @@ show_iad_##field(struct device *dev, struct device_attribute *attr, \ | |||
861 | return sprintf(buf, format_string, \ | 835 | return sprintf(buf, format_string, \ |
862 | intf->intf_assoc->field); \ | 836 | intf->intf_assoc->field); \ |
863 | } \ | 837 | } \ |
864 | static DEVICE_ATTR(iad_##field, S_IRUGO, show_iad_##field, NULL); | 838 | static DEVICE_ATTR_RO(iad_##field) |
865 | 839 | ||
866 | usb_intf_assoc_attr(bFirstInterface, "%02x\n") | 840 | usb_intf_assoc_attr(bFirstInterface, "%02x\n"); |
867 | usb_intf_assoc_attr(bInterfaceCount, "%02d\n") | 841 | usb_intf_assoc_attr(bInterfaceCount, "%02d\n"); |
868 | usb_intf_assoc_attr(bFunctionClass, "%02x\n") | 842 | usb_intf_assoc_attr(bFunctionClass, "%02x\n"); |
869 | usb_intf_assoc_attr(bFunctionSubClass, "%02x\n") | 843 | usb_intf_assoc_attr(bFunctionSubClass, "%02x\n"); |
870 | usb_intf_assoc_attr(bFunctionProtocol, "%02x\n") | 844 | usb_intf_assoc_attr(bFunctionProtocol, "%02x\n"); |
871 | 845 | ||
872 | /* Interface fields */ | 846 | /* Interface fields */ |
873 | #define usb_intf_attr(field, format_string) \ | 847 | #define usb_intf_attr(field, format_string) \ |
874 | static ssize_t \ | 848 | static ssize_t \ |
875 | show_##field(struct device *dev, struct device_attribute *attr, \ | 849 | field##_show(struct device *dev, struct device_attribute *attr, \ |
876 | char *buf) \ | 850 | char *buf) \ |
877 | { \ | 851 | { \ |
878 | struct usb_interface *intf = to_usb_interface(dev); \ | 852 | struct usb_interface *intf = to_usb_interface(dev); \ |
@@ -880,17 +854,17 @@ show_##field(struct device *dev, struct device_attribute *attr, \ | |||
880 | return sprintf(buf, format_string, \ | 854 | return sprintf(buf, format_string, \ |
881 | intf->cur_altsetting->desc.field); \ | 855 | intf->cur_altsetting->desc.field); \ |
882 | } \ | 856 | } \ |
883 | static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); | 857 | static DEVICE_ATTR_RO(field) |
884 | 858 | ||
885 | usb_intf_attr(bInterfaceNumber, "%02x\n") | 859 | usb_intf_attr(bInterfaceNumber, "%02x\n"); |
886 | usb_intf_attr(bAlternateSetting, "%2d\n") | 860 | usb_intf_attr(bAlternateSetting, "%2d\n"); |
887 | usb_intf_attr(bNumEndpoints, "%02x\n") | 861 | usb_intf_attr(bNumEndpoints, "%02x\n"); |
888 | usb_intf_attr(bInterfaceClass, "%02x\n") | 862 | usb_intf_attr(bInterfaceClass, "%02x\n"); |
889 | usb_intf_attr(bInterfaceSubClass, "%02x\n") | 863 | usb_intf_attr(bInterfaceSubClass, "%02x\n"); |
890 | usb_intf_attr(bInterfaceProtocol, "%02x\n") | 864 | usb_intf_attr(bInterfaceProtocol, "%02x\n"); |
891 | 865 | ||
892 | static ssize_t show_interface_string(struct device *dev, | 866 | static ssize_t interface_show(struct device *dev, struct device_attribute *attr, |
893 | struct device_attribute *attr, char *buf) | 867 | char *buf) |
894 | { | 868 | { |
895 | struct usb_interface *intf; | 869 | struct usb_interface *intf; |
896 | char *string; | 870 | char *string; |
@@ -903,10 +877,10 @@ static ssize_t show_interface_string(struct device *dev, | |||
903 | return 0; | 877 | return 0; |
904 | return sprintf(buf, "%s\n", string); | 878 | return sprintf(buf, "%s\n", string); |
905 | } | 879 | } |
906 | static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL); | 880 | static DEVICE_ATTR_RO(interface); |
907 | 881 | ||
908 | static ssize_t show_modalias(struct device *dev, | 882 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, |
909 | struct device_attribute *attr, char *buf) | 883 | char *buf) |
910 | { | 884 | { |
911 | struct usb_interface *intf; | 885 | struct usb_interface *intf; |
912 | struct usb_device *udev; | 886 | struct usb_device *udev; |
@@ -929,10 +903,11 @@ static ssize_t show_modalias(struct device *dev, | |||
929 | alt->desc.bInterfaceProtocol, | 903 | alt->desc.bInterfaceProtocol, |
930 | alt->desc.bInterfaceNumber); | 904 | alt->desc.bInterfaceNumber); |
931 | } | 905 | } |
932 | static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); | 906 | static DEVICE_ATTR_RO(modalias); |
933 | 907 | ||
934 | static ssize_t show_supports_autosuspend(struct device *dev, | 908 | static ssize_t supports_autosuspend_show(struct device *dev, |
935 | struct device_attribute *attr, char *buf) | 909 | struct device_attribute *attr, |
910 | char *buf) | ||
936 | { | 911 | { |
937 | struct usb_interface *intf; | 912 | struct usb_interface *intf; |
938 | struct usb_device *udev; | 913 | struct usb_device *udev; |
@@ -952,7 +927,7 @@ static ssize_t show_supports_autosuspend(struct device *dev, | |||
952 | 927 | ||
953 | return ret; | 928 | return ret; |
954 | } | 929 | } |
955 | static DEVICE_ATTR(supports_autosuspend, S_IRUGO, show_supports_autosuspend, NULL); | 930 | static DEVICE_ATTR_RO(supports_autosuspend); |
956 | 931 | ||
957 | static struct attribute *intf_attrs[] = { | 932 | static struct attribute *intf_attrs[] = { |
958 | &dev_attr_bInterfaceNumber.attr, | 933 | &dev_attr_bInterfaceNumber.attr, |