Commit a4b7d3bb authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
  usb: Increase timeout value for device reset
  USB: put claimed interfaces in the "suspended" state
  USB: EHCI: defer reclamation of siTDs
  USB: fix remote wakeup settings during system sleep
  USB: pl2303: add AdLink ND-6530 USB IDs
  USB: Add id for HP ev2210 a.k.a Sierra MC5725 miniPCI-e Cell Modem.
  USB: OHCI: DA8xx/OMAP-L1x: fix up macro rename
  USB: qcaux: add LG Rumor and Sanyo Katana LX device IDs
  usb: wusb: don't overflow the Keep Alive IE buffer
  USB: ehci: omap: fix kernel panic with rmmod
  USB: fixed bug in usbsevseg using USB autosuspend incorrectly
  USB: ti_usb_3410_5052: adding multitech dialup fax/modem devices
parents a2340be0 6307e096
...@@ -301,7 +301,7 @@ static int usb_probe_interface(struct device *dev) ...@@ -301,7 +301,7 @@ static int usb_probe_interface(struct device *dev)
intf->condition = USB_INTERFACE_BINDING; intf->condition = USB_INTERFACE_BINDING;
/* Bound interfaces are initially active. They are /* Probed interfaces are initially active. They are
* runtime-PM-enabled only if the driver has autosuspend support. * runtime-PM-enabled only if the driver has autosuspend support.
* They are sensitive to their children's power states. * They are sensitive to their children's power states.
*/ */
...@@ -437,11 +437,11 @@ int usb_driver_claim_interface(struct usb_driver *driver, ...@@ -437,11 +437,11 @@ int usb_driver_claim_interface(struct usb_driver *driver,
iface->condition = USB_INTERFACE_BOUND; iface->condition = USB_INTERFACE_BOUND;
/* Bound interfaces are initially active. They are /* Claimed interfaces are initially inactive (suspended). They are
* runtime-PM-enabled only if the driver has autosuspend support. * runtime-PM-enabled only if the driver has autosuspend support.
* They are sensitive to their children's power states. * They are sensitive to their children's power states.
*/ */
pm_runtime_set_active(dev); pm_runtime_set_suspended(dev);
pm_suspend_ignore_children(dev, false); pm_suspend_ignore_children(dev, false);
if (driver->supports_autosuspend) if (driver->supports_autosuspend)
pm_runtime_enable(dev); pm_runtime_enable(dev);
...@@ -1170,7 +1170,7 @@ done: ...@@ -1170,7 +1170,7 @@ done:
static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) static int usb_suspend_both(struct usb_device *udev, pm_message_t msg)
{ {
int status = 0; int status = 0;
int i = 0; int i = 0, n = 0;
struct usb_interface *intf; struct usb_interface *intf;
if (udev->state == USB_STATE_NOTATTACHED || if (udev->state == USB_STATE_NOTATTACHED ||
...@@ -1179,7 +1179,8 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) ...@@ -1179,7 +1179,8 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg)
/* Suspend all the interfaces and then udev itself */ /* Suspend all the interfaces and then udev itself */
if (udev->actconfig) { if (udev->actconfig) {
for (; i < udev->actconfig->desc.bNumInterfaces; i++) { n = udev->actconfig->desc.bNumInterfaces;
for (i = n - 1; i >= 0; --i) {
intf = udev->actconfig->interface[i]; intf = udev->actconfig->interface[i];
status = usb_suspend_interface(udev, intf, msg); status = usb_suspend_interface(udev, intf, msg);
if (status != 0) if (status != 0)
...@@ -1192,7 +1193,7 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) ...@@ -1192,7 +1193,7 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg)
/* If the suspend failed, resume interfaces that did get suspended */ /* If the suspend failed, resume interfaces that did get suspended */
if (status != 0) { if (status != 0) {
msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME);
while (--i >= 0) { while (++i < n) {
intf = udev->actconfig->interface[i]; intf = udev->actconfig->interface[i];
usb_resume_interface(udev, intf, msg, 0); usb_resume_interface(udev, intf, msg, 0);
} }
...@@ -1263,13 +1264,47 @@ static int usb_resume_both(struct usb_device *udev, pm_message_t msg) ...@@ -1263,13 +1264,47 @@ static int usb_resume_both(struct usb_device *udev, pm_message_t msg)
return status; return status;
} }
static void choose_wakeup(struct usb_device *udev, pm_message_t msg)
{
int w, i;
struct usb_interface *intf;
/* Remote wakeup is needed only when we actually go to sleep.
* For things like FREEZE and QUIESCE, if the device is already
* autosuspended then its current wakeup setting is okay.
*/
if (msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_QUIESCE) {
if (udev->state != USB_STATE_SUSPENDED)
udev->do_remote_wakeup = 0;
return;
}
/* If remote wakeup is permitted, see whether any interface drivers
* actually want it.
*/
w = 0;
if (device_may_wakeup(&udev->dev) && udev->actconfig) {
for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
intf = udev->actconfig->interface[i];
w |= intf->needs_remote_wakeup;
}
}
/* If the device is autosuspended with the wrong wakeup setting,
* autoresume now so the setting can be changed.
*/
if (udev->state == USB_STATE_SUSPENDED && w != udev->do_remote_wakeup)
pm_runtime_resume(&udev->dev);
udev->do_remote_wakeup = w;
}
/* The device lock is held by the PM core */ /* The device lock is held by the PM core */
int usb_suspend(struct device *dev, pm_message_t msg) int usb_suspend(struct device *dev, pm_message_t msg)
{ {
struct usb_device *udev = to_usb_device(dev); struct usb_device *udev = to_usb_device(dev);
do_unbind_rebind(udev, DO_UNBIND); do_unbind_rebind(udev, DO_UNBIND);
udev->do_remote_wakeup = device_may_wakeup(&udev->dev); choose_wakeup(udev, msg);
return usb_suspend_both(udev, msg); return usb_suspend_both(udev, msg);
} }
......
...@@ -543,6 +543,7 @@ static int ehci_init(struct usb_hcd *hcd) ...@@ -543,6 +543,7 @@ static int ehci_init(struct usb_hcd *hcd)
*/ */
ehci->periodic_size = DEFAULT_I_TDPS; ehci->periodic_size = DEFAULT_I_TDPS;
INIT_LIST_HEAD(&ehci->cached_itd_list); INIT_LIST_HEAD(&ehci->cached_itd_list);
INIT_LIST_HEAD(&ehci->cached_sitd_list);
if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0) if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
return retval; return retval;
......
...@@ -801,7 +801,7 @@ static int ehci_hub_control ( ...@@ -801,7 +801,7 @@ static int ehci_hub_control (
* this bit; seems too long to spin routinely... * this bit; seems too long to spin routinely...
*/ */
retval = handshake(ehci, status_reg, retval = handshake(ehci, status_reg,
PORT_RESET, 0, 750); PORT_RESET, 0, 1000);
if (retval != 0) { if (retval != 0) {
ehci_err (ehci, "port %d reset error %d\n", ehci_err (ehci, "port %d reset error %d\n",
wIndex + 1, retval); wIndex + 1, retval);
......
...@@ -136,7 +136,7 @@ static inline void qh_put (struct ehci_qh *qh) ...@@ -136,7 +136,7 @@ static inline void qh_put (struct ehci_qh *qh)
static void ehci_mem_cleanup (struct ehci_hcd *ehci) static void ehci_mem_cleanup (struct ehci_hcd *ehci)
{ {
free_cached_itd_list(ehci); free_cached_lists(ehci);
if (ehci->async) if (ehci->async)
qh_put (ehci->async); qh_put (ehci->async);
ehci->async = NULL; ehci->async = NULL;
......
...@@ -629,12 +629,14 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) ...@@ -629,12 +629,14 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
} }
snprintf(supply, sizeof(supply), "hsusb%d", i); snprintf(supply, sizeof(supply), "hsusb%d", i);
omap->regulator[i] = regulator_get(omap->dev, supply); omap->regulator[i] = regulator_get(omap->dev, supply);
if (IS_ERR(omap->regulator[i])) if (IS_ERR(omap->regulator[i])) {
omap->regulator[i] = NULL;
dev_dbg(&pdev->dev, dev_dbg(&pdev->dev,
"failed to get ehci port%d regulator\n", i); "failed to get ehci port%d regulator\n", i);
else } else {
regulator_enable(omap->regulator[i]); regulator_enable(omap->regulator[i]);
} }
}
ret = omap_start_ehc(omap, hcd); ret = omap_start_ehc(omap, hcd);
if (ret) { if (ret) {
......
...@@ -510,7 +510,7 @@ static int disable_periodic (struct ehci_hcd *ehci) ...@@ -510,7 +510,7 @@ static int disable_periodic (struct ehci_hcd *ehci)
ehci_writel(ehci, cmd, &ehci->regs->command); ehci_writel(ehci, cmd, &ehci->regs->command);
/* posted write ... */ /* posted write ... */
free_cached_itd_list(ehci); free_cached_lists(ehci);
ehci->next_uframe = -1; ehci->next_uframe = -1;
return 0; return 0;
...@@ -2139,13 +2139,27 @@ sitd_complete ( ...@@ -2139,13 +2139,27 @@ sitd_complete (
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
} }
iso_stream_put (ehci, stream); iso_stream_put (ehci, stream);
/* OK to recycle this SITD now that its completion callback ran. */
done: done:
sitd->urb = NULL; sitd->urb = NULL;
if (ehci->clock_frame != sitd->frame) {
/* OK to recycle this SITD now. */
sitd->stream = NULL; sitd->stream = NULL;
list_move(&sitd->sitd_list, &stream->free_list); list_move(&sitd->sitd_list, &stream->free_list);
iso_stream_put(ehci, stream); iso_stream_put(ehci, stream);
} else {
/* HW might remember this SITD, so we can't recycle it yet.
* Move it to a safe place until a new frame starts.
*/
list_move(&sitd->sitd_list, &ehci->cached_sitd_list);
if (stream->refcount == 2) {
/* If iso_stream_put() were called here, stream
* would be freed. Instead, just prevent reuse.
*/
stream->ep->hcpriv = NULL;
stream->ep = NULL;
}
}
return retval; return retval;
} }
...@@ -2211,9 +2225,10 @@ done: ...@@ -2211,9 +2225,10 @@ done:
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static void free_cached_itd_list(struct ehci_hcd *ehci) static void free_cached_lists(struct ehci_hcd *ehci)
{ {
struct ehci_itd *itd, *n; struct ehci_itd *itd, *n;
struct ehci_sitd *sitd, *sn;
list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) { list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) {
struct ehci_iso_stream *stream = itd->stream; struct ehci_iso_stream *stream = itd->stream;
...@@ -2221,6 +2236,13 @@ static void free_cached_itd_list(struct ehci_hcd *ehci) ...@@ -2221,6 +2236,13 @@ static void free_cached_itd_list(struct ehci_hcd *ehci)
list_move(&itd->itd_list, &stream->free_list); list_move(&itd->itd_list, &stream->free_list);
iso_stream_put(ehci, stream); iso_stream_put(ehci, stream);
} }
list_for_each_entry_safe(sitd, sn, &ehci->cached_sitd_list, sitd_list) {
struct ehci_iso_stream *stream = sitd->stream;
sitd->stream = NULL;
list_move(&sitd->sitd_list, &stream->free_list);
iso_stream_put(ehci, stream);
}
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -2247,7 +2269,7 @@ scan_periodic (struct ehci_hcd *ehci) ...@@ -2247,7 +2269,7 @@ scan_periodic (struct ehci_hcd *ehci)
clock_frame = -1; clock_frame = -1;
} }
if (ehci->clock_frame != clock_frame) { if (ehci->clock_frame != clock_frame) {
free_cached_itd_list(ehci); free_cached_lists(ehci);
ehci->clock_frame = clock_frame; ehci->clock_frame = clock_frame;
} }
clock %= mod; clock %= mod;
...@@ -2414,7 +2436,7 @@ restart: ...@@ -2414,7 +2436,7 @@ restart:
clock = now; clock = now;
clock_frame = clock >> 3; clock_frame = clock >> 3;
if (ehci->clock_frame != clock_frame) { if (ehci->clock_frame != clock_frame) {
free_cached_itd_list(ehci); free_cached_lists(ehci);
ehci->clock_frame = clock_frame; ehci->clock_frame = clock_frame;
} }
} else { } else {
......
...@@ -87,8 +87,9 @@ struct ehci_hcd { /* one per controller */ ...@@ -87,8 +87,9 @@ struct ehci_hcd { /* one per controller */
int next_uframe; /* scan periodic, start here */ int next_uframe; /* scan periodic, start here */
unsigned periodic_sched; /* periodic activity count */ unsigned periodic_sched; /* periodic activity count */
/* list of itds completed while clock_frame was still active */ /* list of itds & sitds completed while clock_frame was still active */
struct list_head cached_itd_list; struct list_head cached_itd_list;
struct list_head cached_sitd_list;
unsigned clock_frame; unsigned clock_frame;
/* per root hub port */ /* per root hub port */
...@@ -195,7 +196,7 @@ timer_action_done (struct ehci_hcd *ehci, enum ehci_timer_action action) ...@@ -195,7 +196,7 @@ timer_action_done (struct ehci_hcd *ehci, enum ehci_timer_action action)
clear_bit (action, &ehci->actions); clear_bit (action, &ehci->actions);
} }
static void free_cached_itd_list(struct ehci_hcd *ehci); static void free_cached_lists(struct ehci_hcd *ehci);
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#error "This file is DA8xx bus glue. Define CONFIG_ARCH_DAVINCI_DA8XX." #error "This file is DA8xx bus glue. Define CONFIG_ARCH_DAVINCI_DA8XX."
#endif #endif
#define CFGCHIP2 DA8XX_SYSCFG_VIRT(DA8XX_CFGCHIP2_REG) #define CFGCHIP2 DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG)
static struct clk *usb11_clk; static struct clk *usb11_clk;
static struct clk *usb20_clk; static struct clk *usb20_clk;
......
...@@ -49,6 +49,7 @@ struct usb_sevsegdev { ...@@ -49,6 +49,7 @@ struct usb_sevsegdev {
u16 textlength; u16 textlength;
u8 shadow_power; /* for PM */ u8 shadow_power; /* for PM */
u8 has_interface_pm;
}; };
/* sysfs_streq can't replace this completely /* sysfs_streq can't replace this completely
...@@ -68,12 +69,16 @@ static void update_display_powered(struct usb_sevsegdev *mydev) ...@@ -68,12 +69,16 @@ static void update_display_powered(struct usb_sevsegdev *mydev)
{ {
int rc; int rc;
if (!mydev->shadow_power && mydev->powered) { if (mydev->powered && !mydev->has_interface_pm) {
rc = usb_autopm_get_interface(mydev->intf); rc = usb_autopm_get_interface(mydev->intf);
if (rc < 0) if (rc < 0)
return; return;
mydev->has_interface_pm = 1;
} }
if (mydev->shadow_power != 1)
return;
rc = usb_control_msg(mydev->udev, rc = usb_control_msg(mydev->udev,
usb_sndctrlpipe(mydev->udev, 0), usb_sndctrlpipe(mydev->udev, 0),
0x12, 0x12,
...@@ -86,8 +91,10 @@ static void update_display_powered(struct usb_sevsegdev *mydev) ...@@ -86,8 +91,10 @@ static void update_display_powered(struct usb_sevsegdev *mydev)
if (rc < 0) if (rc < 0)
dev_dbg(&mydev->udev->dev, "power retval = %d\n", rc); dev_dbg(&mydev->udev->dev, "power retval = %d\n", rc);
if (mydev->shadow_power && !mydev->powered) if (!mydev->powered && mydev->has_interface_pm) {
usb_autopm_put_interface(mydev->intf); usb_autopm_put_interface(mydev->intf);
mydev->has_interface_pm = 0;
}
} }
static void update_display_mode(struct usb_sevsegdev *mydev) static void update_display_mode(struct usb_sevsegdev *mydev)
...@@ -351,6 +358,10 @@ static int sevseg_probe(struct usb_interface *interface, ...@@ -351,6 +358,10 @@ static int sevseg_probe(struct usb_interface *interface,
mydev->intf = interface; mydev->intf = interface;
usb_set_intfdata(interface, mydev); usb_set_intfdata(interface, mydev);
/* PM */
mydev->shadow_power = 1; /* currently active */
mydev->has_interface_pm = 0; /* have not issued autopm_get */
/*set defaults */ /*set defaults */
mydev->textmode = 0x02; /* ascii mode */ mydev->textmode = 0x02; /* ascii mode */
mydev->mode_msb = 0x06; /* 6 characters */ mydev->mode_msb = 0x06; /* 6 characters */
......
...@@ -97,6 +97,7 @@ static const struct usb_device_id id_table[] = { ...@@ -97,6 +97,7 @@ static const struct usb_device_id id_table[] = {
{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
{ USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
......
...@@ -134,3 +134,7 @@ ...@@ -134,3 +134,7 @@
/* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */ /* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */
#define SANWA_VENDOR_ID 0x11ad #define SANWA_VENDOR_ID 0x11ad
#define SANWA_PRODUCT_ID 0x0001 #define SANWA_PRODUCT_ID 0x0001
/* ADLINK ND-6530 RS232,RS485 and RS422 adapter */
#define ADLINK_VENDOR_ID 0x0b63
#define ADLINK_ND6530_PRODUCT_ID 0x6530
...@@ -42,6 +42,14 @@ ...@@ -42,6 +42,14 @@
#define CMOTECH_PRODUCT_CDU550 0x5553 #define CMOTECH_PRODUCT_CDU550 0x5553
#define CMOTECH_PRODUCT_CDX650 0x6512 #define CMOTECH_PRODUCT_CDX650 0x6512
/* LG devices */
#define LG_VENDOR_ID 0x1004
#define LG_PRODUCT_VX4400_6000 0x6000 /* VX4400/VX6000/Rumor */
/* Sanyo devices */
#define SANYO_VENDOR_ID 0x0474
#define SANYO_PRODUCT_KATANA_LX 0x0754 /* SCP-3800 (Katana LX) */
static struct usb_device_id id_table[] = { static struct usb_device_id id_table[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5740, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5740, 0xff, 0x00, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5750, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5750, 0xff, 0x00, 0x00) },
...@@ -51,6 +59,8 @@ static struct usb_device_id id_table[] = { ...@@ -51,6 +59,8 @@ static struct usb_device_id id_table[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_UM175_ALLTEL, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_UM175_ALLTEL, 0xff, 0x00, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU550, 0xff, 0xff, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU550, 0xff, 0xff, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDX650, 0xff, 0xff, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDX650, 0xff, 0xff, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) },
{ }, { },
}; };
MODULE_DEVICE_TABLE(usb, id_table); MODULE_DEVICE_TABLE(usb, id_table);
......
...@@ -230,6 +230,7 @@ static const struct sierra_iface_info direct_ip_interface_blacklist = { ...@@ -230,6 +230,7 @@ static const struct sierra_iface_info direct_ip_interface_blacklist = {
static const struct usb_device_id id_table[] = { static const struct usb_device_id id_table[] = {
{ USB_DEVICE(0x0F3D, 0x0112) }, /* Airprime/Sierra PC 5220 */ { USB_DEVICE(0x0F3D, 0x0112) }, /* Airprime/Sierra PC 5220 */
{ USB_DEVICE(0x03F0, 0x1B1D) }, /* HP ev2200 a.k.a MC5720 */ { USB_DEVICE(0x03F0, 0x1B1D) }, /* HP ev2200 a.k.a MC5720 */
{ USB_DEVICE(0x03F0, 0x211D) }, /* HP ev2210 a.k.a MC5725 */
{ USB_DEVICE(0x03F0, 0x1E1D) }, /* HP hs2300 a.k.a MC8775 */ { USB_DEVICE(0x03F0, 0x1E1D) }, /* HP hs2300 a.k.a MC8775 */
{ USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
......
...@@ -172,7 +172,7 @@ static unsigned int product_5052_count; ...@@ -172,7 +172,7 @@ static unsigned int product_5052_count;
/* the array dimension is the number of default entries plus */ /* the array dimension is the number of default entries plus */
/* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */ /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */
/* null entry */ /* null entry */
static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = { static struct usb_device_id ti_id_table_3410[13+TI_EXTRA_VID_PID_COUNT+1] = {
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
...@@ -180,6 +180,9 @@ static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = { ...@@ -180,6 +180,9 @@ static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = {
{ USB_DEVICE(MTS_VENDOR_ID, MTS_CDMA_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_CDMA_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_EDGE_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_EDGE_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_MT9234MU_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_MT9234ZBA_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_MT9234ZBAOLD_PRODUCT_ID) },
{ USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
{ USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
{ USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
...@@ -192,7 +195,7 @@ static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = { ...@@ -192,7 +195,7 @@ static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
{ USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
}; };
static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = { static struct usb_device_id ti_id_table_combined[17+2*TI_EXTRA_VID_PID_COUNT+1] = {
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
...@@ -200,6 +203,9 @@ static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] ...@@ -200,6 +203,9 @@ static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1]
{ USB_DEVICE(MTS_VENDOR_ID, MTS_CDMA_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_CDMA_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_EDGE_PRODUCT_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_EDGE_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_MT9234MU_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_MT9234ZBA_PRODUCT_ID) },
{ USB_DEVICE(MTS_VENDOR_ID, MTS_MT9234ZBAOLD_PRODUCT_ID) },
{ USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
{ USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
{ USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
...@@ -287,6 +293,8 @@ MODULE_FIRMWARE("ti_5052.fw"); ...@@ -287,6 +293,8 @@ MODULE_FIRMWARE("ti_5052.fw");
MODULE_FIRMWARE("mts_cdma.fw"); MODULE_FIRMWARE("mts_cdma.fw");
MODULE_FIRMWARE("mts_gsm.fw"); MODULE_FIRMWARE("mts_gsm.fw");
MODULE_FIRMWARE("mts_edge.fw"); MODULE_FIRMWARE("mts_edge.fw");
MODULE_FIRMWARE("mts_mt9234mu.fw");
MODULE_FIRMWARE("mts_mt9234zba.fw");
module_param(debug, bool, S_IRUGO | S_IWUSR); module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes"); MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes");
...@@ -1687,6 +1695,7 @@ static int ti_download_firmware(struct ti_device *tdev) ...@@ -1687,6 +1695,7 @@ static int ti_download_firmware(struct ti_device *tdev)
const struct firmware *fw_p; const struct firmware *fw_p;
char buf[32]; char buf[32];
dbg("%s\n", __func__);
/* try ID specific firmware first, then try generic firmware */ /* try ID specific firmware first, then try generic firmware */
sprintf(buf, "ti_usb-v%04x-p%04x.fw", dev->descriptor.idVendor, sprintf(buf, "ti_usb-v%04x-p%04x.fw", dev->descriptor.idVendor,
dev->descriptor.idProduct); dev->descriptor.idProduct);
...@@ -1703,7 +1712,15 @@ static int ti_download_firmware(struct ti_device *tdev) ...@@ -1703,7 +1712,15 @@ static int ti_download_firmware(struct ti_device *tdev)
case MTS_EDGE_PRODUCT_ID: case MTS_EDGE_PRODUCT_ID:
strcpy(buf, "mts_edge.fw"); strcpy(buf, "mts_edge.fw");
break; break;
} case MTS_MT9234MU_PRODUCT_ID:
strcpy(buf, "mts_mt9234mu.fw");
break;
case MTS_MT9234ZBA_PRODUCT_ID:
strcpy(buf, "mts_mt9234zba.fw");
break;
case MTS_MT9234ZBAOLD_PRODUCT_ID:
strcpy(buf, "mts_mt9234zba.fw");
break; }
} }
if (buf[0] == '\0') { if (buf[0] == '\0') {
if (tdev->td_is_3410) if (tdev->td_is_3410)
...@@ -1718,7 +1735,7 @@ static int ti_download_firmware(struct ti_device *tdev) ...@@ -1718,7 +1735,7 @@ static int ti_download_firmware(struct ti_device *tdev)
return -ENOENT; return -ENOENT;
} }
if (fw_p->size > TI_FIRMWARE_BUF_SIZE) { if (fw_p->size > TI_FIRMWARE_BUF_SIZE) {
dev_err(&dev->dev, "%s - firmware too large\n", __func__); dev_err(&dev->dev, "%s - firmware too large %d \n", __func__, fw_p->size);
return -ENOENT; return -ENOENT;
} }
...@@ -1730,6 +1747,7 @@ static int ti_download_firmware(struct ti_device *tdev) ...@@ -1730,6 +1747,7 @@ static int ti_download_firmware(struct ti_device *tdev)
status = ti_do_download(dev, pipe, buffer, fw_p->size); status = ti_do_download(dev, pipe, buffer, fw_p->size);
kfree(buffer); kfree(buffer);
} else { } else {
dbg("%s ENOMEM\n", __func__);
status = -ENOMEM; status = -ENOMEM;
} }
release_firmware(fw_p); release_firmware(fw_p);
......
...@@ -45,6 +45,9 @@ ...@@ -45,6 +45,9 @@
#define MTS_CDMA_PRODUCT_ID 0xF110 #define MTS_CDMA_PRODUCT_ID 0xF110
#define MTS_GSM_PRODUCT_ID 0xF111 #define MTS_GSM_PRODUCT_ID 0xF111
#define MTS_EDGE_PRODUCT_ID 0xF112 #define MTS_EDGE_PRODUCT_ID 0xF112
#define MTS_MT9234MU_PRODUCT_ID 0xF114
#define MTS_MT9234ZBA_PRODUCT_ID 0xF115
#define MTS_MT9234ZBAOLD_PRODUCT_ID 0x0319
/* Commands */ /* Commands */
#define TI_GET_VERSION 0x01 #define TI_GET_VERSION 0x01
......
...@@ -438,7 +438,7 @@ static void __wusbhc_keep_alive(struct wusbhc *wusbhc) ...@@ -438,7 +438,7 @@ static void __wusbhc_keep_alive(struct wusbhc *wusbhc)
old_keep_alives = ie->hdr.bLength - sizeof(ie->hdr); old_keep_alives = ie->hdr.bLength - sizeof(ie->hdr);
keep_alives = 0; keep_alives = 0;
for (cnt = 0; for (cnt = 0;
keep_alives <= WUIE_ELT_MAX && cnt < wusbhc->ports_max; keep_alives < WUIE_ELT_MAX && cnt < wusbhc->ports_max;
cnt++) { cnt++) {
unsigned tt = msecs_to_jiffies(wusbhc->trust_timeout); unsigned tt = msecs_to_jiffies(wusbhc->trust_timeout);
......
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