提交 18688218 编写于 作者: L 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: gadget: fix EEM gadget CRC usage
  USB: otg Kconfig: let USB_OTG_UTILS select USB_ULPI option
  USB: g_multi: fix CONFIG_USB_G_MULTI_RNDIS usage
  kfifo: Don't use integer as NULL pointer
  USB: FHCI: Fix build after kfifo rework
  kfifo: Make kfifo_initialized work after kfifo_free
  USB: serial: add usbid for dell wwan card to sierra.c
  USB: SIS USB2VGA DRIVER: support KAIREN's USB VGA adaptor USB20SVGA-MB-PLUS
  USB: ehci: phy low power mode bug fixing
  USB: s3c-hsotg: Export usb_gadget_register_driver()
  USB: r8a66597-udc: Prototype IS_ERR() and PTR_ERR()
  USB: ftdi_sio: add device IDs (several ELV, one Mindstorms NXT)
  USB: storage: Remove unneeded SC/PR from unusual_devs.h
  USB: ftdi_sio: new device id for papouch AD4USB
  USB: usbfs: properly clean up the as structure on error paths
  USB: usbfs: only copy the actual data received
...@@ -1312,9 +1312,9 @@ static int processcompl(struct async *as, void __user * __user *arg) ...@@ -1312,9 +1312,9 @@ static int processcompl(struct async *as, void __user * __user *arg)
void __user *addr = as->userurb; void __user *addr = as->userurb;
unsigned int i; unsigned int i;
if (as->userbuffer) if (as->userbuffer && urb->actual_length)
if (copy_to_user(as->userbuffer, urb->transfer_buffer, if (copy_to_user(as->userbuffer, urb->transfer_buffer,
urb->transfer_buffer_length)) urb->actual_length))
goto err_out; goto err_out;
if (put_user(as->status, &userurb->status)) if (put_user(as->status, &userurb->status))
goto err_out; goto err_out;
...@@ -1334,14 +1334,11 @@ static int processcompl(struct async *as, void __user * __user *arg) ...@@ -1334,14 +1334,11 @@ static int processcompl(struct async *as, void __user * __user *arg)
} }
} }
free_async(as);
if (put_user(addr, (void __user * __user *)arg)) if (put_user(addr, (void __user * __user *)arg))
return -EFAULT; return -EFAULT;
return 0; return 0;
err_out: err_out:
free_async(as);
return -EFAULT; return -EFAULT;
} }
...@@ -1371,8 +1368,11 @@ static struct async *reap_as(struct dev_state *ps) ...@@ -1371,8 +1368,11 @@ static struct async *reap_as(struct dev_state *ps)
static int proc_reapurb(struct dev_state *ps, void __user *arg) static int proc_reapurb(struct dev_state *ps, void __user *arg)
{ {
struct async *as = reap_as(ps); struct async *as = reap_as(ps);
if (as) if (as) {
return processcompl(as, (void __user * __user *)arg); int retval = processcompl(as, (void __user * __user *)arg);
free_async(as);
return retval;
}
if (signal_pending(current)) if (signal_pending(current))
return -EINTR; return -EINTR;
return -EIO; return -EIO;
...@@ -1380,11 +1380,16 @@ static int proc_reapurb(struct dev_state *ps, void __user *arg) ...@@ -1380,11 +1380,16 @@ static int proc_reapurb(struct dev_state *ps, void __user *arg)
static int proc_reapurbnonblock(struct dev_state *ps, void __user *arg) static int proc_reapurbnonblock(struct dev_state *ps, void __user *arg)
{ {
int retval;
struct async *as; struct async *as;
if (!(as = async_getcompleted(ps))) as = async_getcompleted(ps);
return -EAGAIN; retval = -EAGAIN;
return processcompl(as, (void __user * __user *)arg); if (as) {
retval = processcompl(as, (void __user * __user *)arg);
free_async(as);
}
return retval;
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
...@@ -1475,9 +1480,9 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) ...@@ -1475,9 +1480,9 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
void __user *addr = as->userurb; void __user *addr = as->userurb;
unsigned int i; unsigned int i;
if (as->userbuffer) if (as->userbuffer && urb->actual_length)
if (copy_to_user(as->userbuffer, urb->transfer_buffer, if (copy_to_user(as->userbuffer, urb->transfer_buffer,
urb->transfer_buffer_length)) urb->actual_length))
return -EFAULT; return -EFAULT;
if (put_user(as->status, &userurb->status)) if (put_user(as->status, &userurb->status))
return -EFAULT; return -EFAULT;
...@@ -1497,7 +1502,6 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) ...@@ -1497,7 +1502,6 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
} }
} }
free_async(as);
if (put_user(ptr_to_compat(addr), (u32 __user *)arg)) if (put_user(ptr_to_compat(addr), (u32 __user *)arg))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -1506,8 +1510,11 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) ...@@ -1506,8 +1510,11 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
static int proc_reapurb_compat(struct dev_state *ps, void __user *arg) static int proc_reapurb_compat(struct dev_state *ps, void __user *arg)
{ {
struct async *as = reap_as(ps); struct async *as = reap_as(ps);
if (as) if (as) {
return processcompl_compat(as, (void __user * __user *)arg); int retval = processcompl_compat(as, (void __user * __user *)arg);
free_async(as);
return retval;
}
if (signal_pending(current)) if (signal_pending(current))
return -EINTR; return -EINTR;
return -EIO; return -EIO;
...@@ -1515,11 +1522,16 @@ static int proc_reapurb_compat(struct dev_state *ps, void __user *arg) ...@@ -1515,11 +1522,16 @@ static int proc_reapurb_compat(struct dev_state *ps, void __user *arg)
static int proc_reapurbnonblock_compat(struct dev_state *ps, void __user *arg) static int proc_reapurbnonblock_compat(struct dev_state *ps, void __user *arg)
{ {
int retval;
struct async *as; struct async *as;
if (!(as = async_getcompleted(ps))) retval = -EAGAIN;
return -EAGAIN; as = async_getcompleted(ps);
return processcompl_compat(as, (void __user * __user *)arg); if (as) {
retval = processcompl_compat(as, (void __user * __user *)arg);
free_async(as);
}
return retval;
} }
......
...@@ -358,7 +358,7 @@ done: ...@@ -358,7 +358,7 @@ done:
* b15: bmType (0 == data) * b15: bmType (0 == data)
*/ */
len = skb->len; len = skb->len;
put_unaligned_le16((len & 0x3FFF) | BIT(14), skb_push(skb, 2)); put_unaligned_le16(len & 0x3FFF, skb_push(skb, 2));
/* add a zero-length EEM packet, if needed */ /* add a zero-length EEM packet, if needed */
if (padlen) if (padlen)
...@@ -464,7 +464,6 @@ static int eem_unwrap(struct gether *port, ...@@ -464,7 +464,6 @@ static int eem_unwrap(struct gether *port,
} }
/* validate CRC */ /* validate CRC */
crc = get_unaligned_le32(skb->data + len - ETH_FCS_LEN);
if (header & BIT(14)) { if (header & BIT(14)) {
crc = get_unaligned_le32(skb->data + len crc = get_unaligned_le32(skb->data + len
- ETH_FCS_LEN); - ETH_FCS_LEN);
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#if defined USB_ETH_RNDIS #if defined USB_ETH_RNDIS
# undef USB_ETH_RNDIS # undef USB_ETH_RNDIS
#endif #endif
#ifdef CONFIG_USB_ETH_RNDIS #ifdef CONFIG_USB_G_MULTI_RNDIS
# define USB_ETH_RNDIS y # define USB_ETH_RNDIS y
#endif #endif
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/err.h>
#include <linux/usb/ch9.h> #include <linux/usb/ch9.h>
#include <linux/usb/gadget.h> #include <linux/usb/gadget.h>
......
...@@ -2582,6 +2582,7 @@ err: ...@@ -2582,6 +2582,7 @@ err:
hsotg->gadget.dev.driver = NULL; hsotg->gadget.dev.driver = NULL;
return ret; return ret;
} }
EXPORT_SYMBOL(usb_gadget_register_driver);
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
{ {
......
...@@ -196,7 +196,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) ...@@ -196,7 +196,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
if (hostpc_reg) { if (hostpc_reg) {
u32 t3; u32 t3;
spin_unlock_irq(&ehci->lock);
msleep(5);/* 5ms for HCD enter low pwr mode */ msleep(5);/* 5ms for HCD enter low pwr mode */
spin_lock_irq(&ehci->lock);
t3 = ehci_readl(ehci, hostpc_reg); t3 = ehci_readl(ehci, hostpc_reg);
ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg); ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg);
t3 = ehci_readl(ehci, hostpc_reg); t3 = ehci_readl(ehci, hostpc_reg);
...@@ -904,17 +906,18 @@ static int ehci_hub_control ( ...@@ -904,17 +906,18 @@ static int ehci_hub_control (
if ((temp & PORT_PE) == 0 if ((temp & PORT_PE) == 0
|| (temp & PORT_RESET) != 0) || (temp & PORT_RESET) != 0)
goto error; goto error;
ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
/* After above check the port must be connected. /* After above check the port must be connected.
* Set appropriate bit thus could put phy into low power * Set appropriate bit thus could put phy into low power
* mode if we have hostpc feature * mode if we have hostpc feature
*/ */
temp &= ~PORT_WKCONN_E;
temp |= PORT_WKDISC_E | PORT_WKOC_E;
ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
if (hostpc_reg) { if (hostpc_reg) {
temp &= ~PORT_WKCONN_E; spin_unlock_irqrestore(&ehci->lock, flags);
temp |= (PORT_WKDISC_E | PORT_WKOC_E);
ehci_writel(ehci, temp | PORT_SUSPEND,
status_reg);
msleep(5);/* 5ms for HCD enter low pwr mode */ msleep(5);/* 5ms for HCD enter low pwr mode */
spin_lock_irqsave(&ehci->lock, flags);
temp1 = ehci_readl(ehci, hostpc_reg); temp1 = ehci_readl(ehci, hostpc_reg);
ehci_writel(ehci, temp1 | HOSTPC_PHCD, ehci_writel(ehci, temp1 | HOSTPC_PHCD,
hostpc_reg); hostpc_reg);
......
...@@ -105,7 +105,7 @@ void fhci_ep0_free(struct fhci_usb *usb) ...@@ -105,7 +105,7 @@ void fhci_ep0_free(struct fhci_usb *usb)
if (ep->td_base) if (ep->td_base)
cpm_muram_free(cpm_muram_offset(ep->td_base)); cpm_muram_free(cpm_muram_offset(ep->td_base));
if (ep->conf_frame_Q) { if (kfifo_initialized(&ep->conf_frame_Q)) {
size = cq_howmany(&ep->conf_frame_Q); size = cq_howmany(&ep->conf_frame_Q);
for (; size; size--) { for (; size; size--) {
struct packet *pkt = cq_get(&ep->conf_frame_Q); struct packet *pkt = cq_get(&ep->conf_frame_Q);
...@@ -115,7 +115,7 @@ void fhci_ep0_free(struct fhci_usb *usb) ...@@ -115,7 +115,7 @@ void fhci_ep0_free(struct fhci_usb *usb)
cq_delete(&ep->conf_frame_Q); cq_delete(&ep->conf_frame_Q);
} }
if (ep->empty_frame_Q) { if (kfifo_initialized(&ep->empty_frame_Q)) {
size = cq_howmany(&ep->empty_frame_Q); size = cq_howmany(&ep->empty_frame_Q);
for (; size; size--) { for (; size; size--) {
struct packet *pkt = cq_get(&ep->empty_frame_Q); struct packet *pkt = cq_get(&ep->empty_frame_Q);
...@@ -125,7 +125,7 @@ void fhci_ep0_free(struct fhci_usb *usb) ...@@ -125,7 +125,7 @@ void fhci_ep0_free(struct fhci_usb *usb)
cq_delete(&ep->empty_frame_Q); cq_delete(&ep->empty_frame_Q);
} }
if (ep->dummy_packets_Q) { if (kfifo_initialized(&ep->dummy_packets_Q)) {
size = cq_howmany(&ep->dummy_packets_Q); size = cq_howmany(&ep->dummy_packets_Q);
for (; size; size--) { for (; size; size--) {
u8 *buff = cq_get(&ep->dummy_packets_Q); u8 *buff = cq_get(&ep->dummy_packets_Q);
......
...@@ -3245,6 +3245,7 @@ static struct usb_device_id sisusb_table [] = { ...@@ -3245,6 +3245,7 @@ static struct usb_device_id sisusb_table [] = {
{ USB_DEVICE(0x0711, 0x0902) }, { USB_DEVICE(0x0711, 0x0902) },
{ USB_DEVICE(0x0711, 0x0903) }, { USB_DEVICE(0x0711, 0x0903) },
{ USB_DEVICE(0x0711, 0x0918) }, { USB_DEVICE(0x0711, 0x0918) },
{ USB_DEVICE(0x0711, 0x0920) },
{ USB_DEVICE(0x182d, 0x021c) }, { USB_DEVICE(0x182d, 0x021c) },
{ USB_DEVICE(0x182d, 0x0269) }, { USB_DEVICE(0x182d, 0x0269) },
{ } { }
......
...@@ -44,6 +44,7 @@ config ISP1301_OMAP ...@@ -44,6 +44,7 @@ config ISP1301_OMAP
config USB_ULPI config USB_ULPI
bool "Generic ULPI Transceiver Driver" bool "Generic ULPI Transceiver Driver"
depends on ARM depends on ARM
select USB_OTG_UTILS
help help
Enable this to support ULPI connected USB OTG transceivers which Enable this to support ULPI connected USB OTG transceivers which
are likely found on embedded boards. are likely found on embedded boards.
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
* Version Information * Version Information
*/ */
#define DRIVER_VERSION "v1.5.0" #define DRIVER_VERSION "v1.5.0"
#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>" #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr"
#define DRIVER_DESC "USB FTDI Serial Converters Driver" #define DRIVER_DESC "USB FTDI Serial Converters Driver"
static int debug; static int debug;
...@@ -145,10 +145,15 @@ static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = { ...@@ -145,10 +145,15 @@ static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
/*
* Device ID not listed? Test via module params product/vendor or
* /sys/bus/usb/ftdi_sio/new_id, then send patch/report!
*/
static struct usb_device_id id_table_combined [] = { static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) }, { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) }, { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
...@@ -552,9 +557,16 @@ static struct usb_device_id id_table_combined [] = { ...@@ -552,9 +557,16 @@ static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
/* /*
* Due to many user requests for multiple ELV devices we enable * ELV devices:
* them by default.
*/ */
{ USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
...@@ -571,11 +583,17 @@ static struct usb_device_id id_table_combined [] = { ...@@ -571,11 +583,17 @@ static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
{ USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
{ USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
{ USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) }, { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
...@@ -697,6 +715,7 @@ static struct usb_device_id id_table_combined [] = { ...@@ -697,6 +715,7 @@ static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
{ USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) }, { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) }, { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) }, { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) }, { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
{ USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) }, { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
......
...@@ -38,6 +38,8 @@ ...@@ -38,6 +38,8 @@
/* www.candapter.com Ewert Energy Systems CANdapter device */ /* www.candapter.com Ewert Energy Systems CANdapter device */
#define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */
#define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */
/* OOCDlink by Joern Kaipf <joernk@web.de> /* OOCDlink by Joern Kaipf <joernk@web.de>
* (http://www.joernonline.de/dw/doku.php?id=start&idx=projects:oocdlink) */ * (http://www.joernonline.de/dw/doku.php?id=start&idx=projects:oocdlink) */
#define FTDI_OOCDLINK_PID 0xbaf8 /* Amontec JTAGkey */ #define FTDI_OOCDLINK_PID 0xbaf8 /* Amontec JTAGkey */
...@@ -161,22 +163,37 @@ ...@@ -161,22 +163,37 @@
/* /*
* ELV USB devices submitted by Christian Abt of ELV (www.elv.de). * ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
* All of these devices use FTDI's vendor ID (0x0403). * All of these devices use FTDI's vendor ID (0x0403).
* Further IDs taken from ELV Windows .inf file.
* *
* The previously included PID for the UO 100 module was incorrect. * The previously included PID for the UO 100 module was incorrect.
* In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58). * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58).
* *
* Armin Laeuger originally sent the PID for the UM 100 module. * Armin Laeuger originally sent the PID for the UM 100 module.
*/ */
#define FTDI_ELV_USR_PID 0xE000 /* ELV Universal-Sound-Recorder */
#define FTDI_ELV_MSM1_PID 0xE001 /* ELV Mini-Sound-Modul */
#define FTDI_ELV_KL100_PID 0xE002 /* ELV Kfz-Leistungsmesser KL 100 */
#define FTDI_ELV_WS550_PID 0xE004 /* WS 550 */
#define FTDI_ELV_EC3000_PID 0xE006 /* ENERGY CONTROL 3000 USB */
#define FTDI_ELV_WS888_PID 0xE008 /* WS 888 */
#define FTDI_ELV_TWS550_PID 0xE009 /* Technoline WS 550 */
#define FTDI_ELV_FEM_PID 0xE00A /* Funk Energie Monitor */
#define FTDI_ELV_FHZ1300PC_PID 0xE0E8 /* FHZ 1300 PC */ #define FTDI_ELV_FHZ1300PC_PID 0xE0E8 /* FHZ 1300 PC */
#define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */ #define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */
#define FTDI_ELV_HS485_PID 0xE0EA /* USB to RS-485 adapter */ #define FTDI_ELV_HS485_PID 0xE0EA /* USB to RS-485 adapter */
#define FTDI_ELV_UMS100_PID 0xE0EB /* ELV USB Master-Slave Schaltsteckdose UMS 100 */
#define FTDI_ELV_TFD128_PID 0xE0EC /* ELV Temperatur-Feuchte-Datenlogger TFD 128 */
#define FTDI_ELV_FM3RX_PID 0xE0ED /* ELV Messwertuebertragung FM3 RX */
#define FTDI_ELV_WS777_PID 0xE0EE /* Conrad WS 777 */
#define FTDI_ELV_EM1010PC_PID 0xE0EF /* Engery monitor EM 1010 PC */ #define FTDI_ELV_EM1010PC_PID 0xE0EF /* Engery monitor EM 1010 PC */
#define FTDI_ELV_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */ #define FTDI_ELV_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */
#define FTDI_ELV_EM1000DL_PID 0xE0F1 /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */ #define FTDI_ELV_EM1000DL_PID 0xE0F1 /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */
#define FTDI_ELV_PCK100_PID 0xE0F2 /* PC-Kabeltester (PCK 100) */ #define FTDI_ELV_PCK100_PID 0xE0F2 /* PC-Kabeltester (PCK 100) */
#define FTDI_ELV_RFP500_PID 0xE0F3 /* HF-Leistungsmesser (RFP 500) */ #define FTDI_ELV_RFP500_PID 0xE0F3 /* HF-Leistungsmesser (RFP 500) */
#define FTDI_ELV_FS20SIG_PID 0xE0F4 /* Signalgeber (FS 20 SIG) */ #define FTDI_ELV_FS20SIG_PID 0xE0F4 /* Signalgeber (FS 20 SIG) */
#define FTDI_ELV_UTP8_PID 0xE0F5 /* ELV UTP 8 */
#define FTDI_ELV_WS300PC_PID 0xE0F6 /* PC-Wetterstation (WS 300 PC) */ #define FTDI_ELV_WS300PC_PID 0xE0F6 /* PC-Wetterstation (WS 300 PC) */
#define FTDI_ELV_WS444PC_PID 0xE0F7 /* Conrad WS 444 PC */
#define FTDI_PHI_FISCO_PID 0xE40B /* PHI Fisco USB to Serial cable */ #define FTDI_PHI_FISCO_PID 0xE40B /* PHI Fisco USB to Serial cable */
#define FTDI_ELV_UAD8_PID 0xF068 /* USB-AD-Wandler (UAD 8) */ #define FTDI_ELV_UAD8_PID 0xF068 /* USB-AD-Wandler (UAD 8) */
#define FTDI_ELV_UDA7_PID 0xF069 /* USB-DA-Wandler (UDA 7) */ #define FTDI_ELV_UDA7_PID 0xF069 /* USB-DA-Wandler (UDA 7) */
...@@ -968,6 +985,7 @@ ...@@ -968,6 +985,7 @@
#define PAPOUCH_VID 0x5050 /* Vendor ID */ #define PAPOUCH_VID 0x5050 /* Vendor ID */
#define PAPOUCH_TMU_PID 0x0400 /* TMU USB Thermometer */ #define PAPOUCH_TMU_PID 0x0400 /* TMU USB Thermometer */
#define PAPOUCH_QUIDO4x4_PID 0x0900 /* Quido 4/4 Module */ #define PAPOUCH_QUIDO4x4_PID 0x0900 /* Quido 4/4 Module */
#define PAPOUCH_AD4USB_PID 0x8003 /* AD4USB Measurement Module */
/* /*
* Marvell SheevaPlug * Marvell SheevaPlug
......
...@@ -298,6 +298,7 @@ static struct usb_device_id id_table [] = { ...@@ -298,6 +298,7 @@ static struct usb_device_id id_table [] = {
{ USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */ { USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
}, },
{ USB_DEVICE(0x413C, 0x08133) }, /* Dell Computer Corp. Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port */
{ } { }
}; };
......
...@@ -941,7 +941,7 @@ UNUSUAL_DEV( 0x07ab, 0xfccd, 0x0000, 0x9999, ...@@ -941,7 +941,7 @@ UNUSUAL_DEV( 0x07ab, 0xfccd, 0x0000, 0x9999,
UNUSUAL_DEV( 0x07af, 0x0004, 0x0100, 0x0133, UNUSUAL_DEV( 0x07af, 0x0004, 0x0100, 0x0133,
"Microtech", "Microtech",
"USB-SCSI-DB25", "USB-SCSI-DB25",
US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, US_SC_DEVICE, US_PR_DEVICE, usb_stor_euscsi_init,
US_FL_SCM_MULT_TARG ), US_FL_SCM_MULT_TARG ),
UNUSUAL_DEV( 0x07af, 0x0005, 0x0100, 0x0100, UNUSUAL_DEV( 0x07af, 0x0005, 0x0100, 0x0100,
......
...@@ -124,7 +124,7 @@ extern __must_check unsigned int kfifo_out_peek(struct kfifo *fifo, ...@@ -124,7 +124,7 @@ extern __must_check unsigned int kfifo_out_peek(struct kfifo *fifo,
*/ */
static inline bool kfifo_initialized(struct kfifo *fifo) static inline bool kfifo_initialized(struct kfifo *fifo)
{ {
return fifo->buffer != 0; return fifo->buffer != NULL;
} }
/** /**
......
...@@ -80,7 +80,7 @@ int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask) ...@@ -80,7 +80,7 @@ int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask)
buffer = kmalloc(size, gfp_mask); buffer = kmalloc(size, gfp_mask);
if (!buffer) { if (!buffer) {
_kfifo_init(fifo, 0, 0); _kfifo_init(fifo, NULL, 0);
return -ENOMEM; return -ENOMEM;
} }
...@@ -97,6 +97,7 @@ EXPORT_SYMBOL(kfifo_alloc); ...@@ -97,6 +97,7 @@ EXPORT_SYMBOL(kfifo_alloc);
void kfifo_free(struct kfifo *fifo) void kfifo_free(struct kfifo *fifo)
{ {
kfree(fifo->buffer); kfree(fifo->buffer);
_kfifo_init(fifo, NULL, 0);
} }
EXPORT_SYMBOL(kfifo_free); EXPORT_SYMBOL(kfifo_free);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册