diff options
Diffstat (limited to 'drivers/usb/gadget/net2280.c')
| -rw-r--r-- | drivers/usb/gadget/net2280.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index 6a4b93ad1082..0b9293493957 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
| @@ -2166,7 +2166,7 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
| 2166 | ep->stopped = 1; | 2166 | ep->stopped = 1; |
| 2167 | set_halt (ep); | 2167 | set_halt (ep); |
| 2168 | mode = 2; | 2168 | mode = 2; |
| 2169 | } else if (!req && ep->stopped) | 2169 | } else if (!req && !ep->stopped) |
| 2170 | write_fifo (ep, NULL); | 2170 | write_fifo (ep, NULL); |
| 2171 | } | 2171 | } |
| 2172 | } else { | 2172 | } else { |
| @@ -2280,9 +2280,7 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
| 2280 | /* if we wrote it all, we're usually done */ | 2280 | /* if we wrote it all, we're usually done */ |
| 2281 | if (req->req.actual == req->req.length) { | 2281 | if (req->req.actual == req->req.length) { |
| 2282 | if (ep->num == 0) { | 2282 | if (ep->num == 0) { |
| 2283 | /* wait for control status */ | 2283 | /* send zlps until the status stage */ |
| 2284 | if (mode != 2) | ||
| 2285 | req = NULL; | ||
| 2286 | } else if (!req->req.zero || len != ep->ep.maxpacket) | 2284 | } else if (!req->req.zero || len != ep->ep.maxpacket) |
| 2287 | mode = 2; | 2285 | mode = 2; |
| 2288 | } | 2286 | } |
| @@ -2744,6 +2742,10 @@ static irqreturn_t net2280_irq (int irq, void *_dev, struct pt_regs * r) | |||
| 2744 | { | 2742 | { |
| 2745 | struct net2280 *dev = _dev; | 2743 | struct net2280 *dev = _dev; |
| 2746 | 2744 | ||
| 2745 | /* shared interrupt, not ours */ | ||
| 2746 | if (!(readl(&dev->regs->irqstat0) & (1 << INTA_ASSERTED))) | ||
| 2747 | return IRQ_NONE; | ||
| 2748 | |||
| 2747 | spin_lock (&dev->lock); | 2749 | spin_lock (&dev->lock); |
| 2748 | 2750 | ||
| 2749 | /* handle disconnect, dma, and more */ | 2751 | /* handle disconnect, dma, and more */ |
| @@ -2831,13 +2833,13 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 2831 | } | 2833 | } |
| 2832 | 2834 | ||
| 2833 | /* alloc, and start init */ | 2835 | /* alloc, and start init */ |
| 2834 | dev = kmalloc (sizeof *dev, SLAB_KERNEL); | 2836 | dev = kzalloc (sizeof *dev, SLAB_KERNEL); |
| 2835 | if (dev == NULL){ | 2837 | if (dev == NULL){ |
| 2836 | retval = -ENOMEM; | 2838 | retval = -ENOMEM; |
| 2837 | goto done; | 2839 | goto done; |
| 2838 | } | 2840 | } |
| 2839 | 2841 | ||
| 2840 | memset (dev, 0, sizeof *dev); | 2842 | pci_set_drvdata (pdev, dev); |
| 2841 | spin_lock_init (&dev->lock); | 2843 | spin_lock_init (&dev->lock); |
| 2842 | dev->pdev = pdev; | 2844 | dev->pdev = pdev; |
| 2843 | dev->gadget.ops = &net2280_ops; | 2845 | dev->gadget.ops = &net2280_ops; |
| @@ -2950,7 +2952,6 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 2950 | dev->chiprev = get_idx_reg (dev->regs, REG_CHIPREV) & 0xffff; | 2952 | dev->chiprev = get_idx_reg (dev->regs, REG_CHIPREV) & 0xffff; |
| 2951 | 2953 | ||
| 2952 | /* done */ | 2954 | /* done */ |
| 2953 | pci_set_drvdata (pdev, dev); | ||
| 2954 | INFO (dev, "%s\n", driver_desc); | 2955 | INFO (dev, "%s\n", driver_desc); |
| 2955 | INFO (dev, "irq %s, pci mem %p, chip rev %04x\n", | 2956 | INFO (dev, "irq %s, pci mem %p, chip rev %04x\n", |
| 2956 | bufp, base, dev->chiprev); | 2957 | bufp, base, dev->chiprev); |
