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-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to