The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/usb/serial/uipaq.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: uipaq.c,v 1.4 2006/11/16 01:33:27 christos Exp $       */
    2 /*      $OpenBSD: uipaq.c,v 1.1 2005/06/17 23:50:33 deraadt Exp $       */
    3 
    4 /*-
    5  * SPDX-License-Identifier: BSD-2-Clause-NetBSD
    6  *
    7  * Copyright (c) 2000-2005 The NetBSD Foundation, Inc.
    8  * All rights reserved.
    9  *
   10  * This code is derived from software contributed to The NetBSD Foundation
   11  * by Lennart Augustsson (lennart@augustsson.net) at
   12  * Carlstedt Research & Technology.
   13  *
   14  * Redistribution and use in source and binary forms, with or without
   15  * modification, are permitted provided that the following conditions
   16  * are met:
   17  * 1. Redistributions of source code must retain the above copyright
   18  *    notice, this list of conditions and the following disclaimer.
   19  * 2. Redistributions in binary form must reproduce the above copyright
   20  *    notice, this list of conditions and the following disclaimer in the
   21  *    documentation and/or other materials provided with the distribution.
   22  *
   23  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   24  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   25  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   26  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   27  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   33  * POSSIBILITY OF SUCH DAMAGE.
   34  */
   35 
   36 /*
   37  * iPAQ driver
   38  *
   39  * 19 July 2003:        Incorporated changes suggested by Sam Lawrance from
   40  *                      the uppc module
   41  *
   42  *
   43  * Contact isis@cs.umd.edu if you have any questions/comments about this driver
   44  */
   45 
   46 #include <sys/cdefs.h>
   47 __FBSDID("$FreeBSD$");
   48 
   49 #include <sys/stdint.h>
   50 #include <sys/stddef.h>
   51 #include <sys/param.h>
   52 #include <sys/queue.h>
   53 #include <sys/types.h>
   54 #include <sys/systm.h>
   55 #include <sys/kernel.h>
   56 #include <sys/bus.h>
   57 #include <sys/module.h>
   58 #include <sys/lock.h>
   59 #include <sys/mutex.h>
   60 #include <sys/condvar.h>
   61 #include <sys/sysctl.h>
   62 #include <sys/sx.h>
   63 #include <sys/unistd.h>
   64 #include <sys/callout.h>
   65 #include <sys/malloc.h>
   66 #include <sys/priv.h>
   67 
   68 #include <dev/usb/usb.h>
   69 #include <dev/usb/usbdi.h>
   70 #include <dev/usb/usbdi_util.h>
   71 #include <dev/usb/usb_cdc.h>
   72 #include "usbdevs.h"
   73 
   74 #define USB_DEBUG_VAR usb_debug
   75 #include <dev/usb/usb_debug.h>
   76 #include <dev/usb/usb_process.h>
   77 
   78 #include <dev/usb/serial/usb_serial.h>
   79 
   80 #define UIPAQ_CONFIG_INDEX      0       /* config number 1 */
   81 #define UIPAQ_IFACE_INDEX       0
   82 
   83 #define UIPAQ_BUF_SIZE          1024
   84 
   85 enum {
   86         UIPAQ_BULK_DT_WR,
   87         UIPAQ_BULK_DT_RD,
   88         UIPAQ_N_TRANSFER,
   89 };
   90 
   91 struct uipaq_softc {
   92         struct ucom_super_softc sc_super_ucom;
   93         struct ucom_softc sc_ucom;
   94 
   95         struct usb_xfer *sc_xfer[UIPAQ_N_TRANSFER];
   96         struct usb_device *sc_udev;
   97         struct mtx sc_mtx;
   98 
   99         uint16_t sc_line;
  100 
  101         uint8_t sc_lsr;                 /* local status register */
  102         uint8_t sc_msr;                 /* modem status register */
  103 };
  104 
  105 static device_probe_t uipaq_probe;
  106 static device_attach_t uipaq_attach;
  107 static device_detach_t uipaq_detach;
  108 static void uipaq_free_softc(struct uipaq_softc *);
  109 
  110 static usb_callback_t uipaq_write_callback;
  111 static usb_callback_t uipaq_read_callback;
  112 
  113 static void     uipaq_free(struct ucom_softc *);
  114 static void     uipaq_start_read(struct ucom_softc *);
  115 static void     uipaq_stop_read(struct ucom_softc *);
  116 static void     uipaq_start_write(struct ucom_softc *);
  117 static void     uipaq_stop_write(struct ucom_softc *);
  118 static void     uipaq_cfg_set_dtr(struct ucom_softc *, uint8_t);
  119 static void     uipaq_cfg_set_rts(struct ucom_softc *, uint8_t);
  120 static void     uipaq_cfg_set_break(struct ucom_softc *, uint8_t);
  121 static void     uipaq_poll(struct ucom_softc *ucom);
  122 
  123 static const struct usb_config uipaq_config_data[UIPAQ_N_TRANSFER] = {
  124         [UIPAQ_BULK_DT_WR] = {
  125                 .type = UE_BULK,
  126                 .endpoint = UE_ADDR_ANY,
  127                 .direction = UE_DIR_OUT,
  128                 .bufsize = UIPAQ_BUF_SIZE,
  129                 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
  130                 .callback = &uipaq_write_callback,
  131         },
  132 
  133         [UIPAQ_BULK_DT_RD] = {
  134                 .type = UE_BULK,
  135                 .endpoint = UE_ADDR_ANY,
  136                 .direction = UE_DIR_IN,
  137                 .bufsize = UIPAQ_BUF_SIZE,
  138                 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
  139                 .callback = &uipaq_read_callback,
  140         },
  141 };
  142 
  143 static const struct ucom_callback uipaq_callback = {
  144         .ucom_cfg_set_dtr = &uipaq_cfg_set_dtr,
  145         .ucom_cfg_set_rts = &uipaq_cfg_set_rts,
  146         .ucom_cfg_set_break = &uipaq_cfg_set_break,
  147         .ucom_start_read = &uipaq_start_read,
  148         .ucom_stop_read = &uipaq_stop_read,
  149         .ucom_start_write = &uipaq_start_write,
  150         .ucom_stop_write = &uipaq_stop_write,
  151         .ucom_poll = &uipaq_poll,
  152         .ucom_free = &uipaq_free,
  153 };
  154 
  155 /*
  156  * Much of this list is generated from lists of other drivers that
  157  * support the same hardware. Numeric values are used where no usbdevs
  158  * entries exist.
  159  */
  160 static const STRUCT_USB_HOST_ID uipaq_devs[] = {
  161         /* Socket USB Sync */
  162         {USB_VPI(0x0104, 0x00be, 0)},
  163         /* USB Sync 0301 */
  164         {USB_VPI(0x04ad, 0x0301, 0)},
  165         /* USB Sync 0302 */
  166         {USB_VPI(0x04ad, 0x0302, 0)},
  167         /* USB Sync 0303 */
  168         {USB_VPI(0x04ad, 0x0303, 0)},
  169         /* GPS Pocket PC USB Sync */
  170         {USB_VPI(0x04ad, 0x0306, 0)},
  171         /* HHP PDT */
  172         {USB_VPI(0x0536, 0x01a0, 0)},
  173         /* Intermec Mobile Computer */
  174         {USB_VPI(0x067e, 0x1001, 0)},
  175         /* Linkup Systems USB Sync */
  176         {USB_VPI(0x094b, 0x0001, 0)},
  177         /* BCOM USB Sync 0065 */
  178         {USB_VPI(0x0960, 0x0065, 0)},
  179         /* BCOM USB Sync 0066 */
  180         {USB_VPI(0x0960, 0x0066, 0)},
  181         /* BCOM USB Sync 0067 */
  182         {USB_VPI(0x0960, 0x0067, 0)},
  183         /* Portatec USB Sync */
  184         {USB_VPI(0x0961, 0x0010, 0)},
  185         /* Trimble GeoExplorer */
  186         {USB_VPI(0x099e, 0x0052, 0)},
  187         /* TDS Data Collector */
  188         {USB_VPI(0x099e, 0x4000, 0)},
  189         /* Motorola iDEN Smartphone */
  190         {USB_VPI(0x0c44, 0x03a2, 0)},
  191         /* Cesscom Luxian Series */
  192         {USB_VPI(0x0c8e, 0x6000, 0)},
  193         /* Motorola PowerPad Pocket PCDevice */
  194         {USB_VPI(0x0cad, 0x9001, 0)},
  195         /* Freedom Scientific USB Sync */
  196         {USB_VPI(0x0f4e, 0x0200, 0)},
  197         /* Cyberbank USB Sync */
  198         {USB_VPI(0x0f98, 0x0201, 0)},
  199         /* Wistron USB Sync */
  200         {USB_VPI(0x0fb8, 0x3001, 0)},
  201         /* Wistron USB Sync */
  202         {USB_VPI(0x0fb8, 0x3002, 0)},
  203         /* Wistron USB Sync */
  204         {USB_VPI(0x0fb8, 0x3003, 0)},
  205         /* Wistron USB Sync */
  206         {USB_VPI(0x0fb8, 0x4001, 0)},
  207         /* E-TEN USB Sync */
  208         {USB_VPI(0x1066, 0x00ce, 0)},
  209         /* E-TEN P3XX Pocket PC */
  210         {USB_VPI(0x1066, 0x0300, 0)},
  211         /* E-TEN P5XX Pocket PC */
  212         {USB_VPI(0x1066, 0x0500, 0)},
  213         /* E-TEN P6XX Pocket PC */
  214         {USB_VPI(0x1066, 0x0600, 0)},
  215         /* E-TEN P7XX Pocket PC */
  216         {USB_VPI(0x1066, 0x0700, 0)},
  217         /* Psion Teklogix Sync 753x */
  218         {USB_VPI(0x1114, 0x0001, 0)},
  219         /* Psion Teklogix Sync netBookPro */
  220         {USB_VPI(0x1114, 0x0004, 0)},
  221         /* Psion Teklogix Sync 7525 */
  222         {USB_VPI(0x1114, 0x0006, 0)},
  223         /* VES USB Sync */
  224         {USB_VPI(0x1182, 0x1388, 0)},
  225         /* Rugged Pocket PC 2003 */
  226         {USB_VPI(0x11d9, 0x1002, 0)},
  227         /* Rugged Pocket PC 2003 */
  228         {USB_VPI(0x11d9, 0x1003, 0)},
  229         /* USB Sync 03 */
  230         {USB_VPI(0x1231, 0xce01, 0)},
  231         /* USB Sync 03 */
  232         {USB_VPI(0x1231, 0xce02, 0)},
  233         /* Mio DigiWalker PPC StrongARM */
  234         {USB_VPI(0x3340, 0x011c, 0)},
  235         /* Mio DigiWalker 338 */
  236         {USB_VPI(0x3340, 0x0326, 0)},
  237         /* Mio DigiWalker 338 */
  238         {USB_VPI(0x3340, 0x0426, 0)},
  239         /* Mio DigiWalker USB Sync */
  240         {USB_VPI(0x3340, 0x043a, 0)},
  241         /* MiTAC USB Sync 528 */
  242         {USB_VPI(0x3340, 0x051c, 0)},
  243         /* Mio DigiWalker SmartPhone USB Sync */
  244         {USB_VPI(0x3340, 0x053a, 0)},
  245         /* MiTAC USB Sync */
  246         {USB_VPI(0x3340, 0x071c, 0)},
  247         /* Generic PPC StrongARM */
  248         {USB_VPI(0x3340, 0x0b1c, 0)},
  249         /* Generic PPC USB Sync */
  250         {USB_VPI(0x3340, 0x0e3a, 0)},
  251         /* Itautec USB Sync */
  252         {USB_VPI(0x3340, 0x0f1c, 0)},
  253         /* Generic SmartPhone USB Sync */
  254         {USB_VPI(0x3340, 0x0f3a, 0)},
  255         /* Itautec USB Sync */
  256         {USB_VPI(0x3340, 0x1326, 0)},
  257         /* YAKUMO USB Sync */
  258         {USB_VPI(0x3340, 0x191c, 0)},
  259         /* Vobis USB Sync */
  260         {USB_VPI(0x3340, 0x2326, 0)},
  261         /* MEDION Winodws Moble USB Sync */
  262         {USB_VPI(0x3340, 0x3326, 0)},
  263         /* Legend USB Sync */
  264         {USB_VPI(0x3708, 0x20ce, 0)},
  265         /* Lenovo USB Sync */
  266         {USB_VPI(0x3708, 0x21ce, 0)},
  267         /* Mobile Media Technology USB Sync */
  268         {USB_VPI(0x4113, 0x0210, 0)},
  269         /* Mobile Media Technology USB Sync */
  270         {USB_VPI(0x4113, 0x0211, 0)},
  271         /* Mobile Media Technology USB Sync */
  272         {USB_VPI(0x4113, 0x0400, 0)},
  273         /* Mobile Media Technology USB Sync */
  274         {USB_VPI(0x4113, 0x0410, 0)},
  275         /* Smartphone */
  276         {USB_VPI(0x4505, 0x0010, 0)},
  277         /* SAGEM Wireless Assistant */
  278         {USB_VPI(0x5e04, 0xce00, 0)},
  279         /* c10 Series */
  280         {USB_VPI(USB_VENDOR_ACER, 0x1631, 0)},
  281         /* c20 Series */
  282         {USB_VPI(USB_VENDOR_ACER, 0x1632, 0)},
  283         /* Acer n10 Handheld USB Sync */
  284         {USB_VPI(USB_VENDOR_ACER, 0x16e1, 0)},
  285         /* Acer n20 Handheld USB Sync */
  286         {USB_VPI(USB_VENDOR_ACER, 0x16e2, 0)},
  287         /* Acer n30 Handheld USB Sync */
  288         {USB_VPI(USB_VENDOR_ACER, 0x16e3, 0)},
  289         /* ASUS USB Sync */
  290         {USB_VPI(USB_VENDOR_ASUS, 0x4200, 0)},
  291         /* ASUS USB Sync */
  292         {USB_VPI(USB_VENDOR_ASUS, 0x4201, 0)},
  293         /* ASUS USB Sync */
  294         {USB_VPI(USB_VENDOR_ASUS, 0x4202, 0)},
  295         /* ASUS USB Sync */
  296         {USB_VPI(USB_VENDOR_ASUS, 0x9200, 0)},
  297         /* ASUS USB Sync */
  298         {USB_VPI(USB_VENDOR_ASUS, 0x9202, 0)},
  299         /**/
  300         {USB_VPI(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_P535, 0)},
  301         /* CASIO USB Sync 2001 */
  302         {USB_VPI(USB_VENDOR_CASIO, 0x2001, 0)},
  303         /* CASIO USB Sync 2003 */
  304         {USB_VPI(USB_VENDOR_CASIO, 0x2003, 0)},
  305         /**/
  306         {USB_VPI(USB_VENDOR_CASIO, USB_PRODUCT_CASIO_BE300, 0)},
  307         /* MyGuide 7000 XL USB Sync */
  308         {USB_VPI(USB_VENDOR_COMPAL, 0x0531, 0)},
  309         /* Compaq iPAQ USB Sync */
  310         {USB_VPI(USB_VENDOR_COMPAQ, 0x0032, 0)},
  311         /**/
  312         {USB_VPI(USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQPOCKETPC, 0)},
  313         /* Dell Axim USB Sync */
  314         {USB_VPI(USB_VENDOR_DELL, 0x4001, 0)},
  315         /* Dell Axim USB Sync */
  316         {USB_VPI(USB_VENDOR_DELL, 0x4002, 0)},
  317         /* Dell Axim USB Sync */
  318         {USB_VPI(USB_VENDOR_DELL, 0x4003, 0)},
  319         /* Dell Axim USB Sync */
  320         {USB_VPI(USB_VENDOR_DELL, 0x4004, 0)},
  321         /* Dell Axim USB Sync */
  322         {USB_VPI(USB_VENDOR_DELL, 0x4005, 0)},
  323         /* Dell Axim USB Sync */
  324         {USB_VPI(USB_VENDOR_DELL, 0x4006, 0)},
  325         /* Dell Axim USB Sync */
  326         {USB_VPI(USB_VENDOR_DELL, 0x4007, 0)},
  327         /* Dell Axim USB Sync */
  328         {USB_VPI(USB_VENDOR_DELL, 0x4008, 0)},
  329         /* Dell Axim USB Sync */
  330         {USB_VPI(USB_VENDOR_DELL, 0x4009, 0)},
  331         /* Fujitsu Siemens Computers USB Sync */
  332         {USB_VPI(USB_VENDOR_FSC, 0x1001, 0)},
  333         /* FUJITSU USB Sync */
  334         {USB_VPI(USB_VENDOR_FUJITSU, 0x1058, 0)},
  335         /* FUJITSU USB Sync */
  336         {USB_VPI(USB_VENDOR_FUJITSU, 0x1079, 0)},
  337         /* Askey USB Sync */
  338         {USB_VPI(USB_VENDOR_GIGASET, 0x0601, 0)},
  339         /* Hitachi USB Sync */
  340         {USB_VPI(USB_VENDOR_HITACHI, 0x0014, 0)},
  341         /* HP USB Sync 1612 */
  342         {USB_VPI(USB_VENDOR_HP, 0x1216, 0)},
  343         /* HP USB Sync 1620 */
  344         {USB_VPI(USB_VENDOR_HP, 0x2016, 0)},
  345         /* HP USB Sync 1621 */
  346         {USB_VPI(USB_VENDOR_HP, 0x2116, 0)},
  347         /* HP USB Sync 1622 */
  348         {USB_VPI(USB_VENDOR_HP, 0x2216, 0)},
  349         /* HP USB Sync 1630 */
  350         {USB_VPI(USB_VENDOR_HP, 0x3016, 0)},
  351         /* HP USB Sync 1631 */
  352         {USB_VPI(USB_VENDOR_HP, 0x3116, 0)},
  353         /* HP USB Sync 1632 */
  354         {USB_VPI(USB_VENDOR_HP, 0x3216, 0)},
  355         /* HP USB Sync 1640 */
  356         {USB_VPI(USB_VENDOR_HP, 0x4016, 0)},
  357         /* HP USB Sync 1641 */
  358         {USB_VPI(USB_VENDOR_HP, 0x4116, 0)},
  359         /* HP USB Sync 1642 */
  360         {USB_VPI(USB_VENDOR_HP, 0x4216, 0)},
  361         /* HP USB Sync 1650 */
  362         {USB_VPI(USB_VENDOR_HP, 0x5016, 0)},
  363         /* HP USB Sync 1651 */
  364         {USB_VPI(USB_VENDOR_HP, 0x5116, 0)},
  365         /* HP USB Sync 1652 */
  366         {USB_VPI(USB_VENDOR_HP, 0x5216, 0)},
  367         /**/
  368         {USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_2215, 0)},
  369         /**/
  370         {USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_568J, 0)},
  371         /* HTC USB Modem */
  372         {USB_VPI(USB_VENDOR_HTC, 0x00cf, 0)},
  373         /* PocketPC USB Sync */
  374         {USB_VPI(USB_VENDOR_HTC, 0x0a01, 0)},
  375         /* PocketPC USB Sync */
  376         {USB_VPI(USB_VENDOR_HTC, 0x0a02, 0)},
  377         /* PocketPC USB Sync */
  378         {USB_VPI(USB_VENDOR_HTC, 0x0a03, 0)},
  379         /* PocketPC USB Sync */
  380         {USB_VPI(USB_VENDOR_HTC, 0x0a04, 0)},
  381         /* PocketPC USB Sync */
  382         {USB_VPI(USB_VENDOR_HTC, 0x0a05, 0)},
  383         /* PocketPC USB Sync */
  384         {USB_VPI(USB_VENDOR_HTC, 0x0a06, 0)},
  385         /* PocketPC USB Sync */
  386         {USB_VPI(USB_VENDOR_HTC, 0x0a07, 0)},
  387         /* PocketPC USB Sync */
  388         {USB_VPI(USB_VENDOR_HTC, 0x0a08, 0)},
  389         /* PocketPC USB Sync */
  390         {USB_VPI(USB_VENDOR_HTC, 0x0a09, 0)},
  391         /* PocketPC USB Sync */
  392         {USB_VPI(USB_VENDOR_HTC, 0x0a0a, 0)},
  393         /* PocketPC USB Sync */
  394         {USB_VPI(USB_VENDOR_HTC, 0x0a0b, 0)},
  395         /* PocketPC USB Sync */
  396         {USB_VPI(USB_VENDOR_HTC, 0x0a0c, 0)},
  397         /* PocketPC USB Sync */
  398         {USB_VPI(USB_VENDOR_HTC, 0x0a0d, 0)},
  399         /* PocketPC USB Sync */
  400         {USB_VPI(USB_VENDOR_HTC, 0x0a0e, 0)},
  401         /* PocketPC USB Sync */
  402         {USB_VPI(USB_VENDOR_HTC, 0x0a0f, 0)},
  403         /* PocketPC USB Sync */
  404         {USB_VPI(USB_VENDOR_HTC, 0x0a10, 0)},
  405         /* PocketPC USB Sync */
  406         {USB_VPI(USB_VENDOR_HTC, 0x0a11, 0)},
  407         /* PocketPC USB Sync */
  408         {USB_VPI(USB_VENDOR_HTC, 0x0a12, 0)},
  409         /* PocketPC USB Sync */
  410         {USB_VPI(USB_VENDOR_HTC, 0x0a13, 0)},
  411         /* PocketPC USB Sync */
  412         {USB_VPI(USB_VENDOR_HTC, 0x0a14, 0)},
  413         /* PocketPC USB Sync */
  414         {USB_VPI(USB_VENDOR_HTC, 0x0a15, 0)},
  415         /* PocketPC USB Sync */
  416         {USB_VPI(USB_VENDOR_HTC, 0x0a16, 0)},
  417         /* PocketPC USB Sync */
  418         {USB_VPI(USB_VENDOR_HTC, 0x0a17, 0)},
  419         /* PocketPC USB Sync */
  420         {USB_VPI(USB_VENDOR_HTC, 0x0a18, 0)},
  421         /* PocketPC USB Sync */
  422         {USB_VPI(USB_VENDOR_HTC, 0x0a19, 0)},
  423         /* PocketPC USB Sync */
  424         {USB_VPI(USB_VENDOR_HTC, 0x0a1a, 0)},
  425         /* PocketPC USB Sync */
  426         {USB_VPI(USB_VENDOR_HTC, 0x0a1b, 0)},
  427         /* PocketPC USB Sync */
  428         {USB_VPI(USB_VENDOR_HTC, 0x0a1c, 0)},
  429         /* PocketPC USB Sync */
  430         {USB_VPI(USB_VENDOR_HTC, 0x0a1d, 0)},
  431         /* PocketPC USB Sync */
  432         {USB_VPI(USB_VENDOR_HTC, 0x0a1e, 0)},
  433         /* PocketPC USB Sync */
  434         {USB_VPI(USB_VENDOR_HTC, 0x0a1f, 0)},
  435         /* PocketPC USB Sync */
  436         {USB_VPI(USB_VENDOR_HTC, 0x0a20, 0)},
  437         /* PocketPC USB Sync */
  438         {USB_VPI(USB_VENDOR_HTC, 0x0a21, 0)},
  439         /* PocketPC USB Sync */
  440         {USB_VPI(USB_VENDOR_HTC, 0x0a22, 0)},
  441         /* PocketPC USB Sync */
  442         {USB_VPI(USB_VENDOR_HTC, 0x0a23, 0)},
  443         /* PocketPC USB Sync */
  444         {USB_VPI(USB_VENDOR_HTC, 0x0a24, 0)},
  445         /* PocketPC USB Sync */
  446         {USB_VPI(USB_VENDOR_HTC, 0x0a25, 0)},
  447         /* PocketPC USB Sync */
  448         {USB_VPI(USB_VENDOR_HTC, 0x0a26, 0)},
  449         /* PocketPC USB Sync */
  450         {USB_VPI(USB_VENDOR_HTC, 0x0a27, 0)},
  451         /* PocketPC USB Sync */
  452         {USB_VPI(USB_VENDOR_HTC, 0x0a28, 0)},
  453         /* PocketPC USB Sync */
  454         {USB_VPI(USB_VENDOR_HTC, 0x0a29, 0)},
  455         /* PocketPC USB Sync */
  456         {USB_VPI(USB_VENDOR_HTC, 0x0a2a, 0)},
  457         /* PocketPC USB Sync */
  458         {USB_VPI(USB_VENDOR_HTC, 0x0a2b, 0)},
  459         /* PocketPC USB Sync */
  460         {USB_VPI(USB_VENDOR_HTC, 0x0a2c, 0)},
  461         /* PocketPC USB Sync */
  462         {USB_VPI(USB_VENDOR_HTC, 0x0a2d, 0)},
  463         /* PocketPC USB Sync */
  464         {USB_VPI(USB_VENDOR_HTC, 0x0a2e, 0)},
  465         /* PocketPC USB Sync */
  466         {USB_VPI(USB_VENDOR_HTC, 0x0a2f, 0)},
  467         /* PocketPC USB Sync */
  468         {USB_VPI(USB_VENDOR_HTC, 0x0a30, 0)},
  469         /* PocketPC USB Sync */
  470         {USB_VPI(USB_VENDOR_HTC, 0x0a31, 0)},
  471         /* PocketPC USB Sync */
  472         {USB_VPI(USB_VENDOR_HTC, 0x0a32, 0)},
  473         /* PocketPC USB Sync */
  474         {USB_VPI(USB_VENDOR_HTC, 0x0a33, 0)},
  475         /* PocketPC USB Sync */
  476         {USB_VPI(USB_VENDOR_HTC, 0x0a34, 0)},
  477         /* PocketPC USB Sync */
  478         {USB_VPI(USB_VENDOR_HTC, 0x0a35, 0)},
  479         /* PocketPC USB Sync */
  480         {USB_VPI(USB_VENDOR_HTC, 0x0a36, 0)},
  481         /* PocketPC USB Sync */
  482         {USB_VPI(USB_VENDOR_HTC, 0x0a37, 0)},
  483         /* PocketPC USB Sync */
  484         {USB_VPI(USB_VENDOR_HTC, 0x0a38, 0)},
  485         /* PocketPC USB Sync */
  486         {USB_VPI(USB_VENDOR_HTC, 0x0a39, 0)},
  487         /* PocketPC USB Sync */
  488         {USB_VPI(USB_VENDOR_HTC, 0x0a3a, 0)},
  489         /* PocketPC USB Sync */
  490         {USB_VPI(USB_VENDOR_HTC, 0x0a3b, 0)},
  491         /* PocketPC USB Sync */
  492         {USB_VPI(USB_VENDOR_HTC, 0x0a3c, 0)},
  493         /* PocketPC USB Sync */
  494         {USB_VPI(USB_VENDOR_HTC, 0x0a3d, 0)},
  495         /* PocketPC USB Sync */
  496         {USB_VPI(USB_VENDOR_HTC, 0x0a3e, 0)},
  497         /* PocketPC USB Sync */
  498         {USB_VPI(USB_VENDOR_HTC, 0x0a3f, 0)},
  499         /* PocketPC USB Sync */
  500         {USB_VPI(USB_VENDOR_HTC, 0x0a40, 0)},
  501         /* PocketPC USB Sync */
  502         {USB_VPI(USB_VENDOR_HTC, 0x0a41, 0)},
  503         /* PocketPC USB Sync */
  504         {USB_VPI(USB_VENDOR_HTC, 0x0a42, 0)},
  505         /* PocketPC USB Sync */
  506         {USB_VPI(USB_VENDOR_HTC, 0x0a43, 0)},
  507         /* PocketPC USB Sync */
  508         {USB_VPI(USB_VENDOR_HTC, 0x0a44, 0)},
  509         /* PocketPC USB Sync */
  510         {USB_VPI(USB_VENDOR_HTC, 0x0a45, 0)},
  511         /* PocketPC USB Sync */
  512         {USB_VPI(USB_VENDOR_HTC, 0x0a46, 0)},
  513         /* PocketPC USB Sync */
  514         {USB_VPI(USB_VENDOR_HTC, 0x0a47, 0)},
  515         /* PocketPC USB Sync */
  516         {USB_VPI(USB_VENDOR_HTC, 0x0a48, 0)},
  517         /* PocketPC USB Sync */
  518         {USB_VPI(USB_VENDOR_HTC, 0x0a49, 0)},
  519         /* PocketPC USB Sync */
  520         {USB_VPI(USB_VENDOR_HTC, 0x0a4a, 0)},
  521         /* PocketPC USB Sync */
  522         {USB_VPI(USB_VENDOR_HTC, 0x0a4b, 0)},
  523         /* PocketPC USB Sync */
  524         {USB_VPI(USB_VENDOR_HTC, 0x0a4c, 0)},
  525         /* PocketPC USB Sync */
  526         {USB_VPI(USB_VENDOR_HTC, 0x0a4d, 0)},
  527         /* PocketPC USB Sync */
  528         {USB_VPI(USB_VENDOR_HTC, 0x0a4e, 0)},
  529         /* PocketPC USB Sync */
  530         {USB_VPI(USB_VENDOR_HTC, 0x0a4f, 0)},
  531         /* HTC SmartPhone USB Sync */
  532         {USB_VPI(USB_VENDOR_HTC, 0x0a50, 0)},
  533         /* SmartPhone USB Sync */
  534         {USB_VPI(USB_VENDOR_HTC, 0x0a52, 0)},
  535         /* SmartPhone USB Sync */
  536         {USB_VPI(USB_VENDOR_HTC, 0x0a53, 0)},
  537         /* SmartPhone USB Sync */
  538         {USB_VPI(USB_VENDOR_HTC, 0x0a54, 0)},
  539         /* SmartPhone USB Sync */
  540         {USB_VPI(USB_VENDOR_HTC, 0x0a55, 0)},
  541         /* SmartPhone USB Sync */
  542         {USB_VPI(USB_VENDOR_HTC, 0x0a56, 0)},
  543         /* SmartPhone USB Sync */
  544         {USB_VPI(USB_VENDOR_HTC, 0x0a57, 0)},
  545         /* SmartPhone USB Sync */
  546         {USB_VPI(USB_VENDOR_HTC, 0x0a58, 0)},
  547         /* SmartPhone USB Sync */
  548         {USB_VPI(USB_VENDOR_HTC, 0x0a59, 0)},
  549         /* SmartPhone USB Sync */
  550         {USB_VPI(USB_VENDOR_HTC, 0x0a5a, 0)},
  551         /* SmartPhone USB Sync */
  552         {USB_VPI(USB_VENDOR_HTC, 0x0a5b, 0)},
  553         /* SmartPhone USB Sync */
  554         {USB_VPI(USB_VENDOR_HTC, 0x0a5c, 0)},
  555         /* SmartPhone USB Sync */
  556         {USB_VPI(USB_VENDOR_HTC, 0x0a5d, 0)},
  557         /* SmartPhone USB Sync */
  558         {USB_VPI(USB_VENDOR_HTC, 0x0a5e, 0)},
  559         /* SmartPhone USB Sync */
  560         {USB_VPI(USB_VENDOR_HTC, 0x0a5f, 0)},
  561         /* SmartPhone USB Sync */
  562         {USB_VPI(USB_VENDOR_HTC, 0x0a60, 0)},
  563         /* SmartPhone USB Sync */
  564         {USB_VPI(USB_VENDOR_HTC, 0x0a61, 0)},
  565         /* SmartPhone USB Sync */
  566         {USB_VPI(USB_VENDOR_HTC, 0x0a62, 0)},
  567         /* SmartPhone USB Sync */
  568         {USB_VPI(USB_VENDOR_HTC, 0x0a63, 0)},
  569         /* SmartPhone USB Sync */
  570         {USB_VPI(USB_VENDOR_HTC, 0x0a64, 0)},
  571         /* SmartPhone USB Sync */
  572         {USB_VPI(USB_VENDOR_HTC, 0x0a65, 0)},
  573         /* SmartPhone USB Sync */
  574         {USB_VPI(USB_VENDOR_HTC, 0x0a66, 0)},
  575         /* SmartPhone USB Sync */
  576         {USB_VPI(USB_VENDOR_HTC, 0x0a67, 0)},
  577         /* SmartPhone USB Sync */
  578         {USB_VPI(USB_VENDOR_HTC, 0x0a68, 0)},
  579         /* SmartPhone USB Sync */
  580         {USB_VPI(USB_VENDOR_HTC, 0x0a69, 0)},
  581         /* SmartPhone USB Sync */
  582         {USB_VPI(USB_VENDOR_HTC, 0x0a6a, 0)},
  583         /* SmartPhone USB Sync */
  584         {USB_VPI(USB_VENDOR_HTC, 0x0a6b, 0)},
  585         /* SmartPhone USB Sync */
  586         {USB_VPI(USB_VENDOR_HTC, 0x0a6c, 0)},
  587         /* SmartPhone USB Sync */
  588         {USB_VPI(USB_VENDOR_HTC, 0x0a6d, 0)},
  589         /* SmartPhone USB Sync */
  590         {USB_VPI(USB_VENDOR_HTC, 0x0a6e, 0)},
  591         /* SmartPhone USB Sync */
  592         {USB_VPI(USB_VENDOR_HTC, 0x0a6f, 0)},
  593         /* SmartPhone USB Sync */
  594         {USB_VPI(USB_VENDOR_HTC, 0x0a70, 0)},
  595         /* SmartPhone USB Sync */
  596         {USB_VPI(USB_VENDOR_HTC, 0x0a71, 0)},
  597         /* SmartPhone USB Sync */
  598         {USB_VPI(USB_VENDOR_HTC, 0x0a72, 0)},
  599         /* SmartPhone USB Sync */
  600         {USB_VPI(USB_VENDOR_HTC, 0x0a73, 0)},
  601         /* SmartPhone USB Sync */
  602         {USB_VPI(USB_VENDOR_HTC, 0x0a74, 0)},
  603         /* SmartPhone USB Sync */
  604         {USB_VPI(USB_VENDOR_HTC, 0x0a75, 0)},
  605         /* SmartPhone USB Sync */
  606         {USB_VPI(USB_VENDOR_HTC, 0x0a76, 0)},
  607         /* SmartPhone USB Sync */
  608         {USB_VPI(USB_VENDOR_HTC, 0x0a77, 0)},
  609         /* SmartPhone USB Sync */
  610         {USB_VPI(USB_VENDOR_HTC, 0x0a78, 0)},
  611         /* SmartPhone USB Sync */
  612         {USB_VPI(USB_VENDOR_HTC, 0x0a79, 0)},
  613         /* SmartPhone USB Sync */
  614         {USB_VPI(USB_VENDOR_HTC, 0x0a7a, 0)},
  615         /* SmartPhone USB Sync */
  616         {USB_VPI(USB_VENDOR_HTC, 0x0a7b, 0)},
  617         /* SmartPhone USB Sync */
  618         {USB_VPI(USB_VENDOR_HTC, 0x0a7c, 0)},
  619         /* SmartPhone USB Sync */
  620         {USB_VPI(USB_VENDOR_HTC, 0x0a7d, 0)},
  621         /* SmartPhone USB Sync */
  622         {USB_VPI(USB_VENDOR_HTC, 0x0a7e, 0)},
  623         /* SmartPhone USB Sync */
  624         {USB_VPI(USB_VENDOR_HTC, 0x0a7f, 0)},
  625         /* SmartPhone USB Sync */
  626         {USB_VPI(USB_VENDOR_HTC, 0x0a80, 0)},
  627         /* SmartPhone USB Sync */
  628         {USB_VPI(USB_VENDOR_HTC, 0x0a81, 0)},
  629         /* SmartPhone USB Sync */
  630         {USB_VPI(USB_VENDOR_HTC, 0x0a82, 0)},
  631         /* SmartPhone USB Sync */
  632         {USB_VPI(USB_VENDOR_HTC, 0x0a83, 0)},
  633         /* SmartPhone USB Sync */
  634         {USB_VPI(USB_VENDOR_HTC, 0x0a84, 0)},
  635         /* SmartPhone USB Sync */
  636         {USB_VPI(USB_VENDOR_HTC, 0x0a85, 0)},
  637         /* SmartPhone USB Sync */
  638         {USB_VPI(USB_VENDOR_HTC, 0x0a86, 0)},
  639         /* SmartPhone USB Sync */
  640         {USB_VPI(USB_VENDOR_HTC, 0x0a87, 0)},
  641         /* SmartPhone USB Sync */
  642         {USB_VPI(USB_VENDOR_HTC, 0x0a88, 0)},
  643         /* SmartPhone USB Sync */
  644         {USB_VPI(USB_VENDOR_HTC, 0x0a89, 0)},
  645         /* SmartPhone USB Sync */
  646         {USB_VPI(USB_VENDOR_HTC, 0x0a8a, 0)},
  647         /* SmartPhone USB Sync */
  648         {USB_VPI(USB_VENDOR_HTC, 0x0a8b, 0)},
  649         /* SmartPhone USB Sync */
  650         {USB_VPI(USB_VENDOR_HTC, 0x0a8c, 0)},
  651         /* SmartPhone USB Sync */
  652         {USB_VPI(USB_VENDOR_HTC, 0x0a8d, 0)},
  653         /* SmartPhone USB Sync */
  654         {USB_VPI(USB_VENDOR_HTC, 0x0a8e, 0)},
  655         /* SmartPhone USB Sync */
  656         {USB_VPI(USB_VENDOR_HTC, 0x0a8f, 0)},
  657         /* SmartPhone USB Sync */
  658         {USB_VPI(USB_VENDOR_HTC, 0x0a90, 0)},
  659         /* SmartPhone USB Sync */
  660         {USB_VPI(USB_VENDOR_HTC, 0x0a91, 0)},
  661         /* SmartPhone USB Sync */
  662         {USB_VPI(USB_VENDOR_HTC, 0x0a92, 0)},
  663         /* SmartPhone USB Sync */
  664         {USB_VPI(USB_VENDOR_HTC, 0x0a93, 0)},
  665         /* SmartPhone USB Sync */
  666         {USB_VPI(USB_VENDOR_HTC, 0x0a94, 0)},
  667         /* SmartPhone USB Sync */
  668         {USB_VPI(USB_VENDOR_HTC, 0x0a95, 0)},
  669         /* SmartPhone USB Sync */
  670         {USB_VPI(USB_VENDOR_HTC, 0x0a96, 0)},
  671         /* SmartPhone USB Sync */
  672         {USB_VPI(USB_VENDOR_HTC, 0x0a97, 0)},
  673         /* SmartPhone USB Sync */
  674         {USB_VPI(USB_VENDOR_HTC, 0x0a98, 0)},
  675         /* SmartPhone USB Sync */
  676         {USB_VPI(USB_VENDOR_HTC, 0x0a99, 0)},
  677         /* SmartPhone USB Sync */
  678         {USB_VPI(USB_VENDOR_HTC, 0x0a9a, 0)},
  679         /* SmartPhone USB Sync */
  680         {USB_VPI(USB_VENDOR_HTC, 0x0a9b, 0)},
  681         /* SmartPhone USB Sync */
  682         {USB_VPI(USB_VENDOR_HTC, 0x0a9c, 0)},
  683         /* SmartPhone USB Sync */
  684         {USB_VPI(USB_VENDOR_HTC, 0x0a9d, 0)},
  685         /* SmartPhone USB Sync */
  686         {USB_VPI(USB_VENDOR_HTC, 0x0a9e, 0)},
  687         /* SmartPhone USB Sync */
  688         {USB_VPI(USB_VENDOR_HTC, 0x0a9f, 0)},
  689         /**/
  690         {USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_PPC6700MODEM, 0)},
  691         /**/
  692         {USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_SMARTPHONE, 0)},
  693         /**/
  694         {USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_WINMOBILE, 0)},
  695         /* High Tech Computer Wizard Smartphone */
  696         {USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_WIZARD, 0)},
  697         /* JVC USB Sync */
  698         {USB_VPI(USB_VENDOR_JVC, 0x3011, 0)},
  699         /* JVC USB Sync */
  700         {USB_VPI(USB_VENDOR_JVC, 0x3012, 0)},
  701         /* LGE USB Sync */
  702         {USB_VPI(USB_VENDOR_LG, 0x9c01, 0)},
  703         /* Microsoft USB Sync */
  704         {USB_VPI(USB_VENDOR_MICROSOFT, 0x00ce, 0)},
  705         /* Windows Pocket PC 2002 */
  706         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0400, 0)},
  707         /* Windows Pocket PC 2002 */
  708         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0401, 0)},
  709         /* Windows Pocket PC 2002 */
  710         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0402, 0)},
  711         /* Windows Pocket PC 2002 */
  712         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0403, 0)},
  713         /* Windows Pocket PC 2002 */
  714         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0404, 0)},
  715         /* Windows Pocket PC 2002 */
  716         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0405, 0)},
  717         /* Windows Pocket PC 2002 */
  718         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0406, 0)},
  719         /* Windows Pocket PC 2002 */
  720         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0407, 0)},
  721         /* Windows Pocket PC 2002 */
  722         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0408, 0)},
  723         /* Windows Pocket PC 2002 */
  724         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0409, 0)},
  725         /* Windows Pocket PC 2002 */
  726         {USB_VPI(USB_VENDOR_MICROSOFT, 0x040a, 0)},
  727         /* Windows Pocket PC 2002 */
  728         {USB_VPI(USB_VENDOR_MICROSOFT, 0x040b, 0)},
  729         /* Windows Pocket PC 2002 */
  730         {USB_VPI(USB_VENDOR_MICROSOFT, 0x040c, 0)},
  731         /* Windows Pocket PC 2002 */
  732         {USB_VPI(USB_VENDOR_MICROSOFT, 0x040d, 0)},
  733         /* Windows Pocket PC 2002 */
  734         {USB_VPI(USB_VENDOR_MICROSOFT, 0x040e, 0)},
  735         /* Windows Pocket PC 2002 */
  736         {USB_VPI(USB_VENDOR_MICROSOFT, 0x040f, 0)},
  737         /* Windows Pocket PC 2002 */
  738         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0410, 0)},
  739         /* Windows Pocket PC 2002 */
  740         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0411, 0)},
  741         /* Windows Pocket PC 2002 */
  742         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0412, 0)},
  743         /* Windows Pocket PC 2002 */
  744         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0413, 0)},
  745         /* Windows Pocket PC 2002 */
  746         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0414, 0)},
  747         /* Windows Pocket PC 2002 */
  748         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0415, 0)},
  749         /* Windows Pocket PC 2002 */
  750         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0416, 0)},
  751         /* Windows Pocket PC 2002 */
  752         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0417, 0)},
  753         /* Windows Pocket PC 2003 */
  754         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0432, 0)},
  755         /* Windows Pocket PC 2003 */
  756         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0433, 0)},
  757         /* Windows Pocket PC 2003 */
  758         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0434, 0)},
  759         /* Windows Pocket PC 2003 */
  760         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0435, 0)},
  761         /* Windows Pocket PC 2003 */
  762         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0436, 0)},
  763         /* Windows Pocket PC 2003 */
  764         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0437, 0)},
  765         /* Windows Pocket PC 2003 */
  766         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0438, 0)},
  767         /* Windows Pocket PC 2003 */
  768         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0439, 0)},
  769         /* Windows Pocket PC 2003 */
  770         {USB_VPI(USB_VENDOR_MICROSOFT, 0x043a, 0)},
  771         /* Windows Pocket PC 2003 */
  772         {USB_VPI(USB_VENDOR_MICROSOFT, 0x043b, 0)},
  773         /* Windows Pocket PC 2003 */
  774         {USB_VPI(USB_VENDOR_MICROSOFT, 0x043c, 0)},
  775         /* Windows Pocket PC 2003 */
  776         {USB_VPI(USB_VENDOR_MICROSOFT, 0x043d, 0)},
  777         /* Windows Pocket PC 2003 */
  778         {USB_VPI(USB_VENDOR_MICROSOFT, 0x043e, 0)},
  779         /* Windows Pocket PC 2003 */
  780         {USB_VPI(USB_VENDOR_MICROSOFT, 0x043f, 0)},
  781         /* Windows Pocket PC 2003 */
  782         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0440, 0)},
  783         /* Windows Pocket PC 2003 */
  784         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0441, 0)},
  785         /* Windows Pocket PC 2003 */
  786         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0442, 0)},
  787         /* Windows Pocket PC 2003 */
  788         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0443, 0)},
  789         /* Windows Pocket PC 2003 */
  790         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0444, 0)},
  791         /* Windows Pocket PC 2003 */
  792         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0445, 0)},
  793         /* Windows Pocket PC 2003 */
  794         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0446, 0)},
  795         /* Windows Pocket PC 2003 */
  796         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0447, 0)},
  797         /* Windows Pocket PC 2003 */
  798         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0448, 0)},
  799         /* Windows Pocket PC 2003 */
  800         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0449, 0)},
  801         /* Windows Pocket PC 2003 */
  802         {USB_VPI(USB_VENDOR_MICROSOFT, 0x044a, 0)},
  803         /* Windows Pocket PC 2003 */
  804         {USB_VPI(USB_VENDOR_MICROSOFT, 0x044b, 0)},
  805         /* Windows Pocket PC 2003 */
  806         {USB_VPI(USB_VENDOR_MICROSOFT, 0x044c, 0)},
  807         /* Windows Pocket PC 2003 */
  808         {USB_VPI(USB_VENDOR_MICROSOFT, 0x044d, 0)},
  809         /* Windows Pocket PC 2003 */
  810         {USB_VPI(USB_VENDOR_MICROSOFT, 0x044e, 0)},
  811         /* Windows Pocket PC 2003 */
  812         {USB_VPI(USB_VENDOR_MICROSOFT, 0x044f, 0)},
  813         /* Windows Pocket PC 2003 */
  814         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0450, 0)},
  815         /* Windows Pocket PC 2003 */
  816         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0451, 0)},
  817         /* Windows Pocket PC 2003 */
  818         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0452, 0)},
  819         /* Windows Pocket PC 2003 */
  820         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0453, 0)},
  821         /* Windows Pocket PC 2003 */
  822         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0454, 0)},
  823         /* Windows Pocket PC 2003 */
  824         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0455, 0)},
  825         /* Windows Pocket PC 2003 */
  826         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0456, 0)},
  827         /* Windows Pocket PC 2003 */
  828         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0457, 0)},
  829         /* Windows Pocket PC 2003 */
  830         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0458, 0)},
  831         /* Windows Pocket PC 2003 */
  832         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0459, 0)},
  833         /* Windows Pocket PC 2003 */
  834         {USB_VPI(USB_VENDOR_MICROSOFT, 0x045a, 0)},
  835         /* Windows Pocket PC 2003 */
  836         {USB_VPI(USB_VENDOR_MICROSOFT, 0x045b, 0)},
  837         /* Windows Pocket PC 2003 */
  838         {USB_VPI(USB_VENDOR_MICROSOFT, 0x045c, 0)},
  839         /* Windows Pocket PC 2003 */
  840         {USB_VPI(USB_VENDOR_MICROSOFT, 0x045d, 0)},
  841         /* Windows Pocket PC 2003 */
  842         {USB_VPI(USB_VENDOR_MICROSOFT, 0x045e, 0)},
  843         /* Windows Pocket PC 2003 */
  844         {USB_VPI(USB_VENDOR_MICROSOFT, 0x045f, 0)},
  845         /* Windows Pocket PC 2003 */
  846         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0460, 0)},
  847         /* Windows Pocket PC 2003 */
  848         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0461, 0)},
  849         /* Windows Pocket PC 2003 */
  850         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0462, 0)},
  851         /* Windows Pocket PC 2003 */
  852         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0463, 0)},
  853         /* Windows Pocket PC 2003 */
  854         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0464, 0)},
  855         /* Windows Pocket PC 2003 */
  856         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0465, 0)},
  857         /* Windows Pocket PC 2003 */
  858         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0466, 0)},
  859         /* Windows Pocket PC 2003 */
  860         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0467, 0)},
  861         /* Windows Pocket PC 2003 */
  862         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0468, 0)},
  863         /* Windows Pocket PC 2003 */
  864         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0469, 0)},
  865         /* Windows Pocket PC 2003 */
  866         {USB_VPI(USB_VENDOR_MICROSOFT, 0x046a, 0)},
  867         /* Windows Pocket PC 2003 */
  868         {USB_VPI(USB_VENDOR_MICROSOFT, 0x046b, 0)},
  869         /* Windows Pocket PC 2003 */
  870         {USB_VPI(USB_VENDOR_MICROSOFT, 0x046c, 0)},
  871         /* Windows Pocket PC 2003 */
  872         {USB_VPI(USB_VENDOR_MICROSOFT, 0x046d, 0)},
  873         /* Windows Pocket PC 2003 */
  874         {USB_VPI(USB_VENDOR_MICROSOFT, 0x046e, 0)},
  875         /* Windows Pocket PC 2003 */
  876         {USB_VPI(USB_VENDOR_MICROSOFT, 0x046f, 0)},
  877         /* Windows Pocket PC 2003 */
  878         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0470, 0)},
  879         /* Windows Pocket PC 2003 */
  880         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0471, 0)},
  881         /* Windows Pocket PC 2003 */
  882         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0472, 0)},
  883         /* Windows Pocket PC 2003 */
  884         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0473, 0)},
  885         /* Windows Pocket PC 2003 */
  886         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0474, 0)},
  887         /* Windows Pocket PC 2003 */
  888         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0475, 0)},
  889         /* Windows Pocket PC 2003 */
  890         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0476, 0)},
  891         /* Windows Pocket PC 2003 */
  892         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0477, 0)},
  893         /* Windows Pocket PC 2003 */
  894         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0478, 0)},
  895         /* Windows Pocket PC 2003 */
  896         {USB_VPI(USB_VENDOR_MICROSOFT, 0x0479, 0)},
  897         /* Windows Pocket PC 2003 */
  898         {USB_VPI(USB_VENDOR_MICROSOFT, 0x047a, 0)},
  899         /* Windows Pocket PC 2003 */
  900         {USB_VPI(USB_VENDOR_MICROSOFT, 0x047b, 0)},
  901         /* Windows Smartphone 2002 */
  902         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04c8, 0)},
  903         /* Windows Smartphone 2002 */
  904         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04c9, 0)},
  905         /* Windows Smartphone 2002 */
  906         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04ca, 0)},
  907         /* Windows Smartphone 2002 */
  908         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04cb, 0)},
  909         /* Windows Smartphone 2002 */
  910         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04cc, 0)},
  911         /* Windows Smartphone 2002 */
  912         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04cd, 0)},
  913         /* Windows Smartphone 2002 */
  914         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04ce, 0)},
  915         /* Windows Smartphone 2003 */
  916         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04d7, 0)},
  917         /* Windows Smartphone 2003 */
  918         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04d8, 0)},
  919         /* Windows Smartphone 2003 */
  920         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04d9, 0)},
  921         /* Windows Smartphone 2003 */
  922         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04da, 0)},
  923         /* Windows Smartphone 2003 */
  924         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04db, 0)},
  925         /* Windows Smartphone 2003 */
  926         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04dc, 0)},
  927         /* Windows Smartphone 2003 */
  928         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04dd, 0)},
  929         /* Windows Smartphone 2003 */
  930         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04de, 0)},
  931         /* Windows Smartphone 2003 */
  932         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04df, 0)},
  933         /* Windows Smartphone 2003 */
  934         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e0, 0)},
  935         /* Windows Smartphone 2003 */
  936         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e1, 0)},
  937         /* Windows Smartphone 2003 */
  938         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e2, 0)},
  939         /* Windows Smartphone 2003 */
  940         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e3, 0)},
  941         /* Windows Smartphone 2003 */
  942         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e4, 0)},
  943         /* Windows Smartphone 2003 */
  944         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e5, 0)},
  945         /* Windows Smartphone 2003 */
  946         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e6, 0)},
  947         /* Windows Smartphone 2003 */
  948         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e7, 0)},
  949         /* Windows Smartphone 2003 */
  950         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e8, 0)},
  951         /* Windows Smartphone 2003 */
  952         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04e9, 0)},
  953         /* Windows Smartphone 2003 */
  954         {USB_VPI(USB_VENDOR_MICROSOFT, 0x04ea, 0)},
  955         /* Motorola MPx200 Smartphone */
  956         {USB_VPI(USB_VENDOR_MOTOROLA2, 0x4204, 0)},
  957         /* Motorola MPc GSM */
  958         {USB_VPI(USB_VENDOR_MOTOROLA2, 0x4214, 0)},
  959         /* Motorola MPx220 Smartphone */
  960         {USB_VPI(USB_VENDOR_MOTOROLA2, 0x4224, 0)},
  961         /* Motorola MPc CDMA */
  962         {USB_VPI(USB_VENDOR_MOTOROLA2, 0x4234, 0)},
  963         /* Motorola MPx100 Smartphone */
  964         {USB_VPI(USB_VENDOR_MOTOROLA2, 0x4244, 0)},
  965         /* NEC USB Sync */
  966         {USB_VPI(USB_VENDOR_NEC, 0x00d5, 0)},
  967         /* NEC USB Sync */
  968         {USB_VPI(USB_VENDOR_NEC, 0x00d6, 0)},
  969         /* NEC USB Sync */
  970         {USB_VPI(USB_VENDOR_NEC, 0x00d7, 0)},
  971         /* NEC USB Sync */
  972         {USB_VPI(USB_VENDOR_NEC, 0x8024, 0)},
  973         /* NEC USB Sync */
  974         {USB_VPI(USB_VENDOR_NEC, 0x8025, 0)},
  975         /* Panasonic USB Sync */
  976         {USB_VPI(USB_VENDOR_PANASONIC, 0x2500, 0)},
  977         /* Samsung NEXiO USB Sync */
  978         {USB_VPI(USB_VENDOR_SAMSUNG, 0x5f00, 0)},
  979         /* Samsung NEXiO USB Sync */
  980         {USB_VPI(USB_VENDOR_SAMSUNG, 0x5f01, 0)},
  981         /* Samsung NEXiO USB Sync */
  982         {USB_VPI(USB_VENDOR_SAMSUNG, 0x5f02, 0)},
  983         /* Samsung NEXiO USB Sync */
  984         {USB_VPI(USB_VENDOR_SAMSUNG, 0x5f03, 0)},
  985         /* Samsung NEXiO USB Sync */
  986         {USB_VPI(USB_VENDOR_SAMSUNG, 0x5f04, 0)},
  987         /* Samsung MITs USB Sync */
  988         {USB_VPI(USB_VENDOR_SAMSUNG, 0x6611, 0)},
  989         /* Samsung MITs USB Sync */
  990         {USB_VPI(USB_VENDOR_SAMSUNG, 0x6613, 0)},
  991         /* Samsung MITs USB Sync */
  992         {USB_VPI(USB_VENDOR_SAMSUNG, 0x6615, 0)},
  993         /* Samsung MITs USB Sync */
  994         {USB_VPI(USB_VENDOR_SAMSUNG, 0x6617, 0)},
  995         /* Samsung MITs USB Sync */
  996         {USB_VPI(USB_VENDOR_SAMSUNG, 0x6619, 0)},
  997         /* Samsung MITs USB Sync */
  998         {USB_VPI(USB_VENDOR_SAMSUNG, 0x661b, 0)},
  999         /* Samsung MITs USB Sync */
 1000         {USB_VPI(USB_VENDOR_SAMSUNG, 0x662e, 0)},
 1001         /* Samsung MITs USB Sync */
 1002         {USB_VPI(USB_VENDOR_SAMSUNG, 0x6630, 0)},
 1003         /* Samsung MITs USB Sync */
 1004         {USB_VPI(USB_VENDOR_SAMSUNG, 0x6632, 0)},
 1005         /* SHARP WS003SH USB Modem */
 1006         {USB_VPI(USB_VENDOR_SHARP, 0x9102, 0)},
 1007         /* SHARP WS004SH USB Modem */
 1008         {USB_VPI(USB_VENDOR_SHARP, 0x9121, 0)},
 1009         /* SHARP S01SH USB Modem */
 1010         {USB_VPI(USB_VENDOR_SHARP, 0x9151, 0)},
 1011         /**/
 1012         {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WZERO3ES, 0)},
 1013         /**/
 1014         {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WZERO3ADES, 0)},
 1015         /**/
 1016         {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WILLCOM03, 0)},
 1017         /* Symbol USB Sync */
 1018         {USB_VPI(USB_VENDOR_SYMBOL, 0x2000, 0)},
 1019         /* Symbol USB Sync 0x2001 */
 1020         {USB_VPI(USB_VENDOR_SYMBOL, 0x2001, 0)},
 1021         /* Symbol USB Sync 0x2002 */
 1022         {USB_VPI(USB_VENDOR_SYMBOL, 0x2002, 0)},
 1023         /* Symbol USB Sync 0x2003 */
 1024         {USB_VPI(USB_VENDOR_SYMBOL, 0x2003, 0)},
 1025         /* Symbol USB Sync 0x2004 */
 1026         {USB_VPI(USB_VENDOR_SYMBOL, 0x2004, 0)},
 1027         /* Symbol USB Sync 0x2005 */
 1028         {USB_VPI(USB_VENDOR_SYMBOL, 0x2005, 0)},
 1029         /* Symbol USB Sync 0x2006 */
 1030         {USB_VPI(USB_VENDOR_SYMBOL, 0x2006, 0)},
 1031         /* Symbol USB Sync 0x2007 */
 1032         {USB_VPI(USB_VENDOR_SYMBOL, 0x2007, 0)},
 1033         /* Symbol USB Sync 0x2008 */
 1034         {USB_VPI(USB_VENDOR_SYMBOL, 0x2008, 0)},
 1035         /* Symbol USB Sync 0x2009 */
 1036         {USB_VPI(USB_VENDOR_SYMBOL, 0x2009, 0)},
 1037         /* Symbol USB Sync 0x200a */
 1038         {USB_VPI(USB_VENDOR_SYMBOL, 0x200a, 0)},
 1039         /* TOSHIBA USB Sync 0700 */
 1040         {USB_VPI(USB_VENDOR_TOSHIBA, 0x0700, 0)},
 1041         /* TOSHIBA Pocket PC e310 */
 1042         {USB_VPI(USB_VENDOR_TOSHIBA, 0x0705, 0)},
 1043         /* TOSHIBA Pocket PC e330 Series */
 1044         {USB_VPI(USB_VENDOR_TOSHIBA, 0x0707, 0)},
 1045         /* TOSHIBA Pocket PC e350Series */
 1046         {USB_VPI(USB_VENDOR_TOSHIBA, 0x0708, 0)},
 1047         /* TOSHIBA Pocket PC e750 Series */
 1048         {USB_VPI(USB_VENDOR_TOSHIBA, 0x0709, 0)},
 1049         /* TOSHIBA Pocket PC e400 Series */
 1050         {USB_VPI(USB_VENDOR_TOSHIBA, 0x070a, 0)},
 1051         /* TOSHIBA Pocket PC e800 Series */
 1052         {USB_VPI(USB_VENDOR_TOSHIBA, 0x070b, 0)},
 1053         /* TOSHIBA Pocket PC e740 */
 1054         {USB_VPI(USB_VENDOR_TOSHIBA, USB_PRODUCT_TOSHIBA_POCKETPC_E740, 0)},
 1055         /* ViewSonic Color Pocket PC V35 */
 1056         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x0ed9, 0)},
 1057         /* ViewSonic Color Pocket PC V36 */
 1058         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x1527, 0)},
 1059         /* ViewSonic Color Pocket PC V37 */
 1060         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x1529, 0)},
 1061         /* ViewSonic Color Pocket PC V38 */
 1062         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x152b, 0)},
 1063         /* ViewSonic Pocket PC */
 1064         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x152e, 0)},
 1065         /* ViewSonic Communicator Pocket PC */
 1066         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x1921, 0)},
 1067         /* ViewSonic Smartphone */
 1068         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x1922, 0)},
 1069         /* ViewSonic Pocket PC V30 */
 1070         {USB_VPI(USB_VENDOR_VIEWSONIC, 0x1923, 0)},
 1071 };
 1072 
 1073 static device_method_t uipaq_methods[] = {
 1074         DEVMETHOD(device_probe, uipaq_probe),
 1075         DEVMETHOD(device_attach, uipaq_attach),
 1076         DEVMETHOD(device_detach, uipaq_detach),
 1077         DEVMETHOD_END
 1078 };
 1079 
 1080 static driver_t uipaq_driver = {
 1081         .name = "uipaq",
 1082         .methods = uipaq_methods,
 1083         .size = sizeof(struct uipaq_softc),
 1084 };
 1085 
 1086 DRIVER_MODULE(uipaq, uhub, uipaq_driver, NULL, NULL);
 1087 MODULE_DEPEND(uipaq, ucom, 1, 1, 1);
 1088 MODULE_DEPEND(uipaq, usb, 1, 1, 1);
 1089 MODULE_VERSION(uipaq, 1);
 1090 USB_PNP_HOST_INFO(uipaq_devs);
 1091 
 1092 static int
 1093 uipaq_probe(device_t dev)
 1094 {
 1095         struct usb_attach_arg *uaa = device_get_ivars(dev);
 1096 
 1097         if (uaa->usb_mode != USB_MODE_HOST) {
 1098                 return (ENXIO);
 1099         }
 1100         if (uaa->info.bConfigIndex != UIPAQ_CONFIG_INDEX) {
 1101                 return (ENXIO);
 1102         }
 1103         if (uaa->info.bIfaceIndex != UIPAQ_IFACE_INDEX) {
 1104                 return (ENXIO);
 1105         }
 1106         if (uaa->info.bInterfaceClass == UICLASS_IAD) {
 1107                 DPRINTF("IAD detected - not UIPAQ serial device\n");
 1108                 return (ENXIO);
 1109         }
 1110         return (usbd_lookup_id_by_uaa(uipaq_devs, sizeof(uipaq_devs), uaa));
 1111 }
 1112 
 1113 static int
 1114 uipaq_attach(device_t dev)
 1115 {
 1116         struct usb_device_request req;
 1117         struct usb_attach_arg *uaa = device_get_ivars(dev);
 1118         struct uipaq_softc *sc = device_get_softc(dev);
 1119         int error;
 1120         uint8_t iface_index;
 1121         uint8_t i;
 1122 
 1123         sc->sc_udev = uaa->device;
 1124 
 1125         device_set_usb_desc(dev);
 1126         mtx_init(&sc->sc_mtx, "uipaq", NULL, MTX_DEF);
 1127         ucom_ref(&sc->sc_super_ucom);
 1128 
 1129         /*
 1130          * Send magic bytes, cribbed from Linux ipaq driver that
 1131          * claims to have sniffed them from Win98. Wait for driver to
 1132          * become ready on device side?
 1133          */
 1134         req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
 1135         req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
 1136         USETW(req.wValue, UCDC_LINE_DTR);
 1137         USETW(req.wIndex, 0x0);
 1138         USETW(req.wLength, 0);
 1139         for (i = 0; i != 64; i++) {
 1140                 error =
 1141                     usbd_do_request_flags(uaa->device, NULL, &req,
 1142                     NULL, 0, NULL, 100);
 1143                 if (error == 0)
 1144                         break;
 1145                 usb_pause_mtx(NULL, hz / 10);
 1146         }
 1147 
 1148         iface_index = UIPAQ_IFACE_INDEX;
 1149         error = usbd_transfer_setup(uaa->device, &iface_index,
 1150             sc->sc_xfer, uipaq_config_data,
 1151             UIPAQ_N_TRANSFER, sc, &sc->sc_mtx);
 1152 
 1153         if (error) {
 1154                 goto detach;
 1155         }
 1156         /* clear stall at first run */
 1157         mtx_lock(&sc->sc_mtx);
 1158         usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
 1159         usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
 1160         mtx_unlock(&sc->sc_mtx);
 1161 
 1162         error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
 1163             &uipaq_callback, &sc->sc_mtx);
 1164         if (error) {
 1165                 goto detach;
 1166         }
 1167         ucom_set_pnpinfo_usb(&sc->sc_super_ucom, dev);
 1168 
 1169         return (0);
 1170 
 1171 detach:
 1172         uipaq_detach(dev);
 1173         return (ENXIO);
 1174 }
 1175 
 1176 int
 1177 uipaq_detach(device_t dev)
 1178 {
 1179         struct uipaq_softc *sc = device_get_softc(dev);
 1180 
 1181         ucom_detach(&sc->sc_super_ucom, &sc->sc_ucom);
 1182         usbd_transfer_unsetup(sc->sc_xfer, UIPAQ_N_TRANSFER);
 1183 
 1184         device_claim_softc(dev);
 1185 
 1186         uipaq_free_softc(sc);
 1187 
 1188         return (0);
 1189 }
 1190 
 1191 UCOM_UNLOAD_DRAIN(uipaq);
 1192 
 1193 static void
 1194 uipaq_free_softc(struct uipaq_softc *sc)
 1195 {
 1196         if (ucom_unref(&sc->sc_super_ucom)) {
 1197                 mtx_destroy(&sc->sc_mtx);
 1198                 device_free_softc(sc);
 1199         }
 1200 }
 1201 
 1202 static void
 1203 uipaq_free(struct ucom_softc *ucom)
 1204 {
 1205         uipaq_free_softc(ucom->sc_parent);
 1206 }
 1207 
 1208 static void
 1209 uipaq_start_read(struct ucom_softc *ucom)
 1210 {
 1211         struct uipaq_softc *sc = ucom->sc_parent;
 1212 
 1213         /* start read endpoint */
 1214         usbd_transfer_start(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
 1215 }
 1216 
 1217 static void
 1218 uipaq_stop_read(struct ucom_softc *ucom)
 1219 {
 1220         struct uipaq_softc *sc = ucom->sc_parent;
 1221 
 1222         /* stop read endpoint */
 1223         usbd_transfer_stop(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
 1224 }
 1225 
 1226 static void
 1227 uipaq_start_write(struct ucom_softc *ucom)
 1228 {
 1229         struct uipaq_softc *sc = ucom->sc_parent;
 1230 
 1231         usbd_transfer_start(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
 1232 }
 1233 
 1234 static void
 1235 uipaq_stop_write(struct ucom_softc *ucom)
 1236 {
 1237         struct uipaq_softc *sc = ucom->sc_parent;
 1238 
 1239         usbd_transfer_stop(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
 1240 }
 1241 
 1242 static void
 1243 uipaq_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff)
 1244 {
 1245         struct uipaq_softc *sc = ucom->sc_parent;
 1246         struct usb_device_request req;
 1247 
 1248         DPRINTF("onoff=%d\n", onoff);
 1249 
 1250         if (onoff)
 1251                 sc->sc_line |= UCDC_LINE_DTR;
 1252         else
 1253                 sc->sc_line &= ~UCDC_LINE_DTR;
 1254 
 1255         req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
 1256         req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
 1257         USETW(req.wValue, sc->sc_line);
 1258         req.wIndex[0] = UIPAQ_IFACE_INDEX;
 1259         req.wIndex[1] = 0;
 1260         USETW(req.wLength, 0);
 1261 
 1262         ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, 
 1263             &req, NULL, 0, 1000);
 1264 }
 1265 
 1266 static void
 1267 uipaq_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff)
 1268 {
 1269         struct uipaq_softc *sc = ucom->sc_parent;
 1270         struct usb_device_request req;
 1271 
 1272         DPRINTF("onoff=%d\n", onoff);
 1273 
 1274         if (onoff)
 1275                 sc->sc_line |= UCDC_LINE_RTS;
 1276         else
 1277                 sc->sc_line &= ~UCDC_LINE_RTS;
 1278 
 1279         req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
 1280         req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
 1281         USETW(req.wValue, sc->sc_line);
 1282         req.wIndex[0] = UIPAQ_IFACE_INDEX;
 1283         req.wIndex[1] = 0;
 1284         USETW(req.wLength, 0);
 1285 
 1286         ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, 
 1287             &req, NULL, 0, 1000);
 1288 }
 1289 
 1290 static void
 1291 uipaq_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff)
 1292 {
 1293         struct uipaq_softc *sc = ucom->sc_parent;
 1294         struct usb_device_request req;
 1295         uint16_t temp;
 1296 
 1297         temp = onoff ? UCDC_BREAK_ON : UCDC_BREAK_OFF;
 1298 
 1299         req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
 1300         req.bRequest = UCDC_SEND_BREAK;
 1301         USETW(req.wValue, temp);
 1302         req.wIndex[0] = UIPAQ_IFACE_INDEX;
 1303         req.wIndex[1] = 0;
 1304         USETW(req.wLength, 0);
 1305 
 1306         ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, 
 1307             &req, NULL, 0, 1000);
 1308 }
 1309 
 1310 static void
 1311 uipaq_write_callback(struct usb_xfer *xfer, usb_error_t error)
 1312 {
 1313         struct uipaq_softc *sc = usbd_xfer_softc(xfer);
 1314         struct usb_page_cache *pc;
 1315         uint32_t actlen;
 1316 
 1317         switch (USB_GET_STATE(xfer)) {
 1318         case USB_ST_SETUP:
 1319         case USB_ST_TRANSFERRED:
 1320 tr_setup:
 1321                 pc = usbd_xfer_get_frame(xfer, 0);
 1322                 if (ucom_get_data(&sc->sc_ucom, pc, 0,
 1323                     UIPAQ_BUF_SIZE, &actlen)) {
 1324                         usbd_xfer_set_frame_len(xfer, 0, actlen);
 1325                         usbd_transfer_submit(xfer);
 1326                 }
 1327                 return;
 1328 
 1329         default:                        /* Error */
 1330                 if (error != USB_ERR_CANCELLED) {
 1331                         /* try to clear stall first */
 1332                         usbd_xfer_set_stall(xfer);
 1333                         goto tr_setup;
 1334                 }
 1335                 return;
 1336         }
 1337 }
 1338 
 1339 static void
 1340 uipaq_read_callback(struct usb_xfer *xfer, usb_error_t error)
 1341 {
 1342         struct uipaq_softc *sc = usbd_xfer_softc(xfer);
 1343         struct usb_page_cache *pc;
 1344         int actlen;
 1345 
 1346         usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
 1347 
 1348         switch (USB_GET_STATE(xfer)) {
 1349         case USB_ST_TRANSFERRED:
 1350                 pc = usbd_xfer_get_frame(xfer, 0);
 1351                 ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
 1352 
 1353         case USB_ST_SETUP:
 1354 tr_setup:
 1355                 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
 1356                 usbd_transfer_submit(xfer);
 1357                 return;
 1358 
 1359         default:                        /* Error */
 1360                 if (error != USB_ERR_CANCELLED) {
 1361                         /* try to clear stall first */
 1362                         usbd_xfer_set_stall(xfer);
 1363                         goto tr_setup;
 1364                 }
 1365                 return;
 1366         }
 1367 }
 1368 
 1369 static void
 1370 uipaq_poll(struct ucom_softc *ucom)
 1371 {
 1372         struct uipaq_softc *sc = ucom->sc_parent;
 1373         usbd_transfer_poll(sc->sc_xfer, UIPAQ_N_TRANSFER);
 1374 }

Cache object: 8178c4370035c48d710e756edf619345


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.