mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 11:44:01 +08:00
Merge commit master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6 of HEAD
* HEAD: (44 commits) [PATCH] USB: move usb-serial.h to include/linux/usb/ [PATCH] USB: Anydata: Fixes wrong URB callback. [PATCH] USB: gadget section fixups [PATCH] USB: another unusual device [PATCH] USB: Add one VID/PID to ftdi_sio [PATCH] USB: unusual_devs entry for Sony DSC-H5 [PATCH] USB: unusual_devs entry for Nokia E61 [PATCH] USB: unusual_devs entry for Nokia N91 [PATCH] USB: add ZyXEL vendor/product ID to rtl8150 driver [PATCH] USB: Option driver: new product ID [PATCH] USB: add support for WiseGroup., Ltd SmartJoy Dual PLUS Adapter [PATCH] USB: ipw.c driver fix [PATCH] USB: remove devfs information from Kconfig [PATCH] USB: remove empty destructor from drivers/usb/mon/mon_text.c [PATCH] USB: ipaq.c timing parameters [PATCH] USB: ipaq.c bugfixes [PATCH] USB: ehci: fix bogus alteration of a local variable [PATCH] USB: add driver for non-composite Sierra Wireless devices [PATCH] USB: fix pointer dereference in drivers/usb/misc/usblcd [PATCH] USB: Kill compiler warning in quirk_usb_handoff_ohci ...
This commit is contained in:
commit
70d002bcca
@ -399,10 +399,10 @@ REINER SCT cyberJack pinpad/e-com USB chipcard reader
|
|||||||
|
|
||||||
Prolific PL2303 Driver
|
Prolific PL2303 Driver
|
||||||
|
|
||||||
This driver support any device that has the PL2303 chip from Prolific
|
This driver supports any device that has the PL2303 chip from Prolific
|
||||||
in it. This includes a number of single port USB to serial
|
in it. This includes a number of single port USB to serial
|
||||||
converters and USB GPS devices. Devices from Aten (the UC-232) and
|
converters and USB GPS devices. Devices from Aten (the UC-232) and
|
||||||
IO-Data work with this driver.
|
IO-Data work with this driver, as does the DCU-11 mobile-phone cable.
|
||||||
|
|
||||||
For any questions or problems with this driver, please contact Greg
|
For any questions or problems with this driver, please contact Greg
|
||||||
Kroah-Hartman at greg@kroah.com
|
Kroah-Hartman at greg@kroah.com
|
||||||
|
@ -23,6 +23,7 @@ config USB_ARCH_HAS_OHCI
|
|||||||
default y if ARCH_LH7A404
|
default y if ARCH_LH7A404
|
||||||
default y if ARCH_S3C2410
|
default y if ARCH_S3C2410
|
||||||
default y if PXA27x
|
default y if PXA27x
|
||||||
|
default y if ARCH_EP93XX
|
||||||
default y if ARCH_AT91RM9200
|
default y if ARCH_AT91RM9200
|
||||||
# PPC:
|
# PPC:
|
||||||
default y if STB03xxx
|
default y if STB03xxx
|
||||||
|
@ -48,7 +48,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/
|
|||||||
obj-$(CONFIG_USB_SERIAL) += serial/
|
obj-$(CONFIG_USB_SERIAL) += serial/
|
||||||
|
|
||||||
obj-$(CONFIG_USB_AUERSWALD) += misc/
|
obj-$(CONFIG_USB_AUERSWALD) += misc/
|
||||||
obj-$(CONFIG_USB_CY7C63) += misc/
|
obj-$(CONFIG_USB_CYPRESS_CY7C63)+= misc/
|
||||||
obj-$(CONFIG_USB_CYTHERM) += misc/
|
obj-$(CONFIG_USB_CYTHERM) += misc/
|
||||||
obj-$(CONFIG_USB_EMI26) += misc/
|
obj-$(CONFIG_USB_EMI26) += misc/
|
||||||
obj-$(CONFIG_USB_EMI62) += misc/
|
obj-$(CONFIG_USB_EMI62) += misc/
|
||||||
|
@ -291,13 +291,13 @@ static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
|
|||||||
struct acm_ru *rcv = urb->context;
|
struct acm_ru *rcv = urb->context;
|
||||||
struct acm *acm = rcv->instance;
|
struct acm *acm = rcv->instance;
|
||||||
int status = urb->status;
|
int status = urb->status;
|
||||||
dbg("Entering acm_read_bulk with status %d\n", urb->status);
|
dbg("Entering acm_read_bulk with status %d", urb->status);
|
||||||
|
|
||||||
if (!ACM_READY(acm))
|
if (!ACM_READY(acm))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (status)
|
if (status)
|
||||||
dev_dbg(&acm->data->dev, "bulk rx status %d\n", status);
|
dev_dbg(&acm->data->dev, "bulk rx status %d", status);
|
||||||
|
|
||||||
buf = rcv->buffer;
|
buf = rcv->buffer;
|
||||||
buf->size = urb->actual_length;
|
buf->size = urb->actual_length;
|
||||||
@ -343,7 +343,7 @@ next_buffer:
|
|||||||
list_del(&buf->list);
|
list_del(&buf->list);
|
||||||
spin_unlock(&acm->read_lock);
|
spin_unlock(&acm->read_lock);
|
||||||
|
|
||||||
dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d\n", buf, buf->size);
|
dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size);
|
||||||
|
|
||||||
tty_buffer_request_room(tty, buf->size);
|
tty_buffer_request_room(tty, buf->size);
|
||||||
if (!acm->throttle)
|
if (!acm->throttle)
|
||||||
@ -394,7 +394,7 @@ urbs:
|
|||||||
rcv->urb->transfer_dma = buf->dma;
|
rcv->urb->transfer_dma = buf->dma;
|
||||||
rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||||
|
|
||||||
dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p\n", rcv->urb, rcv, buf);
|
dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf);
|
||||||
|
|
||||||
/* This shouldn't kill the driver as unsuccessful URBs are returned to the
|
/* This shouldn't kill the driver as unsuccessful URBs are returned to the
|
||||||
free-urbs-pool and resubmited ASAP */
|
free-urbs-pool and resubmited ASAP */
|
||||||
@ -413,7 +413,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
struct acm *acm = (struct acm *)urb->context;
|
struct acm *acm = (struct acm *)urb->context;
|
||||||
|
|
||||||
dbg("Entering acm_write_bulk with status %d\n", urb->status);
|
dbg("Entering acm_write_bulk with status %d", urb->status);
|
||||||
|
|
||||||
acm_write_done(acm);
|
acm_write_done(acm);
|
||||||
acm_write_start(acm);
|
acm_write_start(acm);
|
||||||
@ -424,7 +424,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
|
|||||||
static void acm_softint(void *private)
|
static void acm_softint(void *private)
|
||||||
{
|
{
|
||||||
struct acm *acm = private;
|
struct acm *acm = private;
|
||||||
dbg("Entering acm_softint.\n");
|
dbg("Entering acm_softint.");
|
||||||
|
|
||||||
if (!ACM_READY(acm))
|
if (!ACM_READY(acm))
|
||||||
return;
|
return;
|
||||||
@ -440,7 +440,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
|
|||||||
struct acm *acm;
|
struct acm *acm;
|
||||||
int rv = -EINVAL;
|
int rv = -EINVAL;
|
||||||
int i;
|
int i;
|
||||||
dbg("Entering acm_tty_open.\n");
|
dbg("Entering acm_tty_open.");
|
||||||
|
|
||||||
mutex_lock(&open_mutex);
|
mutex_lock(&open_mutex);
|
||||||
|
|
||||||
@ -541,7 +541,7 @@ static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int c
|
|||||||
int wbn;
|
int wbn;
|
||||||
struct acm_wb *wb;
|
struct acm_wb *wb;
|
||||||
|
|
||||||
dbg("Entering acm_tty_write to write %d bytes,\n", count);
|
dbg("Entering acm_tty_write to write %d bytes,", count);
|
||||||
|
|
||||||
if (!ACM_READY(acm))
|
if (!ACM_READY(acm))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -793,7 +793,7 @@ static int acm_probe (struct usb_interface *intf,
|
|||||||
|
|
||||||
if (!buflen) {
|
if (!buflen) {
|
||||||
if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
|
if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
|
||||||
dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n");
|
dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint");
|
||||||
buflen = intf->cur_altsetting->endpoint->extralen;
|
buflen = intf->cur_altsetting->endpoint->extralen;
|
||||||
buffer = intf->cur_altsetting->endpoint->extra;
|
buffer = intf->cur_altsetting->endpoint->extra;
|
||||||
} else {
|
} else {
|
||||||
@ -842,24 +842,24 @@ next_desc:
|
|||||||
|
|
||||||
if (!union_header) {
|
if (!union_header) {
|
||||||
if (call_interface_num > 0) {
|
if (call_interface_num > 0) {
|
||||||
dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n");
|
dev_dbg(&intf->dev,"No union descriptor, using call management descriptor");
|
||||||
data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
|
data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
|
||||||
control_interface = intf;
|
control_interface = intf;
|
||||||
} else {
|
} else {
|
||||||
dev_dbg(&intf->dev,"No union descriptor, giving up\n");
|
dev_dbg(&intf->dev,"No union descriptor, giving up");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
|
control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
|
||||||
data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
|
data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
|
||||||
if (!control_interface || !data_interface) {
|
if (!control_interface || !data_interface) {
|
||||||
dev_dbg(&intf->dev,"no interfaces\n");
|
dev_dbg(&intf->dev,"no interfaces");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_interface_num != call_interface_num)
|
if (data_interface_num != call_interface_num)
|
||||||
dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n");
|
dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.");
|
||||||
|
|
||||||
skip_normal_probe:
|
skip_normal_probe:
|
||||||
|
|
||||||
@ -867,7 +867,7 @@ skip_normal_probe:
|
|||||||
if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
|
if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
|
||||||
if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
|
if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
|
||||||
struct usb_interface *t;
|
struct usb_interface *t;
|
||||||
dev_dbg(&intf->dev,"Your device has switched interfaces.\n");
|
dev_dbg(&intf->dev,"Your device has switched interfaces.");
|
||||||
|
|
||||||
t = control_interface;
|
t = control_interface;
|
||||||
control_interface = data_interface;
|
control_interface = data_interface;
|
||||||
@ -878,7 +878,7 @@ skip_normal_probe:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (usb_interface_claimed(data_interface)) { /* valid in this context */
|
if (usb_interface_claimed(data_interface)) { /* valid in this context */
|
||||||
dev_dbg(&intf->dev,"The data interface isn't available\n");
|
dev_dbg(&intf->dev,"The data interface isn't available");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -895,7 +895,7 @@ skip_normal_probe:
|
|||||||
if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
|
if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
|
||||||
/* descriptors are swapped */
|
/* descriptors are swapped */
|
||||||
struct usb_endpoint_descriptor *t;
|
struct usb_endpoint_descriptor *t;
|
||||||
dev_dbg(&intf->dev,"The data interface has switched endpoints\n");
|
dev_dbg(&intf->dev,"The data interface has switched endpoints");
|
||||||
|
|
||||||
t = epread;
|
t = epread;
|
||||||
epread = epwrite;
|
epread = epwrite;
|
||||||
@ -910,7 +910,7 @@ skip_normal_probe:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) {
|
if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) {
|
||||||
dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n");
|
dev_dbg(&intf->dev, "out of memory (acm kzalloc)");
|
||||||
goto alloc_fail;
|
goto alloc_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -936,26 +936,26 @@ skip_normal_probe:
|
|||||||
|
|
||||||
buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
|
buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
|
dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)");
|
||||||
goto alloc_fail2;
|
goto alloc_fail2;
|
||||||
}
|
}
|
||||||
acm->ctrl_buffer = buf;
|
acm->ctrl_buffer = buf;
|
||||||
|
|
||||||
if (acm_write_buffers_alloc(acm) < 0) {
|
if (acm_write_buffers_alloc(acm) < 0) {
|
||||||
dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
|
dev_dbg(&intf->dev, "out of memory (write buffer alloc)");
|
||||||
goto alloc_fail4;
|
goto alloc_fail4;
|
||||||
}
|
}
|
||||||
|
|
||||||
acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
|
acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
|
||||||
if (!acm->ctrlurb) {
|
if (!acm->ctrlurb) {
|
||||||
dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
|
dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)");
|
||||||
goto alloc_fail5;
|
goto alloc_fail5;
|
||||||
}
|
}
|
||||||
for (i = 0; i < num_rx_buf; i++) {
|
for (i = 0; i < num_rx_buf; i++) {
|
||||||
struct acm_ru *rcv = &(acm->ru[i]);
|
struct acm_ru *rcv = &(acm->ru[i]);
|
||||||
|
|
||||||
if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) {
|
if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) {
|
||||||
dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)\n");
|
dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)");
|
||||||
goto alloc_fail7;
|
goto alloc_fail7;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -966,13 +966,13 @@ skip_normal_probe:
|
|||||||
struct acm_rb *buf = &(acm->rb[i]);
|
struct acm_rb *buf = &(acm->rb[i]);
|
||||||
|
|
||||||
if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) {
|
if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) {
|
||||||
dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)\n");
|
dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)");
|
||||||
goto alloc_fail7;
|
goto alloc_fail7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
|
acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
|
||||||
if (!acm->writeurb) {
|
if (!acm->writeurb) {
|
||||||
dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
|
dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)");
|
||||||
goto alloc_fail7;
|
goto alloc_fail7;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1086,6 +1086,9 @@ static struct usb_device_id acm_ids[] = {
|
|||||||
{ USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */
|
{ USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */
|
||||||
.driver_info = SINGLE_RX_URB, /* firmware bug */
|
.driver_info = SINGLE_RX_URB, /* firmware bug */
|
||||||
},
|
},
|
||||||
|
{ USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */
|
||||||
|
.driver_info = SINGLE_RX_URB, /* firmware bug */
|
||||||
|
},
|
||||||
/* control interfaces with various AT-command sets */
|
/* control interfaces with various AT-command sets */
|
||||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
||||||
USB_CDC_ACM_PROTO_AT_V25TER) },
|
USB_CDC_ACM_PROTO_AT_V25TER) },
|
||||||
|
@ -31,9 +31,6 @@ config USB_DEVICEFS
|
|||||||
For the format of the various /proc/bus/usb/ files, please read
|
For the format of the various /proc/bus/usb/ files, please read
|
||||||
<file:Documentation/usb/proc_usb_info.txt>.
|
<file:Documentation/usb/proc_usb_info.txt>.
|
||||||
|
|
||||||
Please note that this code is completely unrelated to devfs, the
|
|
||||||
"/dev file system support".
|
|
||||||
|
|
||||||
Most users want to say Y here.
|
Most users want to say Y here.
|
||||||
|
|
||||||
config USB_BANDWIDTH
|
config USB_BANDWIDTH
|
||||||
|
@ -1790,7 +1790,10 @@ static int finish_device_resume(struct usb_device *udev)
|
|||||||
* and device drivers will know about any resume quirks.
|
* and device drivers will know about any resume quirks.
|
||||||
*/
|
*/
|
||||||
status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
|
status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
|
||||||
if (status < 2)
|
if (status >= 0)
|
||||||
|
status = (status == 2 ? 0 : -ENODEV);
|
||||||
|
|
||||||
|
if (status)
|
||||||
dev_dbg(&udev->dev,
|
dev_dbg(&udev->dev,
|
||||||
"gone after usb resume? status %d\n",
|
"gone after usb resume? status %d\n",
|
||||||
status);
|
status);
|
||||||
@ -1879,7 +1882,12 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev)
|
|||||||
dev_dbg(hub->intfdev,
|
dev_dbg(hub->intfdev,
|
||||||
"port %d status %04x.%04x after resume, %d\n",
|
"port %d status %04x.%04x after resume, %d\n",
|
||||||
port1, portchange, devstatus, status);
|
port1, portchange, devstatus, status);
|
||||||
|
if (status >= 0)
|
||||||
|
status = -ENODEV;
|
||||||
} else {
|
} else {
|
||||||
|
if (portchange & USB_PORT_STAT_C_SUSPEND)
|
||||||
|
clear_port_feature(hub->hdev, port1,
|
||||||
|
USB_PORT_FEAT_C_SUSPEND);
|
||||||
/* TRSMRCY = 10 msec */
|
/* TRSMRCY = 10 msec */
|
||||||
msleep(10);
|
msleep(10);
|
||||||
if (udev)
|
if (udev)
|
||||||
|
@ -695,7 +695,7 @@ static void usbfs_remove_device(struct usb_device *dev)
|
|||||||
wake_up_all(&ds->wait);
|
wake_up_all(&ds->wait);
|
||||||
list_del_init(&ds->list);
|
list_del_init(&ds->list);
|
||||||
if (ds->discsignr) {
|
if (ds->discsignr) {
|
||||||
sinfo.si_signo = SIGPIPE;
|
sinfo.si_signo = ds->discsignr;
|
||||||
sinfo.si_errno = EPIPE;
|
sinfo.si_errno = EPIPE;
|
||||||
sinfo.si_code = SI_ASYNCIO;
|
sinfo.si_code = SI_ASYNCIO;
|
||||||
sinfo.si_addr = ds->disccontext;
|
sinfo.si_addr = ds->disccontext;
|
||||||
|
@ -34,12 +34,12 @@
|
|||||||
|
|
||||||
|
|
||||||
/* we must assign addresses for configurable endpoints (like net2280) */
|
/* we must assign addresses for configurable endpoints (like net2280) */
|
||||||
static __initdata unsigned epnum;
|
static __devinitdata unsigned epnum;
|
||||||
|
|
||||||
// #define MANY_ENDPOINTS
|
// #define MANY_ENDPOINTS
|
||||||
#ifdef MANY_ENDPOINTS
|
#ifdef MANY_ENDPOINTS
|
||||||
/* more than 15 configurable endpoints */
|
/* more than 15 configurable endpoints */
|
||||||
static __initdata unsigned in_epnum;
|
static __devinitdata unsigned in_epnum;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ static __initdata unsigned in_epnum;
|
|||||||
* NOTE: each endpoint is unidirectional, as specified by its USB
|
* NOTE: each endpoint is unidirectional, as specified by its USB
|
||||||
* descriptor; and isn't specific to a configuration or altsetting.
|
* descriptor; and isn't specific to a configuration or altsetting.
|
||||||
*/
|
*/
|
||||||
static int __init
|
static int __devinit
|
||||||
ep_matches (
|
ep_matches (
|
||||||
struct usb_gadget *gadget,
|
struct usb_gadget *gadget,
|
||||||
struct usb_ep *ep,
|
struct usb_ep *ep,
|
||||||
@ -73,7 +73,7 @@ ep_matches (
|
|||||||
/* endpoint already claimed? */
|
/* endpoint already claimed? */
|
||||||
if (0 != ep->driver_data)
|
if (0 != ep->driver_data)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* only support ep0 for portable CONTROL traffic */
|
/* only support ep0 for portable CONTROL traffic */
|
||||||
type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
|
type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
|
||||||
if (USB_ENDPOINT_XFER_CONTROL == type)
|
if (USB_ENDPOINT_XFER_CONTROL == type)
|
||||||
@ -186,7 +186,7 @@ ep_matches (
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct usb_ep * __init
|
static struct usb_ep * __devinit
|
||||||
find_ep (struct usb_gadget *gadget, const char *name)
|
find_ep (struct usb_gadget *gadget, const char *name)
|
||||||
{
|
{
|
||||||
struct usb_ep *ep;
|
struct usb_ep *ep;
|
||||||
@ -228,7 +228,7 @@ find_ep (struct usb_gadget *gadget, const char *name)
|
|||||||
*
|
*
|
||||||
* On failure, this returns a null endpoint descriptor.
|
* On failure, this returns a null endpoint descriptor.
|
||||||
*/
|
*/
|
||||||
struct usb_ep * __init usb_ep_autoconfig (
|
struct usb_ep * __devinit usb_ep_autoconfig (
|
||||||
struct usb_gadget *gadget,
|
struct usb_gadget *gadget,
|
||||||
struct usb_endpoint_descriptor *desc
|
struct usb_endpoint_descriptor *desc
|
||||||
)
|
)
|
||||||
@ -276,7 +276,7 @@ struct usb_ep * __init usb_ep_autoconfig (
|
|||||||
return ep;
|
return ep;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Second, look at endpoints until an unclaimed one looks usable */
|
/* Second, look at endpoints until an unclaimed one looks usable */
|
||||||
list_for_each_entry (ep, &gadget->ep_list, ep_list) {
|
list_for_each_entry (ep, &gadget->ep_list, ep_list) {
|
||||||
if (ep_matches (gadget, ep, desc))
|
if (ep_matches (gadget, ep, desc))
|
||||||
return ep;
|
return ep;
|
||||||
@ -295,7 +295,7 @@ struct usb_ep * __init usb_ep_autoconfig (
|
|||||||
* state such as ep->driver_data and the record of assigned endpoints
|
* state such as ep->driver_data and the record of assigned endpoints
|
||||||
* used by usb_ep_autoconfig().
|
* used by usb_ep_autoconfig().
|
||||||
*/
|
*/
|
||||||
void __init usb_ep_autoconfig_reset (struct usb_gadget *gadget)
|
void __devinit usb_ep_autoconfig_reset (struct usb_gadget *gadget)
|
||||||
{
|
{
|
||||||
struct usb_ep *ep;
|
struct usb_ep *ep;
|
||||||
|
|
||||||
|
@ -2131,7 +2131,7 @@ eth_req_free (struct usb_ep *ep, struct usb_request *req)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void __exit
|
static void /* __init_or_exit */
|
||||||
eth_unbind (struct usb_gadget *gadget)
|
eth_unbind (struct usb_gadget *gadget)
|
||||||
{
|
{
|
||||||
struct eth_dev *dev = get_gadget_data (gadget);
|
struct eth_dev *dev = get_gadget_data (gadget);
|
||||||
@ -2158,7 +2158,7 @@ eth_unbind (struct usb_gadget *gadget)
|
|||||||
set_gadget_data (gadget, NULL);
|
set_gadget_data (gadget, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 __init nibble (unsigned char c)
|
static u8 __devinit nibble (unsigned char c)
|
||||||
{
|
{
|
||||||
if (likely (isdigit (c)))
|
if (likely (isdigit (c)))
|
||||||
return c - '0';
|
return c - '0';
|
||||||
@ -2168,7 +2168,7 @@ static u8 __init nibble (unsigned char c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init get_ether_addr(const char *str, u8 *dev_addr)
|
static int __devinit get_ether_addr(const char *str, u8 *dev_addr)
|
||||||
{
|
{
|
||||||
if (str) {
|
if (str) {
|
||||||
unsigned i;
|
unsigned i;
|
||||||
@ -2189,7 +2189,7 @@ static int __init get_ether_addr(const char *str, u8 *dev_addr)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
eth_bind (struct usb_gadget *gadget)
|
eth_bind (struct usb_gadget *gadget)
|
||||||
{
|
{
|
||||||
struct eth_dev *dev;
|
struct eth_dev *dev;
|
||||||
|
@ -3691,7 +3691,7 @@ static void lun_release(struct device *dev)
|
|||||||
kref_put(&fsg->ref, fsg_release);
|
kref_put(&fsg->ref, fsg_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit fsg_unbind(struct usb_gadget *gadget)
|
static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget)
|
||||||
{
|
{
|
||||||
struct fsg_dev *fsg = get_gadget_data(gadget);
|
struct fsg_dev *fsg = get_gadget_data(gadget);
|
||||||
int i;
|
int i;
|
||||||
|
@ -1398,7 +1398,7 @@ static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS];
|
|||||||
#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
|
#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
|
||||||
|
|
||||||
|
|
||||||
int __init rndis_init (void)
|
int __devinit rndis_init (void)
|
||||||
{
|
{
|
||||||
u8 i;
|
u8 i;
|
||||||
|
|
||||||
|
@ -264,7 +264,7 @@ int rndis_signal_disconnect (int configNr);
|
|||||||
int rndis_state (int configNr);
|
int rndis_state (int configNr);
|
||||||
extern void rndis_set_host_mac (int configNr, const u8 *addr);
|
extern void rndis_set_host_mac (int configNr, const u8 *addr);
|
||||||
|
|
||||||
int __init rndis_init (void);
|
int __devinit rndis_init (void);
|
||||||
void rndis_exit (void);
|
void rndis_exit (void);
|
||||||
|
|
||||||
#endif /* _LINUX_RNDIS_H */
|
#endif /* _LINUX_RNDIS_H */
|
||||||
|
@ -1473,7 +1473,7 @@ autoconf_fail:
|
|||||||
* Called on module unload. Frees the control request and device
|
* Called on module unload. Frees the control request and device
|
||||||
* structure.
|
* structure.
|
||||||
*/
|
*/
|
||||||
static void __exit gs_unbind(struct usb_gadget *gadget)
|
static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget)
|
||||||
{
|
{
|
||||||
struct gs_dev *dev = get_gadget_data(gadget);
|
struct gs_dev *dev = get_gadget_data(gadget);
|
||||||
|
|
||||||
|
@ -1121,7 +1121,7 @@ zero_autoresume (unsigned long _dev)
|
|||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void __exit
|
static void /* __init_or_exit */
|
||||||
zero_unbind (struct usb_gadget *gadget)
|
zero_unbind (struct usb_gadget *gadget)
|
||||||
{
|
{
|
||||||
struct zero_dev *dev = get_gadget_data (gadget);
|
struct zero_dev *dev = get_gadget_data (gadget);
|
||||||
|
@ -41,8 +41,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
|
#define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
|
||||||
|
|
||||||
#endif /* Au1200 */
|
|
||||||
|
|
||||||
extern int usb_disabled(void);
|
extern int usb_disabled(void);
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
@ -107,9 +105,9 @@ int usb_ehci_au1xxx_probe(const struct hc_driver *driver,
|
|||||||
|
|
||||||
/* Au1200 AB USB does not support coherent memory */
|
/* Au1200 AB USB does not support coherent memory */
|
||||||
if (!(read_c0_prid() & 0xff)) {
|
if (!(read_c0_prid() & 0xff)) {
|
||||||
pr_info("%s: this is chip revision AB!\n", dev->dev.name);
|
pr_info("%s: this is chip revision AB!\n", dev->name);
|
||||||
pr_info("%s: update your board or re-configure the kernel\n",
|
pr_info("%s: update your board or re-configure the kernel\n",
|
||||||
dev->dev.name);
|
dev->name);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -228,9 +226,8 @@ static const struct hc_driver ehci_au1xxx_hc_driver = {
|
|||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static int ehci_hcd_au1xxx_drv_probe(struct device *dev)
|
static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
|
||||||
struct usb_hcd *hcd = NULL;
|
struct usb_hcd *hcd = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -243,10 +240,9 @@ static int ehci_hcd_au1xxx_drv_probe(struct device *dev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ehci_hcd_au1xxx_drv_remove(struct device *dev)
|
static int ehci_hcd_au1xxx_drv_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
||||||
struct usb_hcd *hcd = dev_get_drvdata(dev);
|
|
||||||
|
|
||||||
usb_ehci_au1xxx_remove(hcd, pdev);
|
usb_ehci_au1xxx_remove(hcd, pdev);
|
||||||
return 0;
|
return 0;
|
||||||
@ -269,12 +265,13 @@ static int ehci_hcd_au1xxx_drv_resume(struct device *dev)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
MODULE_ALIAS("au1xxx-ehci");
|
MODULE_ALIAS("au1xxx-ehci");
|
||||||
/* FIXME use "struct platform_driver" */
|
static struct platform_driver ehci_hcd_au1xxx_driver = {
|
||||||
static struct device_driver ehci_hcd_au1xxx_driver = {
|
|
||||||
.name = "au1xxx-ehci",
|
|
||||||
.bus = &platform_bus_type,
|
|
||||||
.probe = ehci_hcd_au1xxx_drv_probe,
|
.probe = ehci_hcd_au1xxx_drv_probe,
|
||||||
.remove = ehci_hcd_au1xxx_drv_remove,
|
.remove = ehci_hcd_au1xxx_drv_remove,
|
||||||
/*.suspend = ehci_hcd_au1xxx_drv_suspend, */
|
/*.suspend = ehci_hcd_au1xxx_drv_suspend, */
|
||||||
/*.resume = ehci_hcd_au1xxx_drv_resume, */
|
/*.resume = ehci_hcd_au1xxx_drv_resume, */
|
||||||
|
.driver = {
|
||||||
|
.name = "au1xxx-ehci",
|
||||||
|
.bus = &platform_bus_type
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -625,10 +625,11 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
|
|||||||
writel (status | CMD_RUN, &ehci->regs->command);
|
writel (status | CMD_RUN, &ehci->regs->command);
|
||||||
|
|
||||||
while (i--) {
|
while (i--) {
|
||||||
status = readl (&ehci->regs->port_status [i]);
|
int pstatus = readl (&ehci->regs->port_status [i]);
|
||||||
if (status & PORT_OWNER)
|
|
||||||
|
if (pstatus & PORT_OWNER)
|
||||||
continue;
|
continue;
|
||||||
if (!(status & PORT_RESUME)
|
if (!(pstatus & PORT_RESUME)
|
||||||
|| ehci->reset_done [i] != 0)
|
|| ehci->reset_done [i] != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -101,13 +101,16 @@ static void au1xxx_start_ohc(struct platform_device *dev)
|
|||||||
|
|
||||||
#endif /* Au1200 */
|
#endif /* Au1200 */
|
||||||
|
|
||||||
|
#ifndef CONFIG_SOC_AU1200
|
||||||
/* wait for reset complete (read register twice; see au1500 errata) */
|
/* wait for reset complete (read register twice; see au1500 errata) */
|
||||||
while (au_readl(USB_HOST_CONFIG),
|
while (au_readl(USB_HOST_CONFIG),
|
||||||
!(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD))
|
!(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD))
|
||||||
|
#endif
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
|
|
||||||
printk(KERN_DEBUG __FILE__
|
printk(KERN_DEBUG __FILE__
|
||||||
": Clock to USB host has been enabled \n");
|
": Clock to USB host has been enabled \n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void au1xxx_stop_ohc(struct platform_device *dev)
|
static void au1xxx_stop_ohc(struct platform_device *dev)
|
||||||
@ -157,9 +160,9 @@ static int usb_ohci_au1xxx_probe(const struct hc_driver *driver,
|
|||||||
/* Au1200 AB USB does not support coherent memory */
|
/* Au1200 AB USB does not support coherent memory */
|
||||||
if (!(read_c0_prid() & 0xff)) {
|
if (!(read_c0_prid() & 0xff)) {
|
||||||
pr_info("%s: this is chip revision AB !!\n",
|
pr_info("%s: this is chip revision AB !!\n",
|
||||||
dev->dev.name);
|
dev->name);
|
||||||
pr_info("%s: update your board or re-configure the kernel\n",
|
pr_info("%s: update your board or re-configure the kernel\n",
|
||||||
dev->dev.name);
|
dev->name);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
225
drivers/usb/host/ohci-ep93xx.c
Normal file
225
drivers/usb/host/ohci-ep93xx.c
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
/*
|
||||||
|
* OHCI HCD (Host Controller Driver) for USB.
|
||||||
|
*
|
||||||
|
* (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
|
||||||
|
* (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
|
||||||
|
* (C) Copyright 2002 Hewlett-Packard Company
|
||||||
|
*
|
||||||
|
* Bus Glue for ep93xx.
|
||||||
|
*
|
||||||
|
* Written by Christopher Hoover <ch@hpl.hp.com>
|
||||||
|
* Based on fragments of previous driver by Russell King et al.
|
||||||
|
*
|
||||||
|
* Modified for LH7A404 from ohci-sa1111.c
|
||||||
|
* by Durgesh Pattamatta <pattamattad@sharpsec.com>
|
||||||
|
*
|
||||||
|
* Modified for pxa27x from ohci-lh7a404.c
|
||||||
|
* by Nick Bane <nick@cecomputing.co.uk> 26-8-2004
|
||||||
|
*
|
||||||
|
* Modified for ep93xx from ohci-pxa27x.c
|
||||||
|
* by Lennert Buytenhek <buytenh@wantstofly.org> 28-2-2006
|
||||||
|
* Based on an earlier driver by Ray Lehtiniemi
|
||||||
|
*
|
||||||
|
* This file is licenced under the GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
#include <asm/hardware.h>
|
||||||
|
|
||||||
|
static struct clk *usb_host_clock;
|
||||||
|
|
||||||
|
static void ep93xx_start_hc(struct device *dev)
|
||||||
|
{
|
||||||
|
clk_enable(usb_host_clock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ep93xx_stop_hc(struct device *dev)
|
||||||
|
{
|
||||||
|
clk_disable(usb_host_clock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int usb_hcd_ep93xx_probe(const struct hc_driver *driver,
|
||||||
|
struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct usb_hcd *hcd;
|
||||||
|
|
||||||
|
if (pdev->resource[1].flags != IORESOURCE_IRQ) {
|
||||||
|
pr_debug("resource[1] is not IORESOURCE_IRQ");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
hcd = usb_create_hcd(driver, &pdev->dev, "ep93xx");
|
||||||
|
if (hcd == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
hcd->rsrc_start = pdev->resource[0].start;
|
||||||
|
hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
|
||||||
|
if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
|
||||||
|
usb_put_hcd(hcd);
|
||||||
|
retval = -EBUSY;
|
||||||
|
goto err1;
|
||||||
|
}
|
||||||
|
|
||||||
|
hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
|
||||||
|
if (hcd->regs == NULL) {
|
||||||
|
pr_debug("ioremap failed");
|
||||||
|
retval = -ENOMEM;
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_host_clock = clk_get(&pdev->dev, "usb_host");
|
||||||
|
ep93xx_start_hc(&pdev->dev);
|
||||||
|
|
||||||
|
ohci_hcd_init(hcd_to_ohci(hcd));
|
||||||
|
|
||||||
|
retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT);
|
||||||
|
if (retval == 0)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
ep93xx_stop_hc(&pdev->dev);
|
||||||
|
iounmap(hcd->regs);
|
||||||
|
err2:
|
||||||
|
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
||||||
|
err1:
|
||||||
|
usb_put_hcd(hcd);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usb_hcd_ep93xx_remove(struct usb_hcd *hcd,
|
||||||
|
struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
usb_remove_hcd(hcd);
|
||||||
|
ep93xx_stop_hc(&pdev->dev);
|
||||||
|
clk_put(usb_host_clock);
|
||||||
|
iounmap(hcd->regs);
|
||||||
|
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
||||||
|
usb_put_hcd(hcd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __devinit ohci_ep93xx_start(struct usb_hcd *hcd)
|
||||||
|
{
|
||||||
|
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((ret = ohci_init(ohci)) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if ((ret = ohci_run(ohci)) < 0) {
|
||||||
|
err("can't start %s", hcd->self.bus_name);
|
||||||
|
ohci_stop(hcd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct hc_driver ohci_ep93xx_hc_driver = {
|
||||||
|
.description = hcd_name,
|
||||||
|
.product_desc = "EP93xx OHCI",
|
||||||
|
.hcd_priv_size = sizeof(struct ohci_hcd),
|
||||||
|
.irq = ohci_irq,
|
||||||
|
.flags = HCD_USB11 | HCD_MEMORY,
|
||||||
|
.start = ohci_ep93xx_start,
|
||||||
|
.stop = ohci_stop,
|
||||||
|
.urb_enqueue = ohci_urb_enqueue,
|
||||||
|
.urb_dequeue = ohci_urb_dequeue,
|
||||||
|
.endpoint_disable = ohci_endpoint_disable,
|
||||||
|
.get_frame_number = ohci_get_frame,
|
||||||
|
.hub_status_data = ohci_hub_status_data,
|
||||||
|
.hub_control = ohci_hub_control,
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
.bus_suspend = ohci_bus_suspend,
|
||||||
|
.bus_resume = ohci_bus_resume,
|
||||||
|
#endif
|
||||||
|
.start_port_reset = ohci_start_port_reset,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int usb_disabled(void);
|
||||||
|
|
||||||
|
static int ohci_hcd_ep93xx_drv_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = -ENODEV;
|
||||||
|
if (!usb_disabled())
|
||||||
|
ret = usb_hcd_ep93xx_probe(&ohci_ep93xx_hc_driver, pdev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ohci_hcd_ep93xx_drv_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
|
usb_hcd_ep93xx_remove(hcd, pdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
static int ohci_hcd_ep93xx_drv_suspend(struct platform_device *pdev, pm_message_t state)
|
||||||
|
{
|
||||||
|
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
||||||
|
struct ochi_hcd *ohci = hcd_to_ohci(hcd);
|
||||||
|
|
||||||
|
if (time_before(jiffies, ohci->next_statechange))
|
||||||
|
msleep(5);
|
||||||
|
ohci->next_statechange = jiffies;
|
||||||
|
|
||||||
|
ep93xx_stop_hc(&pdev->dev);
|
||||||
|
hcd->state = HC_STATE_SUSPENDED;
|
||||||
|
pdev->dev.power.power_state = PMSG_SUSPEND;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ohci_hcd_ep93xx_drv_resume(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
||||||
|
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
||||||
|
int status;
|
||||||
|
|
||||||
|
if (time_before(jiffies, ohci->next_statechange))
|
||||||
|
msleep(5);
|
||||||
|
ohci->next_statechange = jiffies;
|
||||||
|
|
||||||
|
ep93xx_start_hc(&pdev->dev);
|
||||||
|
pdev->dev.power.power_state = PMSG_ON;
|
||||||
|
usb_hcd_resume_root_hub(hcd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static struct platform_driver ohci_hcd_ep93xx_driver = {
|
||||||
|
.probe = ohci_hcd_ep93xx_drv_probe,
|
||||||
|
.remove = ohci_hcd_ep93xx_drv_remove,
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
.suspend = ohci_hcd_ep93xx_drv_suspend,
|
||||||
|
.resume = ohci_hcd_ep93xx_drv_resume,
|
||||||
|
#endif
|
||||||
|
.driver = {
|
||||||
|
.name = "ep93xx-ohci",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init ohci_hcd_ep93xx_init(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&ohci_hcd_ep93xx_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit ohci_hcd_ep93xx_cleanup(void)
|
||||||
|
{
|
||||||
|
platform_driver_unregister(&ohci_hcd_ep93xx_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(ohci_hcd_ep93xx_init);
|
||||||
|
module_exit(ohci_hcd_ep93xx_cleanup);
|
@ -901,6 +901,10 @@ MODULE_LICENSE ("GPL");
|
|||||||
#include "ohci-pxa27x.c"
|
#include "ohci-pxa27x.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_EP93XX
|
||||||
|
#include "ohci-ep93xx.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SOC_AU1X00
|
#ifdef CONFIG_SOC_AU1X00
|
||||||
#include "ohci-au1xxx.c"
|
#include "ohci-au1xxx.c"
|
||||||
#endif
|
#endif
|
||||||
@ -919,6 +923,7 @@ MODULE_LICENSE ("GPL");
|
|||||||
|| defined(CONFIG_ARCH_OMAP) \
|
|| defined(CONFIG_ARCH_OMAP) \
|
||||||
|| defined (CONFIG_ARCH_LH7A404) \
|
|| defined (CONFIG_ARCH_LH7A404) \
|
||||||
|| defined (CONFIG_PXA27x) \
|
|| defined (CONFIG_PXA27x) \
|
||||||
|
|| defined (CONFIG_ARCH_EP93XX) \
|
||||||
|| defined (CONFIG_SOC_AU1X00) \
|
|| defined (CONFIG_SOC_AU1X00) \
|
||||||
|| defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
|
|| defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
|
||||||
|| defined (CONFIG_ARCH_AT91RM9200) \
|
|| defined (CONFIG_ARCH_AT91RM9200) \
|
||||||
|
@ -581,14 +581,14 @@ static int ohci_hub_control (
|
|||||||
break;
|
break;
|
||||||
case GetHubStatus:
|
case GetHubStatus:
|
||||||
temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE);
|
temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE);
|
||||||
*(__le32 *) buf = cpu_to_le32 (temp);
|
put_unaligned(cpu_to_le32 (temp), (__le32 *) buf);
|
||||||
break;
|
break;
|
||||||
case GetPortStatus:
|
case GetPortStatus:
|
||||||
if (!wIndex || wIndex > ports)
|
if (!wIndex || wIndex > ports)
|
||||||
goto error;
|
goto error;
|
||||||
wIndex--;
|
wIndex--;
|
||||||
temp = roothub_portstatus (ohci, wIndex);
|
temp = roothub_portstatus (ohci, wIndex);
|
||||||
*(__le32 *) buf = cpu_to_le32 (temp);
|
put_unaligned(cpu_to_le32 (temp), (__le32 *) buf);
|
||||||
|
|
||||||
#ifndef OHCI_VERBOSE_DEBUG
|
#ifndef OHCI_VERBOSE_DEBUG
|
||||||
if (*(u16*)(buf+2)) /* only if wPortChange is interesting */
|
if (*(u16*)(buf+2)) /* only if wPortChange is interesting */
|
||||||
|
@ -167,8 +167,6 @@ static int __devinit mmio_resource_enabled(struct pci_dev *pdev, int idx)
|
|||||||
static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int wait_time;
|
|
||||||
u32 control;
|
|
||||||
|
|
||||||
if (!mmio_resource_enabled(pdev, 0))
|
if (!mmio_resource_enabled(pdev, 0))
|
||||||
return;
|
return;
|
||||||
@ -179,9 +177,10 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
|||||||
|
|
||||||
/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */
|
/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */
|
||||||
#ifndef __hppa__
|
#ifndef __hppa__
|
||||||
control = readl(base + OHCI_CONTROL);
|
{
|
||||||
|
u32 control = readl(base + OHCI_CONTROL);
|
||||||
if (control & OHCI_CTRL_IR) {
|
if (control & OHCI_CTRL_IR) {
|
||||||
wait_time = 500; /* arbitrary; 5 seconds */
|
int wait_time = 500; /* arbitrary; 5 seconds */
|
||||||
writel(OHCI_INTR_OC, base + OHCI_INTRENABLE);
|
writel(OHCI_INTR_OC, base + OHCI_INTRENABLE);
|
||||||
writel(OHCI_OCR, base + OHCI_CMDSTATUS);
|
writel(OHCI_OCR, base + OHCI_CMDSTATUS);
|
||||||
while (wait_time > 0 &&
|
while (wait_time > 0 &&
|
||||||
@ -198,6 +197,7 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
|||||||
/* reset controller, preserving RWC */
|
/* reset controller, preserving RWC */
|
||||||
writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL);
|
writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1507,6 +1507,9 @@ void hid_init_reports(struct hid_device *hid)
|
|||||||
#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
|
#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
|
||||||
#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866
|
#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_WISEGROUP_LTD 0x6677
|
||||||
|
#define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802
|
||||||
|
|
||||||
#define USB_VENDOR_ID_CODEMERCS 0x07c0
|
#define USB_VENDOR_ID_CODEMERCS 0x07c0
|
||||||
#define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500
|
#define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500
|
||||||
#define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501
|
#define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501
|
||||||
@ -1670,6 +1673,7 @@ static const struct hid_blacklist {
|
|||||||
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
||||||
|
{ USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
||||||
|
|
||||||
{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
|
{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
|
||||||
{ USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
|
{ USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
|
||||||
|
@ -88,19 +88,19 @@ config USB_LED
|
|||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called usbled.
|
module will be called usbled.
|
||||||
|
|
||||||
config USB_CY7C63
|
config USB_CYPRESS_CY7C63
|
||||||
tristate "Cypress CY7C63xxx USB driver support"
|
tristate "Cypress CY7C63xxx USB driver support"
|
||||||
depends on USB
|
depends on USB
|
||||||
help
|
help
|
||||||
Say Y here if you want to connect a Cypress CY7C63xxx
|
Say Y here if you want to connect a Cypress CY7C63xxx
|
||||||
micro controller to your computer's USB port. This driver
|
micro controller to your computer's USB port. Currently this
|
||||||
supports the pre-programmed devices (incl. firmware) by
|
driver supports the pre-programmed devices (incl. firmware)
|
||||||
AK Modul-Bus Computer GmbH.
|
by AK Modul-Bus Computer GmbH.
|
||||||
|
|
||||||
Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html
|
Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called cy7c63.
|
module will be called cypress_cy7c63.
|
||||||
|
|
||||||
config USB_CYTHERM
|
config USB_CYTHERM
|
||||||
tristate "Cypress USB thermometer driver support"
|
tristate "Cypress USB thermometer driver support"
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
obj-$(CONFIG_USB_AUERSWALD) += auerswald.o
|
obj-$(CONFIG_USB_AUERSWALD) += auerswald.o
|
||||||
obj-$(CONFIG_USB_CY7C63) += cy7c63.o
|
obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o
|
||||||
obj-$(CONFIG_USB_CYTHERM) += cytherm.o
|
obj-$(CONFIG_USB_CYTHERM) += cytherm.o
|
||||||
obj-$(CONFIG_USB_EMI26) += emi26.o
|
obj-$(CONFIG_USB_EMI26) += emi26.o
|
||||||
obj-$(CONFIG_USB_EMI62) += emi62.o
|
obj-$(CONFIG_USB_EMI62) += emi62.o
|
||||||
|
@ -1,244 +0,0 @@
|
|||||||
/*
|
|
||||||
* cy7c63.c
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 Oliver Bock (bock@fh-wolfenbuettel.de)
|
|
||||||
*
|
|
||||||
* This driver is based on the Cypress Thermometer USB Driver by
|
|
||||||
* Marcus Maul and the 2.0 version of Greg Kroah-Hartman's
|
|
||||||
* USB Skeleton driver.
|
|
||||||
*
|
|
||||||
* Is is a generic driver for the Cypress CY7C63000 family.
|
|
||||||
* For the time being it enables you to toggle the single I/O ports
|
|
||||||
* of the device.
|
|
||||||
*
|
|
||||||
* Supported vendors: AK Modul-Bus Computer GmbH
|
|
||||||
* Supported devices: CY7C63001A-PC (to be continued...)
|
|
||||||
* Supported functions: Read/Write Ports (to be continued...)
|
|
||||||
*
|
|
||||||
* Chipsets families: CY7C63000, CY7C63001, CY7C63100, CY7C63101
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation, version 2.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/usb.h>
|
|
||||||
|
|
||||||
#define DRIVER_AUTHOR "Oliver Bock (bock@fh-wolfenbuettel.de)"
|
|
||||||
#define DRIVER_DESC "Cypress CY7C63xxx USB driver"
|
|
||||||
|
|
||||||
#define CY7C63_VENDOR_ID 0xa2c
|
|
||||||
#define CY7C63_PRODUCT_ID 0x8
|
|
||||||
|
|
||||||
#define CY7C63_READ_PORT 0x4
|
|
||||||
#define CY7C63_WRITE_PORT 0x5
|
|
||||||
#define CY7C63_READ_RAM 0x2
|
|
||||||
#define CY7C63_WRITE_RAM 0x3
|
|
||||||
#define CY7C63_READ_ROM 0x1
|
|
||||||
|
|
||||||
#define CY7C63_READ_PORT_ID0 0
|
|
||||||
#define CY7C63_WRITE_PORT_ID0 0
|
|
||||||
#define CY7C63_READ_PORT_ID1 0x2
|
|
||||||
#define CY7C63_WRITE_PORT_ID1 1
|
|
||||||
|
|
||||||
#define CY7C63_MAX_REQSIZE 8
|
|
||||||
|
|
||||||
|
|
||||||
/* table of devices that work with this driver */
|
|
||||||
static struct usb_device_id cy7c63_table [] = {
|
|
||||||
{ USB_DEVICE(CY7C63_VENDOR_ID, CY7C63_PRODUCT_ID) },
|
|
||||||
{ }
|
|
||||||
};
|
|
||||||
MODULE_DEVICE_TABLE(usb, cy7c63_table);
|
|
||||||
|
|
||||||
/* structure to hold all of our device specific stuff */
|
|
||||||
struct cy7c63 {
|
|
||||||
struct usb_device * udev;
|
|
||||||
char port0;
|
|
||||||
char port1;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* used to send usb control messages to device */
|
|
||||||
int vendor_command(struct cy7c63 *dev, unsigned char request,
|
|
||||||
unsigned char address, unsigned char data) {
|
|
||||||
|
|
||||||
int retval = 0;
|
|
||||||
unsigned int pipe;
|
|
||||||
unsigned char *iobuf;
|
|
||||||
|
|
||||||
/* allocate some memory for the i/o buffer*/
|
|
||||||
iobuf = kzalloc(CY7C63_MAX_REQSIZE, GFP_KERNEL);
|
|
||||||
if (!iobuf) {
|
|
||||||
dev_err(&dev->udev->dev, "Out of memory!\n");
|
|
||||||
retval = -ENOMEM;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", data);
|
|
||||||
|
|
||||||
/* prepare usb control message and send it upstream */
|
|
||||||
pipe = usb_rcvctrlpipe(dev->udev, 0);
|
|
||||||
retval = usb_control_msg(dev->udev, pipe, request,
|
|
||||||
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
|
||||||
address, data, iobuf, CY7C63_MAX_REQSIZE,
|
|
||||||
USB_CTRL_GET_TIMEOUT);
|
|
||||||
|
|
||||||
/* store returned data (more READs to be added!) */
|
|
||||||
switch (request) {
|
|
||||||
case CY7C63_READ_PORT:
|
|
||||||
if (address == CY7C63_READ_PORT_ID0) {
|
|
||||||
dev->port0 = iobuf[1];
|
|
||||||
dev_dbg(&dev->udev->dev,
|
|
||||||
"READ_PORT0 returned: %d\n",dev->port0);
|
|
||||||
}
|
|
||||||
else if (address == CY7C63_READ_PORT_ID1) {
|
|
||||||
dev->port1 = iobuf[1];
|
|
||||||
dev_dbg(&dev->udev->dev,
|
|
||||||
"READ_PORT1 returned: %d\n",dev->port1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(iobuf);
|
|
||||||
error:
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define get_set_port(num,read_id,write_id) \
|
|
||||||
static ssize_t set_port##num(struct device *dev, struct device_attribute *attr, \
|
|
||||||
const char *buf, size_t count) { \
|
|
||||||
\
|
|
||||||
int value; \
|
|
||||||
int result = 0; \
|
|
||||||
\
|
|
||||||
struct usb_interface *intf = to_usb_interface(dev); \
|
|
||||||
struct cy7c63 *cyp = usb_get_intfdata(intf); \
|
|
||||||
\
|
|
||||||
dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", num); \
|
|
||||||
\
|
|
||||||
/* validate input data */ \
|
|
||||||
if (sscanf(buf, "%d", &value) < 1) { \
|
|
||||||
result = -EINVAL; \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
if (value>255 || value<0) { \
|
|
||||||
result = -EINVAL; \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
result = vendor_command(cyp, CY7C63_WRITE_PORT, write_id, \
|
|
||||||
(unsigned char)value); \
|
|
||||||
\
|
|
||||||
dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n",result); \
|
|
||||||
error: \
|
|
||||||
return result < 0 ? result : count; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static ssize_t get_port##num(struct device *dev, \
|
|
||||||
struct device_attribute *attr, char *buf) { \
|
|
||||||
\
|
|
||||||
int result = 0; \
|
|
||||||
\
|
|
||||||
struct usb_interface *intf = to_usb_interface(dev); \
|
|
||||||
struct cy7c63 *cyp = usb_get_intfdata(intf); \
|
|
||||||
\
|
|
||||||
dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", num); \
|
|
||||||
\
|
|
||||||
result = vendor_command(cyp, CY7C63_READ_PORT, read_id, 0); \
|
|
||||||
\
|
|
||||||
dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); \
|
|
||||||
\
|
|
||||||
return sprintf(buf, "%d", cyp->port##num); \
|
|
||||||
} \
|
|
||||||
static DEVICE_ATTR(port##num, S_IWUGO | S_IRUGO, get_port##num, set_port##num);
|
|
||||||
|
|
||||||
get_set_port(0, CY7C63_READ_PORT_ID0, CY7C63_WRITE_PORT_ID0);
|
|
||||||
get_set_port(1, CY7C63_READ_PORT_ID1, CY7C63_WRITE_PORT_ID1);
|
|
||||||
|
|
||||||
static int cy7c63_probe(struct usb_interface *interface,
|
|
||||||
const struct usb_device_id *id) {
|
|
||||||
|
|
||||||
struct cy7c63 *dev = NULL;
|
|
||||||
int retval = -ENOMEM;
|
|
||||||
|
|
||||||
/* allocate memory for our device state and initialize it */
|
|
||||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
|
||||||
if (dev == NULL) {
|
|
||||||
dev_err(&dev->udev->dev, "Out of memory!\n");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->udev = usb_get_dev(interface_to_usbdev(interface));
|
|
||||||
|
|
||||||
/* save our data pointer in this interface device */
|
|
||||||
usb_set_intfdata(interface, dev);
|
|
||||||
|
|
||||||
/* create device attribute files */
|
|
||||||
device_create_file(&interface->dev, &dev_attr_port0);
|
|
||||||
device_create_file(&interface->dev, &dev_attr_port1);
|
|
||||||
|
|
||||||
/* let the user know what node this device is now attached to */
|
|
||||||
dev_info(&interface->dev,
|
|
||||||
"Cypress CY7C63xxx device now attached\n");
|
|
||||||
|
|
||||||
retval = 0;
|
|
||||||
error:
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cy7c63_disconnect(struct usb_interface *interface) {
|
|
||||||
|
|
||||||
struct cy7c63 *dev;
|
|
||||||
|
|
||||||
dev = usb_get_intfdata(interface);
|
|
||||||
usb_set_intfdata(interface, NULL);
|
|
||||||
|
|
||||||
/* remove device attribute files */
|
|
||||||
device_remove_file(&interface->dev, &dev_attr_port0);
|
|
||||||
device_remove_file(&interface->dev, &dev_attr_port1);
|
|
||||||
|
|
||||||
usb_put_dev(dev->udev);
|
|
||||||
|
|
||||||
dev_info(&interface->dev,
|
|
||||||
"Cypress CY7C63xxx device now disconnected\n");
|
|
||||||
|
|
||||||
kfree(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct usb_driver cy7c63_driver = {
|
|
||||||
.name = "cy7c63",
|
|
||||||
.probe = cy7c63_probe,
|
|
||||||
.disconnect = cy7c63_disconnect,
|
|
||||||
.id_table = cy7c63_table,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init cy7c63_init(void) {
|
|
||||||
|
|
||||||
int result;
|
|
||||||
|
|
||||||
/* register this driver with the USB subsystem */
|
|
||||||
result = usb_register(&cy7c63_driver);
|
|
||||||
if (result) {
|
|
||||||
err("Function usb_register failed! Error number: %d\n", result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit cy7c63_exit(void) {
|
|
||||||
|
|
||||||
/* deregister this driver with the USB subsystem */
|
|
||||||
usb_deregister(&cy7c63_driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(cy7c63_init);
|
|
||||||
module_exit(cy7c63_exit);
|
|
||||||
|
|
||||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
|
||||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
|
279
drivers/usb/misc/cypress_cy7c63.c
Normal file
279
drivers/usb/misc/cypress_cy7c63.c
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
/*
|
||||||
|
* cypress_cy7c63.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 Oliver Bock (o.bock@fh-wolfenbuettel.de)
|
||||||
|
*
|
||||||
|
* This driver is based on the Cypress USB Driver by Marcus Maul
|
||||||
|
* (cyport) and the 2.0 version of Greg Kroah-Hartman's
|
||||||
|
* USB Skeleton driver.
|
||||||
|
*
|
||||||
|
* This is a generic driver for the Cypress CY7C63xxx family.
|
||||||
|
* For the time being it enables you to read from and write to
|
||||||
|
* the single I/O ports of the device.
|
||||||
|
*
|
||||||
|
* Supported vendors: AK Modul-Bus Computer GmbH
|
||||||
|
* Supported devices: CY7C63001A-PC (to be continued...)
|
||||||
|
* Supported functions: Read/Write Ports (to be continued...)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/usb.h>
|
||||||
|
|
||||||
|
#define DRIVER_AUTHOR "Oliver Bock (o.bock@fh-wolfenbuettel.de)"
|
||||||
|
#define DRIVER_DESC "Cypress CY7C63xxx USB driver"
|
||||||
|
|
||||||
|
#define CYPRESS_VENDOR_ID 0xa2c
|
||||||
|
#define CYPRESS_PRODUCT_ID 0x8
|
||||||
|
|
||||||
|
#define CYPRESS_READ_PORT 0x4
|
||||||
|
#define CYPRESS_WRITE_PORT 0x5
|
||||||
|
|
||||||
|
#define CYPRESS_READ_RAM 0x2
|
||||||
|
#define CYPRESS_WRITE_RAM 0x3
|
||||||
|
#define CYPRESS_READ_ROM 0x1
|
||||||
|
|
||||||
|
#define CYPRESS_READ_PORT_ID0 0
|
||||||
|
#define CYPRESS_WRITE_PORT_ID0 0
|
||||||
|
#define CYPRESS_READ_PORT_ID1 0x2
|
||||||
|
#define CYPRESS_WRITE_PORT_ID1 1
|
||||||
|
|
||||||
|
#define CYPRESS_MAX_REQSIZE 8
|
||||||
|
|
||||||
|
|
||||||
|
/* table of devices that work with this driver */
|
||||||
|
static struct usb_device_id cypress_table [] = {
|
||||||
|
{ USB_DEVICE(CYPRESS_VENDOR_ID, CYPRESS_PRODUCT_ID) },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(usb, cypress_table);
|
||||||
|
|
||||||
|
/* structure to hold all of our device specific stuff */
|
||||||
|
struct cypress {
|
||||||
|
struct usb_device * udev;
|
||||||
|
unsigned char port[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* used to send usb control messages to device */
|
||||||
|
static int vendor_command(struct cypress *dev, unsigned char request,
|
||||||
|
unsigned char address, unsigned char data)
|
||||||
|
{
|
||||||
|
int retval = 0;
|
||||||
|
unsigned int pipe;
|
||||||
|
unsigned char *iobuf;
|
||||||
|
|
||||||
|
/* allocate some memory for the i/o buffer*/
|
||||||
|
iobuf = kzalloc(CYPRESS_MAX_REQSIZE, GFP_KERNEL);
|
||||||
|
if (!iobuf) {
|
||||||
|
dev_err(&dev->udev->dev, "Out of memory!\n");
|
||||||
|
retval = -ENOMEM;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", data);
|
||||||
|
|
||||||
|
/* prepare usb control message and send it upstream */
|
||||||
|
pipe = usb_rcvctrlpipe(dev->udev, 0);
|
||||||
|
retval = usb_control_msg(dev->udev, pipe, request,
|
||||||
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
||||||
|
address, data, iobuf, CYPRESS_MAX_REQSIZE,
|
||||||
|
USB_CTRL_GET_TIMEOUT);
|
||||||
|
|
||||||
|
/* store returned data (more READs to be added) */
|
||||||
|
switch (request) {
|
||||||
|
case CYPRESS_READ_PORT:
|
||||||
|
if (address == CYPRESS_READ_PORT_ID0) {
|
||||||
|
dev->port[0] = iobuf[1];
|
||||||
|
dev_dbg(&dev->udev->dev,
|
||||||
|
"READ_PORT0 returned: %d\n",
|
||||||
|
dev->port[0]);
|
||||||
|
}
|
||||||
|
else if (address == CYPRESS_READ_PORT_ID1) {
|
||||||
|
dev->port[1] = iobuf[1];
|
||||||
|
dev_dbg(&dev->udev->dev,
|
||||||
|
"READ_PORT1 returned: %d\n",
|
||||||
|
dev->port[1]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
kfree(iobuf);
|
||||||
|
error:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write port value */
|
||||||
|
static ssize_t write_port(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count,
|
||||||
|
int port_num, int write_id)
|
||||||
|
{
|
||||||
|
int value = -1;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
struct usb_interface *intf = to_usb_interface(dev);
|
||||||
|
struct cypress *cyp = usb_get_intfdata(intf);
|
||||||
|
|
||||||
|
dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", port_num);
|
||||||
|
|
||||||
|
/* validate input data */
|
||||||
|
if (sscanf(buf, "%d", &value) < 1) {
|
||||||
|
result = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (value < 0 || value > 255) {
|
||||||
|
result = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = vendor_command(cyp, CYPRESS_WRITE_PORT, write_id,
|
||||||
|
(unsigned char)value);
|
||||||
|
|
||||||
|
dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result);
|
||||||
|
error:
|
||||||
|
return result < 0 ? result : count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attribute callback handler (write) */
|
||||||
|
static ssize_t set_port0_handler(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
return write_port(dev, attr, buf, count, 0, CYPRESS_WRITE_PORT_ID0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attribute callback handler (write) */
|
||||||
|
static ssize_t set_port1_handler(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
return write_port(dev, attr, buf, count, 1, CYPRESS_WRITE_PORT_ID1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read port value */
|
||||||
|
static ssize_t read_port(struct device *dev, struct device_attribute *attr,
|
||||||
|
char *buf, int port_num, int read_id)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
struct usb_interface *intf = to_usb_interface(dev);
|
||||||
|
struct cypress *cyp = usb_get_intfdata(intf);
|
||||||
|
|
||||||
|
dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", port_num);
|
||||||
|
|
||||||
|
result = vendor_command(cyp, CYPRESS_READ_PORT, read_id, 0);
|
||||||
|
|
||||||
|
dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result);
|
||||||
|
|
||||||
|
return sprintf(buf, "%d", cyp->port[port_num]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attribute callback handler (read) */
|
||||||
|
static ssize_t get_port0_handler(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
return read_port(dev, attr, buf, 0, CYPRESS_READ_PORT_ID0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attribute callback handler (read) */
|
||||||
|
static ssize_t get_port1_handler(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
return read_port(dev, attr, buf, 1, CYPRESS_READ_PORT_ID1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DEVICE_ATTR(port0, S_IWUGO | S_IRUGO,
|
||||||
|
get_port0_handler, set_port0_handler);
|
||||||
|
|
||||||
|
static DEVICE_ATTR(port1, S_IWUGO | S_IRUGO,
|
||||||
|
get_port1_handler, set_port1_handler);
|
||||||
|
|
||||||
|
|
||||||
|
static int cypress_probe(struct usb_interface *interface,
|
||||||
|
const struct usb_device_id *id)
|
||||||
|
{
|
||||||
|
struct cypress *dev = NULL;
|
||||||
|
int retval = -ENOMEM;
|
||||||
|
|
||||||
|
/* allocate memory for our device state and initialize it */
|
||||||
|
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||||
|
if (dev == NULL) {
|
||||||
|
dev_err(&dev->udev->dev, "Out of memory!\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->udev = usb_get_dev(interface_to_usbdev(interface));
|
||||||
|
|
||||||
|
/* save our data pointer in this interface device */
|
||||||
|
usb_set_intfdata(interface, dev);
|
||||||
|
|
||||||
|
/* create device attribute files */
|
||||||
|
device_create_file(&interface->dev, &dev_attr_port0);
|
||||||
|
device_create_file(&interface->dev, &dev_attr_port1);
|
||||||
|
|
||||||
|
/* let the user know that the device is now attached */
|
||||||
|
dev_info(&interface->dev,
|
||||||
|
"Cypress CY7C63xxx device now attached\n");
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
|
error:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cypress_disconnect(struct usb_interface *interface)
|
||||||
|
{
|
||||||
|
struct cypress *dev;
|
||||||
|
|
||||||
|
dev = usb_get_intfdata(interface);
|
||||||
|
usb_set_intfdata(interface, NULL);
|
||||||
|
|
||||||
|
/* remove device attribute files */
|
||||||
|
device_remove_file(&interface->dev, &dev_attr_port0);
|
||||||
|
device_remove_file(&interface->dev, &dev_attr_port1);
|
||||||
|
|
||||||
|
usb_put_dev(dev->udev);
|
||||||
|
|
||||||
|
dev_info(&interface->dev,
|
||||||
|
"Cypress CY7C63xxx device now disconnected\n");
|
||||||
|
|
||||||
|
kfree(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct usb_driver cypress_driver = {
|
||||||
|
.name = "cypress_cy7c63",
|
||||||
|
.probe = cypress_probe,
|
||||||
|
.disconnect = cypress_disconnect,
|
||||||
|
.id_table = cypress_table,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init cypress_init(void)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
/* register this driver with the USB subsystem */
|
||||||
|
result = usb_register(&cypress_driver);
|
||||||
|
if (result) {
|
||||||
|
err("Function usb_register failed! Error number: %d\n", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit cypress_exit(void)
|
||||||
|
{
|
||||||
|
/* deregister this driver with the USB subsystem */
|
||||||
|
usb_deregister(&cypress_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(cypress_init);
|
||||||
|
module_exit(cypress_exit);
|
||||||
|
|
||||||
|
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||||
|
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
@ -200,10 +200,8 @@ static ssize_t lcd_write(struct file *file, const char __user * user_buffer, siz
|
|||||||
|
|
||||||
/* create a urb, and a buffer for it, and copy the data to the urb */
|
/* create a urb, and a buffer for it, and copy the data to the urb */
|
||||||
urb = usb_alloc_urb(0, GFP_KERNEL);
|
urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||||
if (!urb) {
|
if (!urb)
|
||||||
retval = -ENOMEM;
|
return -ENOMEM;
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
|
buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
|
@ -64,7 +64,6 @@ struct mon_reader_text {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void mon_text_ctor(void *, kmem_cache_t *, unsigned long);
|
static void mon_text_ctor(void *, kmem_cache_t *, unsigned long);
|
||||||
static void mon_text_dtor(void *, kmem_cache_t *, unsigned long);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mon_text_submit
|
* mon_text_submit
|
||||||
@ -268,7 +267,7 @@ static int mon_text_open(struct inode *inode, struct file *file)
|
|||||||
(long)rp);
|
(long)rp);
|
||||||
rp->e_slab = kmem_cache_create(rp->slab_name,
|
rp->e_slab = kmem_cache_create(rp->slab_name,
|
||||||
sizeof(struct mon_event_text), sizeof(long), 0,
|
sizeof(struct mon_event_text), sizeof(long), 0,
|
||||||
mon_text_ctor, mon_text_dtor);
|
mon_text_ctor, NULL);
|
||||||
if (rp->e_slab == NULL) {
|
if (rp->e_slab == NULL) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto err_slab;
|
goto err_slab;
|
||||||
@ -459,7 +458,3 @@ static void mon_text_ctor(void *mem, kmem_cache_t *slab, unsigned long sflags)
|
|||||||
memset(mem, 0xe5, sizeof(struct mon_event_text));
|
memset(mem, 0xe5, sizeof(struct mon_event_text));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mon_text_dtor(void *mem, kmem_cache_t *slab, unsigned long sflags)
|
|
||||||
{
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
@ -128,11 +128,13 @@
|
|||||||
#define VENDOR_ID_MELCO 0x0411
|
#define VENDOR_ID_MELCO 0x0411
|
||||||
#define VENDOR_ID_MICRONET 0x3980
|
#define VENDOR_ID_MICRONET 0x3980
|
||||||
#define VENDOR_ID_LONGSHINE 0x07b8
|
#define VENDOR_ID_LONGSHINE 0x07b8
|
||||||
|
#define VENDOR_ID_ZYXEL 0x0586
|
||||||
|
|
||||||
#define PRODUCT_ID_RTL8150 0x8150
|
#define PRODUCT_ID_RTL8150 0x8150
|
||||||
#define PRODUCT_ID_LUAKTX 0x0012
|
#define PRODUCT_ID_LUAKTX 0x0012
|
||||||
#define PRODUCT_ID_LCS8138TX 0x401a
|
#define PRODUCT_ID_LCS8138TX 0x401a
|
||||||
#define PRODUCT_ID_SP128AR 0x0003
|
#define PRODUCT_ID_SP128AR 0x0003
|
||||||
|
#define PRODUCT_ID_PRESTIGE 0x401a
|
||||||
|
|
||||||
#undef EEPROM_WRITE
|
#undef EEPROM_WRITE
|
||||||
|
|
||||||
@ -142,6 +144,7 @@ static struct usb_device_id rtl8150_table[] = {
|
|||||||
{USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)},
|
{USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)},
|
||||||
{USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)},
|
{USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)},
|
||||||
{USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)},
|
{USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)},
|
||||||
|
{USB_DEVICE(VENDOR_ID_ZYXEL, PRODUCT_ID_PRESTIGE)},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -456,6 +456,17 @@ config USB_SERIAL_SAFE_PADDED
|
|||||||
bool "USB Secure Encapsulated Driver - Padded"
|
bool "USB Secure Encapsulated Driver - Padded"
|
||||||
depends on USB_SERIAL_SAFE
|
depends on USB_SERIAL_SAFE
|
||||||
|
|
||||||
|
config USB_SERIAL_SIERRAWIRELESS
|
||||||
|
tristate "USB Sierra Wireless Driver"
|
||||||
|
depends on USB_SERIAL
|
||||||
|
help
|
||||||
|
Say M here if you want to use a Sierra Wireless device (if
|
||||||
|
using an PC 5220 or AC580 please use the Airprime driver
|
||||||
|
instead).
|
||||||
|
|
||||||
|
To compile this driver as a module, choose M here: the
|
||||||
|
module will be called sierra.
|
||||||
|
|
||||||
config USB_SERIAL_TI
|
config USB_SERIAL_TI
|
||||||
tristate "USB TI 3410/5052 Serial Driver"
|
tristate "USB TI 3410/5052 Serial Driver"
|
||||||
depends on USB_SERIAL
|
depends on USB_SERIAL
|
||||||
|
@ -39,6 +39,7 @@ obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o
|
|||||||
obj-$(CONFIG_USB_SERIAL_OPTION) += option.o
|
obj-$(CONFIG_USB_SERIAL_OPTION) += option.o
|
||||||
obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o
|
obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o
|
||||||
obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o
|
obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o
|
||||||
|
obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o
|
||||||
obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o
|
obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o
|
||||||
obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o
|
obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o
|
||||||
obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o
|
obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static struct usb_device_id id_table [] = {
|
static struct usb_device_id id_table [] = {
|
||||||
{ USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */
|
{ USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static struct usb_device_id id_table [] = {
|
static struct usb_device_id id_table [] = {
|
||||||
{ USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */
|
{ USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */
|
||||||
@ -71,7 +71,7 @@ static int anydata_open(struct usb_serial_port *port, struct file *filp)
|
|||||||
port->bulk_in_endpointAddress),
|
port->bulk_in_endpointAddress),
|
||||||
port->read_urb->transfer_buffer,
|
port->read_urb->transfer_buffer,
|
||||||
port->read_urb->transfer_buffer_length,
|
port->read_urb->transfer_buffer_length,
|
||||||
usb_serial_generic_write_bulk_callback, port);
|
usb_serial_generic_read_bulk_callback, port);
|
||||||
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
|
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
|
||||||
if (result)
|
if (result)
|
||||||
dev_err(&port->dev,
|
dev_err(&port->dev,
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
@ -74,7 +74,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "belkin_sa.h"
|
#include "belkin_sa.h"
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static int usb_serial_device_match (struct device *dev, struct device_driver *drv)
|
static int usb_serial_device_match (struct device *dev, struct device_driver *drv)
|
||||||
{
|
{
|
||||||
|
@ -17,11 +17,10 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
|
||||||
#include "usb-serial.h"
|
|
||||||
|
|
||||||
struct usbcons_info {
|
struct usbcons_info {
|
||||||
int magic;
|
int magic;
|
||||||
int break_flag;
|
int break_flag;
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version Information
|
* Version Information
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
#define CYBERJACK_LOCAL_BUF_SIZE 32
|
#define CYBERJACK_LOCAL_BUF_SIZE 32
|
||||||
|
|
||||||
|
@ -59,11 +59,11 @@
|
|||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
#include <linux/serial.h>
|
#include <linux/serial.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
#include "usb-serial.h"
|
|
||||||
#include "cypress_m8.h"
|
#include "cypress_m8.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@
|
|||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
/* Defines */
|
/* Defines */
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
/* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */
|
/* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */
|
||||||
#define CPUCS_REG 0x7F92
|
#define CPUCS_REG 0x7F92
|
||||||
|
@ -257,7 +257,7 @@
|
|||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include <linux/serial.h>
|
#include <linux/serial.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "ftdi_sio.h"
|
#include "ftdi_sio.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -313,6 +313,7 @@ static struct usb_device_id id_table_combined [] = {
|
|||||||
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
|
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
|
||||||
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
|
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
|
||||||
{ USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
|
{ USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
|
||||||
|
{ USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
|
||||||
{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
|
{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
|
||||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
||||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
||||||
@ -500,6 +501,8 @@ static struct usb_device_id id_table_combined [] = {
|
|||||||
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
|
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
|
||||||
{ USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
|
{ USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
|
||||||
{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
|
{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
|
||||||
|
{ USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
|
||||||
|
{ USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
|
||||||
{ }, /* Optional parameter entry */
|
{ }, /* Optional parameter entry */
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
@ -548,11 +551,17 @@ struct ftdi_private {
|
|||||||
spinlock_t rx_lock; /* spinlock for receive state */
|
spinlock_t rx_lock; /* spinlock for receive state */
|
||||||
struct work_struct rx_work;
|
struct work_struct rx_work;
|
||||||
int rx_processed;
|
int rx_processed;
|
||||||
|
unsigned long rx_bytes;
|
||||||
|
|
||||||
__u16 interface; /* FT2232C port interface (0 for FT232/245) */
|
__u16 interface; /* FT2232C port interface (0 for FT232/245) */
|
||||||
|
|
||||||
int force_baud; /* if non-zero, force the baud rate to this value */
|
int force_baud; /* if non-zero, force the baud rate to this value */
|
||||||
int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */
|
int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */
|
||||||
|
|
||||||
|
spinlock_t tx_lock; /* spinlock for transmit state */
|
||||||
|
unsigned long tx_bytes;
|
||||||
|
unsigned long tx_outstanding_bytes;
|
||||||
|
unsigned long tx_outstanding_urbs;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Used for TIOCMIWAIT */
|
/* Used for TIOCMIWAIT */
|
||||||
@ -626,6 +635,9 @@ static struct usb_serial_driver ftdi_sio_device = {
|
|||||||
#define HIGH 1
|
#define HIGH 1
|
||||||
#define LOW 0
|
#define LOW 0
|
||||||
|
|
||||||
|
/* number of outstanding urbs to prevent userspace DoS from happening */
|
||||||
|
#define URB_UPPER_LIMIT 42
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ***************************************************************************
|
* ***************************************************************************
|
||||||
* Utlity functions
|
* Utlity functions
|
||||||
@ -1156,6 +1168,7 @@ static int ftdi_sio_attach (struct usb_serial *serial)
|
|||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_init(&priv->rx_lock);
|
spin_lock_init(&priv->rx_lock);
|
||||||
|
spin_lock_init(&priv->tx_lock);
|
||||||
init_waitqueue_head(&priv->delta_msr_wait);
|
init_waitqueue_head(&priv->delta_msr_wait);
|
||||||
/* This will push the characters through immediately rather
|
/* This will push the characters through immediately rather
|
||||||
than queue a task to deliver them */
|
than queue a task to deliver them */
|
||||||
@ -1270,6 +1283,13 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
|
|||||||
|
|
||||||
dbg("%s", __FUNCTION__);
|
dbg("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||||
|
priv->tx_bytes = 0;
|
||||||
|
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||||
|
spin_lock_irqsave(&priv->rx_lock, flags);
|
||||||
|
priv->rx_bytes = 0;
|
||||||
|
spin_unlock_irqrestore(&priv->rx_lock, flags);
|
||||||
|
|
||||||
if (port->tty)
|
if (port->tty)
|
||||||
port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
|
port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
|
||||||
|
|
||||||
@ -1372,6 +1392,7 @@ static int ftdi_write (struct usb_serial_port *port,
|
|||||||
int data_offset ; /* will be 1 for the SIO and 0 otherwise */
|
int data_offset ; /* will be 1 for the SIO and 0 otherwise */
|
||||||
int status;
|
int status;
|
||||||
int transfer_size;
|
int transfer_size;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count);
|
dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count);
|
||||||
|
|
||||||
@ -1379,6 +1400,13 @@ static int ftdi_write (struct usb_serial_port *port,
|
|||||||
dbg("write request of 0 bytes");
|
dbg("write request of 0 bytes");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||||
|
if (priv->tx_outstanding_urbs > URB_UPPER_LIMIT) {
|
||||||
|
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||||
|
dbg("%s - write limit hit\n", __FUNCTION__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||||
|
|
||||||
data_offset = priv->write_offset;
|
data_offset = priv->write_offset;
|
||||||
dbg("data_offset set to %d",data_offset);
|
dbg("data_offset set to %d",data_offset);
|
||||||
@ -1445,6 +1473,12 @@ static int ftdi_write (struct usb_serial_port *port,
|
|||||||
err("%s - failed submitting write urb, error %d", __FUNCTION__, status);
|
err("%s - failed submitting write urb, error %d", __FUNCTION__, status);
|
||||||
count = status;
|
count = status;
|
||||||
kfree (buffer);
|
kfree (buffer);
|
||||||
|
} else {
|
||||||
|
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||||
|
++priv->tx_outstanding_urbs;
|
||||||
|
priv->tx_outstanding_bytes += count;
|
||||||
|
priv->tx_bytes += count;
|
||||||
|
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we are done with this urb, so let the host driver
|
/* we are done with this urb, so let the host driver
|
||||||
@ -1460,7 +1494,11 @@ static int ftdi_write (struct usb_serial_port *port,
|
|||||||
|
|
||||||
static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
|
static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
unsigned long flags;
|
||||||
struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
|
struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
|
||||||
|
struct ftdi_private *priv;
|
||||||
|
int data_offset; /* will be 1 for the SIO and 0 otherwise */
|
||||||
|
unsigned long countback;
|
||||||
|
|
||||||
/* free up the transfer buffer, as usb_free_urb() does not do this */
|
/* free up the transfer buffer, as usb_free_urb() does not do this */
|
||||||
kfree (urb->transfer_buffer);
|
kfree (urb->transfer_buffer);
|
||||||
@ -1472,34 +1510,67 @@ static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
priv = usb_get_serial_port_data(port);
|
||||||
|
if (!priv) {
|
||||||
|
dbg("%s - bad port private data pointer - exiting", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* account for transferred data */
|
||||||
|
countback = urb->actual_length;
|
||||||
|
data_offset = priv->write_offset;
|
||||||
|
if (data_offset > 0) {
|
||||||
|
/* Subtract the control bytes */
|
||||||
|
countback -= (data_offset * ((countback + (PKTSZ - 1)) / PKTSZ));
|
||||||
|
}
|
||||||
|
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||||
|
--priv->tx_outstanding_urbs;
|
||||||
|
priv->tx_outstanding_bytes -= countback;
|
||||||
|
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||||
|
|
||||||
usb_serial_port_softint(port);
|
usb_serial_port_softint(port);
|
||||||
} /* ftdi_write_bulk_callback */
|
} /* ftdi_write_bulk_callback */
|
||||||
|
|
||||||
|
|
||||||
static int ftdi_write_room( struct usb_serial_port *port )
|
static int ftdi_write_room( struct usb_serial_port *port )
|
||||||
{
|
{
|
||||||
|
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||||
|
int room;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
dbg("%s - port %d", __FUNCTION__, port->number);
|
dbg("%s - port %d", __FUNCTION__, port->number);
|
||||||
|
|
||||||
/*
|
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||||
* We really can take anything the user throws at us
|
if (priv->tx_outstanding_urbs < URB_UPPER_LIMIT) {
|
||||||
* but let's pick a nice big number to tell the tty
|
/*
|
||||||
* layer that we have lots of free space
|
* We really can take anything the user throws at us
|
||||||
*/
|
* but let's pick a nice big number to tell the tty
|
||||||
return 2048;
|
* layer that we have lots of free space
|
||||||
|
*/
|
||||||
|
room = 2048;
|
||||||
|
} else {
|
||||||
|
room = 0;
|
||||||
|
}
|
||||||
|
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||||
|
return room;
|
||||||
} /* ftdi_write_room */
|
} /* ftdi_write_room */
|
||||||
|
|
||||||
|
|
||||||
static int ftdi_chars_in_buffer (struct usb_serial_port *port)
|
static int ftdi_chars_in_buffer (struct usb_serial_port *port)
|
||||||
{ /* ftdi_chars_in_buffer */
|
{ /* ftdi_chars_in_buffer */
|
||||||
|
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||||
|
int buffered;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
dbg("%s - port %d", __FUNCTION__, port->number);
|
dbg("%s - port %d", __FUNCTION__, port->number);
|
||||||
|
|
||||||
/*
|
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||||
* We can't really account for how much data we
|
buffered = (int)priv->tx_outstanding_bytes;
|
||||||
* have sent out, but hasn't made it through to the
|
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||||
* device, so just tell the tty layer that everything
|
if (buffered < 0) {
|
||||||
* is flushed.
|
err("%s outstanding tx bytes is negative!", __FUNCTION__);
|
||||||
*/
|
buffered = 0;
|
||||||
return 0;
|
}
|
||||||
|
return buffered;
|
||||||
} /* ftdi_chars_in_buffer */
|
} /* ftdi_chars_in_buffer */
|
||||||
|
|
||||||
|
|
||||||
@ -1509,6 +1580,8 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
|
|||||||
struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
|
struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
|
||||||
struct tty_struct *tty;
|
struct tty_struct *tty;
|
||||||
struct ftdi_private *priv;
|
struct ftdi_private *priv;
|
||||||
|
unsigned long countread;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (urb->number_of_packets > 0) {
|
if (urb->number_of_packets > 0) {
|
||||||
err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__,
|
err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__,
|
||||||
@ -1543,6 +1616,13 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* count data bytes, but not status bytes */
|
||||||
|
countread = urb->actual_length;
|
||||||
|
countread -= 2 * ((countread + (PKTSZ - 1)) / PKTSZ);
|
||||||
|
spin_lock_irqsave(&priv->rx_lock, flags);
|
||||||
|
priv->rx_bytes += countread;
|
||||||
|
spin_unlock_irqrestore(&priv->rx_lock, flags);
|
||||||
|
|
||||||
ftdi_process_read(port);
|
ftdi_process_read(port);
|
||||||
|
|
||||||
} /* ftdi_read_bulk_callback */
|
} /* ftdi_read_bulk_callback */
|
||||||
|
@ -36,6 +36,9 @@
|
|||||||
#define FTDI_ACTZWAVE_PID 0xF2D0
|
#define FTDI_ACTZWAVE_PID 0xF2D0
|
||||||
|
|
||||||
|
|
||||||
|
/* www.starting-point-systems.com µChameleon device */
|
||||||
|
#define FTDI_MICRO_CHAMELEON_PID 0xCAA0 /* Product Id */
|
||||||
|
|
||||||
/* www.irtrans.de device */
|
/* www.irtrans.de device */
|
||||||
#define FTDI_IRTRANS_PID 0xFC60 /* Product Id */
|
#define FTDI_IRTRANS_PID 0xFC60 /* Product Id */
|
||||||
|
|
||||||
@ -442,6 +445,18 @@
|
|||||||
*/
|
*/
|
||||||
#define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */
|
#define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ThorLabs USB motor drivers
|
||||||
|
*/
|
||||||
|
#define FTDI_THORLABS_PID 0xfaf0 /* ThorLabs USB motor drivers */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Testo products (http://www.testo.com/)
|
||||||
|
* Submitted by Colin Leroy
|
||||||
|
*/
|
||||||
|
#define TESTO_VID 0x128D
|
||||||
|
#define TESTO_USB_INTERFACE_PID 0x0001
|
||||||
|
|
||||||
/* Commands */
|
/* Commands */
|
||||||
#define FTDI_SIO_RESET 0 /* Reset the port */
|
#define FTDI_SIO_RESET 0 /* Reset the port */
|
||||||
#define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
|
#define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static struct usb_device_id id_table [] = {
|
static struct usb_device_id id_table [] = {
|
||||||
{ USB_DEVICE(0x1404, 0xcddc) },
|
{ USB_DEVICE(0x1404, 0xcddc) },
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
/* the mode to be set when the port ist opened */
|
/* the mode to be set when the port ist opened */
|
||||||
static int initial_mode = 1;
|
static int initial_mode = 1;
|
||||||
@ -42,8 +43,6 @@ static int initial_mode = 1;
|
|||||||
/* debug flag */
|
/* debug flag */
|
||||||
static int debug = 0;
|
static int debug = 0;
|
||||||
|
|
||||||
#include "usb-serial.h"
|
|
||||||
|
|
||||||
#define GARMIN_VENDOR_ID 0x091E
|
#define GARMIN_VENDOR_ID 0x091E
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include "usb-serial.h"
|
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
|
||||||
@ -285,6 +285,7 @@ void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *reg
|
|||||||
if (result)
|
if (result)
|
||||||
dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
|
dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
|
||||||
|
|
||||||
void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
|
void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version Information
|
* Version Information
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "io_edgeport.h"
|
#include "io_edgeport.h"
|
||||||
#include "io_ionsp.h" /* info for the iosp messages */
|
#include "io_ionsp.h" /* info for the iosp messages */
|
||||||
#include "io_16654.h" /* 16654 UART defines */
|
#include "io_16654.h" /* 16654 UART defines */
|
||||||
|
@ -39,8 +39,8 @@
|
|||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/semaphore.h>
|
#include <asm/semaphore.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
#include "usb-serial.h"
|
|
||||||
#include "io_16654.h"
|
#include "io_16654.h"
|
||||||
#include "io_usbvend.h"
|
#include "io_usbvend.h"
|
||||||
#include "io_ti.h"
|
#include "io_ti.h"
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "ipaq.h"
|
#include "ipaq.h"
|
||||||
|
|
||||||
#define KP_RETRIES 100
|
#define KP_RETRIES 100
|
||||||
@ -70,6 +70,8 @@
|
|||||||
|
|
||||||
static __u16 product, vendor;
|
static __u16 product, vendor;
|
||||||
static int debug;
|
static int debug;
|
||||||
|
static int connect_retries = KP_RETRIES;
|
||||||
|
static int initial_wait;
|
||||||
|
|
||||||
/* Function prototypes for an ipaq */
|
/* Function prototypes for an ipaq */
|
||||||
static int ipaq_open (struct usb_serial_port *port, struct file *filp);
|
static int ipaq_open (struct usb_serial_port *port, struct file *filp);
|
||||||
@ -582,7 +584,7 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
|
|||||||
struct ipaq_private *priv;
|
struct ipaq_private *priv;
|
||||||
struct ipaq_packet *pkt;
|
struct ipaq_packet *pkt;
|
||||||
int i, result = 0;
|
int i, result = 0;
|
||||||
int retries = KP_RETRIES;
|
int retries = connect_retries;
|
||||||
|
|
||||||
dbg("%s - port %d", __FUNCTION__, port->number);
|
dbg("%s - port %d", __FUNCTION__, port->number);
|
||||||
|
|
||||||
@ -646,16 +648,12 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
|
|||||||
port->read_urb->transfer_buffer_length = URBDATA_SIZE;
|
port->read_urb->transfer_buffer_length = URBDATA_SIZE;
|
||||||
port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE;
|
port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE;
|
||||||
|
|
||||||
|
msleep(1000*initial_wait);
|
||||||
/* Start reading from the device */
|
/* Start reading from the device */
|
||||||
usb_fill_bulk_urb(port->read_urb, serial->dev,
|
usb_fill_bulk_urb(port->read_urb, serial->dev,
|
||||||
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
|
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
|
||||||
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
|
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
|
||||||
ipaq_read_bulk_callback, port);
|
ipaq_read_bulk_callback, port);
|
||||||
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
|
|
||||||
if (result) {
|
|
||||||
err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send out control message observed in win98 sniffs. Not sure what
|
* Send out control message observed in win98 sniffs. Not sure what
|
||||||
@ -670,8 +668,14 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
|
|||||||
usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
|
usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
|
||||||
0x1, 0, NULL, 0, 100);
|
0x1, 0, NULL, 0, 100);
|
||||||
if (result == 0) {
|
if (result == 0) {
|
||||||
|
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
|
||||||
|
if (result) {
|
||||||
|
err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
msleep(1000);
|
||||||
}
|
}
|
||||||
err("%s - failed doing control urb, error %d", __FUNCTION__, result);
|
err("%s - failed doing control urb, error %d", __FUNCTION__, result);
|
||||||
goto error;
|
goto error;
|
||||||
@ -854,6 +858,7 @@ static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
|
|||||||
|
|
||||||
if (urb->status) {
|
if (urb->status) {
|
||||||
dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
|
dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&write_list_lock, flags);
|
spin_lock_irqsave(&write_list_lock, flags);
|
||||||
@ -966,3 +971,9 @@ MODULE_PARM_DESC(vendor, "User specified USB idVendor");
|
|||||||
|
|
||||||
module_param(product, ushort, 0);
|
module_param(product, ushort, 0);
|
||||||
MODULE_PARM_DESC(product, "User specified USB idProduct");
|
MODULE_PARM_DESC(product, "User specified USB idProduct");
|
||||||
|
|
||||||
|
module_param(connect_retries, int, S_IRUGO|S_IWUSR);
|
||||||
|
MODULE_PARM_DESC(connect_retries, "Maximum number of connect retries (one second each)");
|
||||||
|
|
||||||
|
module_param(initial_wait, int, S_IRUGO|S_IWUSR);
|
||||||
|
MODULE_PARM_DESC(initial_wait, "Time to wait before attempting a connection (in seconds)");
|
||||||
|
@ -46,8 +46,8 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include "usb-serial.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version Information
|
* Version Information
|
||||||
@ -373,6 +373,8 @@ static void ipw_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
|
|||||||
|
|
||||||
dbg("%s", __FUNCTION__);
|
dbg("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
port->write_urb_busy = 0;
|
||||||
|
|
||||||
if (urb->status)
|
if (urb->status)
|
||||||
dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
|
dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version Information
|
* Version Information
|
||||||
|
@ -107,7 +107,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "keyspan.h"
|
#include "keyspan.h"
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
@ -78,6 +78,7 @@
|
|||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
|
||||||
@ -107,8 +108,6 @@ struct ezusb_hex_record {
|
|||||||
#include "xircom_pgs_fw.h"
|
#include "xircom_pgs_fw.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "usb-serial.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version Information
|
* Version Information
|
||||||
*/
|
*/
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "kl5kusb105.h"
|
#include "kl5kusb105.h"
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
@ -46,8 +46,8 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
#include "usb-serial.h"
|
|
||||||
#include "kobil_sct.h"
|
#include "kobil_sct.h"
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
@ -75,7 +75,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "mct_u232.h"
|
#include "mct_u232.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#include <linux/tty_flip.h>
|
#include <linux/tty_flip.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
2006-06-01 v0.6.2 add backwards-compatibility stuff
|
2006-06-01 v0.6.2 add backwards-compatibility stuff
|
||||||
2006-06-01 v0.6.3 add Novatel Wireless
|
2006-06-01 v0.6.3 add Novatel Wireless
|
||||||
2006-06-01 v0.7 Option => GSM
|
2006-06-01 v0.7 Option => GSM
|
||||||
|
2006-06-01 v0.7.1 add COBRA2
|
||||||
|
|
||||||
Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
|
Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
|
||||||
|
|
||||||
@ -53,7 +54,7 @@
|
|||||||
device features.
|
device features.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DRIVER_VERSION "v0.7.0"
|
#define DRIVER_VERSION "v0.7.1"
|
||||||
#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
|
#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
|
||||||
#define DRIVER_DESC "USB Driver for GSM modems"
|
#define DRIVER_DESC "USB Driver for GSM modems"
|
||||||
|
|
||||||
@ -64,7 +65,7 @@
|
|||||||
#include <linux/tty_flip.h>
|
#include <linux/tty_flip.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
static int option_open(struct usb_serial_port *port, struct file *filp);
|
static int option_open(struct usb_serial_port *port, struct file *filp);
|
||||||
@ -102,6 +103,7 @@ static int option_send_setup(struct usb_serial_port *port);
|
|||||||
#define OPTION_PRODUCT_FUSION 0x6000
|
#define OPTION_PRODUCT_FUSION 0x6000
|
||||||
#define OPTION_PRODUCT_FUSION2 0x6300
|
#define OPTION_PRODUCT_FUSION2 0x6300
|
||||||
#define OPTION_PRODUCT_COBRA 0x6500
|
#define OPTION_PRODUCT_COBRA 0x6500
|
||||||
|
#define OPTION_PRODUCT_COBRA2 0x6600
|
||||||
#define HUAWEI_PRODUCT_E600 0x1001
|
#define HUAWEI_PRODUCT_E600 0x1001
|
||||||
#define AUDIOVOX_PRODUCT_AIRCARD 0x0112
|
#define AUDIOVOX_PRODUCT_AIRCARD 0x0112
|
||||||
#define SIERRAWIRELESS_PRODUCT_MC8755 0x6802
|
#define SIERRAWIRELESS_PRODUCT_MC8755 0x6802
|
||||||
@ -112,6 +114,7 @@ static struct usb_device_id option_ids[] = {
|
|||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
||||||
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
|
||||||
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
||||||
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
||||||
{ USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
|
{ USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
|
||||||
@ -124,6 +127,7 @@ static struct usb_device_id option_ids1[] = {
|
|||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
||||||
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
|
||||||
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
||||||
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
||||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
|
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "pl2303.h"
|
#include "pl2303.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -52,6 +52,7 @@ struct pl2303_buf {
|
|||||||
static struct usb_device_id id_table [] = {
|
static struct usb_device_id id_table [] = {
|
||||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
|
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
|
||||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
|
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
|
||||||
|
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
|
||||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
|
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
|
||||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
|
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
|
||||||
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
|
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
|
||||||
@ -79,6 +80,7 @@ static struct usb_device_id id_table [] = {
|
|||||||
{ USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
|
{ USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
|
||||||
{ USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
|
{ USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
|
||||||
{ USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) },
|
{ USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) },
|
||||||
|
{ USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#define PL2303_VENDOR_ID 0x067b
|
#define PL2303_VENDOR_ID 0x067b
|
||||||
#define PL2303_PRODUCT_ID 0x2303
|
#define PL2303_PRODUCT_ID 0x2303
|
||||||
#define PL2303_PRODUCT_ID_RSAQ2 0x04bb
|
#define PL2303_PRODUCT_ID_RSAQ2 0x04bb
|
||||||
|
#define PL2303_PRODUCT_ID_DCU11 0x1234
|
||||||
#define PL2303_PRODUCT_ID_PHAROS 0xaaa0
|
#define PL2303_PRODUCT_ID_PHAROS 0xaaa0
|
||||||
#define PL2303_PRODUCT_ID_RSAQ3 0xaaa2
|
#define PL2303_PRODUCT_ID_RSAQ3 0xaaa2
|
||||||
|
|
||||||
@ -84,3 +85,7 @@
|
|||||||
/* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */
|
/* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */
|
||||||
#define OTI_VENDOR_ID 0x0ea0
|
#define OTI_VENDOR_ID 0x0ea0
|
||||||
#define OTI_PRODUCT_ID 0x6858
|
#define OTI_PRODUCT_ID 0x6858
|
||||||
|
|
||||||
|
/* DATAPILOT Universal-2 Phone Cable */
|
||||||
|
#define DATAPILOT_U2_VENDOR_ID 0x0731
|
||||||
|
#define DATAPILOT_U2_PRODUCT_ID 0x2003
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONFIG_USB_SAFE_PADDED
|
#ifndef CONFIG_USB_SAFE_PADDED
|
||||||
|
75
drivers/usb/serial/sierra.c
Normal file
75
drivers/usb/serial/sierra.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Sierra Wireless CDMA Wireless Serial USB driver
|
||||||
|
*
|
||||||
|
* Current Copy modified by: Kevin Lloyd <linux@sierrawireless.com>
|
||||||
|
* Original Copyright (C) 2005-2006 Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
|
||||||
|
{ USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
|
||||||
|
{ USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
|
||||||
|
{ USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
|
||||||
|
{ USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
|
||||||
|
{ USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
|
||||||
|
{ USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 */
|
||||||
|
{ USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
|
||||||
|
/* Following devices are supported in the airprime.c driver */
|
||||||
|
/* { USB_DEVICE(0x1199, 0x0112) }, */ /* Sierra Wireless AirCard 580 */
|
||||||
|
/* { USB_DEVICE(0x0F3D, 0x0112) }, */ /* AirPrime/Sierra PC 5220 */
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(usb, id_table);
|
||||||
|
|
||||||
|
static struct usb_driver sierra_driver = {
|
||||||
|
.name = "sierra_wireless",
|
||||||
|
.probe = usb_serial_probe,
|
||||||
|
.disconnect = usb_serial_disconnect,
|
||||||
|
.id_table = id_table,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct usb_serial_driver sierra_device = {
|
||||||
|
.driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.name = "Sierra_Wireless",
|
||||||
|
},
|
||||||
|
.id_table = id_table,
|
||||||
|
.num_interrupt_in = NUM_DONT_CARE,
|
||||||
|
.num_bulk_in = NUM_DONT_CARE,
|
||||||
|
.num_bulk_out = NUM_DONT_CARE,
|
||||||
|
.num_ports = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init sierra_init(void)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
retval = usb_serial_register(&sierra_device);
|
||||||
|
if (retval)
|
||||||
|
return retval;
|
||||||
|
retval = usb_register(&sierra_driver);
|
||||||
|
if (retval)
|
||||||
|
usb_serial_deregister(&sierra_device);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit sierra_exit(void)
|
||||||
|
{
|
||||||
|
usb_deregister(&sierra_driver);
|
||||||
|
usb_serial_deregister(&sierra_device);
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(sierra_init);
|
||||||
|
module_exit(sierra_exit);
|
||||||
|
MODULE_LICENSE("GPL");
|
@ -83,8 +83,8 @@
|
|||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/semaphore.h>
|
#include <asm/semaphore.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/usb/serial.h>
|
||||||
|
|
||||||
#include "usb-serial.h"
|
|
||||||
#include "ti_usb_3410_5052.h"
|
#include "ti_usb_3410_5052.h"
|
||||||
#include "ti_fw_3410.h" /* firmware image for 3410 */
|
#include "ti_fw_3410.h" /* firmware image for 3410 */
|
||||||
#include "ti_fw_5052.h" /* firmware image for 5052 */
|
#include "ti_fw_5052.h" /* firmware image for 5052 */
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "pl2303.h"
|
#include "pl2303.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -40,6 +40,8 @@
|
|||||||
#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/"
|
#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/"
|
||||||
#define DRIVER_DESC "USB Serial Driver core"
|
#define DRIVER_DESC "USB Serial Driver core"
|
||||||
|
|
||||||
|
static void port_free(struct usb_serial_port *port);
|
||||||
|
|
||||||
/* Driver structure we register with the USB core */
|
/* Driver structure we register with the USB core */
|
||||||
static struct usb_driver usb_serial_driver = {
|
static struct usb_driver usb_serial_driver = {
|
||||||
.name = "usbserial",
|
.name = "usbserial",
|
||||||
@ -146,23 +148,10 @@ static void destroy_serial(struct kref *kref)
|
|||||||
port = serial->port[i];
|
port = serial->port[i];
|
||||||
if (!port)
|
if (!port)
|
||||||
continue;
|
continue;
|
||||||
usb_kill_urb(port->read_urb);
|
port_free(port);
|
||||||
usb_free_urb(port->read_urb);
|
|
||||||
usb_kill_urb(port->write_urb);
|
|
||||||
usb_free_urb(port->write_urb);
|
|
||||||
usb_kill_urb(port->interrupt_in_urb);
|
|
||||||
usb_free_urb(port->interrupt_in_urb);
|
|
||||||
usb_kill_urb(port->interrupt_out_urb);
|
|
||||||
usb_free_urb(port->interrupt_out_urb);
|
|
||||||
kfree(port->bulk_in_buffer);
|
|
||||||
kfree(port->bulk_out_buffer);
|
|
||||||
kfree(port->interrupt_in_buffer);
|
|
||||||
kfree(port->interrupt_out_buffer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_scheduled_work(); /* port->work */
|
|
||||||
|
|
||||||
usb_put_dev(serial->dev);
|
usb_put_dev(serial->dev);
|
||||||
|
|
||||||
/* free up any memory that we allocated */
|
/* free up any memory that we allocated */
|
||||||
@ -564,6 +553,11 @@ static void port_release(struct device *dev)
|
|||||||
struct usb_serial_port *port = to_usb_serial_port(dev);
|
struct usb_serial_port *port = to_usb_serial_port(dev);
|
||||||
|
|
||||||
dbg ("%s - %s", __FUNCTION__, dev->bus_id);
|
dbg ("%s - %s", __FUNCTION__, dev->bus_id);
|
||||||
|
port_free(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void port_free(struct usb_serial_port *port)
|
||||||
|
{
|
||||||
usb_kill_urb(port->read_urb);
|
usb_kill_urb(port->read_urb);
|
||||||
usb_free_urb(port->read_urb);
|
usb_free_urb(port->read_urb);
|
||||||
usb_kill_urb(port->write_urb);
|
usb_kill_urb(port->write_urb);
|
||||||
@ -576,6 +570,7 @@ static void port_release(struct device *dev)
|
|||||||
kfree(port->bulk_out_buffer);
|
kfree(port->bulk_out_buffer);
|
||||||
kfree(port->interrupt_in_buffer);
|
kfree(port->interrupt_in_buffer);
|
||||||
kfree(port->interrupt_out_buffer);
|
kfree(port->interrupt_out_buffer);
|
||||||
|
flush_scheduled_work(); /* port->work */
|
||||||
kfree(port);
|
kfree(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "visor.h"
|
#include "visor.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -302,7 +302,6 @@ static int visor_open (struct usb_serial_port *port, struct file *filp)
|
|||||||
spin_lock_irqsave(&priv->lock, flags);
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
priv->bytes_in = 0;
|
priv->bytes_in = 0;
|
||||||
priv->bytes_out = 0;
|
priv->bytes_out = 0;
|
||||||
priv->outstanding_urbs = 0;
|
|
||||||
priv->throttled = 0;
|
priv->throttled = 0;
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
@ -435,13 +434,25 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf,
|
|||||||
|
|
||||||
static int visor_write_room (struct usb_serial_port *port)
|
static int visor_write_room (struct usb_serial_port *port)
|
||||||
{
|
{
|
||||||
|
struct visor_private *priv = usb_get_serial_port_data(port);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
dbg("%s - port %d", __FUNCTION__, port->number);
|
dbg("%s - port %d", __FUNCTION__, port->number);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We really can take anything the user throws at us
|
* We really can take anything the user throws at us
|
||||||
* but let's pick a nice big number to tell the tty
|
* but let's pick a nice big number to tell the tty
|
||||||
* layer that we have lots of free space
|
* layer that we have lots of free space, unless we don't.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
if (priv->outstanding_urbs > URB_UPPER_LIMIT * 2 / 3) {
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
dbg("%s - write limit hit\n", __FUNCTION__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
return 2048;
|
return 2048;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -758,15 +769,22 @@ static int visor_calc_num_ports (struct usb_serial *serial)
|
|||||||
|
|
||||||
static int generic_startup(struct usb_serial *serial)
|
static int generic_startup(struct usb_serial *serial)
|
||||||
{
|
{
|
||||||
|
struct usb_serial_port **ports = serial->port;
|
||||||
struct visor_private *priv;
|
struct visor_private *priv;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < serial->num_ports; ++i) {
|
for (i = 0; i < serial->num_ports; ++i) {
|
||||||
priv = kzalloc (sizeof(*priv), GFP_KERNEL);
|
priv = kzalloc (sizeof(*priv), GFP_KERNEL);
|
||||||
if (!priv)
|
if (!priv) {
|
||||||
|
while (i-- != 0) {
|
||||||
|
priv = usb_get_serial_port_data(ports[i]);
|
||||||
|
usb_set_serial_port_data(ports[i], NULL);
|
||||||
|
kfree(priv);
|
||||||
|
}
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
spin_lock_init(&priv->lock);
|
spin_lock_init(&priv->lock);
|
||||||
usb_set_serial_port_data(serial->port[i], priv);
|
usb_set_serial_port_data(ports[i], priv);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -876,7 +894,18 @@ static int clie_5_attach (struct usb_serial *serial)
|
|||||||
|
|
||||||
static void visor_shutdown (struct usb_serial *serial)
|
static void visor_shutdown (struct usb_serial *serial)
|
||||||
{
|
{
|
||||||
|
struct visor_private *priv;
|
||||||
|
int i;
|
||||||
|
|
||||||
dbg("%s", __FUNCTION__);
|
dbg("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
for (i = 0; i < serial->num_ports; i++) {
|
||||||
|
priv = usb_get_serial_port_data(serial->port[i]);
|
||||||
|
if (priv) {
|
||||||
|
usb_set_serial_port_data(serial->port[i], NULL);
|
||||||
|
kfree(priv);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
|
static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
|
||||||
|
@ -79,7 +79,7 @@
|
|||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include <linux/serial_reg.h>
|
#include <linux/serial_reg.h>
|
||||||
#include <linux/serial.h>
|
#include <linux/serial.h>
|
||||||
#include "usb-serial.h"
|
#include <linux/usb/serial.h>
|
||||||
#include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */
|
#include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */
|
||||||
#include "whiteheat.h" /* WhiteHEAT specific commands */
|
#include "whiteheat.h" /* WhiteHEAT specific commands */
|
||||||
|
|
||||||
|
@ -112,13 +112,11 @@ static int slave_configure(struct scsi_device *sdev)
|
|||||||
if (sdev->scsi_level < SCSI_2)
|
if (sdev->scsi_level < SCSI_2)
|
||||||
sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2;
|
sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2;
|
||||||
|
|
||||||
/* According to the technical support people at Genesys Logic,
|
/* Many devices have trouble transfering more than 32KB at a time,
|
||||||
* devices using their chips have problems transferring more than
|
* while others have trouble with more than 64K. At this time we
|
||||||
* 32 KB at a time. In practice people have found that 64 KB
|
* are limiting both to 32K (64 sectores).
|
||||||
* works okay and that's what Windows does. But we'll be
|
*/
|
||||||
* conservative; people can always use the sysfs interface to
|
if ((us->flags & US_FL_MAX_SECTORS_64) &&
|
||||||
* increase max_sectors. */
|
|
||||||
if (le16_to_cpu(us->pusb_dev->descriptor.idVendor) == USB_VENDOR_ID_GENESYS &&
|
|
||||||
sdev->request_queue->max_sectors > 64)
|
sdev->request_queue->max_sectors > 64)
|
||||||
blk_queue_max_sectors(sdev->request_queue, 64);
|
blk_queue_max_sectors(sdev->request_queue, 64);
|
||||||
|
|
||||||
|
@ -112,6 +112,19 @@ UNUSUAL_DEV( 0x0411, 0x001c, 0x0113, 0x0113,
|
|||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_FIX_INQUIRY ),
|
US_FL_FIX_INQUIRY ),
|
||||||
|
|
||||||
|
/* Submitted by Ernestas Vaiciukevicius <ernisv@gmail.com> */
|
||||||
|
UNUSUAL_DEV( 0x0419, 0x0100, 0x0100, 0x0100,
|
||||||
|
"Samsung Info. Systems America, Inc.",
|
||||||
|
"MP3 Player",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_IGNORE_RESIDUE ),
|
||||||
|
|
||||||
|
/* Reported by Orgad Shaneh <orgads@gmail.com> */
|
||||||
|
UNUSUAL_DEV( 0x0419, 0xaace, 0x0100, 0x0100,
|
||||||
|
"Samsung", "MP3 Player",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_IGNORE_RESIDUE ),
|
||||||
|
|
||||||
/* Reported by Christian Leber <christian@leber.de> */
|
/* Reported by Christian Leber <christian@leber.de> */
|
||||||
UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100,
|
UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100,
|
||||||
"TrekStor",
|
"TrekStor",
|
||||||
@ -132,6 +145,14 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100,
|
|||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_IGNORE_RESIDUE ),
|
US_FL_IGNORE_RESIDUE ),
|
||||||
|
|
||||||
|
/* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and
|
||||||
|
* Einar Th. Einarsson <einarthered@gmail.com> */
|
||||||
|
UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100,
|
||||||
|
"Nokia",
|
||||||
|
"N91",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
|
||||||
|
|
||||||
/* Reported by Jiri Slaby <jirislaby@gmail.com> and
|
/* Reported by Jiri Slaby <jirislaby@gmail.com> and
|
||||||
* Rene C. Castberg <Rene@Castberg.org> */
|
* Rene C. Castberg <Rene@Castberg.org> */
|
||||||
UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100,
|
UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100,
|
||||||
@ -140,6 +161,13 @@ UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100,
|
|||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
|
US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
|
||||||
|
|
||||||
|
/* Reported by Matthew Bloch <matthew@bytemark.co.uk> */
|
||||||
|
UNUSUAL_DEV( 0x0421, 0x044e, 0x0100, 0x0100,
|
||||||
|
"Nokia",
|
||||||
|
"E61",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
|
||||||
|
|
||||||
/* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */
|
/* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */
|
||||||
UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210,
|
UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210,
|
||||||
"SMSC",
|
"SMSC",
|
||||||
@ -473,10 +501,11 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450,
|
|||||||
US_SC_SCSI, US_PR_DEVICE, NULL,
|
US_SC_SCSI, US_PR_DEVICE, NULL,
|
||||||
US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ),
|
US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ),
|
||||||
|
|
||||||
/* This entry is needed because the device reports Sub=ff */
|
/* Submitted by Lars Jacob <jacob.lars@googlemail.com>
|
||||||
UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0600,
|
* This entry is needed because the device reports Sub=ff */
|
||||||
|
UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610,
|
||||||
"Sony",
|
"Sony",
|
||||||
"DSC-T1/T5",
|
"DSC-T1/T5/H5",
|
||||||
US_SC_8070, US_PR_DEVICE, NULL,
|
US_SC_8070, US_PR_DEVICE, NULL,
|
||||||
US_FL_SINGLE_LUN ),
|
US_FL_SINGLE_LUN ),
|
||||||
|
|
||||||
@ -708,18 +737,22 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113,
|
|||||||
* They were originally reported by Alexander Oltu
|
* They were originally reported by Alexander Oltu
|
||||||
* <alexander@all-2.com> and Peter Marks <peter.marks@turner.com>
|
* <alexander@all-2.com> and Peter Marks <peter.marks@turner.com>
|
||||||
* respectively.
|
* respectively.
|
||||||
|
*
|
||||||
|
* US_FL_GO_SLOW and US_FL_MAX_SECTORS_64 added by Phil Dibowitz
|
||||||
|
* <phil@ipom.com> as these flags were made and hard-coded
|
||||||
|
* special-cases were pulled from scsiglue.c.
|
||||||
*/
|
*/
|
||||||
UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff,
|
UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff,
|
||||||
"Genesys Logic",
|
"Genesys Logic",
|
||||||
"USB to IDE Optical",
|
"USB to IDE Optical",
|
||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_GO_SLOW ),
|
US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
|
||||||
|
|
||||||
UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff,
|
UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff,
|
||||||
"Genesys Logic",
|
"Genesys Logic",
|
||||||
"USB to IDE Disk",
|
"USB to IDE Disk",
|
||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_GO_SLOW ),
|
US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
|
||||||
|
|
||||||
/* Reported by Hanno Boeck <hanno@gmx.de>
|
/* Reported by Hanno Boeck <hanno@gmx.de>
|
||||||
* Taken from the Lycoris Kernel */
|
* Taken from the Lycoris Kernel */
|
||||||
@ -1196,6 +1229,14 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110,
|
|||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_IGNORE_RESIDUE ),
|
US_FL_IGNORE_RESIDUE ),
|
||||||
|
|
||||||
|
/* Reported by Benjamin Schiller <sbenni@gmx.de>
|
||||||
|
* It is also sold by Easylite as DJ 20 */
|
||||||
|
UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103,
|
||||||
|
"Typhoon",
|
||||||
|
"My DJ 1820",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64),
|
||||||
|
|
||||||
/* Reported by Michael Stattmann <michael@stattmann.com> */
|
/* Reported by Michael Stattmann <michael@stattmann.com> */
|
||||||
UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000,
|
UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000,
|
||||||
"Sony Ericsson",
|
"Sony Ericsson",
|
||||||
@ -1227,6 +1268,15 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110,
|
|||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_IGNORE_RESIDUE ),
|
US_FL_IGNORE_RESIDUE ),
|
||||||
|
|
||||||
|
/* patch submitted by Davide Perini <perini.davide@dpsoftware.org>
|
||||||
|
* and Renato Perini <rperini@email.it>
|
||||||
|
*/
|
||||||
|
UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001,
|
||||||
|
"Motorola",
|
||||||
|
"RAZR V3x",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ),
|
||||||
|
|
||||||
/* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */
|
/* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */
|
||||||
UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
|
UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
|
||||||
"MPIO",
|
"MPIO",
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/utsrelease.h>
|
||||||
|
|
||||||
#include <scsi/scsi.h>
|
#include <scsi/scsi.h>
|
||||||
#include <scsi/scsi_cmnd.h>
|
#include <scsi/scsi_cmnd.h>
|
||||||
@ -373,8 +374,12 @@ static int usb_stor_control_thread(void * __us)
|
|||||||
/* lock access to the state */
|
/* lock access to the state */
|
||||||
scsi_lock(host);
|
scsi_lock(host);
|
||||||
|
|
||||||
|
/* did the command already complete because of a disconnect? */
|
||||||
|
if (!us->srb)
|
||||||
|
; /* nothing to do */
|
||||||
|
|
||||||
/* indicate that the command is done */
|
/* indicate that the command is done */
|
||||||
if (us->srb->result != DID_ABORT << 16) {
|
else if (us->srb->result != DID_ABORT << 16) {
|
||||||
US_DEBUGP("scsi cmd done, result=0x%x\n",
|
US_DEBUGP("scsi cmd done, result=0x%x\n",
|
||||||
us->srb->result);
|
us->srb->result);
|
||||||
us->srb->scsi_done(us->srb);
|
us->srb->scsi_done(us->srb);
|
||||||
@ -524,7 +529,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id)
|
|||||||
if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE))
|
if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE))
|
||||||
printk(KERN_NOTICE USB_STORAGE "This device "
|
printk(KERN_NOTICE USB_STORAGE "This device "
|
||||||
"(%04x,%04x,%04x S %02x P %02x)"
|
"(%04x,%04x,%04x S %02x P %02x)"
|
||||||
" has %s in unusual_devs.h\n"
|
" has %s in unusual_devs.h (kernel"
|
||||||
|
" %s)\n"
|
||||||
" Please send a copy of this message to "
|
" Please send a copy of this message to "
|
||||||
"<linux-usb-devel@lists.sourceforge.net>\n",
|
"<linux-usb-devel@lists.sourceforge.net>\n",
|
||||||
le16_to_cpu(ddesc->idVendor),
|
le16_to_cpu(ddesc->idVendor),
|
||||||
@ -532,7 +538,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id)
|
|||||||
le16_to_cpu(ddesc->bcdDevice),
|
le16_to_cpu(ddesc->bcdDevice),
|
||||||
idesc->bInterfaceSubClass,
|
idesc->bInterfaceSubClass,
|
||||||
idesc->bInterfaceProtocol,
|
idesc->bInterfaceProtocol,
|
||||||
msgs[msg]);
|
msgs[msg],
|
||||||
|
UTS_RELEASE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -836,32 +843,34 @@ static void dissociate_dev(struct us_data *us)
|
|||||||
* the host */
|
* the host */
|
||||||
static void quiesce_and_remove_host(struct us_data *us)
|
static void quiesce_and_remove_host(struct us_data *us)
|
||||||
{
|
{
|
||||||
|
struct Scsi_Host *host = us_to_host(us);
|
||||||
|
|
||||||
/* Prevent new USB transfers, stop the current command, and
|
/* Prevent new USB transfers, stop the current command, and
|
||||||
* interrupt a SCSI-scan or device-reset delay */
|
* interrupt a SCSI-scan or device-reset delay */
|
||||||
|
scsi_lock(host);
|
||||||
set_bit(US_FLIDX_DISCONNECTING, &us->flags);
|
set_bit(US_FLIDX_DISCONNECTING, &us->flags);
|
||||||
|
scsi_unlock(host);
|
||||||
usb_stor_stop_transport(us);
|
usb_stor_stop_transport(us);
|
||||||
wake_up(&us->delay_wait);
|
wake_up(&us->delay_wait);
|
||||||
|
|
||||||
/* It doesn't matter if the SCSI-scanning thread is still running.
|
/* It doesn't matter if the SCSI-scanning thread is still running.
|
||||||
* The thread will exit when it sees the DISCONNECTING flag. */
|
* The thread will exit when it sees the DISCONNECTING flag. */
|
||||||
|
|
||||||
/* Wait for the current command to finish, then remove the host */
|
|
||||||
mutex_lock(&us->dev_mutex);
|
|
||||||
mutex_unlock(&us->dev_mutex);
|
|
||||||
|
|
||||||
/* queuecommand won't accept any new commands and the control
|
/* queuecommand won't accept any new commands and the control
|
||||||
* thread won't execute a previously-queued command. If there
|
* thread won't execute a previously-queued command. If there
|
||||||
* is such a command pending, complete it with an error. */
|
* is such a command pending, complete it with an error. */
|
||||||
|
mutex_lock(&us->dev_mutex);
|
||||||
if (us->srb) {
|
if (us->srb) {
|
||||||
us->srb->result = DID_NO_CONNECT << 16;
|
us->srb->result = DID_NO_CONNECT << 16;
|
||||||
scsi_lock(us_to_host(us));
|
scsi_lock(host);
|
||||||
us->srb->scsi_done(us->srb);
|
us->srb->scsi_done(us->srb);
|
||||||
us->srb = NULL;
|
us->srb = NULL;
|
||||||
scsi_unlock(us_to_host(us));
|
scsi_unlock(host);
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&us->dev_mutex);
|
||||||
|
|
||||||
/* Now we own no commands so it's safe to remove the SCSI host */
|
/* Now we own no commands so it's safe to remove the SCSI host */
|
||||||
scsi_remove_host(us_to_host(us));
|
scsi_remove_host(host);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Second stage of disconnect processing: deallocate all resources */
|
/* Second stage of disconnect processing: deallocate all resources */
|
||||||
|
@ -176,8 +176,4 @@ extern void fill_inquiry_response(struct us_data *us,
|
|||||||
#define scsi_unlock(host) spin_unlock_irq(host->host_lock)
|
#define scsi_unlock(host) spin_unlock_irq(host->host_lock)
|
||||||
#define scsi_lock(host) spin_lock_irq(host->host_lock)
|
#define scsi_lock(host) spin_lock_irq(host->host_lock)
|
||||||
|
|
||||||
|
|
||||||
/* Vendor ID list for devices that require special handling */
|
|
||||||
#define USB_VENDOR_ID_GENESYS 0x05e3 /* Genesys Logic */
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -48,7 +48,7 @@ struct ep_device;
|
|||||||
* @urb_list: urbs queued to this endpoint; maintained by usbcore
|
* @urb_list: urbs queued to this endpoint; maintained by usbcore
|
||||||
* @hcpriv: for use by HCD; typically holds hardware dma queue head (QH)
|
* @hcpriv: for use by HCD; typically holds hardware dma queue head (QH)
|
||||||
* with one or more transfer descriptors (TDs) per urb
|
* with one or more transfer descriptors (TDs) per urb
|
||||||
* @kobj: kobject for sysfs info
|
* @ep_dev: ep_device for sysfs info
|
||||||
* @extra: descriptors following this endpoint in the configuration
|
* @extra: descriptors following this endpoint in the configuration
|
||||||
* @extralen: how many bytes of "extra" are valid
|
* @extralen: how many bytes of "extra" are valid
|
||||||
*
|
*
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* USB Serial Converter driver
|
* USB Serial Converter stuff
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999 - 2005
|
* Copyright (C) 1999 - 2005
|
||||||
* Greg Kroah-Hartman (greg@kroah.com)
|
* Greg Kroah-Hartman (greg@kroah.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation; either version 2 of the License.
|
* the Free Software Foundation; version 2 of the License.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ static inline void usb_set_serial_data (struct usb_serial *serial, void *data)
|
|||||||
* but before the device has been fully initialized by the usb_serial
|
* but before the device has been fully initialized by the usb_serial
|
||||||
* subsystem. Use this function to download any firmware to the device,
|
* subsystem. Use this function to download any firmware to the device,
|
||||||
* or any other early initialization that might be needed.
|
* or any other early initialization that might be needed.
|
||||||
* Return 0 to continue on with the initialization sequence. Anything
|
* Return 0 to continue on with the initialization sequence. Anything
|
||||||
* else will abort it.
|
* else will abort it.
|
||||||
* @attach: pointer to the driver's attach function.
|
* @attach: pointer to the driver's attach function.
|
||||||
* This will be called when the struct usb_serial structure is fully set
|
* This will be called when the struct usb_serial structure is fully set
|
@ -51,6 +51,9 @@
|
|||||||
#define USB_RECIP_INTERFACE 0x01
|
#define USB_RECIP_INTERFACE 0x01
|
||||||
#define USB_RECIP_ENDPOINT 0x02
|
#define USB_RECIP_ENDPOINT 0x02
|
||||||
#define USB_RECIP_OTHER 0x03
|
#define USB_RECIP_OTHER 0x03
|
||||||
|
/* From Wireless USB 1.0 */
|
||||||
|
#define USB_RECIP_PORT 0x04
|
||||||
|
#define USB_RECIP_RPIPE 0x05
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Standard requests, for the bRequest field of a SETUP packet.
|
* Standard requests, for the bRequest field of a SETUP packet.
|
||||||
@ -73,7 +76,9 @@
|
|||||||
|
|
||||||
#define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */
|
#define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */
|
||||||
#define USB_REQ_GET_ENCRYPTION 0x0E
|
#define USB_REQ_GET_ENCRYPTION 0x0E
|
||||||
|
#define USB_REQ_RPIPE_ABORT 0x0E
|
||||||
#define USB_REQ_SET_HANDSHAKE 0x0F
|
#define USB_REQ_SET_HANDSHAKE 0x0F
|
||||||
|
#define USB_REQ_RPIPE_RESET 0x0F
|
||||||
#define USB_REQ_GET_HANDSHAKE 0x10
|
#define USB_REQ_GET_HANDSHAKE 0x10
|
||||||
#define USB_REQ_SET_CONNECTION 0x11
|
#define USB_REQ_SET_CONNECTION 0x11
|
||||||
#define USB_REQ_SET_SECURITY_DATA 0x12
|
#define USB_REQ_SET_SECURITY_DATA 0x12
|
||||||
@ -159,6 +164,8 @@ struct usb_ctrlrequest {
|
|||||||
#define USB_DT_BOS 0x0f
|
#define USB_DT_BOS 0x0f
|
||||||
#define USB_DT_DEVICE_CAPABILITY 0x10
|
#define USB_DT_DEVICE_CAPABILITY 0x10
|
||||||
#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
|
#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
|
||||||
|
#define USB_DT_WIRE_ADAPTER 0x21
|
||||||
|
#define USB_DT_RPIPE 0x22
|
||||||
|
|
||||||
/* conventional codes for class-specific descriptors */
|
/* conventional codes for class-specific descriptors */
|
||||||
#define USB_DT_CS_DEVICE 0x21
|
#define USB_DT_CS_DEVICE 0x21
|
||||||
|
@ -872,9 +872,9 @@ int usb_gadget_config_buf(const struct usb_config_descriptor *config,
|
|||||||
/* utility wrapping a simple endpoint selection policy */
|
/* utility wrapping a simple endpoint selection policy */
|
||||||
|
|
||||||
extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *,
|
extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *,
|
||||||
struct usb_endpoint_descriptor *) __init;
|
struct usb_endpoint_descriptor *) __devinit;
|
||||||
|
|
||||||
extern void usb_ep_autoconfig_reset (struct usb_gadget *) __init;
|
extern void usb_ep_autoconfig_reset (struct usb_gadget *) __devinit;
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
|
@ -43,6 +43,8 @@
|
|||||||
/* Need delay after Command phase */ \
|
/* Need delay after Command phase */ \
|
||||||
US_FLAG(NO_WP_DETECT, 0x00000200) \
|
US_FLAG(NO_WP_DETECT, 0x00000200) \
|
||||||
/* Don't check for write-protect */ \
|
/* Don't check for write-protect */ \
|
||||||
|
US_FLAG(MAX_SECTORS_64, 0x00000400) \
|
||||||
|
/* Sets max_sectors to 64 */
|
||||||
|
|
||||||
#define US_FLAG(name, value) US_FL_##name = value ,
|
#define US_FLAG(name, value) US_FL_##name = value ,
|
||||||
enum { US_DO_ALL_FLAGS };
|
enum { US_DO_ALL_FLAGS };
|
||||||
|
Loading…
Reference in New Issue
Block a user