On Thursday 13 January 2011 14:20:08 Hans Petter Selasky wrote:
> The following reply was made to PR usb/153929; it has been noted by GNATS.
> 
> From: Hans Petter Selasky <hsela...@c2i.net>
> To: Mykhaylo Yehorov <yeho...@gmail.com>
> Cc: freebsd-gnats-sub...@freebsd.org
> Subject: Re: usb/153929: The umodem driver doesn't support the MTK 3329 GPS
> chipset. Date: Thu, 13 Jan 2011 14:12:41 +0100
> 
>  On Thursday 13 January 2011 14:07:22 Mykhaylo Yehorov wrote:
>  > These are changes for searching the closest unlocked data interface.
> 
>  OK, I will see if I can get your patch committed [with some modifications
>  which I will do] in not so long.
> 
>  --HPS

Hi Mykhaylo,

Can you verify the attached patch with your device?

--HPS
=== serial/umodem.c
==================================================================
--- serial/umodem.c	(revision 218169)
+++ serial/umodem.c	(local)
@@ -197,6 +197,8 @@
 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 @@
 		    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 @@
 }
 
 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;
=== usbdevs
==================================================================
--- usbdevs	(revision 218169)
+++ usbdevs	(local)
@@ -536,6 +536,7 @@
 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 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)
 
_______________________________________________
freebsd-usb@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "freebsd-usb-unsubscr...@freebsd.org"

Reply via email to