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); |