hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/usb/gadget/legacy/raw_gadget.c
....@@ -10,6 +10,7 @@
1010 #include <linux/ctype.h>
1111 #include <linux/debugfs.h>
1212 #include <linux/delay.h>
13
+#include <linux/idr.h>
1314 #include <linux/kref.h>
1415 #include <linux/miscdevice.h>
1516 #include <linux/module.h>
....@@ -34,6 +35,9 @@
3435 MODULE_LICENSE("GPL");
3536
3637 /*----------------------------------------------------------------------*/
38
+
39
+static DEFINE_IDA(driver_id_numbers);
40
+#define DRIVER_DRIVER_NAME_LENGTH_MAX 32
3741
3842 #define RAW_EVENT_QUEUE_SIZE 16
3943
....@@ -144,6 +148,7 @@
144148 STATE_DEV_INVALID = 0,
145149 STATE_DEV_OPENED,
146150 STATE_DEV_INITIALIZED,
151
+ STATE_DEV_REGISTERING,
147152 STATE_DEV_RUNNING,
148153 STATE_DEV_CLOSED,
149154 STATE_DEV_FAILED
....@@ -158,6 +163,9 @@
158163
159164 /* Reference to misc device: */
160165 struct device *dev;
166
+
167
+ /* Make driver names unique */
168
+ int driver_id_number;
161169
162170 /* Protected by lock: */
163171 enum dev_state state;
....@@ -187,6 +195,7 @@
187195 spin_lock_init(&dev->lock);
188196 init_completion(&dev->ep0_done);
189197 raw_event_queue_init(&dev->queue);
198
+ dev->driver_id_number = -1;
190199 return dev;
191200 }
192201
....@@ -197,6 +206,9 @@
197206
198207 kfree(dev->udc_name);
199208 kfree(dev->driver.udc_name);
209
+ kfree(dev->driver.driver.name);
210
+ if (dev->driver_id_number >= 0)
211
+ ida_free(&driver_id_numbers, dev->driver_id_number);
200212 if (dev->req) {
201213 if (dev->ep0_urb_queued)
202214 usb_ep_dequeue(dev->gadget->ep0, dev->req);
....@@ -417,9 +429,11 @@
417429 static int raw_ioctl_init(struct raw_dev *dev, unsigned long value)
418430 {
419431 int ret = 0;
432
+ int driver_id_number;
420433 struct usb_raw_init arg;
421434 char *udc_driver_name;
422435 char *udc_device_name;
436
+ char *driver_driver_name;
423437 unsigned long flags;
424438
425439 if (copy_from_user(&arg, (void __user *)value, sizeof(arg)))
....@@ -438,36 +452,43 @@
438452 return -EINVAL;
439453 }
440454
455
+ driver_id_number = ida_alloc(&driver_id_numbers, GFP_KERNEL);
456
+ if (driver_id_number < 0)
457
+ return driver_id_number;
458
+
459
+ driver_driver_name = kmalloc(DRIVER_DRIVER_NAME_LENGTH_MAX, GFP_KERNEL);
460
+ if (!driver_driver_name) {
461
+ ret = -ENOMEM;
462
+ goto out_free_driver_id_number;
463
+ }
464
+ snprintf(driver_driver_name, DRIVER_DRIVER_NAME_LENGTH_MAX,
465
+ DRIVER_NAME ".%d", driver_id_number);
466
+
441467 udc_driver_name = kmalloc(UDC_NAME_LENGTH_MAX, GFP_KERNEL);
442
- if (!udc_driver_name)
443
- return -ENOMEM;
468
+ if (!udc_driver_name) {
469
+ ret = -ENOMEM;
470
+ goto out_free_driver_driver_name;
471
+ }
444472 ret = strscpy(udc_driver_name, &arg.driver_name[0],
445473 UDC_NAME_LENGTH_MAX);
446
- if (ret < 0) {
447
- kfree(udc_driver_name);
448
- return ret;
449
- }
474
+ if (ret < 0)
475
+ goto out_free_udc_driver_name;
450476 ret = 0;
451477
452478 udc_device_name = kmalloc(UDC_NAME_LENGTH_MAX, GFP_KERNEL);
453479 if (!udc_device_name) {
454
- kfree(udc_driver_name);
455
- return -ENOMEM;
480
+ ret = -ENOMEM;
481
+ goto out_free_udc_driver_name;
456482 }
457483 ret = strscpy(udc_device_name, &arg.device_name[0],
458484 UDC_NAME_LENGTH_MAX);
459
- if (ret < 0) {
460
- kfree(udc_driver_name);
461
- kfree(udc_device_name);
462
- return ret;
463
- }
485
+ if (ret < 0)
486
+ goto out_free_udc_device_name;
464487 ret = 0;
465488
466489 spin_lock_irqsave(&dev->lock, flags);
467490 if (dev->state != STATE_DEV_OPENED) {
468491 dev_dbg(dev->dev, "fail, device is not opened\n");
469
- kfree(udc_driver_name);
470
- kfree(udc_device_name);
471492 ret = -EINVAL;
472493 goto out_unlock;
473494 }
....@@ -482,14 +503,25 @@
482503 dev->driver.suspend = gadget_suspend;
483504 dev->driver.resume = gadget_resume;
484505 dev->driver.reset = gadget_reset;
485
- dev->driver.driver.name = DRIVER_NAME;
506
+ dev->driver.driver.name = driver_driver_name;
486507 dev->driver.udc_name = udc_device_name;
487508 dev->driver.match_existing_only = 1;
509
+ dev->driver_id_number = driver_id_number;
488510
489511 dev->state = STATE_DEV_INITIALIZED;
512
+ spin_unlock_irqrestore(&dev->lock, flags);
513
+ return ret;
490514
491515 out_unlock:
492516 spin_unlock_irqrestore(&dev->lock, flags);
517
+out_free_udc_device_name:
518
+ kfree(udc_device_name);
519
+out_free_udc_driver_name:
520
+ kfree(udc_driver_name);
521
+out_free_driver_driver_name:
522
+ kfree(driver_driver_name);
523
+out_free_driver_id_number:
524
+ ida_free(&driver_id_numbers, driver_id_number);
493525 return ret;
494526 }
495527
....@@ -507,6 +539,7 @@
507539 ret = -EINVAL;
508540 goto out_unlock;
509541 }
542
+ dev->state = STATE_DEV_REGISTERING;
510543 spin_unlock_irqrestore(&dev->lock, flags);
511544
512545 ret = usb_gadget_probe_driver(&dev->driver);
....@@ -564,9 +597,12 @@
564597 return -ENODEV;
565598 }
566599 length = min(arg.length, event->length);
567
- if (copy_to_user((void __user *)value, event, sizeof(*event) + length))
600
+ if (copy_to_user((void __user *)value, event, sizeof(*event) + length)) {
601
+ kfree(event);
568602 return -EFAULT;
603
+ }
569604
605
+ kfree(event);
570606 return 0;
571607 }
572608
....@@ -1000,7 +1036,7 @@
10001036 ret = -EBUSY;
10011037 goto out_unlock;
10021038 }
1003
- if ((in && !ep->ep->caps.dir_in) || (!in && ep->ep->caps.dir_in)) {
1039
+ if (in != usb_endpoint_dir_in(ep->ep->desc)) {
10041040 dev_dbg(&dev->gadget->dev, "fail, wrong direction\n");
10051041 ret = -EINVAL;
10061042 goto out_unlock;