This diff makes the uticom(4) driver work on my machine with an Abbott USB
converter, which is used to connect to the Abbott Freestyle series glucose
meter.

This makes the firmware loading work again.

Index: usbdevs
===================================================================
RCS file: /home/cvsync/src/sys/dev/usb/usbdevs,v
retrieving revision 1.531
diff -u -r1.531 usbdevs
--- usbdevs     15 Dec 2010 16:49:03 -0000      1.531
+++ usbdevs     16 Dec 2010 21:38:55 -0000
@@ -548,6 +548,7 @@
 vendor ZTE             0x19d2  ZTE Inc.
 vendor QUANTA          0x1a32  Quanta
 vendor TERMINUS                0x1a40  Terminus Technology
+vendor ABBOTT          0x1a61  Abbott Labs
 vendor BAYER           0x1a79  Bayer Health Care
 vendor WCH2            0x1a86  QinHeng Electronics
 vendor MATRIXORB       0x1b3d  Matrix Orbital
@@ -635,6 +636,9 @@
 product 3COMUSR USR56K         0x3021  U.S.Robotics 56000
 
 product HUAWEI3COM WUB320G     0x0009  Aolynk WUB320g
+
+/* Abbott products */
+product ABBOTT STEREO_PLUG     0x3410  Stereo Plug Cable
 
 /* AboCom products */
 product ABOCOM XX1             0x110c  XX1
Index: usbdevs.h
===================================================================
RCS file: /home/cvsync/src/sys/dev/usb/usbdevs.h,v
retrieving revision 1.541
diff -u -r1.541 usbdevs.h
--- usbdevs.h   15 Dec 2010 16:51:39 -0000      1.541
+++ usbdevs.h   16 Dec 2010 21:38:55 -0000
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usbdevs.h,v 1.541 2010/12/15 16:51:39 damien Exp $    */
+/*     $OpenBSD$       */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -555,6 +555,7 @@
 #define        USB_VENDOR_ZTE  0x19d2          /* ZTE Inc. */
 #define        USB_VENDOR_QUANTA       0x1a32          /* Quanta */
 #define        USB_VENDOR_TERMINUS     0x1a40          /* Terminus Technology 
*/
+#define        USB_VENDOR_ABBOTT       0x1a61          /* Abbott Labs */
 #define        USB_VENDOR_BAYER        0x1a79          /* Bayer Health Care */
 #define        USB_VENDOR_WCH2 0x1a86          /* QinHeng Electronics */
 #define        USB_VENDOR_MATRIXORB    0x1b3d          /* Matrix Orbital */
@@ -642,6 +643,9 @@
 #define        USB_PRODUCT_3COMUSR_USR56K      0x3021          /* U.S.Robotics 
56000 */
 
 #define        USB_PRODUCT_HUAWEI3COM_WUB320G  0x0009          /* Aolynk 
WUB320g */
+
+/* Abbott products */
+#define        USB_PRODUCT_ABBOTT_STEREO_PLUG  0x3410          /* Stereo Plug 
Cable */
 
 /* AboCom products */
 #define        USB_PRODUCT_ABOCOM_XX1  0x110c          /* XX1 */
Index: usbdevs_data.h
===================================================================
RCS file: /home/cvsync/src/sys/dev/usb/usbdevs_data.h,v
retrieving revision 1.535
diff -u -r1.535 usbdevs_data.h
--- usbdevs_data.h      15 Dec 2010 16:51:39 -0000      1.535
+++ usbdevs_data.h      16 Dec 2010 21:38:55 -0000
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usbdevs_data.h,v 1.535 2010/12/15 16:51:39 damien Exp $       
*/
+/*     $OpenBSD$       */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -118,6 +118,10 @@
            "Aolynk WUB320g",
        },
        {
+           USB_VENDOR_ABBOTT, USB_PRODUCT_ABBOTT_STEREO_PLUG,
+           "Stereo Plug Cable",
+       },
+       {
            USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX1,
            "XX1",
        },
