Module Name: src
Committed By: nat
Date: Wed Jul 6 06:00:40 UTC 2022
Modified Files:
src/sys/dev/usb: uplcom.c
Log Message:
Add support for HXN variants from openbsd.
To generate a diff of this commit:
cvs rdiff -u -r1.91 -r1.92 src/sys/dev/usb/uplcom.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/usb/uplcom.c
diff -u src/sys/dev/usb/uplcom.c:1.91 src/sys/dev/usb/uplcom.c:1.92
--- src/sys/dev/usb/uplcom.c:1.91 Sat Aug 7 16:19:17 2021
+++ src/sys/dev/usb/uplcom.c Wed Jul 6 06:00:40 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: uplcom.c,v 1.91 2021/08/07 16:19:17 thorpej Exp $ */
+/* $NetBSD: uplcom.c,v 1.92 2022/07/06 06:00:40 nat Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uplcom.c,v 1.91 2021/08/07 16:19:17 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uplcom.c,v 1.92 2022/07/06 06:00:40 nat Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -112,15 +112,21 @@ fail:
#define UPLCOM_IFACE_INDEX 0
#define UPLCOM_SECOND_IFACE_INDEX 1
-#define UPLCOM_SET_REQUEST 0x01
-#define UPLCOM_SET_CRTSCTS_0 0x41
-#define UPLCOM_SET_CRTSCTS_HX 0x61
-
-#define UPLCOM_N_SERIAL_CTS 0x80
+#define UPLCOM_SET_REQUEST 0x01
+#define UPLCOM_SET_CRTSCTS_0 0x41
+#define UPLCOM_SET_CRTSCTS_HX 0x61
+
+#define UPLCOM_N_SERIAL_CTS 0x80
+
+#define UPLCOM_HXN_SET_REQUEST 0x80
+#define UPLCOM_HXN_SET_CRTSCTS_REG 0x0A
+#define UPLCOM_HXN_SET_CRTSCTS 0xFA
+#define UPLCOM_HX_STATUS_REG 0x8080
enum pl2303_type {
UPLCOM_TYPE_0, /* we use this for all non-HX variants */
UPLCOM_TYPE_HX,
+ UPLCOM_TYPE_HXN,
};
struct uplcom_softc {
@@ -233,6 +239,13 @@ static const struct usb_devno uplcom_dev
{ USB_VENDOR_COREGA, USB_PRODUCT_COREGA_CGUSBRS232R },
/* Sharp CE-175TU (USB to Zaurus option port 15 adapter) */
{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_CE175TU },
+ /* Various */
+ { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303GB },
+ { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303GC },
+ { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303GE },
+ { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303GL },
+ { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303GS },
+ { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303GT },
};
#define uplcom_lookup(v, p) usb_lookup(uplcom_devs, v, p)
@@ -263,9 +276,11 @@ uplcom_attach(device_t parent, device_t
usb_config_descriptor_t *cdesc;
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
+ usb_device_request_t req;
char *devinfop;
const char *devname = device_xname(self);
usbd_status err;
+ uint8_t val;
int i;
struct ucom_attach_args ucaa;
@@ -301,12 +316,27 @@ uplcom_attach(device_t parent, device_t
/* determine chip type */
ddesc = usbd_get_device_descriptor(dev);
if (ddesc->bDeviceClass != UDCLASS_COMM &&
- ddesc->bMaxPacketSize == 0x40)
+ ddesc->bMaxPacketSize == 0x40) {
sc->sc_type = UPLCOM_TYPE_HX;
+ }
+
+ if (sc->sc_type == UPLCOM_TYPE_HX) {
+ req.bmRequestType = UT_READ_VENDOR_DEVICE;
+ req.bRequest = UPLCOM_SET_REQUEST;
+ USETW(req.wValue, UPLCOM_HX_STATUS_REG);
+ USETW(req.wIndex, sc->sc_iface_number);
+ USETW(req.wLength, 1);
+
+ err = usbd_do_request(sc->sc_udev, &req, &val);
+ if (err)
+ sc->sc_type = UPLCOM_TYPE_HXN;
+ }
#ifdef UPLCOM_DEBUG
/* print the chip type */
- if (sc->sc_type == UPLCOM_TYPE_HX) {
+ if (sc->sc_type == UPLCOM_TYPE_HXN) {
+ DPRINTF("chiptype HXN", 0, 0, 0, 0);
+ else if (sc->sc_type == UPLCOM_TYPE_HX) {
DPRINTF("chiptype HX", 0, 0, 0, 0);
} else {
DPRINTF("chiptype 0", 0, 0, 0, 0);
@@ -521,6 +551,9 @@ uplcom_reset(struct uplcom_softc *sc)
usb_device_request_t req;
usbd_status err;
+ if (sc->sc_type == UPLCOM_TYPE_HXN)
+ return 0;
+
req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
req.bRequest = UPLCOM_SET_REQUEST;
USETW(req.wValue, 0);
@@ -693,9 +726,17 @@ uplcom_set_crtscts(struct uplcom_softc *
UPLCOMHIST_FUNC(); UPLCOMHIST_CALLED();
req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
- req.bRequest = UPLCOM_SET_REQUEST;
- USETW(req.wValue, 0);
- if (sc->sc_type == UPLCOM_TYPE_HX)
+ if (sc->sc_type == UPLCOM_TYPE_HXN) {
+ req.bRequest = UPLCOM_HXN_SET_REQUEST;
+ USETW(req.wValue, UPLCOM_HXN_SET_CRTSCTS_REG);
+ } else {
+ req.bRequest = UPLCOM_SET_REQUEST;
+ USETW(req.wValue, 0);
+ }
+
+ if (sc->sc_type == UPLCOM_TYPE_HXN)
+ USETW(req.wIndex, UPLCOM_HXN_SET_CRTSCTS);
+ else if (sc->sc_type == UPLCOM_TYPE_HX)
USETW(req.wIndex, UPLCOM_SET_CRTSCTS_HX);
else
USETW(req.wIndex, UPLCOM_SET_CRTSCTS_0);