forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/usb/gadget/function/f_printer.c
....@@ -51,6 +51,8 @@
5151 #define GET_PORT_STATUS 1
5252 #define SOFT_RESET 2
5353
54
+#define DEFAULT_Q_LEN 10 /* same as legacy g_printer gadget */
55
+
5456 static int major, minors;
5557 static struct class *usb_gadget_class;
5658 static DEFINE_IDA(printer_ida);
....@@ -87,7 +89,7 @@
8789 u8 printer_cdev_open;
8890 wait_queue_head_t wait;
8991 unsigned q_len;
90
- char *pnp_string; /* We don't own memory! */
92
+ char **pnp_string; /* We don't own memory! */
9193 struct usb_function function;
9294 };
9395
....@@ -293,7 +295,7 @@
293295
294296 /* data overrun */
295297 case -EOVERFLOW:
296
- /* FALLTHROUGH */
298
+ fallthrough;
297299
298300 default:
299301 DBG(dev, "rx status %d\n", status);
....@@ -312,7 +314,7 @@
312314 switch (req->status) {
313315 default:
314316 VDBG(dev, "tx err %d\n", req->status);
315
- /* FALLTHROUGH */
317
+ fallthrough;
316318 case -ECONNRESET: /* unlink */
317319 case -ESHUTDOWN: /* disconnect etc */
318320 break;
....@@ -345,6 +347,11 @@
345347 dev = container_of(inode->i_cdev, struct printer_dev, printer_cdev);
346348
347349 spin_lock_irqsave(&dev->lock, flags);
350
+
351
+ if (dev->interface < 0) {
352
+ spin_unlock_irqrestore(&dev->lock, flags);
353
+ return -ENODEV;
354
+ }
348355
349356 if (!dev->printer_cdev_open) {
350357 dev->printer_cdev_open = 1;
....@@ -439,6 +446,12 @@
439446
440447 mutex_lock(&dev->lock_printer_io);
441448 spin_lock_irqsave(&dev->lock, flags);
449
+
450
+ if (dev->interface < 0) {
451
+ spin_unlock_irqrestore(&dev->lock, flags);
452
+ mutex_unlock(&dev->lock_printer_io);
453
+ return -ENODEV;
454
+ }
442455
443456 /* We will use this flag later to check if a printer reset happened
444457 * after we turn interrupts back on.
....@@ -571,6 +584,12 @@
571584 mutex_lock(&dev->lock_printer_io);
572585 spin_lock_irqsave(&dev->lock, flags);
573586
587
+ if (dev->interface < 0) {
588
+ spin_unlock_irqrestore(&dev->lock, flags);
589
+ mutex_unlock(&dev->lock_printer_io);
590
+ return -ENODEV;
591
+ }
592
+
574593 /* Check if a printer reset happens while we have interrupts on */
575594 dev->reset_printer = 0;
576595
....@@ -677,6 +696,13 @@
677696
678697 inode_lock(inode);
679698 spin_lock_irqsave(&dev->lock, flags);
699
+
700
+ if (dev->interface < 0) {
701
+ spin_unlock_irqrestore(&dev->lock, flags);
702
+ inode_unlock(inode);
703
+ return -ENODEV;
704
+ }
705
+
680706 tx_list_empty = (likely(list_empty(&dev->tx_reqs)));
681707 spin_unlock_irqrestore(&dev->lock, flags);
682708
....@@ -699,6 +725,13 @@
699725
700726 mutex_lock(&dev->lock_printer_io);
701727 spin_lock_irqsave(&dev->lock, flags);
728
+
729
+ if (dev->interface < 0) {
730
+ spin_unlock_irqrestore(&dev->lock, flags);
731
+ mutex_unlock(&dev->lock_printer_io);
732
+ return EPOLLERR | EPOLLHUP;
733
+ }
734
+
702735 setup_rx_reqs(dev);
703736 spin_unlock_irqrestore(&dev->lock, flags);
704737 mutex_unlock(&dev->lock_printer_io);
....@@ -731,6 +764,11 @@
731764 /* handle ioctls */
732765
733766 spin_lock_irqsave(&dev->lock, flags);
767
+
768
+ if (dev->interface < 0) {
769
+ spin_unlock_irqrestore(&dev->lock, flags);
770
+ return -ENODEV;
771
+ }
734772
735773 switch (code) {
736774 case GADGET_GET_PRINTER_STATUS:
....@@ -929,7 +967,7 @@
929967 if (!w_value && !w_length &&
930968 !(USB_DIR_IN & ctrl->bRequestType))
931969 break;
932
- /* fall through */
970
+ fallthrough;
933971 default:
934972 return false;
935973 }
....@@ -963,16 +1001,16 @@
9631001 if ((wIndex>>8) != dev->interface)
9641002 break;
9651003
966
- if (!dev->pnp_string) {
1004
+ if (!*dev->pnp_string) {
9671005 value = 0;
9681006 break;
9691007 }
970
- value = strlen(dev->pnp_string);
1008
+ value = strlen(*dev->pnp_string);
9711009 buf[0] = (value >> 8) & 0xFF;
9721010 buf[1] = value & 0xFF;
973
- memcpy(buf + 2, dev->pnp_string, value);
1011
+ memcpy(buf + 2, *dev->pnp_string, value);
9741012 DBG(dev, "1284 PNP String: %x %s\n", value,
975
- dev->pnp_string);
1013
+ *dev->pnp_string);
9761014 break;
9771015
9781016 case GET_PORT_STATUS: /* Get Port Status */
....@@ -1329,6 +1367,9 @@
13291367 opts->func_inst.free_func_inst = gprinter_free_inst;
13301368 ret = &opts->func_inst;
13311369
1370
+ /* Make sure q_len is initialized, otherwise the bound device can't support read/write! */
1371
+ opts->q_len = DEFAULT_Q_LEN;
1372
+
13321373 mutex_lock(&printer_ida_lock);
13331374
13341375 if (ida_is_empty(&printer_ida)) {
....@@ -1435,7 +1476,7 @@
14351476 kref_init(&dev->kref);
14361477 ++opts->refcnt;
14371478 dev->minor = opts->minor;
1438
- dev->pnp_string = opts->pnp_string;
1479
+ dev->pnp_string = &opts->pnp_string;
14391480 dev->q_len = opts->q_len;
14401481 mutex_unlock(&opts->lock);
14411482