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
This commit is contained in:
commit
18688218d1
@ -1312,9 +1312,9 @@ static int processcompl(struct async *as, void __user * __user *arg)
|
||||
void __user *addr = as->userurb;
|
||||
unsigned int i;
|
||||
|
||||
if (as->userbuffer)
|
||||
if (as->userbuffer && urb->actual_length)
|
||||
if (copy_to_user(as->userbuffer, urb->transfer_buffer,
|
||||
urb->transfer_buffer_length))
|
||||
urb->actual_length))
|
||||
goto err_out;
|
||||
if (put_user(as->status, &userurb->status))
|
||||
goto err_out;
|
||||
@ -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))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
free_async(as);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@ -1371,8 +1368,11 @@ static struct async *reap_as(struct dev_state *ps)
|
||||
static int proc_reapurb(struct dev_state *ps, void __user *arg)
|
||||
{
|
||||
struct async *as = reap_as(ps);
|
||||
if (as)
|
||||
return processcompl(as, (void __user * __user *)arg);
|
||||
if (as) {
|
||||
int retval = processcompl(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
return retval;
|
||||
}
|
||||
if (signal_pending(current))
|
||||
return -EINTR;
|
||||
return -EIO;
|
||||
@ -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)
|
||||
{
|
||||
int retval;
|
||||
struct async *as;
|
||||
|
||||
if (!(as = async_getcompleted(ps)))
|
||||
return -EAGAIN;
|
||||
return processcompl(as, (void __user * __user *)arg);
|
||||
as = async_getcompleted(ps);
|
||||
retval = -EAGAIN;
|
||||
if (as) {
|
||||
retval = processcompl(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
@ -1475,9 +1480,9 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
|
||||
void __user *addr = as->userurb;
|
||||
unsigned int i;
|
||||
|
||||
if (as->userbuffer)
|
||||
if (as->userbuffer && urb->actual_length)
|
||||
if (copy_to_user(as->userbuffer, urb->transfer_buffer,
|
||||
urb->transfer_buffer_length))
|
||||
urb->actual_length))
|
||||
return -EFAULT;
|
||||
if (put_user(as->status, &userurb->status))
|
||||
return -EFAULT;
|
||||
@ -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))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
@ -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)
|
||||
{
|
||||
struct async *as = reap_as(ps);
|
||||
if (as)
|
||||
return processcompl_compat(as, (void __user * __user *)arg);
|
||||
if (as) {
|
||||
int retval = processcompl_compat(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
return retval;
|
||||
}
|
||||
if (signal_pending(current))
|
||||
return -EINTR;
|
||||
return -EIO;
|
||||
@ -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)
|
||||
{
|
||||
int retval;
|
||||
struct async *as;
|
||||
|
||||
if (!(as = async_getcompleted(ps)))
|
||||
return -EAGAIN;
|
||||
return processcompl_compat(as, (void __user * __user *)arg);
|
||||
retval = -EAGAIN;
|
||||
as = async_getcompleted(ps);
|
||||
if (as) {
|
||||
retval = processcompl_compat(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
|
@ -358,7 +358,7 @@ done:
|
||||
* b15: bmType (0 == data)
|
||||
*/
|
||||
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 */
|
||||
if (padlen)
|
||||
@ -464,7 +464,6 @@ static int eem_unwrap(struct gether *port,
|
||||
}
|
||||
|
||||
/* validate CRC */
|
||||
crc = get_unaligned_le32(skb->data + len - ETH_FCS_LEN);
|
||||
if (header & BIT(14)) {
|
||||
crc = get_unaligned_le32(skb->data + len
|
||||
- ETH_FCS_LEN);
|
||||
|
@ -29,7 +29,7 @@
|
||||
#if defined USB_ETH_RNDIS
|
||||
# undef USB_ETH_RNDIS
|
||||
#endif
|
||||
#ifdef CONFIG_USB_ETH_RNDIS
|
||||
#ifdef CONFIG_USB_G_MULTI_RNDIS
|
||||
# define USB_ETH_RNDIS y
|
||||
#endif
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <linux/usb/ch9.h>
|
||||
#include <linux/usb/gadget.h>
|
||||
|
@ -2582,6 +2582,7 @@ err:
|
||||
hsotg->gadget.dev.driver = NULL;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_register_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
{
|
||||
|
@ -196,7 +196,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
|
||||
if (hostpc_reg) {
|
||||
u32 t3;
|
||||
|
||||
spin_unlock_irq(&ehci->lock);
|
||||
msleep(5);/* 5ms for HCD enter low pwr mode */
|
||||
spin_lock_irq(&ehci->lock);
|
||||
t3 = ehci_readl(ehci, hostpc_reg);
|
||||
ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg);
|
||||
t3 = ehci_readl(ehci, hostpc_reg);
|
||||
@ -904,17 +906,18 @@ static int ehci_hub_control (
|
||||
if ((temp & PORT_PE) == 0
|
||||
|| (temp & PORT_RESET) != 0)
|
||||
goto error;
|
||||
ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
|
||||
|
||||
/* After above check the port must be connected.
|
||||
* Set appropriate bit thus could put phy into low power
|
||||
* 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) {
|
||||
temp &= ~PORT_WKCONN_E;
|
||||
temp |= (PORT_WKDISC_E | PORT_WKOC_E);
|
||||
ehci_writel(ehci, temp | PORT_SUSPEND,
|
||||
status_reg);
|
||||
spin_unlock_irqrestore(&ehci->lock, flags);
|
||||
msleep(5);/* 5ms for HCD enter low pwr mode */
|
||||
spin_lock_irqsave(&ehci->lock, flags);
|
||||
temp1 = ehci_readl(ehci, hostpc_reg);
|
||||
ehci_writel(ehci, temp1 | HOSTPC_PHCD,
|
||||
hostpc_reg);
|
||||
|
@ -105,7 +105,7 @@ void fhci_ep0_free(struct fhci_usb *usb)
|
||||
if (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);
|
||||
for (; size; size--) {
|
||||
struct packet *pkt = cq_get(&ep->conf_frame_Q);
|
||||
@ -115,7 +115,7 @@ void fhci_ep0_free(struct fhci_usb *usb)
|
||||
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);
|
||||
for (; size; size--) {
|
||||
struct packet *pkt = cq_get(&ep->empty_frame_Q);
|
||||
@ -125,7 +125,7 @@ void fhci_ep0_free(struct fhci_usb *usb)
|
||||
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);
|
||||
for (; size; size--) {
|
||||
u8 *buff = cq_get(&ep->dummy_packets_Q);
|
||||
|
@ -3245,6 +3245,7 @@ static struct usb_device_id sisusb_table [] = {
|
||||
{ USB_DEVICE(0x0711, 0x0902) },
|
||||
{ USB_DEVICE(0x0711, 0x0903) },
|
||||
{ USB_DEVICE(0x0711, 0x0918) },
|
||||
{ USB_DEVICE(0x0711, 0x0920) },
|
||||
{ USB_DEVICE(0x182d, 0x021c) },
|
||||
{ USB_DEVICE(0x182d, 0x0269) },
|
||||
{ }
|
||||
|
@ -44,6 +44,7 @@ config ISP1301_OMAP
|
||||
config USB_ULPI
|
||||
bool "Generic ULPI Transceiver Driver"
|
||||
depends on ARM
|
||||
select USB_OTG_UTILS
|
||||
help
|
||||
Enable this to support ULPI connected USB OTG transceivers which
|
||||
are likely found on embedded boards.
|
||||
|
@ -50,7 +50,7 @@
|
||||
* Version Information
|
||||
*/
|
||||
#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"
|
||||
|
||||
static int debug;
|
||||
@ -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 [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_CANUSB_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_1_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
|
||||
@ -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_PROD_PID) },
|
||||
/*
|
||||
* Due to many user requests for multiple ELV devices we enable
|
||||
* them by default.
|
||||
* ELV devices:
|
||||
*/
|
||||
{ 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_PPS7330_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
|
||||
@ -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_RFP500_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_WS444PC_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_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_MASTERDEVEL2_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
|
||||
@ -697,6 +715,7 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_REU_TINY_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_DUSB_PID) },
|
||||
{ USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
|
||||
|
@ -38,6 +38,8 @@
|
||||
/* www.candapter.com Ewert Energy Systems CANdapter device */
|
||||
#define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */
|
||||
|
||||
#define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */
|
||||
|
||||
/* OOCDlink by Joern Kaipf <joernk@web.de>
|
||||
* (http://www.joernonline.de/dw/doku.php?id=start&idx=projects:oocdlink) */
|
||||
#define FTDI_OOCDLINK_PID 0xbaf8 /* Amontec JTAGkey */
|
||||
@ -161,22 +163,37 @@
|
||||
/*
|
||||
* ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
|
||||
* 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.
|
||||
* 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.
|
||||
*/
|
||||
#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_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */
|
||||
#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_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */
|
||||
#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_RFP500_PID 0xE0F3 /* HF-Leistungsmesser (RFP 500) */
|
||||
#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_WS444PC_PID 0xE0F7 /* Conrad WS 444 PC */
|
||||
#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_UDA7_PID 0xF069 /* USB-DA-Wandler (UDA 7) */
|
||||
@ -968,6 +985,7 @@
|
||||
#define PAPOUCH_VID 0x5050 /* Vendor ID */
|
||||
#define PAPOUCH_TMU_PID 0x0400 /* TMU USB Thermometer */
|
||||
#define PAPOUCH_QUIDO4x4_PID 0x0900 /* Quido 4/4 Module */
|
||||
#define PAPOUCH_AD4USB_PID 0x8003 /* AD4USB Measurement Module */
|
||||
|
||||
/*
|
||||
* Marvell SheevaPlug
|
||||
|
@ -298,6 +298,7 @@ static struct usb_device_id id_table [] = {
|
||||
{ USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
|
||||
.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,
|
||||
UNUSUAL_DEV( 0x07af, 0x0004, 0x0100, 0x0133,
|
||||
"Microtech",
|
||||
"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 ),
|
||||
|
||||
UNUSUAL_DEV( 0x07af, 0x0005, 0x0100, 0x0100,
|
||||
|
@ -124,7 +124,7 @@ extern __must_check unsigned int kfifo_out_peek(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)
|
||||
|
||||
buffer = kmalloc(size, gfp_mask);
|
||||
if (!buffer) {
|
||||
_kfifo_init(fifo, 0, 0);
|
||||
_kfifo_init(fifo, NULL, 0);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -97,6 +97,7 @@ EXPORT_SYMBOL(kfifo_alloc);
|
||||
void kfifo_free(struct kfifo *fifo)
|
||||
{
|
||||
kfree(fifo->buffer);
|
||||
_kfifo_init(fifo, NULL, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(kfifo_free);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user