The following reply was made to PR usb/153929; it has been noted by GNATS.

From: Hans Petter Selasky <hsela...@c2i.net>
To: freebsd-usb@freebsd.org
Cc: Mykhaylo Yehorov <yeho...@gmail.com>,
 freebsd-gnats-sub...@freebsd.org
Subject: Re: usb/153929: The umodem driver doesn't support the MTK 3329 GPS 
chipset.
Date: Wed, 2 Feb 2011 19:35:13 +0100

 --Boundary-00=_hPaSN1ZTrNWJk0m
 Content-Type: Text/Plain;
   charset="iso-8859-15"
 Content-Transfer-Encoding: 7bit
 
 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
 
 --Boundary-00=_hPaSN1ZTrNWJk0m
 Content-Type: text/x-patch;
   charset="iso-8859-15";
   name="umodem.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
        filename="umodem.patch"
 
 === 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)
  
 
 --Boundary-00=_hPaSN1ZTrNWJk0m--
_______________________________________________
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