@@ -11716,6 +11720,10 @@
        {
            USB_VENDOR_TERMINUS,
            "Terminus Technology",
+       },
+       {
+           USB_VENDOR_ABBOTT,
+           "Abbott Labs",
        },
        {
            USB_VENDOR_BAYER,
Index: uticom.c
===================================================================
RCS file: /home/cvsync/src/sys/dev/usb/uticom.c,v
retrieving revision 1.10
diff -u -r1.10 uticom.c
--- uticom.c    15 Dec 2010 16:22:16 -0000      1.10
+++ uticom.c    16 Dec 2010 21:38:55 -0000
@@ -119,7 +119,7 @@
 };
 
 struct uticom_softc {
-       struct device            sc_dev;                /* base device */
+       struct device            sc_dev;        /* base device */
        usbd_device_handle       sc_udev;       /* device */
        usbd_interface_handle    sc_iface;      /* interface */
 
@@ -158,6 +158,8 @@
 static int  uticom_open(void *, int);
 static void uticom_close(void *, int);
 
+void uticom_attach_hook(void *arg);
+
 static int uticom_download_fw(struct uticom_softc *sc, int pipeno,
            usbd_device_handle dev);
 
@@ -191,7 +193,8 @@
 
 static const struct usb_devno uticom_devs[] = {
        { USB_VENDOR_TI, USB_PRODUCT_TI_TUSB3410 },
-       { USB_VENDOR_STARTECH, USB_PRODUCT_STARTECH_ICUSB232X }
+       { USB_VENDOR_STARTECH, USB_PRODUCT_STARTECH_ICUSB232X },
+       { USB_VENDOR_ABBOTT, USB_PRODUCT_ABBOTT_STEREO_PLUG }
 };
 
 int
@@ -209,26 +212,37 @@
 void
 uticom_attach(struct device *parent, struct device *self, void *aux)
 {
-       struct uticom_softc *sc = (struct uticom_softc *)self;
-       struct usb_attach_arg *uaa = aux;
-       usbd_device_handle dev = uaa->device;
-       usb_config_descriptor_t *cdesc;
-       usb_interface_descriptor_t *id;
-       usb_endpoint_descriptor_t *ed;
-       usbd_status err;
-       int status, i;
-       usb_device_descriptor_t *dd;
-       struct ucom_attach_args uca;
+       struct uticom_softc     *sc = (struct uticom_softc *)self;
+       struct usb_attach_arg   *uaa = aux;
+       usbd_device_handle       dev = uaa->device;
 
        sc->sc_udev = dev;
        sc->sc_iface = uaa->iface;
 
+       if (rootvp == NULL)
+               mountroothook_establish(uticom_attach_hook, sc);
+       else
+               uticom_attach_hook(sc);
+}
+
+void
+uticom_attach_hook(void *arg)
+{
+       struct uticom_softc             *sc = arg;
+       usb_config_descriptor_t         *cdesc;
+       usb_interface_descriptor_t      *id;
+       usb_endpoint_descriptor_t       *ed;
+       usbd_status                      err;
+       int                              status, i;
+       usb_device_descriptor_t         *dd;
+       struct ucom_attach_args          uca;
+
        /* Initialize endpoints. */
        uca.bulkin = uca.bulkout = -1;
        sc->sc_intr_number = -1;
        sc->sc_intr_pipe = NULL;
 
-       dd = usbd_get_device_descriptor(dev);
+       dd = usbd_get_device_descriptor(sc->sc_udev);
        DPRINTF(("%s: uticom_attach: num of configurations %d\n",
            sc->sc_dev.dv_xname, dd->bNumConfigurations));
 
@@ -241,7 +255,7 @@
        DPRINTF(("%s: uticom_attach: starting loading firmware\n",
            sc->sc_dev.dv_xname));
 
-       err = usbd_set_config_index(dev, UTICOM_CONFIG_INDEX, 1);
+       err = usbd_set_config_index(sc->sc_udev, UTICOM_CONFIG_INDEX, 1);
        if (err) {
                printf("%s: failed to set configuration: %s\n",
                    sc->sc_dev.dv_xname, usbd_errstr(err));
@@ -259,7 +273,7 @@
                return;
        }
 
-       err = usbd_device2interface_handle(dev, UTICOM_IFACE_INDEX,
+       err = usbd_device2interface_handle(sc->sc_udev, UTICOM_IFACE_INDEX,
            &sc->sc_iface);
        if (err) {
                printf("%s: failed to get interface: %s\n",
@@ -296,7 +310,7 @@
                }
        }
 
-       status = uticom_download_fw(sc, uca.bulkout, dev);
+       status = uticom_download_fw(sc, uca.bulkout, sc->sc_udev);
 
        if (status) {
                printf("%s: firmware download failed\n",
@@ -308,7 +322,7 @@
                    sc->sc_dev.dv_xname));
        }
 
-       status = usbd_reload_device_desc(dev);
+       status = usbd_reload_device_desc(sc->sc_udev);
        if (status) {
                printf("%s: error reloading device descriptor\n",
                    sc->sc_dev.dv_xname);
@@ -317,11 +331,11 @@
        }
 
 fwload_done:
-       dd = usbd_get_device_descriptor(dev);
+       dd = usbd_get_device_descriptor(sc->sc_udev);
        DPRINTF(("%s: uticom_attach: num of configurations %d\n",
            sc->sc_dev.dv_xname, dd->bNumConfigurations));
 
-       err = usbd_set_config_index(dev, UTICOM_ACTIVE_INDEX, 1);
+       err = usbd_set_config_index(sc->sc_udev, UTICOM_ACTIVE_INDEX, 1);
        if (err) {
                printf("%s: failed to set configuration: %s\n",
                    sc->sc_dev.dv_xname, usbd_errstr(err));
@@ -339,7 +353,7 @@
        }
 
        /* Get the interface (XXX: multiport chips are not supported yet). */
-       err = usbd_device2interface_handle(dev, UTICOM_IFACE_INDEX,
+       err = usbd_device2interface_handle(sc->sc_udev, UTICOM_IFACE_INDEX,
            &sc->sc_iface);
        if (err) {
                printf("failed to get interface: %s\n",
@@ -365,6 +379,7 @@
                    UE_GET_XFERTYPE(ed->bmAttributes) == UE_INTERRUPT) {
                        sc->sc_intr_number = ed->bEndpointAddress;
                        sc->sc_isize = UGETW(ed->wMaxPacketSize);
+
                }
        }
 
@@ -420,7 +435,7 @@
        uca.ibufsize = UTICOM_IBUFSZ;
        uca.obufsize = UTICOM_OBUFSZ;
        uca.ibufsizepad = UTICOM_IBUFSZ;
-       uca.device = dev;
+       uca.device = sc->sc_udev;
        uca.iface = sc->sc_iface;
        uca.opkthdrlen = 0;
        uca.methods = &uticom_methods;
@@ -439,7 +454,7 @@
            sc->sc_dev.dv_xname, uca.bulkin,
            uca.bulkout, sc->sc_intr_number));
 
-       sc->sc_subdev = config_found_sm(self, &uca, ucomprint, ucomsubmatch);
+       sc->sc_subdev = config_found_sm((struct device *)sc, &uca, ucomprint, 
ucomsubmatch);
 }
 
 int

Reply via email to