|
|
|
@ -1401,17 +1401,18 @@ static int net2280_pullup(struct usb_gadget *_gadget, int is_on) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int net2280_start(struct usb_gadget_driver *driver, |
|
|
|
|
int (*bind)(struct usb_gadget *)); |
|
|
|
|
static int net2280_stop(struct usb_gadget_driver *driver); |
|
|
|
|
static int net2280_start(struct usb_gadget *_gadget, |
|
|
|
|
struct usb_gadget_driver *driver); |
|
|
|
|
static int net2280_stop(struct usb_gadget *_gadget, |
|
|
|
|
struct usb_gadget_driver *driver); |
|
|
|
|
|
|
|
|
|
static const struct usb_gadget_ops net2280_ops = { |
|
|
|
|
.get_frame = net2280_get_frame, |
|
|
|
|
.wakeup = net2280_wakeup, |
|
|
|
|
.set_selfpowered = net2280_set_selfpowered, |
|
|
|
|
.pullup = net2280_pullup, |
|
|
|
|
.start = net2280_start, |
|
|
|
|
.stop = net2280_stop, |
|
|
|
|
.udc_start = net2280_start, |
|
|
|
|
.udc_stop = net2280_stop, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/ |
|
|
|
@ -1744,8 +1745,6 @@ static void set_fifo_mode (struct net2280 *dev, int mode) |
|
|
|
|
* perhaps to bind specific drivers to specific devices. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
static struct net2280 *the_controller; |
|
|
|
|
|
|
|
|
|
static void usb_reset (struct net2280 *dev) |
|
|
|
|
{ |
|
|
|
|
u32 tmp; |
|
|
|
@ -1871,10 +1870,10 @@ static void ep0_start (struct net2280 *dev) |
|
|
|
|
* disconnect is reported. then a host may connect again, or |
|
|
|
|
* the driver might get unbound. |
|
|
|
|
*/ |
|
|
|
|
static int net2280_start(struct usb_gadget_driver *driver, |
|
|
|
|
int (*bind)(struct usb_gadget *)) |
|
|
|
|
static int net2280_start(struct usb_gadget *_gadget, |
|
|
|
|
struct usb_gadget_driver *driver) |
|
|
|
|
{ |
|
|
|
|
struct net2280 *dev = the_controller; |
|
|
|
|
struct net2280 *dev; |
|
|
|
|
int retval; |
|
|
|
|
unsigned i; |
|
|
|
|
|
|
|
|
@ -1882,14 +1881,11 @@ static int net2280_start(struct usb_gadget_driver *driver, |
|
|
|
|
* (dev->usb->xcvrdiag & FORCE_FULL_SPEED_MODE) |
|
|
|
|
* "must not be used in normal operation" |
|
|
|
|
*/ |
|
|
|
|
if (!driver |
|
|
|
|
|| driver->speed != USB_SPEED_HIGH |
|
|
|
|
|| !bind || !driver->setup) |
|
|
|
|
if (!driver || driver->speed != USB_SPEED_HIGH |
|
|
|
|
|| !driver->setup) |
|
|
|
|
return -EINVAL; |
|
|
|
|
if (!dev) |
|
|
|
|
return -ENODEV; |
|
|
|
|
if (dev->driver) |
|
|
|
|
return -EBUSY; |
|
|
|
|
|
|
|
|
|
dev = container_of (_gadget, struct net2280, gadget); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < 7; i++) |
|
|
|
|
dev->ep [i].irqs = 0; |
|
|
|
@ -1899,14 +1895,6 @@ static int net2280_start(struct usb_gadget_driver *driver, |
|
|
|
|
driver->driver.bus = NULL; |
|
|
|
|
dev->driver = driver; |
|
|
|
|
dev->gadget.dev.driver = &driver->driver; |
|
|
|
|
retval = bind(&dev->gadget); |
|
|
|
|
if (retval) { |
|
|
|
|
DEBUG (dev, "bind to driver %s --> %d\n", |
|
|
|
|
driver->driver.name, retval); |
|
|
|
|
dev->driver = NULL; |
|
|
|
|
dev->gadget.dev.driver = NULL; |
|
|
|
|
return retval; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
retval = device_create_file (&dev->pdev->dev, &dev_attr_function); |
|
|
|
|
if (retval) goto err_unbind; |
|
|
|
@ -1952,33 +1940,21 @@ stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver) |
|
|
|
|
for (i = 0; i < 7; i++) |
|
|
|
|
nuke (&dev->ep [i]); |
|
|
|
|
|
|
|
|
|
/* report disconnect; the driver is already quiesced */ |
|
|
|
|
if (driver) { |
|
|
|
|
spin_unlock (&dev->lock); |
|
|
|
|
driver->disconnect (&dev->gadget); |
|
|
|
|
spin_lock (&dev->lock); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
usb_reinit (dev); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int net2280_stop(struct usb_gadget_driver *driver) |
|
|
|
|
static int net2280_stop(struct usb_gadget *_gadget, |
|
|
|
|
struct usb_gadget_driver *driver) |
|
|
|
|
{ |
|
|
|
|
struct net2280 *dev = the_controller; |
|
|
|
|
struct net2280 *dev; |
|
|
|
|
unsigned long flags; |
|
|
|
|
|
|
|
|
|
if (!dev) |
|
|
|
|
return -ENODEV; |
|
|
|
|
if (!driver || driver != dev->driver || !driver->unbind) |
|
|
|
|
return -EINVAL; |
|
|
|
|
dev = container_of (_gadget, struct net2280, gadget); |
|
|
|
|
|
|
|
|
|
spin_lock_irqsave (&dev->lock, flags); |
|
|
|
|
stop_activity (dev, driver); |
|
|
|
|
spin_unlock_irqrestore (&dev->lock, flags); |
|
|
|
|
|
|
|
|
|
net2280_pullup (&dev->gadget, 0); |
|
|
|
|
|
|
|
|
|
driver->unbind (&dev->gadget); |
|
|
|
|
dev->gadget.dev.driver = NULL; |
|
|
|
|
dev->driver = NULL; |
|
|
|
|
|
|
|
|
@ -2698,8 +2674,6 @@ static void net2280_remove (struct pci_dev *pdev) |
|
|
|
|
pci_set_drvdata (pdev, NULL); |
|
|
|
|
|
|
|
|
|
INFO (dev, "unbind\n"); |
|
|
|
|
|
|
|
|
|
the_controller = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* wrap this driver around the specified device, but
|
|
|
|
@ -2713,14 +2687,6 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) |
|
|
|
|
void __iomem *base = NULL; |
|
|
|
|
int retval, i; |
|
|
|
|
|
|
|
|
|
/* if you want to support more than one controller in a system,
|
|
|
|
|
* usb_gadget_driver_{register,unregister}() must change. |
|
|
|
|
*/ |
|
|
|
|
if (the_controller) { |
|
|
|
|
dev_warn (&pdev->dev, "ignoring\n"); |
|
|
|
|
return -EBUSY; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* alloc, and start init */ |
|
|
|
|
dev = kzalloc (sizeof *dev, GFP_KERNEL); |
|
|
|
|
if (dev == NULL){ |
|
|
|
@ -2847,8 +2813,6 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) |
|
|
|
|
use_dma |
|
|
|
|
? (use_dma_chaining ? "chaining" : "enabled") |
|
|
|
|
: "disabled"); |
|
|
|
|
the_controller = dev; |
|
|
|
|
|
|
|
|
|
retval = device_register (&dev->gadget.dev); |
|
|
|
|
if (retval) goto done; |
|
|
|
|
retval = device_create_file (&pdev->dev, &dev_attr_registers); |
|
|
|
|