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