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