svn commit: r187176 - head/sys/dev/usb2/serial
Andrew Thompson
thompsa at FreeBSD.org
Tue Jan 13 11:03:49 PST 2009
Author: thompsa
Date: Tue Jan 13 19:03:47 2009
New Revision: 187176
URL: http://svn.freebsd.org/changeset/base/187176
Log:
MFp4: //depot/projects/usb at 155917
Remove dependancy towards the USB config thread in
the USB serial core. Use USB process msignalling
instead. Saves a little memory and hopefully makes
the code more understandable.
Submitted by: Hans Petter Selasky
Modified:
head/sys/dev/usb2/serial/u3g2.c
head/sys/dev/usb2/serial/uark2.c
head/sys/dev/usb2/serial/ubsa2.c
head/sys/dev/usb2/serial/ubser2.c
head/sys/dev/usb2/serial/uchcom2.c
head/sys/dev/usb2/serial/ucycom2.c
head/sys/dev/usb2/serial/ufoma2.c
head/sys/dev/usb2/serial/uftdi2.c
head/sys/dev/usb2/serial/ugensa2.c
head/sys/dev/usb2/serial/uipaq2.c
head/sys/dev/usb2/serial/ulpt2.c
head/sys/dev/usb2/serial/umct2.c
head/sys/dev/usb2/serial/umodem2.c
head/sys/dev/usb2/serial/umoscom2.c
head/sys/dev/usb2/serial/uplcom2.c
head/sys/dev/usb2/serial/usb2_serial.c
head/sys/dev/usb2/serial/usb2_serial.h
head/sys/dev/usb2/serial/uvisor2.c
head/sys/dev/usb2/serial/uvscom2.c
Modified: head/sys/dev/usb2/serial/u3g2.c
==============================================================================
--- head/sys/dev/usb2/serial/u3g2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/u3g2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -44,7 +44,6 @@
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/uark2.c
==============================================================================
--- head/sys/dev/usb2/serial/uark2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/uark2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -34,7 +34,6 @@
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/ubsa2.c
==============================================================================
--- head/sys/dev/usb2/serial/ubsa2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/ubsa2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -73,7 +73,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/ubser2.c
==============================================================================
--- head/sys/dev/usb2/serial/ubser2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/ubser2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -87,7 +87,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/uchcom2.c
==============================================================================
--- head/sys/dev/usb2/serial/uchcom2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/uchcom2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -81,7 +81,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/ucycom2.c
==============================================================================
--- head/sys/dev/usb2/serial/ucycom2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/ucycom2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/ufoma2.c
==============================================================================
--- head/sys/dev/usb2/serial/ufoma2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/ufoma2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -93,7 +93,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/uftdi2.c
==============================================================================
--- head/sys/dev/usb2/serial/uftdi2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/uftdi2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -59,7 +59,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/ugensa2.c
==============================================================================
--- head/sys/dev/usb2/serial/ugensa2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/ugensa2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -54,7 +54,6 @@
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/uipaq2.c
==============================================================================
--- head/sys/dev/usb2/serial/uipaq2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/uipaq2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -62,7 +62,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/ulpt2.c
==============================================================================
--- head/sys/dev/usb2/serial/ulpt2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/ulpt2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/umct2.c
==============================================================================
--- head/sys/dev/usb2/serial/umct2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/umct2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -56,7 +56,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/umodem2.c
==============================================================================
--- head/sys/dev/usb2/serial/umodem2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/umodem2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -92,7 +92,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/umoscom2.c
==============================================================================
--- head/sys/dev/usb2/serial/umoscom2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/umoscom2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -28,7 +28,6 @@
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/uplcom2.c
==============================================================================
--- head/sys/dev/usb2/serial/uplcom2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/uplcom2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -95,7 +95,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/usb2_serial.c
==============================================================================
--- head/sys/dev/usb2/serial/usb2_serial.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/usb2_serial.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -78,13 +78,10 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/include/usb2_cdc.h>
#define USB_DEBUG_VAR usb2_com_debug
-#define usb2_config_td_cc usb2_com_config_copy
-#define usb2_config_td_softc usb2_com_softc
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_busdma.h>
#include <dev/usb2/core/usb2_util.h>
@@ -99,30 +96,26 @@ SYSCTL_INT(_hw_usb2_ucom, OID_AUTO, debu
&usb2_com_debug, 0, "ucom debug level");
#endif
-struct usb2_com_config_copy {
- struct usb2_com_softc *cc_softc;
- uint8_t cc_flag0;
- uint8_t cc_flag1;
- uint8_t cc_flag2;
- uint8_t cc_flag3;
-};
-
-static usb2_config_td_command_t usb2_com_config_copy;
-static usb2_config_td_command_t usb2_com_cfg_start_transfers;
-static usb2_config_td_command_t usb2_com_cfg_open;
-static usb2_config_td_command_t usb2_com_cfg_close;
-static usb2_config_td_command_t usb2_com_cfg_break;
-static usb2_config_td_command_t usb2_com_cfg_dtr;
-static usb2_config_td_command_t usb2_com_cfg_rts;
-static usb2_config_td_command_t usb2_com_cfg_status_change;
-static usb2_config_td_command_t usb2_com_cfg_param;
+static usb2_proc_callback_t usb2_com_cfg_start_transfers;
+static usb2_proc_callback_t usb2_com_cfg_open;
+static usb2_proc_callback_t usb2_com_cfg_close;
+static usb2_proc_callback_t usb2_com_cfg_break_on;
+static usb2_proc_callback_t usb2_com_cfg_break_off;
+static usb2_proc_callback_t usb2_com_cfg_dtr_on;
+static usb2_proc_callback_t usb2_com_cfg_dtr_off;
+static usb2_proc_callback_t usb2_com_cfg_rts_on;
+static usb2_proc_callback_t usb2_com_cfg_rts_off;
+static usb2_proc_callback_t usb2_com_cfg_status_change;
+static usb2_proc_callback_t usb2_com_cfg_param;
static uint8_t usb2_com_units_alloc(uint32_t, uint32_t *);
static void usb2_com_units_free(uint32_t, uint32_t);
static int usb2_com_attach_sub(struct usb2_com_softc *);
static void usb2_com_detach_sub(struct usb2_com_softc *);
-static void usb2_com_queue_command(struct usb2_com_softc *,
- usb2_config_td_command_t *, int);
+static void usb2_com_queue_command(struct usb2_com_softc *sc,
+ uint8_t cmd);
+static void usb2_com_wait_command(struct usb2_com_softc *sc,
+ uint8_t cmd);
static void usb2_com_shutdown(struct usb2_com_softc *);
static void usb2_com_start_transfers(struct usb2_com_softc *);
static void usb2_com_break(struct usb2_com_softc *, uint8_t);
@@ -251,9 +244,7 @@ usb2_com_attach(struct usb2_com_super_so
if (usb2_com_units_alloc(sub_units, &root_unit)) {
return (ENOMEM);
}
- if (usb2_config_td_setup
- (&ssc->sc_config_td, sc, p_mtx, NULL,
- sizeof(struct usb2_com_config_copy), 24 * sub_units)) {
+ if (usb2_proc_setup(&ssc->sc_config_td, p_mtx, USB_PRI_MED)) {
usb2_com_units_free(root_unit, sub_units);
return (ENOMEM);
}
@@ -285,7 +276,7 @@ usb2_com_detach(struct usb2_com_super_so
{
uint32_t n;
- usb2_config_td_drain(&ssc->sc_config_td);
+ usb2_proc_drain(&ssc->sc_config_td);
for (n = 0; n < sub_units; n++, sc++) {
if (sc->sc_flag & UCOM_FLAG_ATTACHED) {
@@ -298,8 +289,7 @@ usb2_com_detach(struct usb2_com_super_so
sc->sc_flag &= ~UCOM_FLAG_ATTACHED;
}
}
-
- usb2_config_td_unsetup(&ssc->sc_config_td);
+ usb2_proc_unsetup(&ssc->sc_config_td);
}
static int
@@ -307,6 +297,7 @@ usb2_com_attach_sub(struct usb2_com_soft
{
struct tty *tp;
int error = 0;
+ uint8_t n;
char buf[32]; /* temporary TTY device name buffer */
tp = tty_alloc(&usb2_com_class, sc, sc->sc_parent_mtx);
@@ -336,6 +327,39 @@ usb2_com_attach_sub(struct usb2_com_soft
DPRINTF("ttycreate: %s\n", buf);
usb2_cv_init(&sc->sc_cv, "usb2_com");
+ /*
+ * Set all function callback pointers for deferred COM
+ * operations:
+ */
+ for (n = 0; n != 2; n++) {
+ sc->sc_cmds[(2*USB_COM_CFG_START_TRANSFERS) + n].hdr.pm_callback =
+ &usb2_com_cfg_start_transfers;
+ sc->sc_cmds[(2*USB_COM_CFG_OPEN) + n].hdr.pm_callback =
+ &usb2_com_cfg_open;
+ sc->sc_cmds[(2*USB_COM_CFG_CLOSE) + n].hdr.pm_callback =
+ &usb2_com_cfg_close;
+ sc->sc_cmds[(2*USB_COM_CFG_BREAK_ON) + n].hdr.pm_callback =
+ &usb2_com_cfg_break_on;
+ sc->sc_cmds[(2*USB_COM_CFG_BREAK_OFF) + n].hdr.pm_callback =
+ &usb2_com_cfg_break_off;
+ sc->sc_cmds[(2*USB_COM_CFG_DTR_ON) + n].hdr.pm_callback =
+ &usb2_com_cfg_dtr_on;
+ sc->sc_cmds[(2*USB_COM_CFG_DTR_OFF) + n].hdr.pm_callback =
+ &usb2_com_cfg_dtr_off;
+ sc->sc_cmds[(2*USB_COM_CFG_RTS_ON) + n].hdr.pm_callback =
+ &usb2_com_cfg_rts_on;
+ sc->sc_cmds[(2*USB_COM_CFG_RTS_OFF) + n].hdr.pm_callback =
+ &usb2_com_cfg_rts_off;
+ sc->sc_cmds[(2*USB_COM_CFG_STATUS_CHANGE) + n].hdr.pm_callback =
+ &usb2_com_cfg_status_change;
+ sc->sc_cmds[(2*USB_COM_CFG_PARAM) + n].hdr.pm_callback =
+ &usb2_com_cfg_param;
+ }
+
+ /* initialise all callback pointer arguments */
+ for (n = 0; n != (2*USB_COM_CFG_MAX); n++) {
+ sc->sc_cmds[n].cc_softc = sc;
+ }
done:
return (error);
}
@@ -379,27 +403,41 @@ usb2_com_detach_sub(struct usb2_com_soft
usb2_cv_destroy(&sc->sc_cv);
}
+/*
+ * The following function queues a command for deferred execution.
+ * The following function must be called locked.
+ */
static void
-usb2_com_config_copy(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_queue_command(struct usb2_com_softc *sc, uint8_t cmd)
{
- cc->cc_softc = sc + (refcount % UCOM_SUB_UNIT_MAX);
- cc->cc_flag0 = (refcount / (1 * UCOM_SUB_UNIT_MAX)) % 2;
- cc->cc_flag1 = (refcount / (2 * UCOM_SUB_UNIT_MAX)) % 2;
- cc->cc_flag2 = (refcount / (4 * UCOM_SUB_UNIT_MAX)) % 2;
- cc->cc_flag3 = (refcount / (8 * UCOM_SUB_UNIT_MAX)) % 2;
+ struct usb2_com_super_softc *ssc = sc->sc_super;
+
+ if (usb2_proc_is_gone(&ssc->sc_config_td)) {
+ DPRINTF("proc is gone\n");
+ return; /* nothing to do */
+ }
+
+ if (usb2_proc_msignal(&ssc->sc_config_td,
+ &sc->sc_cmds[2*cmd], &sc->sc_cmds[(2*cmd)+1])) {
+ /* ignore */
+ }
}
+/*
+ * The following function waits until a command has been executed.
+ * The following function must be called locked.
+ */
static void
-usb2_com_queue_command(struct usb2_com_softc *sc, usb2_config_td_command_t *cmd, int flag)
+usb2_com_wait_command(struct usb2_com_softc *sc, uint8_t cmd)
{
struct usb2_com_super_softc *ssc = sc->sc_super;
- usb2_config_td_queue_command
- (&ssc->sc_config_td, &usb2_com_config_copy,
- cmd, (cmd == &usb2_com_cfg_status_change) ? 1 : 0,
- ((sc->sc_local_unit % UCOM_SUB_UNIT_MAX) +
- (flag ? UCOM_SUB_UNIT_MAX : 0)));
+ if (usb2_proc_is_gone(&ssc->sc_config_td)) {
+ DPRINTF("proc is gone\n");
+ return; /* nothing to do */
+ }
+ usb2_proc_mwait(&ssc->sc_config_td,
+ &sc->sc_cmds[2*cmd], &sc->sc_cmds[(2*cmd)+1]);
}
static void
@@ -420,6 +458,8 @@ usb2_com_shutdown(struct usb2_com_softc
}
/*
+ * This function will sleep "timeout" system ticks.
+ *
* Return values:
* 0: normal delay
* else: config thread is gone
@@ -428,8 +468,26 @@ uint8_t
usb2_com_cfg_sleep(struct usb2_com_softc *sc, uint32_t timeout)
{
struct usb2_com_super_softc *ssc = sc->sc_super;
+ uint8_t is_gone;
+
+ is_gone = usb2_proc_is_gone(&ssc->sc_config_td);
+ if (is_gone)
+ goto done; /* we are detaching */
+ if (timeout == 0)
+ timeout = 1; /* one tick is the least timeout */
+
+ mtx_unlock(sc->sc_parent_mtx);
+
+ if (pause("UCOMWAIT", timeout)) {
+ /* ignore */
+ }
- return (usb2_config_td_sleep(&ssc->sc_config_td, timeout));
+ mtx_lock(sc->sc_parent_mtx);
+
+ /* refresh gone status */
+ is_gone = usb2_proc_is_gone(&ssc->sc_config_td);
+done:
+ return (is_gone);
}
/*
@@ -442,13 +500,15 @@ usb2_com_cfg_is_gone(struct usb2_com_sof
{
struct usb2_com_super_softc *ssc = sc->sc_super;
- return (usb2_config_td_is_gone(&ssc->sc_config_td));
+ return (usb2_proc_is_gone(&ssc->sc_config_td));
}
static void
-usb2_com_cfg_start_transfers(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_cfg_start_transfers(struct usb2_proc_msg *_cc)
{
+ struct usb2_com_command_msg *cc = (void *)_cc;
+ struct usb2_com_softc *sc;
+
sc = cc->cc_softc;
if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) {
@@ -485,14 +545,16 @@ usb2_com_start_transfers(struct usb2_com
(sc->sc_callback->usb2_com_start_write) (sc);
}
if (!(sc->sc_flag & UCOM_FLAG_GP_DATA)) {
- usb2_com_queue_command(sc, &usb2_com_cfg_start_transfers, 0);
+ usb2_com_queue_command(sc, USB_COM_CFG_START_TRANSFERS);
}
}
static void
-usb2_com_cfg_open(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_cfg_open(struct usb2_proc_msg *_cc)
{
+ struct usb2_com_command_msg *cc = (void *)_cc;
+ struct usb2_com_softc *sc;
+
sc = cc->cc_softc;
DPRINTF("\n");
@@ -550,7 +612,7 @@ usb2_com_open(struct tty *tp)
sc->sc_msr = 0;
sc->sc_mcr = 0;
- usb2_com_queue_command(sc, &usb2_com_cfg_open, 0);
+ usb2_com_queue_command(sc, USB_COM_CFG_OPEN);
usb2_com_start_transfers(sc);
@@ -564,9 +626,11 @@ usb2_com_open(struct tty *tp)
}
static void
-usb2_com_cfg_close(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_cfg_close(struct usb2_proc_msg *_cc)
{
+ struct usb2_com_command_msg *cc = (void *)_cc;
+ struct usb2_com_softc *sc;
+
sc = cc->cc_softc;
DPRINTF("\n");
@@ -588,7 +652,6 @@ static void
usb2_com_close(struct tty *tp)
{
struct usb2_com_softc *sc = tty_softc(tp);
- struct usb2_com_super_softc *ssc = sc->sc_super;
mtx_assert(sc->sc_parent_mtx, MA_OWNED);
@@ -600,8 +663,9 @@ usb2_com_close(struct tty *tp)
}
usb2_com_shutdown(sc);
- usb2_com_queue_command(sc, &usb2_com_cfg_close, 0);
- usb2_config_td_sync(&ssc->sc_config_td);
+ /* Queue and wait for close command to complete */
+ usb2_com_queue_command(sc, USB_COM_CFG_CLOSE);
+ usb2_com_wait_command(sc, USB_COM_CFG_CLOSE);
sc->sc_flag &= ~(UCOM_FLAG_HL_READY |
UCOM_FLAG_WR_START |
@@ -704,22 +768,35 @@ usb2_com_modem(struct tty *tp, int sigon
}
static void
-usb2_com_cfg_break(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_cfg_break(struct usb2_com_command_msg *cc, uint8_t onoff)
{
+ struct usb2_com_softc *sc;
+
sc = cc->cc_softc;
if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) {
return;
}
- DPRINTF("onoff=%d\n", cc->cc_flag0);
+ DPRINTF("onoff=%d\n", onoff);
if (sc->sc_callback->usb2_com_cfg_set_break) {
- (sc->sc_callback->usb2_com_cfg_set_break) (sc, cc->cc_flag0);
+ (sc->sc_callback->usb2_com_cfg_set_break) (sc, onoff);
}
}
static void
+usb2_com_cfg_break_on(struct usb2_proc_msg *_cc)
+{
+ usb2_com_cfg_break((void *)_cc, 1);
+}
+
+static void
+usb2_com_cfg_break_off(struct usb2_proc_msg *_cc)
+{
+ usb2_com_cfg_break((void *)_cc, 0);
+}
+
+static void
usb2_com_break(struct usb2_com_softc *sc, uint8_t onoff)
{
mtx_assert(sc->sc_parent_mtx, MA_OWNED);
@@ -729,26 +806,40 @@ usb2_com_break(struct usb2_com_softc *sc
}
DPRINTF("onoff = %d\n", onoff);
- usb2_com_queue_command(sc, &usb2_com_cfg_break, onoff);
+ usb2_com_queue_command(sc, onoff ?
+ USB_COM_CFG_BREAK_ON : USB_COM_CFG_BREAK_OFF);
}
static void
-usb2_com_cfg_dtr(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_cfg_dtr(struct usb2_com_command_msg *cc, uint8_t onoff)
{
+ struct usb2_com_softc *sc;
+
sc = cc->cc_softc;
if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) {
return;
}
- DPRINTF("onoff=%d\n", cc->cc_flag0);
+ DPRINTF("onoff=%d\n", onoff);
if (sc->sc_callback->usb2_com_cfg_set_dtr) {
- (sc->sc_callback->usb2_com_cfg_set_dtr) (sc, cc->cc_flag0);
+ (sc->sc_callback->usb2_com_cfg_set_dtr) (sc, onoff);
}
}
static void
+usb2_com_cfg_dtr_on(struct usb2_proc_msg *_cc)
+{
+ usb2_com_cfg_dtr((void *)_cc, 1);
+}
+
+static void
+usb2_com_cfg_dtr_off(struct usb2_proc_msg *_cc)
+{
+ usb2_com_cfg_dtr((void *)_cc, 0);
+}
+
+static void
usb2_com_dtr(struct usb2_com_softc *sc, uint8_t onoff)
{
mtx_assert(sc->sc_parent_mtx, MA_OWNED);
@@ -758,26 +849,40 @@ usb2_com_dtr(struct usb2_com_softc *sc,
}
DPRINTF("onoff = %d\n", onoff);
- usb2_com_queue_command(sc, &usb2_com_cfg_dtr, onoff);
+ usb2_com_queue_command(sc, onoff ?
+ USB_COM_CFG_DTR_ON : USB_COM_CFG_DTR_OFF);
}
static void
-usb2_com_cfg_rts(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_cfg_rts(struct usb2_com_command_msg *cc, uint8_t onoff)
{
+ struct usb2_com_softc *sc;
+
sc = cc->cc_softc;
- DPRINTF("onoff=%d\n", cc->cc_flag0);
+ DPRINTF("onoff=%d\n", onoff);
if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) {
return;
}
if (sc->sc_callback->usb2_com_cfg_set_rts) {
- (sc->sc_callback->usb2_com_cfg_set_rts) (sc, cc->cc_flag0);
+ (sc->sc_callback->usb2_com_cfg_set_rts) (sc, onoff);
}
}
static void
+usb2_com_cfg_rts_on(struct usb2_proc_msg *_cc)
+{
+ usb2_com_cfg_rts((void *)_cc, 1);
+}
+
+static void
+usb2_com_cfg_rts_off(struct usb2_proc_msg *_cc)
+{
+ usb2_com_cfg_rts((void *)_cc, 0);
+}
+
+static void
usb2_com_rts(struct usb2_com_softc *sc, uint8_t onoff)
{
mtx_assert(sc->sc_parent_mtx, MA_OWNED);
@@ -787,13 +892,15 @@ usb2_com_rts(struct usb2_com_softc *sc,
}
DPRINTF("onoff = %d\n", onoff);
- usb2_com_queue_command(sc, &usb2_com_cfg_rts, onoff);
+ usb2_com_queue_command(sc, onoff ?
+ USB_COM_CFG_RTS_ON : USB_COM_CFG_RTS_OFF);
}
static void
-usb2_com_cfg_status_change(struct usb2_com_softc *sc,
- struct usb2_com_config_copy *cc, uint16_t refcount)
+usb2_com_cfg_status_change(struct usb2_proc_msg *_cc)
{
+ struct usb2_com_command_msg *cc = (void *)_cc;
+ struct usb2_com_softc *sc;
struct tty *tp;
uint8_t new_msr;
@@ -847,13 +954,14 @@ usb2_com_status_change(struct usb2_com_s
}
DPRINTF("\n");
- usb2_com_queue_command(sc, &usb2_com_cfg_status_change, 0);
+ usb2_com_queue_command(sc, USB_COM_CFG_STATUS_CHANGE);
}
static void
-usb2_com_cfg_param(struct usb2_com_softc *sc, struct usb2_com_config_copy *cc,
- uint16_t refcount)
+usb2_com_cfg_param(struct usb2_proc_msg *_cc)
{
+ struct usb2_com_command_msg *cc = (void *)_cc;
+ struct usb2_com_softc *sc;
struct termios t_copy;
sc = cc->cc_softc;
@@ -924,7 +1032,7 @@ usb2_com_param(struct tty *tp, struct te
sc->sc_flag &= ~UCOM_FLAG_GP_DATA;
/* Queue baud rate programming command first */
- usb2_com_queue_command(sc, &usb2_com_cfg_param, 0);
+ usb2_com_queue_command(sc, USB_COM_CFG_PARAM);
/* Queue transfer enable command last */
usb2_com_start_transfers(sc);
Modified: head/sys/dev/usb2/serial/usb2_serial.h
==============================================================================
--- head/sys/dev/usb2/serial/usb2_serial.h Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/usb2_serial.h Tue Jan 13 19:03:47 2009 (r187176)
@@ -119,11 +119,35 @@ struct usb2_com_callback {
#define ULSR_RXRDY 0x01 /* Byte ready in Receive Buffer */
#define ULSR_RCV_MASK 0x1f /* Mask for incoming data or error */
+/*
+ * List of serial adapter commands or deferred function calls:
+ */
+enum {
+ USB_COM_CFG_START_TRANSFERS,
+ USB_COM_CFG_OPEN,
+ USB_COM_CFG_CLOSE,
+ USB_COM_CFG_BREAK_ON,
+ USB_COM_CFG_BREAK_OFF,
+ USB_COM_CFG_DTR_ON,
+ USB_COM_CFG_DTR_OFF,
+ USB_COM_CFG_RTS_ON,
+ USB_COM_CFG_RTS_OFF,
+ USB_COM_CFG_STATUS_CHANGE,
+ USB_COM_CFG_PARAM,
+ USB_COM_CFG_MAX,
+};
+
+struct usb2_com_command_msg {
+ struct usb2_proc_msg hdr; /* must be first */
+ struct usb2_com_softc *cc_softc;
+};
+
struct usb2_com_super_softc {
- struct usb2_config_td sc_config_td;
+ struct usb2_process sc_config_td;
};
struct usb2_com_softc {
+ struct usb2_com_command_msg sc_cmds[2*USB_COM_CFG_MAX];
struct termios sc_termios_copy;
struct cv sc_cv;
const struct usb2_com_callback *sc_callback;
@@ -146,6 +170,7 @@ struct usb2_com_softc {
uint8_t sc_msr;
uint8_t sc_mcr;
uint8_t sc_ttyfreed; /* set when TTY has been freed */
+ uint8_t sc_last_cmd_flag[USB_COM_CFG_MAX];
};
int usb2_com_attach(struct usb2_com_super_softc *ssc,
Modified: head/sys/dev/usb2/serial/uvisor2.c
==============================================================================
--- head/sys/dev/usb2/serial/uvisor2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/uvisor2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -66,7 +66,6 @@
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
Modified: head/sys/dev/usb2/serial/uvscom2.c
==============================================================================
--- head/sys/dev/usb2/serial/uvscom2.c Tue Jan 13 19:03:33 2009 (r187175)
+++ head/sys/dev/usb2/serial/uvscom2.c Tue Jan 13 19:03:47 2009 (r187176)
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb2/core/usb2_core.h>
#include <dev/usb2/core/usb2_debug.h>
#include <dev/usb2/core/usb2_process.h>
-#include <dev/usb2/core/usb2_config_td.h>
#include <dev/usb2/core/usb2_request.h>
#include <dev/usb2/core/usb2_lookup.h>
#include <dev/usb2/core/usb2_util.h>
More information about the svn-src-head
mailing list