.. | .. |
---|
1599 | 1599 | static int android_setup(struct usb_gadget *gadget, |
---|
1600 | 1600 | const struct usb_ctrlrequest *c) |
---|
1601 | 1601 | { |
---|
1602 | | - struct usb_composite_dev *cdev = get_gadget_data(gadget); |
---|
| 1602 | + struct usb_composite_dev *cdev; |
---|
1603 | 1603 | unsigned long flags; |
---|
1604 | | - struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev); |
---|
| 1604 | + struct gadget_info *gi; |
---|
1605 | 1605 | int value = -EOPNOTSUPP; |
---|
1606 | 1606 | struct usb_function_instance *fi; |
---|
1607 | 1607 | |
---|
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 | + |
---|
1609 | 1619 | if (c->bRequest == USB_REQ_GET_DESCRIPTOR && |
---|
1610 | 1620 | (c->wValue >> 8) == USB_DT_CONFIG && !gi->connected) { |
---|
1611 | 1621 | gi->connected = 1; |
---|
1612 | 1622 | schedule_work(&gi->work); |
---|
1613 | 1623 | } |
---|
1614 | | - spin_unlock_irqrestore(&cdev->lock, flags); |
---|
| 1624 | + |
---|
1615 | 1625 | list_for_each_entry(fi, &gi->available_func, cfs_list) { |
---|
1616 | 1626 | if (fi != NULL && fi->f != NULL && fi->f->setup != NULL) { |
---|
1617 | 1627 | value = fi->f->setup(fi->f, c); |
---|
.. | .. |
---|
1628 | 1638 | if (value < 0) |
---|
1629 | 1639 | value = composite_setup(gadget, c); |
---|
1630 | 1640 | |
---|
1631 | | - spin_lock_irqsave(&cdev->lock, flags); |
---|
1632 | 1641 | if (c->bRequest == USB_REQ_SET_CONFIGURATION && |
---|
1633 | 1642 | cdev->config) { |
---|
1634 | 1643 | schedule_work(&gi->work); |
---|
1635 | 1644 | } |
---|
1636 | | - spin_unlock_irqrestore(&cdev->lock, flags); |
---|
| 1645 | + spin_unlock_irqrestore(&gi->spinlock, flags); |
---|
1637 | 1646 | |
---|
1638 | 1647 | return value; |
---|
1639 | 1648 | } |
---|