usb/153929: commit references a PR
dfilter service
dfilter at FreeBSD.ORG
Thu Feb 3 18:30:12 UTC 2011
The following reply was made to PR usb/153929; it has been noted by GNATS.
From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:
Subject: Re: usb/153929: commit references a PR
Date: Thu, 3 Feb 2011 18:26:00 +0000 (UTC)
Author: hselasky
Date: Thu Feb 3 18:25:55 2011
New Revision: 218229
URL: http://svn.freebsd.org/changeset/base/218229
Log:
Fix for detection of MTK 3329 GPS USB devices.
Submitted by: Mykhaylo Yehorov
PR: usb/153929
Approved by: thompsa (mentor)
Modified:
head/sys/dev/usb/serial/umodem.c
head/sys/dev/usb/usbdevs
Modified: head/sys/dev/usb/serial/umodem.c
==============================================================================
--- head/sys/dev/usb/serial/umodem.c Thu Feb 3 18:07:05 2011 (r218228)
+++ head/sys/dev/usb/serial/umodem.c Thu Feb 3 18:25:55 2011 (r218229)
@@ -197,6 +197,8 @@ static void *umodem_get_desc(struct usb_
static usb_error_t umodem_set_comm_feature(struct usb_device *, uint8_t,
uint16_t, uint16_t);
static void umodem_poll(struct ucom_softc *ucom);
+static void umodem_find_data_iface(struct usb_attach_arg *uaa,
+ uint8_t, uint8_t *, uint8_t *);
static const struct usb_config umodem_config[UMODEM_N_TRANSFER] = {
@@ -311,13 +313,30 @@ umodem_attach(device_t dev)
0 - 1, UDESCSUB_CDC_UNION, 0 - 1);
if ((cud == NULL) || (cud->bLength < sizeof(*cud))) {
- device_printf(dev, "Missing descriptor. "
+ DPRINTF("Missing descriptor. "
"Assuming data interface is next.\n");
- if (sc->sc_ctrl_iface_no == 0xFF)
+ if (sc->sc_ctrl_iface_no == 0xFF) {
goto detach;
- else
- sc->sc_data_iface_no =
- sc->sc_ctrl_iface_no + 1;
+ } else {
+ uint8_t class_match = 0;
+
+ /* set default interface number */
+ sc->sc_data_iface_no = 0xFF;
+
+ /* try to find the data interface backwards */
+ umodem_find_data_iface(uaa,
+ uaa->info.bIfaceIndex - 1,
+ &sc->sc_data_iface_no, &class_match);
+
+ /* try to find the data interface forwards */
+ umodem_find_data_iface(uaa,
+ uaa->info.bIfaceIndex + 1,
+ &sc->sc_data_iface_no, &class_match);
+
+ /* check if nothing was found */
+ if (sc->sc_data_iface_no == 0xFF)
+ goto detach;
+ }
} else {
sc->sc_data_iface_no = cud->bSlaveInterface[0];
}
@@ -398,6 +417,36 @@ detach:
}
static void
+umodem_find_data_iface(struct usb_attach_arg *uaa,
+ uint8_t iface_index, uint8_t *p_data_no, uint8_t *p_match_class)
+{
+ struct usb_interface_descriptor *id;
+ struct usb_interface *iface;
+
+ iface = usbd_get_iface(uaa->device, iface_index);
+
+ /* check for end of interfaces */
+ if (iface == NULL)
+ return;
+
+ id = usbd_get_interface_descriptor(iface);
+
+ /* check for non-matching interface class */
+ if (id->bInterfaceClass != UICLASS_CDC_DATA ||
+ id->bInterfaceSubClass != UISUBCLASS_DATA) {
+ /* if we got a class match then return */
+ if (*p_match_class)
+ return;
+ } else {
+ *p_match_class = 1;
+ }
+
+ DPRINTFN(11, "Match at index %u\n", iface_index);
+
+ *p_data_no = id->bInterfaceNumber;
+}
+
+static void
umodem_start_read(struct ucom_softc *ucom)
{
struct umodem_softc *sc = ucom->sc_parent;
Modified: head/sys/dev/usb/usbdevs
==============================================================================
--- head/sys/dev/usb/usbdevs Thu Feb 3 18:07:05 2011 (r218228)
+++ head/sys/dev/usb/usbdevs Thu Feb 3 18:25:55 2011 (r218229)
@@ -536,6 +536,7 @@ vendor SPEEDDRAGON 0x0e55 Speed Dragon M
vendor HAWKING 0x0e66 Hawking
vendor FOSSIL 0x0e67 Fossil, Inc
vendor GMATE 0x0e7e G.Mate, Inc
+vendor MEDIATEK 0x0e8d MediaTek, Inc.
vendor OTI 0x0ea0 Ours Technology
vendor YISO 0x0eab Yiso Wireless Co.
vendor PILOTECH 0x0eaf Pilotech
@@ -2120,6 +2121,9 @@ product MCT DU_H3SP_USB232 0x0200 D-Link
product MCT USB232 0x0210 USB-232 Interface
product MCT SITECOM_USB232 0x0230 Sitecom USB-232 Products
+/* MediaTek, Inc. */
+product MEDIATEK MTK3329 0x3329 MTK II GPS Receiver
+
/* Meizu Electronics */
product MEIZU M6_SL 0x0140 MiniPlayer M6 (SL)
_______________________________________________
svn-src-all at freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
More information about the freebsd-usb
mailing list