| .. | .. |
|---|
| 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 | }; |
|---|