aboutsummaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/net2280.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-04-27 14:25:46 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-04-27 14:25:46 -0700
commit4e9a4b71f1eb23f35c394eb2b388dbe0389d316a (patch)
treeec11040e38f137f3fc0f17dfcd177bf8db9c6ae7 /drivers/usb/gadget/net2280.c
parent2cb14596a03036bb8b9d3c60f9c4dbdf3a745c76 (diff)
parent7e0258fd28762c09b997edb56849ecfa29284b79 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6: [PATCH] USB: ftdi_sio: add support for ASK RDR 400 series card reader [PATCH] USB: ftdi_sio: Adds support for iPlus device. [PATCH] USB: ftdi_sio vendor code for RR-CirKits LocoBuffer USB [PATCH] USB: Use new PCI_CLASS_SERIAL_USB_* defines [PATCH] USB: net2280: set driver data before it is used [PATCH] USB: net2280: check for shared IRQs [PATCH] USB: net2280: send 0-length packets for ep0 [PATCH] USB: net2280: Handle STALLs for 0-length control-IN requests [PATCH] USB: storage: atmel unusual dev update [PATCH] USB: Storage: unusual devs update [PATCH] USB: add new iTegno usb CDMA 1x card support for pl2303 [PATCH] USB: Resource leak fix for whiteheat driver
Diffstat (limited to 'drivers/usb/gadget/net2280.c')
-rw-r--r--drivers/usb/gadget/net2280.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c
index 6a4b93ad108..0b929349395 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)
ep->stopped = 1;
set_halt (ep);
mode = 2;
- } else if (!req && ep->stopped)
+ } else if (!req && !ep->stopped)
write_fifo (ep, NULL);
}
} else {
@@ -2280,9 +2280,7 @@ static void handle_ep_small (struct net2280_ep *ep)
/* if we wrote it all, we're usually done */
if (req->req.actual == req->req.length) {
if (ep->num == 0) {
- /* wait for control status */
- if (mode != 2)
- req = NULL;
+ /* send zlps until the status stage */
} else if (!req->req.zero || len != ep->ep.maxpacket)
mode = 2;
}
@@ -2744,6 +2742,10 @@ static irqreturn_t net2280_irq (int irq, void *_dev, struct pt_regs * r)
{
struct net2280 *dev = _dev;
+ /* shared interrupt, not ours */
+ if (!(readl(&dev->regs->irqstat0) & (1 << INTA_ASSERTED)))
+ return IRQ_NONE;
+
spin_lock (&dev->lock);
/* handle disconnect, dma, and more */
@@ -2831,13 +2833,13 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id)
}
/* alloc, and start init */
- dev = kmalloc (sizeof *dev, SLAB_KERNEL);
+ dev = kzalloc (sizeof *dev, SLAB_KERNEL);
if (dev == NULL){
retval = -ENOMEM;
goto done;
}
- memset (dev, 0, sizeof *dev);
+ pci_set_drvdata (pdev, dev);
spin_lock_init (&dev->lock);
dev->pdev = pdev;
dev->gadget.ops = &net2280_ops;
@@ -2950,7 +2952,6 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id)
dev->chiprev = get_idx_reg (dev->regs, REG_CHIPREV) & 0xffff;
/* done */
- pci_set_drvdata (pdev, dev);
INFO (dev, "%s\n", driver_desc);
INFO (dev, "irq %s, pci mem %p, chip rev %04x\n",
bufp, base, dev->chiprev);