hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/usb/gadget/configfs.c
....@@ -1599,19 +1599,29 @@
15991599 static int android_setup(struct usb_gadget *gadget,
16001600 const struct usb_ctrlrequest *c)
16011601 {
1602
- struct usb_composite_dev *cdev = get_gadget_data(gadget);
1602
+ struct usb_composite_dev *cdev;
16031603 unsigned long flags;
1604
- struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev);
1604
+ struct gadget_info *gi;
16051605 int value = -EOPNOTSUPP;
16061606 struct usb_function_instance *fi;
16071607
1608
- spin_lock_irqsave(&cdev->lock, flags);
1608
+ if (!android_device)
1609
+ return 0;
1610
+
1611
+ gi = dev_get_drvdata(android_device);
1612
+ spin_lock_irqsave(&gi->spinlock, flags);
1613
+ cdev = get_gadget_data(gadget);
1614
+ if (!cdev || gi->unbind) {
1615
+ spin_unlock_irqrestore(&gi->spinlock, flags);
1616
+ return 0;
1617
+ };
1618
+
16091619 if (c->bRequest == USB_REQ_GET_DESCRIPTOR &&
16101620 (c->wValue >> 8) == USB_DT_CONFIG && !gi->connected) {
16111621 gi->connected = 1;
16121622 schedule_work(&gi->work);
16131623 }
1614
- spin_unlock_irqrestore(&cdev->lock, flags);
1624
+
16151625 list_for_each_entry(fi, &gi->available_func, cfs_list) {
16161626 if (fi != NULL && fi->f != NULL && fi->f->setup != NULL) {
16171627 value = fi->f->setup(fi->f, c);
....@@ -1628,12 +1638,11 @@
16281638 if (value < 0)
16291639 value = composite_setup(gadget, c);
16301640
1631
- spin_lock_irqsave(&cdev->lock, flags);
16321641 if (c->bRequest == USB_REQ_SET_CONFIGURATION &&
16331642 cdev->config) {
16341643 schedule_work(&gi->work);
16351644 }
1636
- spin_unlock_irqrestore(&cdev->lock, flags);
1645
+ spin_unlock_irqrestore(&gi->spinlock, flags);
16371646
16381647 return value;
16391648 }