.. | .. |
---|
140 | 140 | } |
---|
141 | 141 | static DEVICE_ATTR_WO(usbip_sockfd); |
---|
142 | 142 | |
---|
143 | | -static int stub_add_files(struct device *dev) |
---|
144 | | -{ |
---|
145 | | - int err = 0; |
---|
146 | | - |
---|
147 | | - err = device_create_file(dev, &dev_attr_usbip_status); |
---|
148 | | - if (err) |
---|
149 | | - goto err_status; |
---|
150 | | - |
---|
151 | | - err = device_create_file(dev, &dev_attr_usbip_sockfd); |
---|
152 | | - if (err) |
---|
153 | | - goto err_sockfd; |
---|
154 | | - |
---|
155 | | - err = device_create_file(dev, &dev_attr_usbip_debug); |
---|
156 | | - if (err) |
---|
157 | | - goto err_debug; |
---|
158 | | - |
---|
159 | | - return 0; |
---|
160 | | - |
---|
161 | | -err_debug: |
---|
162 | | - device_remove_file(dev, &dev_attr_usbip_sockfd); |
---|
163 | | -err_sockfd: |
---|
164 | | - device_remove_file(dev, &dev_attr_usbip_status); |
---|
165 | | -err_status: |
---|
166 | | - return err; |
---|
167 | | -} |
---|
168 | | - |
---|
169 | | -static void stub_remove_files(struct device *dev) |
---|
170 | | -{ |
---|
171 | | - device_remove_file(dev, &dev_attr_usbip_status); |
---|
172 | | - device_remove_file(dev, &dev_attr_usbip_sockfd); |
---|
173 | | - device_remove_file(dev, &dev_attr_usbip_debug); |
---|
174 | | -} |
---|
| 143 | +static struct attribute *usbip_attrs[] = { |
---|
| 144 | + &dev_attr_usbip_status.attr, |
---|
| 145 | + &dev_attr_usbip_sockfd.attr, |
---|
| 146 | + &dev_attr_usbip_debug.attr, |
---|
| 147 | + NULL, |
---|
| 148 | +}; |
---|
| 149 | +ATTRIBUTE_GROUPS(usbip); |
---|
175 | 150 | |
---|
176 | 151 | static void stub_shutdown_connection(struct usbip_device *ud) |
---|
177 | 152 | { |
---|
.. | .. |
---|
414 | 389 | goto err_port; |
---|
415 | 390 | } |
---|
416 | 391 | |
---|
417 | | - rc = stub_add_files(&udev->dev); |
---|
418 | | - if (rc) { |
---|
419 | | - dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid); |
---|
420 | | - goto err_files; |
---|
421 | | - } |
---|
422 | | - |
---|
423 | 392 | return 0; |
---|
424 | 393 | |
---|
425 | | -err_files: |
---|
426 | | - usb_hub_release_port(udev->parent, udev->portnum, |
---|
427 | | - (struct usb_dev_state *) udev); |
---|
428 | 394 | err_port: |
---|
429 | 395 | dev_set_drvdata(&udev->dev, NULL); |
---|
430 | | - usb_put_dev(udev); |
---|
431 | 396 | |
---|
432 | 397 | /* we already have busid_priv, just lock busid_lock */ |
---|
433 | 398 | spin_lock(&busid_priv->busid_lock); |
---|
.. | .. |
---|
442 | 407 | put_busid_priv(busid_priv); |
---|
443 | 408 | |
---|
444 | 409 | sdev_free: |
---|
| 410 | + usb_put_dev(udev); |
---|
445 | 411 | stub_device_free(sdev); |
---|
446 | 412 | |
---|
447 | 413 | return rc; |
---|
.. | .. |
---|
492 | 458 | /* |
---|
493 | 459 | * NOTE: rx/tx threads are invoked for each usb_device. |
---|
494 | 460 | */ |
---|
495 | | - stub_remove_files(&udev->dev); |
---|
496 | 461 | |
---|
497 | 462 | /* release port */ |
---|
498 | 463 | rc = usb_hub_release_port(udev->parent, udev->portnum, |
---|
.. | .. |
---|
561 | 526 | .resume = stub_resume, |
---|
562 | 527 | #endif |
---|
563 | 528 | .supports_autosuspend = 0, |
---|
| 529 | + .dev_groups = usbip_groups, |
---|
564 | 530 | }; |
---|