From owner-p4-projects@FreeBSD.ORG Sat Jan 10 16:39:52 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 02570106566C; Sat, 10 Jan 2009 16:39:52 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9CF36106564A for ; Sat, 10 Jan 2009 16:39:51 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 88D118FC16 for ; Sat, 10 Jan 2009 16:39:51 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n0AGdpF1090320 for ; Sat, 10 Jan 2009 16:39:51 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n0AGdprV090318 for perforce@freebsd.org; Sat, 10 Jan 2009 16:39:51 GMT (envelope-from hselasky@FreeBSD.org) Date: Sat, 10 Jan 2009 16:39:51 GMT Message-Id: <200901101639.n0AGdprV090318@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 155917 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Jan 2009 16:39:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=155917 Change 155917 by hselasky@hselasky_laptop001 on 2009/01/10 16:39:25 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. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#5 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#13 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#19 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ubser2.c#13 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uchcom2.c#16 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ucycom2.c#14 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ufoma2.c#17 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uftdi2.c#15 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ugensa2.c#19 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uipaq2.c#15 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ulpt2.c#13 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/umct2.c#13 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/umodem2.c#16 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/umoscom2.c#14 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uplcom2.c#16 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.c#21 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.h#10 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uvisor2.c#14 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uvscom2.c#16 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#5 (text+ko) ==== @@ -44,7 +44,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#13 (text+ko) ==== @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#19 (text+ko) ==== @@ -73,7 +73,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/ubser2.c#13 (text+ko) ==== @@ -87,7 +87,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/uchcom2.c#16 (text+ko) ==== @@ -81,7 +81,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/ucycom2.c#14 (text+ko) ==== @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/ufoma2.c#17 (text+ko) ==== @@ -94,7 +94,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/uftdi2.c#15 (text+ko) ==== @@ -59,7 +59,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/ugensa2.c#19 (text+ko) ==== @@ -54,7 +54,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/uipaq2.c#15 (text+ko) ==== @@ -62,7 +62,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/ulpt2.c#13 (text+ko) ==== @@ -55,7 +55,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/umct2.c#13 (text+ko) ==== @@ -56,7 +56,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/umodem2.c#16 (text+ko) ==== @@ -92,7 +92,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/umoscom2.c#14 (text+ko) ==== @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/uplcom2.c#16 (text+ko) ==== @@ -95,7 +95,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.c#21 (text+ko) ==== @@ -78,13 +78,10 @@ #include #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 #include #include -#include #include #include #include @@ -99,30 +96,26 @@ &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 @@ 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 @@ { 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 @@ 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 @@ { 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 @@ 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_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 @@ } /* + * This function will sleep "timeout" system ticks. + * * Return values: * 0: normal delay * else: config thread is gone @@ -428,8 +468,26 @@ 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 */ - return (usb2_config_td_sleep(&ssc->sc_config_td, timeout)); + mtx_unlock(sc->sc_parent_mtx); + + if (pause("UCOMWAIT", timeout)) { + /* ignore */ + } + + 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 @@ { 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 @@ (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 @@ 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 @@ } 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 @@ 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_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 @@ } 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 @@ } 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 @@ } 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 @@ } 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 @@ } 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 @@ 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); ==== //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.h#10 (text+ko) ==== @@ -119,11 +119,35 @@ #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 @@ 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, ==== //depot/projects/usb/src/sys/dev/usb2/serial/uvisor2.c#14 (text+ko) ==== @@ -66,7 +66,6 @@ #include #include #include -#include #include #include #include ==== //depot/projects/usb/src/sys/dev/usb2/serial/uvscom2.c#16 (text+ko) ==== @@ -48,7 +48,6 @@ #include #include #include -#include #include #include #include