diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-07 01:29:17 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-07 01:29:17 +0200 |
commit | c6d6b9d1498ae1845aa19999211e8d61ec91b35f (patch) | |
tree | e12bb0a7ebc80747af3aa60f8f687db668e50744 /drivers/usb/serial/mos7840.c | |
parent | Merge tag 'pci-v3.10-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/gi... (diff) | |
parent | USB: option,zte_ev: move most ZTE CDMA devices to zte_ev (diff) | |
download | linux-c6d6b9d1498ae1845aa19999211e8d61ec91b35f.tar.xz linux-c6d6b9d1498ae1845aa19999211e8d61ec91b35f.zip |
Merge tag 'usb-3.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg Kroah-Hartman:
"Here are a number of USB bugfixes and new device ids for the 3.10-rc5
tree.
Nothing major here, a number of new device ids (and movement from the
option to the zte_ev driver of a number of ids that we had previously
gotten wrong, some xhci bugfixes, some usb-serial driver fixes that
were recently found, some host controller fixes / reverts, and a
variety of smaller other things"
* tag 'usb-3.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (29 commits)
USB: option,zte_ev: move most ZTE CDMA devices to zte_ev
USB: option: blacklist network interface on Huawei E1820
USB: whiteheat: fix broken port configuration
USB: serial: fix TIOCMIWAIT return value
USB: mos7720: fix hardware flow control
USB: keyspan: remove unused endpoint-array access
USB: keyspan: fix bogus array index
USB: zte_ev: fix broken open
USB: serial: Add Option GTM681W to qcserial device table.
USB: Serial: cypress_M8: Enable FRWD Dongle hidcom device
USB: EHCI: fix regression related to qh_refresh()
usbfs: Increase arbitrary limit for USB 3 isopkt length
USB: zte_ev: fix control-message timeouts
USB: mos7720: fix message timeouts
USB: iuu_phoenix: fix bulk-message timeout
USB: ark3116: fix control-message timeout
USB: mos7840: fix DMA to stack
USB: mos7720: fix DMA to stack
USB: visor: fix initialisation of Treo/Kyocera devices
USB: serial: fix Treo/Kyocera interrrupt-in urb context
...
Diffstat (limited to 'drivers/usb/serial/mos7840.c')
-rw-r--r-- | drivers/usb/serial/mos7840.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index a0d5ea545982..7e998081e1cd 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -2142,13 +2142,21 @@ static int mos7840_ioctl(struct tty_struct *tty, static int mos7810_check(struct usb_serial *serial) { int i, pass_count = 0; + u8 *buf; __u16 data = 0, mcr_data = 0; __u16 test_pattern = 0x55AA; + int res; + + buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL); + if (!buf) + return 0; /* failed to identify 7810 */ /* Store MCR setting */ - usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), + res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER, - &mcr_data, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); + buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); + if (res == VENDOR_READ_LENGTH) + mcr_data = *buf; for (i = 0; i < 16; i++) { /* Send the 1-bit test pattern out to MCS7810 test pin */ @@ -2158,9 +2166,12 @@ static int mos7810_check(struct usb_serial *serial) MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT); /* Read the test pattern back */ - usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), - MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, - VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); + res = usb_control_msg(serial->dev, + usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ, + MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, + VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); + if (res == VENDOR_READ_LENGTH) + data = *buf; /* If this is a MCS7810 device, both test patterns must match */ if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001) @@ -2174,6 +2185,8 @@ static int mos7810_check(struct usb_serial *serial) MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT); + kfree(buf); + if (pass_count == 16) return 1; @@ -2183,11 +2196,17 @@ static int mos7810_check(struct usb_serial *serial) static int mos7840_calc_num_ports(struct usb_serial *serial) { __u16 data = 0x00; + u8 *buf; int mos7840_num_ports; - usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), - MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, - VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); + buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL); + if (buf) { + usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), + MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, + VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); + data = *buf; + kfree(buf); + } if (serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7810 || serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7820) { |