summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/bnu/line.c192
-rw-r--r--usr/src/cmd/cmd-inet/usr.bin/pppd/sys-solaris.c6
-rw-r--r--usr/src/cmd/cmd-inet/usr.bin/telnet/sys_bsd.c9
-rw-r--r--usr/src/cmd/devfsadm/port_link.c14
-rw-r--r--usr/src/cmd/login/login.c5
-rw-r--r--usr/src/cmd/lp/cmd/lpsched/ports.c135
-rw-r--r--usr/src/cmd/lp/filter/postscript/postio/postio.h158
-rw-r--r--usr/src/cmd/lp/model/lp.cat.c476
-rw-r--r--usr/src/cmd/mdb/common/kmdb/kmdb_promif.c7
-rw-r--r--usr/src/cmd/mdb/common/mdb/mdb_termio.c12
-rw-r--r--usr/src/cmd/netadm/iu.ap.sh4
-rw-r--r--usr/src/cmd/ssh/libssh/common/ttymodes.c21
-rw-r--r--usr/src/cmd/tip/tip.c7
-rw-r--r--usr/src/cmd/tput/tput.c77
-rw-r--r--usr/src/cmd/truss/codes.c11
-rw-r--r--usr/src/cmd/ttymon/sttytable.c12
-rw-r--r--usr/src/lib/libcurses/screen/delay.c16
-rw-r--r--usr/src/lib/libcurses/screen/newscreen.c12
-rw-r--r--usr/src/lib/libnsl/dial/line.c14
-rw-r--r--usr/src/pkgdefs/Makefile1
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/Makefile33
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/depend51
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/i.preserve33
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/pkginfo.tmpl50
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/postinstall94
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/preremove37
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/prototype_com48
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/prototype_i38651
-rw-r--r--usr/src/pkgdefs/SUNWuftdi/prototype_sparc49
-rw-r--r--usr/src/pkgdefs/SUNWusbu/prototype_com5
-rw-r--r--usr/src/pkgdefs/common_files/i.iuap5
-rw-r--r--usr/src/ucbcmd/stty/stty.c805
-rw-r--r--usr/src/ucbcmd/stty/sttytable.c44
-rw-r--r--usr/src/ucbcmd/tset/tset.c1054
-rw-r--r--usr/src/uts/Makefile.uts8
-rw-r--r--usr/src/uts/common/Makefile.files2
-rw-r--r--usr/src/uts/common/Makefile.rules7
-rw-r--r--usr/src/uts/common/io/consconfig_dacf.c10
-rw-r--r--usr/src/uts/common/io/usb/clients/usbser/usbftdi/uftdi_dsd.c1946
-rw-r--r--usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbftdi.conf42
-rw-r--r--usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbser_uftdi.c188
-rw-r--r--usr/src/uts/common/io/usb/clients/usbser/usbsacm/usbsacm.c5
-rw-r--r--usr/src/uts/common/io/usb/clients/usbser/usbser.c201
-rw-r--r--usr/src/uts/common/io/usb/inc.flg6
-rw-r--r--usr/src/uts/common/io/usb/usbdevs2515
-rw-r--r--usr/src/uts/common/io/usb/usbdevs2h.awk318
-rw-r--r--usr/src/uts/common/io/warlock/usbftdi.wlcmd90
-rw-r--r--usr/src/uts/common/io/warlock/usbftdi_with_usba.wlcmd217
-rw-r--r--usr/src/uts/common/sys/Makefile6
-rw-r--r--usr/src/uts/common/sys/termios.h6
-rw-r--r--usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_reg.h402
-rw-r--r--usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_var.h172
-rw-r--r--usr/src/uts/intel/Makefile.intel.shared1
-rw-r--r--usr/src/uts/intel/usbftdi/Makefile140
-rw-r--r--usr/src/uts/sparc/Makefile.sparc.shared1
-rw-r--r--usr/src/uts/sparc/usbftdi/Makefile140
56 files changed, 8276 insertions, 1695 deletions
diff --git a/usr/src/cmd/bnu/line.c b/usr/src/cmd/bnu/line.c
index cc3bb1e82a..d3992cc0e1 100644
--- a/usr/src/cmd/bnu/line.c
+++ b/usr/src/cmd/bnu/line.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,18 +18,17 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 1995 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/* This is a new line.c, which consists of line.c and culine.c
+/*
+ * This is a new line.c, which consists of line.c and culine.c
* merged together.
*/
@@ -69,19 +67,20 @@ static struct sg_spds {
{230400, B230400},
{307200, B307200},
{460800, B460800},
+ {921600, B921600},
{0, 0}
};
-#define PACKSIZE 64
-#define HEADERSIZE 6
+#define PACKSIZE 64
+#define HEADERSIZE 6
GLOBAL int
- packsize = PACKSIZE,
- xpacksize = PACKSIZE;
+ packsize = PACKSIZE,
+ xpacksize = PACKSIZE;
-#define SNDFILE 'S'
-#define RCVFILE 'R'
-#define RESET 'X'
+#define SNDFILE 'S'
+#define RCVFILE 'R'
+#define RESET 'X'
#ifdef PKSPEEDUP
GLOBAL int linebaudrate; /* for speedup hook in pk1.c */
@@ -111,7 +110,7 @@ static struct termios Savettybs;
* if spwant == 0, speed is untouched
* type is unused, but needed for compatibility
*
- * return:
+ * return:
* none
*/
/*ARGSUSED*/
@@ -135,9 +134,9 @@ int tty, spwant, type;
ttbufs.c_oflag = ttbuf.c_oflag;
ttbufs.c_iflag = ttbuf.c_iflag;
ttbufs.c_cflag = ttbuf.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
ttbufs.c_cc[i] = ttbuf.c_cc[i];
- }
+ }
}
if (spwant > 0) {
for (ps = spds; ps->sp_val; ps++)
@@ -145,8 +144,8 @@ int tty, spwant, type;
speed = ps->sp_name;
break;
}
- if ( speed < 0 )
- DEBUG(5, "speed (%d) not supported\n", spwant);
+ if (speed < 0)
+ DEBUG(5, "speed (%d) not supported\n", spwant);
ASSERT(speed >= 0, "BAD SPEED", "", spwant);
ttbufs.c_cflag &= 0xffff0000;
cfsetospeed(&ttbufs, speed);
@@ -182,31 +181,31 @@ int tty, spwant, type;
#endif /* NO_MODEM_CTRL */
ttbufs.c_cflag &= ~CLOCAL;
- if ( !EQUALS(Progname, "uucico") ) {
+ if (!EQUALS(Progname, "uucico")) {
/* set attributes associated with -h, -t, -e, and -o options */
ttbufs.c_iflag = (IGNPAR | IGNBRK | IXON | IXOFF);
ttbufs.c_cc[VEOF] = '\1';
- ttbufs.c_cflag |= ( CREAD | (speed ? HUPCL : 0));
+ ttbufs.c_cflag |= (CREAD | (speed ? HUPCL : 0));
- if ( line_8bit ) {
- ttbufs.c_cflag |= CS8;
- ttbufs.c_iflag &= ~ISTRIP;
+ if (line_8bit) {
+ ttbufs.c_cflag |= CS8;
+ ttbufs.c_iflag &= ~ISTRIP;
} else {
- if (Evenflag) { /*even parity -e */
- ttbufs.c_cflag &= ~PARODD;
- } else if(Oddflag) { /*odd parity -o */
- ttbufs.c_cflag |= PARODD;
- }
- ttbufs.c_cflag |= CS7|PARENB;
- ttbufs.c_iflag |= ISTRIP;
+ if (Evenflag) { /* even parity -e */
+ ttbufs.c_cflag &= ~PARODD;
+ } else if (Oddflag) { /* odd parity -o */
+ ttbufs.c_cflag |= PARODD;
+ }
+ ttbufs.c_cflag |= CS7|PARENB;
+ ttbufs.c_iflag |= ISTRIP;
}
- if(!Duplex) /*half duplex -h */
- ttbufs.c_iflag &= ~(IXON | IXOFF);
- if(Terminal) /* -t */
- ttbufs.c_oflag |= (OPOST | ONLCR);
+ if (!Duplex) /* half duplex -h */
+ ttbufs.c_iflag &= ~(IXON | IXOFF);
+ if (Terminal) /* -t */
+ ttbufs.c_oflag |= (OPOST | ONLCR);
} else { /* non-uucico */
ttbufs.c_cflag |= (CS8 | CREAD | (speed ? HUPCL : 0));
@@ -219,16 +218,14 @@ int tty, spwant, type;
ttbuf.c_oflag = ttbufs.c_oflag;
ttbuf.c_iflag = ttbufs.c_iflag;
ttbuf.c_cflag = ttbufs.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
ttbuf.c_cc[i] = ttbufs.c_cc[i];
ASSERT((*Ioctl)(tty, TCSETAW, &ttbuf) >= 0,
- "RETURN FROM fixline ioctl", "", errno);
+ "RETURN FROM fixline ioctl", "", errno);
} else {
ASSERT((*Ioctl)(tty, TCSETSW, &ttbufs) >= 0,
- "RETURN FROM fixline ioctl", "", errno);
+ "RETURN FROM fixline ioctl", "", errno);
}
-
- return;
}
GLOBAL void
@@ -243,16 +240,14 @@ int dcf;
ttbuf.c_cflag |= HUPCL;
(void) (*Ioctl)(dcf, TCSETAW, &ttbuf);
}
- return;
}
GLOBAL void
ttygenbrk(fn)
register int fn;
{
- if (isatty(fn))
+ if (isatty(fn))
(void) (*Ioctl)(fn, TCSBRK, 0);
- return;
}
@@ -268,10 +263,10 @@ register char type;
static struct termio tbuf;
static struct termios tbufs;
int i, vtime, istermios, ospeed;
-
+
DEBUG(2, "setline - %c\n", type);
- if ((istermios = (*Ioctl)(Ifn, TCGETS, &tbufs)) < 0) {
+ if ((istermios = (*Ioctl)(Ifn, TCGETS, &tbufs)) < 0) {
if ((*Ioctl)(Ifn, TCGETA, &tbuf) != 0) {
return;
} else {
@@ -279,7 +274,7 @@ register char type;
tbufs.c_oflag = tbuf.c_oflag;
tbufs.c_iflag = tbuf.c_iflag;
tbufs.c_cflag = tbuf.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
tbufs.c_cc[i] = tbuf.c_cc[i];
}
}
@@ -304,6 +299,7 @@ register char type;
case B230400:
case B307200:
case B460800:
+ case B921600:
case B9600:
vtime = 1;
break;
@@ -323,59 +319,66 @@ register char type;
tbuf.c_oflag = tbufs.c_oflag;
tbuf.c_iflag = tbufs.c_iflag;
tbuf.c_cflag = tbufs.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
tbuf.c_cc[i] = tbufs.c_cc[i];
- if ( (*Ioctl)(Ifn, TCSETAW, &tbuf) != 0 )
- DEBUG(4, "setline Ioctl failed errno=%d\n", errno);
- } else {
- if ( (*Ioctl)(Ifn, TCSETSW, &tbufs) != 0 )
- DEBUG(4, "setline Ioctl failed errno=%d\n", errno);
- }
+ if ((*Ioctl)(Ifn, TCSETAW, &tbuf) != 0)
+ DEBUG(4, "setline Ioctl failed errno=%d\n",
+ errno);
+ } else {
+ if ((*Ioctl)(Ifn, TCSETSW, &tbufs) != 0)
+ DEBUG(4,
+ "setline Ioctl failed errno=%d\n",
+ errno);
+ }
}
break;
case SNDFILE:
case RESET:
if (tbufs.c_cc[VMIN] != HEADERSIZE) {
- tbufs.c_cc[VMIN] = HEADERSIZE;
- if (istermios < 0) {
- tbuf.c_lflag = tbufs.c_lflag;
- tbuf.c_oflag = tbufs.c_oflag;
- tbuf.c_iflag = tbufs.c_iflag;
- tbuf.c_cflag = tbufs.c_cflag;
- for(i = 0; i < NCC; i++)
- tbuf.c_cc[i] = tbufs.c_cc[i];
- if ( (*Ioctl)(Ifn, TCSETAW, &tbuf) != 0 )
- DEBUG(4, "setline Ioctl failed errno=%d\n", errno);
- } else {
- if ( (*Ioctl)(Ifn, TCSETSW, &tbufs) != 0 )
- DEBUG(4, "setline Ioctl failed errno=%d\n", errno);
- }
+ tbufs.c_cc[VMIN] = HEADERSIZE;
+ if (istermios < 0) {
+ tbuf.c_lflag = tbufs.c_lflag;
+ tbuf.c_oflag = tbufs.c_oflag;
+ tbuf.c_iflag = tbufs.c_iflag;
+ tbuf.c_cflag = tbufs.c_cflag;
+ for (i = 0; i < NCC; i++)
+ tbuf.c_cc[i] = tbufs.c_cc[i];
+ if ((*Ioctl)(Ifn, TCSETAW, &tbuf) != 0)
+ DEBUG(4,
+ "setline Ioctl failed errno=%d\n",
+ errno);
+ } else {
+ if ((*Ioctl)(Ifn, TCSETSW, &tbufs) != 0)
+ DEBUG(4,
+ "setline Ioctl failed errno=%d\n",
+ errno);
+ }
}
break;
}
- return;
}
GLOBAL int
savline()
{
if ((Saved_termios = (*Ioctl)(0, TCGETS, &Savettybs)) < 0) {
- if ( (*Ioctl)(0, TCGETA, &Savettyb) != 0 ) {
- Saved_line = FALSE;
- } else {
- Saved_line = TRUE;
- Savettyb.c_cflag = (Savettyb.c_cflag & ~CS8) | CS7 | PARENB;
- Savettyb.c_oflag |= OPOST;
- Savettyb.c_lflag |= (ISIG|ICANON|ECHO);
- }
+ if ((*Ioctl)(0, TCGETA, &Savettyb) != 0) {
+ Saved_line = FALSE;
+ } else {
+ Saved_line = TRUE;
+ Savettyb.c_cflag =
+ (Savettyb.c_cflag & ~CS8) | CS7 | PARENB;
+ Savettyb.c_oflag |= OPOST;
+ Savettyb.c_lflag |= (ISIG|ICANON|ECHO);
+ }
} else {
Saved_line = TRUE;
Savettybs.c_cflag = (Savettybs.c_cflag & ~CS8) | CS7 | PARENB;
Savettybs.c_oflag |= OPOST;
Savettybs.c_lflag |= (ISIG|ICANON|ECHO);
}
- return(0);
+ return (0);
}
#ifdef SYTEK
@@ -398,14 +401,14 @@ int tty, spwant;
int i, ret, istermios;
if ((istermios = (*Ioctl)(tty, TCGETS, &ttbufs)) < 0) {
- if ( (*Ioctl)(tty, TCGETA, &ttbuf) != 0 ) {
+ if ((*Ioctl)(tty, TCGETA, &ttbuf) != 0) {
return;
} else {
ttbufs.c_lflag = ttbuf.c_lflag;
ttbufs.c_oflag = ttbuf.c_oflag;
ttbufs.c_iflag = ttbuf.c_iflag;
ttbufs.c_cflag = ttbuf.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
ttbufs.c_cc[i] = ttbuf.c_cc[i];
}
}
@@ -427,13 +430,12 @@ int tty, spwant;
ttbuf.c_oflag = ttbufs.c_oflag;
ttbuf.c_iflag = ttbufs.c_iflag;
ttbuf.c_cflag = ttbufs.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
ttbuf.c_cc[i] = ttbufs.c_cc[i];
ret = (*Ioctl)(tty, TCSETAW, &ttbuf);
} else
ret = (*Ioctl)(tty, TCSETAWS &ttbufs);
ASSERT(ret >= 0, "RETURN FROM sytfixline", "", ret);
- return;
}
GLOBAL void
@@ -443,13 +445,12 @@ int tty;
struct termio ttbuf;
int ret;
- if ( (*Ioctl)(tty, TCGETA, &ttbuf) != 0 )
+ if ((*Ioctl)(tty, TCGETA, &ttbuf) != 0)
return;
ttbuf.c_cflag &= ~CLOCAL;
ttbuf.c_cflag |= CREAD|HUPCL;
ret = (*Ioctl)(tty, TCSETAW, &ttbuf);
ASSERT(ret >= 0, "RETURN FROM sytfix2line", "", ret);
- return;
}
#endif /* SYTEK */
@@ -457,13 +458,13 @@ int tty;
GLOBAL int
restline()
{
- if ( Saved_line == TRUE ) {
+ if (Saved_line == TRUE) {
if (Saved_termios < 0)
- return((*Ioctl)(0, TCSETAW, &Savettyb));
+ return ((*Ioctl)(0, TCSETAW, &Savettyb));
else
- return((*Ioctl)(0, TCSETSW, &Savettybs));
+ return ((*Ioctl)(0, TCSETSW, &Savettybs));
}
- return(0);
+ return (0);
}
#else /* !ATTSVTTY */
@@ -517,16 +518,14 @@ int tty, spwant, type;
(void) (*Ioctl)(tty, TIOCSETP, &ttbuf);
(void) (*Ioctl)(tty, TIOCHPCL, STBNULL);
(void) (*Ioctl)(tty, TIOCEXCL, STBNULL);
- return;
}
GLOBAL void
sethup(dcf)
int dcf;
{
- if (isatty(dcf))
+ if (isatty(dcf))
(void) (*Ioctl)(dcf, TIOCHPCL, STBNULL);
- return;
}
/*
@@ -545,7 +544,6 @@ ttygenbrk(fn)
(void) (*Ioctl)(fn, TIOCCBRK, 0);
#endif
}
- return;
}
/*
@@ -559,21 +557,21 @@ setline(dummy) { }
GLOBAL int
savline()
{
- if ( (*Ioctl)(0, TIOCGETP, &Savettyb) != 0 )
+ if ((*Ioctl)(0, TIOCGETP, &Savettyb) != 0)
Saved_line = FALSE;
else {
Saved_line = TRUE;
Savettyb.sg_flags |= ECHO;
Savettyb.sg_flags &= ~RAW;
}
- return(0);
+ return (0);
}
GLOBAL int
restline()
{
- if ( Saved_line == TRUE )
- return((*Ioctl)(0, TIOCSETP, &Savettyb));
- return(0);
+ if (Saved_line == TRUE)
+ return ((*Ioctl)(0, TIOCSETP, &Savettyb));
+ return (0);
}
#endif
diff --git a/usr/src/cmd/cmd-inet/usr.bin/pppd/sys-solaris.c b/usr/src/cmd/cmd-inet/usr.bin/pppd/sys-solaris.c
index 05c8eadaaa..a0d76768e5 100644
--- a/usr/src/cmd/cmd-inet/usr.bin/pppd/sys-solaris.c
+++ b/usr/src/cmd/cmd-inet/usr.bin/pppd/sys-solaris.c
@@ -1,7 +1,7 @@
/*
* System-dependent procedures for pppd under Solaris 2.x (SunOS 5.x).
*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* Permission to use, copy, modify, and distribute this software and its
@@ -39,7 +39,6 @@
* OR MODIFICATIONS.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
#define RCSID "$Id: sys-solaris.c,v 1.2 2000/04/21 01:27:57 masputra Exp $"
#include <limits.h>
@@ -1211,6 +1210,9 @@ struct speed {
#ifdef B460800
{ 460800, B460800 },
#endif
+#ifdef B921600
+ { 921600, B921600 },
+#endif
{ 0, 0 }
};
diff --git a/usr/src/cmd/cmd-inet/usr.bin/telnet/sys_bsd.c b/usr/src/cmd/cmd-inet/usr.bin/telnet/sys_bsd.c
index 541b7c5d07..37ed50645b 100644
--- a/usr/src/cmd/cmd-inet/usr.bin/telnet/sys_bsd.c
+++ b/usr/src/cmd/cmd-inet/usr.bin/telnet/sys_bsd.c
@@ -1,10 +1,8 @@
/*
- * Copyright 1994-2002 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Copyright (c) 1988, 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -562,7 +560,8 @@ static struct termspeeds {
{ 4800, B4800 }, { 9600, B9600 }, { 19200, B19200 },
{ 38400, B38400 }, { 57600, B57600 }, { 76800, B76800 },
{ 115200, B115200 }, { 153600, B153600 }, { 230400, B230400 },
- { 307200, B307200 }, { 460800, B460800 }, { -1, B0 }
+ { 307200, B307200 }, { 460800, B460800 }, { 921600, B921600 },
+ { -1, B0 }
};
void
@@ -733,7 +732,7 @@ fatal_tty_error(char *doing_what)
{
TerminalNewMode(-1);
(void) fprintf(stderr, "Error processing %s: %s\n", doing_what,
- strerror(errno));
+ strerror(errno));
exit(1);
}
diff --git a/usr/src/cmd/devfsadm/port_link.c b/usr/src/cmd/devfsadm/port_link.c
index 80c5e5bc21..1b773e0154 100644
--- a/usr/src/cmd/devfsadm/port_link.c
+++ b/usr/src/cmd/devfsadm/port_link.c
@@ -18,6 +18,7 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
@@ -37,6 +38,7 @@
#include <sys/wait.h>
#include <fcntl.h>
#include <devfsadm.h>
+#include <syslog.h>
/*
* sacadm output parsing
@@ -273,8 +275,8 @@ serial_port_create(di_minor_t minor, di_node_t node)
}
/*
- * add the minor name to the physical path so we can
- * enum the port# and create the the link.
+ * add the minor name to the physical path so we can
+ * enum the port# and create the link.
*/
(void) strcpy(p_path, devfspath);
(void) strcat(p_path, ":");
@@ -293,6 +295,14 @@ serial_port_create(di_minor_t minor, di_node_t node)
(void) devfsadm_mklink(l_path, node, minor, 0);
/*
+ * This is probably a USB serial port coming into the system
+ * because someone just plugged one in. Log an indication of
+ * this to syslog just in case someone wants to know what the
+ * name of the new serial device is ..
+ */
+ (void) syslog(LOG_INFO, "serial device /dev/%s present", l_path);
+
+ /*
* update the portmon database if this port falls within
* the valid range of ports.
*/
diff --git a/usr/src/cmd/login/login.c b/usr/src/cmd/login/login.c
index 5670eda93c..758e60bcb3 100644
--- a/usr/src/cmd/login/login.c
+++ b/usr/src/cmd/login/login.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -1564,7 +1564,8 @@ usage(void)
static char *speeds[] = {
"0", "50", "75", "110", "134", "150", "200", "300",
"600", "1200", "1800", "2400", "4800", "9600", "19200", "38400",
- "57600", "76800", "115200", "153600", "230400", "307200", "460800"
+ "57600", "76800", "115200", "153600", "230400", "307200", "460800",
+ "921600"
};
#define NSPEEDS (sizeof (speeds) / sizeof (speeds[0]))
diff --git a/usr/src/cmd/lp/cmd/lpsched/ports.c b/usr/src/cmd/lp/cmd/lpsched/ports.c
index fefe30dce2..cf1e8a226f 100644
--- a/usr/src/cmd/lp/cmd/lpsched/ports.c
+++ b/usr/src/cmd/lp/cmd/lpsched/ports.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -24,12 +23,10 @@
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include "termio.h"
#include "dial.h"
#include "unistd.h"
@@ -39,33 +36,33 @@
#include <sys/ioccom.h>
#include <sys/ecppsys.h>
-static void sigalrm ( int );
-static int push_module ( int , char * , char * );
+static void sigalrm(int);
+static int push_module(int, char *, char *);
static int SigAlrm;
-/**
- ** open_dialup() - OPEN A PORT TO A ``DIAL-UP'' PRINTER
- **/
+/*
+ * open_dialup() - OPEN A PORT TO A ``DIAL-UP'' PRINTER
+ */
int
-open_dialup ( char *ptype, PRINTER *pp)
+open_dialup(char *ptype, PRINTER *pp)
{
static char *baud_table[] = {
- 0,
- "50",
- "75",
- "110",
- "134",
- "150",
- "200",
- "300",
- "600",
- "1200",
- "1800",
- "2400",
- "4800",
- "9600",
+ 0,
+ "50",
+ "75",
+ "110",
+ "134",
+ "150",
+ "200",
+ "300",
+ "600",
+ "1200",
+ "1800",
+ "2400",
+ "4800",
+ "9600",
"19200",
"38400",
"57600",
@@ -74,7 +71,8 @@ open_dialup ( char *ptype, PRINTER *pp)
"153600",
"230400",
"307200",
- "460800"
+ "460800",
+ "921600"
};
struct termio tio;
@@ -82,8 +80,7 @@ open_dialup ( char *ptype, PRINTER *pp)
CALL call;
- int speed,
- fd;
+ int speed, fd;
char *sspeed;
@@ -105,8 +102,8 @@ open_dialup ( char *ptype, PRINTER *pp)
* move it.
*/
if (fd != 1) {
- dup2 (fd, 1);
- Close (fd);
+ dup2(fd, 1);
+ Close(fd);
}
/*
@@ -123,51 +120,46 @@ open_dialup ( char *ptype, PRINTER *pp)
* to override us (although it would be probably be
* silly for him or her to do so.)
*/
- if (ioctl (1, TCGETS, &tios) < 0) {
- ioctl (1, TCGETA, &tio);
+ if (ioctl(1, TCGETS, &tios) < 0) {
+ ioctl(1, TCGETA, &tio);
tios.c_cflag = tio.c_cflag;
}
if ((sspeed = baud_table[cfgetospeed(&tios)]) != NULL) {
if (pp->stty == NULL)
pp->stty = "";
+
{
- register char *new_stty = Malloc(
- strlen(pp->stty) + 1 + strlen(sspeed) + 1
- );
+ char *new_stty = Malloc(
+ strlen(pp->stty) + 1 + strlen(sspeed) + 1);
- sprintf (new_stty, "%s %s", pp->stty, sspeed);
+ sprintf(new_stty, "%s %s", pp->stty, sspeed);
- /*
- * We can trash "pp->stty" because
- * the parent process has the good copy.
- */
- pp->stty = new_stty;
+ /*
+ * We can trash "pp->stty" because
+ * the parent process has the good copy.
+ */
+ pp->stty = new_stty;
}
}
return (0);
}
-/**
- ** open_direct() - OPEN A PORT TO A DIRECTLY CONNECTED PRINTER
- **/
+/*
+ * open_direct() - OPEN A PORT TO A DIRECTLY CONNECTED PRINTER
+ */
int
open_direct(char *ptype, PRINTER *pp)
{
- short bufsz = -1,
- cps = -1;
-
- int open_mode,
- fd;
-
- register unsigned int oldalarm,
- newalarm = 0;
+ short bufsz = -1, cps = -1;
+ int open_mode, fd;
+ register unsigned int oldalarm, newalarm = 0;
char *device;
struct ecpp_transfer_parms ecpp_params; /* for ECPP port checking */
- char **modules = NULL;
+ char **modules = NULL;
struct flock lck;
struct stat buf;
@@ -181,8 +173,8 @@ open_direct(char *ptype, PRINTER *pp)
* has a huge buffer that, in the worst case, would take
* a long time to drain.
*/
- tidbit (ptype, "bufsz", &bufsz);
- tidbit (ptype, "cps", &cps);
+ tidbit(ptype, "bufsz", &bufsz);
+ tidbit(ptype, "cps", &cps);
if (bufsz > 0 && cps > 0)
newalarm = (((long)bufsz * 1100) / cps) / 1000;
if (newalarm < 60)
@@ -227,8 +219,8 @@ open_direct(char *ptype, PRINTER *pp)
return (EXEC_EXIT_TMOUT);
}
- alarm (oldalarm);
- signal (SIGALRM, oldsig);
+ alarm(oldalarm);
+ signal(SIGALRM, oldsig);
/*
* Lock the file in case two "printers" are defined on the
@@ -236,7 +228,7 @@ open_direct(char *ptype, PRINTER *pp)
*/
lck.l_type = F_WRLCK;
- lck.l_whence = 0;
+ lck.l_whence = 0;
lck.l_start = 0L;
lck.l_len = 0L;
@@ -250,8 +242,8 @@ open_direct(char *ptype, PRINTER *pp)
* in case....
*/
if (fd != 1) {
- dup2 (fd, 1);
- Close (fd);
+ dup2(fd, 1);
+ Close(fd);
}
/*
@@ -292,7 +284,7 @@ open_direct(char *ptype, PRINTER *pp)
* instructed not to.
*/
while (ioctl(1, I_POP, 0) == 0)
- ;
+ ;
/*
* Now push either the administrator specified modules
@@ -312,28 +304,27 @@ open_direct(char *ptype, PRINTER *pp)
return (0);
}
-/**
- ** sigalrm()
- **/
+/*
+ * sigalrm()
+ */
static void
sigalrm(int ignore)
{
- signal (SIGALRM, SIG_IGN);
+ signal(SIGALRM, SIG_IGN);
SigAlrm = 1;
- return;
}
-/**
- ** push_module()
- **/
+/*
+ * push_module()
+ */
static int
push_module(int fd, char *device, char *module)
{
- int ret = ioctl(fd, I_PUSH, module);
+ int ret = ioctl(fd, I_PUSH, module);
if (ret == -1)
- note ("push (%s) on %s failed (%s)\n", module, device, PERROR);
+ note("push (%s) on %s failed (%s)\n", module, device, PERROR);
return (ret);
}
diff --git a/usr/src/cmd/lp/filter/postscript/postio/postio.h b/usr/src/cmd/lp/filter/postscript/postio/postio.h
index a9f5ceedc4..d9dbb7ccce 100644
--- a/usr/src/cmd/lp/filter/postscript/postio/postio.h
+++ b/usr/src/cmd/lp/filter/postscript/postio/postio.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,70 +18,71 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 1995 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
+#ifndef _POSTIO_POSTIO_H
+#define _POSTIO_POSTIO_H
-#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.2 */
/*
*
* Definitions used by the program that sends jobs to PostScript printers.
*
- * POSTBEGIN, if it's not NULL, is some PostScript code that's sent to the printer
- * before any of the input files. It's not terribly important since the same thing
- * can be accomplished in other ways, but this approach is convenient. POSTBEGIN
- * is initialized so as to disable job timeouts. The string can also be set on the
- * command line using the -P option.
+ * POSTBEGIN, if it's not NULL, is some PostScript code that's sent to the
+ * printer before any of the input files. It's not terribly important since
+ * the same thing can be accomplished in other ways, but this approach is
+ * convenient. POSTBEGIN is initialized so as to disable job timeouts. The
+ * string can also be set on the command line using the -P option.
*
*/
-#define POSTBEGIN "%!PS\nstatusdict /waittimeout 0 put\n"
+#define POSTBEGIN "%!PS\nstatusdict /waittimeout 0 put\n"
/*
- *
- * The following help determine where postio is when it's running - either in the
- * START, SEND, or DONE states. Primarily controls what's done in getstatus().
- * RADIAN occasionally had problems with two way conversations. Anyway this stuff
- * can be used to prevent status queries while we're transmitting a job. Enabled
- * by the -q option.
+ * The following help determine where postio is when it's running - either
+ * in the START, SEND, or DONE states. Primarily controls what's done in
+ * getstatus().
+ * RADIAN occasionally had problems with two way conversations. Anyway this
+ * stuff can be used to prevent status queries while we're transmitting a
+ * job. Enabled by the -q option.
*
*/
-#define NOTCONNECTED 0
-#define START 1
-#define SEND 2
-#define DONE 3
+#define NOTCONNECTED 0
+#define START 1
+#define SEND 2
+#define DONE 3
/*
- *
- * Previous versions of postio only ran as a single process. That was (and still
- * is) convenient, but meant we could only flow control one direction. Data coming
- * back from the printer occasionally got lost, but that didn't often hurt (except
- * for lost error messages). Anyway I've added code that lets you split the program
- * into separate read and write processes, thereby helping to prevent data loss in
- * both directions. It should be particularly useful when you're sending a job that
- * you expect will be returning useful data over the communications line.
- *
- * The next three definitions control what's done with data on communications line.
- * The READ flag means the line can be read, while the WRITE flag means it can be
- * written. When we're running as a single process both flags are set. I tried to
- * overlay the separate read/write process code on what was there and working for
- * one process. The implementation isn't as good as it could be, but should be
- * safe. The single process version still works, and remains the default.
- *
+ * Previous versions of postio only ran as a single process. That was (and
+ * still * is) convenient, but meant we could only flow control one direction.
+ * Data coming back from the printer occasionally got lost, but that didn't
+ * often hurt (except for lost error messages). Anyway I've added code that
+ * lets you split the program into separate read and write processes, thereby
+ * helping to prevent data loss in both directions. It should be particularly
+ * useful when you're sending a job that you expect will be returning useful
+ * data over the communications line.
+ *
+ * The next three definitions control what's done with data on communications
+ * line. The READ flag means the line can be read, while the WRITE flag means
+ * it can be written. When we're running as a single process both flags are
+ * set. I tried to overlay the separate read/write process code on what was
+ * there and working for one process. The implementation isn't as good as it
+ * could be, but should be safe. The single process version still works,
+ * and remains the default.
*/
-#define READ 1
-#define WRITE 2
-#define READWRITE 3
+#define READ 1
+#define WRITE 2
+#define READWRITE 3
/*
- *
* Messages generated on the printer and returned over the communications line
* look like,
*
@@ -105,35 +105,33 @@
* The following constants are used to classify the recognized printer states.
* readline() reads complete lines from ttyi and stores them in array mesg[].
* getstatus() looks for the "%%[ " and " ]%%" delimiters that bracket printer
- * messages and if found it tries to parse the enclosed message. After the lookup
- * one of the following numbers is returned as an indication of the existence or
- * content of the printer message. The return value is used in start(), send(),
- * and done() to figure out what's happening and what can be done next.
- *
+ * messages and if found it tries to parse the enclosed message. After the
+ * lookup one of the following numbers is returned as an indication of the
+ * existence or content of the printer message. The return value is used in
+ * start(), send(), and done() to figure out what's happening and what can
+ * be done next.
*/
-#define BUSY 0 /* processing data already sent */
-#define WAITING 1 /* printer wants more data */
-#define PRINTING 2 /* printing a page */
-#define IDLE 3 /* ready to start the next job */
-#define ENDOFJOB 4 /* readline() builds this up on EOF */
-#define PRINTERERROR 5 /* PrinterError - eg. out of paper */
-#define ERROR 6 /* some kind of PostScript error */
-#define FLUSHING 7 /* throwing out the rest of the job */
-#define INITIALIZING 8 /* printer is booting */
-#define DISCONNECT 9 /* from Datakit! */
-#define UNKNOWN 10 /* in case we missed anything */
-#define NOSTATUS 11 /* no response from the printer */
-
-#define WRITEPROCESS 12 /* dummy states for write process */
-#define INTERACTIVE 13 /* and interactive mode */
+#define BUSY 0 /* processing data already sent */
+#define WAITING 1 /* printer wants more data */
+#define PRINTING 2 /* printing a page */
+#define IDLE 3 /* ready to start the next job */
+#define ENDOFJOB 4 /* readline() builds this up on EOF */
+#define PRINTERERROR 5 /* PrinterError - eg. out of paper */
+#define ERROR 6 /* some kind of PostScript error */
+#define FLUSHING 7 /* throwing out the rest of the job */
+#define INITIALIZING 8 /* printer is booting */
+#define DISCONNECT 9 /* from Datakit! */
+#define UNKNOWN 10 /* in case we missed anything */
+#define NOSTATUS 11 /* no response from the printer */
+
+#define WRITEPROCESS 12 /* dummy states for write process */
+#define INTERACTIVE 13 /* and interactive mode */
/*
- *
* An array of type Status is used, in getstatus(), to figure out the printer's
* current state. Just helps convert strings representing the current state into
* integer codes that other routines use.
- *
*/
typedef struct {
@@ -144,17 +142,17 @@ typedef struct {
} Status;
/*
- *
- * STATUS is used to initialize an array of type Status that translates the ASCII
- * strings returned by the printer into appropriate codes that can be used later
- * on in the program. getstatus() converts characters to lower case, so if you
- * add any entries make them lower case and put them in before the UNKNOWN entry.
+ * STATUS is used to initialize an array of type Status that translates the
+ * ASCII strings returned by the printer into appropriate codes that can be
+ * used later on in the program. getstatus() converts characters to lower
+ * case, so if you add any entries make them lower case and put them in
+ * before the UNKNOWN entry.
* The lookup terminates when we get a match or when an entry with a NULL state
* is found.
*
*/
-#define STATUS \
+#define STATUS \
\
{ \
"busy", BUSY, \
@@ -176,12 +174,12 @@ typedef struct {
*
*/
-#define BAUDRATE B9600
+#define BAUDRATE B9600
/*
*
- * An array of type Baud is used, in routine getbaud(), to translate ASCII strings
- * into termio values that represent the requested baud rate.
+ * An array of type Baud is used, in routine getbaud(), to translate ASCII
+ * strings into termio values that represent the requested baud rate.
*
*/
@@ -200,7 +198,7 @@ typedef struct {
*
*/
-#define BAUDTABLE \
+#define BAUDTABLE \
\
{ \
"9600", B9600, \
@@ -233,17 +231,21 @@ typedef struct {
"307.2", B307200, \
"460800", B460800, \
"460.8", B460800, \
+ "921600", B921600, \
+ "921.6", B921600, \
NULL, B9600 \
}
/*
*
* A few miscellaneous definitions. BLOCKSIZE is the default size of the buffer
- * used for reading the input files (changed with the -B option). MESGSIZE is the
- * size of the character array used to store printer status lines - don't make it
- * too small!
+ * used for reading the input files (changed with the -B option). MESGSIZE is
+ * the size of the character array used to store printer status lines - don't
+ * make it too small!
*
*/
-#define BLOCKSIZE 2048
-#define MESGSIZE 512
+#define BLOCKSIZE 2048
+#define MESGSIZE 512
+
+#endif /* _POSTIO_POSTIO_H */
diff --git a/usr/src/cmd/lp/model/lp.cat.c b/usr/src/cmd/lp/model/lp.cat.c
index 0483ea4a2e..29f14ad318 100644
--- a/usr/src/cmd/lp/model/lp.cat.c
+++ b/usr/src/cmd/lp/model/lp.cat.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,16 +18,15 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <stdio.h>
#include <stdlib.h>
#include <termio.h>
@@ -44,9 +42,9 @@
#include <locale.h>
-/**
- ** Begin Sun Additions for Parallel ports
- **/
+/*
+ * Begin Sun Additions for Parallel ports
+ */
#include <string.h>
#include <stdarg.h>
@@ -85,47 +83,48 @@ int get_ecpp_status(int fd);
int is_a_prnio(int);
int prnio_state(int);
-#define PRINTER_ERROR_PAPER_OUT 1
-#define PRINTER_ERROR_OFFLINE 2
-#define PRINTER_ERROR_BUSY 3
-#define PRINTER_ERROR_ERROR 4
-#define PRINTER_ERROR_CABLE_POWER 5
-#define PRINTER_ERROR_UNKNOWN 6
-#define PRINTER_ERROR_TIMEOUT 7
+#define PRINTER_ERROR_PAPER_OUT 1
+#define PRINTER_ERROR_OFFLINE 2
+#define PRINTER_ERROR_BUSY 3
+#define PRINTER_ERROR_ERROR 4
+#define PRINTER_ERROR_CABLE_POWER 5
+#define PRINTER_ERROR_UNKNOWN 6
+#define PRINTER_ERROR_TIMEOUT 7
#define PRINTER_IO_ERROR 129
-/****************************************************************************/
-
-/**
+/*
* for BPP PARALLEL interfaces
- **/
+ */
-int is_a_parallel_bpp(int fd)
+int
+is_a_parallel_bpp(int fd)
{
if (ioctl(fd, BPPIOC_TESTIO) == 0 || errno == EIO)
- return(1);
- return(0);
+ return (1);
+ return (0);
}
#if defined(DEBUG) && defined(NOTDEF)
-char *BppState(int state)
+char *
+BppState(int state)
{
static char buf[BUFSIZ];
- memset(buf, 0, sizeof(buf));
- sprintf(buf, "State (0x%.4x) - (%s%s%s%s)\n", state,
- ((state & BPP_SLCT_ERR) ? "offline " : ""),
- ((state & BPP_BUSY_ERR) ? "busy " : ""),
- ((state & BPP_PE_ERR) ? "paper " : ""),
- ((state & BPP_ERR_ERR) ? "error " : ""));
+ memset(buf, 0, sizeof (buf));
+ sprintf(buf, "State (0x%.4x) - (%s%s%s%s)\n", state,
+ ((state & BPP_SLCT_ERR) ? "offline " : ""),
+ ((state & BPP_BUSY_ERR) ? "busy " : ""),
+ ((state & BPP_PE_ERR) ? "paper " : ""),
+ ((state & BPP_ERR_ERR) ? "error " : ""));
- return(buf);
+ return (buf);
}
#endif
-int bpp_state(int fd)
+int
+bpp_state(int fd)
{
if (ioctl(fd, BPPIOC_TESTIO)) {
struct bpp_error_status bpp_stat;
@@ -135,38 +134,38 @@ int bpp_state(int fd)
exit(PRINTER_IO_ERROR);
state = bpp_stat.pin_status;
-#if defined(DEBUG) && defined(NOTDEF)
+#if defined(DEBUG) && defined(NOTDEF)
logit("%s", BppState(state));
#endif
-
+
if (state == (BPP_PE_ERR | BPP_ERR_ERR | BPP_SLCT_ERR)) {
/* paper is out */
- return(PRINTER_ERROR_PAPER_OUT);
+ return (PRINTER_ERROR_PAPER_OUT);
} else if (state & BPP_BUSY_ERR) {
/* printer is busy */
- return(PRINTER_ERROR_BUSY);
+ return (PRINTER_ERROR_BUSY);
} else if (state & BPP_SLCT_ERR) {
/* printer is offline */
- return(PRINTER_ERROR_OFFLINE);
+ return (PRINTER_ERROR_OFFLINE);
} else if (state & BPP_ERR_ERR) {
/* printer is errored */
- return(PRINTER_ERROR_ERROR);
+ return (PRINTER_ERROR_ERROR);
} else if (state == BPP_PE_ERR) {
/* printer is off/unplugged */
- return(PRINTER_ERROR_CABLE_POWER);
+ return (PRINTER_ERROR_CABLE_POWER);
} else if (state) {
- return(PRINTER_ERROR_UNKNOWN);
+ return (PRINTER_ERROR_UNKNOWN);
} else
- return(0);
+ return (0);
}
- return(0);
+ return (0);
}
/*
* For ecpp parallel port
*/
-int
+int
get_ecpp_status(int fd)
{
int state;
@@ -174,7 +173,7 @@ get_ecpp_status(int fd)
if (ioctl(fd, ECPPIOC_GETPARMS, &transfer_parms) == -1) {
- return(-1);
+ return (-1);
}
state = transfer_parms.mode;
@@ -186,20 +185,21 @@ get_ecpp_status(int fd)
if (state != ECPP_CENTRONICS) {
transfer_parms.mode = ECPP_CENTRONICS;
if (ioctl(fd, ECPPIOC_SETPARMS, &transfer_parms) == -1) {
- return(-1);
+ return (-1);
} else {
state = ECPP_CENTRONICS;
}
}
-
- return(state);
+
+ return (state);
}
-/**
+/*
* For prnio(7I) - generic printer interface
- **/
-int is_a_prnio(int fd)
+ */
+int
+is_a_prnio(int fd)
{
uint_t cap;
@@ -218,46 +218,47 @@ int is_a_prnio(int fd)
return (1);
}
-int prnio_state(int fd)
+int
+prnio_state(int fd)
{
uint_t status;
uchar_t pins;
if ((ioctl(fd, PRNIOC_GET_STATUS, &status) == 0) &&
(status & PRN_READY)) {
- return(0);
+ return (0);
}
if (ioctl(fd, PRNIOC_GET_1284_STATUS, &pins) != 0) {
- return(PRINTER_ERROR_UNKNOWN);
+ return (PRINTER_ERROR_UNKNOWN);
}
if ((pins & ~PRN_1284_BUSY) == PRN_1284_PE) {
/* paper is out */
- return(PRINTER_ERROR_PAPER_OUT);
+ return (PRINTER_ERROR_PAPER_OUT);
} else if (pins == (PRN_1284_PE | PRN_1284_SELECT |
- PRN_1284_NOFAULT | PRN_1284_BUSY)) {
+ PRN_1284_NOFAULT | PRN_1284_BUSY)) {
/* printer is off/unplugged */
- return(PRINTER_ERROR_CABLE_POWER);
+ return (PRINTER_ERROR_CABLE_POWER);
} else if ((pins & PRN_1284_SELECT) == 0) {
/* printer is offline */
- return(PRINTER_ERROR_OFFLINE);
+ return (PRINTER_ERROR_OFFLINE);
} else if ((pins & PRN_1284_NOFAULT) == 0) {
/* printer is errored */
- return(PRINTER_ERROR_ERROR);
+ return (PRINTER_ERROR_ERROR);
} else if (pins & PRN_1284_PE) {
/* paper is out */
- return(PRINTER_ERROR_PAPER_OUT);
+ return (PRINTER_ERROR_PAPER_OUT);
} else if (pins ^ (PRN_1284_SELECT | PRN_1284_NOFAULT)) {
- return(PRINTER_ERROR_UNKNOWN);
+ return (PRINTER_ERROR_UNKNOWN);
}
- return(0);
+ return (0);
}
-
-/**
+
+/*
* Common routines
- **/
+ */
/*ARGSUSED0*/
static void
@@ -280,10 +281,10 @@ printer_info(char *fmt, ...)
vsprintf(mesg, fmt, ap);
va_end(ap);
/*
- fprintf(stderr,
- "%%%%[ PrinterError: %s; source: parallel ]%%%%\n",
- mesg);
-*/
+ * fprintf(stderr,
+ * "%%%%[ PrinterError: %s; source: parallel ]%%%%\n",
+ * mesg);
+ */
fprintf(stderr, "%s\n", mesg);
fflush(stderr);
fsync(2);
@@ -294,32 +295,32 @@ static void
printer_error(int error)
{
switch (error) {
- case -1:
- printer_info("ioctl(): %s", strerror(errno));
- break;
- case PRINTER_ERROR_PAPER_OUT:
- printer_info("out of paper");
- break;
- case PRINTER_ERROR_OFFLINE:
- printer_info("offline");
- break;
- case PRINTER_ERROR_BUSY:
- printer_info("busy");
- break;
- case PRINTER_ERROR_ERROR:
- printer_info("printer error");
- break;
- case PRINTER_ERROR_CABLE_POWER:
- printer_info("printer powered off or disconnected");
- break;
- case PRINTER_ERROR_UNKNOWN:
- printer_info("unknown error");
- break;
- case PRINTER_ERROR_TIMEOUT:
- printer_info("communications timeout");
- break;
- default:
- printer_info("get_status() failed");
+ case -1:
+ printer_info("ioctl(): %s", strerror(errno));
+ break;
+ case PRINTER_ERROR_PAPER_OUT:
+ printer_info("out of paper");
+ break;
+ case PRINTER_ERROR_OFFLINE:
+ printer_info("offline");
+ break;
+ case PRINTER_ERROR_BUSY:
+ printer_info("busy");
+ break;
+ case PRINTER_ERROR_ERROR:
+ printer_info("printer error");
+ break;
+ case PRINTER_ERROR_CABLE_POWER:
+ printer_info("printer powered off or disconnected");
+ break;
+ case PRINTER_ERROR_UNKNOWN:
+ printer_info("unknown error");
+ break;
+ case PRINTER_ERROR_TIMEOUT:
+ printer_info("communications timeout");
+ break;
+ default:
+ printer_info("get_status() failed");
}
}
@@ -331,7 +332,7 @@ wait_state(int fd, int get_state())
int was_faulted = 0;
while (state = get_state(fd)) {
- was_faulted=1;
+ was_faulted = 1;
printer_error(state);
sleep(15);
}
@@ -343,26 +344,26 @@ wait_state(int fd, int get_state())
}
}
-/**
- ** end of Sun Additions for parallel port
- **/
-#define IDENTICAL(A,B) (A.st_dev==B.st_dev && A.st_ino==B.st_ino)
-#define ISBLK(A) ((A.st_mode & S_IFMT) == S_IFBLK)
-#define ISCHR(A) ((A.st_mode & S_IFMT) == S_IFCHR)
-
-#define E_SUCCESS 0
-#define E_BAD_INPUT 1
-#define E_BAD_OUTPUT 2
-#define E_BAD_TERM 3
-#define E_IDENTICAL 4
+/*
+ * end of Sun Additions for parallel port
+ */
+#define IDENTICAL(A, B) (A.st_dev == B.st_dev && A.st_ino == B.st_ino)
+#define ISBLK(A) ((A.st_mode & S_IFMT) == S_IFBLK)
+#define ISCHR(A) ((A.st_mode & S_IFMT) == S_IFCHR)
+
+#define E_SUCCESS 0
+#define E_BAD_INPUT 1
+#define E_BAD_OUTPUT 2
+#define E_BAD_TERM 3
+#define E_IDENTICAL 4
#define E_WRITE_FAILED 5
#define E_TIMEOUT 6
-#define E_HANGUP 7
-#define E_INTERRUPT 8
+#define E_HANGUP 7
+#define E_INTERRUPT 8
-#define SAFETY_FACTOR 2.0
-#define R(F) (int)((F) + .5)
-#define DELAY(N,D) R(SAFETY_FACTOR * ((N) / (double)(D)))
+#define SAFETY_FACTOR 2.0
+#define R(F) (int)((F) + .5)
+#define DELAY(N, D) R(SAFETY_FACTOR * ((N) / (double)(D)))
char buffer[BUFSIZ];
@@ -374,44 +375,36 @@ void sighup(),
sigterm();
#if defined(baudrate)
-# undef baudrate
+#undef baudrate
#endif
-int baudrate();
+int baudrate();
-int nop(int fd) { return (0); }
+int
+nop(int fd)
+{
+ return (0);
+}
+
int bpp_state(int);
-/**
- ** main()
- **/
+/*
+ * main()
+ */
int
main(int argc, char *argv[])
{
- int nin,
- nout,
- effective_rate,
- max_delay = 0,
- n;
-
- int report_rate;
-
- short print_rate;
-
- struct stat in,
- out;
-
- struct tms tms;
-
- long epoch_start,
- epoch_end;
-
- char *TERM;
-
- int (*func)(int fd);
+ int nin, nout, effective_rate, max_delay = 0, n;
+ int report_rate;
+ short print_rate;
+ struct stat in, out;
+ struct tms tms;
+ long epoch_start, epoch_end;
+ char *TERM;
+ int (*func)(int fd);
/*
* The Spooler can hit us with SIGTERM for three reasons:
@@ -442,11 +435,11 @@ main(int argc, char *argv[])
* - Input/output identical
* - No TERM defined or trouble reading Terminfo database
*/
- signal (SIGTERM, sigterm);
- signal (SIGHUP, sighup);
- signal (SIGINT, sigint);
- signal (SIGQUIT, sigint);
- signal (SIGPIPE, sigpipe);
+ signal(SIGTERM, sigterm);
+ signal(SIGHUP, sighup);
+ signal(SIGINT, sigint);
+ signal(SIGQUIT, sigint);
+ signal(SIGPIPE, sigpipe);
if (argc > 1 && STREQU(argv[1], "-r")) {
@@ -458,7 +451,7 @@ main(int argc, char *argv[])
(void) setlocale(LC_ALL, "");
#if !defined(TEXT_DOMAIN)
-#define TEXT_DOMAIN "SYS_TEST"
+#define TEXT_DOMAIN "SYS_TEST"
#endif
(void) textdomain(TEXT_DOMAIN);
@@ -466,26 +459,20 @@ main(int argc, char *argv[])
* Stat the standard output to be sure it is defined.
*/
if (fstat(1, &out) < 0) {
- signal (SIGTERM, SIG_IGN);
- fprintf (
- stderr,
- gettext("Can't stat output (%s);\nincorrect use of lp.cat!\n"),
- PERROR
- );
- exit (E_BAD_OUTPUT);
+ signal(SIGTERM, SIG_IGN);
+ fprintf(stderr, gettext("Can't stat output "
+ "(%s);\nincorrect use of lp.cat!\n"), PERROR);
+ exit(E_BAD_OUTPUT);
}
/*
* Stat the standard input to be sure it is defined.
*/
if (fstat(0, &in) < 0) {
- signal (SIGTERM, SIG_IGN);
- fprintf (
- stderr,
- gettext("Can't stat input (%s);\nincorrect use of lp.cat!\n"),
- PERROR
- );
- exit (E_BAD_INPUT);
+ signal(SIGTERM, SIG_IGN);
+ fprintf(stderr, gettext("Can't stat input "
+ "(%s);\nincorrect use of lp.cat!\n"), PERROR);
+ exit(E_BAD_INPUT);
}
/*
@@ -500,22 +487,20 @@ main(int argc, char *argv[])
if (is_a_prnio(1)) {
func = prnio_state;
} else if (is_a_parallel_bpp(1) ||
- (get_ecpp_status(1) == ECPP_CENTRONICS)) {
+ (get_ecpp_status(1) == ECPP_CENTRONICS)) {
func = bpp_state;
- } else if (isatty(1)) {
+ } else if (isatty(1)) {
/* serial connection (probably) - continue as usual */
func = nop;
- } else {
+ } else {
func = nop;
- }
+ }
if (!ISCHR(out) && !ISBLK(out) && IDENTICAL(out, in)) {
- signal (SIGTERM, SIG_IGN);
- fprintf (
- stderr,
- gettext("Input and output are identical; incorrect use of lp.cat!\n")
- );
- exit (E_IDENTICAL);
+ signal(SIGTERM, SIG_IGN);
+ fprintf(stderr, gettext("Input and output are identical; "
+ "incorrect use of lp.cat!\n"));
+ exit(E_IDENTICAL);
}
/*
@@ -531,28 +516,18 @@ main(int argc, char *argv[])
* than err too often on false alarms.
*/
- if (
- !(TERM = getenv("TERM"))
- || !*TERM
- ) {
- signal (SIGTERM, SIG_IGN);
- fprintf (
- stderr,
- gettext("No TERM variable defined! Trouble with the Spooler!\n")
- );
- exit (E_BAD_TERM);
+ if (!(TERM = getenv("TERM")) || !*TERM) {
+ signal(SIGTERM, SIG_IGN);
+ fprintf(stderr, gettext("No TERM variable defined! "
+ "Trouble with the Spooler!\n"));
+ exit(E_BAD_TERM);
}
- if (
- !STREQU(TERM, NAME_UNKNOWN)
- && tidbit(TERM, "cps", &print_rate) == -1
- ) {
- signal (SIGTERM, SIG_IGN);
- fprintf (
- stderr,
-gettext("Trouble identifying printer type \"%s\"; check the Terminfo database.\n"),
- TERM
- );
- exit (E_BAD_TERM);
+ if (!STREQU(TERM, NAME_UNKNOWN) &&
+ tidbit(TERM, "cps", &print_rate) == -1) {
+ signal(SIGTERM, SIG_IGN);
+ fprintf(stderr, gettext("Trouble identifying printer "
+ "type \"%s\"; check the Terminfo database.\n"), TERM);
+ exit(E_BAD_TERM);
}
if (STREQU(TERM, NAME_UNKNOWN))
print_rate = -1;
@@ -570,7 +545,7 @@ gettext("Trouble identifying printer type \"%s\"; check the Terminfo database.\n
* waiting too long to write to a printer in trouble.
*/
if (max_delay)
- signal (SIGALRM, sigalrm);
+ signal(SIGALRM, sigalrm);
/*
* While not end of standard input, copy blocks to
@@ -597,15 +572,13 @@ gettext("Trouble identifying printer type \"%s\"; check the Terminfo database.\n
wait_state(1, func);
if (max_delay)
- alarm (max_delay);
+ alarm(max_delay);
nout = write(1, ptr, nin);
alarm(0);
if (nout < 0) {
- fprintf (
- stderr,
- gettext("Write failed (%s);\nperhaps the printer has gone off-line.\n"),
- PERROR
- );
+ fprintf(stderr, gettext("Write failed "
+ "(%s);\nperhaps the printer has gone "
+ "off-line.\n"), PERROR);
fflush(stderr);
if (errno != EINTR)
/* I/O error on device, get lpcshed to retry */
@@ -619,15 +592,13 @@ gettext("Trouble identifying printer type \"%s\"; check the Terminfo database.\n
} while (nin > 0);
if (max_delay)
- alarm (0);
+ alarm(0);
else if (report_rate) {
epoch_end = times(&tms);
if (epoch_end - epoch_start > 0)
- fprintf (
- stderr,
- "%d CPS\n",
- R((100 * BUFSIZ) / (double)(epoch_end - epoch_start))
- );
+ fprintf(stderr, "%d CPS\n",
+ R((100 * BUFSIZ) /
+ (double)(epoch_end - epoch_start)));
}
}
@@ -635,83 +606,82 @@ gettext("Trouble identifying printer type \"%s\"; check the Terminfo database.\n
return (E_SUCCESS);
}
-/**
- ** sighup() - CATCH A HANGUP (LOSS OF CARRIER)
- **/
-
-void sighup ()
+/*
+ * sighup() - CATCH A HANGUP (LOSS OF CARRIER)
+ */
+void
+sighup()
{
- signal (SIGTERM, SIG_IGN);
- signal (SIGHUP, SIG_IGN);
- fprintf (stderr, gettext(HANGUP_FAULT_LPCAT));
- exit (E_HANGUP);
+ signal(SIGTERM, SIG_IGN);
+ signal(SIGHUP, SIG_IGN);
+ fprintf(stderr, gettext(HANGUP_FAULT_LPCAT));
+ exit(E_HANGUP);
}
-/**
- ** sigint() - CATCH AN INTERRUPT
- **/
-
-void sigint ()
+/*
+ * sigint() - CATCH AN INTERRUPT
+ */
+void
+sigint()
{
- signal (SIGTERM, SIG_IGN);
- signal (SIGINT, SIG_IGN);
- fprintf (stderr, gettext(INTERRUPT_FAULT));
- exit (E_INTERRUPT);
+ signal(SIGTERM, SIG_IGN);
+ signal(SIGINT, SIG_IGN);
+ fprintf(stderr, gettext(INTERRUPT_FAULT));
+ exit(E_INTERRUPT);
}
-/**
- ** sigpipe() - CATCH EARLY CLOSE OF PIPE
- **/
-
-void sigpipe ()
+/*
+ * sigpipe() - CATCH EARLY CLOSE OF PIPE
+ */
+void
+sigpipe()
{
- signal (SIGTERM, SIG_IGN);
- signal (SIGPIPE, SIG_IGN);
- fprintf (stderr, gettext(PIPE_FAULT));
- exit (E_INTERRUPT);
+ signal(SIGTERM, SIG_IGN);
+ signal(SIGPIPE, SIG_IGN);
+ fprintf(stderr, gettext(PIPE_FAULT));
+ exit(E_INTERRUPT);
}
-/**
- ** sigalrm() - CATCH AN ALARM
- **/
-
-void sigalrm ()
+/*
+ * sigalrm() - CATCH AN ALARM
+ */
+void
+sigalrm()
{
- signal (SIGTERM, SIG_IGN);
- fprintf (
- stderr,
- gettext("Excessive write delay; perhaps the printer has gone off-line.\n")
- );
- exit (E_TIMEOUT);
+ signal(SIGTERM, SIG_IGN);
+ fprintf(stderr, gettext("Excessive write delay; "
+ "perhaps the printer has gone off-line.\n"));
+ exit(E_TIMEOUT);
}
-/**
- ** sigterm() - CATCH A TERMINATION SIGNAL
- **/
-
-void sigterm ()
+/*
+ * sigterm() - CATCH A TERMINATION SIGNAL
+ */
+void
+sigterm()
{
- signal (SIGTERM, SIG_IGN);
+ signal(SIGTERM, SIG_IGN);
/*
* try to flush the output queue in the case of ecpp port.
* ignore the return code as this may not be the ecpp.
*/
ioctl(1, I_FLUSH, FLUSHW);
- exit (E_SUCCESS);
+ exit(E_SUCCESS);
}
-/**
- ** baudrate() - RETURN BAUD RATE OF OUTPUT LINE
- **/
+/*
+ * baudrate() - RETURN BAUD RATE OF OUTPUT LINE
+ */
static int baud_convert[] =
{
0, 50, 75, 110, 135, 150, 200, 300, 600, 1200,
1800, 2400, 4800, 9600, 19200, 38400, 57600,
- 76800, 115200, 153600, 230400, 307200, 460800
+ 76800, 115200, 153600, 230400, 307200, 460800, 921600
};
-int baudrate ()
+int
+baudrate()
{
struct termio tm;
struct termios tms;
diff --git a/usr/src/cmd/mdb/common/kmdb/kmdb_promif.c b/usr/src/cmd/mdb/common/kmdb/kmdb_promif.c
index 135a22e4d0..7cd64ca5dc 100644
--- a/usr/src/cmd/mdb/common/kmdb/kmdb_promif.c
+++ b/usr/src/cmd/mdb/common/kmdb/kmdb_promif.c
@@ -18,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/termios.h>
#include <sys/promif.h>
@@ -431,7 +430,7 @@ kmdb_parse_mode(const char *mode, struct termios *tip, int in)
static const uint_t baudmap[] = {
0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
1800, 2400, 4800, 9600, 19200, 38400, 57600,
- 76800, 115200, 153600, 230400, 307200, 460800
+ 76800, 115200, 153600, 230400, 307200, 460800, 921600
};
static const uint_t bitsmap[] = { CS6, CS6, CS7, CS8 };
char *m = strdup(mode);
diff --git a/usr/src/cmd/mdb/common/mdb/mdb_termio.c b/usr/src/cmd/mdb/common/mdb/mdb_termio.c
index c44db8f030..d2f3d59f83 100644
--- a/usr/src/cmd/mdb/common/mdb/mdb_termio.c
+++ b/usr/src/cmd/mdb/common/mdb/mdb_termio.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,13 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Terminal I/O Backend
*
@@ -683,7 +681,7 @@ termio_resume_tty(termio_data_t *td, struct termios *iosp)
static const uint_t baud[] = {
0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
1800, 2400, 4800, 9600, 19200, 38400, 57600,
- 76800, 115200, 153600, 230400, 307200, 460800
+ 76800, 115200, 153600, 230400, 307200, 460800, 921600
};
struct termios *ntios;
diff --git a/usr/src/cmd/netadm/iu.ap.sh b/usr/src/cmd/netadm/iu.ap.sh
index c16b5a0b69..9ac9b143d4 100644
--- a/usr/src/cmd/netadm/iu.ap.sh
+++ b/usr/src/cmd/netadm/iu.ap.sh
@@ -20,7 +20,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
@@ -41,6 +41,7 @@ case "$MACH" in
usbser_edge -1 0 ldterm ttcompat
usbsprl -1 0 ldterm ttcompat
usbsksp -1 0 ldterm ttcompat
+ usbftdi -1 0 ldterm ttcompat
ipsecesp -1 0 ipsecesp
ipsecah -1 0 ipsecah
" > iu.ap
@@ -70,6 +71,7 @@ case "$MACH" in
usbsacm -1 0 ldterm ttcompat
usbsprl -1 0 ldterm ttcompat
usbsksp -1 0 ldterm ttcompat
+ usbftdi -1 0 ldterm ttcompat
ttymux -1 0 ldterm ttcompat
ipsecesp -1 0 ipsecesp
ipsecah -1 0 ipsecah
diff --git a/usr/src/cmd/ssh/libssh/common/ttymodes.c b/usr/src/cmd/ssh/libssh/common/ttymodes.c
index 1c27120481..b20ab34ff3 100644
--- a/usr/src/cmd/ssh/libssh/common/ttymodes.c
+++ b/usr/src/cmd/ssh/libssh/common/ttymodes.c
@@ -34,8 +34,9 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -49,8 +50,6 @@
#include "includes.h"
RCSID("$OpenBSD: ttymodes.c,v 1.18 2002/06/19 00:27:55 deraadt Exp $");
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include "packet.h"
#include "log.h"
#include "ssh1.h"
@@ -152,6 +151,14 @@ speed_to_baud(speed_t speed)
case B230400:
return 230400;
#endif /* B230400 */
+#ifdef B460800
+ case B460800:
+ return 460800;
+#endif /* B460800 */
+#ifdef B921600
+ case B921600:
+ return 921600;
+#endif /* B921600 */
default:
return 9600;
}
@@ -241,6 +248,14 @@ baud_to_speed(int baud)
case 230400:
return B230400;
#endif /* B230400 */
+#ifdef B460800
+ case 460800:
+ return B460800;
+#endif /* B460800 */
+#ifdef B921600
+ case 921600:
+ return B921600;
+#endif /* B921600 */
default:
return B9600;
}
diff --git a/usr/src/cmd/tip/tip.c b/usr/src/cmd/tip/tip.c
index b912d6e33b..bc8bcd1f85 100644
--- a/usr/src/cmd/tip/tip.c
+++ b/usr/src/cmd/tip/tip.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -9,8 +9,6 @@
* specifies the terms and conditions for redistribution.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* tip - UNIX link to other systems
* tip [-v] [-speed] system-name
@@ -27,7 +25,8 @@
int bauds[] = {
0, 50, 75, 110, 134, 150, 200, 300, 600,
1200, 1800, 2400, 4800, 9600, 19200, 38400,
- 57600, 76800, 115200, 153600, 230400, 307200, 460800, -1
+ 57600, 76800, 115200, 153600, 230400, 307200,
+ 460800, 921600, -1
};
extern void tipout(void) __NORETURN;
diff --git a/usr/src/cmd/tput/tput.c b/usr/src/cmd/tput/tput.c
index d1d3b5abad..18dce8d6cb 100644
--- a/usr/src/cmd/tput/tput.c
+++ b/usr/src/cmd/tput/tput.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,18 +18,15 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-
/*
* tput - print terminal attribute
*
@@ -113,18 +109,18 @@ main(int argc, char **argv)
usage: /* FALLTHROUGH */
default:
(void) fprintf(stderr, gettext(
- "usage:\t%s [-T [term]] capname [parm argument...]\n"),
- progname);
+ "usage:\t%s [-T [term]] capname "
+ "[parm argument...]\n"), progname);
(void) fprintf(stderr, gettext("OR:\t%s -S <<\n"),
- progname);
+ progname);
exit(2);
}
}
if (!term || !*term) {
(void) fprintf(stderr,
- gettext("%s: No value for $TERM and no -T specified\n"),
- progname);
+ gettext("%s: No value for $TERM and no -T specified\n"),
+ progname);
exit(2);
}
@@ -133,22 +129,22 @@ main(int argc, char **argv)
switch (setuperr) {
case -2:
(void) fprintf(stderr,
- gettext("%s: unreadable terminal descriptor \"%s\"\n"),
- progname, term);
+ gettext("%s: unreadable terminal descriptor \"%s\"\n"),
+ progname, term);
exit(3);
break;
case -1:
(void) fprintf(stderr,
- gettext("%s: no terminfo database\n"), progname);
+ gettext("%s: no terminfo database\n"), progname);
exit(3);
break;
case 0:
- (void) fprintf(stderr,
- gettext("%s: unknown terminal \"%s\"\n"),
- progname, term);
- exit(3);
+ (void) fprintf(stderr,
+ gettext("%s: unknown terminal \"%s\"\n"),
+ progname, term);
+ exit(3);
}
reset_shell_mode();
@@ -237,8 +233,8 @@ outputcap(char *cap, int argc, char **argv)
if (parmset)
putp(tparm(thisstr,
- parm[0], parm[1], parm[2], parm[3], parm[4], parm[5],
- parm[6], parm[7], parm[8]));
+ parm[0], parm[1], parm[2], parm[3],
+ parm[4], parm[5], parm[6], parm[7], parm[8]));
else
putp(thisstr);
return (0);
@@ -316,6 +312,7 @@ static int speeds[] = {
230400, /* B230400, */
307200, /* B307200, */
460800, /* B460800, */
+ 921600, /* B921600, */
0,
};
@@ -453,7 +450,7 @@ getpad(char *cap)
while (isdigit (*cap))
cap++;
while (*cap == '.' || *cap == '/' || *cap == '*' ||
- isdigit(*cap))
+ isdigit(*cap))
cap++;
while (*cap == '>')
cap++;
@@ -630,24 +627,34 @@ initterm()
if (xon_xoff) {
#ifdef SYSV
OFLAG(termmodes) &=
- ~(NLbits | CRbits | BSbits | FFbits | TBbits);
+ ~(NLbits | CRbits | BSbits | FFbits | TBbits);
#else /* SYSV */
OFLAG(termmode) &=
- ~(NLbits | CRbits | BSbits | FFbits | TBbits);
+ ~(NLbits | CRbits | BSbits | FFbits | TBbits);
#endif /* SYSV */
} else {
#ifdef SYSV
- setdelay(getpad(carriage_return), CRdelay, CRbits, &OFLAG(termmodes));
- setdelay(getpad(scroll_forward), NLdelay, NLbits, &OFLAG(termmodes));
- setdelay(getpad(cursor_left), BSdelay, BSbits, &OFLAG(termmodes));
- setdelay(getpad(form_feed), FFdelay, FFbits, &OFLAG(termmodes));
- setdelay(getpad(tab), TBdelay, TBbits, &OFLAG(termmodes));
+ setdelay(getpad(carriage_return),
+ CRdelay, CRbits, &OFLAG(termmodes));
+ setdelay(getpad(scroll_forward),
+ NLdelay, NLbits, &OFLAG(termmodes));
+ setdelay(getpad(cursor_left),
+ BSdelay, BSbits, &OFLAG(termmodes));
+ setdelay(getpad(form_feed),
+ FFdelay, FFbits, &OFLAG(termmodes));
+ setdelay(getpad(tab),
+ TBdelay, TBbits, &OFLAG(termmodes));
#else /* SYSV */
- setdelay(getpad(carriage_return), CRdelay, CRbits, &OFLAG(termmode));
- setdelay(getpad(scroll_forward), NLdelay, NLbits, &OFLAG(termmode));
- setdelay(getpad(cursor_left), BSdelay, BSbits, &OFLAG(termmode));
- setdelay(getpad(form_feed), FFdelay, FFbits, &OFLAG(termmode));
- setdelay(getpad(tab), TBdelay, TBbits, &OFLAG(termmode));
+ setdelay(getpad(carriage_return),
+ CRdelay, CRbits, &OFLAG(termmode));
+ setdelay(getpad(scroll_forward),
+ NLdelay, NLbits, &OFLAG(termmode));
+ setdelay(getpad(cursor_left),
+ BSdelay, BSbits, &OFLAG(termmode));
+ setdelay(getpad(form_feed),
+ FFdelay, FFbits, &OFLAG(termmode));
+ setdelay(getpad(tab),
+ TBdelay, TBbits, &OFLAG(termmode));
#endif /* SYSV */
}
diff --git a/usr/src/cmd/truss/codes.c b/usr/src/cmd/truss/codes.c
index a51544a70f..d63248f219 100644
--- a/usr/src/cmd/truss/codes.c
+++ b/usr/src/cmd/truss/codes.c
@@ -373,6 +373,7 @@ const struct ioc {
{ (uint_t)TIOCSTART, "TIOCSTART", NULL },
{ (uint_t)TIOCSTOP, "TIOCSTOP", NULL },
{ (uint_t)TIOCNOTTY, "TIOCNOTTY", NULL },
+ { (uint_t)TIOCSCTTY, "TIOCSCTTY", NULL },
{ (uint_t)TIOCOUTQ, "TIOCOUTQ", NULL },
{ (uint_t)TIOCGLTC, "TIOCGLTC", NULL },
{ (uint_t)TIOCSLTC, "TIOCSLTC", NULL },
@@ -385,6 +386,16 @@ const struct ioc {
{ (uint_t)TIOCLBIC, "TIOCLBIC", NULL },
{ (uint_t)TIOCLBIS, "TIOCLBIS", NULL },
+ { (uint_t)TIOCSILOOP, "TIOCSILOOP", NULL },
+ { (uint_t)TIOCCILOOP, "TIOCSILOOP", NULL },
+
+ { (uint_t)TIOCSETLD, "TIOCSETLD", NULL },
+ { (uint_t)TIOCGETLD, "TIOCGETLD", NULL },
+
+ { (uint_t)TIOCGPPS, "TIOCGPPS", NULL },
+ { (uint_t)TIOCSPPS, "TIOCSPPS", NULL },
+ { (uint_t)TIOCGPPSEV, "TIOCGPPSEV", NULL },
+
{ (uint_t)TIOCPKT, "TIOCPKT", NULL }, /* ptyvar.h */
{ (uint_t)TIOCUCNTL, "TIOCUCNTL", NULL },
{ (uint_t)TIOCTCNTL, "TIOCTCNTL", NULL },
diff --git a/usr/src/cmd/ttymon/sttytable.c b/usr/src/cmd/ttymon/sttytable.c
index 8f72d10c57..aca71657c1 100644
--- a/usr/src/cmd/ttymon/sttytable.c
+++ b/usr/src/cmd/ttymon/sttytable.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,8 +18,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -30,8 +30,6 @@
*
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <stdio.h>
#include <sys/types.h>
#include <termio.h>
@@ -73,6 +71,8 @@ const struct speeds speeds[] = {
"307.2", B307200, 307200,
"460800", B460800, 460800,
"460.8", B460800, 460800,
+ "921600", B921600, 921600,
+ "921.6", B921600, 921600,
0,
};
diff --git a/usr/src/lib/libcurses/screen/delay.c b/usr/src/lib/libcurses/screen/delay.c
index 2c6f50e662..fe570b9148 100644
--- a/usr/src/lib/libcurses/screen/delay.c
+++ b/usr/src/lib/libcurses/screen/delay.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,8 +18,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -37,8 +37,6 @@
* contributors.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*LINTLIBRARY*/
#include <sys/types.h>
@@ -55,10 +53,10 @@ static short tmspc10[] =
0, 2000, 1333, 909, 743, 666, 500, 333,
/* 600 1200 1800 2400 4800 9600 19200 38400 baud */
166, 83, 55, 41, 20, 10, 5, 2,
- /* 57600, 76800, 115200, 153600, 230400 307200 baud */
+ /* 57600, 76800, 115200, 153600, 230400, 307200 baud */
2, 1, 1, 1, 1, 1,
- /* 460800 baud */
- 1
+ /* 460800, 921600 baud */
+ 1, 1
};
/*
diff --git a/usr/src/lib/libcurses/screen/newscreen.c b/usr/src/lib/libcurses/screen/newscreen.c
index 902c490088..ea5ec923c0 100644
--- a/usr/src/lib/libcurses/screen/newscreen.c
+++ b/usr/src/lib/libcurses/screen/newscreen.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,8 +18,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -37,8 +37,6 @@
* contributors.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*LINTLIBRARY*/
#include <stdio.h>
@@ -55,7 +53,7 @@ extern char _endwin;
static long baud_convert[] = {
1200, 50, 75, 110, 135, 150, 200, 300, 600, 1200,
1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800,
- 115200, 153600, 230400, 307200, 460800
+ 115200, 153600, 230400, 307200, 460800, 921600
};
static char isfilter = 0;
diff --git a/usr/src/lib/libnsl/dial/line.c b/usr/src/lib/libnsl/dial/line.c
index fd6378beca..08195abbbd 100644
--- a/usr/src/lib/libnsl/dial/line.c
+++ b/usr/src/lib/libnsl/dial/line.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -21,15 +20,13 @@
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* This is a new line.c, which consists of line.c and culine.c
* merged together.
@@ -71,6 +68,7 @@ static const struct sg_spds {
{230400, B230400},
{307200, B307200},
{460800, B460800},
+ {921600, B921600},
{0, 0}
};
@@ -207,10 +205,10 @@ fixline(int tty, int spwant, int type)
for (i = 0; i < NCC; i++)
ttbuf.c_cc[i] = ttbufs.c_cc[i];
ASSERT((*Ioctl)(tty, TCSETAW, &ttbuf) >= 0,
- "RETURN FROM fixline ioctl", "", errno);
+ "RETURN FROM fixline ioctl", "", errno);
} else {
ASSERT((*Ioctl)(tty, TCSETSW, &ttbufs) >= 0,
- "RETURN FROM fixline ioctl", "", errno);
+ "RETURN FROM fixline ioctl", "", errno);
}
}
diff --git a/usr/src/pkgdefs/Makefile b/usr/src/pkgdefs/Makefile
index 239ce0fdb5..90bbb4a0dd 100644
--- a/usr/src/pkgdefs/Makefile
+++ b/usr/src/pkgdefs/Makefile
@@ -495,6 +495,7 @@ COMMON_SUBDIRS= \
SUNWudf \
SUNWudfr \
SUNWuedg \
+ SUNWuftdi \
SUNWugen \
SUNWugenu \
SUNWuksp \
diff --git a/usr/src/pkgdefs/SUNWuftdi/Makefile b/usr/src/pkgdefs/SUNWuftdi/Makefile
new file mode 100644
index 0000000000..6acf7333a6
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/Makefile
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+include ../Makefile.com
+
+.KEEP_STATE:
+
+all: $(FILES) depend postinstall preremove
+install: all pkg
+
+include ../Makefile.targ
diff --git a/usr/src/pkgdefs/SUNWuftdi/depend b/usr/src/pkgdefs/SUNWuftdi/depend
new file mode 100644
index 0000000000..e3caeee4ce
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/depend
@@ -0,0 +1,51 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# This package information file defines software dependencies associated
+# with the pkg. You can define three types of pkg dependencies with this file:
+# P indicates a prerequisite for installation
+# I indicates an incompatible package
+# R indicates a reverse dependency
+# <pkg.abbr> see pkginfo(4), PKG parameter
+# <name> see pkginfo(4), NAME parameter
+# <version> see pkginfo(4), VERSION parameter
+# <arch> see pkginfo(4), ARCH parameter
+# <type> <pkg.abbr> <name>
+# (<arch>)<version>
+# (<arch>)<version>
+# ...
+# <type> <pkg.abbr> <name>
+# ...
+#
+
+P SUNWcar Core Architecture, (Root)
+P SUNWcakr Core Solaris Kernel Architecture (Root)
+P SUNWkvm Core Architecture, (Kvm)
+P SUNWcsr Core Solaris, (Root)
+P SUNWckr Core Solaris Kernel (Root)
+P SUNWcnetr Core Solaris Network Infrastructure (Root)
+P SUNWcsu Core Solaris, (Usr)
+P SUNWcsd Core Solaris Devices
+P SUNWcsl Core Solaris Libraries
+P SUNWusb USB Device Drivers
+P SUNWusbs USB generic serial module
diff --git a/usr/src/pkgdefs/SUNWuftdi/i.preserve b/usr/src/pkgdefs/SUNWuftdi/i.preserve
new file mode 100644
index 0000000000..d3bc772c2b
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/i.preserve
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+while read src dest
+do
+ if [ ! -f $dest ] ; then
+ cp $src $dest
+ fi
+done
+exit 0
diff --git a/usr/src/pkgdefs/SUNWuftdi/pkginfo.tmpl b/usr/src/pkgdefs/SUNWuftdi/pkginfo.tmpl
new file mode 100644
index 0000000000..f6e6a3b5dc
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/pkginfo.tmpl
@@ -0,0 +1,50 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# This required package information file describes characteristics of the
+# package, such as package abbreviation, full package name, package version,
+# and package architecture.
+#
+PKG="SUNWuftdi"
+NAME="FT232R USB UART"
+ARCH="ISA"
+CATEGORY="system"
+BASEDIR=/
+SUNW_PKGTYPE="usr"
+CLASSES="none preserve"
+DESC="FTDI FT232R USB serial driver"
+SUNW_PRODNAME="SunOS"
+SUNW_PRODVERS="RELEASE/VERSION"
+VERSION="ONVERS,REV=0.0.0"
+VENDOR="Sun Microsystems, Inc."
+HOTLINE="Please contact your local service provider"
+EMAIL=""
+MAXINST="1000"
+SUNW_PKGVERS="1.0"
+SUNW_PKG_ALLZONES="true"
+SUNW_PKG_HOLLOW="true"
+SUNW_PKG_THISZONE="false"
diff --git a/usr/src/pkgdefs/SUNWuftdi/postinstall b/usr/src/pkgdefs/SUNWuftdi/postinstall
new file mode 100644
index 0000000000..74e3917766
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/postinstall
@@ -0,0 +1,94 @@
+#!/bin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+PATH="/usr/bin:/usr/sbin:${PATH}"
+export PATH
+
+if [ "${BASEDIR:=/}" != "/" ]
+then
+ BASEDIR_OPT="-b $BASEDIR"
+fi
+
+installed() {
+ driver=$1
+ grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
+
+ return $?
+}
+
+update_driver() {
+ driver=$1
+ aliases=$2
+ for alias in ${aliases}
+ do
+ egrep "^${driver}[ ]+${alias}" ${BASEDIR}/etc/driver_aliases > /dev/null 2>&1
+ if [ $? -ne 0 ]
+ then
+ echo "${driver} ${alias}" >> ${BASEDIR}/etc/driver_aliases
+ fi
+ done
+}
+
+EXIT=0
+
+# "usb403,6001" FTDI serial device, the rest are clones..
+
+USBFTDI_ALIASES="\
+ \"usb403,6001\" \
+ \"usb403,fc82\" \
+ \"usb403,fc08\" \
+ \"usb403,fc09\" \
+ \"usb403,fc0b\" \
+ \"usb403,fc0c\" \
+ \"usb403,fc0d\" \
+ \"usb403,fa00\" \
+ \"usb403,fa01\" \
+ \"usb403,fa02\" \
+ \"usb403,fa03\" \
+ \"usb403,fa04\" \
+ \"usb403,cc48\" \
+ \"usb403,cc49\" \
+ \"usb403,cc4a\" \
+ \"usb403,e888\" \
+ \"usb403,e889\" \
+ \"usb403,e88c\" \
+ \"usb403,e88b\" \
+ \"usb403,e88c\" \
+ \"usb7cc,0421\" \
+ \"usb93c,0601\" \
+ \"usb93c,0701\" \
+ \"usb856,ac01\" \
+ \"usb411,00b3\" \
+ "
+
+if installed usbftdi ; then
+ update_driver usbftdi "${USBFTDI_ALIASES}" || EXIT=1
+else
+ add_drv ${BASEDIR_OPT} -m '* 0666 root sys' \
+ -i "${USBFTDI_ALIASES}" -n usbftdi || EXIT=1
+fi
+
+exit $EXIT
diff --git a/usr/src/pkgdefs/SUNWuftdi/preremove b/usr/src/pkgdefs/SUNWuftdi/preremove
new file mode 100644
index 0000000000..664a8e254b
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/preremove
@@ -0,0 +1,37 @@
+#! /bin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+PATH="/usr/bin:/usr/sbin:${PATH}"
+export PATH
+
+EXIT=0
+
+if grep -w usbftdi ${BASEDIR}/etc/name_to_major > /dev/null 2>&1
+then
+ rem_drv -b ${BASEDIR} usbftdi || EXIT=1
+fi
+
+exit $EXIT
diff --git a/usr/src/pkgdefs/SUNWuftdi/prototype_com b/usr/src/pkgdefs/SUNWuftdi/prototype_com
new file mode 100644
index 0000000000..b919c23192
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/prototype_com
@@ -0,0 +1,48 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+# This required package information file contains a list of package contents.
+# The 'pkgmk' command uses this file to identify the contents of a package
+# and their location on the development machine when building the package.
+# Can be created via a text editor or through use of the 'pkgproto' command.
+
+#!search <pathname pathname ...> # where to find pkg objects
+#!include <filename> # include another 'prototype' file
+#!default <mode> <owner> <group> # default used if not specified on entry
+#!<param>=<value> # puts parameter in pkg environment
+
+#
+# SUNWuftdi
+#
+i copyright
+i depend
+i pkginfo
+i postinstall
+i preremove
+i i.preserve
+d none usr 0755 root sys
+d none usr/kernel 0755 root sys
+d none usr/kernel/drv 0755 root sys
+e preserve usr/kernel/drv/usbftdi.conf 0644 root sys
diff --git a/usr/src/pkgdefs/SUNWuftdi/prototype_i386 b/usr/src/pkgdefs/SUNWuftdi/prototype_i386
new file mode 100644
index 0000000000..d3e890aca0
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/prototype_i386
@@ -0,0 +1,51 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+# This required package information file contains a list of package contents.
+# The 'pkgmk' command uses this file to identify the contents of a package
+# and their location on the development machine when building the package.
+# Can be created via a text editor or through use of the 'pkgproto' command.
+
+#!search <pathname pathname ...> # where to find pkg objects
+#!include <filename> # include another 'prototype' file
+#!default <mode> <owner> <group> # default used if not specified on entry
+#!<param>=<value> # puts parameter in pkg environment
+
+#
+# Include ISA independent files (prototype_com)
+#
+!include prototype_com
+#
+#
+# List files which are i386 specific here
+#
+# source locations relative to the prototype file
+#
+#
+# SUNWuftdi
+#
+f none usr/kernel/drv/usbftdi 0755 root sys
+d none usr/kernel/drv/amd64 0755 root sys
+f none usr/kernel/drv/amd64/usbftdi 0755 root sys
diff --git a/usr/src/pkgdefs/SUNWuftdi/prototype_sparc b/usr/src/pkgdefs/SUNWuftdi/prototype_sparc
new file mode 100644
index 0000000000..867daee33a
--- /dev/null
+++ b/usr/src/pkgdefs/SUNWuftdi/prototype_sparc
@@ -0,0 +1,49 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+# This required package information file contains a list of package contents.
+# The 'pkgmk' command uses this file to identify the contents of a package
+# and their location on the development machine when building the package.
+# Can be created via a text editor or through use of the 'pkgproto' command.
+
+#!search <pathname pathname ...> # where to find pkg objects
+#!include <filename> # include another 'prototype' file
+#!default <mode> <owner> <group> # default used if not specified on entry
+#!<param>=<value> # puts parameter in pkg environment
+
+#
+# Include ISA independent files (prototype_com)
+#
+!include prototype_com
+#
+#
+# List files which are SPARC specific here
+#
+# source locations relative to the prototype file
+#
+#
+# SUNWuftdi
+d none usr/kernel/drv/sparcv9 0755 root sys
+f none usr/kernel/drv/sparcv9/usbftdi 0755 root sys
diff --git a/usr/src/pkgdefs/SUNWusbu/prototype_com b/usr/src/pkgdefs/SUNWusbu/prototype_com
index 27790bffb0..230ccb4e5e 100644
--- a/usr/src/pkgdefs/SUNWusbu/prototype_com
+++ b/usr/src/pkgdefs/SUNWusbu/prototype_com
@@ -20,12 +20,10 @@
#
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-
#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
@@ -62,6 +60,7 @@ d none usr/include/sys/usb/clients/video 755 root bin
d none usr/include/sys/usb/clients/video/usbvc 755 root bin
f none usr/include/sys/usb/usbai.h 644 root bin
f none usr/include/sys/usb/usba.h 644 root bin
+f none usr/include/sys/usb/usbdevs.h 644 root bin
f none usr/include/sys/usb/hubd/hub.h 644 root bin
f none usr/include/sys/usb/clients/audio/usb_audio.h 644 root bin
f none usr/include/sys/usb/clients/hid/hid.h 644 root bin
diff --git a/usr/src/pkgdefs/common_files/i.iuap b/usr/src/pkgdefs/common_files/i.iuap
index 17463df77f..c86543d3b6 100644
--- a/usr/src/pkgdefs/common_files/i.iuap
+++ b/usr/src/pkgdefs/common_files/i.iuap
@@ -20,9 +20,7 @@
# CDDL HEADER END
#
#
-#ident "%Z%%M% %I% %E% SMI"
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -74,6 +72,7 @@ do
add_driver usbsacm
add_driver usbsprl
add_driver usbsksp
+ add_driver usbftdi
remove_driver rts
add_driver ipsecah
add_driver ipsecesp
diff --git a/usr/src/ucbcmd/stty/stty.c b/usr/src/ucbcmd/stty/stty.c
index b37bebf6f6..65e79501d8 100644
--- a/usr/src/ucbcmd/stty/stty.c
+++ b/usr/src/ucbcmd/stty/stty.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,17 +18,15 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 1995 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
@@ -42,8 +39,8 @@ extern char *getenv();
extern void exit();
extern void perror();
-static char *STTY="stty: ";
-static char *USAGE="usage: stty [-agh] [modes]\n";
+static char *STTY = "stty: ";
+static char *USAGE = "usage: stty [-agh] [modes]\n";
static int pitt = 0;
static struct termios cb;
static struct termio ocb; /* for non-streams devices */
@@ -61,17 +58,17 @@ void delay(int, char *s);
void prspeed(char *, int);
void prencode(void);
-#define ioctl_desc 1
-#define output stderr
+#define ioctl_desc 1
+#define output stderr
int
main(int argc, char *argv[])
{
int i;
- char *s_arg, *sttyparse(); /* s_arg: ptr to mode to be set */
+ char *s_arg, *sttyparse(); /* s_arg: ptr to mode to be set */
extern const struct speeds speeds[];
-
+
if (argc == 2) {
/*
* "stty size", "stty speed" and "stty -g" are intended for
@@ -90,42 +87,45 @@ main(int argc, char *argv[])
perror("stty: TIOCGWINSZ");
exit(2);
}
- (void) printf("%d %d\n",winsize.ws_row,winsize.ws_col);
+ (void) printf("%d %d\n",
+ winsize.ws_row, winsize.ws_col);
exit(0);
- }
- else if (strcmp(argv[1], "speed") == 0) {
+ } else if (strcmp(argv[1], "speed") == 0) {
if ((i = open("/dev/tty", 0)) < 0) {
perror("stty: Cannot open /dev/tty");
exit(2);
}
- if((term = get_ttymode(i, &ocb, &cb, &stio, &termiox,
- &winsize)) < 0) {
+ if ((term = get_ttymode(i,
+ &ocb, &cb, &stio, &termiox, &winsize)) < 0) {
perror(STTY);
exit(2);
}
if (term & TERMIOS) {
- for(i=0; speeds[i].string; i++)
- if (cfgetospeed(&cb) == speeds[i].speed) {
- (void) printf("%s\n", speeds[i].string);
- exit(0);
- }
+ for (i = 0; speeds[i].string; i++)
+ if (cfgetospeed(&cb) ==
+ speeds[i].speed) {
+ (void) printf("%s\n",
+ speeds[i].string);
+ exit(0);
+ }
} else {
- for(i=0; speeds[i].string; i++)
- if ((cb.c_cflag&CBAUD) == speeds[i].speed) {
- (void) printf("%s\n", speeds[i].string);
- exit(0);
- }
+ for (i = 0; speeds[i].string; i++)
+ if ((cb.c_cflag&CBAUD) ==
+ speeds[i].speed) {
+ (void) printf("%s\n",
+ speeds[i].string);
+ exit(0);
+ }
}
(void) printf("unknown\n");
exit(1);
- }
- else if (strcmp(argv[1], "-g") == 0) {
+ } else if (strcmp(argv[1], "-g") == 0) {
if ((i = open("/dev/tty", 0)) < 0) {
perror("stty: Cannot open /dev/tty");
exit(2);
}
- if((term = get_ttymode(i, &ocb, &cb, &stio, &termiox,
- &winsize)) < 0) {
+ if ((term = get_ttymode(i,
+ &ocb, &cb, &stio, &termiox, &winsize)) < 0) {
perror(STTY);
exit(2);
}
@@ -134,7 +134,8 @@ main(int argc, char *argv[])
}
}
- if((term = get_ttymode(ioctl_desc, &ocb, &cb, &stio, &termiox, &winsize)) < 0) {
+ if ((term = get_ttymode(ioctl_desc,
+ &ocb, &cb, &stio, &termiox, &winsize)) < 0) {
perror(STTY);
exit(2);
}
@@ -143,16 +144,16 @@ main(int argc, char *argv[])
prmodes(0);
exit(0);
}
- if ((argc ==2) && strcmp(argv[1], "all") ==0) {
+ if ((argc == 2) && strcmp(argv[1], "all") == 0) {
prmodes(1);
exit(0);
}
- if ((argc ==2) && strcmp(argv[1], "everything") ==0) {
+ if ((argc == 2) && strcmp(argv[1], "everything") == 0) {
pramodes(1);
exit(0);
}
if ((argc == 2) && (argv[1][0] == '-') && (argv[1][2] == '\0'))
- switch(argv[1][1]) {
+ switch (argv[1][1]) {
case 'a':
pramodes(0);
exit(0);
@@ -162,13 +163,15 @@ main(int argc, char *argv[])
default:
(void) fprintf(stderr, "%s", USAGE);
exit(2);
- }
- if (s_arg = sttyparse(argc, argv, term, &ocb, &cb, &termiox, &winsize)) {
+ }
+ if (s_arg = sttyparse(argc, argv,
+ term, &ocb, &cb, &termiox, &winsize)) {
(void) fprintf(stderr, "unknown mode: %s\n", s_arg);
exit(2);
}
- if(set_ttymode(ioctl_desc, term, &ocb, &cb, &stio, &termiox, &winsize, &owinsize) == -1) {
+ if (set_ttymode(ioctl_desc,
+ term, &ocb, &cb, &stio, &termiox, &winsize, &owinsize) == -1) {
perror(STTY);
exit(2);
}
@@ -183,21 +186,34 @@ prmodes(int moremodes)
if (!(term & ASYNC)) {
m = stio.imode;
- if (m & IUCLC) (void) fprintf(output, "iuclc ");
- else (void) fprintf(output, "-iuclc ");
+ if (m & IUCLC)
+ (void) fprintf(output, "iuclc ");
+ else
+ (void) fprintf(output, "-iuclc ");
m = stio.omode;
- if (m & OLCUC) (void) fprintf(output, "olcuc ");
- else (void) fprintf(output, "-olcuc ");
- if (m & TAB3) (void) fprintf(output, "tab3 ");
+ if (m & OLCUC)
+ (void) fprintf(output, "olcuc ");
+ else
+ (void) fprintf(output, "-olcuc ");
+ if (m & TAB3)
+ (void) fprintf(output, "tab3 ");
m = stio.lmode;
- if (m & XCASE) (void) fprintf(output, "xcase ");
- else (void) fprintf(output, "-xcase ");
- if (m & STFLUSH) (void) fprintf(output, "stflush ");
- else (void) fprintf(output, "-stflush ");
- if (m & STWRAP) (void)fprintf(output, "stwrap ");
- else (void) fprintf(output, "-stwrap ");
- if (m & STAPPL) (void) fprintf(output, "stappl ");
- else (void) fprintf(output, "-stappl ");
+ if (m & XCASE)
+ (void) fprintf(output, "xcase ");
+ else
+ (void) fprintf(output, "-xcase ");
+ if (m & STFLUSH)
+ (void) fprintf(output, "stflush ");
+ else
+ (void) fprintf(output, "-stflush ");
+ if (m & STWRAP)
+ (void) fprintf(output, "stwrap ");
+ else
+ (void) fprintf(output, "-stwrap ");
+ if (m & STAPPL)
+ (void) fprintf(output, "stappl ");
+ else
+ (void) fprintf(output, "-stappl ");
(void) fprintf(output, "\n");
}
if (term & ASYNC) {
@@ -208,227 +224,242 @@ prmodes(int moremodes)
prspeed("ospeed ", cfgetospeed(&cb));
} else
prspeed("speed ", cfgetospeed(&cb));
- if (m&PARENB) {
- if((m&PAREXT) && (term & TERMIOS)) {
- if (m&PARODD)
- (void) fprintf(output,"markp ");
+ if (m & PARENB) {
+ if ((m & PAREXT) && (term & TERMIOS)) {
+ if (m & PARODD)
+ (void) fprintf(output, "markp ");
else
- (void) fprintf(output,"spacep ");
+ (void) fprintf(output, "spacep ");
} else {
- if (m&PARODD)
- (void) fprintf(output,"oddp ");
+ if (m & PARODD)
+ (void) fprintf(output, "oddp ");
else
- (void) fprintf(output,"evenp ");
+ (void) fprintf(output, "evenp ");
}
} else
- (void) fprintf(output,"-parity ");
- if(((m&PARENB) && !(m&CS7)) || (!(m&PARENB) && !(m&CS8)))
- (void) fprintf(output,"cs%c ",'5'+(m&CSIZE)/CS6);
- if (m&CSTOPB)
- (void) fprintf(output,"cstopb ");
- if (m&HUPCL)
- (void) fprintf(output,"hupcl ");
- if (!(m&CREAD))
- (void) fprintf(output,"-cread ");
- if (m&CLOCAL)
- (void) fprintf(output,"clocal ");
- if (m&LOBLK)
- (void) fprintf(output,"loblk ");
- (void) fprintf(output,"\n");
- if(ocb.c_line != 0)
- (void) fprintf(output,"line = %d; ", ocb.c_line);
- if(term & WINDOW) {
- (void)fprintf(output,"rows = %d; columns = %d;", winsize.ws_row, winsize.ws_col);
- (void)fprintf(output," ypixels = %d; xpixels = %d;\n", winsize.ws_ypixel, winsize.ws_xpixel);
+ (void) fprintf(output, "-parity ");
+ if (((m & PARENB) && !(m & CS7)) ||
+ (!(m & PARENB) && !(m & CS8)))
+ (void) fprintf(output, "cs%c ", '5' + (m & CSIZE)/CS6);
+ if (m & CSTOPB)
+ (void) fprintf(output, "cstopb ");
+ if (m & HUPCL)
+ (void) fprintf(output, "hupcl ");
+ if (!(m & CREAD))
+ (void) fprintf(output, "-cread ");
+ if (m & CLOCAL)
+ (void) fprintf(output, "clocal ");
+ if (m & LOBLK)
+ (void) fprintf(output, "loblk ");
+ (void) fprintf(output, "\n");
+ if (ocb.c_line != 0)
+ (void) fprintf(output, "line = %d; ", ocb.c_line);
+ if (term & WINDOW) {
+ (void) fprintf(output, "rows = %d; columns = %d;",
+ winsize.ws_row, winsize.ws_col);
+ (void) fprintf(output, " ypixels = %d; xpixels = %d;\n",
+ winsize.ws_ypixel, winsize.ws_xpixel);
}
- if((cb.c_lflag&ICANON)== 0)
- (void) fprintf(output,"min = %d; time = %d;\n",
- cb.c_cc[VMIN], cb.c_cc[VTIME]);
+ if ((cb.c_lflag & ICANON) == 0)
+ (void) fprintf(output, "min = %d; time = %d;\n",
+ cb.c_cc[VMIN], cb.c_cc[VTIME]);
if (!moremodes) {
- if(cb.c_cc[VINTR] != CINTR)
+ if (cb.c_cc[VINTR] != CINTR)
pit(cb.c_cc[VINTR], "intr", "; ");
- if(cb.c_cc[VQUIT] != CQUIT)
+ if (cb.c_cc[VQUIT] != CQUIT)
pit(cb.c_cc[VQUIT], "quit", "; ");
- if(cb.c_cc[VERASE] != CERASE)
+ if (cb.c_cc[VERASE] != CERASE)
pit(cb.c_cc[VERASE], "erase", "; ");
- if(cb.c_cc[VKILL] != CKILL)
+ if (cb.c_cc[VKILL] != CKILL)
pit(cb.c_cc[VKILL], "kill", "; ");
- if(cb.c_cc[VEOF] != CEOF)
+ if (cb.c_cc[VEOF] != CEOF)
pit(cb.c_cc[VEOF], "eof", "; ");
- if(cb.c_cc[VEOL] != CNUL)
+ if (cb.c_cc[VEOL] != CNUL)
pit(cb.c_cc[VEOL], "eol", "; ");
- if(cb.c_cc[VEOL2] != CNUL)
+ if (cb.c_cc[VEOL2] != CNUL)
pit(cb.c_cc[VEOL2], "eol2", "; ");
- if(cb.c_cc[VSWTCH] != CSWTCH)
+ if (cb.c_cc[VSWTCH] != CSWTCH)
pit(cb.c_cc[VSWTCH], "swtch", "; ");
- if(term & TERMIOS) {
- if(cb.c_cc[VSTART] != CSTART)
+ if (term & TERMIOS) {
+ if (cb.c_cc[VSTART] != CSTART)
pit(cb.c_cc[VSTART], "start", "; ");
- if(cb.c_cc[VSTOP] != CSTOP)
+ if (cb.c_cc[VSTOP] != CSTOP)
pit(cb.c_cc[VSTOP], "stop", "; ");
- if(cb.c_cc[VSUSP] != CSUSP)
+ if (cb.c_cc[VSUSP] != CSUSP)
pit(cb.c_cc[VSUSP], "susp", "; ");
- if(cb.c_cc[VDSUSP] != CDSUSP)
+ if (cb.c_cc[VDSUSP] != CDSUSP)
pit(cb.c_cc[VDSUSP], "dsusp", "; ");
- if(cb.c_cc[VREPRINT] != CRPRNT)
+ if (cb.c_cc[VREPRINT] != CRPRNT)
pit(cb.c_cc[VREPRINT], "rprnt", "; ");
- if(cb.c_cc[VDISCARD] != CFLUSH)
+ if (cb.c_cc[VDISCARD] != CFLUSH)
pit(cb.c_cc[VDISCARD], "flush", "; ");
- if(cb.c_cc[VWERASE] != CWERASE)
+ if (cb.c_cc[VWERASE] != CWERASE)
pit(cb.c_cc[VWERASE], "werase", "; ");
- if(cb.c_cc[VLNEXT] != CLNEXT)
+ if (cb.c_cc[VLNEXT] != CLNEXT)
pit(cb.c_cc[VLNEXT], "lnext", "; ");
}
}
- if(pitt) (void) fprintf(output,"\n");
+ if (pitt)
+ (void) fprintf(output, "\n");
m = cb.c_iflag;
- if (m&IGNBRK)
- (void) fprintf(output,"ignbrk ");
- else if (!(m&BRKINT))
- (void) fprintf(output,"-brkint ");
- if (!(m&INPCK))
- (void) fprintf(output,"-inpck ");
- else if (!(m&IGNPAR))
- (void) fprintf(output,"-ignpar ");
- if (m&PARMRK)
- (void) fprintf(output,"parmrk ");
- if (!(m&ISTRIP))
- (void) fprintf(output,"-istrip ");
- if (m&INLCR)
- (void) fprintf(output,"inlcr ");
- if (m&IGNCR)
- (void) fprintf(output,"igncr ");
- if (!(m&ICRNL))
- (void) fprintf(output,"-icrnl ");
- if (m&IUCLC)
- (void) fprintf(output,"iuclc ");
- if (!(m&IXON))
- (void) fprintf(output,"-ixon ");
- else if (m&IXANY)
- (void) fprintf(output,"ixany ");
- if (m&IXOFF)
- (void) fprintf(output,"ixoff ");
- if ((term & TERMIOS) && (m&IMAXBEL))
- (void) fprintf(output,"imaxbel ");
+ if (m & IGNBRK)
+ (void) fprintf(output, "ignbrk ");
+ else if (!(m & BRKINT))
+ (void) fprintf(output, "-brkint ");
+ if (!(m & INPCK))
+ (void) fprintf(output, "-inpck ");
+ else if (!(m & IGNPAR))
+ (void) fprintf(output, "-ignpar ");
+ if (m & PARMRK)
+ (void) fprintf(output, "parmrk ");
+ if (!(m & ISTRIP))
+ (void) fprintf(output, "-istrip ");
+ if (m & INLCR)
+ (void) fprintf(output, "inlcr ");
+ if (m & IGNCR)
+ (void) fprintf(output, "igncr ");
+ if (!(m & ICRNL))
+ (void) fprintf(output, "-icrnl ");
+ if (m & IUCLC)
+ (void) fprintf(output, "iuclc ");
+ if (!(m & IXON))
+ (void) fprintf(output, "-ixon ");
+ else if (m & IXANY)
+ (void) fprintf(output, "ixany ");
+ if (m & IXOFF)
+ (void) fprintf(output, "ixoff ");
+ if ((term & TERMIOS) && (m & IMAXBEL))
+ (void) fprintf(output, "imaxbel ");
m = cb.c_oflag;
- if (!(m&OPOST))
- (void) fprintf(output,"-opost ");
+ if (!(m & OPOST))
+ (void) fprintf(output, "-opost ");
else {
- if (m&OLCUC)
- (void) fprintf(output,"olcuc ");
- if (!(m&ONLCR))
- (void) fprintf(output,"-onlcr ");
- if (m&OCRNL)
- (void) fprintf(output,"ocrnl ");
- if (m&ONOCR)
- (void) fprintf(output,"onocr ");
- if (m&ONLRET)
- (void) fprintf(output,"onlret ");
- if (m&OFILL)
- if (m&OFDEL)
- (void) fprintf(output,"del-fill ");
+ if (m & OLCUC)
+ (void) fprintf(output, "olcuc ");
+ if (!(m & ONLCR))
+ (void) fprintf(output, "-onlcr ");
+ if (m & OCRNL)
+ (void) fprintf(output, "ocrnl ");
+ if (m & ONOCR)
+ (void) fprintf(output, "onocr ");
+ if (m & ONLRET)
+ (void) fprintf(output, "onlret ");
+ if (m & OFILL)
+ if (m & OFDEL)
+ (void) fprintf(output, "del-fill ");
+ else
+ (void) fprintf(output, "nul-fill ");
+ delay((m & CRDLY)/CR1, "cr");
+ delay((m & NLDLY)/NL1, "nl");
+ if ((m & TABDLY) == XTABS)
+ (void) fprintf(output, "-tabs ");
else
- (void) fprintf(output,"nul-fill ");
- delay((m&CRDLY)/CR1, "cr");
- delay((m&NLDLY)/NL1, "nl");
- if ((m&TABDLY) == XTABS)
- (void) fprintf(output,"-tabs ");
- else
- delay((m&TABDLY)/TAB1, "tab");
- delay((m&BSDLY)/BS1, "bs");
- delay((m&VTDLY)/VT1, "vt");
- delay((m&FFDLY)/FF1, "ff");
+ delay((m & TABDLY)/TAB1, "tab");
+ delay((m & BSDLY)/BS1, "bs");
+ delay((m & VTDLY)/VT1, "vt");
+ delay((m & FFDLY)/FF1, "ff");
}
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "\n");
m = cb.c_lflag;
- if (!(m&ISIG))
- (void) fprintf(output,"-isig ");
- if (!(m&ICANON))
- (void) fprintf(output,"-icanon ");
- if (m&XCASE)
- (void) fprintf(output,"xcase ");
- if (!(m&ECHO))
- (void) fprintf(output,"-echo ");
- if (m&ECHOE) {
- if (m&ECHOKE)
- (void) fprintf(output,"crt ");
+ if (!(m & ISIG))
+ (void) fprintf(output, "-isig ");
+ if (!(m & ICANON))
+ (void) fprintf(output, "-icanon ");
+ if (m & XCASE)
+ (void) fprintf(output, "xcase ");
+ if (!(m & ECHO))
+ (void) fprintf(output, "-echo ");
+ if (m & ECHOE) {
+ if (m & ECHOKE)
+ (void) fprintf(output, "crt ");
else
- (void) fprintf(output,"echoe -echoke ");
+ (void) fprintf(output, "echoe -echoke ");
} else {
- if (!(m&ECHOPRT))
- (void) fprintf(output,"-echoprt ");
+ if (!(m & ECHOPRT))
+ (void) fprintf(output, "-echoprt ");
}
- if (!(m&ECHOK))
- (void) fprintf(output,"-echok ");
- if (m&ECHONL)
- (void) fprintf(output,"echonl ");
- if (m&NOFLSH)
- (void) fprintf(output,"noflsh ");
- if (m&TOSTOP)
- (void) fprintf(output,"tostop ");
- if (!(m&ECHOCTL))
- (void) fprintf(output,"-echoctl ");
- if (m&DEFECHO)
- (void) fprintf(output,"defecho ");
- if (m&FLUSHO)
- (void) fprintf(output,"flusho ");
- if (m&PENDIN)
- (void) fprintf(output,"pendin ");
- if (m&IEXTEN)
- (void) fprintf(output,"iexten ");
- (void) fprintf(output,"\n");
+ if (!(m & ECHOK))
+ (void) fprintf(output, "-echok ");
+ if (m & ECHONL)
+ (void) fprintf(output, "echonl ");
+ if (m & NOFLSH)
+ (void) fprintf(output, "noflsh ");
+ if (m & TOSTOP)
+ (void) fprintf(output, "tostop ");
+ if (!(m & ECHOCTL))
+ (void) fprintf(output, "-echoctl ");
+ if (m & DEFECHO)
+ (void) fprintf(output, "defecho ");
+ if (m & FLUSHO)
+ (void) fprintf(output, "flusho ");
+ if (m & PENDIN)
+ (void) fprintf(output, "pendin ");
+ if (m & IEXTEN)
+ (void) fprintf(output, "iexten ");
+ (void) fprintf(output, "\n");
}
- if(term & FLOW) {
+ if (term & FLOW) {
m = termiox.x_hflag;
- if(m & RTSXOFF)
- (void) fprintf(output,"rtsxoff ");
- if(m & CTSXON)
- (void) fprintf(output,"ctsxon ");
- if(m & DTRXOFF)
- (void) fprintf(output,"dterxoff ");
- if(m & CDXON)
- (void) fprintf(output,"rlsdxon ");
- if(m & ISXOFF)
- (void) fprintf(output,"isxoff ");
+ if (m & RTSXOFF)
+ (void) fprintf(output, "rtsxoff ");
+ if (m & CTSXON)
+ (void) fprintf(output, "ctsxon ");
+ if (m & DTRXOFF)
+ (void) fprintf(output, "dterxoff ");
+ if (m & CDXON)
+ (void) fprintf(output, "rlsdxon ");
+ if (m & ISXOFF)
+ (void) fprintf(output, "isxoff ");
m = termiox.x_cflag;
- switch(m & XMTCLK)
- {
- case XCIBRG: (void)fprintf(output,"xcibrg ");
- break;
- case XCTSET: (void)fprintf(output,"xctset ");
- break;
- case XCRSET: (void)fprintf(output,"xcrset ");
+ switch (m & XMTCLK) {
+ case XCIBRG:
+ (void) fprintf(output, "xcibrg ");
+ break;
+ case XCTSET:
+ (void) fprintf(output, "xctset ");
+ break;
+ case XCRSET:
+ (void) fprintf(output, "xcrset ");
+ break;
}
-
- switch(m & RCVCLK)
- {
- case RCIBRG: (void)fprintf(output,"rcibrg ");
- break;
- case RCTSET: (void)fprintf(output,"rctset ");
- break;
- case RCRSET: (void)fprintf(output,"rcrset ");
+
+ switch (m & RCVCLK) {
+ case RCIBRG:
+ (void) fprintf(output, "rcibrg ");
+ break;
+ case RCTSET:
+ (void) fprintf(output, "rctset ");
+ break;
+ case RCRSET:
+ (void) fprintf(output, "rcrset ");
+ break;
}
-
- switch(m & TSETCLK)
- {
- case TSETCOFF: (void)fprintf(output,"tsetcoff ");
- break;
- case TSETCRBRG: (void)fprintf(output,"tsetcrc ");
- break;
- case TSETCTBRG: (void)fprintf(output,"tsetcxc ");
+
+ switch (m & TSETCLK) {
+ case TSETCOFF:
+ (void) fprintf(output, "tsetcoff ");
+ break;
+ case TSETCRBRG:
+ (void) fprintf(output, "tsetcrc ");
+ break;
+ case TSETCTBRG:
+ (void) fprintf(output, "tsetcxc ");
+ break;
}
-
- switch(m & RSETCLK)
- {
- case RSETCOFF: (void)fprintf(output,"rsetcoff ");
- break;
- case RSETCRBRG: (void)fprintf(output,"rsetcrc ");
- break;
- case RSETCTBRG: (void)fprintf(output,"rsetcxc ");
+
+ switch (m & RSETCLK) {
+ case RSETCOFF:
+ (void) fprintf(output, "rsetcoff ");
+ break;
+ case RSETCRBRG:
+ (void) fprintf(output, "rsetcrc ");
+ break;
+ case RSETCTBRG:
+ (void) fprintf(output, "rsetcxc ");
}
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "\n");
}
- if(moremodes)
+ if (moremodes)
prachars();
}
@@ -439,23 +470,25 @@ pramodes(int tabform)
int m;
m = cb.c_cflag;
- if(term & ASYNC) {
+ if (term & ASYNC) {
if ((term & TERMIOS) && cfgetispeed(&cb) != 0 &&
cfgetispeed(&cb) != cfgetospeed(&cb)) {
prspeed("ispeed ", cfgetispeed(&cb));
prspeed("ospeed ", cfgetospeed(&cb));
} else
prspeed("speed ", cfgetospeed(&cb));
- if(!(term & TERMIOS))
- (void) fprintf(output,"line = %d; ", ocb.c_line);
- (void) fprintf(output,"\n");
- if(term & WINDOW) {
- (void)fprintf(output,"rows = %d columns = %d; ", winsize.ws_row, winsize.ws_col);
- (void)fprintf(output,"ypixels = %d xpixels = %d\n", winsize.ws_ypixel, winsize.ws_xpixel);
+ if (!(term & TERMIOS))
+ (void) fprintf(output, "line = %d; ", ocb.c_line);
+ (void) fprintf(output, "\n");
+ if (term & WINDOW) {
+ (void) fprintf(output, "rows = %d columns = %d; ",
+ winsize.ws_row, winsize.ws_col);
+ (void) fprintf(output, "ypixels = %d xpixels = %d\n",
+ winsize.ws_ypixel, winsize.ws_xpixel);
}
- if((cb.c_lflag&ICANON)== 0)
- (void) fprintf(output,"min = %d; time = %d;\n", cb.c_cc[VMIN],
- cb.c_cc[VTIME]);
+ if ((cb.c_lflag & ICANON) == 0)
+ (void) fprintf(output, "min = %d; time = %d;\n",
+ cb.c_cc[VMIN], cb.c_cc[VTIME]);
if (!tabform) {
pit(cb.c_cc[VINTR], "intr", "; ");
pit(cb.c_cc[VQUIT], "quit", "; ");
@@ -465,7 +498,7 @@ pramodes(int tabform)
pit(cb.c_cc[VEOL], "eol", "; ");
pit(cb.c_cc[VEOL2], "eol2", "; ");
pit(cb.c_cc[VSWTCH], "swtch", ";\n");
- if(term & TERMIOS) {
+ if (term & TERMIOS) {
pit(cb.c_cc[VSTART], "start", "; ");
pit(cb.c_cc[VSTOP], "stop", "; ");
pit(cb.c_cc[VSUSP], "susp", "; ");
@@ -479,126 +512,138 @@ pramodes(int tabform)
} else
pit((unsigned)stio.tab, "ctab", "\n");
m = cb.c_cflag;
- (void) fprintf(output,"-parenb "+((m&PARENB)!=0));
- (void) fprintf(output,"-parodd "+((m&PARODD)!=0));
- (void) fprintf(output,"cs%c ",'5'+(m&CSIZE)/CS6);
- (void) fprintf(output,"-cstopb "+((m&CSTOPB)!=0));
- (void) fprintf(output,"-hupcl "+((m&HUPCL)!=0));
- (void) fprintf(output,"-cread "+((m&CREAD)!=0));
- (void) fprintf(output,"-clocal "+((m&CLOCAL)!=0));
-
- (void) fprintf(output,"-loblk "+((m&LOBLK)!=0));
- if(term & TERMIOS)
- (void) fprintf(output,"-parext "+((m&PAREXT)!=0));
-
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "-parenb " + ((m & PARENB) != 0));
+ (void) fprintf(output, "-parodd " + ((m & PARODD) != 0));
+ (void) fprintf(output, "cs%c ", '5'+ (m & CSIZE)/CS6);
+ (void) fprintf(output, "-cstopb " + ((m & CSTOPB) != 0));
+ (void) fprintf(output, "-hupcl " + ((m & HUPCL) != 0));
+ (void) fprintf(output, "-cread " + ((m & CREAD) != 0));
+ (void) fprintf(output, "-clocal " + ((m & CLOCAL) != 0));
+
+ (void) fprintf(output, "-loblk " + ((m & LOBLK) != 0));
+ if (term & TERMIOS)
+ (void) fprintf(output, "-parext " + ((m & PAREXT) != 0));
+
+ (void) fprintf(output, "\n");
m = cb.c_iflag;
- (void) fprintf(output,"-ignbrk "+((m&IGNBRK)!=0));
- (void) fprintf(output,"-brkint "+((m&BRKINT)!=0));
- (void) fprintf(output,"-ignpar "+((m&IGNPAR)!=0));
- (void) fprintf(output,"-parmrk "+((m&PARMRK)!=0));
- (void) fprintf(output,"-inpck "+((m&INPCK)!=0));
- (void) fprintf(output,"-istrip "+((m&ISTRIP)!=0));
- (void) fprintf(output,"-inlcr "+((m&INLCR)!=0));
- (void) fprintf(output,"-igncr "+((m&IGNCR)!=0));
- (void) fprintf(output,"-icrnl "+((m&ICRNL)!=0));
- (void) fprintf(output,"-iuclc "+((m&IUCLC)!=0));
- (void) fprintf(output,"\n");
- (void) fprintf(output,"-ixon "+((m&IXON)!=0));
- (void) fprintf(output,"-ixany "+((m&IXANY)!=0));
- (void) fprintf(output,"-ixoff "+((m&IXOFF)!=0));
- if(term & TERMIOS)
- (void) fprintf(output,"-imaxbel "+((m&IMAXBEL)!=0));
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "-ignbrk " + ((m & IGNBRK) != 0));
+ (void) fprintf(output, "-brkint " + ((m & BRKINT) != 0));
+ (void) fprintf(output, "-ignpar " + ((m & IGNPAR) != 0));
+ (void) fprintf(output, "-parmrk " + ((m & PARMRK) != 0));
+ (void) fprintf(output, "-inpck " + ((m & INPCK) != 0));
+ (void) fprintf(output, "-istrip " + ((m & ISTRIP) != 0));
+ (void) fprintf(output, "-inlcr " + ((m & INLCR) != 0));
+ (void) fprintf(output, "-igncr " + ((m & IGNCR) != 0));
+ (void) fprintf(output, "-icrnl " + ((m & ICRNL) != 0));
+ (void) fprintf(output, "-iuclc " + ((m & IUCLC) != 0));
+ (void) fprintf(output, "\n");
+ (void) fprintf(output, "-ixon " + ((m & IXON) != 0));
+ (void) fprintf(output, "-ixany " + ((m & IXANY) != 0));
+ (void) fprintf(output, "-ixoff " + ((m & IXOFF) != 0));
+ if (term & TERMIOS)
+ (void) fprintf(output, "-imaxbel " + ((m & IMAXBEL) != 0));
+ (void) fprintf(output, "\n");
m = cb.c_lflag;
- (void) fprintf(output,"-isig "+((m&ISIG)!=0));
- (void) fprintf(output,"-icanon "+((m&ICANON)!=0));
- (void) fprintf(output,"-xcase "+((m&XCASE)!=0));
- (void) fprintf(output,"-echo "+((m&ECHO)!=0));
- (void) fprintf(output,"-echoe "+((m&ECHOE)!=0));
- (void) fprintf(output,"-echok "+((m&ECHOK)!=0));
- (void) fprintf(output,"-echonl "+((m&ECHONL)!=0));
- (void) fprintf(output,"-noflsh "+((m&NOFLSH)!=0));
- if(term & TERMIOS) {
- (void) fprintf(output,"\n");
- (void) fprintf(output,"-tostop "+((m&TOSTOP)!=0));
- (void) fprintf(output,"-echoctl "+((m&ECHOCTL)!=0));
- (void) fprintf(output,"-echoprt "+((m&ECHOPRT)!=0));
- (void) fprintf(output,"-echoke "+((m&ECHOKE)!=0));
- (void) fprintf(output,"-defecho "+((m&DEFECHO)!=0));
- (void) fprintf(output,"-flusho "+((m&FLUSHO)!=0));
- (void) fprintf(output,"-pendin "+((m&PENDIN)!=0));
- (void) fprintf(output,"-iexten "+((m&IEXTEN)!=0));
+ (void) fprintf(output, "-isig " + ((m & ISIG) != 0));
+ (void) fprintf(output, "-icanon " + ((m & ICANON) != 0));
+ (void) fprintf(output, "-xcase " + ((m & XCASE) != 0));
+ (void) fprintf(output, "-echo " + ((m & ECHO) != 0));
+ (void) fprintf(output, "-echoe " + ((m & ECHOE) != 0));
+ (void) fprintf(output, "-echok " + ((m & ECHOK) != 0));
+ (void) fprintf(output, "-echonl " + ((m & ECHONL) != 0));
+ (void) fprintf(output, "-noflsh " + ((m & NOFLSH) != 0));
+ if (term & TERMIOS) {
+ (void) fprintf(output, "\n");
+ (void) fprintf(output, "-tostop " + ((m & TOSTOP) != 0));
+ (void) fprintf(output, "-echoctl " + ((m & ECHOCTL) != 0));
+ (void) fprintf(output, "-echoprt " + ((m & ECHOPRT) != 0));
+ (void) fprintf(output, "-echoke " + ((m & ECHOKE) != 0));
+ (void) fprintf(output, "-defecho " + ((m & DEFECHO) != 0));
+ (void) fprintf(output, "-flusho " + ((m & FLUSHO) != 0));
+ (void) fprintf(output, "-pendin " + ((m & PENDIN) != 0));
+ (void) fprintf(output, "-iexten " + ((m & IEXTEN) != 0));
}
- if(!(term & ASYNC)) {
- (void) fprintf(output,"-stflush "+((m&STFLUSH)!=0));
- (void) fprintf(output,"-stwrap "+((m&STWRAP)!=0));
- (void) fprintf(output,"-stappl "+((m&STAPPL)!=0));
+ if (!(term & ASYNC)) {
+ (void) fprintf(output, "-stflush " + ((m & STFLUSH) != 0));
+ (void) fprintf(output, "-stwrap " + ((m & STWRAP) != 0));
+ (void) fprintf(output, "-stappl " + ((m & STAPPL) != 0));
}
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "\n");
m = cb.c_oflag;
- (void) fprintf(output,"-opost "+((m&OPOST)!=0));
- (void) fprintf(output,"-olcuc "+((m&OLCUC)!=0));
- (void) fprintf(output,"-onlcr "+((m&ONLCR)!=0));
- (void) fprintf(output,"-ocrnl "+((m&OCRNL)!=0));
- (void) fprintf(output,"-onocr "+((m&ONOCR)!=0));
- (void) fprintf(output,"-onlret "+((m&ONLRET)!=0));
- (void) fprintf(output,"-ofill "+((m&OFILL)!=0));
- (void) fprintf(output,"-ofdel "+((m&OFDEL)!=0));
- delay((m&CRDLY)/CR1, "cr");
- delay((m&NLDLY)/NL1, "nl");
- if ((m&TABDLY) == XTABS)
- (void) fprintf(output,"-tabs ");
+ (void) fprintf(output, "-opost " + ((m & OPOST) != 0));
+ (void) fprintf(output, "-olcuc " + ((m & OLCUC) != 0));
+ (void) fprintf(output, "-onlcr " + ((m & ONLCR) != 0));
+ (void) fprintf(output, "-ocrnl " + ((m & OCRNL) != 0));
+ (void) fprintf(output, "-onocr " + ((m & ONOCR) != 0));
+ (void) fprintf(output, "-onlret " + ((m & ONLRET) != 0));
+ (void) fprintf(output, "-ofill " + ((m & OFILL) != 0));
+ (void) fprintf(output, "-ofdel " + ((m & OFDEL) != 0));
+ delay((m & CRDLY)/CR1, "cr");
+ delay((m & NLDLY)/NL1, "nl");
+ if ((m & TABDLY) == XTABS)
+ (void) fprintf(output, "-tabs ");
else
- delay((m&TABDLY)/TAB1, "tab");
- delay((m&BSDLY)/BS1, "bs");
- delay((m&VTDLY)/VT1, "vt");
- delay((m&FFDLY)/FF1, "ff");
- (void) fprintf(output,"\n");
- if(term & FLOW) {
+ delay((m & TABDLY)/TAB1, "tab");
+ delay((m & BSDLY)/BS1, "bs");
+ delay((m & VTDLY)/VT1, "vt");
+ delay((m & FFDLY)/FF1, "ff");
+ (void) fprintf(output, "\n");
+ if (term & FLOW) {
m = termiox.x_hflag;
- (void) fprintf(output,"-rtsxoff "+((m&RTSXOFF)!=0));
- (void) fprintf(output,"-ctsxon "+((m&CTSXON)!=0));
- (void) fprintf(output,"-dterxoff "+((m&DTRXOFF)!=0));
- (void) fprintf(output,"-rlsdxon "+((m&CDXON)!=0));
- (void) fprintf(output,"-isxoff "+((m&ISXOFF)!=0));
+ (void) fprintf(output, "-rtsxoff " + ((m & RTSXOFF) != 0));
+ (void) fprintf(output, "-ctsxon " + ((m & CTSXON) != 0));
+ (void) fprintf(output, "-dterxoff " + ((m & DTRXOFF) != 0));
+ (void) fprintf(output, "-rlsdxon " + ((m & CDXON) != 0));
+ (void) fprintf(output, "-isxoff " + ((m & ISXOFF) != 0));
m = termiox.x_cflag;
- switch(m & XMTCLK)
- {
- case XCIBRG: (void)fprintf(output,"xcibrg ");
- break;
- case XCTSET: (void)fprintf(output,"xctset ");
- break;
- case XCRSET: (void)fprintf(output,"xcrset ");
+ switch (m & XMTCLK) {
+ case XCIBRG:
+ (void) fprintf(output, "xcibrg ");
+ break;
+ case XCTSET:
+ (void) fprintf(output, "xctset ");
+ break;
+ case XCRSET:
+ (void) fprintf(output, "xcrset ");
+ break;
}
-
- switch(m & RCVCLK)
- {
- case RCIBRG: (void)fprintf(output,"rcibrg ");
- break;
- case RCTSET: (void)fprintf(output,"rctset ");
- break;
- case RCRSET: (void)fprintf(output,"rcrset ");
+
+ switch (m & RCVCLK) {
+ case RCIBRG:
+ (void) fprintf(output, "rcibrg ");
+ break;
+ case RCTSET:
+ (void) fprintf(output, "rctset ");
+ break;
+ case RCRSET:
+ (void) fprintf(output, "rcrset ");
+ break;
}
-
- switch(m & TSETCLK)
- {
- case TSETCOFF: (void)fprintf(output,"tsetcoff ");
- break;
- case TSETCRBRG: (void)fprintf(output,"tsetcrc ");
- break;
- case TSETCTBRG: (void)fprintf(output,"tsetcxc ");
+
+ switch (m & TSETCLK) {
+ case TSETCOFF:
+ (void) fprintf(output, "tsetcoff ");
+ break;
+ case TSETCRBRG:
+ (void) fprintf(output, "tsetcrc ");
+ break;
+ case TSETCTBRG:
+ (void) fprintf(output, "tsetcxc ");
+ break;
}
-
- switch(m & RSETCLK)
- {
- case RSETCOFF: (void)fprintf(output,"rsetcoff ");
- break;
- case RSETCRBRG: (void)fprintf(output,"rsetcrc ");
- break;
- case RSETCTBRG: (void)fprintf(output,"rsetcxc ");
+
+ switch (m & RSETCLK) {
+ case RSETCOFF:
+ (void) fprintf(output, "rsetcoff ");
+ break;
+ case RSETCRBRG:
+ (void) fprintf(output, "rsetcrc ");
+ break;
+ case RSETCTBRG:
+ (void) fprintf(output, "rsetcxc ");
+ break;
}
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "\n");
}
if (tabform)
prachars();
@@ -607,10 +652,10 @@ pramodes(int tabform)
void
prachars(void)
{
- if ((cb.c_lflag&ICANON)==0)
- (void) fprintf(output,"min %d, time %d\n", cb.c_cc[VMIN],
+ if ((cb.c_lflag & ICANON) == 0)
+ (void) fprintf(output, "min %d, time %d\n", cb.c_cc[VMIN],
cb.c_cc[VTIME]);
- (void) fprintf(output,"\
+ (void) fprintf(output, "\
erase kill werase rprnt flush lnext susp intr quit stop eof\
\n");
pcol(cb.c_cc[VERASE], 0);
@@ -625,14 +670,14 @@ erase kill werase rprnt flush lnext susp intr quit stop eof\
pcol(cb.c_cc[VSTOP], cb.c_cc[VSTART]);
if (cb.c_lflag&ICANON)
pcol(cb.c_cc[VEOF], cb.c_cc[VEOL]);
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "\n");
if (cb.c_cc[VEOL2] != 0 || cb.c_cc[VSWTCH] != 0) {
- (void) fprintf(output,"\
+ (void) fprintf(output, "\
eol2 swtch\
\n");
pcol(cb.c_cc[VEOL2], 0);
pcol(cb.c_cc[VSWTCH], 0);
- (void) fprintf(output,"\n");
+ (void) fprintf(output, "\n");
}
}
@@ -649,28 +694,28 @@ pcol(int ch1, int ch2)
if (ch1 == 0)
continue;
if (ch1 & 0200 && !isprint(ch1)) {
- (void) fprintf(output,"M-");
+ (void) fprintf(output, "M-");
nout += 2;
ch1 &= ~ 0200;
}
if (ch1 == 0177) {
- (void) fprintf(output,"^");
+ (void) fprintf(output, "^");
nout++;
ch1 = '?';
} else if (ch1 < ' ') {
- (void) fprintf(output,"^");
+ (void) fprintf(output, "^");
nout++;
ch1 += '@';
}
- (void) fprintf(output,"%c", ch1);
+ (void) fprintf(output, "%c", ch1);
nout++;
if (ch2 != 0) {
- (void) fprintf(output,"/");
+ (void) fprintf(output, "/");
nout++;
}
}
while (nout < 7) {
- (void) fprintf(output," ");
+ (void) fprintf(output, " ");
nout++;
}
}
@@ -681,43 +726,44 @@ pit(unsigned char what, char *itsname, char *sep)
{
pitt++;
- (void) fprintf(output,"%s", itsname);
- if ((term & TERMIOS) && what == _POSIX_VDISABLE || !(term & TERMIOS) && what == 0200) {
- (void) fprintf(output," = <undef>%s", sep);
+ (void) fprintf(output, "%s", itsname);
+ if ((term & TERMIOS) && what == _POSIX_VDISABLE ||
+ !(term & TERMIOS) && what == 0200) {
+ (void) fprintf(output, " = <undef>%s", sep);
return;
}
- (void) fprintf(output," = ");
+ (void) fprintf(output, " = ");
if (what & 0200 && !isprint(what)) {
- (void) fprintf(output,"-");
+ (void) fprintf(output, "-");
what &= ~ 0200;
}
if (what == 0177) {
- (void) fprintf(output,"^?%s", sep);
+ (void) fprintf(output, "^?%s", sep);
return;
} else if (what < ' ') {
- (void) fprintf(output,"^");
+ (void) fprintf(output, "^");
what += '`';
}
- (void) fprintf(output,"%c%s", what, sep);
+ (void) fprintf(output, "%c%s", what, sep);
}
void
delay(int m, char *s)
{
- if(m)
- (void) fprintf(output,"%s%d ", s, m);
+ if (m)
+ (void) fprintf(output, "%s%d ", s, m);
}
long speed[] = {
- 0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,
- 57600,76800,115200,153600,230400,307200,460800
+ 0, 50, 75, 110, 134, 150, 200, 300,
+ 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400,
+ 57600, 76800, 115200, 153600, 230400, 307200, 460800, 921600
};
void
prspeed(char *c, int s)
{
-
- (void) fprintf(output,"%s%d baud; ", c, speed[s]);
+ (void) fprintf(output, "%s%d baud; ", c, speed[s]);
}
/*
@@ -732,14 +778,15 @@ prencode(void)
/* Since the -g option is mostly used for redirecting to a file */
/* We must print to stdout here, not stderr */
- (void) printf("%x:%x:%x:%x:",cb.c_iflag,cb.c_oflag,cb.c_cflag,cb.c_lflag);
+ (void) printf("%x:%x:%x:%x:", cb.c_iflag, cb.c_oflag,
+ cb.c_cflag, cb.c_lflag);
- if(term & TERMIOS)
+ if (term & TERMIOS)
/* last control slot is unused */
last = NCCS - 2;
else
last = NCC - 1;
- for(i = 0; i < last; i++)
+ for (i = 0; i < last; i++)
(void) printf("%x:", cb.c_cc[i]);
(void) printf("%x\n", cb.c_cc[last]);
}
diff --git a/usr/src/ucbcmd/stty/sttytable.c b/usr/src/ucbcmd/stty/sttytable.c
index 9f1539123b..1544f42fb8 100644
--- a/usr/src/ucbcmd/stty/sttytable.c
+++ b/usr/src/ucbcmd/stty/sttytable.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,16 +18,15 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 1995 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <stdio.h>
#include <sys/types.h>
@@ -43,7 +41,7 @@ const struct speeds speeds[] = {
"75", B75,
"110", B110,
"134", B134,
- "134.5",B134,
+ "134.5", B134,
"150", B150,
"200", B200,
"300", B300,
@@ -66,6 +64,7 @@ const struct speeds speeds[] = {
"230400", B230400,
"307200", B307200,
"460800", B460800,
+ "921600", B921600,
0,
};
/* Control Modes */
@@ -131,7 +130,7 @@ const struct mds imodes[] = {
"parmrk", PARMRK, 0,
"-parmrk", 0, PARMRK,
"inpck", INPCK, 0,
- "-inpck", 0,INPCK,
+ "-inpck", 0, INPCK,
"istrip", ISTRIP, 0,
"-istrip", 0, ISTRIP,
"inlcr", INLCR, 0,
@@ -255,7 +254,7 @@ const struct mds omodes[] = {
"-nl", ONLCR, (OCRNL|ONLRET),
"nl", 0, ONLCR,
"ocrnl", OCRNL, 0,
- "-ocrnl",0, OCRNL,
+ "-ocrnl", 0, OCRNL,
"onocr", ONOCR, 0,
"-onocr", 0, ONOCR,
"onlret", ONLRET, 0,
@@ -317,18 +316,19 @@ const struct mds hmodes[] = {
};
const struct mds clkmodes[] = {
- "xcibrg", XCIBRG, XMTCLK,
- "xctset", XCTSET, XMTCLK,
- "xcrset", XCRSET, XMTCLK,
- "rcibrg", RCIBRG, RCVCLK,
- "rctset", RCTSET, RCVCLK,
- "rcrset", RCRSET, RCVCLK,
- "tsetcoff", TSETCOFF, TSETCLK,
- "tsetcrc", TSETCRBRG, TSETCLK,
- "tsetcxc", TSETCTBRG, TSETCLK,
- "rsetcoff", RSETCOFF, RSETCLK,
- "rsetcrc", RSETCRBRG, RSETCLK,
- "rsetcxc", RSETCTBRG, RSETCLK,
- "async", XCIBRG|RCIBRG|TSETCOFF|RSETCOFF, XMTCLK|RCVCLK|TSETCLK|RSETCLK,
+ "xcibrg", XCIBRG, XMTCLK,
+ "xctset", XCTSET, XMTCLK,
+ "xcrset", XCRSET, XMTCLK,
+ "rcibrg", RCIBRG, RCVCLK,
+ "rctset", RCTSET, RCVCLK,
+ "rcrset", RCRSET, RCVCLK,
+ "tsetcoff", TSETCOFF, TSETCLK,
+ "tsetcrc", TSETCRBRG, TSETCLK,
+ "tsetcxc", TSETCTBRG, TSETCLK,
+ "rsetcoff", RSETCOFF, RSETCLK,
+ "rsetcrc", RSETCRBRG, RSETCLK,
+ "rsetcxc", RSETCTBRG, RSETCLK,
+ "async",
+ XCIBRG|RCIBRG|TSETCOFF|RSETCOFF, XMTCLK|RCVCLK|TSETCLK|RSETCLK,
0,
};
diff --git a/usr/src/ucbcmd/tset/tset.c b/usr/src/ucbcmd/tset/tset.c
index 8476c4faa1..dcdbcac983 100644
--- a/usr/src/ucbcmd/tset/tset.c
+++ b/usr/src/ucbcmd/tset/tset.c
@@ -1,5 +1,5 @@
/*
- * Copyright 1999 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -13,261 +13,259 @@
* specifies the terms and conditions for redistribution.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
-** TSET -- set terminal modes
-**
-** This program does sophisticated terminal initialization.
-** I recommend that you include it in your .profile or .login
-** file to initialize whatever terminal you are on.
-**
-** There are several features:
-**
-** A special file or sequence (as controlled by the termcap file)
-** is sent to the terminal.
-**
-** Mode bits are set on a per-terminal_type basis (much better
-** than UNIX itself). This allows special delays, automatic
-** tabs, etc.
-**
-** Erase and Kill characters can be set to whatever you want.
-** Default is to change erase to control-H on a terminal which
-** can overstrike, and leave it alone on anything else. Kill
-** is always left alone unless specifically requested. These
-** characters can be represented as "^X" meaning control-X;
-** X is any character.
-**
-** Terminals which are dialups or plugboard types can be aliased
-** to whatever type you may have in your home or office. Thus,
-** if you know that when you dial up you will always be on a
-** TI 733, you can specify that fact to tset. You can represent
-** a type as "?type". This will ask you what type you want it
-** to be -- if you reply with just a newline, it will default
-** to the type given.
-**
-** The current terminal type can be queried.
-**
-** Usage:
-** tset [-] [-EC] [-eC] [-kC] [-iC] [-s] [-h] [-u] [-r]
-** [-m [ident] [test baudrate] :type]
-** [-Q] [-I] [-S] [type]
-**
-** In systems with environments, use:
-** eval `tset -s ...`
-** Actually, this doesn't work in old csh's.
-** Instead, use:
-** tset -s ... > tset.tmp
-** source tset.tmp
-** rm tset.tmp
-** or:
-** set noglob
-** set term=(`tset -S ....`)
-** setenv TERM $term[1]
-** setenv TERMCAP "$term[2]"
-** unset term
-** unset noglob
-**
-** Positional Parameters:
-** type -- the terminal type to force. If this is
-** specified, initialization is for this
-** terminal type.
-**
-** Flags:
-** - -- report terminal type. Whatever type is
-** decided on is reported. If no other flags
-** are stated, the only affect is to write
-** the terminal type on the standard output.
-** -r -- report to user in addition to other flags.
-** -EC -- set the erase character to C on all terminals
-** except those which cannot backspace (e.g.,
-** a TTY 33). C defaults to control-H.
-** -eC -- set the erase character to C on all terminals.
-** C defaults to control-H. If not specified,
-** the erase character is untouched; however, if
-** not specified and the erase character is NULL
-** (zero byte), the erase character is set to CERASE.
-** -kC -- set the kill character to C on all terminals.
-** Default for C is control-U. If not specified,
-** the kill character is untouched; however, if
-** not specified and the kill character is NULL
-** (zero byte), the kill character is set to CKILL.
-** -iC -- set the interrupt character to C on all terminals.
-** Default for C is control-C. If not specified, the
-** interrupt character is untouched; however, if
-** not specified and the interrupt character is NULL
-** (zero byte), the interrupt character is set to
-** control-C.
-** -qC -- reserved for setable quit character.
-** -m -- map the system identified type to some user
-** specified type. The mapping can be baud rate
-** dependent. This replaces the old -d, -p flags.
-** (-d type -> -m dialup:type)
-** (-p type -> -m plug:type)
-** Syntax: -m identifier [test baudrate] :type
-** where: ``identifier'' is terminal type found in
-** /etc/ttys for this port, (abscence of an identifier
-** matches any identifier); ``test'' may be any combination
-** of > = < ! @; ``baudrate'' is as with stty(1);
-** ``type'' is the actual terminal type to use if the
-** mapping condition is met. Multiple maps are scanned
-** in order and the first match prevails.
-** -n -- If the new tty driver from UCB is available, this flag
-** will activate the new options for erase and kill
-** processing. This will be different for printers
-** and crt's. For crts, if the baud rate is < 1200 then
-** erase and kill don't remove characters from the screen.
-** -h -- don't read htmp file. Normally the terminal type
-** is determined by reading the htmp file or the
-** environment (unless some mapping is specified).
-** This forces a read of the ttytype file -- useful
-** when htmp is somehow wrong. (V6 only)
-** -u -- don't update htmp. It seemed like this should
-** be put in. Note that htmp is never actually
-** written if there are no changes, so don't bother
-** bother using this for efficiency reasons alone.
-** -s -- output setenv commands for TERM. This can be
-** used with
-** `tset -s ...`
-** and is to be prefered to:
-** setenv TERM `tset - ...`
-** because -s sets the TERMCAP variable also.
-** -S -- Similar to -s but outputs 2 strings suitable for
-** use in csh .login files as follows:
-** set noglob
-** set term=(`tset -S .....`)
-** setenv TERM $term[1]
-** setenv TERMCAP "$term[2]"
-** unset term
-** unset noglob
-** -Q -- be quiet. don't output 'Erase set to' etc.
-** -I -- don't do terminal initialization (is & if
-** strings).
-** -v -- On virtual terminal systems, don't set up a
-** virtual terminal. Otherwise tset will tell
-** the operating system what kind of terminal you
-** are on (if it is a known terminal) and fix up
-** the output of -s to use virtual terminal sequences.
-**
-** Files:
-** /etc/ttys
-** contains a terminal id -> terminal type
-** mapping; used when any user mapping is specified,
-** or the environment doesn't have TERM set.
-** /etc/termcap
-** a terminal_type -> terminal_capabilities
-** mapping.
-**
-** Return Codes:
-** -1 -- couldn't open termcap.
-** 1 -- bad terminal type, or standard output not tty.
-** 0 -- ok.
-**
-** Defined Constants:
-** DIALUP -- the type code for a dialup port.
-** PLUGBOARD -- the type code for a plugboard port.
-** ARPANET -- the type code for an arpanet port.
-** BACKSPACE -- control-H, the default for -e.
-** CNTL('U') -- control-U, the default for -k.
-** OLDERASE -- the ancient default erase character.
-** FILEDES -- the file descriptor to do the operation
-** on, nominally 1 or 2.
-** STDOUT -- the standard output file descriptor.
-** UIDMASK -- the bit pattern to mask with the getuid()
-** call to get just the user id.
-** GTTYN -- defines file containing generalized ttynames
-** and compiles code to look there.
-**
-** Requires:
-** Routines to handle htmp, ttys, and termcap.
-**
-** Compilation Flags:
-** OLDFLAGS -- must be defined to compile code for any of
-** the -d, -p, or -a flags.
-** OLDDIALUP -- accept the -d flag.
-** OLDPLUGBOARD -- accept the -p flag.
-** OLDARPANET -- accept the -a flag.
-** V6 -- if clear, use environments, not htmp.
-** also use TIOCSETN rather than stty to avoid flushing
-** GTTYN -- if set, compiles code to look at /etc/ttys.
-**
-** Trace Flags:
-** none
-**
-** Diagnostics:
-** Bad flag
-** An incorrect option was specified.
-** Too few args
-** more command line arguments are required.
-** Unexpected arg
-** wrong type of argument was encountered.
-** Cannot open ...
-** The specified file could not be openned.
-** Type ... unknown
-** An unknown terminal type was specified.
-** Cannot update htmp
-** Cannot update htmp file when the standard
-** output is not a terminal.
-** Erase set to ...
-** Telling that the erase character has been
-** set to the specified character.
-** Kill set to ...
-** Ditto for kill
-** Erase is ... Kill is ...
-** Tells that the erase/kill characters were
-** wierd before, but they are being left as-is.
-** Not a terminal
-** Set if FILEDES is not a terminal.
-**
-** Compilation Instructions:
-** cc -n -O tset.c -ltermlib
-** mv a.out tset
-** chown bin tset
-** chmod 4755 tset
-**
-** where 'bin' should be whoever owns the 'htmp' file.
-** If 'htmp' is 666, then tset need not be setuid.
-**
-** For version 6 the compile command should be:
-** cc -n -O -I/usr/include/retrofit tset.c -ltermlib -lretro -lS
-**
-**
-** History:
-** 1/81 -- Added alias checking for mapping identifiers.
-** 7/80 -- '-S' added. '-m' mapping added. TERMCAP string
-** cleaned up.
-** 3/80 -- Changed to use tputs. Prc & flush added.
-** 10/79 -- '-s' option extended to handle TERMCAP
-** variable, set noglob, quote the entry,
-** and know about the Bourne shell. Terminal
-** initialization moved to before any information
-** output so screen clears would not screw you.
-** '-Q' option added.
-** 8/79 -- '-' option alone changed to only output
-** type. '-s' option added. 'VERSION7'
-** changed to 'V6' for compatibility.
-** 12/78 -- modified for eventual migration to VAX/UNIX,
-** so the '-' option is changed to output only
-** the terminal type to STDOUT instead of
-** FILEDES.
-** 9/78 -- '-' and '-p' options added (now fully
-** compatible with ttytype!), and spaces are
-** permitted between the -d and the type.
-** 8/78 -- The sense of -h and -u were reversed, and the
-** -f flag is dropped -- same effect is available
-** by just stating the terminal type.
-** 10/77 -- Written.
-*/
-
-
-#define index strchr
-#define rindex strrchr
-#define curerase modes.c_cc[VERASE]
-#define curkill modes.c_cc[VKILL]
-#define curintr modes.c_cc[VINTR]
-#define olderase oldmodes.c_cc[VERASE]
-#define oldkill oldmodes.c_cc[VKILL]
-#define oldintr oldmodes.c_cc[VINTR]
+ * TSET -- set terminal modes
+ *
+ * This program does sophisticated terminal initialization.
+ * I recommend that you include it in your .profile or .login
+ * file to initialize whatever terminal you are on.
+ *
+ * There are several features:
+ *
+ * A special file or sequence (as controlled by the termcap file)
+ * is sent to the terminal.
+ *
+ * Mode bits are set on a per-terminal_type basis (much better
+ * than UNIX itself). This allows special delays, automatic
+ * tabs, etc.
+ *
+ * Erase and Kill characters can be set to whatever you want.
+ * Default is to change erase to control-H on a terminal which
+ * can overstrike, and leave it alone on anything else. Kill
+ * is always left alone unless specifically requested. These
+ * characters can be represented as "^X" meaning control-X;
+ * X is any character.
+ *
+ * Terminals which are dialups or plugboard types can be aliased
+ * to whatever type you may have in your home or office. Thus,
+ * if you know that when you dial up you will always be on a
+ * TI 733, you can specify that fact to tset. You can represent
+ * a type as "?type". This will ask you what type you want it
+ * to be -- if you reply with just a newline, it will default
+ * to the type given.
+ *
+ * The current terminal type can be queried.
+ *
+ * Usage:
+ * tset [-] [-EC] [-eC] [-kC] [-iC] [-s] [-h] [-u] [-r]
+ * [-m [ident] [test baudrate] :type]
+ * [-Q] [-I] [-S] [type]
+ *
+ * In systems with environments, use:
+ * eval `tset -s ...`
+ * Actually, this doesn't work in old csh's.
+ * Instead, use:
+ * tset -s ... > tset.tmp
+ * source tset.tmp
+ * rm tset.tmp
+ * or:
+ * set noglob
+ * set term=(`tset -S ....`)
+ * setenv TERM $term[1]
+ * setenv TERMCAP "$term[2]"
+ * unset term
+ * unset noglob
+ *
+ * Positional Parameters:
+ * type -- the terminal type to force. If this is
+ * specified, initialization is for this
+ * terminal type.
+ *
+ * Flags:
+ * - -- report terminal type. Whatever type is
+ * decided on is reported. If no other flags
+ * are stated, the only affect is to write
+ * the terminal type on the standard output.
+ * -r -- report to user in addition to other flags.
+ * -EC -- set the erase character to C on all terminals
+ * except those which cannot backspace (e.g.,
+ * a TTY 33). C defaults to control-H.
+ * -eC -- set the erase character to C on all terminals.
+ * C defaults to control-H. If not specified,
+ * the erase character is untouched; however, if
+ * not specified and the erase character is NULL
+ * (zero byte), the erase character is set to CERASE.
+ * -kC -- set the kill character to C on all terminals.
+ * Default for C is control-U. If not specified,
+ * the kill character is untouched; however, if
+ * not specified and the kill character is NULL
+ * (zero byte), the kill character is set to CKILL.
+ * -iC -- set the interrupt character to C on all terminals.
+ * Default for C is control-C. If not specified, the
+ * interrupt character is untouched; however, if
+ * not specified and the interrupt character is NULL
+ * (zero byte), the interrupt character is set to
+ * control-C.
+ * -qC -- reserved for setable quit character.
+ * -m -- map the system identified type to some user
+ * specified type. The mapping can be baud rate
+ * dependent. This replaces the old -d, -p flags.
+ * (-d type -> -m dialup:type)
+ * (-p type -> -m plug:type)
+ * Syntax: -m identifier [test baudrate] :type
+ * where: ``identifier'' is terminal type found in
+ * /etc/ttys for this port, (abscence of an identifier
+ * matches any identifier); ``test'' may be any combination
+ * of > = < ! @; ``baudrate'' is as with stty(1);
+ * ``type'' is the actual terminal type to use if the
+ * mapping condition is met. Multiple maps are scanned
+ * in order and the first match prevails.
+ * -n -- If the new tty driver from UCB is available, this flag
+ * will activate the new options for erase and kill
+ * processing. This will be different for printers
+ * and crt's. For crts, if the baud rate is < 1200 then
+ * erase and kill don't remove characters from the screen.
+ * -h -- don't read htmp file. Normally the terminal type
+ * is determined by reading the htmp file or the
+ * environment (unless some mapping is specified).
+ * This forces a read of the ttytype file -- useful
+ * when htmp is somehow wrong. (V6 only)
+ * -u -- don't update htmp. It seemed like this should
+ * be put in. Note that htmp is never actually
+ * written if there are no changes, so don't bother
+ * bother using this for efficiency reasons alone.
+ * -s -- output setenv commands for TERM. This can be
+ * used with
+ * `tset -s ...`
+ * and is to be prefered to:
+ * setenv TERM `tset - ...`
+ * because -s sets the TERMCAP variable also.
+ * -S -- Similar to -s but outputs 2 strings suitable for
+ * use in csh .login files as follows:
+ * set noglob
+ * set term=(`tset -S .....`)
+ * setenv TERM $term[1]
+ * setenv TERMCAP "$term[2]"
+ * unset term
+ * unset noglob
+ * -Q -- be quiet. don't output 'Erase set to' etc.
+ * -I -- don't do terminal initialization (is & if
+ * strings).
+ * -v -- On virtual terminal systems, don't set up a
+ * virtual terminal. Otherwise tset will tell
+ * the operating system what kind of terminal you
+ * are on (if it is a known terminal) and fix up
+ * the output of -s to use virtual terminal sequences.
+ *
+ * Files:
+ * /etc/ttys
+ * contains a terminal id -> terminal type
+ * mapping; used when any user mapping is specified,
+ * or the environment doesn't have TERM set.
+ * /etc/termcap
+ * a terminal_type -> terminal_capabilities
+ * mapping.
+ *
+ * Return Codes:
+ * -1 -- couldn't open termcap.
+ * 1 -- bad terminal type, or standard output not tty.
+ * 0 -- ok.
+ *
+ * Defined Constants:
+ * DIALUP -- the type code for a dialup port.
+ * PLUGBOARD -- the type code for a plugboard port.
+ * ARPANET -- the type code for an arpanet port.
+ * BACKSPACE -- control-H, the default for -e.
+ * CNTL('U') -- control-U, the default for -k.
+ * OLDERASE -- the ancient default erase character.
+ * FILEDES -- the file descriptor to do the operation
+ * on, nominally 1 or 2.
+ * STDOUT -- the standard output file descriptor.
+ * UIDMASK -- the bit pattern to mask with the getuid()
+ * call to get just the user id.
+ * GTTYN -- defines file containing generalized ttynames
+ * and compiles code to look there.
+ *
+ * Requires:
+ * Routines to handle htmp, ttys, and termcap.
+ *
+ * Compilation Flags:
+ * OLDFLAGS -- must be defined to compile code for any of
+ * the -d, -p, or -a flags.
+ * OLDDIALUP -- accept the -d flag.
+ * OLDPLUGBOARD -- accept the -p flag.
+ * OLDARPANET -- accept the -a flag.
+ * V6 -- if clear, use environments, not htmp.
+ * also use TIOCSETN rather than stty to avoid flushing
+ * GTTYN -- if set, compiles code to look at /etc/ttys.
+ *
+ * Trace Flags:
+ * none
+ *
+ * Diagnostics:
+ * Bad flag
+ * An incorrect option was specified.
+ * Too few args
+ * more command line arguments are required.
+ * Unexpected arg
+ * wrong type of argument was encountered.
+ * Cannot open ...
+ * The specified file could not be openned.
+ * Type ... unknown
+ * An unknown terminal type was specified.
+ * Cannot update htmp
+ * Cannot update htmp file when the standard
+ * output is not a terminal.
+ * Erase set to ...
+ * Telling that the erase character has been
+ * set to the specified character.
+ * Kill set to ...
+ * Ditto for kill
+ * Erase is ... Kill is ...
+ * Tells that the erase/kill characters were
+ * wierd before, but they are being left as-is.
+ * Not a terminal
+ * Set if FILEDES is not a terminal.
+ *
+ * Compilation Instructions:
+ * cc -n -O tset.c -ltermlib
+ * mv a.out tset
+ * chown bin tset
+ * chmod 4755 tset
+ *
+ * where 'bin' should be whoever owns the 'htmp' file.
+ * If 'htmp' is 666, then tset need not be setuid.
+ *
+ * For version 6 the compile command should be:
+ * cc -n -O -I/usr/include/retrofit tset.c -ltermlib -lretro -lS
+ *
+ *
+ * History:
+ * 1/81 -- Added alias checking for mapping identifiers.
+ * 7/80 -- '-S' added. '-m' mapping added. TERMCAP string
+ * cleaned up.
+ * 3/80 -- Changed to use tputs. Prc & flush added.
+ * 10/79 -- '-s' option extended to handle TERMCAP
+ * variable, set noglob, quote the entry,
+ * and know about the Bourne shell. Terminal
+ * initialization moved to before any information
+ * output so screen clears would not screw you.
+ * '-Q' option added.
+ * 8/79 -- '-' option alone changed to only output
+ * type. '-s' option added. 'VERSION7'
+ * changed to 'V6' for compatibility.
+ * 12/78 -- modified for eventual migration to VAX/UNIX,
+ * so the '-' option is changed to output only
+ * the terminal type to STDOUT instead of
+ * FILEDES.
+ * 9/78 -- '-' and '-p' options added (now fully
+ * compatible with ttytype!), and spaces are
+ * permitted between the -d and the type.
+ * 8/78 -- The sense of -h and -u were reversed, and the
+ * -f flag is dropped -- same effect is available
+ * by just stating the terminal type.
+ * 10/77 -- Written.
+ */
+
+
+#define index strchr
+#define rindex strrchr
+#define curerase modes.c_cc[VERASE]
+#define curkill modes.c_cc[VKILL]
+#define curintr modes.c_cc[VINTR]
+#define olderase oldmodes.c_cc[VERASE]
+#define oldkill oldmodes.c_cc[VKILL]
+#define oldintr oldmodes.c_cc[VINTR]
#include <stdio.h>
#include <termio.h>
@@ -313,17 +311,14 @@
#define UIDMASK -1
-#define USAGE "usage: tset [-] [-rsIQS] [-eC] [-kC] [-iC] [-m [ident][test speed]:type] [type]\n"
+#define USAGE "usage: tset [-] [-rsIQS] [-eC] [-kC] " \
+ "[-iC] [-m [ident][test speed]:type] [type]\n"
#define OLDFLAGS
#define DIALUP "dialup"
#define OLDDIALUP "sd"
#define PLUGBOARD "plugboard"
#define OLDPLUGBOARD "sp"
-/*
-#define ARPANET "arpanet"
-#define OLDARPANET "sa"
-*/
#define DEFTYPE "unknown"
@@ -366,7 +361,7 @@ struct
"75", B75, 75,
"110", B110, 110,
"134", B134, 134,
- "134.5",B134, 134,
+ "134.5", B134, 134,
"150", B150, 150,
"200", B200, 200,
"300", B300, 300,
@@ -376,23 +371,24 @@ struct
"2400", B2400, 2400,
"4800", B4800, 4800,
"9600", B9600, 9600,
- "19200",EXTA, 19200,
+ "19200", EXTA, 19200,
"exta", EXTA, 19200,
"extb", EXTB, 38400,
- "57600",B57600, 57600,
- "76800",B76800, 76800,
- "115200",B115200,115200,
- "153600",B153600,153600,
- "230400",B230400,230400,
- "307200",B307200,307200,
- "460800",B460800,460800,
+ "57600", B57600, 57600,
+ "76800", B76800, 76800,
+ "115200", B115200, 115200,
+ "153600", B153600, 153600,
+ "230400", B230400, 230400,
+ "307200", B307200, 307200,
+ "460800", B460800, 460800,
+ "921600", B921600, 921600,
0,
};
signed char Erase_char; /* new erase character */
char Kill_char; /* new kill character */
char Intr_char; /* new interrupt character */
-char Specialerase; /* set => Erase_char only on terminals with backspace */
+char Specialerase; /* set => Erase_char only on terminals with backspace */
char Ttyid = NOTTY; /* terminal identifier */
char *TtyType; /* type of terminal */
@@ -413,7 +409,7 @@ int Ask; /* ask user for termtype */
int DoVirtTerm = YES; /* Set up a virtual terminal */
int PadBaud; /* Min rate of padding needed */
-#define CAPBUFSIZ 1024
+#define CAPBUFSIZ 1024
char Capbuf[CAPBUFSIZ]; /* line from /etc/termcap for this TtyType */
char *Ttycap; /* termcap line from termcap or environ */
@@ -446,7 +442,7 @@ void cat(char *);
void bmove(char *, char *, int);
void makealias(char *);
void wrtermcap(char *);
-void fatal (char *, char *);
+void fatal(char *, char *);
char reset(); /* Routine for checking&resetting chars */
int
@@ -474,20 +470,19 @@ main(int argc, char *argv[])
extern short ospeed;
if ((istermios = ioctl(FILEDES, TCGETS, (char *)&modes)) < 0) {
- if (ioctl(FILEDES, TCGETA, (char *)&mode) < 0)
- {
+ if (ioctl(FILEDES, TCGETA, (char *)&mode) < 0) {
prs("Not a terminal\n");
exit(1);
}
- bmove((char *)&mode, (char *)&oldmode, sizeof mode);
+ bmove((char *)&mode, (char *)&oldmode, sizeof (mode));
modes.c_lflag = oldmodes.c_lflag = mode.c_lflag;
modes.c_oflag = oldmodes.c_oflag = mode.c_oflag;
modes.c_iflag = oldmodes.c_iflag = mode.c_iflag;
modes.c_cflag = oldmodes.c_cflag = mode.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
modes.c_cc[i] = oldmodes.c_cc[i] = mode.c_cc[i];
} else
- bmove((char *)&modes, (char *)&oldmodes, sizeof modes);
+ bmove((char *)&modes, (char *)&oldmodes, sizeof (modes));
ospeed = cfgetospeed(&modes);
(void) signal(SIGINT, setmode);
(void) signal(SIGQUIT, setmode);
@@ -497,8 +492,7 @@ main(int argc, char *argv[])
command++;
else
command = argv[0];
- if (sequal(command, "reset") )
- {
+ if (sequal(command, "reset")) {
/*
* Reset the teletype mode bits to a sensible state.
* Copied from the program by Kurt Shoens & Mark Horton.
@@ -510,7 +504,7 @@ main(int argc, char *argv[])
modes.c_oflag = mode.c_oflag;
modes.c_iflag = mode.c_iflag;
modes.c_cflag = mode.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
modes.c_cc[i] = mode.c_cc[i];
}
curerase = reset(curerase, CERASE);
@@ -523,17 +517,17 @@ main(int argc, char *argv[])
modes.c_iflag &= ~(IGNBRK|PARMRK|INPCK|INLCR|IGNCR|IUCLC|IXOFF);
modes.c_oflag |= (OPOST|ONLCR);
modes.c_oflag &= ~(OLCUC|OCRNL|ONOCR|ONLRET|OFILL|OFDEL|
- NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
+ NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
modes.c_cflag |= (CS7|CREAD);
modes.c_cflag &= ~(PARODD|CLOCAL);
modes.c_lflag |= (ISIG|ICANON|ECHO|ECHOK);
modes.c_lflag &= ~(XCASE|ECHONL|NOFLSH);
- if (istermios < 0) {
+ if (istermios < 0) {
mode.c_lflag = modes.c_lflag;
mode.c_oflag = modes.c_oflag;
mode.c_iflag = modes.c_iflag;
mode.c_cflag = modes.c_cflag;
- for(i = 0; i < NCC; i++)
+ for (i = 0; i < NCC; i++)
mode.c_cc[i] = modes.c_cc[i];
(void) ioctl(FILEDES, TCSETAW, (char *)&mode);
} else
@@ -541,38 +535,35 @@ main(int argc, char *argv[])
Dash_u = YES;
BeQuiet = YES;
IsReset = YES;
- }
- else if (argc == 2 && sequal(argv[1], "-"))
- {
+ } else if (argc == 2 && sequal(argv[1], "-")) {
RepOnly = YES;
Dash_u = YES;
}
argc--;
/* scan argument list and collect flags */
- while (--argc >= 0)
- {
+ while (--argc >= 0) {
p = *++argv;
- if (*p == '-')
- {
+ if (*p == '-') {
if (*++p == NULL)
Report = YES; /* report current terminal type */
- else while (*p) switch (*p++)
- {
+ else
+ while (*p)
+ switch (*p++) {
- case 'r': /* report to user */
+ case 'r': /* report to user */
Ureport = YES;
continue;
- case 'E': /* special erase: operate on all but TTY33 */
+ case 'E':
+ /* special erase: operate on all but TTY33 */
Specialerase = YES;
/* explicit fall-through to -e case */
- case 'e': /* erase character */
+ case 'e': /* erase character */
if (*p == NULL)
Erase_char = -1;
- else
- {
+ else {
if (*p == '^' && p[1] != NULL)
if (*++p == '?')
Erase_char = '\177';
@@ -584,11 +575,10 @@ main(int argc, char *argv[])
}
continue;
- case 'i': /* interrupt character */
+ case 'i': /* interrupt character */
if (*p == NULL)
Intr_char = CNTL('C');
- else
- {
+ else {
if (*p == '^' && p[1] != NULL)
if (*++p == '?')
Intr_char = '\177';
@@ -600,11 +590,10 @@ main(int argc, char *argv[])
}
continue;
- case 'k': /* kill character */
+ case 'k': /* kill character */
if (*p == NULL)
Kill_char = CNTL('U');
- else
- {
+ else {
if (*p == '^' && p[1] != NULL)
if (*++p == '?')
Kill_char = '\177';
@@ -616,29 +605,28 @@ main(int argc, char *argv[])
}
continue;
-# ifdef OLDFLAGS
-# ifdef OLDDIALUP
- case 'd': /* dialup type */
+#ifdef OLDFLAGS
+#ifdef OLDDIALUP
+ case 'd': /* dialup type */
NewType = DIALUP;
goto mapold;
-# endif
+#endif
-# ifdef OLDPLUGBOARD
- case 'p': /* plugboard type */
+#ifdef OLDPLUGBOARD
+ case 'p': /* plugboard type */
NewType = PLUGBOARD;
goto mapold;
-# endif
+#endif
-# ifdef OLDARPANET
- case 'a': /* arpanet type */
+#ifdef OLDARPANET
+ case 'a': /* arpanet type */
Newtype = ARPANET;
goto mapold;
-# endif
+#endif
mapold: Map->Ident = NewType;
Map->Test = ALL;
- if (*p == NULL)
- {
+ if (*p == NULL) {
p = nextarg(argc--, argv++);
}
Map->Type = p;
@@ -646,20 +634,19 @@ mapold: Map->Ident = NewType;
Mapped = YES;
p = "";
continue;
-# endif
-
- case 'm': /* map identifier to type */
- /* This code is very loose. Almost no
- ** syntax checking is done!! However,
- ** illegal syntax will only produce
- ** weird results.
- */
- if (*p == NULL)
- {
+#endif
+
+ case 'm': /* map identifier to type */
+ /*
+ * This code is very loose. Almost no
+ * syntax checking is done!! However,
+ * illegal syntax will only produce
+ * weird results.
+ */
+ if (*p == NULL) {
p = nextarg(argc--, argv++);
}
- if (isalnum(*p))
- {
+ if (isalnum(*p)) {
Map->Ident = p; /* identifier */
while (isalnum(*p)) p++;
}
@@ -667,8 +654,8 @@ mapold: Map->Ident = NewType;
Map->Ident = "";
Break = NO;
Not = NO;
- while (!Break) switch (*p)
- {
+ while (!Break)
+ switch (*p) {
case NULL:
p = nextarg(argc--, argv++);
continue;
@@ -693,7 +680,7 @@ mapold: Map->Ident = NewType;
Map->Test |= EQ;
*p++ = NULL;
continue;
-
+
case '!': /* invert conditions */
Not = ~Not;
*p++ = NULL;
@@ -703,22 +690,20 @@ mapold: Map->Ident = NewType;
p++;
/* intentional fallthru */
default:
- if (isdigit(*p) || *p == 'e')
- {
- Map->Speed = baudrate(p);
- while (isalnum(*p) || *p == '.')
+ if (isdigit(*p) || *p == 'e') {
+ Map->Speed =
+ baudrate(p);
+ while (isalnum(*p) ||
+ *p == '.')
p++;
- }
- else
+ } else
Break = YES;
continue;
}
- if (Not) /* invert sense of test */
- {
+ if (Not) { /* invert sense of test */
Map->Test = (~(Map->Test))&ALL;
}
- if (*p == NULL)
- {
+ if (*p == NULL) {
p = nextarg(argc--, argv++);
}
Map->Type = p;
@@ -727,61 +712,56 @@ mapold: Map->Ident = NewType;
Mapped = YES;
continue;
- case 'h': /* don't get type from htmp or env */
+ case 'h': /* don't get type from htmp or env */
Dash_h = YES;
continue;
- case 'u': /* don't update htmp */
+ case 'u': /* don't update htmp */
Dash_u = YES;
continue;
- case 's': /* output setenv commands */
+ case 's': /* output setenv commands */
DoSetenv = YES;
CmndLine = YES;
continue;
- case 'S': /* output setenv strings */
+ case 'S': /* output setenv strings */
DoSetenv = YES;
CmndLine = NO;
continue;
- case 'Q': /* be quiet */
+ case 'Q': /* be quiet */
BeQuiet = YES;
continue;
- case 'I': /* no initialization */
+ case 'I': /* no initialization */
NoInit = YES;
continue;
- case 'A': /* Ask user */
+ case 'A': /* Ask user */
Ask = YES;
continue;
-
- case 'v': /* no virtual terminal */
+
+ case 'v': /* no virtual terminal */
DoVirtTerm = NO;
continue;
- default:
+ default:
*p-- = NULL;
fatal("Bad flag -", p);
}
- }
- else
- {
+ } else {
/* terminal type */
DefType = p;
}
}
- if (DefType)
- {
- if (Mapped)
- {
+ if (DefType) {
+ if (Mapped) {
Map->Ident = ""; /* means "map any type" */
Map->Test = ALL; /* at all baud rates */
Map->Type = DefType; /* to the default type */
- }
- else
+ } else
TtyType = DefType;
}
@@ -802,14 +782,12 @@ mapold: Map->Ident = NewType;
Ttyid = ttyname(FILEDES);
/* If still undefined, use DEFTYPE */
- if (TtyType == 0)
- {
+ if (TtyType == 0) {
TtyType = DEFTYPE;
}
/* check for dialup or other mapping */
- if (Mapped)
- {
+ if (Mapped) {
if (!(Alias[0] && isalias(TtyType)))
if (tgetent(Capbuf, TtyType) > 0)
makealias(Capbuf);
@@ -818,15 +796,13 @@ mapold: Map->Ident = NewType;
/* TtyType now contains a pointer to the type of the terminal */
/* If the first character is '?', ask the user */
- if (TtyType[0] == '?')
- {
+ if (TtyType[0] == '?') {
Ask = YES;
TtyType++;
if (TtyType[0] == '\0')
TtyType = DEFTYPE;
}
- if (Ask)
- {
+ if (Ask) {
ask:
prs("TERM = (");
prs(TtyType);
@@ -834,9 +810,8 @@ ask:
flush();
/* read the terminal. If not empty, set type */
- i = read(2, termbuf, sizeof termbuf - 1);
- if (i > 0)
- {
+ i = read(2, termbuf, sizeof (termbuf) - 1);
+ if (i > 0) {
if (termbuf[i - 1] == '\n')
i--;
termbuf[i] = '\0';
@@ -847,32 +822,28 @@ ask:
/* get terminal capabilities */
if (!(Alias[0] && isalias(TtyType))) {
- switch (tgetent(Capbuf, TtyType))
- {
- case -1:
+ switch (tgetent(Capbuf, TtyType)) {
+ case -1:
prs("Cannot find termcap\n");
flush();
exit(-1);
- case 0:
+ case 0:
prs("Type ");
prs(TtyType);
prs(" unknown\n");
flush();
- if (DoSetenv)
- {
+ if (DoSetenv) {
TtyType = DEFTYPE;
Alias[0] = '\0';
goto ask;
- }
- else
+ } else
exit(1);
}
}
Ttycap = Capbuf;
- if (!RepOnly)
- {
+ if (!RepOnly) {
/* determine erase and kill characters */
if (Specialerase && !tgetflag("bs"))
Erase_char = 0;
@@ -892,8 +863,8 @@ ask:
* system set it there. People who want backspace have
* to say tset -e.
*/
- if (Erase_char == 0 && !tgetflag("os") && curerase == OLDERASE)
- {
+ if (Erase_char == 0 && !tgetflag("os") &&
+ curerase == OLDERASE) {
if (tgetflag("bs") || bs_char != 0)
Erase_char = -1;
}
@@ -917,7 +888,7 @@ ask:
/* set modes */
PadBaud = tgetnum("pb"); /* OK if fails */
- for (i=0; speeds[i].string; i++)
+ for (i = 0; speeds[i].string; i++)
if (speeds[i].baudrate == PadBaud) {
PadBaud = speeds[i].speed;
break;
@@ -933,8 +904,7 @@ ask:
modes.c_iflag |= IUCLC;
modes.c_oflag |= OLCUC;
modes.c_cflag |= XCASE;
- }
- else if (tgetflag("LC")) {
+ } else if (tgetflag("LC")) {
modes.c_iflag &= ~IUCLC;
modes.c_oflag &= ~OLCUC;
modes.c_cflag &= ~XCASE;
@@ -964,10 +934,9 @@ ask:
modes.c_lflag &= ~ECHO;
if (tgetflag("pt")) /* print tabs */
modes.c_oflag &= ~TAB3;
-
+
modes.c_lflag |= (ECHOE|ECHOK);
- if (tgetflag("hc"))
- { /** set printer modes **/
+ if (tgetflag("hc")) { /* set printer modes */
modes.c_lflag &= ~ECHOE;
}
@@ -977,10 +946,8 @@ ask:
PC = buf[0];
/* output startup string */
- if (!NoInit)
- {
- if (oldmodes.c_oflag&(TAB3|ONLCR|OCRNL|ONLRET))
- {
+ if (!NoInit) {
+ if (oldmodes.c_oflag&(TAB3|ONLCR|OCRNL|ONLRET)) {
oldmodes.c_oflag &= (TAB3|ONLCR|OCRNL|ONLRET);
setmode(-1);
}
@@ -989,22 +956,19 @@ ask:
flush();
}
bufp = buf;
- if (IsReset && tgetstr("rs", &bufp) != 0 ||
- tgetstr("is", &bufp) != 0)
- {
+ if (IsReset && tgetstr("rs", &bufp) != 0 ||
+ tgetstr("is", &bufp) != 0) {
tputs(buf, 0, prc);
settle = YES;
flush();
}
bufp = buf;
if (IsReset && tgetstr("rf", &bufp) != 0 ||
- tgetstr("if", &bufp) != 0)
- {
+ tgetstr("if", &bufp) != 0) {
cat(buf);
settle = YES;
}
- if (settle)
- {
+ if (settle) {
prc('\r');
if (IsReset)
prc('\n'); /* newline too */
@@ -1019,80 +983,69 @@ ask:
/* (this code is rather heuristic, checking for $SHELL */
/* ending in the 3 characters "csh") */
csh = NO;
- if (DoSetenv)
- {
+ if (DoSetenv) {
char *sh;
- if ((sh = getenv("SHELL")) && (i = strlen(sh)) >= 3)
- {
- if ((csh = sequal(&sh[i-3], "csh")) && CmndLine)
- (void) write(STDOUT, "set noglob;\n", 12);
+ if ((sh = getenv("SHELL")) && (i = strlen(sh)) >= 3) {
+ if ((csh = sequal(&sh[i-3], "csh")) && CmndLine)
+ (void) write(STDOUT,
+ "set noglob;\n", 12);
+ }
+ if (!csh) { /* running Bourne shell */
+ (void) write(STDOUT,
+ "export TERMCAP TERM;\n", 21);
}
- if (!csh)
- /* running Bourne shell */
- (void) write(STDOUT, "export TERMCAP TERM;\n", 21);
}
}
/* report type if appropriate */
- if (DoSetenv || Report || Ureport)
- {
+ if (DoSetenv || Report || Ureport) {
/* if type is the short name, find first alias (if any) */
makealias(Ttycap);
if (sequal(TtyType, Alias[0]) && Alias[1]) {
TtyType = Alias[1];
}
- if (DoSetenv)
- {
- if (csh)
- {
+ if (DoSetenv) {
+ if (csh) {
if (CmndLine)
- (void) write(STDOUT, "setenv TERM ", 12);
+ (void) write(STDOUT,
+ "setenv TERM ", 12);
(void) write(STDOUT, TtyType, strlen(TtyType));
(void) write(STDOUT, " ", 1);
if (CmndLine)
- (void) write(STDOUT, ";\n", 2);
- }
- else
- {
+ (void) write(STDOUT, ";\n", 2);
+ } else {
(void) write(STDOUT, "TERM=", 5);
(void) write(STDOUT, TtyType, strlen(TtyType));
(void) write(STDOUT, ";\n", 2);
}
- }
- else if (Report)
- {
+ } else if (Report) {
(void) write(STDOUT, TtyType, strlen(TtyType));
(void) write(STDOUT, "\n", 1);
}
- if (Ureport)
- {
+ if (Ureport) {
prs("Terminal type is ");
prs(TtyType);
prs("\n");
flush();
}
- if (DoSetenv)
- {
- if (csh)
- {
- if (CmndLine)
- (void) write(STDOUT, "setenv TERMCAP '", 16);
- }
- else
- (void) write(STDOUT, "TERMCAP='", 9);
- wrtermcap(Ttycap);
- if (csh)
- {
+ if (DoSetenv) {
+ if (csh) {
if (CmndLine)
- {
- (void) write(STDOUT, "';\n", 3);
- (void) write(STDOUT, "unset noglob;\n", 14);
+ (void) write(STDOUT,
+ "setenv TERMCAP '", 16);
+ } else
+ (void) write(STDOUT, "TERMCAP='", 9);
+ wrtermcap(Ttycap);
+ if (csh) {
+ if (CmndLine) {
+ (void) write(STDOUT, "';\n", 3);
+ (void) write(STDOUT,
+ "unset noglob;\n", 14);
}
- }
- else
+ } else
(void) write(STDOUT, "';\n", 3);
}
}
@@ -1137,7 +1090,7 @@ settabs(void)
if (set_tab) {
columns = tgetnum("co");
lines = tgetnum("li");
- for (c=0; c<columns; c += 8) {
+ for (c = 0; c < columns; c += 8) {
/* get to that column. */
tg_out = "OOPS"; /* also returned by tgoto */
if (set_column)
@@ -1159,13 +1112,14 @@ settabs(void)
return (0);
}
-void setmode(flag)
-int flag;
-/* flag serves several purposes:
+/*
+ * flag serves several purposes:
* if called as the result of a signal, flag will be > 0.
* if called from terminal init, flag == -1 means reset "oldmode".
* called with flag == 0 at end of normal mode processing.
*/
+void
+setmode(int flag)
{
struct termio *ttymode;
struct termios *ttymodes;
@@ -1176,38 +1130,38 @@ int flag;
if (flag < 0) { /* unconditionally reset oldmode (called from init) */
if (istermios < 0) {
- oldmode.c_lflag = oldmodes.c_lflag;
- oldmode.c_oflag = oldmodes.c_oflag;
- oldmode.c_iflag = oldmodes.c_iflag;
- oldmode.c_cflag = oldmodes.c_cflag;
- for(i = 0; i < NCC; i++)
- oldmode.c_cc[i] = oldmodes.c_cc[i];
- ttymode = &oldmode;
+ oldmode.c_lflag = oldmodes.c_lflag;
+ oldmode.c_oflag = oldmodes.c_oflag;
+ oldmode.c_iflag = oldmodes.c_iflag;
+ oldmode.c_cflag = oldmodes.c_cflag;
+ for (i = 0; i < NCC; i++)
+ oldmode.c_cc[i] = oldmodes.c_cc[i];
+ ttymode = &oldmode;
} else
- ttymodes = &oldmodes;
+ ttymodes = &oldmodes;
} else {
if (istermios < 0) {
- oldmode.c_lflag = oldmodes.c_lflag;
- oldmode.c_oflag = oldmodes.c_oflag;
- oldmode.c_iflag = oldmodes.c_iflag;
- oldmode.c_cflag = oldmodes.c_cflag;
- for(i = 0; i < NCC; i++)
- oldmode.c_cc[i] = oldmodes.c_cc[i];
- mode.c_lflag = modes.c_lflag;
- mode.c_oflag = modes.c_oflag;
- mode.c_iflag = modes.c_iflag;
- mode.c_cflag = modes.c_cflag;
- for(i = 0; i < NCC; i++)
- mode.c_cc[i] = modes.c_cc[i];
- if (!bequal((char *)&mode, (char *)&oldmode, sizeof mode))
+ oldmode.c_lflag = oldmodes.c_lflag;
+ oldmode.c_oflag = oldmodes.c_oflag;
+ oldmode.c_iflag = oldmodes.c_iflag;
+ oldmode.c_cflag = oldmodes.c_cflag;
+ for (i = 0; i < NCC; i++)
+ oldmode.c_cc[i] = oldmodes.c_cc[i];
+ mode.c_lflag = modes.c_lflag;
+ mode.c_oflag = modes.c_oflag;
+ mode.c_iflag = modes.c_iflag;
+ mode.c_cflag = modes.c_cflag;
+ for (i = 0; i < NCC; i++)
+ mode.c_cc[i] = modes.c_cc[i];
+ if (!bequal((char *)&mode, (char *)&oldmode,
+ sizeof (mode)))
ttymode = &mode;
} else if (!bequal((char *)&modes, (char *)&oldmodes,
- sizeof modes))
- ttymodes = &modes;
+ sizeof (modes)))
+ ttymodes = &modes;
}
-
- if (ttymode)
- {
+
+ if (ttymode) {
(void) ioctl(FILEDES, TCSETAW, (char *)ttymode);
} else if (ttymodes) {
(void) ioctl(FILEDES, TCSETSW, (char *)ttymodes);
@@ -1243,10 +1197,8 @@ reportek(char *name, char new, char old, char def)
prs("Backspace\n");
else if (n == 0177)
prs("Delete\n");
- else
- {
- if (n < 040)
- {
+ else {
+ if (n < 040) {
prs("Ctrl-");
n ^= 0100;
}
@@ -1278,10 +1230,8 @@ setdelay(char *cap, struct delay dtab[], tcflag_t bits, tcflag_t *flags)
*flags &= ~bits;
/* scan dtab for first entry with adequate delay */
- for (p = dtab; p->d_delay >= 0; p++)
- {
- if (p->d_delay >= i)
- {
+ for (p = dtab; p->d_delay >= 0; p++) {
+ if (p->d_delay >= i) {
p++;
break;
}
@@ -1306,7 +1256,7 @@ void
prc(char c)
{
OutBuf[OutPtr++] = c;
- if (OutPtr >= sizeof OutBuf)
+ if (OutPtr >= sizeof (OutBuf))
flush();
}
@@ -1326,8 +1276,7 @@ cat(char *file)
char buf[BUFSIZ];
fd = open(file, 0);
- if (fd < 0)
- {
+ if (fd < 0) {
prs("Cannot open ");
prs(file);
prs("\n");
@@ -1367,8 +1316,7 @@ bequal(char *a, char *b, int len) /* must be same thru len chars */
p = a;
q = b;
- while ((*p == *q) && --i > 0)
- {
+ while ((*p == *q) && --i > 0) {
p++; q++;
}
return ((*p == *q) && i >= 0);
@@ -1379,8 +1327,7 @@ sequal(char *a, char *b) /* must be same thru NULL */
{
char *p = a, *q = b;
- while (*p && *q && (*p == *q))
- {
+ while (*p && *q && (*p == *q)) {
p++; q++;
}
return (*p == *q);
@@ -1401,15 +1348,15 @@ makealias(char *buf)
*a++ = NULL;
Alias[i++] = a;
b++;
- }
- else
+ } else
*a++ = *b++;
}
*a = NULL;
Alias[i] = NULL;
-# ifdef DEB
- for(i = 0; Alias[i]; printf("A:%s\n", Alias[i++]));
-# endif
+#ifdef DEB
+ for (i = 0; Alias[i]; printf("A:%s\n", Alias[i++]))
+ ;
+#endif
}
int
@@ -1420,10 +1367,10 @@ isalias(char *ident) /* is ident same as one of the aliases? */
if (*a)
while (*a)
if (sequal(ident, *a))
- return(YES);
+ return (YES);
else
a++;
- return(NO);
+ return (NO);
}
@@ -1444,13 +1391,13 @@ wrtermcap(char *bp)
int space, empty;
/* discard names with blanks */
-/** May not be desireable ? **/
+/* May not be desireable ? */
while (*bp && *bp != ':') {
if (*bp == '|') {
tp = bp+1;
space = NO;
while (*tp && *tp != '|' && *tp != ':') {
- space = (space || WHITE(*tp) );
+ space = (space || WHITE(*tp));
tp++;
}
if (space) {
@@ -1460,15 +1407,15 @@ wrtermcap(char *bp)
}
*p++ = *bp++;
}
-/**/
+/* */
while (*bp) {
switch (*bp) {
case ':': /* discard empty, cancelled or dupl fields */
- tp = bp+1;
+ tp = bp + 1;
empty = YES;
while (*tp && *tp != ':') {
- empty = (empty && WHITE(*tp) );
+ empty = (empty && WHITE(*tp));
tp++;
}
if (empty || cancelled(bp+1)) {
@@ -1514,7 +1461,7 @@ wrtermcap(char *bp)
*p++ = *bp++;
}
*p++ = ':'; /* we skipped the last : with the : lookahead hack */
- (void) write (STDOUT, buf, p-buf);
+ (void) write(STDOUT, buf, p-buf);
}
int
@@ -1522,8 +1469,7 @@ cancelled(char *cap)
{
int i;
- for (i = 0; i < ncap; i++)
- {
+ for (i = 0; i < ncap; i++) {
if (cap[0] == delcap[i][0] && cap[1] == delcap[i][1])
return (YES);
}
@@ -1568,7 +1514,7 @@ baudrate(char *p)
while (i < 7 && (isalnum(*p) || *p == '.'))
buf[i++] = *p++;
buf[i] = NULL;
- for (i=0; speeds[i].string; i++)
+ for (i = 0; speeds[i].string; i++)
if (sequal(speeds[i].string, buf))
return (speeds[i].speed);
return (-1);
@@ -1581,46 +1527,44 @@ char *type;
extern short ospeed;
int match;
-# ifdef DEB
- printf ("spd:%d\n", ospeed);
+#ifdef DEB
+ printf("spd:%d\n", ospeed);
prmap();
-# endif
+#endif
Map = map;
- while (Map->Ident)
- {
- if (*(Map->Ident) == NULL || sequal(Map->Ident, type) || isalias(Map->Ident))
- {
+ while (Map->Ident) {
+ if (*(Map->Ident) == NULL ||
+ sequal(Map->Ident, type) || isalias(Map->Ident)) {
match = NO;
- switch (Map->Test)
- {
- case ANY: /* no test specified */
- case ALL:
- match = YES;
- break;
-
- case GT:
- match = (ospeed > Map->Speed);
- break;
-
- case GE:
- match = (ospeed >= Map->Speed);
- break;
-
- case EQ:
- match = (ospeed == Map->Speed);
- break;
-
- case LE:
- match = (ospeed <= Map->Speed);
- break;
-
- case LT:
- match = (ospeed < Map->Speed);
- break;
-
- case NE:
- match = (ospeed != Map->Speed);
- break;
+ switch (Map->Test) {
+ case ANY: /* no test specified */
+ case ALL:
+ match = YES;
+ break;
+
+ case GT:
+ match = (ospeed > Map->Speed);
+ break;
+
+ case GE:
+ match = (ospeed >= Map->Speed);
+ break;
+
+ case EQ:
+ match = (ospeed == Map->Speed);
+ break;
+
+ case LE:
+ match = (ospeed <= Map->Speed);
+ break;
+
+ case LT:
+ match = (ospeed < Map->Speed);
+ break;
+
+ case NE:
+ match = (ospeed != Map->Speed);
+ break;
}
if (match)
return (Map->Type);
@@ -1631,18 +1575,17 @@ char *type;
return (type);
}
-# ifdef DEB
+#ifdef DEB
prmap()
{
Map = map;
- while (Map->Ident)
- {
- printf ("%s t:%d s:%d %s\n",
- Map->Ident, Map->Test, Map->Speed, Map->Type);
- Map++;
+ while (Map->Ident) {
+ printf("%s t:%d s:%d %s\n",
+ Map->Ident, Map->Test, Map->Speed, Map->Type);
+ Map++;
}
}
-# endif
+#endif
char *
nextarg(argc, argv)
@@ -1650,19 +1593,19 @@ int argc;
char *argv[];
{
if (argc <= 0)
- fatal ("Too few args: ", *argv);
+ fatal("Too few args: ", *argv);
if (*(*++argv) == '-')
- fatal ("Unexpected arg: ", *argv);
+ fatal("Unexpected arg: ", *argv);
return (*argv);
}
void
-fatal (char *mesg, char *obj)
+fatal(char *mesg, char *obj)
{
- prs (mesg);
- prs (obj);
- prc ('\n');
- prs (USAGE);
+ prs(mesg);
+ prs(obj);
+ prc('\n');
+ prs(USAGE);
flush();
exit(1);
}
@@ -1676,8 +1619,7 @@ reset(ch, def)
char ch;
int def;
{
-
if (ch == 0 || (ch&0377) == 0377)
- return def;
- return ch;
+ return (def);
+ return (ch);
}
diff --git a/usr/src/uts/Makefile.uts b/usr/src/uts/Makefile.uts
index 3196d6839e..3981f333fd 100644
--- a/usr/src/uts/Makefile.uts
+++ b/usr/src/uts/Makefile.uts
@@ -427,6 +427,7 @@ ROOT_MISC_DIR_32 = $(ROOT_MOD_DIR)/misc
ROOT_KGSS_DIR_32 = $(ROOT_MOD_DIR)/misc/kgss
ROOT_SCSI_VHCI_DIR_32 = $(ROOT_MOD_DIR)/misc/scsi_vhci
ROOT_QLC_FW_DIR_32 = $(ROOT_MOD_DIR)/misc/qlc
+
ROOT_EMLXS_FW_DIR_32 = $(ROOT_MOD_DIR)/misc/emlxs
ROOT_NLMISC_DIR_32 = $(ROOT_MOD_DIR)/misc
ROOT_MACH_DIR_32 = $(ROOT_MOD_DIR)/mach
@@ -669,8 +670,15 @@ $(OBJS_DIR)/unix_bb.o := XAOPT =
# MPSAS support
#
MPSAS_BUILD:sh= echo \\043
+
#
# Privilege files
#
PRIVS_AWK = $(SRC)/uts/common/os/privs.awk
PRIVS_DEF = $(SRC)/uts/common/os/priv_defs
+
+#
+# USB device data
+#
+USBDEVS_AWK = $(SRC)/uts/common/io/usb/usbdevs2h.awk
+USBDEVS_DATA = $(SRC)/uts/common/io/usb/usbdevs
diff --git a/usr/src/uts/common/Makefile.files b/usr/src/uts/common/Makefile.files
index b5ec0530ba..6b9b948050 100644
--- a/usr/src/uts/common/Makefile.files
+++ b/usr/src/uts/common/Makefile.files
@@ -691,6 +691,8 @@ USBS49_FW_OBJS += keyspan_49fw.o
USBSPRL_OBJS += usbser_pl2303.o pl2303_dsd.o
+USBFTDI_OBJS += usbser_uftdi.o uftdi_dsd.o
+
WC_OBJS += wscons.o vcons.o
VCONS_CONF_OBJS += vcons_conf.o
diff --git a/usr/src/uts/common/Makefile.rules b/usr/src/uts/common/Makefile.rules
index 3a4d4a6578..1bc3d2848d 100644
--- a/usr/src/uts/common/Makefile.rules
+++ b/usr/src/uts/common/Makefile.rules
@@ -988,6 +988,10 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/common/io/usb/clients/usbser/usbsacm/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/usb/clients/usbser/usbftdi/%.c
+ $(COMPILE.c) -o $@ $<
+ $(CTFCONVERT_O)
+
$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/usb/clients/usbser/usbser_keyspan/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
@@ -2002,6 +2006,9 @@ $(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/usb/clients/usbser/%.c
$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/usb/clients/usbser/usbsacm/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/usb/clients/usbser/usbftdi/%.c
+ @($(LHEAD) $(LINT.c) $< $(LTAIL))
+
$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/usb/clients/usbser/usbser_keyspan/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
diff --git a/usr/src/uts/common/io/consconfig_dacf.c b/usr/src/uts/common/io/consconfig_dacf.c
index 6766421c2f..801c0f59ef 100644
--- a/usr/src/uts/common/io/consconfig_dacf.c
+++ b/usr/src/uts/common/io/consconfig_dacf.c
@@ -219,11 +219,10 @@ int consconfig_errlevel = DPRINT_L3;
/*
* Baud rate table
*/
-#define MAX_SPEEDS 24
static struct speed {
char *name;
int code;
-} speedtab[MAX_SPEEDS] = {
+} speedtab[] = {
{"0", B0}, {"50", B50}, {"75", B75},
{"110", B110}, {"134", B134}, {"150", B150},
{"200", B200}, {"300", B300}, {"600", B600},
@@ -231,9 +230,12 @@ static struct speed {
{"4800", B4800}, {"9600", B9600}, {"19200", B19200},
{"38400", B38400}, {"57600", B57600}, {"76800", B76800},
{"115200", B115200}, {"153600", B153600}, {"230400", B230400},
- {"307200", B307200}, {"460800", B460800}, {"", 0}
+ {"307200", B307200}, {"460800", B460800}, {"921600", B921600},
+ {"", 0}
};
+static const int MAX_SPEEDS = sizeof (speedtab) / sizeof (speedtab[0]);
+
static dacf_op_t kbconfig_op[] = {
{ DACF_OPID_POSTATTACH, kb_config },
{ DACF_OPID_PREDETACH, kb_unconfig },
@@ -2111,7 +2113,7 @@ flush_deferred_console_buf(void)
* Copy message to a kernel buffer. Various kernel routines
* expect buffer to be above kernelbase
*/
- kc = defcons_kern_buf = (char *)kmem_zalloc(MMU_PAGESIZE, KM_SLEEP);
+ kc = defcons_kern_buf = kmem_zalloc(MMU_PAGESIZE, KM_SLEEP);
bc = (char *)(uintptr_t)defcons_buf;
while (*kc++ = *bc++)
;
diff --git a/usr/src/uts/common/io/usb/clients/usbser/usbftdi/uftdi_dsd.c b/usr/src/uts/common/io/usb/clients/usbser/usbftdi/uftdi_dsd.c
new file mode 100644
index 0000000000..a9fdb3969b
--- /dev/null
+++ b/usr/src/uts/common/io/usb/clients/usbser/usbftdi/uftdi_dsd.c
@@ -0,0 +1,1946 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * FTDI FT232R USB UART device-specific driver
+ *
+ * May work on the (many) devices based on earlier versions of the chip.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/stream.h>
+#include <sys/strsun.h>
+#include <sys/termio.h>
+#include <sys/termiox.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#define USBDRV_MAJOR_VER 2
+#define USBDRV_MINOR_VER 0
+
+#include <sys/usb/usba.h>
+#include <sys/usb/usba/usba_types.h>
+#include <sys/usb/usba/usba_impl.h>
+
+#include <sys/usb/clients/usbser/usbser_dsdi.h>
+#include <sys/usb/clients/usbser/usbftdi/uftdi_var.h>
+#include <sys/usb/clients/usbser/usbftdi/uftdi_reg.h>
+
+#include <sys/usb/usbdevs.h>
+
+/*
+ * DSD operations
+ */
+static int uftdi_attach(ds_attach_info_t *);
+static void uftdi_detach(ds_hdl_t);
+static int uftdi_register_cb(ds_hdl_t, uint_t, ds_cb_t *);
+static void uftdi_unregister_cb(ds_hdl_t, uint_t);
+static int uftdi_open_port(ds_hdl_t, uint_t);
+static int uftdi_close_port(ds_hdl_t, uint_t);
+
+/* power management */
+static int uftdi_usb_power(ds_hdl_t, int, int, int *);
+static int uftdi_suspend(ds_hdl_t);
+static int uftdi_resume(ds_hdl_t);
+static int uftdi_disconnect(ds_hdl_t);
+static int uftdi_reconnect(ds_hdl_t);
+
+/* standard UART operations */
+static int uftdi_set_port_params(ds_hdl_t, uint_t, ds_port_params_t *);
+static int uftdi_set_modem_ctl(ds_hdl_t, uint_t, int, int);
+static int uftdi_get_modem_ctl(ds_hdl_t, uint_t, int, int *);
+static int uftdi_break_ctl(ds_hdl_t, uint_t, int);
+
+/* data xfer */
+static int uftdi_tx(ds_hdl_t, uint_t, mblk_t *);
+static mblk_t *uftdi_rx(ds_hdl_t, uint_t);
+static void uftdi_stop(ds_hdl_t, uint_t, int);
+static void uftdi_start(ds_hdl_t, uint_t, int);
+static int uftdi_fifo_flush(ds_hdl_t, uint_t, int);
+static int uftdi_fifo_drain(ds_hdl_t, uint_t, int);
+
+/* polled I/O support */
+static usb_pipe_handle_t uftdi_out_pipe(ds_hdl_t, uint_t);
+static usb_pipe_handle_t uftdi_in_pipe(ds_hdl_t, uint_t);
+
+/*
+ * Sub-routines
+ */
+
+/* configuration routines */
+static void uftdi_cleanup(uftdi_state_t *, int);
+static int uftdi_dev_attach(uftdi_state_t *);
+static int uftdi_open_hw_port(uftdi_state_t *, int, int);
+
+/* hotplug */
+static int uftdi_restore_device_state(uftdi_state_t *);
+static int uftdi_restore_port_state(uftdi_state_t *, int);
+
+/* power management */
+static int uftdi_create_pm_components(uftdi_state_t *);
+static void uftdi_destroy_pm_components(uftdi_state_t *);
+static int uftdi_pm_set_busy(uftdi_state_t *);
+static void uftdi_pm_set_idle(uftdi_state_t *);
+static int uftdi_pwrlvl0(uftdi_state_t *);
+static int uftdi_pwrlvl1(uftdi_state_t *);
+static int uftdi_pwrlvl2(uftdi_state_t *);
+static int uftdi_pwrlvl3(uftdi_state_t *);
+
+/* pipe operations */
+static int uftdi_open_pipes(uftdi_state_t *);
+static void uftdi_close_pipes(uftdi_state_t *);
+static void uftdi_disconnect_pipes(uftdi_state_t *);
+static int uftdi_reconnect_pipes(uftdi_state_t *);
+
+/* pipe callbacks */
+static void uftdi_bulkin_cb(usb_pipe_handle_t, usb_bulk_req_t *);
+static void uftdi_bulkout_cb(usb_pipe_handle_t, usb_bulk_req_t *);
+
+/* data transfer routines */
+static int uftdi_rx_start(uftdi_state_t *);
+static void uftdi_tx_start(uftdi_state_t *, int *);
+static int uftdi_send_data(uftdi_state_t *, mblk_t *);
+static int uftdi_wait_tx_drain(uftdi_state_t *, int);
+
+/* vendor-specific commands */
+static int uftdi_cmd_vendor_write0(uftdi_state_t *,
+ uint16_t, uint16_t, uint16_t);
+
+/* misc */
+static void uftdi_put_tail(mblk_t **, mblk_t *);
+static void uftdi_put_head(mblk_t **, mblk_t *);
+
+
+/*
+ * DSD ops structure
+ */
+ds_ops_t uftdi_ds_ops = {
+ DS_OPS_VERSION,
+ uftdi_attach,
+ uftdi_detach,
+ uftdi_register_cb,
+ uftdi_unregister_cb,
+ uftdi_open_port,
+ uftdi_close_port,
+ uftdi_usb_power,
+ uftdi_suspend,
+ uftdi_resume,
+ uftdi_disconnect,
+ uftdi_reconnect,
+ uftdi_set_port_params,
+ uftdi_set_modem_ctl,
+ uftdi_get_modem_ctl,
+ uftdi_break_ctl,
+ NULL, /* no loopback support */
+ uftdi_tx,
+ uftdi_rx,
+ uftdi_stop,
+ uftdi_start,
+ uftdi_fifo_flush,
+ uftdi_fifo_drain,
+ uftdi_out_pipe,
+ uftdi_in_pipe
+};
+
+/* debug support */
+static uint_t uftdi_errlevel = USB_LOG_L4;
+static uint_t uftdi_errmask = DPRINT_MASK_ALL;
+static uint_t uftdi_instance_debug = (uint_t)-1;
+static uint_t uftdi_attach_unrecognized = B_FALSE;
+
+/*
+ * ds_attach
+ */
+static int
+uftdi_attach(ds_attach_info_t *aip)
+{
+ uftdi_state_t *uf;
+ usb_dev_descr_t *dd;
+ int recognized;
+
+ uf = kmem_zalloc(sizeof (*uf), KM_SLEEP);
+ uf->uf_dip = aip->ai_dip;
+ uf->uf_usb_events = aip->ai_usb_events;
+ *aip->ai_hdl = (ds_hdl_t)uf;
+
+ /* only one port */
+ *aip->ai_port_cnt = 1;
+
+ if (usb_client_attach(uf->uf_dip, USBDRV_VERSION, 0) != USB_SUCCESS) {
+ uftdi_cleanup(uf, 1);
+ return (USB_FAILURE);
+ }
+
+ if (usb_get_dev_data(uf->uf_dip,
+ &uf->uf_dev_data, USB_PARSE_LVL_IF, 0) != USB_SUCCESS) {
+ uftdi_cleanup(uf, 2);
+ return (USB_FAILURE);
+ }
+
+ mutex_init(&uf->uf_lock, NULL, MUTEX_DRIVER,
+ uf->uf_dev_data->dev_iblock_cookie);
+
+ cv_init(&uf->uf_tx_cv, NULL, CV_DRIVER, NULL);
+
+ uf->uf_lh = usb_alloc_log_hdl(uf->uf_dip, "uftdi",
+ &uftdi_errlevel, &uftdi_errmask, &uftdi_instance_debug, 0);
+
+ /*
+ * This device and its clones has numerous physical instantiations.
+ */
+ recognized = B_TRUE;
+ dd = uf->uf_dev_data->dev_descr;
+ switch (dd->idVendor) {
+ case USB_VENDOR_FTDI:
+ switch (dd->idProduct) {
+ case USB_PRODUCT_FTDI_SERIAL_8U232AM:
+ case USB_PRODUCT_FTDI_SEMC_DSS20:
+ case USB_PRODUCT_FTDI_CFA_631:
+ case USB_PRODUCT_FTDI_CFA_632:
+ case USB_PRODUCT_FTDI_CFA_633:
+ case USB_PRODUCT_FTDI_CFA_634:
+ case USB_PRODUCT_FTDI_CFA_635:
+ case USB_PRODUCT_FTDI_USBSERIAL:
+ case USB_PRODUCT_FTDI_MX2_3:
+ case USB_PRODUCT_FTDI_MX4_5:
+ case USB_PRODUCT_FTDI_LK202:
+ case USB_PRODUCT_FTDI_LK204:
+ case USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13M:
+ case USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13S:
+ case USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13U:
+ case USB_PRODUCT_FTDI_EISCOU:
+ case USB_PRODUCT_FTDI_UOPTBR:
+ case USB_PRODUCT_FTDI_EMCU2D:
+ case USB_PRODUCT_FTDI_PCMSFU:
+ case USB_PRODUCT_FTDI_EMCU2H:
+ break;
+ default:
+ recognized = B_FALSE;
+ break;
+ }
+ break;
+ case USB_VENDOR_SIIG2:
+ switch (dd->idProduct) {
+ case USB_PRODUCT_SIIG2_US2308:
+ break;
+ default:
+ recognized = B_FALSE;
+ break;
+ }
+ break;
+ case USB_VENDOR_INTREPIDCS:
+ switch (dd->idProduct) {
+ case USB_PRODUCT_INTREPIDCS_VALUECAN:
+ case USB_PRODUCT_INTREPIDCS_NEOVI:
+ break;
+ default:
+ recognized = B_FALSE;
+ break;
+ }
+ break;
+ case USB_VENDOR_BBELECTRONICS:
+ switch (dd->idProduct) {
+ case USB_PRODUCT_BBELECTRONICS_USOTL4:
+ break;
+ default:
+ recognized = B_FALSE;
+ break;
+ }
+ break;
+ case USB_VENDOR_MELCO:
+ switch (dd->idProduct) {
+ case USB_PRODUCT_MELCO_PCOPRS1:
+ break;
+ default:
+ recognized = B_FALSE;
+ break;
+ }
+ break;
+ default:
+ recognized = B_FALSE;
+ break;
+ }
+
+ /*
+ * Set 'uftdi_attach_unrecognized' to non-zero to
+ * experiment with newer devices ..
+ */
+ if (!recognized && !uftdi_attach_unrecognized) {
+ uftdi_cleanup(uf, 3);
+ return (USB_FAILURE);
+ }
+
+ USB_DPRINTF_L3(DPRINT_ATTACH, uf->uf_lh,
+ "uftdi: matched vendor 0x%x product 0x%x",
+ dd->idVendor, dd->idProduct);
+
+ uf->uf_def_ph = uf->uf_dev_data->dev_default_ph;
+
+ mutex_enter(&uf->uf_lock);
+ uf->uf_dev_state = USB_DEV_ONLINE;
+ uf->uf_port_state = UFTDI_PORT_CLOSED;
+ mutex_exit(&uf->uf_lock);
+
+ if (uftdi_create_pm_components(uf) != USB_SUCCESS) {
+ uftdi_cleanup(uf, 3);
+ return (USB_FAILURE);
+ }
+
+ if (usb_register_event_cbs(uf->uf_dip,
+ uf->uf_usb_events, 0) != USB_SUCCESS) {
+ uftdi_cleanup(uf, 4);
+ return (USB_FAILURE);
+ }
+
+ if (usb_pipe_get_max_bulk_transfer_size(uf->uf_dip,
+ &uf->uf_xfer_sz) != USB_SUCCESS) {
+ uftdi_cleanup(uf, 5);
+ return (USB_FAILURE);
+ }
+
+ /*
+ * TODO: modern ftdi devices have deeper (and asymmetric)
+ * fifos than this minimal 64 bytes .. but how to tell
+ * -safely- ?
+ */
+
+#define FTDI_MAX_XFERSIZE 64
+
+ if (uf->uf_xfer_sz > FTDI_MAX_XFERSIZE)
+ uf->uf_xfer_sz = FTDI_MAX_XFERSIZE;
+
+ if (uftdi_dev_attach(uf) != USB_SUCCESS) {
+ uftdi_cleanup(uf, 5);
+ return (USB_FAILURE);
+ }
+
+ return (USB_SUCCESS);
+}
+
+#define FTDI_CLEANUP_LEVEL_MAX 6
+
+/*
+ * ds_detach
+ */
+static void
+uftdi_detach(ds_hdl_t hdl)
+{
+ uftdi_cleanup((uftdi_state_t *)hdl, FTDI_CLEANUP_LEVEL_MAX);
+}
+
+
+/*
+ * ds_register_cb
+ */
+/*ARGSUSED*/
+static int
+uftdi_register_cb(ds_hdl_t hdl, uint_t portno, ds_cb_t *cb)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ uf->uf_cb = *cb;
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * ds_unregister_cb
+ */
+/*ARGSUSED*/
+static void
+uftdi_unregister_cb(ds_hdl_t hdl, uint_t portno)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ bzero(&uf->uf_cb, sizeof (uf->uf_cb));
+}
+
+
+/*
+ * ds_open_port
+ */
+/*ARGSUSED*/
+static int
+uftdi_open_port(ds_hdl_t hdl, uint_t portno)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_OPEN, uf->uf_lh, "uftdi_open_port %d", portno);
+
+ mutex_enter(&uf->uf_lock);
+ if (uf->uf_dev_state == USB_DEV_DISCONNECTED ||
+ uf->uf_port_state != UFTDI_PORT_CLOSED) {
+ mutex_exit(&uf->uf_lock);
+ return (USB_FAILURE);
+ }
+ mutex_exit(&uf->uf_lock);
+
+ if ((rval = uftdi_pm_set_busy(uf)) != USB_SUCCESS)
+ return (rval);
+
+ /* initialize hardware serial port */
+ rval = uftdi_open_hw_port(uf, portno, 0);
+
+ if (rval == USB_SUCCESS) {
+ mutex_enter(&uf->uf_lock);
+
+ /* start to receive data */
+ if (uftdi_rx_start(uf) != USB_SUCCESS) {
+ mutex_exit(&uf->uf_lock);
+ return (USB_FAILURE);
+ }
+ uf->uf_port_state = UFTDI_PORT_OPEN;
+ mutex_exit(&uf->uf_lock);
+ } else
+ uftdi_pm_set_idle(uf);
+
+ return (rval);
+}
+
+
+/*
+ * ds_close_port
+ */
+/*ARGSUSED*/
+static int
+uftdi_close_port(ds_hdl_t hdl, uint_t portno)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ USB_DPRINTF_L4(DPRINT_CLOSE, uf->uf_lh, "uftdi_close_port %d", portno);
+
+ mutex_enter(&uf->uf_lock);
+
+ /* free resources and finalize state */
+ freemsg(uf->uf_rx_mp);
+ uf->uf_rx_mp = NULL;
+
+ freemsg(uf->uf_tx_mp);
+ uf->uf_tx_mp = NULL;
+
+ uf->uf_port_state = UFTDI_PORT_CLOSED;
+ mutex_exit(&uf->uf_lock);
+
+ uftdi_pm_set_idle(uf);
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * ds_usb_power
+ */
+/*ARGSUSED*/
+static int
+uftdi_usb_power(ds_hdl_t hdl, int comp, int level, int *new_state)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ uftdi_pm_t *pm = uf->uf_pm;
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_usb_power");
+
+ if (!pm)
+ return (USB_FAILURE);
+
+ mutex_enter(&uf->uf_lock);
+
+ /*
+ * check if we are transitioning to a legal power level
+ */
+ if (USB_DEV_PWRSTATE_OK(pm->pm_pwr_states, level)) {
+ USB_DPRINTF_L2(DPRINT_PM, uf->uf_lh, "uftdi_usb_power: "
+ "illegal power level %d, pwr_states=0x%x",
+ level, pm->pm_pwr_states);
+ mutex_exit(&uf->uf_lock);
+ return (USB_FAILURE);
+ }
+
+ /*
+ * if we are about to raise power and asked to lower power, fail
+ */
+ if (pm->pm_raise_power && (level < (int)pm->pm_cur_power)) {
+ mutex_exit(&uf->uf_lock);
+ return (USB_FAILURE);
+ }
+
+ switch (level) {
+ case USB_DEV_OS_PWR_OFF:
+ rval = uftdi_pwrlvl0(uf);
+ break;
+ case USB_DEV_OS_PWR_1:
+ rval = uftdi_pwrlvl1(uf);
+ break;
+ case USB_DEV_OS_PWR_2:
+ rval = uftdi_pwrlvl2(uf);
+ break;
+ case USB_DEV_OS_FULL_PWR:
+ rval = uftdi_pwrlvl3(uf);
+ /*
+ * If usbser dev_state is DISCONNECTED or SUSPENDED, it shows
+ * that the usb serial device is disconnected/suspended while it
+ * is under power down state, now the device is powered up
+ * before it is reconnected/resumed. xxx_pwrlvl3() will set dev
+ * state to ONLINE, we need to set the dev state back to
+ * DISCONNECTED/SUSPENDED.
+ */
+ if (rval == USB_SUCCESS &&
+ (*new_state == USB_DEV_DISCONNECTED ||
+ *new_state == USB_DEV_SUSPENDED))
+ uf->uf_dev_state = *new_state;
+ break;
+ default:
+ ASSERT(0); /* cannot happen */
+ }
+
+ *new_state = uf->uf_dev_state;
+ mutex_exit(&uf->uf_lock);
+
+ return (rval);
+}
+
+
+/*
+ * ds_suspend
+ */
+static int
+uftdi_suspend(ds_hdl_t hdl)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ int state = USB_DEV_SUSPENDED;
+
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_suspend");
+
+ /*
+ * If the device is suspended while it is under PWRED_DOWN state, we
+ * need to keep the PWRED_DOWN state so that it could be powered up
+ * later. In the mean while, usbser dev state will be changed to
+ * SUSPENDED state.
+ */
+ mutex_enter(&uf->uf_lock);
+ if (uf->uf_dev_state != USB_DEV_PWRED_DOWN)
+ uf->uf_dev_state = USB_DEV_SUSPENDED;
+ mutex_exit(&uf->uf_lock);
+
+ uftdi_disconnect_pipes(uf);
+ return (state);
+}
+
+
+/*
+ * ds_resume
+ */
+static int
+uftdi_resume(ds_hdl_t hdl)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ int current_state;
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_resume");
+
+ mutex_enter(&uf->uf_lock);
+ current_state = uf->uf_dev_state;
+ mutex_exit(&uf->uf_lock);
+
+ if (current_state == USB_DEV_ONLINE)
+ rval = USB_SUCCESS;
+ else
+ rval = uftdi_restore_device_state(uf);
+ return (rval);
+}
+
+
+/*
+ * ds_disconnect
+ */
+static int
+uftdi_disconnect(ds_hdl_t hdl)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ int state = USB_DEV_DISCONNECTED;
+
+ USB_DPRINTF_L4(DPRINT_HOTPLUG, uf->uf_lh, "uftdi_disconnect");
+
+ /*
+ * If the device is disconnected while it is under PWRED_DOWN state, we
+ * need to keep the PWRED_DOWN state so that it could be powered up
+ * later. In the mean while, usbser dev state will be changed to
+ * DISCONNECTED state.
+ */
+ mutex_enter(&uf->uf_lock);
+ if (uf->uf_dev_state != USB_DEV_PWRED_DOWN)
+ uf->uf_dev_state = USB_DEV_DISCONNECTED;
+ mutex_exit(&uf->uf_lock);
+
+ uftdi_disconnect_pipes(uf);
+ return (state);
+}
+
+
+/*
+ * ds_reconnect
+ */
+static int
+uftdi_reconnect(ds_hdl_t hdl)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ USB_DPRINTF_L4(DPRINT_HOTPLUG, uf->uf_lh, "uftdi_reconnect");
+ return (uftdi_restore_device_state(uf));
+}
+
+/* translate parameters into device-specific bits */
+
+static int
+uftdi_param2regs(uftdi_state_t *uf, ds_port_params_t *tp, uftdi_regs_t *ur)
+{
+ ds_port_param_entry_t *pe;
+ int i;
+
+ ur->ur_data = 0;
+ ur->ur_flowval = 0;
+ ur->ur_flowidx = FTDI_SIO_DISABLE_FLOW_CTRL << 8;
+
+ for (i = 0, pe = tp->tp_entries; i < tp->tp_cnt; i++, pe++) {
+ switch (pe->param) {
+ case DS_PARAM_BAUD:
+ switch (pe->val.ui) {
+ case B300:
+ ur->ur_baud = ftdi_8u232am_b300;
+ break;
+ case B600:
+ ur->ur_baud = ftdi_8u232am_b600;
+ break;
+ case B1200:
+ ur->ur_baud = ftdi_8u232am_b1200;
+ break;
+ case B2400:
+ ur->ur_baud = ftdi_8u232am_b2400;
+ break;
+ case B4800:
+ ur->ur_baud = ftdi_8u232am_b4800;
+ break;
+ case B9600:
+ ur->ur_baud = ftdi_8u232am_b9600;
+ break;
+ case B19200:
+ ur->ur_baud = ftdi_8u232am_b19200;
+ break;
+ case B38400:
+ ur->ur_baud = ftdi_8u232am_b38400;
+ break;
+ case B57600:
+ ur->ur_baud = ftdi_8u232am_b57600;
+ break;
+ case B115200:
+ ur->ur_baud = ftdi_8u232am_b115200;
+ break;
+ case B230400:
+ ur->ur_baud = ftdi_8u232am_b230400;
+ break;
+ case B460800:
+ ur->ur_baud = ftdi_8u232am_b460800;
+ break;
+ case B921600:
+ ur->ur_baud = ftdi_8u232am_b921600;
+ break;
+ default:
+ USB_DPRINTF_L3(DPRINT_CTLOP, uf->uf_lh,
+ "uftdi_param2regs: bad baud %d",
+ pe->val.ui);
+ return (USB_FAILURE);
+ }
+ break;
+
+ case DS_PARAM_PARITY:
+ if (pe->val.ui & PARENB) {
+ if (pe->val.ui & PARODD)
+ ur->ur_data |=
+ FTDI_SIO_SET_DATA_PARITY_ODD;
+ else
+ ur->ur_data |=
+ FTDI_SIO_SET_DATA_PARITY_EVEN;
+ } else {
+ /* LINTED [E_EXPR_NULL_EFFECT] */
+ ur->ur_data |= FTDI_SIO_SET_DATA_PARITY_NONE;
+ }
+ break;
+
+ case DS_PARAM_STOPB:
+ if (pe->val.ui & CSTOPB)
+ ur->ur_data |= FTDI_SIO_SET_DATA_STOP_BITS_2;
+ else {
+ /* LINTED [E_EXPR_NULL_EFFECT] */
+ ur->ur_data |= FTDI_SIO_SET_DATA_STOP_BITS_1;
+ }
+ break;
+
+ case DS_PARAM_CHARSZ:
+ switch (pe->val.ui) {
+ case CS5:
+ ur->ur_data |= FTDI_SIO_SET_DATA_BITS(5);
+ break;
+ case CS6:
+ ur->ur_data |= FTDI_SIO_SET_DATA_BITS(6);
+ break;
+ case CS7:
+ ur->ur_data |= FTDI_SIO_SET_DATA_BITS(7);
+ break;
+ case CS8:
+ default:
+ ur->ur_data |= FTDI_SIO_SET_DATA_BITS(8);
+ break;
+ }
+ break;
+
+ case DS_PARAM_XON_XOFF: /* Software flow control */
+ if ((pe->val.ui & IXON) || (pe->val.ui & IXOFF)) {
+ uint8_t xonc = pe->val.uc[0];
+ uint8_t xoffc = pe->val.uc[1];
+
+ ur->ur_flowval = (xoffc << 8) | xonc;
+ ur->ur_flowidx = FTDI_SIO_XON_XOFF_HS << 8;
+ }
+ break;
+
+ case DS_PARAM_FLOW_CTL: /* Hardware flow control */
+ if (pe->val.ui & (RTSXOFF | CTSXON)) {
+ ur->ur_flowval = 0;
+ ur->ur_flowidx = FTDI_SIO_RTS_CTS_HS << 8;
+ }
+ if (pe->val.ui & DTRXOFF) {
+ ur->ur_flowval = 0;
+ ur->ur_flowidx = FTDI_SIO_DTR_DSR_HS << 8;
+ }
+ break;
+ default:
+ USB_DPRINTF_L2(DPRINT_CTLOP, uf->uf_lh,
+ "uftdi_param2regs: bad param %d", pe->param);
+ break;
+ }
+ }
+ return (USB_SUCCESS);
+}
+
+/*
+ * Write the register set to the device and update the state structure.
+ * If there are errors, return the device to its previous state.
+ */
+static int
+uftdi_setregs(uftdi_state_t *uf, uint_t portno, uftdi_regs_t *ur)
+{
+ int rval;
+ uftdi_regs_t uold;
+
+ mutex_enter(&uf->uf_lock);
+ uold = uf->uf_softr;
+ mutex_exit(&uf->uf_lock);
+
+ if (ur == NULL)
+ ur = &uold; /* NULL => restore previous values */
+
+ rval = uftdi_cmd_vendor_write0(uf, FTDI_SIO_SET_BAUD_RATE,
+ ur->ur_baud, portno);
+ if (rval != USB_SUCCESS) {
+ (void) uftdi_cmd_vendor_write0(uf, FTDI_SIO_SET_BAUD_RATE,
+ uold.ur_baud, portno);
+ goto out;
+ } else {
+ mutex_enter(&uf->uf_lock);
+ uf->uf_softr.ur_baud = ur->ur_baud;
+ mutex_exit(&uf->uf_lock);
+ }
+
+ rval = uftdi_cmd_vendor_write0(uf, FTDI_SIO_SET_DATA,
+ ur->ur_data, portno);
+ if (rval != USB_SUCCESS) {
+ (void) uftdi_cmd_vendor_write0(uf, FTDI_SIO_SET_DATA,
+ uold.ur_data, portno);
+ goto out;
+ } else {
+ mutex_enter(&uf->uf_lock);
+ uf->uf_softr.ur_data = ur->ur_data;
+ mutex_exit(&uf->uf_lock);
+ }
+
+ rval = uftdi_cmd_vendor_write0(uf, FTDI_SIO_SET_FLOW_CTRL,
+ ur->ur_flowval, ur->ur_flowidx | portno);
+ if (rval != USB_SUCCESS) {
+ (void) uftdi_cmd_vendor_write0(uf, FTDI_SIO_SET_FLOW_CTRL,
+ uold.ur_flowval, uold.ur_flowidx | portno);
+ goto out;
+ } else {
+ mutex_enter(&uf->uf_lock);
+ uf->uf_softr.ur_flowval = ur->ur_flowval;
+ uf->uf_softr.ur_flowidx = ur->ur_flowidx;
+ mutex_exit(&uf->uf_lock);
+ }
+out:
+ return (rval);
+}
+
+/*
+ * ds_set_port_params
+ */
+static int
+uftdi_set_port_params(ds_hdl_t hdl, uint_t portno, ds_port_params_t *tp)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ int rval;
+ uftdi_regs_t uregs;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_set_port_params");
+
+ rval = uftdi_param2regs(uf, tp, &uregs);
+ if (rval == USB_SUCCESS)
+ rval = uftdi_setregs(uf, portno, &uregs);
+ return (rval);
+}
+
+/*
+ * ds_set_modem_ctl
+ */
+static int
+uftdi_set_modem_ctl(ds_hdl_t hdl, uint_t portno, int mask, int val)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ int rval;
+ uint16_t mctl;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_set_modem_ctl");
+
+ /*
+ * Note that we cannot set DTR and RTS simultaneously, so
+ * we do separate operations for each bit.
+ */
+
+ if (mask & TIOCM_DTR) {
+ mctl = (val & TIOCM_DTR) ?
+ FTDI_SIO_SET_DTR_HIGH : FTDI_SIO_SET_DTR_LOW;
+
+ rval = uftdi_cmd_vendor_write0(uf,
+ FTDI_SIO_MODEM_CTRL, mctl, portno);
+
+ if (rval == USB_SUCCESS) {
+ mutex_enter(&uf->uf_lock);
+ uf->uf_mctl &= ~FTDI_SIO_SET_DTR_HIGH;
+ uf->uf_mctl |= mctl & FTDI_SIO_SET_DTR_HIGH;
+ mutex_exit(&uf->uf_lock);
+ } else
+ return (rval);
+ }
+
+ if (mask & TIOCM_RTS) {
+ mctl = (val & TIOCM_RTS) ?
+ FTDI_SIO_SET_RTS_HIGH : FTDI_SIO_SET_RTS_LOW;
+
+ rval = uftdi_cmd_vendor_write0(uf,
+ FTDI_SIO_MODEM_CTRL, mctl, portno);
+
+ if (rval == USB_SUCCESS) {
+ mutex_enter(&uf->uf_lock);
+ uf->uf_mctl &= ~FTDI_SIO_SET_RTS_HIGH;
+ uf->uf_mctl |= mctl & FTDI_SIO_SET_RTS_HIGH;
+ mutex_exit(&uf->uf_lock);
+ }
+ }
+
+ return (rval);
+}
+
+/*
+ * ds_get_modem_ctl
+ */
+static int
+uftdi_get_modem_ctl(ds_hdl_t hdl, uint_t portno, int mask, int *valp)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ uint_t val = 0;
+
+ ASSERT(portno == 0);
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_get_modem_ctl");
+
+ mutex_enter(&uf->uf_lock);
+ /*
+ * This status info is delivered to us at least every 40ms
+ * while the receive pipe is active
+ */
+ if (uf->uf_msr & FTDI_MSR_STATUS_CTS)
+ val |= TIOCM_CTS;
+ if (uf->uf_msr & FTDI_MSR_STATUS_DSR)
+ val |= TIOCM_DSR;
+ if (uf->uf_msr & FTDI_MSR_STATUS_RI)
+ val |= TIOCM_RI;
+ if (uf->uf_msr & FTDI_MSR_STATUS_RLSD)
+ val |= TIOCM_CD;
+
+ /*
+ * Note, this status info is simply a replay of what we
+ * asked it to be in some previous "set" command, and
+ * is *not* directly sensed from the hardware.
+ */
+ if ((uf->uf_mctl & FTDI_SIO_SET_RTS_HIGH) == FTDI_SIO_SET_RTS_HIGH)
+ val |= TIOCM_RTS;
+ if ((uf->uf_mctl & FTDI_SIO_SET_DTR_HIGH) == FTDI_SIO_SET_DTR_HIGH)
+ val |= TIOCM_DTR;
+ mutex_exit(&uf->uf_lock);
+
+ *valp = val & mask;
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * ds_break_ctl
+ */
+static int
+uftdi_break_ctl(ds_hdl_t hdl, uint_t portno, int ctl)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ uftdi_regs_t *ur = &uf->uf_softr;
+ uint16_t data;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_break_ctl");
+
+ mutex_enter(&uf->uf_lock);
+ data = ur->ur_data | (ctl == DS_ON) ? FTDI_SIO_SET_BREAK : 0;
+ mutex_exit(&uf->uf_lock);
+
+ return (uftdi_cmd_vendor_write0(uf, FTDI_SIO_SET_DATA,
+ data, portno));
+}
+
+
+/*
+ * ds_tx
+ */
+/*ARGSUSED*/
+static int
+uftdi_tx(ds_hdl_t hdl, uint_t portno, mblk_t *mp)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_tx");
+
+ ASSERT(mp != NULL && MBLKL(mp) >= 1);
+
+ mutex_enter(&uf->uf_lock);
+ uftdi_put_tail(&uf->uf_tx_mp, mp); /* add to the chain */
+ uftdi_tx_start(uf, NULL);
+ mutex_exit(&uf->uf_lock);
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * ds_rx
+ */
+/*ARGSUSED*/
+static mblk_t *
+uftdi_rx(ds_hdl_t hdl, uint_t portno)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ mblk_t *mp;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_rx");
+
+ mutex_enter(&uf->uf_lock);
+ mp = uf->uf_rx_mp;
+ uf->uf_rx_mp = NULL;
+ mutex_exit(&uf->uf_lock);
+
+ return (mp);
+}
+
+
+/*
+ * ds_stop
+ */
+/*ARGSUSED*/
+static void
+uftdi_stop(ds_hdl_t hdl, uint_t portno, int dir)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_stop");
+
+ if (dir & DS_TX) {
+ mutex_enter(&uf->uf_lock);
+ uf->uf_port_flags |= UFTDI_PORT_TX_STOPPED;
+ mutex_exit(&uf->uf_lock);
+ }
+}
+
+
+/*
+ * ds_start
+ */
+/*ARGSUSED*/
+static void
+uftdi_start(ds_hdl_t hdl, uint_t portno, int dir)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_start");
+
+ if (dir & DS_TX) {
+ mutex_enter(&uf->uf_lock);
+ if (uf->uf_port_flags & UFTDI_PORT_TX_STOPPED) {
+ uf->uf_port_flags &= ~UFTDI_PORT_TX_STOPPED;
+ uftdi_tx_start(uf, NULL);
+ }
+ mutex_exit(&uf->uf_lock);
+ }
+}
+
+
+/*
+ * ds_fifo_flush
+ */
+/*ARGSUSED*/
+static int
+uftdi_fifo_flush(ds_hdl_t hdl, uint_t portno, int dir)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh,
+ "uftdi_fifo_flush: dir=0x%x", dir);
+
+ mutex_enter(&uf->uf_lock);
+ ASSERT(uf->uf_port_state == UFTDI_PORT_OPEN);
+
+ if (dir & DS_TX) {
+ freemsg(uf->uf_tx_mp);
+ uf->uf_tx_mp = NULL;
+ }
+
+ if (dir & DS_RX) {
+ freemsg(uf->uf_rx_mp);
+ uf->uf_rx_mp = NULL;
+ }
+ mutex_exit(&uf->uf_lock);
+
+ if (dir & DS_TX)
+ (void) uftdi_cmd_vendor_write0(uf,
+ FTDI_SIO_RESET, FTDI_SIO_RESET_PURGE_TX, portno);
+
+ if (dir & DS_RX)
+ (void) uftdi_cmd_vendor_write0(uf,
+ FTDI_SIO_RESET, FTDI_SIO_RESET_PURGE_RX, portno);
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * ds_fifo_drain
+ */
+/*ARGSUSED*/
+static int
+uftdi_fifo_drain(ds_hdl_t hdl, uint_t portno, int timeout)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)hdl;
+ int rval = USB_SUCCESS;
+
+ USB_DPRINTF_L4(DPRINT_CTLOP, uf->uf_lh, "uftdi_fifo_drain");
+
+ mutex_enter(&uf->uf_lock);
+ ASSERT(uf->uf_port_state == UFTDI_PORT_OPEN);
+
+ if (uftdi_wait_tx_drain(uf, 0) != USB_SUCCESS) {
+ mutex_exit(&uf->uf_lock);
+ return (USB_FAILURE);
+ }
+
+ mutex_exit(&uf->uf_lock);
+
+ /* wait 500 ms until hw fifo drains */
+ delay(drv_usectohz(500*1000));
+
+ return (rval);
+}
+
+
+/*
+ * configuration clean up
+ */
+static void
+uftdi_cleanup(uftdi_state_t *uf, int level)
+{
+ ASSERT(level > 0 && level <= UFTDI_CLEANUP_LEVEL_MAX);
+
+ switch (level) {
+ default:
+ case 6:
+ uftdi_close_pipes(uf);
+ /*FALLTHROUGH*/
+ case 5:
+ usb_unregister_event_cbs(uf->uf_dip, uf->uf_usb_events);
+ /*FALLTHROUGH*/
+ case 4:
+ uftdi_destroy_pm_components(uf);
+ /*FALLTHROUGH*/
+ case 3:
+ mutex_destroy(&uf->uf_lock);
+ cv_destroy(&uf->uf_tx_cv);
+
+ usb_free_log_hdl(uf->uf_lh);
+ uf->uf_lh = NULL;
+
+ usb_free_descr_tree(uf->uf_dip, uf->uf_dev_data);
+ uf->uf_def_ph = NULL;
+ /*FALLTHROUGH*/
+ case 2:
+ usb_client_detach(uf->uf_dip, uf->uf_dev_data);
+ /*FALLTHROUGH*/
+ case 1:
+ kmem_free(uf, sizeof (*uf));
+ break;
+ }
+}
+
+
+/*
+ * device specific attach
+ */
+static int
+uftdi_dev_attach(uftdi_state_t *uf)
+{
+ return (uftdi_open_pipes(uf));
+}
+
+
+/*
+ * restore device state after CPR resume or reconnect
+ */
+static int
+uftdi_restore_device_state(uftdi_state_t *uf)
+{
+ int state;
+
+ mutex_enter(&uf->uf_lock);
+ state = uf->uf_dev_state;
+ mutex_exit(&uf->uf_lock);
+
+ if (state != USB_DEV_DISCONNECTED && state != USB_DEV_SUSPENDED)
+ return (state);
+
+ if (usb_check_same_device(uf->uf_dip, uf->uf_lh, USB_LOG_L0,
+ DPRINT_MASK_ALL, USB_CHK_ALL, NULL) != USB_SUCCESS) {
+ mutex_enter(&uf->uf_lock);
+ state = uf->uf_dev_state = USB_DEV_DISCONNECTED;
+ mutex_exit(&uf->uf_lock);
+ return (state);
+ }
+
+ if (state == USB_DEV_DISCONNECTED) {
+ USB_DPRINTF_L0(DPRINT_HOTPLUG, uf->uf_lh,
+ "Device has been reconnected but data may have been lost");
+ }
+
+ if (uftdi_reconnect_pipes(uf) != USB_SUCCESS)
+ return (state);
+
+ /*
+ * init device state
+ */
+ mutex_enter(&uf->uf_lock);
+ state = uf->uf_dev_state = USB_DEV_ONLINE;
+ mutex_exit(&uf->uf_lock);
+
+ if ((uftdi_restore_port_state(uf, 0) != USB_SUCCESS)) {
+ USB_DPRINTF_L2(DPRINT_HOTPLUG, uf->uf_lh,
+ "uftdi_restore_device_state: failed");
+ }
+
+ return (state);
+}
+
+
+/*
+ * restore ports state after CPR resume or reconnect
+ */
+static int
+uftdi_restore_port_state(uftdi_state_t *uf, int portno)
+{
+ int rval;
+
+ mutex_enter(&uf->uf_lock);
+ if (uf->uf_port_state != UFTDI_PORT_OPEN) {
+ mutex_exit(&uf->uf_lock);
+ return (USB_SUCCESS);
+ }
+ mutex_exit(&uf->uf_lock);
+
+ /* open hardware serial port, restoring old settings */
+ if ((rval = uftdi_open_hw_port(uf, portno, 1)) != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_HOTPLUG, uf->uf_lh,
+ "uftdi_restore_port_state: failed");
+ }
+
+ return (rval);
+}
+
+
+/*
+ * create PM components
+ */
+static int
+uftdi_create_pm_components(uftdi_state_t *uf)
+{
+ dev_info_t *dip = uf->uf_dip;
+ uftdi_pm_t *pm;
+ uint_t pwr_states;
+
+ if (usb_create_pm_components(dip, &pwr_states) != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_PM, uf->uf_lh,
+ "uftdi_create_pm_components: failed");
+ return (USB_SUCCESS);
+ }
+
+ pm = uf->uf_pm = kmem_zalloc(sizeof (*pm), KM_SLEEP);
+
+ pm->pm_pwr_states = (uint8_t)pwr_states;
+ pm->pm_cur_power = USB_DEV_OS_FULL_PWR;
+ pm->pm_wakeup_enabled = usb_handle_remote_wakeup(dip,
+ USB_REMOTE_WAKEUP_ENABLE) == USB_SUCCESS;
+
+ (void) pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * destroy PM components
+ */
+static void
+uftdi_destroy_pm_components(uftdi_state_t *uf)
+{
+ uftdi_pm_t *pm = uf->uf_pm;
+ dev_info_t *dip = uf->uf_dip;
+ int rval;
+
+ if (!pm)
+ return;
+
+ if (uf->uf_dev_state != USB_DEV_DISCONNECTED) {
+ if (pm->pm_wakeup_enabled) {
+ rval = pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
+ if (rval != DDI_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_PM, uf->uf_lh,
+ "uftdi_destroy_pm_components: "
+ "raising power failed, rval=%d", rval);
+ }
+ rval = usb_handle_remote_wakeup(dip,
+ USB_REMOTE_WAKEUP_DISABLE);
+ if (rval != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_PM, uf->uf_lh,
+ "uftdi_destroy_pm_components: disable "
+ "remote wakeup failed, rval=%d", rval);
+ }
+ }
+ (void) pm_lower_power(dip, 0, USB_DEV_OS_PWR_OFF);
+ }
+ kmem_free(pm, sizeof (*pm));
+ uf->uf_pm = NULL;
+}
+
+
+/*
+ * mark device busy and raise power
+ */
+static int
+uftdi_pm_set_busy(uftdi_state_t *uf)
+{
+ uftdi_pm_t *pm = uf->uf_pm;
+ dev_info_t *dip = uf->uf_dip;
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_pm_set_busy");
+
+ if (!pm)
+ return (USB_SUCCESS);
+
+ mutex_enter(&uf->uf_lock);
+ /* if already marked busy, just increment the counter */
+ if (pm->pm_busy_cnt++ > 0) {
+ mutex_exit(&uf->uf_lock);
+ return (USB_SUCCESS);
+ }
+
+ rval = pm_busy_component(dip, 0);
+ ASSERT(rval == DDI_SUCCESS);
+
+ if (pm->pm_cur_power == USB_DEV_OS_FULL_PWR) {
+ mutex_exit(&uf->uf_lock);
+ return (USB_SUCCESS);
+ }
+
+ /* need to raise power */
+ pm->pm_raise_power = B_TRUE;
+ mutex_exit(&uf->uf_lock);
+
+ rval = pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
+ if (rval != DDI_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_PM, uf->uf_lh, "raising power failed");
+ }
+
+ mutex_enter(&uf->uf_lock);
+ pm->pm_raise_power = B_FALSE;
+ mutex_exit(&uf->uf_lock);
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * mark device idle
+ */
+static void
+uftdi_pm_set_idle(uftdi_state_t *uf)
+{
+ uftdi_pm_t *pm = uf->uf_pm;
+ dev_info_t *dip = uf->uf_dip;
+
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_pm_set_idle");
+
+ if (!pm)
+ return;
+
+ /*
+ * if more ports use the device, do not mark as yet
+ */
+ mutex_enter(&uf->uf_lock);
+ if (--pm->pm_busy_cnt > 0) {
+ mutex_exit(&uf->uf_lock);
+ return;
+ }
+ (void) pm_idle_component(dip, 0);
+ mutex_exit(&uf->uf_lock);
+}
+
+
+/*
+ * Functions to handle power transition for OS levels 0 -> 3
+ * The same level as OS state, different from USB state
+ */
+static int
+uftdi_pwrlvl0(uftdi_state_t *uf)
+{
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_pwrlvl0");
+
+ switch (uf->uf_dev_state) {
+ case USB_DEV_ONLINE:
+ /* issue USB D3 command to the device */
+ rval = usb_set_device_pwrlvl3(uf->uf_dip);
+ ASSERT(rval == USB_SUCCESS);
+
+ uf->uf_dev_state = USB_DEV_PWRED_DOWN;
+ uf->uf_pm->pm_cur_power = USB_DEV_OS_PWR_OFF;
+
+ /*FALLTHROUGH*/
+ case USB_DEV_DISCONNECTED:
+ case USB_DEV_SUSPENDED:
+ /* allow a disconnect/cpr'ed device to go to lower power */
+ return (USB_SUCCESS);
+ case USB_DEV_PWRED_DOWN:
+ default:
+ USB_DPRINTF_L2(DPRINT_PM, uf->uf_lh,
+ "uftdi_pwrlvl0: illegal device state");
+ return (USB_FAILURE);
+ }
+}
+
+
+static int
+uftdi_pwrlvl1(uftdi_state_t *uf)
+{
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_pwrlvl1");
+
+ /* issue USB D2 command to the device */
+ (void) usb_set_device_pwrlvl2(uf->uf_dip);
+ return (USB_FAILURE);
+}
+
+
+static int
+uftdi_pwrlvl2(uftdi_state_t *uf)
+{
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_pwrlvl2");
+
+ /* issue USB D1 command to the device */
+ (void) usb_set_device_pwrlvl1(uf->uf_dip);
+ return (USB_FAILURE);
+}
+
+
+static int
+uftdi_pwrlvl3(uftdi_state_t *uf)
+{
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_PM, uf->uf_lh, "uftdi_pwrlvl3");
+
+ switch (uf->uf_dev_state) {
+ case USB_DEV_PWRED_DOWN:
+ /* Issue USB D0 command to the device here */
+ rval = usb_set_device_pwrlvl0(uf->uf_dip);
+ ASSERT(rval == USB_SUCCESS);
+
+ uf->uf_dev_state = USB_DEV_ONLINE;
+ uf->uf_pm->pm_cur_power = USB_DEV_OS_FULL_PWR;
+
+ /*FALLTHROUGH*/
+ case USB_DEV_ONLINE:
+ /* we are already in full power */
+
+ /*FALLTHROUGH*/
+ case USB_DEV_DISCONNECTED:
+ case USB_DEV_SUSPENDED:
+ return (USB_SUCCESS);
+ default:
+ USB_DPRINTF_L2(DPRINT_PM, uf->uf_lh,
+ "uftdi_pwrlvl3: illegal device state");
+ return (USB_FAILURE);
+ }
+}
+
+
+/*
+ * pipe operations
+ */
+static int
+uftdi_open_pipes(uftdi_state_t *uf)
+{
+ int ifc, alt;
+ usb_pipe_policy_t policy;
+ usb_ep_data_t *in_data, *out_data;
+
+ /* get ep data */
+ ifc = uf->uf_dev_data->dev_curr_if;
+ alt = 0;
+
+ in_data = usb_lookup_ep_data(uf->uf_dip, uf->uf_dev_data, ifc, alt,
+ 0, USB_EP_ATTR_BULK, USB_EP_DIR_IN);
+
+ out_data = usb_lookup_ep_data(uf->uf_dip, uf->uf_dev_data, ifc, alt,
+ 0, USB_EP_ATTR_BULK, USB_EP_DIR_OUT);
+
+ if (in_data == NULL || out_data == NULL) {
+ USB_DPRINTF_L2(DPRINT_ATTACH, uf->uf_lh,
+ "uftdi_open_pipes: can't get ep data");
+ return (USB_FAILURE);
+ }
+
+ /* open pipes */
+ policy.pp_max_async_reqs = 2;
+
+ if (usb_pipe_open(uf->uf_dip, &in_data->ep_descr, &policy,
+ USB_FLAGS_SLEEP, &uf->uf_bulkin_ph) != USB_SUCCESS)
+ return (USB_FAILURE);
+
+ if (usb_pipe_open(uf->uf_dip, &out_data->ep_descr, &policy,
+ USB_FLAGS_SLEEP, &uf->uf_bulkout_ph) != USB_SUCCESS) {
+ usb_pipe_close(uf->uf_dip, uf->uf_bulkin_ph, USB_FLAGS_SLEEP,
+ NULL, NULL);
+ return (USB_FAILURE);
+ }
+
+ mutex_enter(&uf->uf_lock);
+ uf->uf_bulkin_state = UFTDI_PIPE_IDLE;
+ uf->uf_bulkout_state = UFTDI_PIPE_IDLE;
+ mutex_exit(&uf->uf_lock);
+
+ return (USB_SUCCESS);
+}
+
+
+static void
+uftdi_close_pipes(uftdi_state_t *uf)
+{
+ if (uf->uf_bulkin_ph)
+ usb_pipe_close(uf->uf_dip, uf->uf_bulkin_ph,
+ USB_FLAGS_SLEEP, 0, 0);
+ if (uf->uf_bulkout_ph)
+ usb_pipe_close(uf->uf_dip, uf->uf_bulkout_ph,
+ USB_FLAGS_SLEEP, 0, 0);
+
+ mutex_enter(&uf->uf_lock);
+ uf->uf_bulkin_state = UFTDI_PIPE_CLOSED;
+ uf->uf_bulkout_state = UFTDI_PIPE_CLOSED;
+ mutex_exit(&uf->uf_lock);
+}
+
+
+static void
+uftdi_disconnect_pipes(uftdi_state_t *uf)
+{
+ uftdi_close_pipes(uf);
+}
+
+
+static int
+uftdi_reconnect_pipes(uftdi_state_t *uf)
+{
+ return (uftdi_open_pipes(uf));
+}
+
+/*
+ * bulk in pipe normal and exception callback handler
+ */
+/*ARGSUSED*/
+static void
+uftdi_bulkin_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)req->bulk_client_private;
+ mblk_t *data;
+ int data_len;
+ int notify = 0;
+
+ data = req->bulk_data;
+ data_len = data ? MBLKL(data) : 0;
+
+ /*
+ * The first two bytes of data are actually status register bytes
+ * that arrive with every packet from the device. Strip
+ * them here before handing the data on. Note that the device
+ * will send us these bytes at least every 40 milliseconds,
+ * even if there's no data ..
+ */
+ if (req->bulk_completion_reason == USB_CR_OK && data_len >= 2) {
+ uint8_t msr = FTDI_GET_MSR(data->b_rptr);
+ uint8_t lsr = FTDI_GET_LSR(data->b_rptr);
+
+ mutex_enter(&uf->uf_lock);
+ if (uf->uf_msr != msr ||
+ (uf->uf_lsr & FTDI_LSR_MASK) != (lsr & FTDI_LSR_MASK)) {
+ USB_DPRINTF_L3(DPRINT_IN_PIPE, uf->uf_lh,
+ "uftdi_bulkin_cb: status change "
+ "0x%02x.0x%02x, was 0x%02x.0x%02x",
+ msr, lsr, uf->uf_msr, uf->uf_lsr);
+ uf->uf_msr = msr;
+ uf->uf_lsr = lsr;
+ /*
+ * If we're waiting for a modem status change,
+ * sending an empty message will cause us to
+ * reexamine the modem flags.
+ */
+ notify = 1;
+ }
+ mutex_exit(&uf->uf_lock);
+
+ data_len -= 2;
+ data->b_rptr += 2;
+ }
+
+ notify |= (data_len > 0);
+
+ USB_DPRINTF_L4(DPRINT_IN_PIPE, uf->uf_lh, "uftdi_bulkin_cb: "
+ "cr=%d len=%d", req->bulk_completion_reason, data_len);
+
+ /* save data and notify GSD */
+ if (notify && uf->uf_port_state == UFTDI_PORT_OPEN &&
+ req->bulk_completion_reason == USB_CR_OK) {
+ req->bulk_data = NULL;
+ uftdi_put_tail(&uf->uf_rx_mp, data);
+ if (uf->uf_cb.cb_rx)
+ uf->uf_cb.cb_rx(uf->uf_cb.cb_arg);
+ }
+
+ usb_free_bulk_req(req);
+
+ /* receive more */
+ mutex_enter(&uf->uf_lock);
+ uf->uf_bulkin_state = UFTDI_PIPE_IDLE;
+ if (uf->uf_port_state == UFTDI_PORT_OPEN &&
+ uf->uf_dev_state == USB_DEV_ONLINE) {
+ if (uftdi_rx_start(uf) != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_IN_PIPE, uf->uf_lh,
+ "uftdi_bulkin_cb: restart rx fail");
+ }
+ }
+ mutex_exit(&uf->uf_lock);
+}
+
+
+/*
+ * bulk out common and exception callback
+ */
+/*ARGSUSED*/
+static void
+uftdi_bulkout_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
+{
+ uftdi_state_t *uf = (uftdi_state_t *)req->bulk_client_private;
+ int data_len;
+ mblk_t *data = req->bulk_data;
+
+ data_len = data ? MBLKL(data) : 0;
+
+ USB_DPRINTF_L4(DPRINT_OUT_PIPE, uf->uf_lh,
+ "uftdi_bulkout_cb: cr=%d len=%d",
+ req->bulk_completion_reason, data_len);
+
+ if (uf->uf_port_state == UFTDI_PORT_OPEN &&
+ req->bulk_completion_reason && data_len > 0) {
+ uftdi_put_head(&uf->uf_tx_mp, data);
+ req->bulk_data = NULL;
+ }
+
+ usb_free_bulk_req(req);
+
+ /* notify GSD */
+ if (uf->uf_cb.cb_tx)
+ uf->uf_cb.cb_tx(uf->uf_cb.cb_arg);
+
+ /* send more */
+ mutex_enter(&uf->uf_lock);
+ uf->uf_bulkout_state = UFTDI_PIPE_IDLE;
+ if (uf->uf_tx_mp == NULL)
+ cv_broadcast(&uf->uf_tx_cv);
+ else
+ uftdi_tx_start(uf, NULL);
+ mutex_exit(&uf->uf_lock);
+}
+
+
+/*
+ * start receiving data
+ */
+static int
+uftdi_rx_start(uftdi_state_t *uf)
+{
+ usb_bulk_req_t *br;
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_OUT_PIPE, uf->uf_lh, "uftdi_rx_start");
+
+ ASSERT(mutex_owned(&uf->uf_lock));
+
+ uf->uf_bulkin_state = UFTDI_PIPE_BUSY;
+ mutex_exit(&uf->uf_lock);
+
+ br = usb_alloc_bulk_req(uf->uf_dip, uf->uf_xfer_sz, USB_FLAGS_SLEEP);
+ br->bulk_len = uf->uf_xfer_sz;
+ br->bulk_timeout = UFTDI_BULKIN_TIMEOUT;
+ br->bulk_cb = uftdi_bulkin_cb;
+ br->bulk_exc_cb = uftdi_bulkin_cb;
+ br->bulk_client_private = (usb_opaque_t)uf;
+ br->bulk_attributes = USB_ATTRS_AUTOCLEARING | USB_ATTRS_SHORT_XFER_OK;
+
+ rval = usb_pipe_bulk_xfer(uf->uf_bulkin_ph, br, 0);
+
+ if (rval != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_IN_PIPE, uf->uf_lh,
+ "uftdi_rx_start: xfer failed %d", rval);
+ usb_free_bulk_req(br);
+ }
+
+ mutex_enter(&uf->uf_lock);
+ if (rval != USB_SUCCESS)
+ uf->uf_bulkin_state = UFTDI_PIPE_IDLE;
+
+ return (rval);
+}
+
+
+/*
+ * start data transmit
+ */
+static void
+uftdi_tx_start(uftdi_state_t *uf, int *xferd)
+{
+ int len; /* bytes we can transmit */
+ mblk_t *data; /* data to be transmitted */
+ int data_len; /* bytes in 'data' */
+ mblk_t *mp; /* current msgblk */
+ int copylen; /* bytes copy from 'mp' to 'data' */
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_OUT_PIPE, uf->uf_lh, "uftdi_tx_start");
+ ASSERT(mutex_owned(&uf->uf_lock));
+ ASSERT(uf->uf_port_state != UFTDI_PORT_CLOSED);
+
+ if (xferd)
+ *xferd = 0;
+ if ((uf->uf_port_flags & UFTDI_PORT_TX_STOPPED) ||
+ uf->uf_tx_mp == NULL) {
+ return;
+ }
+ if (uf->uf_bulkout_state != UFTDI_PIPE_IDLE) {
+ USB_DPRINTF_L4(DPRINT_OUT_PIPE, uf->uf_lh,
+ "uftdi_tx_start: pipe busy");
+ return;
+ }
+ ASSERT(MBLKL(uf->uf_tx_mp) > 0);
+
+ /* send as much data as port can receive */
+ len = min(msgdsize(uf->uf_tx_mp), uf->uf_xfer_sz);
+
+ if (len <= 0)
+ return;
+ if ((data = allocb(len, BPRI_LO)) == NULL)
+ return;
+
+ /*
+ * copy no more than 'len' bytes from mblk chain to transmit mblk 'data'
+ */
+ data_len = 0;
+ while (data_len < len && uf->uf_tx_mp) {
+ mp = uf->uf_tx_mp;
+ copylen = min(MBLKL(mp), len - data_len);
+ bcopy(mp->b_rptr, data->b_wptr, copylen);
+ mp->b_rptr += copylen;
+ data->b_wptr += copylen;
+ data_len += copylen;
+
+ if (MBLKL(mp) < 1) {
+ uf->uf_tx_mp = unlinkb(mp);
+ freeb(mp);
+ } else {
+ ASSERT(data_len == len);
+ }
+ }
+
+ ASSERT(data_len > 0);
+
+ uf->uf_bulkout_state = UFTDI_PIPE_BUSY;
+ mutex_exit(&uf->uf_lock);
+
+ rval = uftdi_send_data(uf, data);
+ mutex_enter(&uf->uf_lock);
+
+ if (rval != USB_SUCCESS) {
+ uf->uf_bulkout_state = UFTDI_PIPE_IDLE;
+ uftdi_put_head(&uf->uf_tx_mp, data);
+ } else {
+ if (xferd)
+ *xferd = data_len;
+ }
+}
+
+
+static int
+uftdi_send_data(uftdi_state_t *uf, mblk_t *data)
+{
+ usb_bulk_req_t *br;
+ int len = MBLKL(data);
+ int rval;
+
+ USB_DPRINTF_L4(DPRINT_OUT_PIPE, uf->uf_lh,
+ "uftdi_send_data: %d 0x%x 0x%x 0x%x", len, data->b_rptr[0],
+ (len > 1) ? data->b_rptr[1] : 0, (len > 2) ? data->b_rptr[2] : 0);
+
+ ASSERT(!mutex_owned(&uf->uf_lock));
+
+ br = usb_alloc_bulk_req(uf->uf_dip, 0, USB_FLAGS_SLEEP);
+ br->bulk_data = data;
+ br->bulk_len = len;
+ br->bulk_timeout = UFTDI_BULKOUT_TIMEOUT;
+ br->bulk_cb = uftdi_bulkout_cb;
+ br->bulk_exc_cb = uftdi_bulkout_cb;
+ br->bulk_client_private = (usb_opaque_t)uf;
+ br->bulk_attributes = USB_ATTRS_AUTOCLEARING;
+
+ rval = usb_pipe_bulk_xfer(uf->uf_bulkout_ph, br, 0);
+
+ if (rval != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_OUT_PIPE, uf->uf_lh,
+ "uftdi_send_data: xfer failed %d", rval);
+ br->bulk_data = NULL;
+ usb_free_bulk_req(br);
+ }
+
+ return (rval);
+}
+
+
+/*
+ * wait until local tx buffer drains.
+ * 'timeout' is in seconds, zero means wait forever
+ */
+static int
+uftdi_wait_tx_drain(uftdi_state_t *uf, int timeout)
+{
+ clock_t until;
+ int over = 0;
+
+ until = ddi_get_lbolt() + drv_usectohz(1000 * 1000 * timeout);
+
+ while (uf->uf_tx_mp && !over) {
+ if (timeout > 0) {
+ /* whether timedout or signal pending */
+ over = cv_timedwait_sig(&uf->uf_tx_cv,
+ &uf->uf_lock, until) <= 0;
+ } else {
+ /* whether a signal is pending */
+ over = cv_wait_sig(&uf->uf_tx_cv,
+ &uf->uf_lock) == 0;
+ }
+ }
+
+ return (uf->uf_tx_mp == NULL ? USB_SUCCESS : USB_FAILURE);
+}
+
+/*
+ * initialize hardware serial port
+ */
+static int
+uftdi_open_hw_port(uftdi_state_t *uf, int portno, int dorestore)
+{
+ int rval;
+
+ /*
+ * Perform a full reset on the device
+ */
+ rval = uftdi_cmd_vendor_write0(uf,
+ FTDI_SIO_RESET, FTDI_SIO_RESET_SIO, portno);
+ if (rval != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_DEF_PIPE, uf->uf_lh,
+ "uftdi_open_hw_port: failed to reset!");
+ return (rval);
+ }
+
+ if (dorestore) {
+ /*
+ * Restore settings from our soft copy of HW registers
+ */
+ (void) uftdi_setregs(uf, portno, NULL);
+ } else {
+ /*
+ * 9600 baud, 2 stop bits, no parity, 8-bit, h/w flow control
+ */
+ static ds_port_param_entry_t ents[] = {
+#if defined(__lock_lint)
+ /*
+ * (Sigh - wlcc doesn't understand this newer
+ * form of structure member initialization.)
+ */
+ { 0 }
+#else
+ { DS_PARAM_BAUD, .val.ui = B9600 },
+ { DS_PARAM_STOPB, .val.ui = CSTOPB },
+ { DS_PARAM_PARITY, .val.ui = 0 },
+ { DS_PARAM_CHARSZ, .val.ui = CS8 },
+ { DS_PARAM_FLOW_CTL, .val.ui = CTSXON }
+#endif
+ };
+ static ds_port_params_t params = {
+ ents,
+ sizeof (ents) / sizeof (ents[0])
+ };
+
+ rval = uftdi_set_port_params(uf, portno, &params);
+ if (rval != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_DEF_PIPE, uf->uf_lh,
+ "uftdi_open_hw_port: failed 9600/2/n/8 rval %d",
+ rval);
+ }
+ }
+
+ return (rval);
+}
+
+static int
+uftdi_cmd_vendor_write0(uftdi_state_t *uf,
+ uint16_t reqno, uint16_t val, uint16_t idx)
+{
+ usb_ctrl_setup_t req;
+ usb_cb_flags_t cb_flags;
+ usb_cr_t cr;
+ int rval;
+
+ ASSERT(!mutex_owned(&uf->uf_lock));
+
+ req.bmRequestType =
+ USB_DEV_REQ_TYPE_VENDOR | USB_DEV_REQ_HOST_TO_DEV;
+ req.bRequest = (uchar_t)reqno;
+ req.wValue = val;
+ req.wIndex = idx;
+ req.wLength = 0;
+ req.attrs = USB_ATTRS_NONE;
+
+ if ((rval = usb_pipe_ctrl_xfer_wait(uf->uf_def_ph,
+ &req, NULL, &cr, &cb_flags, 0)) != USB_SUCCESS) {
+ USB_DPRINTF_L2(DPRINT_DEF_PIPE, uf->uf_lh,
+ "uftdi_cmd_vendor_write0: 0x%x 0x%x 0x%x failed %d %d 0x%x",
+ reqno, val, idx, rval, cr, cb_flags);
+ }
+
+ return (rval);
+}
+
+/*
+ * misc routines
+ */
+
+/*
+ * link a message block to tail of message
+ * account for the case when message is null
+ */
+static void
+uftdi_put_tail(mblk_t **mpp, mblk_t *bp)
+{
+ if (*mpp)
+ linkb(*mpp, bp);
+ else
+ *mpp = bp;
+}
+
+/*
+ * put a message block at the head of the message
+ * account for the case when message is null
+ */
+static void
+uftdi_put_head(mblk_t **mpp, mblk_t *bp)
+{
+ if (*mpp)
+ linkb(bp, *mpp);
+ *mpp = bp;
+}
+
+/*ARGSUSED*/
+static usb_pipe_handle_t
+uftdi_out_pipe(ds_hdl_t hdl, uint_t portno)
+{
+ return (((uftdi_state_t *)hdl)->uf_bulkout_ph);
+}
+
+/*ARGSUSED*/
+static usb_pipe_handle_t
+uftdi_in_pipe(ds_hdl_t hdl, uint_t portno)
+{
+ return (((uftdi_state_t *)hdl)->uf_bulkin_ph);
+}
diff --git a/usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbftdi.conf b/usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbftdi.conf
new file mode 100644
index 0000000000..9d0c6815c4
--- /dev/null
+++ b/usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbftdi.conf
@@ -0,0 +1,42 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Many devices using the FT232R chip are not "classic" serial port
+# modems at all - and for those devices, hardware designers seem
+# quite casual about configuring some of the modem status lines
+# - in particular carrier detect, which is often left floating.
+# Even "regular" serial ports are often 3-wire configurations.
+#
+# Given the usage is rarely as a fully-fledged modem, this configuration
+# file makes the default for the driver to ignore the state of the
+# carrier detect line; set this property to zero, or comment it out to
+# have the device provide full "modem" semantics
+#
+# Note that 'ignore-cd' applies to all ports supported by the driver
+# while the 'port-N-ignore-cd' applies only to port N
+#
+
+ignore-cd=1;
diff --git a/usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbser_uftdi.c b/usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbser_uftdi.c
new file mode 100644
index 0000000000..ee7329087e
--- /dev/null
+++ b/usr/src/uts/common/io/usb/clients/usbser/usbftdi/usbser_uftdi.c
@@ -0,0 +1,188 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * This driver supports FTDI FT232R USB-to-serial adapters. It is a
+ * device-specific driver (DSD) working with the USB generic serial
+ * driver (GSD) usbser.
+ *
+ * It implements the USB-to-serial device-specific driver interface (DSDI)
+ * which is exported by GSD. The DSDI is defined by ds_ops_t structure.
+ *
+ * Also may work with the older FTDI 8U232AM devices.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/stream.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#include <sys/usb/clients/usbser/usbser.h>
+#include <sys/usb/clients/usbser/usbftdi/uftdi_var.h>
+
+static void *usbser_uftdi_statep; /* soft state handle for usbser */
+
+extern ds_ops_t uftdi_ds_ops; /* DSD operations */
+
+static int
+usbser_uftdi_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
+ void **result)
+{
+ return (usbser_getinfo(dip, infocmd, arg, result, usbser_uftdi_statep));
+}
+
+
+static int
+usbser_uftdi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ return (usbser_attach(dip, cmd, usbser_uftdi_statep, &uftdi_ds_ops));
+}
+
+
+static int
+usbser_uftdi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ return (usbser_detach(dip, cmd, usbser_uftdi_statep));
+}
+
+
+static int
+usbser_uftdi_open(queue_t *rq, dev_t *dev, int flag, int sflag, cred_t *cr)
+{
+ return (usbser_open(rq, dev, flag, sflag, cr, usbser_uftdi_statep));
+}
+
+/*
+ * Several linked data structures to tie it together ..
+ */
+struct module_info uftdi_modinfo = {
+ 0, /* module id */
+ "uftdi", /* module name */
+ USBSER_MIN_PKTSZ, /* min pkt size */
+ USBSER_MAX_PKTSZ, /* max pkt size */
+ USBSER_HIWAT, /* hi watermark */
+ USBSER_LOWAT /* low watermark */
+};
+
+static struct qinit uftdi_rinit = {
+ putq,
+ usbser_rsrv,
+ usbser_uftdi_open,
+ usbser_close,
+ NULL,
+ &uftdi_modinfo,
+};
+
+static struct qinit uftdi_winit = {
+ usbser_wput,
+ usbser_wsrv,
+ NULL,
+ NULL,
+ NULL,
+ &uftdi_modinfo,
+};
+
+static struct streamtab uftdi_str_info = {
+ &uftdi_rinit,
+ &uftdi_winit,
+};
+
+static struct cb_ops uftdi_cb_ops = {
+ nodev, /* cb_open */
+ nodev, /* cb_close */
+ nodev, /* cb_strategy */
+ nodev, /* cb_print */
+ nodev, /* cb_dump */
+ nodev, /* cb_read */
+ nodev, /* cb_write */
+ nodev, /* cb_ioctl */
+ nodev, /* cb_devmap */
+ nodev, /* cb_mmap */
+ nodev, /* cb_segmap */
+ nochpoll, /* cb_chpoll */
+ ddi_prop_op, /* cb_prop_op */
+ &uftdi_str_info, /* cb_stream */
+ (int)(D_64BIT | D_NEW | D_MP | D_HOTPLUG) /* cb_flag */
+};
+
+static struct dev_ops uftdi_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ usbser_uftdi_getinfo,
+ nulldev, /* devo_identify */
+ nulldev, /* devo_probe */
+ usbser_uftdi_attach,
+ usbser_uftdi_detach,
+ nodev, /* devo_reset */
+ &uftdi_cb_ops,
+ (struct bus_ops *)NULL, /* devo_bus_ops */
+ usbser_power, /* devo_power */
+ ddi_quiesce_not_needed
+};
+
+static struct modldrv modldrv = {
+ &mod_driverops,
+ "FTDI FT232R USB UART driver",
+ &uftdi_ops,
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ &modldrv
+};
+
+int
+_init(void)
+{
+ int error;
+
+ if ((error = mod_install(&modlinkage)) != 0)
+ return (error);
+ if ((error = ddi_soft_state_init(&usbser_uftdi_statep,
+ usbser_soft_state_size(), 1)) != 0)
+ (void) mod_remove(&modlinkage);
+ return (error);
+}
+
+
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&modlinkage)) == 0)
+ ddi_soft_state_fini(&usbser_uftdi_statep);
+ return (error);
+}
+
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
diff --git a/usr/src/uts/common/io/usb/clients/usbser/usbsacm/usbsacm.c b/usr/src/uts/common/io/usb/clients/usbser/usbsacm/usbsacm.c
index 8816fb98f0..d502ae26bc 100644
--- a/usr/src/uts/common/io/usb/clients/usbser/usbsacm/usbsacm.c
+++ b/usr/src/uts/common/io/usb/clients/usbser/usbsacm/usbsacm.c
@@ -18,12 +18,12 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-
/*
* USB Serial CDC ACM driver
*
@@ -466,7 +466,8 @@ static int usbsacm_speedtab[] = {
153600, /* B153600 */
230400, /* B230400 */
307200, /* B307200 */
- 460800 /* B460800 */
+ 460800, /* B460800 */
+ 921600 /* B921600 */
};
diff --git a/usr/src/uts/common/io/usb/clients/usbser/usbser.c b/usr/src/uts/common/io/usb/clients/usbser/usbser.c
index c817959f46..a7535b26c2 100644
--- a/usr/src/uts/common/io/usb/clients/usbser/usbser.c
+++ b/usr/src/uts/common/io/usb/clients/usbser/usbser.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -2622,18 +2622,18 @@ usbser_ioctl(usbser_port_t *pp, mblk_t *mp)
error = -1;
usbser_serialize_port_act(pp, USBSER_ACT_CTL);
mutex_exit(&pp->port_mutex);
-
break;
+
case TCSBRK:
/* serialize breaks */
- if (pp->port_act & USBSER_ACT_BREAK) {
-
+ if (pp->port_act & USBSER_ACT_BREAK)
return (USB_FAILURE);
- }
+ /*FALLTHRU*/
default:
usbser_serialize_port_act(pp, USBSER_ACT_CTL);
mutex_exit(&pp->port_mutex);
(void) ttycommon_ioctl(tp, q, mp, &error);
+ break;
}
if (error == 0) {
@@ -2648,21 +2648,19 @@ usbser_ioctl(usbser_port_t *pp, mblk_t *mp)
case TCSETAW:
case TCSETAF:
(void) USBSER_DS_FIFO_DRAIN(pp, DS_TX);
+ /*FALLTHRU*/
- /* FALLTHRU */
case TCSETS:
mutex_enter(&pp->port_mutex);
error = usbser_port_program(pp);
mutex_exit(&pp->port_mutex);
-
break;
}
-
goto end;
+
} else if (error > 0) {
USB_DPRINTF_L3(DPRINT_IOCTL, pp->port_lh, "usbser_ioctl: "
"ttycommon_ioctl returned %d", error);
-
goto end;
}
@@ -2672,55 +2670,53 @@ usbser_ioctl(usbser_port_t *pp, mblk_t *mp)
error = 0;
switch (cmd) {
case TCSBRK:
- if ((error = miocpullup(mp, sizeof (int))) != 0) {
-
+ if ((error = miocpullup(mp, sizeof (int))) != 0)
break;
- }
+
/* drain output */
(void) USBSER_DS_FIFO_DRAIN(pp, USBSER_TX_FIFO_DRAIN_TIMEOUT);
+
/*
* if required, set break
*/
if (*(int *)mp->b_cont->b_rptr == 0) {
if (USBSER_DS_BREAK_CTL(pp, DS_ON) != USB_SUCCESS) {
error = EIO;
-
break;
}
+
mutex_enter(&pp->port_mutex);
pp->port_act |= USBSER_ACT_BREAK;
pp->port_delay_id = timeout(usbser_restart, pp,
drv_usectohz(250000));
mutex_exit(&pp->port_mutex);
}
-
+ mioc2ack(mp, NULL, 0, 0);
break;
- case TIOCSBRK:
- /* set break */
- if (USBSER_DS_BREAK_CTL(pp, DS_ON) != USB_SUCCESS) {
- error = EIO;
- }
- break;
- case TIOCCBRK:
- /* clear break */
- if (USBSER_DS_BREAK_CTL(pp, DS_OFF) != USB_SUCCESS) {
+ case TIOCSBRK: /* set break */
+ if (USBSER_DS_BREAK_CTL(pp, DS_ON) != USB_SUCCESS)
error = EIO;
- }
+ else
+ mioc2ack(mp, NULL, 0, 0);
+ break;
+ case TIOCCBRK: /* clear break */
+ if (USBSER_DS_BREAK_CTL(pp, DS_OFF) != USB_SUCCESS)
+ error = EIO;
+ else
+ mioc2ack(mp, NULL, 0, 0);
break;
- case TIOCMSET:
- case TIOCMBIS:
- case TIOCMBIC:
+
+ case TIOCMSET: /* set all modem bits */
+ case TIOCMBIS: /* bis modem bits */
+ case TIOCMBIC: /* bic modem bits */
if (iocp->ioc_count == TRANSPARENT) {
mcopyin(mp, NULL, sizeof (int), NULL);
-
break;
}
- if ((error = miocpullup(mp, sizeof (int))) != 0) {
-
+ if ((error = miocpullup(mp, sizeof (int))) != 0)
break;
- }
val = *(int *)mp->b_cont->b_rptr;
if (cmd == TIOCMSET) {
@@ -2730,97 +2726,75 @@ usbser_ioctl(usbser_port_t *pp, mblk_t *mp)
} else if (cmd == TIOCMBIC) {
rval = USBSER_DS_SET_MODEM_CTL(pp, val, 0);
}
- if (rval != USB_SUCCESS) {
+ if (rval == USB_SUCCESS)
+ mioc2ack(mp, NULL, 0, 0);
+ else
error = EIO;
- }
-
break;
- case (tIOC | 109): /* TIOCSILOOP */
+
+ case TIOCSILOOP:
if (USBSER_DS_LOOPBACK_SUPPORTED(pp)) {
- if (USBSER_DS_LOOPBACK(pp, DS_ON) != USB_SUCCESS) {
+ if (USBSER_DS_LOOPBACK(pp, DS_ON) == USB_SUCCESS)
+ mioc2ack(mp, NULL, 0, 0);
+ else
error = EIO;
- } else {
- iocp->ioc_error = 0;
- mp->b_datap->db_type = M_IOCACK;
- }
} else {
error = EINVAL;
}
-
break;
- case (tIOC | 108): /* TIOCCILOOP */
+
+ case TIOCCILOOP:
if (USBSER_DS_LOOPBACK_SUPPORTED(pp)) {
- if (USBSER_DS_LOOPBACK(pp, DS_OFF) != USB_SUCCESS) {
+ if (USBSER_DS_LOOPBACK(pp, DS_OFF) == USB_SUCCESS)
+ mioc2ack(mp, NULL, 0, 0);
+ else
error = EIO;
- } else {
- iocp->ioc_error = 0;
- mp->b_datap->db_type = M_IOCACK;
- }
} else {
error = EINVAL;
}
-
break;
- case TIOCMGET:
- datamp = allocb(sizeof (int), BPRI_MED);
- if (datamp == NULL) {
- error = EAGAIN;
+ case TIOCMGET: /* get all modem bits */
+ if ((datamp = allocb(sizeof (int), BPRI_MED)) == NULL) {
+ error = EAGAIN;
break;
}
-
rval = USBSER_DS_GET_MODEM_CTL(pp, -1, (int *)datamp->b_rptr);
if (rval != USB_SUCCESS) {
error = EIO;
-
break;
}
-
- if (iocp->ioc_count == TRANSPARENT) {
+ if (iocp->ioc_count == TRANSPARENT)
mcopyout(mp, NULL, sizeof (int), NULL, datamp);
- } else {
- if (mp->b_cont != NULL) {
- freemsg(mp->b_cont);
- }
- mp->b_cont = datamp;
- mp->b_cont->b_wptr += sizeof (int);
- iocp->ioc_count = sizeof (int);
- }
-
+ else
+ mioc2ack(mp, datamp, sizeof (int), 0);
break;
+
case CONSOPENPOLLEDIO:
error = usbser_polledio_init(pp);
if (error != 0)
-
break;
error = miocpullup(mp, sizeof (struct cons_polledio *));
if (error != 0)
-
break;
*(struct cons_polledio **)mp->b_cont->b_rptr = &usbser_polledio;
-
- mp->b_datap->db_type = M_IOCACK;
-
+ mioc2ack(mp, NULL, 0, 0);
break;
+
case CONSCLOSEPOLLEDIO:
usbser_polledio_fini(pp);
- mp->b_datap->db_type = M_IOCACK;
- mp->b_datap->db_type = M_IOCACK;
- iocp->ioc_error = 0;
- iocp->ioc_rval = 0;
-
+ mioc2ack(mp, NULL, 0, 0);
break;
+
case CONSSETABORTENABLE:
error = secpolicy_console(iocp->ioc_cr);
if (error != 0)
-
break;
if (iocp->ioc_count != TRANSPARENT) {
error = EINVAL;
-
break;
}
@@ -2836,12 +2810,9 @@ usbser_ioctl(usbser_port_t *pp, mblk_t *mp)
usbser_console_abort = 1;
else
usbser_console_abort = 0;
-
- mp->b_datap->db_type = M_IOCACK;
- iocp->ioc_error = 0;
- iocp->ioc_rval = 0;
-
+ mioc2ack(mp, NULL, 0, 0);
break;
+
case CONSGETABORTENABLE:
/*CONSTANTCONDITION*/
ASSERT(sizeof (boolean_t) <= sizeof (boolean_t *));
@@ -2851,19 +2822,18 @@ usbser_ioctl(usbser_port_t *pp, mblk_t *mp)
*/
mcopyout(mp, NULL, sizeof (boolean_t), NULL, NULL);
*(boolean_t *)mp->b_cont->b_rptr = (usbser_console_abort != 0);
-
+ mioc2ack(mp, NULL, 0, 0);
break;
+
default:
error = EINVAL;
-
break;
}
end:
- if (error != 0) {
- iocp->ioc_error = error;
- mp->b_datap->db_type = M_IOCNAK;
- }
- qreply(q, mp);
+ if (error != 0)
+ miocnak(q, mp, 0, error);
+ else
+ qreply(q, mp);
mutex_enter(&pp->port_mutex);
usbser_release_port_act(pp, USBSER_ACT_CTL);
@@ -2880,7 +2850,6 @@ usbser_iocdata(usbser_port_t *pp, mblk_t *mp)
{
tty_common_t *tp = &pp->port_ttycommon;
queue_t *q = tp->t_writeq;
- struct iocblk *ip;
struct copyresp *csp;
int cmd;
int val;
@@ -2888,31 +2857,28 @@ usbser_iocdata(usbser_port_t *pp, mblk_t *mp)
ASSERT(mutex_owned(&pp->port_mutex));
- ip = (struct iocblk *)mp->b_rptr;
csp = (struct copyresp *)mp->b_rptr;
cmd = csp->cp_cmd;
if (csp->cp_rval != 0) {
freemsg(mp);
-
return;
}
switch (cmd) {
- case TIOCMSET:
- case TIOCMBIS:
- case TIOCMBIC:
+ case TIOCMSET: /* set all modem bits */
+ case TIOCMBIS: /* bis modem bits */
+ case TIOCMBIC: /* bic modem bits */
if ((mp->b_cont == NULL) ||
(MBLKL(mp->b_cont) < sizeof (int))) {
miocnak(q, mp, 0, EINVAL);
-
break;
}
val = *(int *)mp->b_cont->b_rptr;
usbser_serialize_port_act(pp, USBSER_ACT_CTL);
-
mutex_exit(&pp->port_mutex);
+
if (cmd == TIOCMSET) {
rval = USBSER_DS_SET_MODEM_CTL(pp, -1, val);
} else if (cmd == TIOCMBIS) {
@@ -2925,33 +2891,26 @@ usbser_iocdata(usbser_port_t *pp, mblk_t *mp)
freemsg(mp->b_cont);
mp->b_cont = NULL;
}
- ip->ioc_rval = 0;
- if (rval == USB_SUCCESS) {
+
+ if (rval == USB_SUCCESS)
miocack(q, mp, 0, 0);
- } else {
+ else
miocnak(q, mp, 0, EIO);
- }
- mutex_enter(&pp->port_mutex);
+ mutex_enter(&pp->port_mutex);
usbser_release_port_act(pp, USBSER_ACT_CTL);
-
break;
- case TIOCMGET:
+
+ case TIOCMGET: /* get all modem bits */
mutex_exit(&pp->port_mutex);
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
- ip->ioc_rval = 0;
miocack(q, mp, 0, 0);
mutex_enter(&pp->port_mutex);
-
break;
+
default:
mutex_exit(&pp->port_mutex);
miocnak(q, mp, 0, EINVAL);
mutex_enter(&pp->port_mutex);
-
break;
}
}
@@ -3291,7 +3250,7 @@ usbser_inbound_flow_ctl(usbser_port_t *pp)
* ----
*
*
- * returns !=0 if device is online, 0 otherwise
+ * returns != 0 if device is online, 0 otherwise
*/
static int
usbser_dev_is_online(usbser_state_t *usp)
@@ -3311,10 +3270,8 @@ usbser_dev_is_online(usbser_state_t *usp)
static void
usbser_serialize_port_act(usbser_port_t *pp, int act)
{
- while (pp->port_act & act) {
+ while (pp->port_act & act)
cv_wait(&pp->port_act_cv, &pp->port_mutex);
- }
-
pp->port_act |= act;
}
@@ -3385,8 +3342,8 @@ usbser_ioctl2str(int ioctl)
case TIOCMBIS: str = "TIOCMBIS"; break;
case TIOCMBIC: str = "TIOCMBIC"; break;
case TIOCMGET: str = "TIOCMGET"; break;
- case (tIOC | 109): str = "TIOCSILOOP"; break;
- case (tIOC | 108): str = "TIOCCILOOP"; break;
+ case TIOCSILOOP: str = "TIOCSILOOP"; break;
+ case TIOCCILOOP: str = "TIOCCILOOP"; break;
case TCGETX: str = "TCGETX"; break;
case TCSETX: str = "TCGETX"; break;
case TCSETXW: str = "TCGETX"; break;
@@ -3411,13 +3368,11 @@ usbser_polledio_init(usbser_port_t *pp)
/* only one serial line console supported */
if (console_input != NULL)
-
return (USB_FAILURE);
/* check if underlying driver supports polled io */
if (ds_ops->ds_version < DS_OPS_VERSION_V1 ||
ds_ops->ds_out_pipe == NULL || ds_ops->ds_in_pipe == NULL)
-
return (USB_FAILURE);
/* init polled input pipe */
@@ -3425,7 +3380,6 @@ usbser_polledio_init(usbser_port_t *pp)
err = usb_console_input_init(pp->port_usp->us_dip, hdl,
&console_input_buf, &console_input);
if (err)
-
return (USB_FAILURE);
/* init polled output pipe */
@@ -3435,7 +3389,6 @@ usbser_polledio_init(usbser_port_t *pp)
if (err) {
(void) usb_console_input_fini(console_input);
console_input = NULL;
-
return (USB_FAILURE);
}
@@ -3495,12 +3448,10 @@ usbser_ischar(cons_polledio_arg_t arg)
uint_t num_bytes;
if (console_input_start < console_input_end)
-
- return (1);
+ return (B_TRUE);
if (usb_console_read(console_input, &num_bytes) != USB_SUCCESS)
-
- return (0);
+ return (B_FALSE);
console_input_start = console_input_buf;
console_input_end = console_input_buf + num_bytes;
diff --git a/usr/src/uts/common/io/usb/inc.flg b/usr/src/uts/common/io/usb/inc.flg
index 8a72f8a4da..9e950e4f5c 100644
--- a/usr/src/uts/common/io/usb/inc.flg
+++ b/usr/src/uts/common/io/usb/inc.flg
@@ -18,9 +18,9 @@
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
+
#
-#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -79,6 +79,7 @@ find_files "s.*" \
usr/src/uts/sparc/mixer \
usr/src/uts/sparc/amsrc2 \
usr/src/uts/sparc/ugen \
+ usr/src/uts/sparc/usbftdi \
usr/src/uts/sparc/usbser \
usr/src/uts/sparc/usbsksp \
usr/src/uts/sparc/usbsprl \
@@ -113,6 +114,7 @@ find_files "s.*" \
usr/src/uts/intel/mixer \
usr/src/uts/intel/amsrc2 \
usr/src/uts/intel/ugen \
+ usr/src/uts/intel/usbftdi \
usr/src/uts/intel/usbser \
usr/src/uts/intel/usbsksp \
usr/src/uts/intel/usbsprl \
diff --git a/usr/src/uts/common/io/usb/usbdevs b/usr/src/uts/common/io/usb/usbdevs
new file mode 100644
index 0000000000..80318fed78
--- /dev/null
+++ b/usr/src/uts/common/io/usb/usbdevs
@@ -0,0 +1,2515 @@
+SRC/uts/common/io/usb/usbdevs
+
+/* $FreeBSD: usbdevs,v 1.383 2008/11/12 13:58:59 keramida Exp $ */
+
+/* $NetBSD: usbdevs,v 1.392 2004/12/29 08:38:44 imp Exp $ */
+
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Copyright (c) 1998-2004 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Lennart Augustsson (lennart@augustsson.net) at
+ * Carlstedt Research & Technology.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * List of known USB vendors
+ *
+ * Please note that these IDs do not do anything. Adding an ID here and
+ * regenerating usbdevs.h only makes a symbolic name
+ * available to the source code and does not change any functionality, nor
+ * does it make your device available to a specific driver.
+ *
+ * After adding a vendor ID VNDR and a product ID PRDCT you will have the
+ * following extra defines:
+ * #define USB_VENDOR_VNDR 0x????
+ * #define USB_PRODUCT_VNDR_PRDCT 0x????
+ *
+ * You may have to add these defines to the respective probe routines to
+ * make the device recognised by the appropriate device driver.
+ *
+ * You may have to add these definitions to the driver aliases mechanism
+ * for the device to be discovered by the driver.
+ */
+
+vendor UNKNOWN1 0x0053 Unknown vendor
+vendor UNKNOWN2 0x0105 Unknown vendor
+vendor EGALAX2 0x0123 eGalax, Inc.
+vendor HUMAX 0x02ad HUMAX
+vendor LTS 0x0386 LTS
+vendor BWCT 0x03da Bernd Walter Computer Technology
+vendor AOX 0x03e8 AOX
+vendor THESYS 0x03e9 Thesys
+vendor DATABROADCAST 0x03ea Data Broadcasting
+vendor ATMEL 0x03eb Atmel
+vendor IWATSU 0x03ec Iwatsu America
+vendor MITSUMI 0x03ee Mitsumi
+vendor HP 0x03f0 Hewlett Packard
+vendor GENOA 0x03f1 Genoa
+vendor OAK 0x03f2 Oak
+vendor ADAPTEC 0x03f3 Adaptec
+vendor DIEBOLD 0x03f4 Diebold
+vendor SIEMENSELECTRO 0x03f5 Siemens Electromechanical
+vendor EPSONIMAGING 0x03f8 Epson Imaging
+vendor KEYTRONIC 0x03f9 KeyTronic
+vendor OPTI 0x03fb OPTi
+vendor ELITEGROUP 0x03fc Elitegroup
+vendor XILINX 0x03fd Xilinx
+vendor FARALLON 0x03fe Farallon Communications
+vendor NATIONAL 0x0400 National Semiconductor
+vendor NATIONALREG 0x0401 National Registry
+vendor ACERLABS 0x0402 Acer Labs
+vendor FTDI 0x0403 Future Technology Devices
+vendor NCR 0x0404 NCR
+vendor SYNOPSYS2 0x0405 Synopsys
+vendor FUJITSUICL 0x0406 Fujitsu-ICL
+vendor FUJITSU2 0x0407 Fujitsu Personal Systems
+vendor QUANTA 0x0408 Quanta
+vendor NEC 0x0409 NEC
+vendor KODAK 0x040a Eastman Kodak
+vendor WELTREND 0x040b Weltrend
+vendor VIA 0x040d VIA
+vendor MCCI 0x040e MCCI
+vendor MELCO 0x0411 Melco
+vendor LEADTEK 0x0413 Leadtek
+vendor WINBOND 0x0416 Winbond
+vendor PHOENIX 0x041a Phoenix
+vendor CREATIVE 0x041e Creative Labs
+vendor NOKIA 0x0421 Nokia
+vendor ADI 0x0422 ADI Systems
+vendor CATC 0x0423 Computer Access Technology
+vendor SMC2 0x0424 Standard Microsystems
+vendor MOTOROLA_HK 0x0425 Motorola HK
+vendor GRAVIS 0x0428 Advanced Gravis Computer
+vendor CIRRUSLOGIC 0x0429 Cirrus Logic
+vendor INNOVATIVE 0x042c Innovative Semiconductors
+vendor MOLEX 0x042f Molex
+vendor SUN 0x0430 Sun Microsystems
+vendor UNISYS 0x0432 Unisys
+vendor TAUGA 0x0436 Taugagreining HF
+vendor AMD 0x0438 Advanced Micro Devices
+vendor LEXMARK 0x043d Lexmark International
+vendor LG 0x043e LG Electronics
+vendor NANAO 0x0440 NANAO
+vendor GATEWAY 0x0443 Gateway 2000
+vendor NMB 0x0446 NMB
+vendor ALPS 0x044e Alps Electric
+vendor THRUST 0x044f Thrustmaster
+vendor TI 0x0451 Texas Instruments
+vendor ANALOGDEVICES 0x0456 Analog Devices
+vendor SIS 0x0457 Silicon Integrated Systems Corp.
+vendor KYE 0x0458 KYE Systems
+vendor DIAMOND2 0x045a Diamond (Supra)
+vendor RENESAS 0x045b Renesas
+vendor MICROSOFT 0x045e Microsoft
+vendor PRIMAX 0x0461 Primax Electronics
+vendor MGE 0x0463 MGE UPS Systems
+vendor AMP 0x0464 AMP
+vendor CHERRY 0x046a Cherry Mikroschalter
+vendor MEGATRENDS 0x046b American Megatrends
+vendor LOGITECH 0x046d Logitech
+vendor BTC 0x046e Behavior Tech. Computer
+vendor PHILIPS 0x0471 Philips
+vendor SUN2 0x0472 Sun Microsystems (offical)
+vendor SANYO 0x0474 Sanyo Electric
+vendor SEAGATE 0x0477 Seagate
+vendor CONNECTIX 0x0478 Connectix
+vendor SEMTECH 0x047a Semtech
+vendor KENSINGTON 0x047d Kensington
+vendor LUCENT 0x047e Lucent
+vendor PLANTRONICS 0x047f Plantronics
+vendor KYOCERA 0x0482 Kyocera Wireless Corp.
+vendor STMICRO 0x0483 STMicroelectronics
+vendor FOXCONN 0x0489 Foxconn
+vendor YAMAHA 0x0499 YAMAHA
+vendor COMPAQ 0x049f Compaq
+vendor HITACHI 0x04a4 Hitachi
+vendor ACERP 0x04a5 Acer Peripherals
+vendor DAVICOM 0x04a6 Davicom
+vendor VISIONEER 0x04a7 Visioneer
+vendor CANON 0x04a9 Canon
+vendor NIKON 0x04b0 Nikon
+vendor PAN 0x04b1 Pan International
+vendor IBM 0x04b3 IBM
+vendor CYPRESS 0x04b4 Cypress Semiconductor
+vendor ROHM 0x04b5 ROHM
+vendor COMPAL 0x04b7 Compal
+vendor EPSON 0x04b8 Seiko Epson
+vendor RAINBOW 0x04b9 Rainbow Technologies
+vendor IODATA 0x04bb I-O Data
+vendor TDK 0x04bf TDK
+vendor 3COMUSR 0x04c1 U.S. Robotics
+vendor METHODE 0x04c2 Methode Electronics Far East
+vendor MAXISWITCH 0x04c3 Maxi Switch
+vendor LOCKHEEDMER 0x04c4 Lockheed Martin Energy Research
+vendor FUJITSU 0x04c5 Fujitsu
+vendor TOSHIBAAM 0x04c6 Toshiba America
+vendor MICROMACRO 0x04c7 Micro Macro Technologies
+vendor KONICA 0x04c8 Konica
+vendor LITEON 0x04ca Lite-On Technology
+vendor FUJIPHOTO 0x04cb Fuji Photo Film
+vendor PHILIPSSEMI 0x04cc Philips Semiconductors
+vendor TATUNG 0x04cd Tatung Co. Of America
+vendor SCANLOGIC 0x04ce ScanLogic
+vendor MYSON 0x04cf Myson Technology
+vendor DIGI2 0x04d0 Digi
+vendor ITTCANON 0x04d1 ITT Canon
+vendor ALTEC 0x04d2 Altec Lansing
+vendor LSI 0x04d4 LSI
+vendor MENTORGRAPHICS 0x04d6 Mentor Graphics
+vendor ITUNERNET 0x04d8 I-Tuner Networks
+vendor HOLTEK 0x04d9 Holtek Semiconductor, Inc.
+vendor PANASONIC 0x04da Panasonic (Matsushita)
+vendor HUANHSIN 0x04dc Huan Hsin
+vendor SHARP 0x04dd Sharp
+vendor IIYAMA 0x04e1 Iiyama
+vendor SHUTTLE 0x04e6 Shuttle Technology
+vendor ELO 0x04e7 Elo TouchSystems
+vendor SAMSUNG 0x04e8 Samsung Electronics
+vendor NORTHSTAR 0x04eb Northstar
+vendor TOKYOELECTRON 0x04ec Tokyo Electron
+vendor ANNABOOKS 0x04ed Annabooks
+vendor JVC 0x04f1 JVC
+vendor CHICONY 0x04f2 Chicony Electronics
+vendor ELAN 0x04f3 Elan
+vendor NEWNEX 0x04f7 Newnex
+vendor BROTHER 0x04f9 Brother Industries
+vendor DALLAS 0x04fa Dallas Semiconductor
+vendor SUNPLUS 0x04fc Sunplus
+vendor PFU 0x04fe PFU
+vendor FUJIKURA 0x0501 Fujikura/DDK
+vendor ACER 0x0502 Acer
+vendor 3COM 0x0506 3Com
+vendor HOSIDEN 0x0507 Hosiden Corporation
+vendor AZTECH 0x0509 Aztech Systems
+vendor BELKIN 0x050d Belkin Components
+vendor KAWATSU 0x050f Kawatsu Semiconductor
+vendor FCI 0x0514 FCI
+vendor LONGWELL 0x0516 Longwell
+vendor COMPOSITE 0x0518 Composite
+vendor STAR 0x0519 Star Micronics
+vendor APC 0x051d American Power Conversion
+vendor SCIATLANTA 0x051e Scientific Atlanta
+vendor TSM 0x0520 TSM
+vendor CONNECTEK 0x0522 Advanced Connectek USA
+vendor NETCHIP 0x0525 NetChip Technology
+vendor ALTRA 0x0527 ALTRA
+vendor ATI 0x0528 ATI Technologies
+vendor AKS 0x0529 Aladdin Knowledge Systems
+vendor TEKOM 0x052b Tekom
+vendor CANONDEV 0x052c Canon
+vendor WACOMTECH 0x0531 Wacom
+vendor INVENTEC 0x0537 Inventec
+vendor SHYHSHIUN 0x0539 Shyh Shiun Terminals
+vendor PREHWERKE 0x053a Preh Werke Gmbh & Co. KG
+vendor SYNOPSYS 0x053f Synopsys
+vendor UNIACCESS 0x0540 Universal Access
+vendor VIEWSONIC 0x0543 ViewSonic
+vendor XIRLINK 0x0545 Xirlink
+vendor ANCHOR 0x0547 Anchor Chips
+vendor SONY 0x054c Sony
+vendor FUJIXEROX 0x0550 Fuji Xerox
+vendor VISION 0x0553 VLSI Vision
+vendor ASAHIKASEI 0x0556 Asahi Kasei Microsystems
+vendor ATEN 0x0557 ATEN International
+vendor SAMSUNG2 0x055d Samsung Electronics
+vendor MUSTEK 0x055f Mustek Systems
+vendor TELEX 0x0562 Telex Communications
+vendor CHINON 0x0564 Chinon
+vendor PERACOM 0x0565 Peracom Networks
+vendor ALCOR2 0x0566 Alcor Micro
+vendor XYRATEX 0x0567 Xyratex
+vendor WACOM 0x056a WACOM
+vendor ETEK 0x056c e-TEK Labs
+vendor EIZO 0x056d EIZO
+vendor ELECOM 0x056e Elecom
+vendor CONEXANT 0x0572 Conexant
+vendor HAUPPAUGE 0x0573 Hauppauge Computer Works
+vendor BAFO 0x0576 BAFO/Quality Computer Accessories
+vendor YEDATA 0x057b Y-E Data
+vendor AVM 0x057c AVM
+vendor QUICKSHOT 0x057f Quickshot
+vendor ROLAND 0x0582 Roland
+vendor ROCKFIRE 0x0583 Rockfire
+vendor RATOC 0x0584 RATOC Systems
+vendor ZYXEL 0x0586 ZyXEL Communication
+vendor INFINEON 0x058b Infineon
+vendor MICREL 0x058d Micrel
+vendor ALCOR 0x058f Alcor Micro
+vendor OMRON 0x0590 OMRON
+vendor ZORAN 0x0595 Zoran Microelectronics
+vendor NIIGATA 0x0598 Niigata
+vendor IOMEGA 0x059b Iomega
+vendor ATREND 0x059c A-Trend Technology
+vendor AID 0x059d Advanced Input Devices
+vendor LACIE 0x059f LaCie
+vendor FUJIFILM 0x05a2 Fuji Film
+vendor ARC 0x05a3 ARC
+vendor ORTEK 0x05a4 Ortek
+vendor BOSE 0x05a7 Bose
+vendor OMNIVISION 0x05a9 OmniVision
+vendor INSYSTEM 0x05ab In-System Design
+vendor APPLE 0x05ac Apple Computer
+vendor YCCABLE 0x05ad Y.C. Cable
+vendor DIGITALPERSONA 0x05ba DigitalPersona
+vendor 3G 0x05bc 3G Green Green Globe
+vendor RAFI 0x05bd RAFI
+vendor TYCO 0x05be Tyco
+vendor KAWASAKI 0x05c1 Kawasaki
+vendor DIGI 0x05c5 Digi International
+vendor QUALCOMM2 0x05c6 Qualcomm
+vendor QTRONIX 0x05c7 Qtronix
+vendor FOXLINK 0x05c8 Foxlink
+vendor RICOH 0x05ca Ricoh
+vendor ELSA 0x05cc ELSA
+vendor SCIWORX 0x05ce sci-worx
+vendor BRAINBOXES 0x05d1 Brainboxes Limited
+vendor ULTIMA 0x05d8 Ultima
+vendor AXIOHM 0x05d9 Axiohm Transaction Solutions
+vendor MICROTEK 0x05da Microtek
+vendor SUNTAC 0x05db SUN Corporation
+vendor LEXAR 0x05dc Lexar Media
+vendor ADDTRON 0x05dd Addtron
+vendor SYMBOL 0x05e0 Symbol Technologies
+vendor SYNTEK 0x05e1 Syntek
+vendor GENESYS 0x05e3 Genesys Logic
+vendor FUJI 0x05e5 Fuji Electric
+vendor KEITHLEY 0x05e6 Keithley Instruments
+vendor EIZONANAO 0x05e7 EIZO Nanao
+vendor KLSI 0x05e9 Kawasaki LSI
+vendor FFC 0x05eb FFC
+vendor ANKO 0x05ef Anko Electronic
+vendor PIENGINEERING 0x05f3 P.I. Engineering
+vendor AOC 0x05f6 AOC International
+vendor CHIC 0x05fe Chic Technology
+vendor BARCO 0x0600 Barco Display Systems
+vendor BRIDGE 0x0607 Bridge Information
+vendor SOLIDYEAR 0x060b Solid Year
+vendor BIORAD 0x0614 Bio-Rad Laboratories
+vendor MACALLY 0x0618 Macally
+vendor ACTLABS 0x061c Act Labs
+vendor ALARIS 0x0620 Alaris
+vendor APEX 0x0624 Apex
+vendor CREATIVE3 0x062a Creative Labs
+vendor VIVITAR 0x0636 Vivitar
+vendor GUNZE 0x0637 Gunze Electronics USA
+vendor AVISION 0x0638 Avision
+vendor TEAC 0x0644 TEAC
+vendor SGI 0x065e Silicon Graphics
+vendor SANWASUPPLY 0x0663 Sanwa Supply
+vendor LINKSYS 0x066b Linksys
+vendor ACERSA 0x066e Acer Semiconductor America
+vendor SIGMATEL 0x066f Sigmatel
+vendor DRAYTEK 0x0675 DrayTek
+vendor AIWA 0x0677 Aiwa
+vendor ACARD 0x0678 ACARD Technology
+vendor PROLIFIC 0x067b Prolific Technology
+vendor SIEMENS 0x067c Siemens
+vendor AVANCELOGIC 0x0680 Avance Logic
+vendor SIEMENS2 0x0681 Siemens
+vendor MINOLTA 0x0686 Minolta
+vendor CHPRODUCTS 0x068e CH Products
+vendor HAGIWARA 0x0693 Hagiwara Sys-Com
+vendor CTX 0x0698 Chuntex
+vendor ASKEY 0x069a Askey Computer
+vendor SAITEK 0x06a3 Saitek
+vendor ALCATELT 0x06b9 Alcatel Telecom
+vendor AGFA 0x06bd AGFA-Gevaert
+vendor ASIAMD 0x06be Asia Microelectronic Development
+vendor BIZLINK 0x06c4 Bizlink International
+vendor KEYSPAN 0x06cd Keyspan / InnoSys Inc.
+vendor AASHIMA 0x06d6 Aashima Technology
+vendor MULTITECH 0x06e0 MultiTech
+vendor ADS 0x06e1 ADS Technologies
+vendor ALCATELM 0x06e4 Alcatel Microelectronics
+vendor SIRIUS 0x06ea Sirius Technologies
+vendor GUILLEMOT 0x06f8 Guillemot
+vendor BOSTON 0x06fd Boston Acoustics
+vendor SMC 0x0707 Standard Microsystems
+vendor PUTERCOM 0x0708 Putercom
+vendor MCT 0x0711 MCT
+vendor IMATION 0x0718 Imation
+vendor SONYERICSSON 0x0731 Sony Ericsson
+vendor EICON 0x0734 Eicon Networks
+vendor SYNTECH 0x0745 Syntech Information
+vendor DIGITALSTREAM 0x074e Digital Stream
+vendor AUREAL 0x0755 Aureal Semiconductor
+vendor MIDIMAN 0x0763 Midiman
+vendor CYBERPOWER 0x0764 Cyber Power Systems, Inc.
+vendor SURECOM 0x0769 Surecom Technology
+vendor LINKSYS2 0x077b Linksys
+vendor GRIFFIN 0x077d Griffin Technology
+vendor SANDISK 0x0781 SanDisk
+vendor JENOPTIK 0x0784 Jenoptik
+vendor LOGITEC 0x0789 Logitec
+vendor BRIMAX 0x078e Brimax
+vendor AXIS 0x0792 Axis Communications
+vendor ABL 0x0794 ABL Electronics
+vendor SAGEM 0x079b Sagem
+vendor SUNCOMM 0x079c Sun Communications, Inc.
+vendor ALFADATA 0x079d Alfadata Computer
+vendor NATIONALTECH 0x07a2 National Technical Systems
+vendor ONNTO 0x07a3 Onnto
+vendor BE 0x07a4 Be
+vendor ADMTEK 0x07a6 ADMtek
+vendor COREGA 0x07aa Corega
+vendor FREECOM 0x07ab Freecom
+vendor MICROTECH 0x07af Microtech
+vendor GENERALINSTMNTS 0x07b2 General Instruments (Motorola)
+vendor OLYMPUS 0x07b4 Olympus
+vendor ABOCOM 0x07b8 AboCom Systems
+vendor KEISOKUGIKEN 0x07c1 Keisokugiken
+vendor ONSPEC 0x07c4 OnSpec
+vendor APG 0x07c5 APG Cash Drawer
+vendor BUG 0x07c8 B.U.G.
+vendor ALLIEDTELESYN 0x07c9 Allied Telesyn International
+vendor AVERMEDIA 0x07ca AVerMedia Technologies
+vendor SIIG 0x07cc SIIG
+vendor CASIO 0x07cf CASIO
+vendor DLINK2 0x07d1 D-Link
+vendor APTIO 0x07d2 Aptio Products
+vendor ARASAN 0x07da Arasan Chip Systems
+vendor ALLIEDCABLE 0x07e6 Allied Cable
+vendor STSN 0x07ef STSN
+vendor CENTURY 0x07f7 Century Corp
+vendor ZOOM 0x0803 Zoom Telephonics
+vendor PCS 0x0810 Personal Communication Systems
+vendor BROADLOGIC 0x0827 BroadLogic
+vendor HANDSPRING 0x082d Handspring
+vendor PALM 0x0830 Palm Computing
+vendor SOURCENEXT 0x0833 SOURCENEXT
+vendor ACTIONSTAR 0x0835 Action Star Enterprise
+vendor SAMSUNG_TECHWIN 0x0839 Samsung Techwin
+vendor ACCTON 0x083a Accton Technology
+vendor DIAMOND 0x0841 Diamond
+vendor NETGEAR 0x0846 BayNETGEAR
+vendor TOPRE 0x0853 Topre Corporation
+vendor ACTIVEWIRE 0x0854 ActiveWire
+vendor BBELECTRONICS 0x0856 B&B Electronics
+vendor PORTGEAR 0x085a PortGear
+vendor NETGEAR2 0x0864 Netgear
+vendor SYSTEMTALKS 0x086e System Talks
+vendor METRICOM 0x0870 Metricom
+vendor ADESSOKBTEK 0x087c ADESSO/Kbtek America
+vendor JATON 0x087d Jaton
+vendor APT 0x0880 APT Technologies
+vendor BOCARESEARCH 0x0885 Boca Research
+vendor ANDREA 0x08a8 Andrea Electronics
+vendor BURRBROWN 0x08bb Burr-Brown Japan
+vendor 2WIRE 0x08c8 2Wire
+vendor AIPTEK 0x08ca AIPTEK International
+vendor SMARTBRIDGES 0x08d1 SmartBridges
+vendor BILLIONTON 0x08dd Billionton Systems
+vendor EXTENDED 0x08e9 Extended Systems
+vendor MSYSTEMS 0x08ec M-Systems
+vendor AUTHENTEC 0x08ff AuthenTec
+vendor AUDIOTECHNICA 0x0909 Audio-Technica
+vendor TRUMPION 0x090a Trumpion Microelectronics
+vendor FEIYA 0x090c Feiya
+vendor ALATION 0x0910 Alation Systems
+vendor GLOBESPAN 0x0915 Globespan
+vendor CONCORDCAMERA 0x0919 Concord Camera
+vendor GARMIN 0x091e Garmin International
+vendor GOHUBS 0x0921 GoHubs
+vendor XEROX 0x0924 Xerox
+vendor BIOMETRIC 0x0929 American Biometric Company
+vendor TOSHIBA 0x0930 Toshiba
+vendor PLEXTOR 0x093b Plextor
+vendor INTREPIDCS 0x093c Intrepid
+vendor YANO 0x094f Yano
+vendor KINGSTON 0x0951 Kingston Technology
+vendor BLUEWATER 0x0956 BlueWater Systems
+vendor AGILENT 0x0957 Agilent Technologies
+vendor GUDE 0x0959 Gude ADS
+vendor PORTSMITH 0x095a Portsmith
+vendor ACERW 0x0967 Acer
+vendor ADIRONDACK 0x0976 Adirondack Wire & Cable
+vendor BECKHOFF 0x0978 Beckhoff
+vendor MINDSATWORK 0x097a Minds At Work
+vendor POINTCHIPS 0x09a6 PointChips
+vendor INTERSIL 0x09aa Intersil
+vendor ALTIUS 0x09b3 Altius Solutions
+vendor ARRIS 0x09c1 Arris Interactive
+vendor ACTIVCARD 0x09c3 ACTIVCARD
+vendor ACTISYS 0x09c4 ACTiSYS
+vendor NOVATEL2 0x09d7 Novatel Wireless
+vendor AFOURTECH 0x09da A-FOUR TECH
+vendor AIMEX 0x09dc AIMEX
+vendor ADDONICS 0x09df Addonics Technologies
+vendor AKAI 0x09e8 AKAI professional M.I.
+vendor ARESCOM 0x09f5 ARESCOM
+vendor BAY 0x09f9 Bay Associates
+vendor ALTERA 0x09fb Altera
+vendor CSR 0x0a12 Cambridge Silicon Radio
+vendor TREK 0x0a16 Trek Technology
+vendor ASAHIOPTICAL 0x0a17 Asahi Optical
+vendor BOCASYSTEMS 0x0a43 Boca Systems
+vendor SHANTOU 0x0a46 ShanTou
+vendor MEDIAGEAR 0x0a48 MediaGear
+vendor BROADCOM 0x0a5c Broadcom
+vendor GREENHOUSE 0x0a6b GREENHOUSE
+vendor GEOCAST 0x0a79 Geocast Network Systems
+vendor IDQUANTIQUE 0x0aba id Quantique
+vendor ZYDAS 0x0ace Zydas Technology Corporation
+vendor NEODIO 0x0aec Neodio
+vendor OPTION 0x0af0 Option N.V:
+vendor ASUS 0x0b05 ASUSTeK Computer
+vendor TODOS 0x0b0c Todos Data System
+vendor SIIG2 0x0b39 SIIG
+vendor TEKRAM 0x0b3b Tekram Technology
+vendor HAL 0x0b41 HAL Corporation
+vendor EMS 0x0b43 EMS Production
+vendor NEC2 0x0b62 NEC
+vendor ATI2 0x0b6f ATI
+vendor ZEEVO 0x0b7a Zeevo, Inc.
+vendor KURUSUGAWA 0x0b7e Kurusugawa Electronics, Inc.
+vendor ASIX 0x0b95 ASIX Electronics
+vendor O2MICRO 0x0b97 O2 Micro, Inc.
+vendor USR 0x0baf U.S. Robotics
+vendor AMBIT 0x0bb2 Ambit Microsystems
+vendor HTC 0x0bb4 HTC
+vendor REALTEK 0x0bda Realtek
+vendor ADDONICS2 0x0bf6 Addonics Technology
+vendor FSC 0x0bf8 Fujitsu Siemens Computers
+vendor AGATE 0x0c08 Agate Technologies
+vendor DMI 0x0c0b DMI
+vendor MICRODIA 0x0c45 Chicony
+vendor SEALEVEL 0x0c52 Sealevel System
+vendor LUWEN 0x0c76 Luwen
+vendor KYOCERA2 0x0c88 Kyocera Wireless Corp.
+vendor ZCOM 0x0cde Z-Com
+vendor ATHEROS2 0x0cf3 Atheros Communications
+vendor TANGTOP 0x0d3d Tangtop
+vendor SMC3 0x0d5c Standard Microsystems
+vendor ADDON 0x0d7d Add-on Technology
+vendor ACDC 0x0d7e American Computer & Digital Components
+vendor ABC 0x0d8c ABC
+vendor CONCEPTRONIC 0x0d8e Conceptronic
+vendor SKANHEX 0x0d96 Skanhex Technology, Inc.
+vendor MSI 0x0db0 Micro Star International
+vendor ELCON 0x0db7 ELCON Systemtechnik
+vendor NETAC 0x0dd8 Netac
+vendor SITECOMEU 0x0df6 Sitecom Europe
+vendor MOBILEACTION 0x0df7 Mobile Action
+vendor SPEEDDRAGON 0x0e55 Speed Dragon Multimedia
+vendor HAWKING 0x0e66 Hawking
+vendor FOSSIL 0x0e67 Fossil, Inc
+vendor GMATE 0x0e7e G.Mate, Inc
+vendor OTI 0x0ea0 Ours Technology
+vendor PILOTECH 0x0eaf Pilotech
+vendor NOVATECH 0x0eb0 NovaTech
+vendor ITEGNO 0x0eba iTegno
+vendor WINMAXGROUP 0x0ed1 WinMaxGroup
+vendor TOD 0x0ede TOD
+vendor EGALAX 0x0eef eGalax, Inc.
+vendor AIRPRIME 0x0f3d AirPrime, Inc.
+vendor MICROTUNE 0x0f4d Microtune
+vendor VTECH 0x0f88 VTech
+vendor FALCOM 0x0f94 Falcom Wireless Communications GmbH
+vendor RIM 0x0fca Research In Motion
+vendor DYNASTREAM 0x0fcf Dynastream Innovations
+vendor QUALCOMM 0x1004 Qualcomm
+vendor DESKNOTE 0x1019 Desknote
+vendor GIGABYTE 0x1044 GIGABYTE
+vendor WESTERN 0x1058 Western Digital
+vendor MOTOROLA 0x1063 Motorola
+vendor CCYU 0x1065 CCYU Technology
+vendor CURITEL 0x106c Curitel Communications Inc
+vendor SILABS2 0x10a6 SILABS2
+vendor USI 0x10ab USI
+vendor PLX 0x10b5 PLX
+vendor ASANTE 0x10bd Asante
+vendor SILABS 0x10c4 Silicon Labs
+vendor ANALOG 0x1110 Analog Devices
+vendor TENX 0x1130 Ten X Technology, Inc.
+vendor ISSC 0x1131 Integrated System Solution Corp.
+vendor JRC 0x1145 Japan Radio Company
+vendor SPHAIRON 0x114b Sphairon Access Systems GmbH
+vendor DELORME 0x1163 DeLorme
+vendor SERVERWORKS 0x1166 ServerWorks
+vendor ACERCM 0x1189 Acer Communications & Multimedia
+vendor SIERRA 0x1199 Sierra Wireless
+vendor TOPFIELD 0x11db Topfield Co., Ltd
+vendor SIEMENS3 0x11f5 Siemens
+vendor PROLIFIC2 0x11f6 Prolific
+vendor ALCATEL 0x11f7 Alcatel
+vendor UNKNOWN3 0x1233 Unknown vendor
+vendor TSUNAMI 0x1241 Tsunami
+vendor PHEENET 0x124a Pheenet
+vendor TARGUS 0x1267 Targus
+vendor TWINMOS 0x126f TwinMOS
+vendor TENDA 0x1286 Tenda
+vendor CREATIVE2 0x1292 Creative Labs
+vendor BELKIN2 0x1293 Belkin Components
+vendor CYBERTAN 0x129b CyberTAN Technology
+vendor HUAWEI 0x12d1 Huawei Technologies
+vendor ARANEUS 0x12d8 Araneus Information Systems
+vendor TAPWAVE 0x12ef Tapwave
+vendor AINCOMM 0x12fd Aincomm
+vendor MOBILITY 0x1342 Mobility
+vendor DICKSMITH 0x1371 Dick Smith Electronics
+vendor NETGEAR3 0x1385 Netgear
+vendor BALTECH 0x13ad Baltech
+vendor CISCOLINKSYS 0x13b1 Cisco-Linksys
+vendor SHARK 0x13d2 Shark
+vendor NOVATEL 0x1410 Novatel Wireless
+vendor MERLIN 0x1416 Merlin
+vendor WISTRONNEWEB 0x1435 Wistron NeWeb
+vendor RADIOSHACK 0x1453 Radio Shack
+vendor HUAWEI3COM 0x1472 Huawei-3Com
+vendor SILICOM 0x1485 Silicom
+vendor RALINK 0x148f Ralink Technology
+vendor IMAGINATION 0x149a Imagination Technologies
+vendor CONCEPTRONIC2 0x14b2 Conceptronic
+vendor PLANEX3 0x14ea Planex Communications
+vendor SILICONPORTALS 0x1527 Silicon Portals
+vendor UBIQUAM 0x1529 UBIQUAM Co., Ltd.
+vendor UBLOX 0x1546 U-blox
+vendor PNY 0x154b PNY
+vendor OQO 0x1557 OQO
+vendor UMEDIA 0x157e U-MEDIA Communications
+vendor FIBERLINE 0x1582 Fiberline
+vendor SPARKLAN 0x15a9 SparkLAN
+vendor SOHOWARE 0x15e8 SOHOware
+vendor UMAX 0x1606 UMAX Data Systems
+vendor INSIDEOUT 0x1608 Inside Out Networks
+vendor GOODWAY 0x1631 Good Way Technology
+vendor ENTREGA 0x1645 Entrega
+vendor ACTIONTEC 0x1668 Actiontec Electronics
+vendor ATHEROS 0x168c Atheros Communications
+vendor GIGASET 0x1690 Gigaset
+vendor GLOBALSUN 0x16ab Global Sun Technology
+vendor ANYDATA 0x16d5 AnyDATA Corporation
+vendor JABLOTRON 0x16d6 Jablotron
+vendor CMOTECH 0x16d8 CMOTECH Co., Ltd.
+vendor AXESSTEL 0x1726 Axesstel Co., Ltd.
+vendor LINKSYS4 0x1737 Linksys
+vendor SENAO 0x1740 Senao
+vendor METAGEEK 0x1781 MetaGeek
+vendor AMIT 0x18c5 AMIT
+vendor QCOM 0x18e8 Qcom
+vendor LINKSYS3 0x1915 Linksys
+vendor QUALCOMMINC 0x19d2 Qualcomm, Incorporated
+vendor DLINK 0x2001 D-Link
+vendor PLANEX2 0x2019 Planex Communications
+vendor ERICSSON 0x2282 Ericsson
+vendor MOTOROLA2 0x22b8 Motorola
+vendor TRIPPLITE 0x2478 Tripp-Lite
+vendor HIROSE 0x2631 Hirose Electric
+vendor NHJ 0x2770 NHJ
+vendor PLANEX 0x2c02 Planex Communications
+vendor VIDZMEDIA 0x3275 VidzMedia Pte Ltd
+vendor AEI 0x3334 AEI
+vendor HANK 0x3353 Hank Connection
+vendor PQI 0x3538 PQI
+vendor DAISY 0x3579 Daisy Technology
+vendor NI 0x3923 National Instruments
+vendor MICRONET 0x3980 Micronet Communications
+vendor IODATA2 0x40bb I-O Data
+vendor IRIVER 0x4102 iRiver
+vendor DELL 0x413c Dell
+vendor WCH 0x4348 QinHeng Electronics
+vendor ACEECA 0x4766 Aceeca
+vendor AVERATEC 0x50c2 Averatec
+vendor SWEEX 0x5173 Sweex
+vendor ONSPEC2 0x55aa OnSpec Electronic Inc.
+vendor ZINWELL 0x5a57 Zinwell
+vendor SITECOM 0x6189 Sitecom
+vendor ARKMICRO 0x6547 Arkmicro Technologies Inc.
+vendor 3COM2 0x6891 3Com
+vendor INTEL 0x8086 Intel
+vendor SITECOM2 0x9016 Sitecom
+vendor MOSCHIP 0x9710 MosChip Semiconductor
+vendor 3COM3 0xa727 3Com
+vendor HP2 0xf003 Hewlett Packard
+vendor USRP 0xfffe GNU Radio USRP
+
+/*
+ * List of known products. Grouped by vendor.
+ */
+
+/* 3Com products */
+product 3COM HOMECONN 0x009d HomeConnect Camera
+product 3COM 3CREB96 0x00a0 Bluetooth USB Adapter
+product 3COM 3C19250 0x03e8 3C19250 Ethernet Adapter
+product 3COM 3CRSHEW696 0x0a01 3CRSHEW696 Wireless Adapter
+product 3COM 3C460 0x11f8 HomeConnect 3C460
+product 3COM USR56K 0x3021 U.S.Robotics 56000 Voice FaxModem Pro
+product 3COM 3C460B 0x4601 HomeConnect 3C460B
+product 3COM2 3CRUSB10075 0xa727 3CRUSB10075
+product 3COM3 AR5523_1 0x6893 AR5523
+product 3COM3 AR5523_2 0x6895 AR5523
+product 3COM3 AR5523_3 0x6897 AR5523
+
+product 3COMUSR OFFICECONN 0x0082 3Com OfficeConnect Analog Modem
+product 3COMUSR USRISDN 0x008f 3Com U.S. Robotics Pro ISDN TA
+product 3COMUSR HOMECONN 0x009d 3Com HomeConnect Camera
+product 3COMUSR USR56K 0x3021 U.S. Robotics 56000 Voice FaxModem Pro
+
+/* AboCom products */
+product ABOCOM XX1 0x110c XX1
+product ABOCOM XX2 0x200c XX2
+product ABOCOM URE450 0x4000 URE450 Ethernet Adapter
+product ABOCOM UFE1000 0x4002 UFE1000 Fast Ethernet Adapter
+product ABOCOM DSB650TX_PNA 0x4003 1/10/100 Ethernet Adapter
+product ABOCOM XX4 0x4004 XX4
+product ABOCOM XX5 0x4007 XX5
+product ABOCOM XX6 0x400b XX6
+product ABOCOM XX7 0x400c XX7
+product ABOCOM RTL8151 0x401a RTL8151
+product ABOCOM XX8 0x4102 XX8
+product ABOCOM XX9 0x4104 XX9
+product ABOCOM UF200 0x420a UF200 Ethernet
+product ABOCOM WL54 0x6001 WL54
+product ABOCOM XX10 0xabc1 XX10
+product ABOCOM BWU613 0xb000 BWU613
+product ABOCOM HWU54DM 0xb21b HWU54DM
+product ABOCOM RT2573_2 0xb21c RT2573
+product ABOCOM RT2573_3 0xb21d RT2573
+product ABOCOM RT2573_4 0xb21e RT2573
+product ABOCOM WUG2700 0xb21f WUG2700
+
+/* Accton products */
+product ACCTON USB320_EC 0x1046 USB320-EC Ethernet Adapter
+product ACCTON 2664W 0x3501 2664W
+product ACCTON 111 0x3503 T-Sinus 111 Wireless Adapter
+product ACCTON SMCWUSBG 0x4505 SMCWUSB-G
+product ACCTON PRISM_GT 0x4521 PrismGT USB 2.0 WLAN
+product ACCTON SS1001 0x5046 SpeedStream Ethernet Adapter
+product ACCTON ZD1211B 0xe501 ZD1211B
+
+/* Aceeca products */
+product ACEECA MEZ1000 0x0001 MEZ1000 RDA
+
+/* Acer Communications & Multimedia (oemd by Surecom) */
+product ACERCM EP1427X2 0x0893 EP-1427X-2 Ethernet Adapter
+
+/* Acer Labs products */
+product ACERLABS M5632 0x5632 USB 2.0 Data Link
+
+/* Acer Peripherals, Inc. products */
+product ACERP ACERSCAN_C310U 0x12a6 Acerscan C310U
+product ACERP ACERSCAN_320U 0x2022 Acerscan 320U
+product ACERP ACERSCAN_640U 0x2040 Acerscan 640U
+product ACERP ACERSCAN_620U 0x2060 Acerscan 620U
+product ACERP ACERSCAN_4300U 0x20b0 Benq 3300U/4300U
+product ACERP ACERSCAN_640BT 0x20be Acerscan 640BT
+product ACERP ACERSCAN_1240U 0x20c0 Acerscan 1240U
+product ACERP ATAPI 0x6003 ATA/ATAPI Adapter
+product ACERP AWL300 0x9000 AWL300 Wireless Adapter
+product ACERP AWL400 0x9001 AWL400 Wireless Adapter
+
+/* Acer Warp products */
+product ACERW WARPLINK 0x0204 Warplink
+
+/* Actiontec, Inc. products */
+product ACTIONTEC PRISM_25 0x0408 Prism2.5 Wireless Adapter
+product ACTIONTEC PRISM_25A 0x0421 Prism2.5 Wireless Adapter A
+product ACTIONTEC FREELAN 0x6106 ROPEX FreeLan 802.11b
+product ACTIONTEC UAT1 0x7605 UAT1 Wireless Ethernet Adapter
+
+/* ACTiSYS products */
+product ACTISYS IR2000U 0x0011 ACT-IR2000U FIR
+
+/* ActiveWire, Inc. products */
+product ACTIVEWIRE IOBOARD 0x0100 I/O Board
+product ACTIVEWIRE IOBOARD_FW1 0x0101 I/O Board, rev. 1 firmware
+
+/* Adaptec products */
+product ADAPTEC AWN8020 0x0020 AWN-8020 WLAN
+
+/* Addtron products */
+product ADDTRON AWU120 0xff31 AWU-120
+
+/* ADMtek products */
+product ADMTEK PEGASUSII_4 0x07c2 AN986A Ethernet
+product ADMTEK PEGASUS 0x0986 AN986 Ethernet
+product ADMTEK PEGASUSII 0x8511 AN8511 Ethernet
+product ADMTEK PEGASUSII_2 0x8513 AN8513 Ethernet
+product ADMTEK PEGASUSII_3 0x8515 AN8515 Ethernet
+
+/* ADDON products */
+/* PNY OEMs these */
+product ADDON ATTACHE 0x1300 USB 2.0 Flash Drive
+product ADDON ATTACHE 0x1300 USB 2.0 Flash Drive
+product ADDON A256MB 0x1400 Attache 256MB USB 2.0 Flash Drive
+product ADDON DISKPRO512 0x1420 USB 2.0 Flash Drive (DANE-ELEC zMate 512MB USB flash drive)
+
+/* Addonics products */
+product ADDONICS2 CABLE_205 0xa001 Cable 205
+
+/* ADS products */
+product ADS UBS10BT 0x0008 UBS-10BT Ethernet
+product ADS UBS10BTX 0x0009 UBS-10BT Ethernet
+
+/* AEI products */
+product AEI FASTETHERNET 0x1701 Fast Ethernet
+
+/* Agate Technologies products */
+product AGATE QDRIVE 0x0378 Q-Drive
+
+/* AGFA products */
+product AGFA SNAPSCAN1212U 0x0001 SnapScan 1212U
+product AGFA SNAPSCAN1236U 0x0002 SnapScan 1236U
+product AGFA SNAPSCANTOUCH 0x0100 SnapScan Touch
+product AGFA SNAPSCAN1212U2 0x2061 SnapScan 1212U
+product AGFA SNAPSCANE40 0x208d SnapScan e40
+product AGFA SNAPSCANE50 0x208f SnapScan e50
+product AGFA SNAPSCANE20 0x2091 SnapScan e20
+product AGFA SNAPSCANE25 0x2095 SnapScan e25
+product AGFA SNAPSCANE26 0x2097 SnapScan e26
+product AGFA SNAPSCANE52 0x20fd SnapScan e52
+
+/* Ain Communication Technology products */
+product AINCOMM AWU2000B 0x1001 AWU2000B Wireless Adapter
+
+/* AIPTEK products */
+product AIPTEK POCKETCAM3M 0x2011 PocketCAM 3Mega
+product AIPTEK2 PENCAM_MEGA_1_3 0x504a PenCam Mega 1.3
+
+/* AirPrime products */
+product AIRPRIME PC5220 0x0112 CDMA Wireless PC Card
+
+/* AKS products */
+product AKS USBHASP 0x0001 USB-HASP 0.06
+
+/* Alcor Micro, Inc. products */
+product ALCOR2 KBD_HUB 0x2802 Kbd Hub
+
+product ALCOR MA_KBD_HUB 0x9213 MacAlly Kbd Hub
+product ALCOR AU9814 0x9215 AU9814 Hub
+product ALCOR UMCR_9361 0x9361 USB Multimedia Card Reader
+product ALCOR SM_KBD 0x9410 MicroConnectors/StrongMan Keyboard
+product ALCOR NEC_KBD_HUB 0x9472 NEC Kbd Hub
+
+/* Altec Lansing products */
+product ALTEC ADA70 0x0070 ADA70 Speakers
+product ALTEC ASC495 0xff05 ASC495 Speakers
+
+/* Allied Telesyn International products */
+product ALLIEDTELESYN ATUSB100 0xb100 AT-USB100
+
+/* American Power Conversion products */
+product APC UPS 0x0002 Uninterruptible Power Supply
+
+/* Ambit Microsystems products */
+product AMBIT WLAN 0x0302 WLAN
+product AMBIT NTL_250 0x6098 NTL 250 cable modem
+
+/* AMIT products */
+product AMIT CGWLUSB2GO 0x0002 CG-WLUSB2GO
+
+/* Anchor products */
+product ANCHOR EZUSB 0x2131 EZUSB
+product ANCHOR EZLINK 0x2720 EZLINK
+
+/* AnyData products */
+product ANYDATA ADU_E100X 0x6501 CDMA 2000 1xRTT/EV-DO USB Modem
+product ANYDATA ADU_500A 0x6502 CDMA 2000 EV-DO USB Modem
+
+/* AOX, Inc. products */
+product AOX USB101 0x0008 Ethernet
+
+/* American Power Conversion products */
+product APC UPS 0x0002 Uninterruptible Power Supply
+
+/* Apple Computer products */
+product APPLE EXT_KBD 0x020c Apple Extended USB Keyboard
+product APPLE OPTMOUSE 0x0302 Optical mouse
+product APPLE MIGHTYMOUSE 0x0304 Mighty Mouse
+product APPLE EXT_KBD_HUB 0x1003 Hub in Apple Extended USB Keyboard
+product APPLE SPEAKERS 0x1101 Speakers
+product APPLE IPOD 0x1201 iPod
+product APPLE IPOD2G 0x1202 iPod 2G
+product APPLE IPOD3G 0x1203 iPod 3G
+product APPLE IPOD_04 0x1204 iPod '04'
+product APPLE IPODMINI 0x1205 iPod Mini
+product APPLE IPOD_06 0x1206 iPod '06'
+product APPLE IPOD_07 0x1207 iPod '07'
+product APPLE IPOD_08 0x1208 iPod '08'
+product APPLE IPODVIDEO 0x1209 iPod Video
+product APPLE IPODNANO 0x120a iPod Nano
+product APPLE IPHONE 0x1290 iPhone
+product APPLE IPHONE_3G 0x1292 iPhone 3G
+product APPLE ETHERNET 0x1402 Ethernet A1277
+
+/* Arkmicro Technologies */
+product ARKMICRO ARK3116 0x0232 ARK3116 Serial
+
+/* Asahi Optical products */
+product ASAHIOPTICAL OPTIO230 0x0004 Digital camera
+product ASAHIOPTICAL OPTIO330 0x0006 Digital camera
+
+/* Asante products */
+product ASANTE EA 0x1427 Ethernet
+
+/* ASIX Electronics products */
+product ASIX AX88172 0x1720 10/100 Ethernet
+product ASIX AX88178 0x1780 AX88178
+product ASIX AX88772 0x7720 AX88772
+
+/* ASUS products */
+product ASUS WL167G 0x1707 WL-167g Wireless Adapter
+product ASUS WL159G 0x170c WL-159g
+product ASUS A9T_WIFI 0x171b A9T wireless
+product ASUS RT2573_1 0x1723 RT2573
+product ASUS RT2573_2 0x1724 RT2573
+product ASUS LCM 0x1726 LCM display
+product ASUS P535 0x420f ASUS P535 PDA
+
+/* ATen products */
+product ATEN UC1284 0x2001 Parallel printer
+product ATEN UC10T 0x2002 10Mbps Ethernet
+product ATEN UC110T 0x2007 UC-110T Ethernet
+product ATEN UC232A 0x2008 Serial
+product ATEN UC210T 0x2009 UC-210T Ethernet
+product ATEN DSB650C 0x4000 DSB-650C
+
+/* Atheros Communications products */
+product ATHEROS AR5523 0x0001 AR5523
+product ATHEROS AR5523_NF 0x0002 AR5523 (no firmware)
+product ATHEROS2 AR5523_1 0x0001 AR5523
+product ATHEROS2 AR5523_1_NF 0x0002 AR5523 (no firmware)
+product ATHEROS2 AR5523_2 0x0003 AR5523
+product ATHEROS2 AR5523_2_NF 0x0004 AR5523 (no firmware)
+product ATHEROS2 AR5523_3 0x0005 AR5523
+product ATHEROS2 AR5523_3_NF 0x0006 AR5523 (no firmware)
+
+/* Atmel Comp. products */
+product ATMEL UHB124 0x3301 UHB124 hub
+product ATMEL DWL120 0x7603 DWL-120 Wireless Adapter
+product ATMEL BW002 0x7605 BW002 Wireless Adapter
+product ATMEL WL1130USB 0x7613 WL-1130 USB
+product ATMEL AT76C505A 0x7614 AT76c505a Wireless Adapter
+
+/* Avision products */
+product AVISION 1200U 0x0268 1200U scanner
+
+/* Axesstel products */
+product AXESSTEL DATAMODEM 0x1000 Data Modem
+
+/* Baltech products */
+product BALTECH CARDREADER 0x9999 Card reader
+
+/* B&B Electronics products */
+product BBELECTRONICS USOTL4 0xAC01 RS-422/485
+
+/* Belkin products */
+/* product BELKIN F5U111 0x???? F5U111 Ethernet */
+product BELKIN F5D6050 0x0050 F5D6050 802.11b Wireless Adapter
+product BELKIN FBT001V 0x0081 FBT001v2 Bluetooth
+product BELKIN FBT003V 0x0084 FBT003v2 Bluetooth
+product BELKIN F5U103 0x0103 F5U103 Serial
+product BELKIN F5U109 0x0109 F5U109 Serial
+product BELKIN USB2SCSI 0x0115 USB to SCSI
+product BELKIN F8T012 0x0121 F8T012xx1 Bluetooth USB Adapter
+product BELKIN USB2LAN 0x0121 USB to LAN
+product BELKIN F5U208 0x0208 F5U208 VideoBus II
+product BELKIN F5U237 0x0237 F5U237 USB 2.0 7-Port Hub
+product BELKIN F5U257 0x0257 F5U257 Serial
+product BELKIN F5U409 0x0409 F5U409 Serial
+product BELKIN F6C550AVR 0x0551 F6C550-AVR UPS
+product BELKIN F5U120 0x1203 F5U120-PC Hub
+product BELKIN ZD1211B 0x4050 ZD1211B
+product BELKIN F5D5055 0x5055 F5D5055
+product BELKIN F5D7050 0x7050 F5D7050 Wireless Adapter
+product BELKIN F5D7051 0x7051 F5D7051 54g USB Network Adapter
+product BELKIN F5D7050A 0x705a F5D7050A Wireless Adapter
+/* Also sold as 'Ativa 802.11g wireless card' */
+product BELKIN F5D7050_V4000 0x705c F5D7050 v4000 Wireless Adapter
+product BELKIN F5D9050V3 0x905b F5D9050 ver 3 Wireless Adapter
+product BELKIN2 F5U002 0x0002 F5U002 Parallel printer
+
+/* Billionton products */
+product BILLIONTON USB100 0x0986 USB100N 10/100 FastEthernet
+product BILLIONTON USBLP100 0x0987 USB100LP
+product BILLIONTON USBEL100 0x0988 USB100EL
+product BILLIONTON USBE100 0x8511 USBE100
+product BILLIONTON USB2AR 0x90ff USB2AR Ethernet
+
+/* Broadcom products */
+product BROADCOM BCM2033 0x2033 BCM2033 Bluetooth USB dongle
+
+/* Brother Industries products */
+product BROTHER HL1050 0x0002 HL-1050 laser printer
+
+/* Behavior Technology Computer products */
+product BTC BTC7932 0x6782 Keyboard with mouse port
+
+/* Canon, Inc. products */
+product CANON N656U 0x2206 CanoScan N656U
+product CANON N1220U 0x2207 CanoScan N1220U
+product CANON D660U 0x2208 CanoScan D660U
+product CANON N676U 0x220d CanoScan N676U
+product CANON N1240U 0x220e CanoScan N1240U
+product CANON LIDE25 0x2220 CanoScan LIDE 25
+product CANON S10 0x3041 PowerShot S10
+product CANON S100 0x3045 PowerShot S100
+product CANON S200 0x3065 PowerShot S200
+product CANON REBELXT 0x30ef Digital Rebel XT
+
+/* CATC products */
+product CATC NETMATE 0x000a Netmate Ethernet
+product CATC NETMATE2 0x000c Netmate2 Ethernet
+product CATC CHIEF 0x000d USB Chief Bus & Protocol Analyzer
+product CATC ANDROMEDA 0x1237 Andromeda hub
+
+/* CASIO products */
+product CASIO QV_DIGICAM 0x1001 QV DigiCam
+product CASIO EXS880 0x1105 Exilim EX-S880
+product CASIO BE300 0x2002 BE-300 PDA
+product CASIO NAMELAND 0x4001 CASIO Nameland EZ-USB
+
+/* CCYU products */
+product CCYU ED1064 0x2136 EasyDisk ED1064
+
+/* Century products */
+product CENTURY EX35QUAT 0x011e Century USB Disk Enclosure
+
+/* Cherry products */
+product CHERRY MY3000KBD 0x0001 My3000 keyboard
+product CHERRY MY3000HUB 0x0003 My3000 hub
+product CHERRY CYBOARD 0x0004 CyBoard Keyboard
+
+/* Chic Technology products */
+product CHIC MOUSE1 0x0001 mouse
+product CHIC CYPRESS 0x0003 Cypress USB Mouse
+
+/* Chicony products */
+product CHICONY KB8933 0x0001 KB-8933 keyboard
+product CHICONY2 TWINKLECAM 0x600d TwinkleCam USB camera
+
+/* CH Products */
+product CHPRODUCTS PROTHROTTLE 0x00f1 Pro Throttle
+product CHPRODUCTS PROPEDALS 0x00f2 Pro Pedals
+product CHPRODUCTS FIGHTERSTICK 0x00f3 Fighterstick
+product CHPRODUCTS FLIGHTYOKE 0x00ff Flight Sim Yoke
+
+/* Cisco-Linksys products */
+product CISCOLINKSYS WUSB54G 0x000d WUSB54G Wireless Adapter
+product CISCOLINKSYS WUSB54GP 0x0011 WUSB54GP Wireless Adapter
+product CISCOLINKSYS USB200MV2 0x0018 USB200M v2
+product CISCOLINKSYS HU200TS 0x001a HU200TS Wireless Adapter
+product CISCOLINKSYS WUSB54GC 0x0020 WUSB54GC
+product CISCOLINKSYS WUSB54GR 0x0023 WUSB54GR
+product CISCOLINKSYS WUSBF54G 0x0024 WUSBF54G
+
+/* CMOTECH products */
+product CMOTECH CNU510 0x5141 CMOTECH CDMA Technologies USB modem
+product CMOTECH CNU550 0x5543 CDMA 2000 1xRTT/1xEVDO USB modem
+product CMOTECH CDMA_MODEM1 0x6280 CMOTECH CDMA Technologies USB modem
+
+/* Compaq products */
+product COMPAQ IPAQPOCKETPC 0x0003 iPAQ PocketPC
+product COMPAQ PJB100 0x504a Personal Jukebox PJB100
+product COMPAQ IPAQLINUX 0x505a iPAQ Linux
+
+/* Composite Corp products looks the same as "TANGTOP" */
+product COMPOSITE USBPS2 0x0001 USB to PS2 Adaptor
+
+/* Conceptronic products */
+product CONCEPTRONIC PRISM_GT 0x3762 PrismGT USB 2.0 WLAN
+product CONCEPTRONIC C11U 0x7100 C11U
+product CONCEPTRONIC WL210 0x7110 WL-210
+product CONCEPTRONIC AR5523_1 0x7801 AR5523
+product CONCEPTRONIC AR5523_1_NF 0x7802 AR5523 (no firmware)
+product CONCEPTRONIC AR5523_2 0x7811 AR5523
+product CONCEPTRONIC AR5523_2_NF 0x7812 AR5523 (no firmware)
+product CONCEPTRONIC2 C54RU 0x3c02 C54RU WLAN
+product CONCEPTRONIC2 C54RU2 0x3c22 C54RU
+
+/* Connectix products */
+product CONNECTIX QUICKCAM 0x0001 QuickCam
+
+/* Corega products */
+product COREGA ETHER_USB_T 0x0001 Ether USB-T
+product COREGA FETHER_USB_TX 0x0004 FEther USB-TX
+product COREGA WLAN_USB_USB_11 0x000c WirelessLAN USB-11
+product COREGA FETHER_USB_TXS 0x000d FEther USB-TXS
+product COREGA WLANUSB 0x0012 Wireless LAN Stick-11
+product COREGA FETHER_USB2_TX 0x0017 FEther USB2-TX
+product COREGA WLUSB_11_KEY 0x001a ULUSB-11 Key
+product COREGA CGWLUSB2GL 0x002d CG-WLUSB2GL
+product COREGA CGWLUSB2GPX 0x002e CG-WLUSB2GPX
+product COREGA WLUSB_11_STICK 0x7613 WLAN USB Stick 11
+product COREGA FETHER_USB_TXC 0x9601 FEther USB-TXC
+
+/* Creative products */
+product CREATIVE NOMAD_II 0x1002 Nomad II MP3 player
+product CREATIVE NOMAD_IIMG 0x4004 Nomad II MG
+product CREATIVE NOMAD 0x4106 Nomad
+product CREATIVE2 VOIP_BLASTER 0x0258 Voip Blaster
+product CREATIVE3 OPTICAL_MOUSE 0x0001 Notebook Optical Mouse
+
+/* Cambridge Silicon Radio Ltd. products */
+product CSR BT_DONGLE 0x0001 Bluetooth USB dongle
+product CSR CSRDFU 0xffff USB Bluetooth Device in DFU State
+
+/* CTX products */
+product CTX EX1300 0x9999 Ex1300 hub
+
+/* Curitel products */
+product CURITEL HX550C 0x1101 CDMA 2000 1xRTT USB modem (HX-550C)
+product CURITEL HX57XB 0x2101 CDMA 2000 1xRTT USB modem (HX-570/575B/PR-600)
+product CURITEL PC5740 0x3701 Broadband Wireless modem
+
+/* CyberPower products */
+product CYBERPOWER 1500CAVRLCD 0x0501 1500CAVRLCD
+
+/* CyberTAN Technology products */
+product CYBERTAN TG54USB 0x1666 TG54USB
+
+/* Cypress Semiconductor products */
+product CYPRESS MOUSE 0x0001 mouse
+product CYPRESS THERMO 0x0002 thermometer
+product CYPRESS WISPY1A 0x0bad MetaGeek Wi-Spy
+product CYPRESS KBDHUB 0x0101 Keyboard/Hub
+product CYPRESS FMRADIO 0x1002 FM Radio
+product CYPRESS USBRS232 0x5500 USB-RS232 Interface
+product CYPRESS SLIM_HUB 0x6560 Slim Hub
+
+/* Daisy Technology products */
+product DAISY DMC 0x6901 USB MultiMedia Reader
+
+/* Dallas Semiconductor products */
+product DALLAS J6502 0x4201 J-6502 speakers
+
+/* Dell products */
+product DELL PORT 0x0058 Port Replicator
+product DELL AIO926 0x5115 Photo AIO Printer 926
+product DELL BC02 0x8000 BC02 Bluetooth USB Adapter
+product DELL PRISM_GT_1 0x8102 PrismGT USB 2.0 WLAN
+product DELL TM350 0x8103 TrueMobile 350 Bluetooth USB Adapter
+product DELL PRISM_GT_2 0x8104 PrismGT USB 2.0 WLAN
+product DELL U740 0x8135 Dell U740 CDMA
+
+/* Delorme Paublishing products */
+product DELORME EARTHMATE 0x0100 Earthmate GPS
+
+/* Desknote products */
+product DESKNOTE UCR_61S2B 0x0c55 UCR-61S2B
+
+/* Diamond products */
+product DIAMOND RIO500USB 0x0001 Rio 500 USB
+
+/* Dick Smith Electronics (really C-Net) products */
+product DICKSMITH RT2573 0x9022 RT2573
+product DICKSMITH CWD854F 0x9032 C-Net CWD-854 rev F
+
+/* Digi International products */
+product DIGI ACCELEPORT2 0x0002 AccelePort USB 2
+product DIGI ACCELEPORT4 0x0004 AccelePort USB 4
+product DIGI ACCELEPORT8 0x0008 AccelePort USB 8
+
+/* D-Link products */
+/* product DLINK DSBS25 0x0100 DSB-S25 serial */
+product DLINK DUBE100 0x1a00 10/100 Ethernet
+product DLINK DSB650TX4 0x200c 10/100 Ethernet
+product DLINK DWL120E 0x3200 DWL-120 rev E
+product DLINK DWL122 0x3700 DWL-122
+product DLINK DWLG120 0x3701 DWL-G120
+product DLINK DWL120F 0x3702 DWL-120 rev F
+product DLINK DWLAG132 0x3a00 DWL-AG132
+product DLINK DWLAG132_NF 0x3a01 DWL-AG132 (no firmware)
+product DLINK DWLG132 0x3a02 DWL-G132
+product DLINK DWLG132_NF 0x3a03 DWL-G132 (no firmware)
+product DLINK DWLAG122 0x3a04 DWL-AG122
+product DLINK DWLAG122_NF 0x3a05 DWL-AG122 (no firmware)
+product DLINK DWLG122 0x3c00 DWL-G122 b1 Wireless Adapter
+product DLINK DUBE100B1 0x3c05 DUB-E100 rev B1
+product DLINK DSB650C 0x4000 10Mbps Ethernet
+product DLINK DSB650TX1 0x4001 10/100 Ethernet
+product DLINK DSB650TX 0x4002 10/100 Ethernet
+product DLINK DSB650TX_PNA 0x4003 1/10/100 Ethernet
+product DLINK DSB650TX3 0x400b 10/100 Ethernet
+product DLINK DSB650TX2 0x4102 10/100 Ethernet
+product DLINK DSB650 0xabc1 10/100 Ethernet
+product DLINK2 DWLG122C1 0x3c03 DWL-G122 c1
+product DLINK2 WUA1340 0x3c04 WUA-1340
+product DLINK2 DWA111 0x3c06 DWA-111
+product DLINK2 DWA110 0x3c07 DWA-110
+
+/* DMI products */
+product DMI CFSM_RW 0xa109 CF/SM Reader/Writer
+
+/* DrayTek products */
+product DRAYTEK VIGOR550 0x0550 Vigor550
+
+/* Dynastream Innovations */
+product DYNASTREAM ANTDEVBOARD 0x1003 ANT dev board
+
+/* EIZO products */
+product EIZO HUB 0x0000 hub
+product EIZO MONITOR 0x0001 monitor
+
+/* ELCON Systemtechnik products */
+product ELCON PLAN 0x0002 Goldpfeil P-LAN
+
+/* Elecom products */
+product ELECOM MOUSE29UO 0x0002 mouse 29UO
+product ELECOM LDUSBTX0 0x200c LD-USB/TX
+product ELECOM LDUSBTX1 0x4002 LD-USB/TX
+product ELECOM LDUSBLTX 0x4005 LD-USBL/TX
+product ELECOM LDUSBTX2 0x400b LD-USB/TX
+product ELECOM LDUSB20 0x4010 LD-USB20
+product ELECOM UCSGT 0x5003 UC-SGT
+product ELECOM UCSGT0 0x5004 UC-SGT
+product ELECOM LDUSBTX3 0xabc1 LD-USB/TX
+
+/* Elsa products */
+product ELSA MODEM1 0x2265 ELSA Modem Board
+product ELSA USB2ETHERNET 0x3000 Microlink USB2Ethernet
+
+/* EMS products */
+product EMS DUAL_SHOOTER 0x0003 PSX gun controller converter
+
+/* Entrega products */
+product ENTREGA 1S 0x0001 1S serial
+product ENTREGA 2S 0x0002 2S serial
+product ENTREGA 1S25 0x0003 1S25 serial
+product ENTREGA 4S 0x0004 4S serial
+product ENTREGA E45 0x0005 E45 Ethernet
+product ENTREGA CENTRONICS 0x0006 Parallel Port
+product ENTREGA XX1 0x0008 Ethernet
+product ENTREGA 1S9 0x0093 1S9 serial
+product ENTREGA EZUSB 0x8000 EZ-USB
+/* product ENTREGA SERIAL 0x8001 DB25 Serial */
+product ENTREGA 2U4S 0x8004 2U4S serial/usb hub
+product ENTREGA XX2 0x8005 Ethernet
+/* product ENTREGA SERIAL_DB9 0x8093 DB9 Serial */
+
+/* Epson products */
+product EPSON PRINTER1 0x0001 USB Printer
+product EPSON PRINTER2 0x0002 ISD USB Smart Cable for Mac
+product EPSON PRINTER3 0x0003 ISD USB Smart Cable
+product EPSON PRINTER5 0x0005 USB Printer
+product EPSON 636 0x0101 Perfection 636U / 636Photo scanner
+product EPSON 610 0x0103 Perfection 610 scanner
+product EPSON 1200 0x0104 Perfection 1200U / 1200Photo scanner
+product EPSON 1600 0x0107 Expression 1600 scanner
+product EPSON 1640 0x010a Perfection 1640SU scanner
+product EPSON 1240 0x010b Perfection 1240U / 1240Photo scanner
+product EPSON 640U 0x010c Perfection 640U scanner
+product EPSON 1250 0x010f Perfection 1250U / 1250Photo scanner
+product EPSON 1650 0x0110 Perfection 1650 scanner
+product EPSON GT9700F 0x0112 GT-9700F scanner
+product EPSON GT9300UF 0x011b GT-9300UF scanner
+product EPSON 3200 0x011c Perfection 3200 scanner
+product EPSON 1260 0x011d Perfection 1260 scanner
+product EPSON 1660 0x011e Perfection 1660 scanner
+product EPSON 1670 0x011f Perfection 1670 scanner
+product EPSON 1270 0x0120 Perfection 1270 scanner
+product EPSON 2480 0x0121 Perfection 2480 scanner
+product EPSON 3590 0x0122 Perfection 3590 scanner
+product EPSON 4990 0x012a Perfection 4990 Photo scanner
+product EPSON STYLUS_875DC 0x0601 Stylus Photo 875DC Card Reader
+product EPSON STYLUS_895 0x0602 Stylus Photo 895 Card Reader
+product EPSON CX5400 0x0808 CX5400 scanner
+product EPSON 3500 0x080e CX-3500/3600/3650 MFP
+product EPSON RX425 0x080f Stylus Photo RX425 scanner
+product EPSON 4800 0x0819 CX4800 MP scanner
+product EPSON 4200 0x0820 CX4200 MP scanner
+product EPSON 5000 0x082b DX-50x0 MFP scanner
+product EPSON 6000 0x082e DX-60x0 MFP scanner
+product EPSON DX7400 0x0838 DX7400/CX7300 scanner
+product EPSON DX8400 0x0839 DX8400 scanner
+
+/* e-TEK Labs products */
+product ETEK 1COM 0x8007 Serial
+
+/* Extended Systems products */
+product EXTENDED XTNDACCESS 0x0100 XTNDAccess IrDA
+
+/* FEIYA products */
+product FEIYA 5IN1 0x1132 5-in-1 Card Reader
+
+/* Fiberline */
+product FIBERLINE WL430U 0x6003 WL-430U
+
+/* Fossil, Inc products */
+product FOSSIL WRISTPDA 0x0002 Wrist PDA
+
+/* Freecom products */
+product FREECOM DVD 0xfc01 DVD drive
+
+/* Fujitsu Siemens Computers products */
+product FSC E5400 0x1009 PrismGT USB 2.0 WLAN
+
+/* Future Technology Devices products */
+product FTDI SERIAL_8U100AX 0x8372 8U100AX Serial
+product FTDI SERIAL_8U232AM 0x6001 8U232AM Serial
+product FTDI SERIAL_2232C 0x6010 FT2232C Dual port Serial
+/* Gude Analog- und Digitalsysteme products also uses FTDI's id: */
+product FTDI TACTRIX_OPENPORT_13M 0xcc48 OpenPort 1.3 Mitsubishi
+product FTDI TACTRIX_OPENPORT_13S 0xcc49 OpenPort 1.3 Subaru
+product FTDI TACTRIX_OPENPORT_13U 0xcc4a OpenPort 1.3 Universal
+product FTDI EISCOU 0xe888 Expert ISDN Control USB
+product FTDI UOPTBR 0xe889 USB-RS232 OptoBridge
+product FTDI EMCU2D 0xe88a Expert mouseCLOCK USB II
+product FTDI PCMSFU 0xe88b Precision Clock MSF USB
+product FTDI EMCU2H 0xe88c Expert mouseCLOCK USB II HBG
+product FTDI USBSERIAL 0xfa00 Matrix Orbital USB Serial
+product FTDI MX2_3 0xfa01 Matrix Orbital MX2 or MX3
+product FTDI MX4_5 0xfa02 Matrix Orbital MX4 or MX5
+product FTDI LK202 0xfa03 Matrix Orbital VK/LK202 Family
+product FTDI LK204 0xfa04 Matrix Orbital VK/LK204 Family
+product FTDI CFA_632 0xfc08 Crystalfontz CFA-632 USB LCD
+product FTDI CFA_634 0xfc09 Crystalfontz CFA-634 USB LCD
+product FTDI CFA_633 0xfc0b Crystalfontz CFA-633 USB LCD
+product FTDI CFA_631 0xfc0c Crystalfontz CFA-631 USB LCD
+product FTDI CFA_635 0xfc0d Crystalfontz CFA-635 USB LCD
+product FTDI SEMC_DSS20 0xfc82 SEMC DSS-20 SyncStation
+
+/* Fuji photo products */
+product FUJIPHOTO MASS0100 0x0100 Mass Storage
+
+/* Fujitsu protducts */
+product FUJITSU AH_F401U 0x105b AH-F401U Air H device
+
+/* Garmin products */
+product GARMIN IQUE_3600 0x0004 iQue 3600
+
+/* General Instruments (Motorola) products */
+product GENERALINSTMNTS SB5100 0x5100 SURFboard SB5100 Cable modem
+
+/* Genesys Logic products */
+product GENESYS GL620USB 0x0501 GL620USB Host-Host interface
+product GENESYS GL650 0x0604 GL650 Hub
+product GENESYS GL641USB 0x0700 GL641USB CompactFlash Card Reader
+product GENESYS GL641USB2IDE_2 0x0701 GL641USB USB-IDE Bridge No 2
+product GENESYS GL641USB2IDE 0x0702 GL641USB USB-IDE Bridge
+product GENESYS GL641USB_2 0x0760 GL641USB 6-in-1 Card Reader
+
+/* GIGABYTE products */
+product GIGABYTE GN54G 0x8001 GN-54G
+product GIGABYTE GNBR402W 0x8002 GN-BR402W
+product GIGABYTE GNWLBM101 0x8003 GN-WLBM101
+product GIGABYTE GNWBKG 0x8007 GN-WBKG
+product GIGABYTE GNWB01GS 0x8008 GN-WB01GS
+product GIGABYTE GNWI05GS 0x800a GN-WI05GS
+
+/* Gigaset products */
+product GIGASET WLAN 0x0701 WLAN
+product GIGASET SMCWUSBTG 0x0710 SMCWUSBT-G
+product GIGASET SMCWUSBTG_NF 0x0711 SMCWUSBT-G (no firmware)
+product GIGASET AR5523 0x0712 AR5523
+product GIGASET AR5523_NF 0x0713 AR5523 (no firmware)
+product GIGASET RT2573 0x0722 RT2573
+
+/* Global Sun Technology product */
+product GLOBALSUN AR5523_1 0x7801 AR5523
+product GLOBALSUN AR5523_1_NF 0x7802 AR5523 (no firmware)
+product GLOBALSUN AR5523_2 0x7811 AR5523
+product GLOBALSUN AR5523_2_NF 0x7812 AR5523 (no firmware)
+
+/* Globespan products */
+product GLOBESPAN PRISM_GT_1 0x2000 PrismGT USB 2.0 WLAN
+product GLOBESPAN PRISM_GT_2 0x2002 PrismGT USB 2.0 WLAN
+
+/* G.Mate, Inc products */
+product GMATE YP3X00 0x1001 YP3X00 PDA
+
+/* GoHubs products */
+product GOHUBS GOCOM232 0x1001 GoCOM232 Serial
+
+/* Good Way Technology products */
+product GOODWAY GWUSB2E 0x6200 GWUSB2E
+product GOODWAY RT2573 0xc019 RT2573
+
+/* Gravis products */
+product GRAVIS GAMEPADPRO 0x4001 GamePad Pro
+
+/* GREENHOUSE products */
+product GREENHOUSE KANA21 0x0001 CF-writer with MP3
+
+/* Griffin Technology */
+product GRIFFIN IMATE 0x0405 iMate, ADB Adapter
+
+/* Guillemot Corporation */
+product GUILLEMOT DALEADER 0xa300 DA Leader
+product GUILLEMOT HWGUSB254 0xe000 HWGUSB2-54 WLAN
+product GUILLEMOT HWGUSB254LB 0xe010 HWGUSB2-54-LB
+product GUILLEMOT HWGUSB254V2AP 0xe020 HWGUSB2-54V2-AP
+
+/* Hagiwara products */
+product HAGIWARA FGSM 0x0002 FlashGate SmartMedia Card Reader
+product HAGIWARA FGCF 0x0003 FlashGate CompactFlash Card Reader
+product HAGIWARA FG 0x0005 FlashGate
+
+/* HAL Corporation products */
+product HAL IMR001 0x0011 Crossam2+USB IR commander
+
+/* Handspring, Inc. */
+product HANDSPRING VISOR 0x0100 Handspring Visor
+product HANDSPRING TREO 0x0200 Handspring Treo
+product HANDSPRING TREO600 0x0300 Handspring Treo 600
+
+/* Hauppauge Computer Works */
+product HAUPPAUGE WINTV_USB_FM 0x4d12 WinTV USB FM
+
+/* Hawking Technologies products */
+product HAWKING UF100 0x400c 10/100 USB Ethernet
+
+/* Hitachi, Ltd. products */
+product HITACHI DVDCAM_DZ_MV100A 0x0004 DVD-CAM DZ-MV100A Camcorder
+product HITACHI DVDCAM_USB 0x001e DVDCAM USB HS Interface
+
+/* HP products */
+product HP 895C 0x0004 DeskJet 895C
+product HP 4100C 0x0101 Scanjet 4100C
+product HP S20 0x0102 Photosmart S20
+product HP 880C 0x0104 DeskJet 880C
+product HP 4200C 0x0105 ScanJet 4200C
+product HP CDWRITERPLUS 0x0107 CD-Writer Plus
+product HP KBDHUB 0x010c Multimedia Keyboard Hub
+product HP G55XI 0x0111 OfficeJet G55xi
+product HP HN210W 0x011c HN210W 802.11b WLAN
+product HP 49GPLUS 0x0121 49g+ graphing calculator
+product HP 6200C 0x0201 ScanJet 6200C
+product HP S20b 0x0202 PhotoSmart S20
+product HP 815C 0x0204 DeskJet 815C
+product HP 3300C 0x0205 ScanJet 3300C
+product HP CDW8200 0x0207 CD-Writer Plus 8200e
+product HP MMKEYB 0x020c Multimedia keyboard
+product HP 1220C 0x0212 DeskJet 1220C
+product HP 810C 0x0304 DeskJet 810C/812C
+product HP 4300C 0x0305 Scanjet 4300C
+product HP CDW4E 0x0307 CD-Writer+ CD-4e
+product HP G85XI 0x0311 OfficeJet G85xi
+product HP 1200 0x0317 LaserJet 1200
+product HP 5200C 0x0401 Scanjet 5200C
+product HP 830C 0x0404 DeskJet 830C
+product HP 3400CSE 0x0405 ScanJet 3400cse
+product HP 6300C 0x0601 Scanjet 6300C
+product HP 840C 0x0604 DeskJet 840c
+product HP 2200C 0x0605 ScanJet 2200C
+product HP 5300C 0x0701 Scanjet 5300C
+product HP 4400C 0x0705 Scanjet 4400C
+product HP 82x0C 0x0b01 Scanjet 82x0C
+product HP 2300D 0x0b17 Laserjet 2300d
+product HP 970CSE 0x1004 Deskjet 970Cse
+product HP 5400C 0x1005 Scanjet 5400C
+product HP 2215 0x1016 iPAQ 22xx/Jornada 548
+product HP 568J 0x1116 Jornada 568
+product HP 930C 0x1204 DeskJet 930c
+product HP P2000U 0x1801 Inkjet P-2000U
+product HP 640C 0x2004 DeskJet 640c
+product HP 4670V 0x3005 ScanJet 4670v
+product HP P1100 0x3102 Photosmart P1100
+product HP OJ4215 0x3d11 OfficeJet 4215
+product HP HN210E 0x811c Ethernet HN210E
+product HP2 C500 0x6002 PhotoSmart C500
+
+/* HTC products */
+product HTC WINMOBILE 0x00ce HTC USB Sync
+product HTC PPC6700MODEM 0x00cf PPC6700 Modem
+product HTC SMARTPHONE 0x0a51 SmartPhone USB Sync
+
+/* HUAWEI products */
+product HUAWEI MOBILE 0x1001 Huawei Mobile
+product HUAWEI E220 0x1003 Huawei HSDPA modem
+
+/* HUAWEI 3com products */
+product HUAWEI3COM WUB320G 0x0009 Aolynk WUB320g
+
+/* IBM Corporation */
+product IBM USBCDROMDRIVE 0x4427 USB CD-ROM Drive
+
+/* Imagination Technologies products */
+product IMAGINATION DBX1 0x2107 DBX1 DSP core
+
+/* Inside Out Networks products */
+product INSIDEOUT EDGEPORT4 0x0001 EdgePort/4 serial ports
+
+/* In-System products */
+product INSYSTEM F5U002 0x0002 Parallel printer
+product INSYSTEM ATAPI 0x0031 ATAPI Adapter
+product INSYSTEM ISD110 0x0200 IDE Adapter ISD110
+product INSYSTEM ISD105 0x0202 IDE Adapter ISD105
+product INSYSTEM USBCABLE 0x081a USB cable
+product INSYSTEM STORAGE_V2 0x5701 USB Storage Adapter V2
+
+/* Intel products */
+product INTEL EASYPC_CAMERA 0x0110 Easy PC Camera
+product INTEL TESTBOARD 0x9890 82930 test board
+
+/* Intersil products */
+product INTERSIL PRISM_GT 0x1000 PrismGT USB 2.0 WLAN
+product INTERSIL PRISM_2X 0x3642 Prism2.x or Atmel WLAN
+
+/* Interpid Control Systems products */
+product INTREPIDCS VALUECAN 0x0601 ValueCAN CAN bus interface
+product INTREPIDCS NEOVI 0x0701 NeoVI Blue vehicle bus interface
+
+/* I/O DATA products */
+product IODATA IU_CD2 0x0204 DVD Multi-plus unit iU-CD2
+product IODATA DVR_UEH8 0x0206 DVD Multi-plus unit DVR-UEH8
+product IODATA USBSSMRW 0x0314 USB-SSMRW SD-card
+product IODATA USBSDRW 0x031e USB-SDRW SD-card
+product IODATA USBETT 0x0901 USB ETT
+product IODATA USBETTX 0x0904 USB ETTX
+product IODATA USBETTXS 0x0913 USB ETTX
+product IODATA USBWNB11A 0x0919 USB WN-B11
+product IODATA USBWNB11 0x0922 USB Airport WN-B11
+product IODATA ETGUS2 0x0930 ETG-US2
+product IODATA USBRSAQ 0x0a03 Serial USB-RSAQ1
+product IODATA2 USB2SC 0x0a09 USB2.0-SCSI Bridge USB2-SC
+
+/* Iomega products */
+product IOMEGA ZIP100 0x0001 Zip 100
+product IOMEGA ZIP250 0x0030 Zip 250
+
+/* Ituner networks products */
+product ITUNERNET USBLCD2X20 0x0002 USB-LCD 2x20
+
+/* Jablotron products */
+product JABLOTRON PC60B 0x0001 PC-60B
+
+/* Jaton products */
+product JATON EDA 0x5704 Ethernet
+
+/* JVC products */
+product JVC GR_DX95 0x000a GR-DX95
+product JVC MP_PRX1 0x3008 MP-PRX1 Ethernet
+
+/* JRC products */
+product JRC AH_J3001V_J3002V 0x0001 AirH PHONE AH-J3001V/J3002V
+
+/* Kawatsu products */
+product KAWATSU MH4000P 0x0003 MiniHub 4000P
+
+/* Keisokugiken Corp. products */
+product KEISOKUGIKEN USBDAQ 0x0068 HKS-0200 USBDAQ
+
+/* Kensington products */
+product KENSINGTON ORBIT 0x1003 Orbit USB/PS2 trackball
+product KENSINGTON TURBOBALL 0x1005 TurboBall
+
+/* Keyspan products */
+product KEYSPAN USA28_NF 0x0101 USA-28 serial Adapter (no firmware)
+product KEYSPAN USA28X_NF 0x0102 USA-28X serial Adapter (no firmware)
+product KEYSPAN USA19_NF 0x0103 USA-19 serial Adapter (no firmware)
+product KEYSPAN USA18_NF 0x0104 USA-18 serial Adapter (no firmware)
+product KEYSPAN USA18X_NF 0x0105 USA-18X serial Adapter (no firmware)
+product KEYSPAN USA19W_NF 0x0106 USA-19W serial Adapter (no firmware)
+product KEYSPAN USA19 0x0107 USA-19 serial Adapter
+product KEYSPAN USA19W 0x0108 USA-19W serial Adapter
+product KEYSPAN USA49W_NF 0x0109 USA-49W serial Adapter (no firmware)
+product KEYSPAN USA49W 0x010a USA-49W serial Adapter
+product KEYSPAN USA19QI_NF 0x010b USA-19QI serial Adapter (no firmware)
+product KEYSPAN USA19QI 0x010c USA-19QI serial Adapter
+product KEYSPAN USA19Q_NF 0x010d USA-19Q serial Adapter (no firmware)
+product KEYSPAN USA19Q 0x010e USA-19Q serial Adapter
+product KEYSPAN USA28 0x010f USA-28 serial Adapter
+product KEYSPAN USA28XXB 0x0110 USA-28X/XB serial Adapter
+product KEYSPAN USA18 0x0111 USA-18 serial Adapter
+product KEYSPAN USA18X 0x0112 USA-18X serial Adapter
+product KEYSPAN USA28XB_NF 0x0113 USA-28XB serial Adapter (no firmware)
+product KEYSPAN USA28XA_NF 0x0114 USA-28XB serial Adapter (no firmware)
+product KEYSPAN USA28XA 0x0115 USA-28XA serial Adapter
+product KEYSPAN USA18XA_NF 0x0116 USA-18XA serial Adapter (no firmware)
+product KEYSPAN USA18XA 0x0117 USA-18XA serial Adapter
+product KEYSPAN USA19QW_NF 0x0118 USA-19WQ serial Adapter (no firmware)
+product KEYSPAN USA19QW 0x0119 USA-19WQ serial Adapter
+product KEYSPAN USA19HA 0x0121 USA-19HS serial Adapter
+product KEYSPAN UIA10 0x0201 UIA-10 remote control
+product KEYSPAN UIA11 0x0202 UIA-11 remote control
+
+/* Kingston products */
+product KINGSTON XX1 0x0008 Ethernet
+product KINGSTON KNU101TX 0x000a KNU101TX USB Ethernet
+
+/* Kawasaki products */
+product KLSI DUH3E10BT 0x0008 USB Ethernet
+product KLSI DUH3E10BTN 0x0009 USB Ethernet
+
+/* Kodak products */
+product KODAK DC220 0x0100 Digital Science DC220
+product KODAK DC260 0x0110 Digital Science DC260
+product KODAK DC265 0x0111 Digital Science DC265
+product KODAK DC290 0x0112 Digital Science DC290
+product KODAK DC240 0x0120 Digital Science DC240
+product KODAK DC280 0x0130 Digital Science DC280
+
+/* Konica Corp. Products */
+product KONICA CAMERA 0x0720 Digital Color Camera
+
+/* KYE products */
+product KYE NICHE 0x0001 Niche mouse
+product KYE NETSCROLL 0x0003 Genius NetScroll mouse
+product KYE FLIGHT2000 0x1004 Flight 2000 joystick
+product KYE VIVIDPRO 0x2001 ColorPage Vivid-Pro scanner
+
+/* Kyocera products */
+product KYOCERA FINECAM_S3X 0x0100 Finecam S3x
+product KYOCERA FINECAM_S4 0x0101 Finecam S4
+product KYOCERA FINECAM_S5 0x0103 Finecam S5
+product KYOCERA FINECAM_L3 0x0105 Finecam L3
+product KYOCERA AHK3001V 0x0203 AH-K3001V
+product KYOCERA2 CDMA_MSM_K 0x17da Qualcomm Kyocera CDMA Technologies MSM
+
+/* LaCie products */
+product LACIE HD 0xa601 Hard Disk
+product LACIE CDRW 0xa602 CD R/W
+
+/* Lexar products */
+product LEXAR JUMPSHOT 0x0001 jumpSHOT CompactFlash Reader
+product LEXAR CF_READER 0xb002 USB CF Reader
+
+/* Lexmark products */
+product LEXMARK S2450 0x0009 Optra S 2450
+
+/* Linksys products */
+product LINKSYS MAUSB2 0x0105 Camedia MAUSB-2
+product LINKSYS USB10TX1 0x200c USB10TX
+product LINKSYS USB10T 0x2202 USB10T Ethernet
+product LINKSYS USB100TX 0x2203 USB100TX Ethernet
+product LINKSYS USB100H1 0x2204 USB100H1 Ethernet/HPNA
+product LINKSYS USB10TA 0x2206 USB10TA Ethernet
+product LINKSYS USB10TX2 0x400b USB10TX
+product LINKSYS2 WUSB11 0x2219 WUSB11 Wireless Adapter
+product LINKSYS2 USB200M 0x2226 USB 2.0 10/100 Ethernet
+product LINKSYS3 WUSB11v28 0x2233 WUSB11 v2.8 Wireless Adapter
+product LINKSYS4 USB1000 0x0039 USB1000
+
+/* Logitech products */
+product LOGITECH M2452 0x0203 M2452 keyboard
+product LOGITECH M4848 0x0301 M4848 mouse
+product LOGITECH PAGESCAN 0x040f PageScan
+product LOGITECH QUICKCAMWEB 0x0801 QuickCam Web
+product LOGITECH QUICKCAMPRO 0x0810 QuickCam Pro
+product LOGITECH QUICKCAMEXP 0x0840 QuickCam Express
+product LOGITECH QUICKCAM 0x0850 QuickCam
+product LOGITECH N43 0xc000 N43
+product LOGITECH N48 0xc001 N48 mouse
+product LOGITECH MBA47 0xc002 M-BA47 mouse
+product LOGITECH WMMOUSE 0xc004 WingMan Gaming Mouse
+product LOGITECH BD58 0xc00c BD58 mouse
+product LOGITECH UN58A 0xc030 iFeel Mouse
+product LOGITECH UN53B 0xc032 iFeel MouseMan
+product LOGITECH WMPAD 0xc208 WingMan GamePad Extreme
+product LOGITECH WMRPAD 0xc20a WingMan RumblePad
+product LOGITECH WMJOY 0xc281 WingMan Force joystick
+product LOGITECH BB13 0xc401 USB-PS/2 Trackball
+product LOGITECH RK53 0xc501 Cordless mouse
+product LOGITECH RB6 0xc503 Cordless keyboard
+product LOGITECH MX700 0xc506 Cordless optical mouse
+product LOGITECH QUICKCAMPRO2 0xd001 QuickCam Pro
+
+/* Logitec Corp. products */
+product LOGITEC LDR_H443SU2 0x0033 DVD Multi-plus unit LDR-H443SU2
+product LOGITEC LDR_H443U2 0x00b3 DVD Multi-plus unit LDR-H443U2
+
+/* Lucent products */
+product LUCENT EVALKIT 0x1001 USS-720 evaluation kit
+
+/* Luwen products */
+product LUWEN EASYDISK 0x0005 EasyDisc
+
+/* Macally products */
+product MACALLY MOUSE1 0x0101 mouse
+
+/* MCT Corp. */
+product MCT HUB0100 0x0100 Hub
+product MCT DU_H3SP_USB232 0x0200 D-Link DU-H3SP USB BAY Hub
+product MCT USB232 0x0210 USB-232 Interface
+product MCT SITECOM_USB232 0x0230 Sitecom USB-232 Products
+
+/* Melco, Inc products */
+product MELCO LUATX1 0x0001 LUA-TX Ethernet
+product MELCO LUATX5 0x0005 LUA-TX Ethernet
+product MELCO LUA2TX5 0x0009 LUA2-TX Ethernet
+product MELCO LUAKTX 0x0012 LUA-KTX Ethernet
+product MELCO DUBPXXG 0x001c USB-IDE Bridge: DUB-PxxG
+product MELCO LUAU2KTX 0x003d LUA-U2-KTX Ethernet
+product MELCO KG54YB 0x005e WLI-U2-KG54-YB WLAN
+product MELCO KG54 0x0066 WLI-U2-KG54 WLAN
+product MELCO KG54AI 0x0067 WLI-U2-KG54-AI WLAN
+product MELCO NINWIFI 0x008b Nintendo Wi-Fi
+product MELCO PCOPRS1 0x00b3 PC-OP-RS1 RemoteStation
+product MELCO SG54HP 0x00d8 WLI-U2-SG54HP
+product MELCO G54HP 0x00d9 WLI-U2-G54HP
+product MELCO KG54L 0x00da WLI-U2-KG54L
+
+/* Merlin products */
+product MERLIN V620 0x1110 Merlin V620
+
+/* MetaGeek products */
+product METAGEEK WISPY1B 0x083e MetaGeek Wi-Spy
+product METAGEEK WISPY24X 0x083f MetaGeek Wi-Spy 2.4x
+
+/* Metricom products */
+product METRICOM RICOCHET_GS 0x0001 Ricochet GS
+
+/* MGE UPS Systems */
+product MGE UPS1 0x0001 MGE UPS SYSTEMS PROTECTIONCENTER 1
+product MGE UPS2 0xffff MGE UPS SYSTEMS PROTECTIONCENTER 2
+
+/* Micro Star International products */
+product MSI BT_DONGLE 0x1967 Bluetooth USB dongle
+product MSI UB11B 0x6823 UB11B
+product MSI RT2570 0x6861 RT2570
+product MSI RT2570_2 0x6865 RT2570
+product MSI RT2570_3 0x6869 RT2570
+product MSI RT2573_1 0x6874 RT2573
+product MSI RT2573_2 0x6877 RT2573
+product MSI RT2573_3 0xa861 RT2573
+product MSI RT2573_4 0xa874 RT2573
+
+/* Microdia products */
+product MICRODIA TWINKLECAM 0x600d TwinkleCam USB camera
+
+/* Microsoft products */
+product MICROSOFT SIDEPREC 0x0008 SideWinder Precision Pro
+product MICROSOFT INTELLIMOUSE 0x0009 IntelliMouse
+product MICROSOFT NATURALKBD 0x000b Natural Keyboard Elite
+product MICROSOFT DDS80 0x0014 Digital Sound System 80
+product MICROSOFT SIDEWINDER 0x001a Sidewinder Precision Racing Wheel
+product MICROSOFT INETPRO 0x001c Internet Keyboard Pro
+product MICROSOFT TBEXPLORER 0x0024 Trackball Explorer
+product MICROSOFT INTELLIEYE 0x0025 IntelliEye mouse
+product MICROSOFT INETPRO2 0x002b Internet Keyboard Pro
+product MICROSOFT MN510 0x006e MN510 Wireless
+product MICROSOFT MN110 0x007a 10/100 USB NIC
+product MICROSOFT WLINTELLIMOUSE 0x008c Wireless Optical IntelliMouse
+product MICROSOFT WLNOTEBOOK 0x00b9 Wireless Optical Mouse (Model 1023)
+product MICROSOFT COMFORT3000 0x00d1 Comfort Optical Mouse 3000 (Model 1043)
+product MICROSOFT WLNOTEBOOK2 0x00e1 Wireless Optical Mouse 3000 (Model 1056)
+product MICROSOFT WLNOTEBOOK3 0x00d2 Wireless Optical Mouse 3000 (Model 1049)
+product MICROSOFT WLUSBMOUSE 0x00b9 Wireless USB Mouse
+product MICROSOFT XBOX360 0x0292 XBOX 360 WLAN
+
+/* Microtech products */
+product MICROTECH SCSIDB25 0x0004 USB-SCSI-DB25
+product MICROTECH SCSIHD50 0x0005 USB-SCSI-HD50
+product MICROTECH DPCM 0x0006 USB CameraMate
+product MICROTECH FREECOM 0xfc01 Freecom USB-IDE
+
+/* Microtek products */
+product MICROTEK 336CX 0x0094 Phantom 336CX - C3 scanner
+product MICROTEK X6U 0x0099 ScanMaker X6 - X6U
+product MICROTEK C6 0x009a Phantom C6 scanner
+product MICROTEK 336CX2 0x00a0 Phantom 336CX - C3 scanner
+product MICROTEK V6USL 0x00a3 ScanMaker V6USL
+product MICROTEK V6USL2 0x80a3 ScanMaker V6USL
+product MICROTEK V6UL 0x80ac ScanMaker V6UL
+
+/* Microtune, Inc. products */
+product MICROTUNE BT_DONGLE 0x1000 Bluetooth USB dongle
+
+/* Midiman products */
+product MIDIMAN MIDISPORT2X2 0x1001 Midisport 2x2
+
+/* MindsAtWork products */
+product MINDSATWORK WALLET 0x0001 Digital Wallet
+
+/* Minolta Co., Ltd. */
+product MINOLTA 2300 0x4001 Dimage 2300
+product MINOLTA S304 0x4007 Dimage S304
+product MINOLTA X 0x4009 Dimage X
+product MINOLTA 5400 0x400e Dimage 5400
+product MINOLTA F300 0x4011 Dimage F300
+product MINOLTA E223 0x4017 Dimage E223
+
+/* Mitsumi products */
+product MITSUMI CDRRW 0x0000 CD-R/RW Drive
+product MITSUMI BT_DONGLE 0x641f Bluetooth USB dongle
+product MITSUMI FDD 0x6901 USB FDD
+
+/* Mobility products */
+product MOBILITY EA 0x0204 Ethernet
+product MOBILITY EASIDOCK 0x0304 EasiDock Ethernet
+
+/* MosChip products */
+product MOSCHIP MCS7703 0x7703 MCS7703 Serial Port Adapter
+product MOSCHIP MCS7830 0x7830 MCS7830 Ethernet
+
+/* Motorola products */
+product MOTOROLA MC141555 0x1555 MC141555 hub controller
+product MOTOROLA SB4100 0x4100 SB4100 USB Cable Modem
+product MOTOROLA2 A41XV32X 0x2a22 A41x/V32x Mobile Phones
+product MOTOROLA2 E398 0x4810 E398 Mobile Phone
+product MOTOROLA2 USBLAN 0x600c USBLAN
+product MOTOROLA2 USBLAN2 0x6027 USBLAN
+
+/* MultiTech products */
+product MULTITECH ATLAS 0xf101 MT5634ZBA-USB modem
+
+/* Mustek products */
+product MUSTEK 1200CU 0x0001 1200 CU scanner
+product MUSTEK 600CU 0x0002 600 CU scanner
+product MUSTEK 1200USB 0x0003 1200 USB scanner
+product MUSTEK 1200UB 0x0006 1200 UB scanner
+product MUSTEK 1200USBPLUS 0x0007 1200 USB Plus scanner
+product MUSTEK 1200CUPLUS 0x0008 1200 CU Plus scanner
+product MUSTEK BEARPAW1200F 0x0010 BearPaw 1200F scanner
+product MUSTEK BEARPAW1200TA 0x021e BearPaw 1200TA scanner
+product MUSTEK 600USB 0x0873 600 USB scanner
+product MUSTEK MDC800 0xa800 MDC-800 digital camera
+
+/* M-Systems products */
+product MSYSTEMS DISKONKEY 0x0010 DiskOnKey
+product MSYSTEMS DISKONKEY2 0x0011 DiskOnKey
+
+/* Myson products */
+product MYSON HEDEN 0x8818 USB-IDE
+
+/* National Semiconductor */
+product NATIONAL BEARPAW1200 0x1000 BearPaw 1200
+product NATIONAL BEARPAW2400 0x1001 BearPaw 2400
+
+/* NEC products */
+product NEC HUB 0x55aa hub
+product NEC HUB_B 0x55ab hub
+
+/* NEODIO products */
+product NEODIO ND3260 0x3260 8-in-1 Multi-format Flash Controller
+product NEODIO ND5010 0x5010 Multi-format Flash Controller
+
+/* Netac products */
+product NETAC CF_CARD 0x1060 USB-CF-Card
+product NETAC ONLYDISK 0x0003 OnlyDisk
+
+/* NetChip Technology Products */
+product NETCHIP TURBOCONNECT 0x1080 Turbo-Connect
+product NETCHIP CLIK_40 0xa140 USB Clik! 40
+product NETCHIP ETHERNETGADGET 0xa4a2 Linux Ethernet/RNDIS gadget on pxa210/25x/26x
+
+/* Netgear products */
+product NETGEAR EA101 0x1001 Ethernet
+product NETGEAR EA101X 0x1002 Ethernet
+product NETGEAR FA101 0x1020 Ethernet 10/100, USB1.1
+product NETGEAR FA120 0x1040 USB 2.0 Ethernet
+product NETGEAR WG111V2_2 0x4240 PrismGT USB 2.0 WLAN
+product NETGEAR WG111U 0x4300 WG111U
+product NETGEAR WG111U_NF 0x4301 WG111U (no firmware)
+product NETGEAR2 MA101 0x4100 MA101
+product NETGEAR2 MA101B 0x4102 MA101 Rev B
+product NETGEAR3 WG111T 0x4250 WG111T
+product NETGEAR3 WG111T_NF 0x4251 WG111T (no firmware)
+product NETGEAR3 WPN111 0x5f00 WPN111
+product NETGEAR3 WPN111_NF 0x5f01 WPN111 (no firmware)
+
+/* Nikon products */
+product NIKON E990 0x0102 Digital Camera E990
+product NIKON LS40 0x4000 CoolScan LS40 ED
+product NIKON D300 0x041a Digital Camera D300
+
+/* NovaTech Products */
+product NOVATECH NV902 0x9020 NovaTech NV-902W
+product NOVATECH RT2573 0x9021 RT2573
+
+/* Novatel Wireless products */
+product NOVATEL V640 0x1100 Merlin V620
+product NOVATEL CDMA_MODEM 0x1110 Novatel Wireless Merlin CDMA
+product NOVATEL V620 0x1110 Merlin V620
+product NOVATEL V740 0x1120 Merlin V740
+product NOVATEL V720 0x1130 Merlin V720
+product NOVATEL U740 0x1400 Merlin U740
+product NOVATEL U740_2 0x1410 Merlin U740
+product NOVATEL U870 0x1420 Merlin U870
+product NOVATEL XU870 0x1430 Merlin XU870
+product NOVATEL X950D 0x1450 Merlin X950D
+product NOVATEL ES620 0x2100 ES620 CDMA
+product NOVATEL U720 0x2110 Merlin U720
+product NOVATEL U727 0x4100 Merlin U727 CDMA
+product NOVATEL MC950D 0x4400 Novatel MC950D HSUPA
+product NOVATEL ZEROCD 0x5010 Novatel ZeroCD
+product NOVATEL2 FLEXPACKGPS 0x0100 NovAtel FlexPack GPS receiver
+
+/* Merlin products */
+product MERLIN V620 0x1110 Merlin V620
+
+/* Olympus products */
+product OLYMPUS C1 0x0102 C-1 Digital Camera
+product OLYMPUS C700 0x0105 C-700 Ultra Zoom
+
+/* OmniVision Technologies, Inc. products */
+product OMNIVISION OV511 0x0511 OV511 Camera
+product OMNIVISION OV511PLUS 0xa511 OV511+ Camera
+
+/* OnSpec Electronic, Inc. */
+product ONSPEC SDS_HOTFIND_D 0x0400 SDS-infrared.com Hotfind-D Infrared Camera
+product ONSPEC MDCFE_B_CF_READER 0xa000 MDCFE-B USB CF Reader
+product ONSPEC CFMS_RW 0xa001 SIIG/Datafab Memory Stick+CF Reader/Writer
+product ONSPEC READER 0xa003 Datafab-based Reader
+product ONSPEC CFSM_READER 0xa005 PNY/Datafab CF+SM Reader
+product ONSPEC CFSM_READER2 0xa006 Simple Tech/Datafab CF+SM Reader
+product ONSPEC MDSM_B_READER 0xa103 MDSM-B reader
+product ONSPEC CFSM_COMBO 0xa109 USB to CF + SM Combo (LC1)
+product ONSPEC UCF100 0xa400 FlashLink UCF-100 CompactFlash Reader
+product ONSPEC2 IMAGEMATE_SDDR55 0xa103 ImageMate SDDR55
+
+/* Option products */
+product OPTION VODAFONEMC3G 0x5000 Vodafone Mobile Connect 3G datacard
+product OPTION GT3G 0x6000 GlobeTrotter 3G datacard
+product OPTION GT3GQUAD 0x6300 GlobeTrotter 3G QUAD datacard
+product OPTION GT3GPLUS 0x6600 GlobeTrotter 3G+ datacard
+product OPTION GTMAX36 0x6701 GlobeTrotter Max 3.6 Modem
+product OPTION GTMAXHSUPA 0x7001 GlobeTrotter HSUPA
+
+/* OQO */
+product OQO WIFI01 0x0002 model 01 WiFi interface
+product OQO BT01 0x0003 model 01 Bluetooth interface
+product OQO ETHER01PLUS 0x7720 model 01+ Ethernet
+product OQO ETHER01 0x8150 model 01 Ethernet interface
+
+/* Palm Computing, Inc. product */
+product PALM SERIAL 0x0080 USB Serial
+product PALM M500 0x0001 Palm m500
+product PALM M505 0x0002 Palm m505
+product PALM M515 0x0003 Palm m515
+product PALM I705 0x0020 Palm i705
+product PALM TUNGSTEN_Z 0x0031 Palm Tungsten Z
+product PALM M125 0x0040 Palm m125
+product PALM M130 0x0050 Palm m130
+product PALM TUNGSTEN_T 0x0060 Palm Tungsten T
+product PALM ZIRE31 0x0061 Palm Zire 31
+product PALM ZIRE 0x0070 Palm Zire
+
+/* Panasonic products */
+product PANASONIC LS120CAM 0x0901 LS-120 Camera
+product PANASONIC KXL840AN 0x0d01 CD-R Drive KXL-840AN
+product PANASONIC KXLRW32AN 0x0d09 CD-R Drive KXL-RW32AN
+product PANASONIC KXLCB20AN 0x0d0a CD-R Drive KXL-CB20AN
+product PANASONIC KXLCB35AN 0x0d0e DVD-ROM & CD-R/RW
+product PANASONIC SDCAAE 0x1b00 MultiMediaCard
+
+/* Peracom products */
+product PERACOM SERIAL1 0x0001 Serial
+product PERACOM ENET 0x0002 Ethernet
+product PERACOM ENET3 0x0003 At Home Ethernet
+product PERACOM ENET2 0x0005 Ethernet
+
+/* Philips products */
+product PHILIPS DSS350 0x0101 DSS 350 Digital Speaker System
+product PHILIPS DSS 0x0104 DSS XXX Digital Speaker System
+product PHILIPS HUB 0x0201 hub
+product PHILIPS PCA646VC 0x0303 PCA646VC PC Camera
+product PHILIPS PCVC680K 0x0308 PCVC680K Vesta Pro PC Camera
+product PHILIPS DSS150 0x0471 DSS 150 Digital Speaker System
+product PHILIPS SNU5600 0x1236 SNU5600
+product PHILIPS UM10016 0x1552 ISP 1581 Hi-Speed USB MPEG2 Encoder Reference Kit
+product PHILIPS DIVAUSB 0x1801 DIVA USB mp3 player
+
+/* Philips Semiconductor products */
+product PHILIPSSEMI HUB1122 0x1122 hub
+
+/* P.I. Engineering products */
+product PIENGINEERING PS2USB 0x020b PS2 to Mac USB Adapter
+
+/* Planex Communications products */
+product PLANEX GW_US11H 0x14ea GW-US11H WLAN
+product PLANEX2 GW_US11S 0x3220 GW-US11S WLAN
+product PLANEX2 GW_US54GXS 0x5303 GW-US54GXS WLAN
+product PLANEX2 GWUS54HP 0xab01 GW-US54HP
+product PLANEX2 GWUS54MINI2 0xab50 GW-US54Mini2
+product PLANEX2 GWUS54SG 0xc002 GW-US54SG
+product PLANEX2 GWUS54GZL 0xc007 GW-US54GZL
+product PLANEX2 GWUS54GD 0xed01 GW-US54GD
+product PLANEX2 GWUSMM 0xed02 GW-USMM
+product PLANEX3 GWUS54GZ 0xab10 GW-US54GZ
+product PLANEX3 GU1000T 0xab11 GU-1000T
+product PLANEX3 GWUS54MINI 0xab13 GW-US54Mini
+
+/* Plextor Corp. */
+product PLEXTOR 40_12_40U 0x0011 PlexWriter 40/12/40U
+
+/* PLX products */
+product PLX TESTBOARD 0x9060 test board
+
+/* PNY products */
+product PNY ATTACHE2 0x0010 USB 2.0 Flash Drive
+
+/* PortGear products */
+product PORTGEAR EA8 0x0008 Ethernet
+product PORTGEAR EA9 0x0009 Ethernet
+
+/* Portsmith products */
+product PORTSMITH EEA 0x3003 Express Ethernet
+
+/* Primax products */
+product PRIMAX G2X300 0x0300 G2-200 scanner
+product PRIMAX G2E300 0x0301 G2E-300 scanner
+product PRIMAX G2300 0x0302 G2-300 scanner
+product PRIMAX G2E3002 0x0303 G2E-300 scanner
+product PRIMAX 9600 0x0340 Colorado USB 9600 scanner
+product PRIMAX 600U 0x0341 Colorado 600u scanner
+product PRIMAX 6200 0x0345 Visioneer 6200 scanner
+product PRIMAX 19200 0x0360 Colorado USB 19200 scanner
+product PRIMAX 1200U 0x0361 Colorado 1200u scanner
+product PRIMAX G600 0x0380 G2-600 scanner
+product PRIMAX 636I 0x0381 ReadyScan 636i
+product PRIMAX G2600 0x0382 G2-600 scanner
+product PRIMAX G2E600 0x0383 G2E-600 scanner
+product PRIMAX COMFORT 0x4d01 Comfort
+product PRIMAX MOUSEINABOX 0x4d02 Mouse-in-a-Box
+product PRIMAX PCGAUMS1 0x4d04 Sony PCGA-UMS1
+
+/* Prolific products */
+product PROLIFIC PL2301 0x0000 PL2301 Host-Host interface
+product PROLIFIC PL2302 0x0001 PL2302 Host-Host interface
+product PROLIFIC RSAQ2 0x04bb PL2303 Serial (IODATA USB-RSAQ2)
+product PROLIFIC PL2303 0x2303 PL2303 Serial (ATEN/IOGEAR UC232A)
+product PROLIFIC PL2305 0x2305 Parallel printer
+product PROLIFIC ATAPI4 0x2307 ATAPI-4 Controller
+product PROLIFIC PL2501 0x2501 PL2501 Host-Host interface
+product PROLIFIC PHAROS 0xaaa0 Prolific Pharos
+product PROLIFIC RSAQ3 0xaaa2 PL2303 Serial Adapter (IODATA USB-RSAQ3)
+product PROLIFIC2 WSIM 0x2001 Willcom WSIM
+
+/* Putercom products */
+product PUTERCOM UPA100 0x047e USB-1284 BRIDGE
+
+/* Qcom products */
+product QCOM RT2573 0x6196 RT2573
+product QCOM RT2573_2 0x6229 RT2573
+
+/* Qualcomm products */
+product QUALCOMM CDMA_MSM 0x6000 CDMA Technologies MSM phone
+product QUALCOMM2 RWT_FCT 0x3100 RWT FCT-CDMA 2000 1xRTT modem
+product QUALCOMM2 CDMA_MSM 0x3196 CDMA Technologies MSM modem
+product QUALCOMMINC CDMA_MSM 0x0001 CDMA Technologies MSM modem
+product QUALCOMMINC ZTE_STOR 0x2000 USB ZTE Storage
+
+/* Qtronix products */
+product QTRONIX 980N 0x2011 Scorpion-980N keyboard
+
+/* Quickshot products */
+product QUICKSHOT STRIKEPAD 0x6238 USB StrikePad
+
+/* Radio Shack */
+product RADIOSHACK USBCABLE 0x4026 USB to Serial Cable
+
+/* Rainbow Technologies products */
+product RAINBOW IKEY2000 0x1200 i-Key 2000
+
+/* Ralink Technology products */
+product RALINK RT2570 0x1706 RT2500USB Wireless Adapter
+product RALINK RT2570_2 0x2570 RT2500USB Wireless Adapter
+product RALINK RT2573 0x2573 RT2501USB Wireless Adapter
+product RALINK RT2671 0x2671 RT2601USB Wireless Adapter
+product RALINK RT2570_3 0x9020 RT2500USB Wireless Adapter
+product RALINK RT2573_2 0x9021 RT2501USB Wireless Adapter
+
+/* ReakTek products */
+/* Green House and CompUSA OEM this part */
+product REALTEK USBKR100 0x8150 USBKR100 USB Ethernet
+
+/* Ricoh products */
+product RICOH VGPVCC2 0x1830 VGP-VCC2 Camera
+product RICOH VGPVCC3 0x1832 VGP-VCC3 Camera
+product RICOH VGPVCC2_2 0x1833 VGP-VCC2 Camera
+product RICOH VGPVCC2_3 0x1834 VGP-VCC2 Camera
+product RICOH VGPVCC7 0x183a VGP-VCC7 Camera
+product RICOH VGPVCC8 0x183b VGP-VCC8 Camera
+
+/* Roland products */
+product ROLAND UM1 0x0009 UM-1 MIDI I/F
+product ROLAND UM880N 0x0014 EDIROL UM-880 MIDI I/F (native)
+product ROLAND UM880G 0x0015 EDIROL UM-880 MIDI I/F (generic)
+
+/* Rockfire products */
+product ROCKFIRE GAMEPAD 0x2033 gamepad 203USB
+
+/* RATOC Systems products */
+product RATOC REXUSB60 0xb000 REX-USB60
+
+/* Sagem products */
+product SAGEM USBSERIAL 0x0027 USB-Serial Controller
+product SAGEM XG760A 0x004a XG-760A
+product SAGEM XG76NA 0x0062 XG-76NA
+
+/* Samsung products */
+product SAMSUNG ML6060 0x3008 ML-6060 laser printer
+product SAMSUNG YP_U2 0x5050 YP-U2 MP3 Player
+product SAMSUNG I500 0x6601 I500 Palm USB Phone
+
+/* Samsung Techwin products */
+product SAMSUNG_TECHWIN DIGIMAX_410 0x000a Digimax 410
+
+/* SanDisk products */
+product SANDISK SDDR05A 0x0001 ImageMate SDDR-05a
+product SANDISK SDDR31 0x0002 ImageMate SDDR-31
+product SANDISK SDDR05 0x0005 ImageMate SDDR-05
+product SANDISK SDDR12 0x0100 ImageMate SDDR-12
+product SANDISK SDDR09 0x0200 ImageMate SDDR-09
+product SANDISK SDDR75 0x0810 ImageMate SDDR-75
+product SANDISK SDCZ2_256 0x7104 Cruzer Mini 256MB
+product SANDISK SDCZ4_128 0x7112 Cruzer Micro 128MB
+product SANDISK SDCZ4_256 0x7113 Cruzer Micro 256MB
+
+/* Sanyo Electric products */
+product SANYO SCP4900 0x0701 Sanyo SCP-4900 USB Phone
+
+/* ScanLogic products */
+product SCANLOGIC SL11R 0x0002 SL11R IDE Adapter
+product SCANLOGIC 336CX 0x0300 Phantom 336CX - C3 scanner
+
+/* Senao products */
+product SENAO NUB8301 0x2000 NUB-8301
+
+/* ShanTou products */
+product SHANTOU ST268 0x0268 ST268
+product SHANTOU DM9601 0x9601 DM 9601
+
+/* Shark products */
+product SHARK PA 0x0400 Pocket Adapter
+
+/* Sharp products */
+product SHARP SL5500 0x8004 Zaurus SL-5500 PDA
+product SHARP SLA300 0x8005 Zaurus SL-A300 PDA
+product SHARP SL5600 0x8006 Zaurus SL-5600 PDA
+product SHARP SLC700 0x8007 Zaurus SL-C700 PDA
+product SHARP SLC750 0x9031 Zaurus SL-C750 PDA
+product SHARP WZERO3ES 0x9123 W-ZERO3 ES Smartphone
+
+/* Shuttle Technology products */
+product SHUTTLE EUSB 0x0001 E-USB Bridge
+product SHUTTLE EUSCSI 0x0002 eUSCSI Bridge
+product SHUTTLE SDDR09 0x0003 ImageMate SDDR09
+product SHUTTLE EUSBCFSM 0x0005 eUSB SmartMedia / CompactFlash Adapter
+product SHUTTLE ZIOMMC 0x0006 eUSB MultiMediaCard Adapter
+product SHUTTLE HIFD 0x0007 Sony Hifd
+product SHUTTLE EUSBATAPI 0x0009 eUSB ATA/ATAPI Adapter
+product SHUTTLE CF 0x000a eUSB CompactFlash Adapter
+product SHUTTLE EUSCSI_B 0x000b eUSCSI Bridge
+product SHUTTLE EUSCSI_C 0x000c eUSCSI Bridge
+product SHUTTLE CDRW 0x0101 CD-RW Device
+product SHUTTLE EUSBORCA 0x0325 eUSB ORCA Quad Reader
+
+/* Siemens products */
+product SIEMENS SPEEDSTREAM 0x1001 SpeedStream
+product SIEMENS SPEEDSTREAM22 0x1022 SpeedStream 1022
+product SIEMENS2 WLL013 0x001b WLL013
+product SIEMENS2 ES75 0x0034 GSM module MC35
+product SIEMENS2 WL54G 0x3c06 54g USB Network Adapter
+product SIEMENS3 SX1 0x0001 SX1
+product SIEMENS3 X65 0x0003 X65
+product SIEMENS3 X75 0x0004 X75
+
+/* Sierra Wireless products */
+product SIERRA AIRCARD580 0x0112 Sierra Wireless AirCard 580
+product SIERRA AIRCARD595 0x0019 Sierra Wireless AirCard 595
+product SIERRA AC595U 0x0120 Sierra Wireless AirCard 595U
+product SIERRA AC597E 0x0021 Sierra Wireless AirCard 597E
+product SIERRA C597 0x0023 Sierra Wireless Compass 597
+product SIERRA AC880 0x6850 Sierra Wireless AirCard 880
+product SIERRA AC881 0x6851 Sierra Wireless AirCard 881
+product SIERRA AC880E 0x6852 Sierra Wireless AirCard 880E
+product SIERRA AC881E 0x6853 Sierra Wireless AirCard 881E
+product SIERRA AC880U 0x6855 Sierra Wireless AirCard 880U
+product SIERRA AC881U 0x6856 Sierra Wireless AirCard 881U
+product SIERRA EM5625 0x0017 EM5625
+product SIERRA MC5720 0x0218 MC5720 Wireless Modem
+product SIERRA MC5720_2 0x0018 MC5720
+product SIERRA MC5725 0x0020 MC5725
+product SIERRA MINI5725 0x0220 Sierra Wireless miniPCI 5275
+product SIERRA MC8755_2 0x6802 MC8755
+product SIERRA MC8765 0x6803 MC8765
+product SIERRA MC8755 0x6804 MC8755
+product SIERRA AC875U 0x6812 AC875U HSDPA USB Modem
+product SIERRA MC8755_3 0x6813 MC8755 HSDPA
+product SIERRA MC8775_2 0x6815 MC8775
+product SIERRA AIRCARD875 0x6820 Aircard 875 HSDPA
+product SIERRA MC8780 0x6832 MC8780
+product SIERRA MC8781 0x6833 MC8781
+product SIERRA TRUINSTALL 0x0fff Aircard Tru Installer
+
+/* Sigmatel products */
+product SIGMATEL I_BEAD100 0x8008 i-Bead 100 MP3 Player
+
+/* SIIG products */
+/* Also: Omnidirectional Control Technology products */
+product SIIG DIGIFILMREADER 0x0004 DigiFilm-Combo Reader
+product SIIG WINTERREADER 0x0330 WINTERREADER Reader
+product SIIG2 USBTOETHER 0x0109 USB TO Ethernet
+product SIIG2 US2308 0x0421 Serial
+
+/* Silicom products */
+product SILICOM U2E 0x0001 U2E
+product SILICOM GPE 0x0002 Psion Gold Port Ethernet
+
+/* SI Labs */
+product SILABS POLOLU 0x803b Pololu Serial
+product SILABS ARGUSISP 0x8066 Argussoft ISP
+product SILABS CRUMB128 0x807a Crumb128 board
+product SILABS DEGREE 0x80ca Degree Controls Inc
+product SILABS TRAQMATE 0x80ed Track Systems Traqmate
+product SILABS SUUNTO 0x80f6 Suunto Sports Instrument
+product SILABS BURNSIDE 0x813d Burnside Telecon Deskmobile
+product SILABS HELICOM 0x815e Helicomm IP-Link 1220-DVM
+product SILABS CP2102 0xea60 SILABS USB UART
+product SILABS LIPOWSKY_JTAG 0x81c8 Lipowsky Baby-JTAG
+product SILABS LIPOWSKY_LIN 0x81e2 Lipowsky Baby-LIN
+product SILABS LIPOWSKY_HARP 0x8218 Lipowsky HARP-1
+product SILABS CP2102 0xea60 SILABS USB UARTa
+product SILABS CP210X_2 0xea61 CP210x Serial
+product SILABS2 DCU11CLONE 0xaa26 DCU-11 clone
+
+/* Silicon Portals Inc. */
+product SILICONPORTALS YAPPH_NF 0x0200 YAP Phone (no firmware)
+product SILICONPORTALS YAPPHONE 0x0201 YAP Phone
+
+/* Sirius Technologies products */
+product SIRIUS ROADSTER 0x0001 NetComm Roadster II 56 USB
+
+/* Sitecom products */
+product SITECOM LN029 0x182d USB 2.0 Ethernet
+product SITECOM SERIAL 0x2068 USB to serial cable (v2)
+product SITECOM2 WL022 0x182d WL-022
+
+/* Sitecom Europe products */
+product SITECOMEU LN028 0x061c LN-028
+product SITECOMEU WL113 0x9071 WL-113
+product SITECOMEU ZD1211B 0x9075 ZD1211B
+product SITECOMEU WL172 0x90ac WL-172
+product SITECOMEU WL113R2 0x9712 WL-113 rev 2
+
+/* Skanhex Technology products */
+product SKANHEX MD_7425 0x410a MD 7425 Camera
+product SKANHEX SX_520Z 0x5200 SX 520z Camera
+
+/* SmartBridges products */
+product SMARTBRIDGES SMARTLINK 0x0001 SmartLink USB Ethernet
+product SMARTBRIDGES SMARTNIC 0x0003 smartNIC 2 PnP Ethernet
+
+/* SMC products */
+product SMC 2102USB 0x0100 10Mbps Ethernet
+product SMC 2202USB 0x0200 10/100 Ethernet
+product SMC 2206USB 0x0201 EZ Connect USB Ethernet
+product SMC 2862WG 0xee13 EZ Connect Wireless Adapter
+product SMC2 2020HUB 0x2020 USB Hub
+product SMC3 2662WUSB 0xa002 2662W-AR Wireless
+
+/* SOHOware products */
+product SOHOWARE NUB100 0x9100 10/100 USB Ethernet
+product SOHOWARE NUB110 0x9110 10/100 USB Ethernet
+
+/* SOLID YEAR products */
+product SOLIDYEAR KEYBOARD 0x2101 Solid Year USB keyboard
+
+/* SONY products */
+product SONY DSC 0x0010 DSC cameras
+product SONY MS_NW_MS7 0x0025 Memorystick NW-MS7
+product SONY PORTABLE_HDD_V2 0x002b Portable USB Harddrive V2
+product SONY MSACUS1 0x002d Memorystick MSAC-US1
+product SONY HANDYCAM 0x002e Handycam
+product SONY MSC 0x0032 MSC memory stick slot
+product SONY CLIE_35 0x0038 Sony Clie v3.5
+product SONY MS_PEG_N760C 0x0058 PEG N760c Memorystick
+product SONY CLIE_40 0x0066 Sony Clie v4.0
+product SONY MS_MSC_U03 0x0069 Memorystick MSC-U03
+product SONY CLIE_40_MS 0x006d Sony Clie v4.0 Memory Stick slot
+product SONY CLIE_S360 0x0095 Sony Clie s360
+product SONY CLIE_41_MS 0x0099 Sony Clie v4.1 Memory Stick slot
+product SONY CLIE_41 0x009a Sony Clie v4.1
+product SONY CLIE_NX60 0x00da Sony Clie nx60
+product SONY CLIE_TH55 0x0144 Sony Clie th55
+product SONY CLIE_TJ37 0x0169 Sony Clie tj37
+product SONY RF_RECEIVER 0x01db Sony RF mouse/kbd Receiver VGP-WRC1
+
+/* Sony Ericsson products */
+product SONYERICSSON DCU10 0x0528 USB Cable
+
+/* SOURCENEXT products */
+product SOURCENEXT KEIKAI8 0x039f KeikaiDenwa 8
+product SOURCENEXT KEIKAI8_CHG 0x012e KeikaiDenwa 8 with charger
+
+/* SparkLAN products */
+product SPARKLAN RT2573 0x0004 RT2573
+
+/* Sphairon Access Systems GmbH products */
+product SPHAIRON UB801R 0x0110 UB801R
+
+/* STMicroelectronics products */
+product STMICRO BIOCPU 0x2016 Biometric Coprocessor
+product STMICRO COMMUNICATOR 0x7554 USB Communicator
+
+/* STSN products */
+product STSN STSN0001 0x0001 Internet Access Device
+
+/* SUN Corporation products */
+product SUNTAC DS96L 0x0003 SUNTAC U-Cable type D2
+product SUNTAC PS64P1 0x0005 SUNTAC U-Cable type P1
+product SUNTAC VS10U 0x0009 SUNTAC Slipper U
+product SUNTAC IS96U 0x000a SUNTAC Ir-Trinity
+product SUNTAC AS64LX 0x000b SUNTAC U-Cable type A3
+product SUNTAC AS144L4 0x0011 SUNTAC U-Cable type A4
+
+/* Sun Microsystems products */
+product SUN KEYBOARD 0x0005 Type 6 USB keyboard
+/* XXX The above is a North American PC style keyboard possibly */
+product SUN MOUSE 0x0100 Type 6 USB mouse
+
+/* Supra products */
+product DIAMOND2 SUPRAEXPRESS56K 0x07da Supra Express 56K modem
+product DIAMOND2 SUPRA2890 0x0b4a SupraMax 2890 56K Modem
+product DIAMOND2 RIO600USB 0x5001 Rio 600 USB
+product DIAMOND2 RIO800USB 0x5002 Rio 800 USB
+
+/* Surecom Technology products */
+product SURECOM RT2570 0x11f3 RT2570
+product SURECOM RT2573 0x31f3 RT2573
+
+/* Sweex products */
+product SWEEX ZD1211 0x1809 ZD1211
+
+/* System TALKS, Inc. */
+product SYSTEMTALKS SGCX2UL 0x1920 SGC-X2UL
+
+/* Tapwave products */
+product TAPWAVE ZODIAC 0x0100 Zodiac
+
+/* Taugagreining products */
+product TAUGA CAMERAMATE 0x0005 CameraMate (DPCM_USB)
+
+/* TDK products */
+product TDK UPA9664 0x0115 USB-PDC Adapter UPA9664
+product TDK UCA1464 0x0116 USB-cdmaOne Adapter UCA1464
+product TDK UHA6400 0x0117 USB-PHS Adapter UHA6400
+product TDK UPA6400 0x0118 USB-PHS Adapter UPA6400
+product TDK BT_DONGLE 0x0309 Bluetooth USB dongle
+
+/* TEAC products */
+product TEAC FD05PUB 0x0000 FD-05PUB floppy
+
+/* Tekram Technology products */
+product TEKRAM QUICKWLAN 0x1630 QuickWLAN
+product TEKRAM ZD1211_1 0x5630 ZD1211
+product TEKRAM ZD1211_2 0x6630 ZD1211
+
+/* Telex Communications products */
+product TELEX MIC1 0x0001 Enhanced USB Microphone
+
+/* Ten X Technology, Inc. */
+product TENX UAUDIO0 0xf211 USB audio headset
+
+/* Texas Intel products */
+product TI UTUSB41 0x1446 UT-USB41 hub
+product TI TUSB2046 0x2046 TUSB2046 hub
+
+/* Thrustmaster products */
+product THRUST FUSION_PAD 0xa0a3 Fusion Digital Gamepad
+
+/* Topre Corporation products */
+product TOPRE HHKB 0x0100 HHKB Professional
+
+/* Toshiba Corporation products */
+product TOSHIBA POCKETPC_E740 0x0706 PocketPC e740
+
+/* Trek Technology products */
+product TREK THUMBDRIVE 0x1111 ThumbDrive
+product TREK MEMKEY 0x8888 IBM USB Memory Key
+product TREK THUMBDRIVE_8MB 0x9988 ThumbDrive_8MB
+
+/* Tripp-Lite products */
+product TRIPPLITE U209 0x2008 Serial
+
+/* Trumpion products */
+product TRUMPION T33520 0x1001 T33520 USB Flash Card Controller
+product TRUMPION C3310 0x1100 Comotron C3310 MP3 player
+product TRUMPION MP3 0x1200 MP3 player
+
+/* TwinMOS */
+product TWINMOS G240 0xa006 G240
+product TWINMOS MDIV 0x1325 Memory Disk IV
+
+/* Ubiquam products */
+product UBIQUAM UALL 0x3100 CDMA 1xRTT USB Modem (U-100/105/200/300/520)
+
+/* Ultima products */
+product ULTIMA 1200UBPLUS 0x4002 1200 UB Plus scanner
+
+/* UMAX products */
+product UMAX ASTRA1236U 0x0002 Astra 1236U Scanner
+product UMAX ASTRA1220U 0x0010 Astra 1220U Scanner
+product UMAX ASTRA2000U 0x0030 Astra 2000U Scanner
+product UMAX ASTRA2100U 0x0130 Astra 2100U Scanner
+product UMAX ASTRA2200U 0x0230 Astra 2200U Scanner
+product UMAX ASTRA3400 0x0060 Astra 3400 Scanner
+
+/* U-MEDIA Communications products */
+product UMEDIA TEW444UBEU 0x3006 TEW-444UB EU
+product UMEDIA TEW444UBEU_NF 0x3007 TEW-444UB EU (no firmware)
+product UMEDIA TEW429UB_A 0x300a TEW-429UB_A
+product UMEDIA TEW429UB 0x300b TEW-429UB
+product UMEDIA TEW429UBC1 0x300d TEW-429UB C1
+product UMEDIA ALL0298V2 0x3204 ALL0298 v2
+product UMEDIA AR5523_2 0x3205 AR5523
+product UMEDIA AR5523_2_NF 0x3206 AR5523 (no firmware)
+
+/* Universal Access products */
+product UNIACCESS PANACHE 0x0101 Panache Surf USB ISDN Adapter
+
+/* U.S. Robotics products */
+product USR USR5423 0x0121 USR5423 WLAN
+
+/* VIA Technologies products */
+product VIA USB2IDEBRIDGE 0x6204 USB 2.0 IDE Bridge
+
+/* USI products */
+product USI MC60 0x10c5 MC60 Serial
+
+/* VidzMedia products */
+product VIDZMEDIA MONSTERTV 0x4fb1 MonsterTV P2H
+
+/* Vision products */
+product VISION VC6452V002 0x0002 CPiA Camera
+
+/* Visioneer products */
+product VISIONEER 7600 0x0211 OneTouch 7600
+product VISIONEER 5300 0x0221 OneTouch 5300
+product VISIONEER 3000 0x0224 Scanport 3000
+product VISIONEER 6100 0x0231 OneTouch 6100
+product VISIONEER 6200 0x0311 OneTouch 6200
+product VISIONEER 8100 0x0321 OneTouch 8100
+product VISIONEER 8600 0x0331 OneTouch 8600
+
+/* Vivitar products */
+product VIVITAR 35XX 0x0003 Vivicam 35Xx
+
+/* VTech products */
+product VTECH RT2570 0x3012 RT2570
+product VTECH ZD1211B 0x3014 ZD1211B
+
+/* Wacom products */
+product WACOM CT0405U 0x0000 CT-0405-U Tablet
+product WACOM GRAPHIRE 0x0010 Graphire
+product WACOM GRAPHIRE3_4X5 0x0013 Graphire 3 4x5
+product WACOM INTUOSA5 0x0021 Intuos A5
+product WACOM GD0912U 0x0022 Intuos 9x12 Graphics Tablet
+/* WCH products*/
+product WCH CH341SER 0x5523 CH341/CH340 USB-Serial Bridge
+/* Western Digital products */
+product WESTERN COMBO 0x0200 Firewire USB Combo
+product WESTERN EXTHDD 0x0400 External HDD
+product WESTERN HUB 0x0500 USB HUB
+product WESTERN MYBOOK 0x0901 MyBook External HDD
+
+/* Windbond Electronics */
+product WINBOND UH104 0x5518 4-port USB Hub
+
+/* WinMaxGroup products */
+product WINMAXGROUP FLASH64MC 0x6660 USB Flash Disk 64M-C
+
+/* Wistron NeWeb products */
+product WISTRONNEWEB UR045G 0x0427 PrismGT USB 2.0 WLAN
+product WISTRONNEWEB UR055G 0x0711 UR055G
+product WISTRONNEWEB AR5523_1 0x0826 AR5523
+product WISTRONNEWEB AR5523_1_NF 0x0827 AR5523 (no firmware)
+product WISTRONNEWEB AR5523_2 0x082a AR5523
+product WISTRONNEWEB AR5523_2_NF 0x0829 AR5523 (no firmware)
+
+/* Xerox products */
+product XEROX WCM15 0xffef WorkCenter M15
+
+/* Xirlink products */
+product XIRLINK PCCAM 0x8080 IBM PC Camera
+
+/* Xyratex products */
+product XYRATEX PRISM_GT_1 0x2000 PrismGT USB 2.0 WLAN
+product XYRATEX PRISM_GT_2 0x2002 PrismGT USB 2.0 WLAN
+
+/* Y-E Data products */
+product YEDATA FLASHBUSTERU 0x0000 Flashbuster-U
+
+/* Yamaha products */
+product YAMAHA UX256 0x1000 UX256 MIDI I/F
+product YAMAHA UX96 0x1008 UX96 MIDI I/F
+product YAMAHA RTA54I 0x4000 NetVolante RTA54i Broadband&ISDN Router
+product YAMAHA RTA55I 0x4004 NetVolante RTA55i Broadband VoIP Router
+product YAMAHA RTW65B 0x4001 NetVolante RTW65b Broadband Wireless Router
+product YAMAHA RTW65I 0x4002 NetVolante RTW65i Broadband&ISDN Wireless Router
+
+/* Yano products */
+product YANO U640MO 0x0101 U640MO-03
+product YANO FW800HD 0x05fc METALWEAR-HDD
+
+/* Z-Com products */
+product ZCOM M4Y750 0x0001 M4Y-750
+product ZCOM XI725 0x0002 XI-725/726
+product ZCOM XI735 0x0005 XI-735
+product ZCOM XG703A 0x0008 PrismGT USB 2.0 WLAN
+product ZCOM ZD1211 0x0011 ZD1211
+product ZCOM AR5523 0x0012 AR5523
+product ZCOM AR5523_NF 0x0013 AR5523 driver (no firmware)
+product ZCOM ZD1211B 0x001a ZD1211B
+
+/* Zinwell products */
+product ZINWELL RT2570 0x0260 RT2570
+
+/* Zoom Telephonics, Inc. products */
+product ZOOM 2986L 0x9700 2986L Fax modem
+
+/* Zoran Microelectronics products */
+product ZORAN EX20DSC 0x4343 Digital Camera EX-20 DSC
+
+/* Zydas Technology Corporation products */
+product ZYDAS ZD1211 0x1211 ZD1211 WLAN abg
+product ZYDAS ZD1211B 0x1215 ZD1211B
+
+/* ZyXEL Communication Co. products */
+product ZYXEL OMNI56K 0x1500 Omni 56K Plus
+product ZYXEL 980N 0x2011 Scorpion-980N keyboard
+product ZYXEL ZYAIRG220 0x3401 ZyAIR G-220
+product ZYXEL G200V2 0x3407 G-200 v2
+product ZYXEL AG225H 0x3409 AG-225H
+product ZYXEL M202 0x340a M-202
+product ZYXEL G220V2 0x340f G-220 v2
+product ZYXEL G202 0x3410 G-202
diff --git a/usr/src/uts/common/io/usb/usbdevs2h.awk b/usr/src/uts/common/io/usb/usbdevs2h.awk
new file mode 100644
index 0000000000..8a9d078b41
--- /dev/null
+++ b/usr/src/uts/common/io/usb/usbdevs2h.awk
@@ -0,0 +1,318 @@
+#! /usr/bin/awk -f
+
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#-
+# $NetBSD: usb/devlist2h.awk,v 1.9 2001/01/18 20:28:22 jdolecek Exp $
+# $FreeBSD: src/sys/tools/usbdevs2h.awk,v 1.7 2005/01/07 02:29:25 imp Exp $
+#
+# Copyright (c) 1995, 1996 Christopher G. Demetriou
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Christopher G. Demetriou.
+# 4. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+function usage()
+{
+ print "usage: usbdevs2h.awk <srcfile> [-d|-D|-h|-H]";
+ exit 1;
+}
+
+function header(file)
+{
+ if (os == "NetBSD")
+ printf("/*\t\$NetBSD\$\t*/\n\n") > file
+ else if (os == "FreeBSD")
+ printf("/* \$FreeBSD\$ */\n\n") > file
+ else if (os == "OpenBSD")
+ printf("/*\t\$OpenBSD\$\t*/\n\n") > file
+
+ printf("/*\n") > file
+ printf(" * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \
+ > file
+ printf(" *\n") > file
+ printf(" * generated from:\n") > file
+ printf(" * %s\n", VERSION) > file
+ printf(" */\n") > file
+}
+
+function header_guard(file)
+{
+ printf("\n") > file
+ printf("#ifndef\t_SYS_USB_USBDEVS_H\n") > file
+ printf("#define\t_SYS_USB_USBDEVS_H\n\n") > file
+}
+
+function header_trailer(file)
+{
+ printf("\n") > file
+ printf("#endif\t/* _SYS_USB_USBDEVS_H */\n") > file
+}
+
+function vendor(hfile)
+{
+ nvendors++
+
+ vendorindex[$2] = nvendors; # record index for this name, for later.
+ vendors[nvendors, 1] = $2; # name
+ vendors[nvendors, 2] = $3; # id
+ if (hfile)
+ printf("#define\tUSB_VENDOR_%s\t%s\t", vendors[nvendors, 1],
+ vendors[nvendors, 2]) > hfile
+
+ i = 3; f = 4;
+
+ # comments
+ ocomment = oparen = 0
+ if (f <= NF) {
+ if (hfile)
+ printf("\t/* ") > hfile
+ ocomment = 1;
+ }
+ while (f <= NF) {
+ if ($f == "#") {
+ if (hfile)
+ printf("(") > hfile
+ oparen = 1
+ f++
+ continue
+ }
+ if (oparen) {
+ if (hfile)
+ printf("%s", $f) > hfile
+ if (f < NF && hfile)
+ printf(" ") > hfile
+ f++
+ continue
+ }
+ vendors[nvendors, i] = $f
+ if (hfile)
+ printf("%s", vendors[nvendors, i]) > hfile
+ if (f < NF && hfile)
+ printf(" ") > hfile
+ i++; f++;
+ }
+ if (oparen && hfile)
+ printf(")") > hfile
+ if (ocomment && hfile)
+ printf(" */") > hfile
+ if (hfile)
+ printf("\n") > hfile
+}
+
+function product(hfile)
+{
+ nproducts++
+
+ products[nproducts, 1] = $2; # vendor name
+ products[nproducts, 2] = $3; # product id
+ products[nproducts, 3] = $4; # id
+ if (hfile)
+ printf("#define\tUSB_PRODUCT_%s_%s\t%s\t", \
+ products[nproducts, 1], products[nproducts, 2], \
+ products[nproducts, 3]) > hfile
+
+ i=4; f = 5;
+
+ # comments
+ ocomment = oparen = 0
+ if (f <= NF) {
+ if (hfile)
+ printf("\t/* ") > hfile
+ ocomment = 1;
+ }
+ while (f <= NF) {
+ if ($f == "#") {
+ if (hfile)
+ printf("(") > hfile
+ oparen = 1
+ f++
+ continue
+ }
+ if (oparen) {
+ if (hfile)
+ printf("%s", $f) > hfile
+ if (f < NF && hfile)
+ printf(" ") > hfile
+ f++
+ continue
+ }
+ products[nproducts, i] = $f
+ if (hfile)
+ printf("%s", products[nproducts, i]) > hfile
+ if (f < NF && hfile)
+ printf(" ") > hfile
+ i++; f++;
+ }
+ if (oparen && hfile)
+ printf(")") > hfile
+ if (ocomment && hfile)
+ printf(" */") > hfile
+ if (hfile)
+ printf("\n") > hfile
+}
+
+function dump_dfile(dfile)
+{
+ printf("\n") > dfile
+ printf("const struct usb_knowndev usb_knowndevs[] = {\n") > dfile
+ for (i = 1; i <= nproducts; i++) {
+ printf("\t{\n") > dfile
+ printf("\t USB_VENDOR_%s, USB_PRODUCT_%s_%s,\n",
+ products[i, 1], products[i, 1], products[i, 2]) > dfile
+ printf("\t ") > dfile
+ printf("0") > dfile
+ printf(",\n") > dfile
+
+ vendi = vendorindex[products[i, 1]];
+ printf("\t \"") > dfile
+ j = 3;
+ needspace = 0;
+ while (vendors[vendi, j] != "") {
+ if (needspace)
+ printf(" ") > dfile
+ printf("%s", vendors[vendi, j]) > dfile
+ needspace = 1
+ j++
+ }
+ printf("\",\n") > dfile
+
+ printf("\t \"") > dfile
+ j = 4;
+ needspace = 0;
+ while (products[i, j] != "") {
+ if (needspace)
+ printf(" ") > dfile
+ printf("%s", products[i, j]) > dfile
+ needspace = 1
+ j++
+ }
+ printf("\",\n") > dfile
+ printf("\t},\n") > dfile
+ }
+ for (i = 1; i <= nvendors; i++) {
+ printf("\t{\n") > dfile
+ printf("\t USB_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile
+ printf("\t USB_KNOWNDEV_NOPROD,\n") > dfile
+ printf("\t \"") > dfile
+ j = 3;
+ needspace = 0;
+ while (vendors[i, j] != "") {
+ if (needspace)
+ printf(" ") > dfile
+ printf("%s", vendors[i, j]) > dfile
+ needspace = 1
+ j++
+ }
+ printf("\",\n") > dfile
+ printf("\t NULL,\n") > dfile
+ printf("\t},\n") > dfile
+ }
+ printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
+ printf("};\n") > dfile
+}
+
+BEGIN {
+
+nproducts = nvendors = 0
+# Process the command line
+for (i = 1; i < ARGC; i++) {
+ arg = ARGV[i];
+ if (arg !~ /^-[dDhH]+$/ && arg !~ /devs$/)
+ usage();
+ if (arg ~ /^-.*d/)
+ dfile="usbdevs_data.h"
+ if (arg ~ /^-.*D/)
+ dfile="/dev/stdout"
+ if (arg ~ /^-.*h/)
+ hfile="usbdevs.h"
+ if (arg ~ /^-.*H/)
+ hfile="/dev/stdout"
+ if (arg ~ /devs$/)
+ srcfile = arg;
+}
+ARGC = 1;
+line=0;
+
+while ((getline < srcfile) > 0) {
+ line++;
+ if (line == 1) {
+ VERSION = $0
+ gsub("\\$", "", VERSION)
+ if (dfile)
+ header(dfile)
+ if (hfile) {
+ header(hfile)
+ header_guard(hfile)
+ }
+ continue;
+ }
+ if ($1 == "vendor") {
+ vendor(hfile)
+ continue
+ }
+ if ($1 == "product") {
+ product(hfile)
+ continue
+ }
+ if ($0 == "")
+ blanklines++
+ if (hfile)
+ print $0 > hfile
+ if (blanklines < 2 && dfile)
+ print $0 > dfile
+}
+
+# close off the header guard
+
+if (hfile)
+ header_trailer(hfile)
+
+# print out the match tables
+
+if (dfile)
+ dump_dfile(dfile)
+}
diff --git a/usr/src/uts/common/io/warlock/usbftdi.wlcmd b/usr/src/uts/common/io/warlock/usbftdi.wlcmd
new file mode 100644
index 0000000000..3757e21f4d
--- /dev/null
+++ b/usr/src/uts/common/io/warlock/usbftdi.wlcmd
@@ -0,0 +1,90 @@
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+one usbser_state
+one uftdi_state
+
+### specify the root functions
+
+root usbser_first_device
+root usbser_putchar
+root usbser_getchar
+root usbser_ischar
+root usbser_polledio_enter
+root usbser_polledio_exit
+root usbser_soft_state_size
+root usbser_uftdi_open
+root usbser_close
+root usbser_wput
+root usbser_wsrv
+root usbser_rsrv
+root usbser_tx_cb
+root usbser_rx_cb
+root usbser_status_cb
+root usbser_wq_thread
+root usbser_rq_thread
+root usbser_disconnect_cb
+root usbser_reconnect_cb
+root usbser_cpr_suspend
+root usbser_cpr_resume
+
+root uftdi_bulkin_cb
+root uftdi_bulkout_cb
+
+### specify uftdi function pointers
+
+add ds_ops::ds_attach targets uftdi_attach
+add ds_ops::ds_detach targets uftdi_detach
+add ds_ops::ds_register_cb targets uftdi_register_cb
+add ds_ops::ds_unregister_cb targets uftdi_unregister_cb
+add ds_ops::ds_open_port targets uftdi_open_port
+add ds_ops::ds_close_port targets uftdi_close_port
+add ds_ops::ds_usb_power targets uftdi_usb_power
+add ds_ops::ds_suspend targets uftdi_suspend
+add ds_ops::ds_resume targets uftdi_resume
+add ds_ops::ds_disconnect targets uftdi_disconnect
+add ds_ops::ds_reconnect targets uftdi_reconnect
+add ds_ops::ds_set_port_params targets uftdi_set_port_params
+add ds_ops::ds_set_modem_ctl targets uftdi_set_modem_ctl
+add ds_ops::ds_get_modem_ctl targets uftdi_get_modem_ctl
+add ds_ops::ds_break_ctl targets uftdi_break_ctl
+add ds_ops::ds_tx targets uftdi_tx
+add ds_ops::ds_rx targets uftdi_rx
+add ds_ops::ds_stop targets uftdi_stop
+add ds_ops::ds_start targets uftdi_start
+add ds_ops::ds_fifo_flush targets uftdi_fifo_flush
+add ds_ops::ds_fifo_drain targets uftdi_fifo_drain
+add ds_ops::ds_out_pipe targets uftdi_out_pipe
+add ds_ops::ds_in_pipe targets uftdi_in_pipe
+
+add uftdi_state::uf_cb.cb_tx targets usbser_tx_cb
+add uftdi_state::uf_cb.cb_rx targets usbser_rx_cb
+
+add bus_ops::bus_add_eventcall targets warlock_dummy
+add bus_ops::bus_get_eventcookie targets warlock_dummy
+add bus_ops::bus_post_event targets warlock_dummy
+add bus_ops::bus_remove_eventcall targets warlock_dummy
+add bus_ops::bus_intr_ctl targets warlock_dummy
+add bus_ops::bus_config targets warlock_dummy
+add bus_ops::bus_unconfig targets warlock_dummy
diff --git a/usr/src/uts/common/io/warlock/usbftdi_with_usba.wlcmd b/usr/src/uts/common/io/warlock/usbftdi_with_usba.wlcmd
new file mode 100644
index 0000000000..bf0eaffeef
--- /dev/null
+++ b/usr/src/uts/common/io/warlock/usbftdi_with_usba.wlcmd
@@ -0,0 +1,217 @@
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+one ohci_state
+one ehci_state
+one uhci_state
+one usbser_state
+one uftdi_state
+
+### specify the root functions
+
+root usbser_first_device
+root usbser_putchar
+root usbser_getchar
+root usbser_ischar
+root usbser_polledio_enter
+root usbser_polledio_exit
+root usb_console_output_fini
+root usb_console_input_enter
+root usb_console_input_exit
+root usb_console_input_fini
+root usb_console_input_init
+root usb_console_read
+root usb_get_dev_descr
+root usb_get_if_number
+root usb_parse_CV_cfg_descr
+root usb_parse_CV_ep_descr
+root usb_parse_CV_if_descr
+root usb_pipe_get_private
+root usb_get_current_frame_number
+root usb_get_max_isoc_pkts
+root usb_pipe_set_private
+root usba_ready_interface_node
+root usba_free_hcdi_ops
+root usba_async_req_raise_power
+root usba_async_req_lower_power
+root usb_req_raise_power
+root usb_req_lower_power
+root usb_set_device_pwrlvl0
+root usb_set_device_pwrlvl1
+root usb_set_device_pwrlvl2
+root usb_set_device_pwrlvl3
+root usb_is_pm_enabled
+root usb_async_req
+root usb_pipe_bulk_transfer_size
+root usb_get_ep_data
+root usba_pipe_get_policy
+root usb_pipe_ctrl_xfer_wait
+root usb_pipe_drain_reqs
+root usb_try_serialize_access
+root usb_fini_serialization
+root usb_init_serialization
+root usb_release_access
+root usb_serialize_access
+root usb_clr_feature
+root usb_clear_feature
+root usb_get_alt_if
+root usb_get_ep_descr
+root usb_get_if_descr
+root usb_log
+root usb_pipe_isoc_xfer
+root usb_pipe_stop_isoc_polling
+root usb_set_alt_if
+root usb_set_cfg
+root usb_get_cfg
+root usb_ep_num
+root usb_get_status
+root usb_pipe_reset
+root usb_log_descr_tree
+root usb_print_descr_tree
+root usb_rval2errno
+root usb_register_hotplug_cbs
+root usb_get_current_cfgidx
+root usb_register_client
+root usb_reset_device
+
+root usb_ugen_attach
+root usb_ugen_close
+root usb_ugen_detach
+root usb_ugen_disconnect_ev_cb
+root usb_ugen_get_hdl
+root usb_ugen_open
+root usb_ugen_poll
+root usb_ugen_power
+root usb_ugen_read
+root usb_ugen_reconnect_ev_cb
+root usb_ugen_write
+
+root hcdi_autoclearing
+root hcdi_cb_thread
+root hcdi_shared_cb_thread
+
+root hubd_restore_state_cb
+root hubd_disconnect_event_cb
+root hubd_post_resume_event_cb
+root hubd_pre_suspend_event_cb
+root hubd_reconnect_event_cb
+root hubd_hotplug_thread
+root hubd_reset_thread
+root hubd_cpr_post_user_callb
+root hubd_root_hub_cleanup_thread
+root hubd_bus_power
+
+root usba_common_power
+root usba_common_register_events
+root usba_ready_interface_association_node
+root usba_pipe_do_async_func_thread
+root usba_pipe_sync_reset
+root usba_get_hc_dma_attr
+root usba_hcdi_get_req_private
+root usba_hcdi_set_req_private
+root usba_dbuf_tail
+root usba_hubdi_power
+root usba_hubdi_root_hub_power
+root usba_get_hotplug_stats
+root usba_reset_hotplug_stats
+root usba_ascii_string_descr
+root usba_move_list
+root usba_taskq_destroy
+root usba_mk_mctl
+root usb_fail_checkpoint
+
+root ohci_intr
+root ehci_intr
+
+### specify the uftdi root functions
+
+root usbser_soft_state_size
+root usbser_uftdi_open
+root usbser_close
+root usbser_wput
+root usbser_wsrv
+root usbser_rsrv
+root usbser_tx_cb
+root usbser_rx_cb
+root usbser_status_cb
+root usbser_wq_thread
+root usbser_rq_thread
+root usbser_disconnect_cb
+root usbser_reconnect_cb
+root usbser_cpr_suspend
+root usbser_cpr_resume
+
+root uftdi_bulkin_cb
+root uftdi_bulkout_cb
+
+### specify uftdi function pointers
+
+add ds_ops::ds_attach targets uftdi_attach
+add ds_ops::ds_detach targets uftdi_detach
+add ds_ops::ds_register_cb targets uftdi_register_cb
+add ds_ops::ds_unregister_cb targets uftdi_unregister_cb
+add ds_ops::ds_open_port targets uftdi_open_port
+add ds_ops::ds_close_port targets uftdi_close_port
+add ds_ops::ds_usb_power targets uftdi_usb_power
+add ds_ops::ds_suspend targets uftdi_suspend
+add ds_ops::ds_resume targets uftdi_resume
+add ds_ops::ds_disconnect targets uftdi_disconnect
+add ds_ops::ds_reconnect targets uftdi_reconnect
+add ds_ops::ds_set_port_params targets uftdi_set_port_params
+add ds_ops::ds_set_modem_ctl targets uftdi_set_modem_ctl
+add ds_ops::ds_get_modem_ctl targets uftdi_get_modem_ctl
+add ds_ops::ds_break_ctl targets uftdi_break_ctl
+add ds_ops::ds_tx targets uftdi_tx
+add ds_ops::ds_rx targets uftdi_rx
+add ds_ops::ds_stop targets uftdi_stop
+add ds_ops::ds_start targets uftdi_start
+add ds_ops::ds_fifo_flush targets uftdi_fifo_flush
+add ds_ops::ds_fifo_drain targets uftdi_fifo_drain
+add ds_ops::ds_out_pipe targets uftdi_out_pipe
+add ds_ops::ds_in_pipe targets uftdi_in_pipe
+
+add uftdi_state::uf_cb.cb_tx targets usbser_tx_cb
+add uftdi_state::uf_cb.cb_rx targets usbser_rx_cb
+
+add usb_ctrl_req::ctrl_cb targets warlock_dummy
+add usb_ctrl_req::ctrl_exc_cb targets warlock_dummy
+add usb_bulk_req::bulk_cb targets uftdi_bulkin_cb
+add usb_bulk_req::bulk_exc_cb targets uftdi_bulkin_cb
+add usb_bulk_req::bulk_cb targets uftdi_bulkout_cb
+add usb_bulk_req::bulk_exc_cb targets uftdi_bulkout_cb
+
+add usb_isoc_req::isoc_cb targets warlock_dummy
+add usb_isoc_req::isoc_exc_cb targets warlock_dummy
+add usba_pipe_async_req::callback targets warlock_dummy
+add usba_pipe_async_req::sync_func targets warlock_dummy
+add usba_pm_req::cb targets warlock_dummy
+
+add ohci_trans_wrapper::tw_handle_td targets ohci_handle_ctrl_td
+add ohci_trans_wrapper::tw_handle_td targets ohci_handle_bulk_td
+add ohci_trans_wrapper::tw_handle_td targets ohci_handle_intr_td
+add ohci_trans_wrapper::tw_handle_td targets ohci_handle_isoc_td
+
+add ehci_trans_wrapper::tw_handle_qtd targets ehci_handle_bulk_qtd
+add ehci_trans_wrapper::tw_handle_qtd targets ehci_handle_intr_qtd
+add ehci_trans_wrapper::tw_handle_qtd targets ehci_handle_ctrl_qtd
diff --git a/usr/src/uts/common/sys/Makefile b/usr/src/uts/common/sys/Makefile
index e70ad92328..eaff02cc35 100644
--- a/usr/src/uts/common/sys/Makefile
+++ b/usr/src/uts/common/sys/Makefile
@@ -64,7 +64,8 @@ sparc_HDRS= \
# Generated headers
GENHDRS= \
priv_const.h \
- priv_names.h
+ priv_names.h \
+ usb/usbdevs.h
CHKHDRS= \
acpi_drv.h \
@@ -1273,6 +1274,9 @@ priv_const.h: $(PRIVS_AWK) $(PRIVS_DEF)
priv_names.h: $(PRIVS_AWK) $(PRIVS_DEF)
$(NAWK) -f $(PRIVS_AWK) < $(PRIVS_DEF) -v pubhfile=$@
+usb/usbdevs.h: $(USBDEVS_AWK) $(USBDEVS_DATA)
+ $(NAWK) -f $(USBDEVS_AWK) $(USBDEVS_DATA) -H > $@
+
LVMDERIVED_H:
cd $(SRC)/uts/common/sys/lvm; pwd; $(MAKE)
diff --git a/usr/src/uts/common/sys/termios.h b/usr/src/uts/common/sys/termios.h
index 2d99f70bc2..1ad56fe149 100644
--- a/usr/src/uts/common/sys/termios.h
+++ b/usr/src/uts/common/sys/termios.h
@@ -23,15 +23,13 @@
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_TERMIOS_H
#define _SYS_TERMIOS_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/feature_tests.h>
#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
@@ -478,6 +476,7 @@ struct ppsclockev32 {
#define TIOCSTOP (tIOC|111) /* stop output, like ^S */
#define TIOCSTART (tIOC|110) /* start output, like ^Q */
#define TIOCSILOOP (tIOC|109) /* private to Sun; do not use */
+#define TIOCCILOOP (tIOC|108) /* private to Sun; do not use */
#endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
@@ -580,6 +579,7 @@ struct ppsclockev32 {
#define B230400 20
#define B307200 21
#define B460800 22
+#define B921600 23
#ifndef _SYS_TTOLD_H
diff --git a/usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_reg.h b/usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_reg.h
new file mode 100644
index 0000000000..0c139504fa
--- /dev/null
+++ b/usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_reg.h
@@ -0,0 +1,402 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _USBSER_USBFTDI_UFTDI_REG_H
+#define _USBSER_USBFTDI_UFTDI_REG_H
+
+/*
+ * $NetBSD: uftdireg.h,v 1.6 2002/07/11 21:14:28 augustss Exp $
+ * $FreeBSD: src/sys/dev/usb/uftdireg.h,v 1.2 2004/07/01 17:16:20 brooks Exp $
+ */
+
+/*
+ * Definitions for the FTDI USB Single Port Serial Converter -
+ * known as FTDI_SIO (Serial Input/Output application of the chipset)
+ *
+ * Thanx to FTDI (http://www.ftdi.co.uk) for so kindly providing details
+ * of the protocol required to talk to the device and ongoing assistence
+ * during development.
+ *
+ * Bill Ryder - bryder@sgi.com of Silicon Graphics, Inc. is the original
+ * author of this file.
+ */
+/* Modified by Lennart Augustsson */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Vendor Request Interface */
+#define FTDI_SIO_RESET 0 /* Reset the port */
+#define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
+#define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */
+#define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */
+#define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of the port */
+#define FTDI_SIO_GET_STATUS 5 /* Retrieve current value of status reg */
+#define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */
+#define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */
+
+/* Port Identifier Table */
+#define FTDI_PIT_DEFAULT 0 /* SIOA */
+#define FTDI_PIT_SIOA 1 /* SIOA */
+#define FTDI_PIT_SIOB 2 /* SIOB */
+#define FTDI_PIT_PARALLEL 3 /* Parallel */
+
+enum uftdi_type {
+ UFTDI_TYPE_SIO,
+ UFTDI_TYPE_8U232AM
+};
+
+/*
+ * BmRequestType: 0100 0000B
+ * bRequest: FTDI_SIO_RESET
+ * wValue: Control Value
+ * 0 = Reset SIO
+ * 1 = Purge RX buffer
+ * 2 = Purge TX buffer
+ * wIndex: Port
+ * wLength: 0
+ * Data: None
+ *
+ * The Reset SIO command has this effect:
+ *
+ * Sets flow control set to 'none'
+ * Event char = 0x0d
+ * Event trigger = disabled
+ * Purge RX buffer
+ * Purge TX buffer
+ * Clear DTR
+ * Clear RTS
+ * baud and data format not reset
+ *
+ * The Purge RX and TX buffer commands affect nothing except the buffers
+ *
+ */
+/* FTDI_SIO_RESET */
+#define FTDI_SIO_RESET_SIO 0
+#define FTDI_SIO_RESET_PURGE_RX 1
+#define FTDI_SIO_RESET_PURGE_TX 2
+
+
+/*
+ * BmRequestType: 0100 0000B
+ * bRequest: FTDI_SIO_SET_BAUDRATE
+ * wValue: BaudRate value - see below
+ * wIndex: Port
+ * wLength: 0
+ * Data: None
+ */
+/* FTDI_SIO_SET_BAUDRATE */
+enum {
+ ftdi_sio_b300 = 0,
+ ftdi_sio_b600 = 1,
+ ftdi_sio_b1200 = 2,
+ ftdi_sio_b2400 = 3,
+ ftdi_sio_b4800 = 4,
+ ftdi_sio_b9600 = 5,
+ ftdi_sio_b19200 = 6,
+ ftdi_sio_b38400 = 7,
+ ftdi_sio_b57600 = 8,
+ ftdi_sio_b115200 = 9
+};
+
+enum {
+ ftdi_8u232am_b300 = 0x2710,
+ ftdi_8u232am_b600 = 0x1388,
+ ftdi_8u232am_b1200 = 0x09c4,
+ ftdi_8u232am_b2400 = 0x04e2,
+ ftdi_8u232am_b4800 = 0x0271,
+ ftdi_8u232am_b9600 = 0x4138,
+ ftdi_8u232am_b19200 = 0x809c,
+ ftdi_8u232am_b38400 = 0xc04e,
+ ftdi_8u232am_b57600 = 0x0034,
+ ftdi_8u232am_b115200 = 0x001a,
+ ftdi_8u232am_b230400 = 0x000d,
+ ftdi_8u232am_b460800 = 0x4006,
+ ftdi_8u232am_b921600 = 0x8003,
+ ftdi_8u232am_b2000000 = 0x0001, /* special case for 2M baud */
+ ftdi_8u232am_b3000000 = 0x0000, /* special case for 3M baud */
+};
+
+/*
+ * BmRequestType: 0100 0000B
+ * bRequest: FTDI_SIO_SET_DATA
+ * wValue: Data characteristics (see below)
+ * wIndex: Port
+ * wLength: 0
+ * Data: No
+ *
+ * Data characteristics
+ *
+ * B0..7 Number of data bits
+ * B8..10 Parity
+ * 0 = None
+ * 1 = Odd
+ * 2 = Even
+ * 3 = Mark
+ * 4 = Space
+ * B11..13 Stop Bits
+ * 0 = 1
+ * 1 = 1.5
+ * 2 = 2
+ * B14..15 Reserved
+ *
+ */
+/* FTDI_SIO_SET_DATA */
+#define FTDI_SIO_SET_DATA_BITS(n) (n)
+#define FTDI_SIO_SET_DATA_BITS_MASK 0xff
+
+#define FTDI_SIO_SET_DATA_PARITY_SHIFT 8
+#define FTDI_SIO_SET_DATA_PARITY_MASK 0x7
+#define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8)
+#define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8)
+#define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8)
+#define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8)
+#define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8)
+
+#define FTDI_SIO_SET_DATA_STOP_BITS_SHIFT 11
+#define FTDI_SIO_SET_DATA_STOP_BITS_MASK 0x3
+#define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
+#define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
+#define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
+
+#define FTDI_SIO_SET_BREAK (0x1 << 14)
+
+
+/*
+ * BmRequestType: 0100 0000B
+ * bRequest: FTDI_SIO_MODEM_CTRL
+ * wValue: ControlValue (see below)
+ * wIndex: Port
+ * wLength: 0
+ * Data: None
+ *
+ * NOTE: If the device is in RTS/CTS flow control, the RTS set by this
+ * command will be IGNORED without an error being returned
+ * Also - you can not set DTR and RTS with one control message
+ *
+ * ControlValue
+ * B0 DTR state
+ * 0 = reset
+ * 1 = set
+ * B1 RTS state
+ * 0 = reset
+ * 1 = set
+ * B2..7 Reserved
+ * B8 DTR state enable
+ * 0 = ignore
+ * 1 = use DTR state
+ * B9 RTS state enable
+ * 0 = ignore
+ * 1 = use RTS state
+ * B10..15 Reserved
+ */
+/* FTDI_SIO_MODEM_CTRL */
+#define FTDI_SIO_SET_DTR_MASK 0x1
+#define FTDI_SIO_SET_DTR_HIGH (1 | (FTDI_SIO_SET_DTR_MASK << 8))
+#define FTDI_SIO_SET_DTR_LOW (0 | (FTDI_SIO_SET_DTR_MASK << 8))
+#define FTDI_SIO_SET_RTS_MASK 0x2
+#define FTDI_SIO_SET_RTS_HIGH (2 | (FTDI_SIO_SET_RTS_MASK << 8))
+#define FTDI_SIO_SET_RTS_LOW (0 | (FTDI_SIO_SET_RTS_MASK << 8))
+
+
+/*
+ * BmRequestType: 0100 0000b
+ * bRequest: FTDI_SIO_SET_FLOW_CTRL
+ * wValue: Xoff/Xon
+ * wIndex: Protocol/Port - hIndex is protocl / lIndex is port
+ * wLength: 0
+ * Data: None
+ *
+ * hIndex protocol is:
+ * B0 Output handshaking using RTS/CTS
+ * 0 = disabled
+ * 1 = enabled
+ * B1 Output handshaking using DTR/DSR
+ * 0 = disabled
+ * 1 = enabled
+ * B2 Xon/Xoff handshaking
+ * 0 = disabled
+ * 1 = enabled
+ *
+ * A value of zero in the hIndex field disables handshaking
+ *
+ * If Xon/Xoff handshaking is specified, the hValue field should contain the
+ * XOFF character and the lValue field contains the XON character.
+ */
+/* FTDI_SIO_SET_FLOW_CTRL */
+#define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
+#define FTDI_SIO_RTS_CTS_HS 0x1
+#define FTDI_SIO_DTR_DSR_HS 0x2
+#define FTDI_SIO_XON_XOFF_HS 0x4
+
+
+/*
+ * BmRequestType: 0100 0000b
+ * bRequest: FTDI_SIO_SET_EVENT_CHAR
+ * wValue: Event Char
+ * wIndex: Port
+ * wLength: 0
+ * Data: None
+ *
+ * wValue:
+ * B0..7 Event Character
+ * B8 Event Character Processing
+ * 0 = disabled
+ * 1 = enabled
+ * B9..15 Reserved
+ *
+ * FTDI_SIO_SET_EVENT_CHAR
+ *
+ * Set the special event character for the specified communications port.
+ * If the device sees this character it will immediately return the
+ * data read so far - rather than wait 40ms or until 62 bytes are read
+ * which is what normally happens.
+ */
+
+
+
+/*
+ * BmRequestType: 0100 0000b
+ * bRequest: FTDI_SIO_SET_ERROR_CHAR
+ * wValue: Error Char
+ * wIndex: Port
+ * wLength: 0
+ * Data: None
+ *
+ * Error Char
+ * B0..7 Error Character
+ * B8 Error Character Processing
+ * 0 = disabled
+ * 1 = enabled
+ * B9..15 Reserved
+ *
+ *
+ * FTDI_SIO_SET_ERROR_CHAR
+ * Set the parity error replacement character for the specified communications
+ * port.
+ */
+
+
+/*
+ * BmRequestType: 1100 0000b
+ * bRequest: FTDI_SIO_GET_MODEM_STATUS
+ * wValue: zero
+ * wIndex: Port
+ * wLength: 1
+ * Data: Status
+ *
+ * One byte of data is returned
+ * B0..3 0
+ * B4 CTS
+ * 0 = inactive
+ * 1 = active
+ * B5 DSR
+ * 0 = inactive
+ * 1 = active
+ * B6 Ring Indicator (RI)
+ * 0 = inactive
+ * 1 = active
+ * B7 Receive Line Signal Detect (RLSD)
+ * 0 = inactive
+ * 1 = active
+ *
+ * FTDI_SIO_GET_MODEM_STATUS
+ * Retrieve the current value of the modem status register.
+ */
+#define FTDI_SIO_CTS_MASK 0x10
+#define FTDI_SIO_DSR_MASK 0x20
+#define FTDI_SIO_RI_MASK 0x40
+#define FTDI_SIO_RLSD_MASK 0x80
+
+
+
+/*
+ *
+ * DATA FORMAT
+ *
+ * IN Endpoint
+ *
+ * The device reserves the first two bytes of data on this endpoint to contain
+ * the current values of the modem and line status registers. In the absence of
+ * data, the device generates a message consisting of these two status bytes
+ * every 40 ms.
+ *
+ * Byte 0: Modem Status
+ * NOTE: 4 upper bits have same layout as the MSR register in a 16550
+ *
+ * Offset Description
+ * B0..3 Port
+ * B4 Clear to Send (CTS)
+ * B5 Data Set Ready (DSR)
+ * B6 Ring Indicator (RI)
+ * B7 Receive Line Signal Detect (RLSD)
+ *
+ * Byte 1: Line Status
+ * NOTE: same layout as the LSR register in a 16550
+ *
+ * Offset Description
+ * B0 Data Ready (DR)
+ * B1 Overrun Error (OE)
+ * B2 Parity Error (PE)
+ * B3 Framing Error (FE)
+ * B4 Break Interrupt (BI)
+ * B5 Transmitter Holding Register (THRE)
+ * B6 Transmitter Empty (TEMT)
+ * B7 Error in RCVR FIFO
+ *
+ *
+ * OUT Endpoint
+ *
+ * This device reserves the first bytes of data on this endpoint contain the
+ * length and port identifier of the message. For the FTDI USB Serial converter
+ * the port identifier is always 1.
+ *
+ * Byte 0: Port & length
+ *
+ * Offset Description
+ * B0..1 Port
+ * B2..7 Length of message - (not including Byte 0)
+ *
+ */
+#define FTDI_PORT_MASK 0x0f
+#define FTDI_MSR_MASK 0xf0
+#define FTDI_GET_MSR(p) (((p)[0]) & FTDI_MSR_MASK)
+#define FTDI_GET_LSR(p) ((p)[1])
+#define FTDI_LSR_MASK (~0x60) /* interesting bits */
+
+#define FTDI_MSR_STATUS_CTS 0x10
+#define FTDI_MSR_STATUS_DSR 0x20
+#define FTDI_MSR_STATUS_RI 0x40
+#define FTDI_MSR_STATUS_RLSD 0x80 /* aka Carrier Detect */
+
+#define FTDI_OUT_TAG(len, port) (((len) << 2) | (port))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _USBSER_USBFTDI_UFTDI_REG_H */
diff --git a/usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_var.h b/usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_var.h
new file mode 100644
index 0000000000..a440e94433
--- /dev/null
+++ b/usr/src/uts/common/sys/usb/clients/usbser/usbftdi/uftdi_var.h
@@ -0,0 +1,172 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _USBSER_USBFTDI_UFTDI_VAR_H
+#define _USBSER_USBFTDI_UFTDI_VAR_H
+
+/*
+ * USB UFTDI definitions
+ */
+
+#include <sys/types.h>
+#include <sys/dditypes.h>
+#include <sys/note.h>
+
+#include <sys/usb/clients/usbser/usbser_dsdi.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * PM support
+ */
+typedef struct uftdi_pm {
+ uint8_t pm_wakeup_enabled; /* remote wakeup enabled */
+ uint8_t pm_pwr_states; /* bit mask of power states */
+ boolean_t pm_raise_power; /* driver is about to raise power */
+ uint8_t pm_cur_power; /* current power level */
+ uint_t pm_busy_cnt; /* number of set_busy requests */
+} uftdi_pm_t;
+
+typedef struct uftdi_regs {
+ uint16_t ur_baud;
+ uint16_t ur_data;
+ uint16_t ur_flowval;
+ uint16_t ur_flowidx;
+} uftdi_regs_t;
+
+_NOTE(SCHEME_PROTECTS_DATA("uftdi_regs", uftdi_regs))
+
+/*
+ * per device state structure
+ */
+typedef struct uftdi_state {
+ kmutex_t uf_lock; /* structure lock */
+ dev_info_t *uf_dip; /* device info */
+ int uf_dev_flags; /* device flags */
+ int uf_port_state; /* port state */
+ int uf_port_flags; /* port flags */
+ ds_cb_t uf_cb; /* DSD callbacks */
+
+ /*
+ * USBA
+ */
+ usb_client_dev_data_t *uf_dev_data; /* registration data */
+ usb_event_t *uf_usb_events; /* usb events */
+ usb_pipe_handle_t uf_def_ph; /* default pipe hdl */
+ usb_pipe_handle_t uf_bulkin_ph; /* in pipe hdl */
+ int uf_bulkin_state; /* in pipe state */
+ usb_pipe_handle_t uf_bulkout_ph; /* in pipe hdl */
+ int uf_bulkout_state; /* out pipe state */
+ usb_log_handle_t uf_lh; /* USBA log handle */
+ int uf_dev_state; /* USB device state */
+ size_t uf_xfer_sz; /* HCI bulk xfer size */
+
+ uftdi_pm_t *uf_pm; /* PM support */
+
+ /*
+ * data receive and transmit
+ */
+ mblk_t *uf_rx_mp; /* rx data */
+ mblk_t *uf_tx_mp; /* tx data */
+ kcondvar_t uf_tx_cv; /* tx completion */
+
+ /*
+ * soft registers
+ */
+ uftdi_regs_t uf_softr; /* config registers */
+ uint16_t uf_mctl; /* modem control */
+ uint8_t uf_msr; /* modem status */
+ uint8_t uf_lsr; /* line status register */
+
+} uftdi_state_t;
+
+_NOTE(MUTEX_PROTECTS_DATA(uftdi_state::uf_lock, uftdi_state))
+_NOTE(DATA_READABLE_WITHOUT_LOCK(uftdi_state::{
+ uf_dip
+ uf_dev_data
+ uf_usb_events
+ uf_def_ph
+ uf_lh
+ uf_xfer_sz
+ uf_pm
+ uf_port_state
+ uf_cb.cb_rx
+ uf_cb.cb_tx
+ uf_cb.cb_arg
+ uf_bulkin_ph
+ uf_bulkout_ph
+}))
+
+/* port state */
+enum {
+ UFTDI_PORT_CLOSED, /* port is closed */
+ UFTDI_PORT_OPEN, /* port is open */
+ UFTDI_PORT_CLOSING
+};
+
+/* port flags */
+enum {
+ UFTDI_PORT_TX_STOPPED = 0x0001 /* transmit not allowed */
+};
+
+/* pipe state */
+enum {
+ UFTDI_PIPE_CLOSED, /* pipe is closed */
+ UFTDI_PIPE_IDLE, /* open but no requests */
+ UFTDI_PIPE_BUSY /* servicing request */
+};
+
+/* various numbers */
+enum {
+ UFTDI_BULKOUT_TIMEOUT = 15, /* bulkout timeout */
+ UFTDI_BULKIN_TIMEOUT = 15, /* bulkin timeout */
+ UFTDI_XFER_SZ_MAX = 64, /* max xfer size */
+ UFTDI_CLEANUP_LEVEL_MAX = 6 /* cleanup level */
+};
+
+
+/*
+ * debug printing masks
+ */
+#define DPRINT_ATTACH 0x00000001
+#define DPRINT_OPEN 0x00000002
+#define DPRINT_CLOSE 0x00000004
+#define DPRINT_DEF_PIPE 0x00000010
+#define DPRINT_IN_PIPE 0x00000020
+#define DPRINT_OUT_PIPE 0x00000040
+#define DPRINT_IN_DATA 0x00000400
+#define DPRINT_OUT_DATA 0x00000800
+#define DPRINT_CTLOP 0x00001000
+#define DPRINT_HOTPLUG 0x00002000
+#define DPRINT_PM 0x00004000
+#define DPRINT_MASK_ALL 0xFFFFFFFF
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _USBSER_USBFTDI_UFTDI_VAR_H */
diff --git a/usr/src/uts/intel/Makefile.intel.shared b/usr/src/uts/intel/Makefile.intel.shared
index 389a6e6e59..99072cef64 100644
--- a/usr/src/uts/intel/Makefile.intel.shared
+++ b/usr/src/uts/intel/Makefile.intel.shared
@@ -452,6 +452,7 @@ DRV_KMODS += usb_ac
DRV_KMODS += usb_as
DRV_KMODS += usbskel
DRV_KMODS += usbvc
+DRV_KMODS += usbftdi
$(CLOSED_BUILD)CLOSED_DRV_KMODS += usbser_edge
diff --git a/usr/src/uts/intel/usbftdi/Makefile b/usr/src/uts/intel/usbftdi/Makefile
new file mode 100644
index 0000000000..53831bfdee
--- /dev/null
+++ b/usr/src/uts/intel/usbftdi/Makefile
@@ -0,0 +1,140 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/usbftdi/Makefile
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+#
+# This makefile drives the production of the FT232R USB Serial
+# Adapter driver.
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = usbftdi
+OBJECTS = $(USBFTDI_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(USBFTDI_OBJS:%.o=$(LINTS_DIR)/%.ln)
+WARLOCK_OUT = $(USBFTDI_OBJS:%.o=%.ll)
+WARLOCK_OK = $(MODULE).ok
+ROOTMODULE = $(USR_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/usb/clients/usbser/usbftdi
+WLCMD_DIR = $(UTSBASE)/common/io/warlock
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+LDFLAGS += -dy -Nmisc/usba -Nmisc/usbser
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+.KEEP_STATE:
+
+all: $(ALL_DEPS)
+
+def: $(DEF_DEPS)
+
+clean: $(CLEAN_DEPS)
+ $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
+
+clobber: $(CLOBBER_DEPS)
+ $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
+
+#
+# Defines for local commands.
+#
+WLCC = wlcc
+TOUCH = touch
+WARLOCK = warlock
+TEST = test
+
+#
+# warlock
+#
+WARLOCK_CMD = $(WLCMD_DIR)/$(MODULE).wlcmd
+USBSER_FILES = $(USBSER_OBJS:%.o=../usbser/%.ll)
+USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
+UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
+OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
+EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
+
+warlock: $(WARLOCK_OK)
+
+$(WARLOCK_OK): warlock_with_usba warlock_with_usbser
+ $(TOUCH) $@
+
+%.ll: $(UTSBASE)/common/io/usb/clients/usbser/usbftdi/%.c
+ $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
+
+warlock_with_usbser: $(WARLOCK_OUT) usbser_files warlock_ddi.files \
+ $(WARLOCK_CMD)
+ $(WARLOCK) -c $(WARLOCK_CMD) $(WARLOCK_OUT) \
+ $(USBSER_FILES) -l ../warlock/ddi_dki_impl.ll
+
+warlock_with_usba: $(WARLOCK_OUT) usbser_files \
+ $(WLCMD_DIR)/usbftdi_with_usba.wlcmd usba_files ohci_files uhci_files \
+ ehci_files warlock_ddi.files
+ $(WARLOCK) -c $(WLCMD_DIR)/usbftdi_with_usba.wlcmd \
+ $(USBA_FILES) $(OHCI_FILES) $(EHCI_FILES) $(UHCI_FILES) \
+ $(USBSER_FILES) \
+ $(WARLOCK_OUT) -l ../warlock/ddi_dki_impl.ll
+
+usbser_files:
+ @cd ../usbser; pwd; $(MAKE) warlock
+
+usba_files:
+ @cd ../usba;pwd; $(MAKE) warlock
+
+uhci_files:
+ @cd ../uhci;pwd; $(MAKE) warlock
+
+ohci_files:
+ @cd ../ohci;pwd; $(MAKE) warlock
+
+ehci_files:
+ @cd ../ehci;pwd; $(MAKE) warlock
+
+warlock_ddi.files:
+ cd ../warlock; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/Makefile.sparc.shared b/usr/src/uts/sparc/Makefile.sparc.shared
index b9ee70fa15..9c9bfa50d9 100644
--- a/usr/src/uts/sparc/Makefile.sparc.shared
+++ b/usr/src/uts/sparc/Makefile.sparc.shared
@@ -271,6 +271,7 @@ DRV_KMODS += usbser usbsacm usbsksp usbsprl
DRV_KMODS += usb_as usb_ac
DRV_KMODS += usbskel
DRV_KMODS += usbvc
+DRV_KMODS += usbftdi
DRV_KMODS += hci1394 av1394 scsa1394 dcam1394
DRV_KMODS += sbp2
DRV_KMODS += ib ibd rdsib sdp iser
diff --git a/usr/src/uts/sparc/usbftdi/Makefile b/usr/src/uts/sparc/usbftdi/Makefile
new file mode 100644
index 0000000000..c7f8b72044
--- /dev/null
+++ b/usr/src/uts/sparc/usbftdi/Makefile
@@ -0,0 +1,140 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/sparc/usbftdi/Makefile
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+#
+# This makefile drives the production of the FT232R USB Serial
+# Adapter driver.
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = usbftdi
+OBJECTS = $(USBFTDI_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(USBFTDI_OBJS:%.o=$(LINTS_DIR)/%.ln)
+WARLOCK_OUT = $(USBFTDI_OBJS:%.o=%.ll)
+WARLOCK_OK = $(MODULE).ok
+ROOTMODULE = $(USR_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/usb/clients/usbser/usbftdi
+WLCMD_DIR = $(UTSBASE)/common/io/warlock
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/sparc/Makefile.sparc
+
+LDFLAGS += -dy -Nmisc/usba -Nmisc/usbser
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+.KEEP_STATE:
+
+all: $(ALL_DEPS)
+
+def: $(DEF_DEPS)
+
+clean: $(CLEAN_DEPS)
+ $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
+
+clobber: $(CLOBBER_DEPS)
+ $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/sparc/Makefile.targ
+
+#
+# Defines for local commands.
+#
+WLCC = wlcc
+TOUCH = touch
+WARLOCK = warlock
+TEST = test
+
+#
+# warlock
+#
+WARLOCK_CMD = $(WLCMD_DIR)/$(MODULE).wlcmd
+USBSER_FILES = $(USBSER_OBJS:%.o=../usbser/%.ll)
+USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
+UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
+OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
+EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
+
+warlock: $(WARLOCK_OK)
+
+$(WARLOCK_OK): warlock_with_usba warlock_with_usbser
+ $(TOUCH) $@
+
+%.ll: $(UTSBASE)/common/io/usb/clients/usbser/usbftdi/%.c
+ $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
+
+warlock_with_usbser: $(WARLOCK_OUT) usbser_files warlock_ddi.files \
+ $(WARLOCK_CMD)
+ $(WARLOCK) -c $(WARLOCK_CMD) $(WARLOCK_OUT) \
+ $(USBSER_FILES) -l ../warlock/ddi_dki_impl.ll
+
+warlock_with_usba: $(WARLOCK_OUT) usbser_files \
+ $(WLCMD_DIR)/usbftdi_with_usba.wlcmd usba_files ohci_files uhci_files \
+ ehci_files warlock_ddi.files
+ $(WARLOCK) -c $(WLCMD_DIR)/usbftdi_with_usba.wlcmd \
+ $(USBA_FILES) $(OHCI_FILES) $(EHCI_FILES) $(UHCI_FILES) \
+ $(USBSER_FILES) \
+ $(WARLOCK_OUT) -l ../warlock/ddi_dki_impl.ll
+
+usbser_files:
+ @cd ../usbser; pwd; $(MAKE) warlock
+
+usba_files:
+ @cd ../usba;pwd; $(MAKE) warlock
+
+uhci_files:
+ @cd ../uhci;pwd; $(MAKE) warlock
+
+ohci_files:
+ @cd ../ohci;pwd; $(MAKE) warlock
+
+ehci_files:
+ @cd ../ehci;pwd; $(MAKE) warlock
+
+warlock_ddi.files:
+ cd ../warlock; pwd; $(MAKE) warlock