Commit f812d833 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents ca6f8809 4965c6f6
This diff is collapsed.
...@@ -103,7 +103,7 @@ firmware_class_hotplug(struct class_device *class_dev, char **envp, ...@@ -103,7 +103,7 @@ firmware_class_hotplug(struct class_device *class_dev, char **envp,
"FIRMWARE=%s", fw_priv->fw_id)) "FIRMWARE=%s", fw_priv->fw_id))
return -ENOMEM; return -ENOMEM;
envp[i++] = NULL; envp[i] = NULL;
return 0; return 0;
} }
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#define DRV_NAME "ub" #define DRV_NAME "ub"
#define DEVFS_NAME DRV_NAME #define DEVFS_NAME DRV_NAME
#define UB_MAJOR 125 /* Stolen from Experimental range for a week - XXX */ #define UB_MAJOR 180
/* /*
* Definitions which have to be scattered once we understand the layout better. * Definitions which have to be scattered once we understand the layout better.
...@@ -1535,8 +1535,11 @@ static int ub_bd_revalidate(struct gendisk *disk) ...@@ -1535,8 +1535,11 @@ static int ub_bd_revalidate(struct gendisk *disk)
ub_revalidate(sc); ub_revalidate(sc);
/* This is pretty much a long term P3 */ /* This is pretty much a long term P3 */
if (!atomic_read(&sc->poison)) { /* Cover sc->dev */
printk(KERN_INFO "%s: device %u capacity nsec %ld bsize %u\n", printk(KERN_INFO "%s: device %u capacity nsec %ld bsize %u\n",
sc->name, sc->dev->devnum, sc->capacity.nsec, sc->capacity.bsize); sc->name, sc->dev->devnum,
sc->capacity.nsec, sc->capacity.bsize);
}
/* XXX Support sector size switching like in sr.c */ /* XXX Support sector size switching like in sr.c */
blk_queue_hardsect_size(disk->queue, sc->capacity.bsize); blk_queue_hardsect_size(disk->queue, sc->capacity.bsize);
......
...@@ -38,6 +38,7 @@ obj-$(CONFIG_USB_KONICAWC) += media/ ...@@ -38,6 +38,7 @@ obj-$(CONFIG_USB_KONICAWC) += media/
obj-$(CONFIG_USB_OV511) += media/ obj-$(CONFIG_USB_OV511) += media/
obj-$(CONFIG_USB_PWC) += media/ obj-$(CONFIG_USB_PWC) += media/
obj-$(CONFIG_USB_SE401) += media/ obj-$(CONFIG_USB_SE401) += media/
obj-$(CONFIG_USB_SN9C102) += media/
obj-$(CONFIG_USB_STV680) += media/ obj-$(CONFIG_USB_STV680) += media/
obj-$(CONFIG_USB_VICAM) += media/ obj-$(CONFIG_USB_VICAM) += media/
obj-$(CONFIG_USB_W9968CF) += media/ obj-$(CONFIG_USB_W9968CF) += media/
......
...@@ -243,14 +243,16 @@ static void sg_complete (struct urb *urb, struct pt_regs *regs) ...@@ -243,14 +243,16 @@ static void sg_complete (struct urb *urb, struct pt_regs *regs)
// BUG (); // BUG ();
} }
if (urb->status && urb->status != -ECONNRESET) { if (io->status == 0 && urb->status && urb->status != -ECONNRESET) {
int i, found, status; int i, found, status;
io->status = urb->status; io->status = urb->status;
/* the previous urbs, and this one, completed already. /* the previous urbs, and this one, completed already.
* unlink pending urbs so they won't rx/tx bad data. * unlink pending urbs so they won't rx/tx bad data.
* careful: unlink can sometimes be synchronous...
*/ */
spin_unlock (&io->lock);
for (i = 0, found = 0; i < io->entries; i++) { for (i = 0, found = 0; i < io->entries; i++) {
if (!io->urbs [i] || !io->urbs [i]->dev) if (!io->urbs [i] || !io->urbs [i]->dev)
continue; continue;
...@@ -263,6 +265,7 @@ static void sg_complete (struct urb *urb, struct pt_regs *regs) ...@@ -263,6 +265,7 @@ static void sg_complete (struct urb *urb, struct pt_regs *regs)
} else if (urb == io->urbs [i]) } else if (urb == io->urbs [i])
found = 1; found = 1;
} }
spin_lock (&io->lock);
} }
urb->dev = NULL; urb->dev = NULL;
...@@ -524,6 +527,7 @@ void usb_sg_cancel (struct usb_sg_request *io) ...@@ -524,6 +527,7 @@ void usb_sg_cancel (struct usb_sg_request *io)
int i; int i;
io->status = -ECONNRESET; io->status = -ECONNRESET;
spin_unlock (&io->lock);
for (i = 0; i < io->entries; i++) { for (i = 0; i < io->entries; i++) {
int retval; int retval;
...@@ -534,6 +538,7 @@ void usb_sg_cancel (struct usb_sg_request *io) ...@@ -534,6 +538,7 @@ void usb_sg_cancel (struct usb_sg_request *io)
dev_warn (&io->dev->dev, "%s, unlink --> %d\n", dev_warn (&io->dev->dev, "%s, unlink --> %d\n",
__FUNCTION__, retval); __FUNCTION__, retval);
} }
spin_lock (&io->lock);
} }
spin_unlock_irqrestore (&io->lock, flags); spin_unlock_irqrestore (&io->lock, flags);
} }
......
...@@ -451,9 +451,11 @@ int usb_unlink_urb(struct urb *urb) ...@@ -451,9 +451,11 @@ int usb_unlink_urb(struct urb *urb)
return -EINVAL; return -EINVAL;
if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) { if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) {
#ifdef CONFIG_DEBUG_KERNEL #ifdef CONFIG_DEBUG_KERNEL
if (printk_ratelimit()) {
printk(KERN_NOTICE "usb_unlink_urb() is deprecated for " printk(KERN_NOTICE "usb_unlink_urb() is deprecated for "
"synchronous unlinks. Use usb_kill_urb() instead.\n"); "synchronous unlinks. Use usb_kill_urb() instead.\n");
WARN_ON(1); WARN_ON(1);
}
#endif #endif
usb_kill_urb(urb); usb_kill_urb(urb);
return 0; return 0;
......
...@@ -656,7 +656,7 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp, ...@@ -656,7 +656,7 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
return -ENOMEM; return -ENOMEM;
} }
envp[i++] = NULL; envp[i] = NULL;
return 0; return 0;
} }
......
...@@ -33,3 +33,18 @@ extern struct usb_driver usbfs_driver; ...@@ -33,3 +33,18 @@ extern struct usb_driver usbfs_driver;
extern struct file_operations usbfs_devices_fops; extern struct file_operations usbfs_devices_fops;
extern struct file_operations usbfs_device_file_operations; extern struct file_operations usbfs_device_file_operations;
extern void usbfs_conn_disc_event(void); extern void usbfs_conn_disc_event(void);
struct dev_state {
struct list_head list; /* state list */
struct usb_device *dev;
struct file *file;
spinlock_t lock; /* protects the async urb lists */
struct list_head async_pending;
struct list_head async_completed;
wait_queue_head_t wait; /* wake up if a request completed */
unsigned int discsignr;
struct task_struct *disctask;
void __user *disccontext;
unsigned long ifclaimed;
};
...@@ -223,6 +223,10 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address"); ...@@ -223,6 +223,10 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address");
#define DEV_CONFIG_CDC #define DEV_CONFIG_CDC
#endif #endif
#ifdef CONFIG_USB_GADGET_LH7A40X
#define DEV_CONFIG_CDC
#endif
#ifdef CONFIG_USB_GADGET_MQ11XX #ifdef CONFIG_USB_GADGET_MQ11XX
#define DEV_CONFIG_CDC #define DEV_CONFIG_CDC
#endif #endif
...@@ -235,6 +239,10 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address"); ...@@ -235,6 +239,10 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address");
#define DEV_CONFIG_CDC #define DEV_CONFIG_CDC
#endif #endif
#ifdef CONFIG_USB_GADGET_PXA27X
#define DEV_CONFIG_CDC
#endif
/* For CDC-incapable hardware, choose the simple cdc subset. /* For CDC-incapable hardware, choose the simple cdc subset.
* Anything that talks bulk (without notable bugs) can do this. * Anything that talks bulk (without notable bugs) can do this.
...@@ -247,10 +255,6 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address"); ...@@ -247,10 +255,6 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address");
#define DEV_CONFIG_SUBSET #define DEV_CONFIG_SUBSET
#endif #endif
#ifdef CONFIG_USB_GADGET_LH7A40X
#define DEV_CONFIG_CDC
#endif
#ifdef CONFIG_USB_GADGET_SA1100 #ifdef CONFIG_USB_GADGET_SA1100
/* use non-CDC for backwards compatibility */ /* use non-CDC for backwards compatibility */
#define DEV_CONFIG_SUBSET #define DEV_CONFIG_SUBSET
...@@ -2321,6 +2325,8 @@ eth_bind (struct usb_gadget *gadget) ...@@ -2321,6 +2325,8 @@ eth_bind (struct usb_gadget *gadget)
device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209); device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209);
} else if (gadget_is_n9604(gadget)) { } else if (gadget_is_n9604(gadget)) {
device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210); device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210);
} else if (gadget_is_pxa27x(gadget)) {
device_desc.bcdDevice = __constant_cpu_to_le16 (0x0211);
} else { } else {
/* can't assume CDC works. don't want to default to /* can't assume CDC works. don't want to default to
* anything less functional on CDC-capable hardware, * anything less functional on CDC-capable hardware,
......
...@@ -3739,6 +3739,8 @@ static int __init check_parameters(struct fsg_dev *fsg) ...@@ -3739,6 +3739,8 @@ static int __init check_parameters(struct fsg_dev *fsg)
mod_data.release = 0x0309; mod_data.release = 0x0309;
else if (gadget_is_n9604(fsg->gadget)) else if (gadget_is_n9604(fsg->gadget))
mod_data.release = 0x0310; mod_data.release = 0x0310;
else if (gadget_is_pxa27x(fsg->gadget))
mod_data.release = 0x0311;
else { else {
WARN(fsg, "controller '%s' not recognized\n", WARN(fsg, "controller '%s' not recognized\n",
fsg->gadget->name); fsg->gadget->name);
......
...@@ -68,6 +68,12 @@ ...@@ -68,6 +68,12 @@
#define gadget_is_n9604(g) 0 #define gadget_is_n9604(g) 0
#endif #endif
#ifdef CONFIG_USB_GADGET_PXA27X
#define gadget_is_pxa27x(g) !strcmp("pxa27x_udc", (g)->name)
#else
#define gadget_is_pxa27x(g) 0
#endif
// CONFIG_USB_GADGET_AT91RM9200 // CONFIG_USB_GADGET_AT91RM9200
// CONFIG_USB_GADGET_SX2 // CONFIG_USB_GADGET_SX2
// CONFIG_USB_GADGET_AU1X00 // CONFIG_USB_GADGET_AU1X00
......
...@@ -1529,6 +1529,9 @@ static int gs_bind(struct usb_gadget *gadget) ...@@ -1529,6 +1529,9 @@ static int gs_bind(struct usb_gadget *gadget)
} else if (gadget_is_n9604(gadget)) { } else if (gadget_is_n9604(gadget)) {
gs_device_desc.bcdDevice = gs_device_desc.bcdDevice =
__constant_cpu_to_le16(GS_VERSION_NUM|0x0009); __constant_cpu_to_le16(GS_VERSION_NUM|0x0009);
} else if (gadget_is_pxa27x(gadget)) {
gs_device_desc.bcdDevice =
__constant_cpu_to_le16(GS_VERSION_NUM|0x0011);
} else { } else {
printk(KERN_WARNING "gs_bind: controller '%s' not recognized\n", printk(KERN_WARNING "gs_bind: controller '%s' not recognized\n",
gadget->name); gadget->name);
......
...@@ -1190,6 +1190,8 @@ zero_bind (struct usb_gadget *gadget) ...@@ -1190,6 +1190,8 @@ zero_bind (struct usb_gadget *gadget)
device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209); device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209);
} else if (gadget_is_n9604(gadget)) { } else if (gadget_is_n9604(gadget)) {
device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210); device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210);
} else if (gadget_is_pxa27x(gadget)) {
device_desc.bcdDevice = __constant_cpu_to_le16 (0x0211);
} else { } else {
/* gadget zero is so simple (for now, no altsettings) that /* gadget zero is so simple (for now, no altsettings) that
* it SHOULD NOT have problems with bulk-capable hardware. * it SHOULD NOT have problems with bulk-capable hardware.
......
...@@ -379,6 +379,14 @@ static int ehci_hc_reset (struct usb_hcd *hcd) ...@@ -379,6 +379,14 @@ static int ehci_hc_reset (struct usb_hcd *hcd)
/* cache this readonly data; minimize PCI reads */ /* cache this readonly data; minimize PCI reads */
ehci->hcs_params = readl (&ehci->caps->hcs_params); ehci->hcs_params = readl (&ehci->caps->hcs_params);
/* at least the Genesys GL880S needs fixup here */
temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
temp &= 0x0f;
if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {
temp |= (ehci->hcs_params & ~0xf);
ehci->hcs_params = temp;
}
/* force HC to halt state */ /* force HC to halt state */
return ehci_halt (ehci); return ehci_halt (ehci);
} }
......
...@@ -281,8 +281,11 @@ ehci_hub_descriptor ( ...@@ -281,8 +281,11 @@ ehci_hub_descriptor (
temp = 0x0008; /* per-port overcurrent reporting */ temp = 0x0008; /* per-port overcurrent reporting */
if (HCS_PPC (ehci->hcs_params)) if (HCS_PPC (ehci->hcs_params))
temp |= 0x0001; /* per-port power control */ temp |= 0x0001; /* per-port power control */
#if 0
// re-enable when we support USB_PORT_FEAT_INDICATOR below.
if (HCS_INDICATOR (ehci->hcs_params)) if (HCS_INDICATOR (ehci->hcs_params))
temp |= 0x0080; /* per-port indicators (LEDs) */ temp |= 0x0080; /* per-port indicators (LEDs) */
#endif
desc->wHubCharacteristics = cpu_to_le16 (temp); desc->wHubCharacteristics = cpu_to_le16 (temp);
} }
......
...@@ -175,6 +175,8 @@ static void qtd_copy_status ( ...@@ -175,6 +175,8 @@ static void qtd_copy_status (
static void static void
ehci_urb_done (struct ehci_hcd *ehci, struct urb *urb, struct pt_regs *regs) ehci_urb_done (struct ehci_hcd *ehci, struct urb *urb, struct pt_regs *regs)
__releases(ehci->lock)
__acquires(ehci->lock)
{ {
if (likely (urb->hcpriv != 0)) { if (likely (urb->hcpriv != 0)) {
struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv; struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv;
......
...@@ -35,6 +35,8 @@ static void urb_free_priv (struct ohci_hcd *hc, urb_priv_t *urb_priv) ...@@ -35,6 +35,8 @@ static void urb_free_priv (struct ohci_hcd *hc, urb_priv_t *urb_priv)
*/ */
static void static void
finish_urb (struct ohci_hcd *ohci, struct urb *urb, struct pt_regs *regs) finish_urb (struct ohci_hcd *ohci, struct urb *urb, struct pt_regs *regs)
__releases(ohci->lock)
__acquires(ohci->lock)
{ {
// ASSERT (urb->hcpriv != 0); // ASSERT (urb->hcpriv != 0);
......
...@@ -1602,7 +1602,10 @@ static void uhci_free_pending_tds(struct uhci_hcd *uhci) ...@@ -1602,7 +1602,10 @@ static void uhci_free_pending_tds(struct uhci_hcd *uhci)
} }
} }
static void uhci_finish_urb(struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs) static void
uhci_finish_urb(struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs)
__releases(uhci->schedule_lock)
__acquires(uhci->schedule_lock)
{ {
struct uhci_hcd *uhci = hcd_to_uhci(hcd); struct uhci_hcd *uhci = hcd_to_uhci(hcd);
......
...@@ -102,6 +102,7 @@ ...@@ -102,6 +102,7 @@
#define ATI_REMOTE_VENDOR_ID 0x0bc7 #define ATI_REMOTE_VENDOR_ID 0x0bc7
#define ATI_REMOTE_PRODUCT_ID 0x004 #define ATI_REMOTE_PRODUCT_ID 0x004
#define LOLA_REMOTE_PRODUCT_ID 0x002 #define LOLA_REMOTE_PRODUCT_ID 0x002
#define MEDION_REMOTE_PRODUCT_ID 0x006
#define DRIVER_VERSION "2.2.1" #define DRIVER_VERSION "2.2.1"
#define DRIVER_AUTHOR "Torrey Hoffman <thoffman@arnor.net>" #define DRIVER_AUTHOR "Torrey Hoffman <thoffman@arnor.net>"
...@@ -126,6 +127,7 @@ MODULE_PARM_DESC(debug, "Enable extra debug messages and information"); ...@@ -126,6 +127,7 @@ MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
static struct usb_device_id ati_remote_table[] = { static struct usb_device_id ati_remote_table[] = {
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID) }, { USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID) },
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID) }, { USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID) },
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID) },
{} /* Terminating entry */ {} /* Terminating entry */
}; };
...@@ -730,7 +732,8 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de ...@@ -730,7 +732,8 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de
/* See if the offered device matches what we can accept */ /* See if the offered device matches what we can accept */
if ((udev->descriptor.idVendor != ATI_REMOTE_VENDOR_ID) || if ((udev->descriptor.idVendor != ATI_REMOTE_VENDOR_ID) ||
( (udev->descriptor.idProduct != ATI_REMOTE_PRODUCT_ID) && ( (udev->descriptor.idProduct != ATI_REMOTE_PRODUCT_ID) &&
(udev->descriptor.idProduct != LOLA_REMOTE_PRODUCT_ID) )) (udev->descriptor.idProduct != LOLA_REMOTE_PRODUCT_ID) &&
(udev->descriptor.idProduct != MEDION_REMOTE_PRODUCT_ID) ))
return -ENODEV; return -ENODEV;
/* Allocate and clear an ati_remote struct */ /* Allocate and clear an ati_remote struct */
......
...@@ -94,7 +94,8 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned ...@@ -94,7 +94,8 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned
memset(field, 0, sizeof(struct hid_field) + usages * sizeof(struct hid_usage) memset(field, 0, sizeof(struct hid_field) + usages * sizeof(struct hid_usage)
+ values * sizeof(unsigned)); + values * sizeof(unsigned));
report->field[report->maxfield++] = field; field->index = report->maxfield++;
report->field[field->index] = field;
field->usage = (struct hid_usage *)(field + 1); field->usage = (struct hid_usage *)(field + 1);
field->value = (unsigned *)(field->usage + usages); field->value = (unsigned *)(field->usage + usages);
field->report = report; field->report = report;
......
...@@ -59,6 +59,10 @@ ...@@ -59,6 +59,10 @@
#define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>"
#define DRIVER_DESC "eGalax TouchKit USB HID Touchscreen Driver" #define DRIVER_DESC "eGalax TouchKit USB HID Touchscreen Driver"
static int swap_xy;
module_param(swap_xy, bool, 0644);
MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");
struct touchkit_usb { struct touchkit_usb {
unsigned char *data; unsigned char *data;
dma_addr_t data_dma; dma_addr_t data_dma;
...@@ -80,6 +84,7 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs) ...@@ -80,6 +84,7 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
{ {
struct touchkit_usb *touchkit = urb->context; struct touchkit_usb *touchkit = urb->context;
int retval; int retval;
int x, y;
switch (urb->status) { switch (urb->status) {
case 0: case 0:
...@@ -103,13 +108,19 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs) ...@@ -103,13 +108,19 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
goto exit; goto exit;
} }
if (swap_xy) {
y = TOUCHKIT_GET_X(touchkit->data);
x = TOUCHKIT_GET_Y(touchkit->data);
} else {
x = TOUCHKIT_GET_X(touchkit->data);
y = TOUCHKIT_GET_Y(touchkit->data);
}
input_regs(&touchkit->input, regs); input_regs(&touchkit->input, regs);
input_report_key(&touchkit->input, BTN_TOUCH, input_report_key(&touchkit->input, BTN_TOUCH,
TOUCHKIT_GET_TOUCHED(touchkit->data)); TOUCHKIT_GET_TOUCHED(touchkit->data));
input_report_abs(&touchkit->input, ABS_X, input_report_abs(&touchkit->input, ABS_X, x);
TOUCHKIT_GET_X(touchkit->data)); input_report_abs(&touchkit->input, ABS_Y, y);
input_report_abs(&touchkit->input, ABS_Y,
TOUCHKIT_GET_Y(touchkit->data));
input_sync(&touchkit->input); input_sync(&touchkit->input);
exit: exit:
......
...@@ -527,7 +527,7 @@ static void ax8817x_interrupt_complete(struct urb *urb, struct pt_regs *regs) ...@@ -527,7 +527,7 @@ static void ax8817x_interrupt_complete(struct urb *urb, struct pt_regs *regs)
devdbg(dev, "ax8817x - Link Status is: %d", link); devdbg(dev, "ax8817x - Link Status is: %d", link);
} }
} }
usb_submit_urb(data->int_urb, GFP_KERNEL); usb_submit_urb(data->int_urb, GFP_ATOMIC);
} }
} }
......
...@@ -2797,9 +2797,12 @@ static void change_port_settings (struct edgeport_port *edge_port, struct termio ...@@ -2797,9 +2797,12 @@ static void change_port_settings (struct edgeport_port *edge_port, struct termio
static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size) static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size)
{ {
int i; int i;
for (i = 0; i < unicode_size; ++i) {
if (unicode_size <= 0)
return;
for (i = 0; i < unicode_size; ++i)
string[i] = (char)(le16_to_cpu(unicode[i])); string[i] = (char)(le16_to_cpu(unicode[i]));
}
string[unicode_size] = 0x00; string[unicode_size] = 0x00;
} }
......
...@@ -494,10 +494,9 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf, ...@@ -494,10 +494,9 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf,
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
if (priv->outstanding_urbs > URB_UPPER_LIMIT) { if (priv->outstanding_urbs > URB_UPPER_LIMIT) {
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
dev_dbg(&port->dev, "write limit hit\n"); dbg("%s - write limit hit\n", __FUNCTION__);
return 0; return 0;
} }
++priv->outstanding_urbs;
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
buffer = kmalloc (count, GFP_ATOMIC); buffer = kmalloc (count, GFP_ATOMIC);
......
...@@ -2,16 +2,23 @@ ...@@ -2,16 +2,23 @@
# USB Storage driver configuration # USB Storage driver configuration
# #
comment "NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information"
config USB_STORAGE config USB_STORAGE
tristate "USB Mass Storage support" tristate "USB Mass Storage support"
depends on USB depends on USB
select SCSI select SCSI
---help--- ---help---
Say Y here if you want to connect USB mass storage devices to your Say Y here if you want to connect USB mass storage devices to your
computer's USB port. This is the driver you need for USB floppy drives, computer's USB port. This is the driver you need for USB
USB hard disks, USB tape drives and USB CD-ROMs, along with floppy drives, USB hard disks, USB tape drives, USB CD-ROMs,
similar devices. This driver may also be used for some cameras and USB flash devices, and memory sticks, along with
card readers. similar devices. This driver may also be used for some cameras
and card readers.
This option 'selects' (turns on, enables) 'SCSI', but you
probably also need 'SCSI device support: SCSI disk support'
(BLK_DEV_SD) for most USB storage devices.
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 usb-storage. module will be called usb-storage.
......
...@@ -274,6 +274,14 @@ UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100, ...@@ -274,6 +274,14 @@ UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100,
US_SC_DEVICE, US_PR_DEVICE, NULL, US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), US_FL_IGNORE_RESIDUE ),
/* Another Yakumo camera.
* Reported by Michele Alzetta <michele.alzetta@aliceposta.it> */
UNUSUAL_DEV( 0x052b, 0x1804, 0x0100, 0x0100,
"Tekom Technologies, Inc",
"300_CAMERA",
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ),
/* Reported by Iacopo Spalletti <avvisi@spalletti.it> */ /* Reported by Iacopo Spalletti <avvisi@spalletti.it> */
UNUSUAL_DEV( 0x052b, 0x1807, 0x0100, 0x0100, UNUSUAL_DEV( 0x052b, 0x1807, 0x0100, 0x0100,
"Tekom Technologies, Inc", "Tekom Technologies, Inc",
......
...@@ -144,29 +144,4 @@ struct usbdevfs_hub_portinfo { ...@@ -144,29 +144,4 @@ struct usbdevfs_hub_portinfo {
#define USBDEVFS_DISCONNECT _IO('U', 22) #define USBDEVFS_DISCONNECT _IO('U', 22)
#define USBDEVFS_CONNECT _IO('U', 23) #define USBDEVFS_CONNECT _IO('U', 23)
/* --------------------------------------------------------------------- */
#ifdef __KERNEL__
#include <linux/list.h>
#include <asm/semaphore.h>
struct dev_state {
struct list_head list; /* state list */
struct usb_device *dev;
struct file *file;
spinlock_t lock; /* protects the async urb lists */
struct list_head async_pending;
struct list_head async_completed;
wait_queue_head_t wait; /* wake up if a request completed */
unsigned int discsignr;
struct task_struct *disctask;
void __user *disccontext;
unsigned long ifclaimed;
};
#endif /* __KERNEL__ */
/* --------------------------------------------------------------------- */
#endif /* _LINUX_USBDEVICE_FS_H */ #endif /* _LINUX_USBDEVICE_FS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment