mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 01:10:04 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (22 commits) USB: atmel_usba_udc fixes, mostly disconnect() USB: pxa27x_udc: minor fixes usbtest: comment on why this code "expects" negative and positive errnos USB: remove PICDEM FS USB demo (04d8:000c) device from ldusb USB: option: add new Dell 5520 HSDPA variant USB: unusual_devs: Add support for GI 0401 SD-Card interface USB: serial gadget: descriptor cleanup USB: serial gadget: simplify endpoint handling USB: serial gadget: remove needless data structure USB: serial gadget: cleanup/reorg usb: fix compile warning in isp1760 USB: do not handle device 1410:5010 in 'option' driver USB: Fix unusual_devs.h ordering USB: add Zoom Telephonics Model 3095F V.92 USB Mini External modem to cdc-acm USB: Support for the ET502HS HDSPA modem in option driver USB: Support for the ET502HS HDSPA modem usb: fix integer as NULL pointer warnings found by sparse USB: isp1760: fix printk format USB: add Telstra NextG CDMA id to option driver USB: add association.h ...
This commit is contained in:
commit
e90a4e475a
22 changed files with 780 additions and 571 deletions
|
@ -1248,6 +1248,9 @@ static struct usb_device_id acm_ids[] = {
|
|||
{ USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */
|
||||
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
||||
},
|
||||
{ USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */
|
||||
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
||||
},
|
||||
|
||||
/* control interfaces with various AT-command sets */
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
||||
|
|
|
@ -156,6 +156,10 @@ static struct attribute *ep_dev_attrs[] = {
|
|||
static struct attribute_group ep_dev_attr_grp = {
|
||||
.attrs = ep_dev_attrs,
|
||||
};
|
||||
static struct attribute_group *ep_dev_groups[] = {
|
||||
&ep_dev_attr_grp,
|
||||
NULL
|
||||
};
|
||||
|
||||
static int usb_endpoint_major_init(void)
|
||||
{
|
||||
|
@ -298,6 +302,7 @@ int usb_create_ep_files(struct device *parent,
|
|||
|
||||
ep_dev->desc = &endpoint->desc;
|
||||
ep_dev->udev = udev;
|
||||
ep_dev->dev.groups = ep_dev_groups;
|
||||
ep_dev->dev.devt = MKDEV(usb_endpoint_major, ep_dev->minor);
|
||||
ep_dev->dev.class = ep_class->class;
|
||||
ep_dev->dev.parent = parent;
|
||||
|
@ -309,9 +314,6 @@ int usb_create_ep_files(struct device *parent,
|
|||
retval = device_register(&ep_dev->dev);
|
||||
if (retval)
|
||||
goto error_chrdev;
|
||||
retval = sysfs_create_group(&ep_dev->dev.kobj, &ep_dev_attr_grp);
|
||||
if (retval)
|
||||
goto error_group;
|
||||
|
||||
/* create the symlink to the old-style "ep_XX" directory */
|
||||
sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress);
|
||||
|
@ -322,8 +324,6 @@ int usb_create_ep_files(struct device *parent,
|
|||
return retval;
|
||||
|
||||
error_link:
|
||||
sysfs_remove_group(&ep_dev->dev.kobj, &ep_dev_attr_grp);
|
||||
error_group:
|
||||
device_unregister(&ep_dev->dev);
|
||||
destroy_endpoint_class();
|
||||
return retval;
|
||||
|
@ -348,7 +348,6 @@ void usb_remove_ep_files(struct usb_host_endpoint *endpoint)
|
|||
|
||||
sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress);
|
||||
sysfs_remove_link(&ep_dev->dev.parent->kobj, name);
|
||||
sysfs_remove_group(&ep_dev->dev.kobj, &ep_dev_attr_grp);
|
||||
device_unregister(&ep_dev->dev);
|
||||
endpoint->ep_dev = NULL;
|
||||
destroy_endpoint_class();
|
||||
|
|
|
@ -1607,6 +1607,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
|
|||
intf->dev.driver = NULL;
|
||||
intf->dev.bus = &usb_bus_type;
|
||||
intf->dev.type = &usb_if_device_type;
|
||||
intf->dev.groups = usb_interface_groups;
|
||||
intf->dev.dma_mask = dev->dev.dma_mask;
|
||||
device_initialize(&intf->dev);
|
||||
mark_quiesced(intf);
|
||||
|
|
|
@ -538,6 +538,46 @@ static struct attribute_group dev_attr_grp = {
|
|||
.attrs = dev_attrs,
|
||||
};
|
||||
|
||||
/* When modifying this list, be sure to modify dev_string_attrs_are_visible()
|
||||
* accordingly.
|
||||
*/
|
||||
static struct attribute *dev_string_attrs[] = {
|
||||
&dev_attr_manufacturer.attr,
|
||||
&dev_attr_product.attr,
|
||||
&dev_attr_serial.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static mode_t dev_string_attrs_are_visible(struct kobject *kobj,
|
||||
struct attribute *a, int n)
|
||||
{
|
||||
struct usb_device *udev = to_usb_device(
|
||||
container_of(kobj, struct device, kobj));
|
||||
|
||||
if (a == &dev_attr_manufacturer.attr) {
|
||||
if (udev->manufacturer == NULL)
|
||||
return 0;
|
||||
} else if (a == &dev_attr_product.attr) {
|
||||
if (udev->product == NULL)
|
||||
return 0;
|
||||
} else if (a == &dev_attr_serial.attr) {
|
||||
if (udev->serial == NULL)
|
||||
return 0;
|
||||
}
|
||||
return a->mode;
|
||||
}
|
||||
|
||||
static struct attribute_group dev_string_attr_grp = {
|
||||
.attrs = dev_string_attrs,
|
||||
.is_visible = dev_string_attrs_are_visible,
|
||||
};
|
||||
|
||||
struct attribute_group *usb_device_groups[] = {
|
||||
&dev_attr_grp,
|
||||
&dev_string_attr_grp,
|
||||
NULL
|
||||
};
|
||||
|
||||
/* Binary descriptors */
|
||||
|
||||
static ssize_t
|
||||
|
@ -591,10 +631,9 @@ int usb_create_sysfs_dev_files(struct usb_device *udev)
|
|||
struct device *dev = &udev->dev;
|
||||
int retval;
|
||||
|
||||
retval = sysfs_create_group(&dev->kobj, &dev_attr_grp);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
/* Unforunately these attributes cannot be created before
|
||||
* the uevent is broadcast.
|
||||
*/
|
||||
retval = device_create_bin_file(dev, &dev_bin_attr_descriptors);
|
||||
if (retval)
|
||||
goto error;
|
||||
|
@ -607,21 +646,6 @@ int usb_create_sysfs_dev_files(struct usb_device *udev)
|
|||
if (retval)
|
||||
goto error;
|
||||
|
||||
if (udev->manufacturer) {
|
||||
retval = device_create_file(dev, &dev_attr_manufacturer);
|
||||
if (retval)
|
||||
goto error;
|
||||
}
|
||||
if (udev->product) {
|
||||
retval = device_create_file(dev, &dev_attr_product);
|
||||
if (retval)
|
||||
goto error;
|
||||
}
|
||||
if (udev->serial) {
|
||||
retval = device_create_file(dev, &dev_attr_serial);
|
||||
if (retval)
|
||||
goto error;
|
||||
}
|
||||
retval = usb_create_ep_files(dev, &udev->ep0, udev);
|
||||
if (retval)
|
||||
goto error;
|
||||
|
@ -636,13 +660,9 @@ void usb_remove_sysfs_dev_files(struct usb_device *udev)
|
|||
struct device *dev = &udev->dev;
|
||||
|
||||
usb_remove_ep_files(&udev->ep0);
|
||||
device_remove_file(dev, &dev_attr_manufacturer);
|
||||
device_remove_file(dev, &dev_attr_product);
|
||||
device_remove_file(dev, &dev_attr_serial);
|
||||
remove_power_attributes(dev);
|
||||
remove_persist_attributes(dev);
|
||||
device_remove_bin_file(dev, &dev_bin_attr_descriptors);
|
||||
sysfs_remove_group(&dev->kobj, &dev_attr_grp);
|
||||
}
|
||||
|
||||
/* Interface Accociation Descriptor fields */
|
||||
|
@ -688,17 +708,15 @@ static ssize_t show_interface_string(struct device *dev,
|
|||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct usb_interface *intf;
|
||||
struct usb_device *udev;
|
||||
int len;
|
||||
char *string;
|
||||
|
||||
intf = to_usb_interface(dev);
|
||||
udev = interface_to_usbdev(intf);
|
||||
len = snprintf(buf, 256, "%s", intf->cur_altsetting->string);
|
||||
if (len < 0)
|
||||
string = intf->cur_altsetting->string;
|
||||
barrier(); /* The altsetting might change! */
|
||||
|
||||
if (!string)
|
||||
return 0;
|
||||
buf[len] = '\n';
|
||||
buf[len+1] = 0;
|
||||
return len+1;
|
||||
return sprintf(buf, "%s\n", string);
|
||||
}
|
||||
static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL);
|
||||
|
||||
|
@ -727,18 +745,6 @@ static ssize_t show_modalias(struct device *dev,
|
|||
}
|
||||
static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);
|
||||
|
||||
static struct attribute *intf_assoc_attrs[] = {
|
||||
&dev_attr_iad_bFirstInterface.attr,
|
||||
&dev_attr_iad_bInterfaceCount.attr,
|
||||
&dev_attr_iad_bFunctionClass.attr,
|
||||
&dev_attr_iad_bFunctionSubClass.attr,
|
||||
&dev_attr_iad_bFunctionProtocol.attr,
|
||||
NULL,
|
||||
};
|
||||
static struct attribute_group intf_assoc_attr_grp = {
|
||||
.attrs = intf_assoc_attrs,
|
||||
};
|
||||
|
||||
static struct attribute *intf_attrs[] = {
|
||||
&dev_attr_bInterfaceNumber.attr,
|
||||
&dev_attr_bAlternateSetting.attr,
|
||||
|
@ -753,6 +759,37 @@ static struct attribute_group intf_attr_grp = {
|
|||
.attrs = intf_attrs,
|
||||
};
|
||||
|
||||
static struct attribute *intf_assoc_attrs[] = {
|
||||
&dev_attr_iad_bFirstInterface.attr,
|
||||
&dev_attr_iad_bInterfaceCount.attr,
|
||||
&dev_attr_iad_bFunctionClass.attr,
|
||||
&dev_attr_iad_bFunctionSubClass.attr,
|
||||
&dev_attr_iad_bFunctionProtocol.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static mode_t intf_assoc_attrs_are_visible(struct kobject *kobj,
|
||||
struct attribute *a, int n)
|
||||
{
|
||||
struct usb_interface *intf = to_usb_interface(
|
||||
container_of(kobj, struct device, kobj));
|
||||
|
||||
if (intf->intf_assoc == NULL)
|
||||
return 0;
|
||||
return a->mode;
|
||||
}
|
||||
|
||||
static struct attribute_group intf_assoc_attr_grp = {
|
||||
.attrs = intf_assoc_attrs,
|
||||
.is_visible = intf_assoc_attrs_are_visible,
|
||||
};
|
||||
|
||||
struct attribute_group *usb_interface_groups[] = {
|
||||
&intf_attr_grp,
|
||||
&intf_assoc_attr_grp,
|
||||
NULL
|
||||
};
|
||||
|
||||
static inline void usb_create_intf_ep_files(struct usb_interface *intf,
|
||||
struct usb_device *udev)
|
||||
{
|
||||
|
@ -777,23 +814,21 @@ static inline void usb_remove_intf_ep_files(struct usb_interface *intf)
|
|||
|
||||
int usb_create_sysfs_intf_files(struct usb_interface *intf)
|
||||
{
|
||||
struct device *dev = &intf->dev;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct usb_host_interface *alt = intf->cur_altsetting;
|
||||
int retval;
|
||||
|
||||
if (intf->sysfs_files_created)
|
||||
return 0;
|
||||
retval = sysfs_create_group(&dev->kobj, &intf_attr_grp);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
/* The interface string may be present in some altsettings
|
||||
* and missing in others. Hence its attribute cannot be created
|
||||
* before the uevent is broadcast.
|
||||
*/
|
||||
if (alt->string == NULL)
|
||||
alt->string = usb_cache_string(udev, alt->desc.iInterface);
|
||||
if (alt->string)
|
||||
retval = device_create_file(dev, &dev_attr_interface);
|
||||
if (intf->intf_assoc)
|
||||
retval = sysfs_create_group(&dev->kobj, &intf_assoc_attr_grp);
|
||||
retval = device_create_file(&intf->dev, &dev_attr_interface);
|
||||
usb_create_intf_ep_files(intf, udev);
|
||||
intf->sysfs_files_created = 1;
|
||||
return 0;
|
||||
|
@ -807,7 +842,5 @@ void usb_remove_sysfs_intf_files(struct usb_interface *intf)
|
|||
return;
|
||||
usb_remove_intf_ep_files(intf);
|
||||
device_remove_file(dev, &dev_attr_interface);
|
||||
sysfs_remove_group(&dev->kobj, &intf_attr_grp);
|
||||
sysfs_remove_group(&intf->dev.kobj, &intf_assoc_attr_grp);
|
||||
intf->sysfs_files_created = 0;
|
||||
}
|
||||
|
|
|
@ -291,6 +291,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
|
|||
device_initialize(&dev->dev);
|
||||
dev->dev.bus = &usb_bus_type;
|
||||
dev->dev.type = &usb_device_type;
|
||||
dev->dev.groups = usb_device_groups;
|
||||
dev->dev.dma_mask = bus->controller->dma_mask;
|
||||
set_dev_node(&dev->dev, dev_to_node(bus->controller));
|
||||
dev->state = USB_STATE_ATTACHED;
|
||||
|
|
|
@ -130,6 +130,10 @@ static inline int is_active(const struct usb_interface *f)
|
|||
/* for labeling diagnostics */
|
||||
extern const char *usbcore_name;
|
||||
|
||||
/* sysfs stuff */
|
||||
extern struct attribute_group *usb_device_groups[];
|
||||
extern struct attribute_group *usb_interface_groups[];
|
||||
|
||||
/* usbfs stuff */
|
||||
extern struct mutex usbfs_mutex;
|
||||
extern struct usb_driver usbfs_driver;
|
||||
|
|
|
@ -3251,7 +3251,7 @@ static int udc_pci_probe(
|
|||
/* pci setup */
|
||||
if (pci_enable_device(pdev) < 0) {
|
||||
kfree(dev);
|
||||
dev = 0;
|
||||
dev = NULL;
|
||||
retval = -ENODEV;
|
||||
goto finished;
|
||||
}
|
||||
|
@ -3264,7 +3264,7 @@ static int udc_pci_probe(
|
|||
if (!request_mem_region(resource, len, name)) {
|
||||
dev_dbg(&pdev->dev, "pci device used already\n");
|
||||
kfree(dev);
|
||||
dev = 0;
|
||||
dev = NULL;
|
||||
retval = -EBUSY;
|
||||
goto finished;
|
||||
}
|
||||
|
@ -3274,7 +3274,7 @@ static int udc_pci_probe(
|
|||
if (dev->virt_addr == NULL) {
|
||||
dev_dbg(&pdev->dev, "start address cannot be mapped\n");
|
||||
kfree(dev);
|
||||
dev = 0;
|
||||
dev = NULL;
|
||||
retval = -EFAULT;
|
||||
goto finished;
|
||||
}
|
||||
|
@ -3282,7 +3282,7 @@ static int udc_pci_probe(
|
|||
if (!pdev->irq) {
|
||||
dev_err(&dev->pdev->dev, "irq not set\n");
|
||||
kfree(dev);
|
||||
dev = 0;
|
||||
dev = NULL;
|
||||
retval = -ENODEV;
|
||||
goto finished;
|
||||
}
|
||||
|
@ -3290,7 +3290,7 @@ static int udc_pci_probe(
|
|||
if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) {
|
||||
dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq);
|
||||
kfree(dev);
|
||||
dev = 0;
|
||||
dev = NULL;
|
||||
retval = -EBUSY;
|
||||
goto finished;
|
||||
}
|
||||
|
|
|
@ -649,7 +649,13 @@ static int usba_ep_disable(struct usb_ep *_ep)
|
|||
|
||||
if (!ep->desc) {
|
||||
spin_unlock_irqrestore(&udc->lock, flags);
|
||||
DBG(DBG_ERR, "ep_disable: %s not enabled\n", ep->ep.name);
|
||||
/* REVISIT because this driver disables endpoints in
|
||||
* reset_all_endpoints() before calling disconnect(),
|
||||
* most gadget drivers would trigger this non-error ...
|
||||
*/
|
||||
if (udc->gadget.speed != USB_SPEED_UNKNOWN)
|
||||
DBG(DBG_ERR, "ep_disable: %s not enabled\n",
|
||||
ep->ep.name);
|
||||
return -EINVAL;
|
||||
}
|
||||
ep->desc = NULL;
|
||||
|
@ -1032,8 +1038,6 @@ static struct usba_udc the_udc = {
|
|||
.release = nop_release,
|
||||
},
|
||||
},
|
||||
|
||||
.lock = SPIN_LOCK_UNLOCKED,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1052,6 +1056,12 @@ static void reset_all_endpoints(struct usba_udc *udc)
|
|||
request_complete(ep, req, -ECONNRESET);
|
||||
}
|
||||
|
||||
/* NOTE: normally, the next call to the gadget driver is in
|
||||
* charge of disabling endpoints... usually disconnect().
|
||||
* The exception would be entering a high speed test mode.
|
||||
*
|
||||
* FIXME remove this code ... and retest thoroughly.
|
||||
*/
|
||||
list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) {
|
||||
if (ep->desc) {
|
||||
spin_unlock(&udc->lock);
|
||||
|
@ -1219,7 +1229,7 @@ static inline bool feature_is_ep_halt(struct usb_ctrlrequest *crq)
|
|||
static int handle_ep0_setup(struct usba_udc *udc, struct usba_ep *ep,
|
||||
struct usb_ctrlrequest *crq)
|
||||
{
|
||||
int retval = 0;;
|
||||
int retval = 0;
|
||||
|
||||
switch (crq->bRequest) {
|
||||
case USB_REQ_GET_STATUS: {
|
||||
|
@ -1693,6 +1703,14 @@ static irqreturn_t usba_udc_irq(int irq, void *devid)
|
|||
usba_writel(udc, INT_CLR, USBA_END_OF_RESET);
|
||||
reset_all_endpoints(udc);
|
||||
|
||||
if (udc->gadget.speed != USB_SPEED_UNKNOWN
|
||||
&& udc->driver->disconnect) {
|
||||
udc->gadget.speed = USB_SPEED_UNKNOWN;
|
||||
spin_unlock(&udc->lock);
|
||||
udc->driver->disconnect(&udc->gadget);
|
||||
spin_lock(&udc->lock);
|
||||
}
|
||||
|
||||
if (status & USBA_HIGH_SPEED) {
|
||||
DBG(DBG_BUS, "High-speed bus reset detected\n");
|
||||
udc->gadget.speed = USB_SPEED_HIGH;
|
||||
|
@ -1716,9 +1734,13 @@ static irqreturn_t usba_udc_irq(int irq, void *devid)
|
|||
| USBA_DET_SUSPEND
|
||||
| USBA_END_OF_RESUME));
|
||||
|
||||
/*
|
||||
* Unclear why we hit this irregularly, e.g. in usbtest,
|
||||
* but it's clearly harmless...
|
||||
*/
|
||||
if (!(usba_ep_readl(ep0, CFG) & USBA_EPT_MAPPED))
|
||||
dev_warn(&udc->pdev->dev,
|
||||
"WARNING: EP0 configuration is invalid!\n");
|
||||
dev_dbg(&udc->pdev->dev,
|
||||
"ODD: EP0 configuration is invalid!\n");
|
||||
}
|
||||
|
||||
spin_unlock(&udc->lock);
|
||||
|
@ -1751,9 +1773,11 @@ static irqreturn_t usba_vbus_irq(int irq, void *devid)
|
|||
reset_all_endpoints(udc);
|
||||
toggle_bias(0);
|
||||
usba_writel(udc, CTRL, USBA_DISABLE_MASK);
|
||||
spin_unlock(&udc->lock);
|
||||
udc->driver->disconnect(&udc->gadget);
|
||||
spin_lock(&udc->lock);
|
||||
if (udc->driver->disconnect) {
|
||||
spin_unlock(&udc->lock);
|
||||
udc->driver->disconnect(&udc->gadget);
|
||||
spin_lock(&udc->lock);
|
||||
}
|
||||
}
|
||||
udc->vbus_prev = vbus;
|
||||
}
|
||||
|
@ -1825,7 +1849,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
if (!udc->pdev)
|
||||
return -ENODEV;
|
||||
if (driver != udc->driver)
|
||||
if (driver != udc->driver || !driver->unbind)
|
||||
return -EINVAL;
|
||||
|
||||
if (udc->vbus_pin != -1)
|
||||
|
@ -1840,6 +1864,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
toggle_bias(0);
|
||||
usba_writel(udc, CTRL, USBA_DISABLE_MASK);
|
||||
|
||||
if (udc->driver->disconnect)
|
||||
udc->driver->disconnect(&udc->gadget);
|
||||
|
||||
driver->unbind(&udc->gadget);
|
||||
udc->gadget.dev.driver = NULL;
|
||||
udc->driver = NULL;
|
||||
|
@ -1879,6 +1906,7 @@ static int __init usba_udc_probe(struct platform_device *pdev)
|
|||
goto err_get_hclk;
|
||||
}
|
||||
|
||||
spin_lock_init(&udc->lock);
|
||||
udc->pdev = pdev;
|
||||
udc->pclk = pclk;
|
||||
udc->hclk = hclk;
|
||||
|
|
|
@ -1546,7 +1546,6 @@ static __init void udc_init_data(struct pxa_udc *dev)
|
|||
INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);
|
||||
dev->udc_usb_ep[0].pxa_ep = &dev->pxa_ep[0];
|
||||
ep0_idle(dev);
|
||||
strcpy(dev->dev->bus_id, "");
|
||||
|
||||
/* PXA endpoints init */
|
||||
for (i = 0; i < NR_PXA_ENDPOINTS; i++) {
|
||||
|
@ -1746,13 +1745,10 @@ static void handle_ep0_ctrl_req(struct pxa_udc *udc,
|
|||
ep_err(ep, "wrong to have extra bytes for setup : 0x%08x\n", i);
|
||||
}
|
||||
|
||||
le16_to_cpus(&u.r.wValue);
|
||||
le16_to_cpus(&u.r.wIndex);
|
||||
le16_to_cpus(&u.r.wLength);
|
||||
|
||||
ep_dbg(ep, "SETUP %02x.%02x v%04x i%04x l%04x\n",
|
||||
u.r.bRequestType, u.r.bRequest,
|
||||
u.r.wValue, u.r.wIndex, u.r.wLength);
|
||||
le16_to_cpu(u.r.wValue), le16_to_cpu(u.r.wIndex),
|
||||
le16_to_cpu(u.r.wLength));
|
||||
if (unlikely(have_extrabytes))
|
||||
goto stall;
|
||||
|
||||
|
@ -2296,7 +2292,8 @@ static void pxa_udc_shutdown(struct platform_device *_dev)
|
|||
{
|
||||
struct pxa_udc *udc = platform_get_drvdata(_dev);
|
||||
|
||||
udc_disable(udc);
|
||||
if (udc_readl(udc, UDCCR) & UDCCR_UDE)
|
||||
udc_disable(udc);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -2361,9 +2358,8 @@ static int pxa_udc_resume(struct platform_device *_dev)
|
|||
* Upon exit from sleep mode and before clearing OTGPH,
|
||||
* Software must configure the USB OTG pad, UDC, and UHC
|
||||
* to the state they were in before entering sleep mode.
|
||||
*
|
||||
* Should be : PSSR |= PSSR_OTGPH;
|
||||
*/
|
||||
PSSR |= PSSR_OTGPH;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2387,6 +2383,9 @@ static struct platform_driver udc_driver = {
|
|||
|
||||
static int __init udc_init(void)
|
||||
{
|
||||
if (!cpu_is_pxa27x())
|
||||
return -ENODEV;
|
||||
|
||||
printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION);
|
||||
return platform_driver_probe(&udc_driver, pxa_udc_probe);
|
||||
}
|
||||
|
|
|
@ -484,4 +484,12 @@ static inline struct pxa_udc *to_gadget_udc(struct usb_gadget *gadget)
|
|||
#define ep_warn(ep, fmt, arg...) \
|
||||
dev_warn(ep->dev->dev, "%s:%s:" fmt, EPNAME(ep), __func__, ## arg)
|
||||
|
||||
/*
|
||||
* Cannot include pxa-regs.h, as register names are similar.
|
||||
* So PSSR is redefined here. This should be removed once UDC registers will
|
||||
* be gone from pxa-regs.h.
|
||||
*/
|
||||
#define PSSR __REG(0x40F00004) /* Power Manager Sleep Status */
|
||||
#define PSSR_OTGPH (1 << 6) /* OTG Peripheral Hold */
|
||||
|
||||
#endif /* __LINUX_USB_GADGET_PXA27X_H */
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -988,7 +988,7 @@ static void do_atl_int(struct usb_hcd *usb_hcd)
|
|||
* This did not trigger for a long time now.
|
||||
*/
|
||||
printk(KERN_ERR "Reloading ptd %p/%p... qh %p readed: "
|
||||
"%d of %d done: %08x cur: %08x\n", qtd,
|
||||
"%d of %zu done: %08x cur: %08x\n", qtd,
|
||||
urb, qh, PTD_XFERRED_LENGTH(dw3),
|
||||
qtd->length, done_map,
|
||||
(1 << queue_entry));
|
||||
|
@ -1088,7 +1088,7 @@ static void do_atl_int(struct usb_hcd *usb_hcd)
|
|||
} else if (usb_pipebulk(urb->pipe) && (length < qtd->length)) {
|
||||
/* short BULK received */
|
||||
|
||||
printk(KERN_ERR "short bulk, %d instead %d\n", length,
|
||||
printk(KERN_ERR "short bulk, %d instead %zu\n", length,
|
||||
qtd->length);
|
||||
if (urb->transfer_flags & URB_SHORT_NOT_OK) {
|
||||
urb->status = -EREMOTEIO;
|
||||
|
|
|
@ -256,7 +256,7 @@ static struct pci_driver isp1761_pci_driver = {
|
|||
|
||||
static int __init isp1760_init(void)
|
||||
{
|
||||
int ret;
|
||||
int ret = -ENODEV;
|
||||
|
||||
init_kmem_once();
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
|
|||
struct device *dev = &pdev->dev;
|
||||
struct resource *res, *mem;
|
||||
int retval, irq;
|
||||
struct usb_hcd *hcd = 0;
|
||||
struct usb_hcd *hcd = NULL;
|
||||
|
||||
irq = retval = platform_get_irq(pdev, 0);
|
||||
if (retval < 0)
|
||||
|
|
|
@ -63,9 +63,6 @@
|
|||
#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
|
||||
#define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
|
||||
|
||||
#define USB_VENDOR_ID_MICROCHIP 0x04d8
|
||||
#define USB_DEVICE_ID_PICDEM 0x000c
|
||||
|
||||
#ifdef CONFIG_USB_DYNAMIC_MINORS
|
||||
#define USB_LD_MINOR_BASE 0
|
||||
#else
|
||||
|
@ -92,7 +89,6 @@ static struct usb_device_id ld_usb_table [] = {
|
|||
{ USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICDEM) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
|
|
@ -856,6 +856,11 @@ test_ctrl_queue (struct usbtest_dev *dev, struct usbtest_param *param)
|
|||
struct urb *u;
|
||||
struct usb_ctrlrequest req;
|
||||
struct subcase *reqp;
|
||||
|
||||
/* sign of this variable means:
|
||||
* -: tested code must return this (negative) error code
|
||||
* +: tested code may return this (negative too) error code
|
||||
*/
|
||||
int expected = 0;
|
||||
|
||||
/* requests here are mostly expected to succeed on any
|
||||
|
|
|
@ -447,6 +447,15 @@ config USB_SERIAL_MOS7840
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called mos7840. If unsure, choose N.
|
||||
|
||||
config USB_SERIAL_MOTOROLA
|
||||
tristate "USB Motorola Phone modem driver"
|
||||
---help---
|
||||
Say Y here if you want to use a Motorola phone with a USB
|
||||
connector as a modem link.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called moto_modem. If unsure, choose N.
|
||||
|
||||
config USB_SERIAL_NAVMAN
|
||||
tristate "USB Navman GPS device"
|
||||
help
|
||||
|
|
|
@ -39,6 +39,7 @@ obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o
|
|||
obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o
|
||||
obj-$(CONFIG_USB_SERIAL_MOS7720) += mos7720.o
|
||||
obj-$(CONFIG_USB_SERIAL_MOS7840) += mos7840.o
|
||||
obj-$(CONFIG_USB_SERIAL_MOTOROLA) += moto_modem.o
|
||||
obj-$(CONFIG_USB_SERIAL_NAVMAN) += navman.o
|
||||
obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o
|
||||
obj-$(CONFIG_USB_SERIAL_OPTION) += option.o
|
||||
|
|
70
drivers/usb/serial/moto_modem.c
Normal file
70
drivers/usb/serial/moto_modem.c
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* Motorola USB Phone driver
|
||||
*
|
||||
* Copyright (C) 2008 Greg Kroah-Hartman <greg@kroah.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* {sigh}
|
||||
* Mororola should be using the CDC ACM USB spec, but instead
|
||||
* they try to just "do their own thing"... This driver should handle a
|
||||
* few phones in which a basic "dumb serial connection" is needed to be
|
||||
* able to get a connection through to them.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
static struct usb_device_id id_table [] = {
|
||||
{ USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */
|
||||
{ USB_DEVICE(0x0c44, 0x0022) }, /* unknown Mororola phone */
|
||||
{ USB_DEVICE(0x22b8, 0x2a64) }, /* Motorola KRZR K1m */
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
||||
static struct usb_driver moto_driver = {
|
||||
.name = "moto-modem",
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver moto_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "moto-modem",
|
||||
},
|
||||
.id_table = id_table,
|
||||
.num_ports = 1,
|
||||
};
|
||||
|
||||
static int __init moto_init(void)
|
||||
{
|
||||
int retval;
|
||||
|
||||
retval = usb_serial_register(&moto_device);
|
||||
if (retval)
|
||||
return retval;
|
||||
retval = usb_register(&moto_driver);
|
||||
if (retval)
|
||||
usb_serial_deregister(&moto_device);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void __exit moto_exit(void)
|
||||
{
|
||||
usb_deregister(&moto_driver);
|
||||
usb_serial_deregister(&moto_device);
|
||||
}
|
||||
|
||||
module_init(moto_init);
|
||||
module_exit(moto_exit);
|
||||
MODULE_LICENSE("GPL");
|
|
@ -154,8 +154,6 @@ static int option_send_setup(struct usb_serial_port *port);
|
|||
#define NOVATELWIRELESS_PRODUCT_MC727 0x4100
|
||||
#define NOVATELWIRELESS_PRODUCT_MC950D 0x4400
|
||||
|
||||
#define NOVATELWIRELESS_PRODUCT_U727 0x5010
|
||||
|
||||
/* FUTURE NOVATEL PRODUCTS */
|
||||
#define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000
|
||||
#define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000
|
||||
|
@ -184,6 +182,9 @@ static int option_send_setup(struct usb_serial_port *port);
|
|||
#define AXESSTEL_VENDOR_ID 0x1726
|
||||
#define AXESSTEL_PRODUCT_MV110H 0x1000
|
||||
|
||||
#define ONDA_VENDOR_ID 0x19d2
|
||||
#define ONDA_PRODUCT_ET502HS 0x0002
|
||||
|
||||
#define BANDRICH_VENDOR_ID 0x1A8D
|
||||
#define BANDRICH_PRODUCT_C100_1 0x1002
|
||||
#define BANDRICH_PRODUCT_C100_2 0x1003
|
||||
|
@ -269,7 +270,6 @@ static struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel U727 */
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */
|
||||
|
@ -293,14 +293,17 @@ static struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
|
||||
{ USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
|
||||
{ USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
|
||||
{ USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
|
||||
{ USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
|
||||
{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
|
||||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
||||
{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
|
||||
{ USB_DEVICE(0x19d2, 0x0001) }, /* Telstra NextG CDMA */
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, option_ids);
|
||||
|
|
|
@ -401,6 +401,14 @@ UNUSUAL_DEV( 0x04a5, 0x3010, 0x0100, 0x0100,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
#ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB
|
||||
UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999,
|
||||
"Cypress",
|
||||
"Cypress AT2LP",
|
||||
US_SC_CYP_ATACB, US_PR_BULK, NULL,
|
||||
0),
|
||||
#endif
|
||||
|
||||
/* Reported by Simon Levitt <simon@whattf.com>
|
||||
* This entry needs Sub and Proto fields */
|
||||
UNUSUAL_DEV( 0x04b8, 0x0601, 0x0100, 0x0100,
|
||||
|
@ -539,17 +547,6 @@ UNUSUAL_DEV( 0x04e6, 0x0101, 0x0200, 0x0200,
|
|||
"CD-RW Device",
|
||||
US_SC_8020, US_PR_CB, NULL, 0),
|
||||
|
||||
/* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
|
||||
* Device uses standards-violating 32-byte Bulk Command Block Wrappers and
|
||||
* reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011.
|
||||
*/
|
||||
|
||||
UNUSUAL_DEV( 0x04fc, 0x80c2, 0x0100, 0x0100,
|
||||
"Kobian Mercury",
|
||||
"Binocam DCB-132",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_BULK32),
|
||||
|
||||
#ifdef CONFIG_USB_STORAGE_USBAT
|
||||
UNUSUAL_DEV( 0x04e6, 0x1010, 0x0000, 0x9999,
|
||||
"Shuttle/SCM",
|
||||
|
@ -565,6 +562,16 @@ UNUSUAL_DEV( 0x04e8, 0x507c, 0x0220, 0x0220,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_MAX_SECTORS_64),
|
||||
|
||||
/* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
|
||||
* Device uses standards-violating 32-byte Bulk Command Block Wrappers and
|
||||
* reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04fc, 0x80c2, 0x0100, 0x0100,
|
||||
"Kobian Mercury",
|
||||
"Binocam DCB-132",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_BULK32),
|
||||
|
||||
/* Reported by Bob Sass <rls@vectordb.com> -- only rev 1.33 tested */
|
||||
UNUSUAL_DEV( 0x050d, 0x0115, 0x0133, 0x0133,
|
||||
"Belkin",
|
||||
|
@ -1304,6 +1311,16 @@ UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0101,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_DEVICE ),
|
||||
|
||||
/* Reported by F. Aben <f.aben@option.com>
|
||||
* This device (wrongly) has a vendor-specific device descriptor.
|
||||
* The entry is needed so usb-storage can bind to it's mass-storage
|
||||
* interface as an interface driver */
|
||||
UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000,
|
||||
"Option",
|
||||
"GI 0401 SD-Card",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
0 ),
|
||||
|
||||
#ifdef CONFIG_USB_STORAGE_ISD200
|
||||
UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110,
|
||||
"ATI",
|
||||
|
@ -1361,13 +1378,6 @@ UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_FIX_INQUIRY),
|
||||
|
||||
/* Reported by Rohan Hart <rohan.hart17@gmail.com> */
|
||||
UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010,
|
||||
"INTOVA",
|
||||
"Pixtreme",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/*
|
||||
* Entry for Jenoptik JD 5200z3
|
||||
*
|
||||
|
@ -1684,6 +1694,16 @@ UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Mauro Andreolini <andreoli@weblab.ing.unimo.it>
|
||||
* This entry is needed to bypass the ZeroCD mechanism
|
||||
* and to properly load as a modem device.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x19d2, 0x2000, 0x0000, 0x0000,
|
||||
"Onda ET502HS",
|
||||
"USB MMC Storage",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_DEVICE),
|
||||
|
||||
/* patch submitted by Davide Perini <perini.davide@dpsoftware.org>
|
||||
* and Renato Perini <rperini@email.it>
|
||||
*/
|
||||
|
@ -1721,6 +1741,13 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_GO_SLOW ),
|
||||
|
||||
/* Reported by Rohan Hart <rohan.hart17@gmail.com> */
|
||||
UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010,
|
||||
"INTOVA",
|
||||
"Pixtreme",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/*
|
||||
* David Härdeman <david@2gen.com>
|
||||
* The key makes the SCSI stack print confusing (but harmless) messages
|
||||
|
@ -1745,14 +1772,6 @@ UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_CAPACITY_HEURISTICS),
|
||||
|
||||
#ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB
|
||||
UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999,
|
||||
"Cypress",
|
||||
"Cypress AT2LP",
|
||||
US_SC_CYP_ATACB, US_PR_BULK, NULL,
|
||||
0),
|
||||
#endif
|
||||
|
||||
/* Control/Bulk transport for all SubClass values */
|
||||
USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR),
|
||||
USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR),
|
||||
|
|
150
include/linux/usb/association.h
Normal file
150
include/linux/usb/association.h
Normal file
|
@ -0,0 +1,150 @@
|
|||
/*
|
||||
* Wireless USB - Cable Based Association
|
||||
*
|
||||
* Copyright (C) 2006 Intel Corporation
|
||||
* Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
#ifndef __LINUX_USB_ASSOCIATION_H
|
||||
#define __LINUX_USB_ASSOCIATION_H
|
||||
|
||||
|
||||
/*
|
||||
* Association attributes
|
||||
*
|
||||
* Association Models Supplement to WUSB 1.0 T[3-1]
|
||||
*
|
||||
* Each field in the structures has it's ID, it's length and then the
|
||||
* value. This is the actual definition of the field's ID and its
|
||||
* length.
|
||||
*/
|
||||
struct wusb_am_attr {
|
||||
__u8 id;
|
||||
__u8 len;
|
||||
};
|
||||
|
||||
/* Different fields defined by the spec */
|
||||
#define WUSB_AR_AssociationTypeId { .id = 0x0000, .len = 2 }
|
||||
#define WUSB_AR_AssociationSubTypeId { .id = 0x0001, .len = 2 }
|
||||
#define WUSB_AR_Length { .id = 0x0002, .len = 4 }
|
||||
#define WUSB_AR_AssociationStatus { .id = 0x0004, .len = 4 }
|
||||
#define WUSB_AR_LangID { .id = 0x0008, .len = 2 }
|
||||
#define WUSB_AR_DeviceFriendlyName { .id = 0x000b, .len = 64 } /* max */
|
||||
#define WUSB_AR_HostFriendlyName { .id = 0x000c, .len = 64 } /* max */
|
||||
#define WUSB_AR_CHID { .id = 0x1000, .len = 16 }
|
||||
#define WUSB_AR_CDID { .id = 0x1001, .len = 16 }
|
||||
#define WUSB_AR_ConnectionContext { .id = 0x1002, .len = 48 }
|
||||
#define WUSB_AR_BandGroups { .id = 0x1004, .len = 2 }
|
||||
|
||||
/* CBAF Control Requests (AMS1.0[T4-1] */
|
||||
enum {
|
||||
CBAF_REQ_GET_ASSOCIATION_INFORMATION = 0x01,
|
||||
CBAF_REQ_GET_ASSOCIATION_REQUEST,
|
||||
CBAF_REQ_SET_ASSOCIATION_RESPONSE
|
||||
};
|
||||
|
||||
/*
|
||||
* CBAF USB-interface defitions
|
||||
*
|
||||
* No altsettings, one optional interrupt endpoint.
|
||||
*/
|
||||
enum {
|
||||
CBAF_IFACECLASS = 0xef,
|
||||
CBAF_IFACESUBCLASS = 0x03,
|
||||
CBAF_IFACEPROTOCOL = 0x01,
|
||||
};
|
||||
|
||||
/* Association Information (AMS1.0[T4-3]) */
|
||||
struct wusb_cbaf_assoc_info {
|
||||
__le16 Length;
|
||||
__u8 NumAssociationRequests;
|
||||
__le16 Flags;
|
||||
__u8 AssociationRequestsArray[];
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Association Request (AMS1.0[T4-4]) */
|
||||
struct wusb_cbaf_assoc_request {
|
||||
__u8 AssociationDataIndex;
|
||||
__u8 Reserved;
|
||||
__le16 AssociationTypeId;
|
||||
__le16 AssociationSubTypeId;
|
||||
__le32 AssociationTypeInfoSize;
|
||||
} __attribute__((packed));
|
||||
|
||||
enum {
|
||||
AR_TYPE_WUSB = 0x0001,
|
||||
AR_TYPE_WUSB_RETRIEVE_HOST_INFO = 0x0000,
|
||||
AR_TYPE_WUSB_ASSOCIATE = 0x0001,
|
||||
};
|
||||
|
||||
/* Association Attribute header (AMS1.0[3.8]) */
|
||||
struct wusb_cbaf_attr_hdr {
|
||||
__le16 id;
|
||||
__le16 len;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Host Info (AMS1.0[T4-7]) (yeah, more headers and fields...) */
|
||||
struct wusb_cbaf_host_info {
|
||||
struct wusb_cbaf_attr_hdr AssociationTypeId_hdr;
|
||||
__le16 AssociationTypeId;
|
||||
struct wusb_cbaf_attr_hdr AssociationSubTypeId_hdr;
|
||||
__le16 AssociationSubTypeId;
|
||||
struct wusb_cbaf_attr_hdr CHID_hdr;
|
||||
struct wusb_ckhdid CHID;
|
||||
struct wusb_cbaf_attr_hdr LangID_hdr;
|
||||
__le16 LangID;
|
||||
struct wusb_cbaf_attr_hdr HostFriendlyName_hdr;
|
||||
__u8 HostFriendlyName[];
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Device Info (AMS1.0[T4-8])
|
||||
*
|
||||
* I still don't get this tag'n'header stuff for each goddamn
|
||||
* field...
|
||||
*/
|
||||
struct wusb_cbaf_device_info {
|
||||
struct wusb_cbaf_attr_hdr Length_hdr;
|
||||
__le32 Length;
|
||||
struct wusb_cbaf_attr_hdr CDID_hdr;
|
||||
struct wusb_ckhdid CDID;
|
||||
struct wusb_cbaf_attr_hdr BandGroups_hdr;
|
||||
__le16 BandGroups;
|
||||
struct wusb_cbaf_attr_hdr LangID_hdr;
|
||||
__le16 LangID;
|
||||
struct wusb_cbaf_attr_hdr DeviceFriendlyName_hdr;
|
||||
__u8 DeviceFriendlyName[];
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Connection Context; CC_DATA - Success case (AMS1.0[T4-9]) */
|
||||
struct wusb_cbaf_cc_data {
|
||||
struct wusb_cbaf_attr_hdr AssociationTypeId_hdr;
|
||||
__le16 AssociationTypeId;
|
||||
struct wusb_cbaf_attr_hdr AssociationSubTypeId_hdr;
|
||||
__le16 AssociationSubTypeId;
|
||||
struct wusb_cbaf_attr_hdr Length_hdr;
|
||||
__le32 Length;
|
||||
struct wusb_cbaf_attr_hdr ConnectionContext_hdr;
|
||||
struct wusb_ckhdid CHID;
|
||||
struct wusb_ckhdid CDID;
|
||||
struct wusb_ckhdid CK;
|
||||
struct wusb_cbaf_attr_hdr BandGroups_hdr;
|
||||
__le16 BandGroups;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* CC_DATA - Failure case (AMS1.0[T4-10]) */
|
||||
struct wusb_cbaf_cc_data_fail {
|
||||
struct wusb_cbaf_attr_hdr AssociationTypeId_hdr;
|
||||
__le16 AssociationTypeId;
|
||||
struct wusb_cbaf_attr_hdr AssociationSubTypeId_hdr;
|
||||
__le16 AssociationSubTypeId;
|
||||
struct wusb_cbaf_attr_hdr Length_hdr;
|
||||
__le16 Length;
|
||||
struct wusb_cbaf_attr_hdr AssociationStatus_hdr;
|
||||
__u32 AssociationStatus;
|
||||
} __attribute__((packed));
|
||||
|
||||
#endif /* __LINUX_USB_ASSOCIATION_H */
|
Loading…
Reference in a new issue