Date: Tue, 27 Jan 2009 01:23:25 +0000 (UTC) From: Andrew Thompson <thompsa@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r187751 - user/thompsa/usb/sys/dev/usb2/serial Message-ID: <200901270123.n0R1NPNc069306@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: thompsa Date: Tue Jan 27 01:23:25 2009 New Revision: 187751 URL: http://svn.freebsd.org/changeset/base/187751 Log: Change over to usb2_proc w/ taskqueues. Modified: user/thompsa/usb/sys/dev/usb2/serial/uark2.c user/thompsa/usb/sys/dev/usb2/serial/ubsa2.c user/thompsa/usb/sys/dev/usb2/serial/uchcom2.c user/thompsa/usb/sys/dev/usb2/serial/ucycom2.c user/thompsa/usb/sys/dev/usb2/serial/ufoma2.c user/thompsa/usb/sys/dev/usb2/serial/uftdi2.c user/thompsa/usb/sys/dev/usb2/serial/uipaq2.c user/thompsa/usb/sys/dev/usb2/serial/umct2.c user/thompsa/usb/sys/dev/usb2/serial/umodem2.c user/thompsa/usb/sys/dev/usb2/serial/umoscom2.c user/thompsa/usb/sys/dev/usb2/serial/uplcom2.c user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.c user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.h user/thompsa/usb/sys/dev/usb2/serial/uvscom2.c Modified: user/thompsa/usb/sys/dev/usb2/serial/uark2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/uark2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/uark2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -457,9 +457,6 @@ uark_cfg_write(struct uark_softc *sc, ui struct usb2_device_request req; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - return; - } req.bmRequestType = UARK_WRITE; req.bRequest = UARK_REQUEST; USETW(req.wValue, value); Modified: user/thompsa/usb/sys/dev/usb2/serial/ubsa2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/ubsa2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/ubsa2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -382,9 +382,6 @@ ubsa_cfg_request(struct ubsa_softc *sc, struct usb2_device_request req; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - return; - } req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = index; USETW(req.wValue, value); Modified: user/thompsa/usb/sys/dev/usb2/serial/uchcom2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/uchcom2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/uchcom2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -425,9 +425,6 @@ uchcom_do_request(struct uchcom_softc *s length = UGETW(req->wLength); actlen = 0; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - goto done; - } err = usb2_do_request_flags(sc->sc_udev, &Giant, req, data, USB_SHORT_XFER_OK, &actlen, 1000); @@ -435,7 +432,6 @@ uchcom_do_request(struct uchcom_softc *s DPRINTFN(0, "device request failed, err=%s " "(ignored)\n", usb2_errstr(err)); } -done: if (length != actlen) { if (req->bmRequestType & UT_READ) { bzero(USB_ADD_BYTES(data, actlen), length - actlen); Modified: user/thompsa/usb/sys/dev/usb2/serial/ucycom2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/ucycom2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/ucycom2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -2,7 +2,7 @@ __FBSDID("$FreeBSD$"); /*- - * Copyright (c) 2004 Dag-Erling Coïdan Smørgrav + * Copyright (c) 2004 Dag-Erling Co�dan Sm�rgrav * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -441,9 +441,6 @@ ucycom_cfg_write(struct ucycom_softc *sc sc->sc_temp_cfg[3] = (baud >> 24) & 0xff; sc->sc_temp_cfg[4] = cfg; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - return; - } err = usb2_do_request_flags (sc->sc_udev, &Giant, &req, sc->sc_temp_cfg, 0, NULL, 1000); Modified: user/thompsa/usb/sys/dev/usb2/serial/ufoma2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/ufoma2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/ufoma2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -534,9 +534,6 @@ ufoma_cfg_do_request(struct ufoma_softc uint16_t length; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - goto error; - } err = usb2_do_request_flags (sc->sc_udev, &Giant, req, data, 0, NULL, 1000); @@ -545,7 +542,6 @@ ufoma_cfg_do_request(struct ufoma_softc DPRINTFN(0, "device request failed, err=%s " "(ignored)\n", usb2_errstr(err)); -error: length = UGETW(req->wLength); if ((req->bmRequestType & UT_READ) && length) { Modified: user/thompsa/usb/sys/dev/usb2/serial/uftdi2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/uftdi2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/uftdi2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -367,9 +367,6 @@ uftdi_cfg_do_request(struct uftdi_softc uint16_t length; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - goto error; - } err = usb2_do_request_flags (sc->sc_udev, &Giant, req, data, 0, NULL, 1000); @@ -378,7 +375,6 @@ uftdi_cfg_do_request(struct uftdi_softc DPRINTFN(0, "device request failed, err=%s " "(ignored)\n", usb2_errstr(err)); -error: length = UGETW(req->wLength); if ((req->bmRequestType & UT_READ) && length) { Modified: user/thompsa/usb/sys/dev/usb2/serial/uipaq2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/uipaq2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/uipaq2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -1234,9 +1234,6 @@ uipaq_cfg_do_request(struct uipaq_softc uint16_t length; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - goto error; - } err = usb2_do_request(sc->sc_udev, &Giant, req, data); if (err) { @@ -1244,7 +1241,6 @@ uipaq_cfg_do_request(struct uipaq_softc DPRINTFN(0, "device request failed, err=%s " "(ignored)\n", usb2_errstr(err)); -error: length = UGETW(req->wLength); if ((req->bmRequestType & UT_READ) && length) { Modified: user/thompsa/usb/sys/dev/usb2/serial/umct2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/umct2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/umct2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -352,9 +352,6 @@ umct_cfg_do_request(struct umct_softc *s usb2_error_t err; uint8_t temp[4]; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - goto done; - } if (len > 4) { len = 4; } @@ -373,8 +370,6 @@ umct_cfg_do_request(struct umct_softc *s DPRINTFN(0, "device request failed, err=%s " "(ignored)\n", usb2_errstr(err)); } -done: - return; } static void Modified: user/thompsa/usb/sys/dev/usb2/serial/umodem2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/umodem2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/umodem2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -890,9 +890,6 @@ umodem_cfg_do_request(struct umodem_soft uint16_t length; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - goto error; - } err = usb2_do_request_flags(sc->sc_udev, &Giant, req, data, 0, NULL, 1000); @@ -901,7 +898,6 @@ umodem_cfg_do_request(struct umodem_soft DPRINTFN(0, "device request failed, err=%s " "(ignored)\n", usb2_errstr(err)); -error: length = UGETW(req->wLength); if ((req->bmRequestType & UT_READ) && length) { Modified: user/thompsa/usb/sys/dev/usb2/serial/umoscom2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/umoscom2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/umoscom2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -590,16 +590,12 @@ umoscom_cfg_do_request(struct umoscom_so uint16_t length; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) - goto error; - err = usb2_do_request_flags (sc->sc_udev, &Giant, req, data, 0, NULL, 1000); if (err) { DPRINTFN(0, "control request failed: %s\n", usb2_errstr(err)); -error: length = UGETW(req->wLength); if ((req->bmRequestType & UT_READ) && length) { Modified: user/thompsa/usb/sys/dev/usb2/serial/uplcom2.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/uplcom2.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/uplcom2.c Tue Jan 27 01:23:25 2009 (r187751) @@ -930,9 +930,6 @@ uplcom_cfg_do_request(struct uplcom_soft uint16_t length; usb2_error_t err; - if (usb2_com_cfg_is_gone(&sc->sc_ucom)) { - goto error; - } err = usb2_do_request_flags(sc->sc_udev, &Giant, req, data, 0, NULL, 1000); @@ -941,7 +938,6 @@ uplcom_cfg_do_request(struct uplcom_soft DPRINTFN(0, "device request failed, err=%s " "(ignored)\n", usb2_errstr(err)); -error: length = UGETW(req->wLength); if ((req->bmRequestType & UT_READ) && length) { Modified: user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.c ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.c Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.c Tue Jan 27 01:23:25 2009 (r187751) @@ -96,26 +96,21 @@ SYSCTL_INT(_hw_usb2_ucom, OID_AUTO, debu &usb2_com_debug, 0, "ucom debug level"); #endif -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 usb2_task_fn_t usb2_com_cfg_start_transfers; +static usb2_task_fn_t usb2_com_cfg_open; +static usb2_task_fn_t usb2_com_cfg_close; +static usb2_task_fn_t usb2_com_cfg_break; +static usb2_task_fn_t usb2_com_cfg_dtr; +static usb2_task_fn_t usb2_com_cfg_rts; +static usb2_task_fn_t usb2_com_cfg_status_change; +static usb2_task_fn_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 *sc, - uint8_t cmd); -static void usb2_com_wait_command(struct usb2_com_softc *sc, - uint8_t cmd); +static int usb2_com_attach_tty(struct usb2_com_softc *); +static void usb2_com_detach_tty(struct usb2_com_softc *); +static void usb2_com_queue_command(struct usb2_com_softc *, + struct usb2_task *, int); 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); @@ -127,14 +122,14 @@ static tsw_close_t usb2_com_close; static tsw_ioctl_t usb2_com_ioctl; static tsw_modem_t usb2_com_modem; static tsw_param_t usb2_com_param; -static tsw_outwakeup_t usb2_com_start_write; +static tsw_outwakeup_t usb2_com_outwakeup; static tsw_free_t usb2_com_free; static struct ttydevsw usb2_com_class = { .tsw_flags = TF_INITLOCK | TF_CALLOUT, .tsw_open = usb2_com_open, .tsw_close = usb2_com_close, - .tsw_outwakeup = usb2_com_start_write, + .tsw_outwakeup = usb2_com_outwakeup, .tsw_ioctl = usb2_com_ioctl, .tsw_param = usb2_com_param, .tsw_modem = usb2_com_modem, @@ -221,15 +216,15 @@ usb2_com_units_free(uint32_t root_unit, * sub-units can be used to differentiate among * different types of devices. * - * The mutex pointed to by "p_mtx" is applied before all - * callbacks are called back. Also "p_mtx" must be applied + * The mutex pointed to by "mtx" is applied before all + * callbacks are called back. Also "mtx" must be applied * before calling into the ucom-layer! Currently only Giant * is supported. */ int usb2_com_attach(struct usb2_com_super_softc *ssc, struct usb2_com_softc *sc, uint32_t sub_units, void *parent, - const struct usb2_com_callback *callback, struct mtx *p_mtx) + const struct usb2_com_callback *callback, struct mtx *mtx) { uint32_t n; uint32_t root_unit; @@ -244,26 +239,39 @@ usb2_com_attach(struct usb2_com_super_so if (usb2_com_units_alloc(sub_units, &root_unit)) { return (ENOMEM); } - if (usb2_proc_setup(&ssc->sc_config_td, p_mtx, USB_PRI_MED)) { - usb2_com_units_free(root_unit, sub_units); - return (ENOMEM); - } + + error = usb2_proc_create(&ssc->sc_tq, USB_PRI_MED, "ucom"); + if (error) + return (error); + for (n = 0; n < sub_units; n++, sc++) { sc->sc_unit = root_unit + n; sc->sc_local_unit = n; sc->sc_super = ssc; - sc->sc_parent_mtx = p_mtx; + sc->sc_mtx = mtx; sc->sc_parent = parent; sc->sc_callback = callback; - error = usb2_com_attach_sub(sc); + error = usb2_com_attach_tty(sc); if (error) { usb2_com_detach(ssc, sc - n, n); usb2_com_units_free(root_unit + n, sub_units - n); - break; + goto error; } sc->sc_flag |= UCOM_FLAG_ATTACHED; + + USB_TASK_INIT(&sc->sc_start_task, usb2_com_cfg_start_transfers, sc, mtx); + USB_TASK_INIT(&sc->sc_open_task, usb2_com_cfg_open, sc, mtx); + USB_TASK_INIT(&sc->sc_close_task, usb2_com_cfg_close, sc, mtx); + USB_TASK_INIT(&sc->sc_break_task, usb2_com_cfg_break, sc, mtx); + USB_TASK_INIT(&sc->sc_dtr_task, usb2_com_cfg_dtr, sc, mtx); + USB_TASK_INIT(&sc->sc_rts_task, usb2_com_cfg_rts, sc, mtx); + USB_TASK_INIT(&sc->sc_status_task, usb2_com_cfg_status_change, sc, mtx); + USB_TASK_INIT(&sc->sc_param_task, usb2_com_cfg_param, sc, mtx); } + return (0); +error: + usb2_proc_free(&ssc->sc_tq); return (error); } @@ -276,12 +284,10 @@ usb2_com_detach(struct usb2_com_super_so { uint32_t n; - usb2_proc_drain(&ssc->sc_config_td); - for (n = 0; n < sub_units; n++, sc++) { if (sc->sc_flag & UCOM_FLAG_ATTACHED) { - usb2_com_detach_sub(sc); + usb2_com_detach_tty(sc); usb2_com_units_free(sc->sc_unit, 1); @@ -289,18 +295,17 @@ usb2_com_detach(struct usb2_com_super_so sc->sc_flag &= ~UCOM_FLAG_ATTACHED; } } - usb2_proc_unsetup(&ssc->sc_config_td); + usb2_proc_free(&ssc->sc_tq); } static int -usb2_com_attach_sub(struct usb2_com_softc *sc) +usb2_com_attach_tty(struct usb2_com_softc *sc) { 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); + tp = tty_alloc(&usb2_com_class, sc, sc->sc_mtx); if (tp == NULL) { error = ENOMEM; goto done; @@ -327,45 +332,12 @@ 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); } static void -usb2_com_detach_sub(struct usb2_com_softc *sc) +usb2_com_detach_tty(struct usb2_com_softc *sc) { struct tty *tp = sc->sc_tty; @@ -373,11 +345,11 @@ usb2_com_detach_sub(struct usb2_com_soft /* the config thread has been stopped when we get here */ - mtx_lock(sc->sc_parent_mtx); + mtx_lock(sc->sc_mtx); sc->sc_flag |= UCOM_FLAG_GONE; sc->sc_flag &= ~(UCOM_FLAG_HL_READY | UCOM_FLAG_LL_READY); - mtx_unlock(sc->sc_parent_mtx); + mtx_unlock(sc->sc_mtx); if (tp) { tty_lock(tp); @@ -385,10 +357,10 @@ usb2_com_detach_sub(struct usb2_com_soft tty_rel_gone(tp); - mtx_lock(sc->sc_parent_mtx); + mtx_lock(sc->sc_mtx); /* Wait for the callback after the TTY is torn down */ while (sc->sc_ttyfreed == 0) - usb2_cv_wait(&sc->sc_cv, sc->sc_parent_mtx); + usb2_cv_wait(&sc->sc_cv, sc->sc_mtx); /* * make sure that read and write transfers are stopped */ @@ -398,46 +370,20 @@ usb2_com_detach_sub(struct usb2_com_soft if (sc->sc_callback->usb2_com_stop_write) { (sc->sc_callback->usb2_com_stop_write) (sc); } - mtx_unlock(sc->sc_parent_mtx); + mtx_unlock(sc->sc_mtx); } 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_queue_command(struct usb2_com_softc *sc, uint8_t cmd) +usb2_com_queue_command(struct usb2_com_softc *sc, struct usb2_task *task, int arg) { 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 */ - } + mtx_assert(sc->sc_mtx, MA_OWNED); - 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_wait_command(struct usb2_com_softc *sc, uint8_t cmd) -{ - 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 */ - } - usb2_proc_mwait(&ssc->sc_config_td, - &sc->sc_cmds[2*cmd], &sc->sc_cmds[(2*cmd)+1]); + USB_TASK_ARG(task) = arg; + usb2_proc_enqueue(&ssc->sc_tq, task); } static void @@ -445,7 +391,7 @@ usb2_com_shutdown(struct usb2_com_softc { struct tty *tp = sc->sc_tty; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); DPRINTF("\n"); @@ -457,59 +403,10 @@ usb2_com_shutdown(struct usb2_com_softc } } -/* - * This function will sleep "timeout" system ticks. - * - * Return values: - * 0: normal delay - * else: config thread is gone - */ -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 */ - } - - mtx_lock(sc->sc_parent_mtx); - - /* refresh gone status */ - is_gone = usb2_proc_is_gone(&ssc->sc_config_td); -done: - return (is_gone); -} - -/* - * Return values: - * 0: normal - * else: config thread is gone - */ -uint8_t -usb2_com_cfg_is_gone(struct usb2_com_softc *sc) -{ - struct usb2_com_super_softc *ssc = sc->sc_super; - - return (usb2_proc_is_gone(&ssc->sc_config_td)); -} - static void -usb2_com_cfg_start_transfers(struct usb2_proc_msg *_cc) +usb2_com_cfg_start_transfers(void *context, struct usb2_task *task) { - struct usb2_com_command_msg *cc = (void *)_cc; - struct usb2_com_softc *sc; - - sc = cc->cc_softc; + struct usb2_com_softc *sc = context; if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) { return; @@ -545,17 +442,14 @@ 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, USB_COM_CFG_START_TRANSFERS); + usb2_com_queue_command(sc, &sc->sc_start_task, 0); } } static void -usb2_com_cfg_open(struct usb2_proc_msg *_cc) +usb2_com_cfg_open(void *context, struct usb2_task *task) { - struct usb2_com_command_msg *cc = (void *)_cc; - struct usb2_com_softc *sc; - - sc = cc->cc_softc; + struct usb2_com_softc *sc = context; DPRINTF("\n"); @@ -571,7 +465,7 @@ usb2_com_cfg_open(struct usb2_proc_msg * (sc->sc_callback->usb2_com_cfg_open) (sc); /* wait a little */ - usb2_com_cfg_sleep(sc, hz / 10); + usb2_pause_mtx(sc->sc_mtx, hz / 10); } } } @@ -582,7 +476,7 @@ usb2_com_open(struct tty *tp) struct usb2_com_softc *sc = tty_softc(tp); int error; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); if (sc->sc_flag & UCOM_FLAG_GONE) { return (ENXIO); @@ -612,7 +506,7 @@ usb2_com_open(struct tty *tp) sc->sc_msr = 0; sc->sc_mcr = 0; - usb2_com_queue_command(sc, USB_COM_CFG_OPEN); + usb2_com_queue_command(sc, &sc->sc_open_task, 0); usb2_com_start_transfers(sc); @@ -626,12 +520,9 @@ usb2_com_open(struct tty *tp) } static void -usb2_com_cfg_close(struct usb2_proc_msg *_cc) +usb2_com_cfg_close(void *context, struct usb2_task *task) { - struct usb2_com_command_msg *cc = (void *)_cc; - struct usb2_com_softc *sc; - - sc = cc->cc_softc; + struct usb2_com_softc *sc = context; DPRINTF("\n"); @@ -652,8 +543,8 @@ static void usb2_com_close(struct tty *tp) { struct usb2_com_softc *sc = tty_softc(tp); - - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + + mtx_assert(sc->sc_mtx, MA_OWNED); DPRINTF("tp=%p\n", tp); @@ -663,9 +554,7 @@ usb2_com_close(struct tty *tp) } usb2_com_shutdown(sc); - /* 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); + usb2_com_queue_command(sc, &sc->sc_close_task, 0); sc->sc_flag &= ~(UCOM_FLAG_HL_READY | UCOM_FLAG_WR_START | @@ -685,7 +574,7 @@ usb2_com_ioctl(struct tty *tp, u_long cm struct usb2_com_softc *sc = tty_softc(tp); int error; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) { return (EIO); @@ -719,7 +608,7 @@ usb2_com_modem(struct tty *tp, int sigon struct usb2_com_softc *sc = tty_softc(tp); uint8_t onoff; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) { return (0); @@ -768,11 +657,10 @@ usb2_com_modem(struct tty *tp, int sigon } static void -usb2_com_cfg_break(struct usb2_com_command_msg *cc, uint8_t onoff) +usb2_com_cfg_break(void *context, struct usb2_task *task) { - struct usb2_com_softc *sc; - - sc = cc->cc_softc; + struct usb2_com_softc *sc = context; + int onoff = USB_TASK_ARG(task); if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) { return; @@ -785,37 +673,23 @@ usb2_com_cfg_break(struct usb2_com_comma } 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); + mtx_assert(sc->sc_mtx, MA_OWNED); if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) { return; } DPRINTF("onoff = %d\n", onoff); - usb2_com_queue_command(sc, onoff ? - USB_COM_CFG_BREAK_ON : USB_COM_CFG_BREAK_OFF); + usb2_com_queue_command(sc, &sc->sc_break_task, onoff); } static void -usb2_com_cfg_dtr(struct usb2_com_command_msg *cc, uint8_t onoff) +usb2_com_cfg_dtr(void *context, struct usb2_task *task) { - struct usb2_com_softc *sc; - - sc = cc->cc_softc; + struct usb2_com_softc *sc = context; + int onoff = USB_TASK_ARG(task); if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) { return; @@ -828,37 +702,23 @@ usb2_com_cfg_dtr(struct usb2_com_command } 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); + mtx_assert(sc->sc_mtx, MA_OWNED); if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) { return; } DPRINTF("onoff = %d\n", onoff); - usb2_com_queue_command(sc, onoff ? - USB_COM_CFG_DTR_ON : USB_COM_CFG_DTR_OFF); + usb2_com_queue_command(sc, &sc->sc_dtr_task, onoff); } static void -usb2_com_cfg_rts(struct usb2_com_command_msg *cc, uint8_t onoff) +usb2_com_cfg_rts(void *context, struct usb2_task *task) { - struct usb2_com_softc *sc; - - sc = cc->cc_softc; + struct usb2_com_softc *sc = context; + int onoff = USB_TASK_ARG(task); DPRINTF("onoff=%d\n", onoff); @@ -871,46 +731,30 @@ usb2_com_cfg_rts(struct usb2_com_command } 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); + mtx_assert(sc->sc_mtx, MA_OWNED); if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) { return; } DPRINTF("onoff = %d\n", onoff); - usb2_com_queue_command(sc, onoff ? - USB_COM_CFG_RTS_ON : USB_COM_CFG_RTS_OFF); + usb2_com_queue_command(sc, &sc->sc_rts_task, onoff); } static void -usb2_com_cfg_status_change(struct usb2_proc_msg *_cc) +usb2_com_cfg_status_change(void *context, struct usb2_task *task) { - struct usb2_com_command_msg *cc = (void *)_cc; - struct usb2_com_softc *sc; + struct usb2_com_softc *sc = context; struct tty *tp; - uint8_t new_msr; uint8_t new_lsr; uint8_t onoff; - sc = cc->cc_softc; tp = sc->sc_tty; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) { return; @@ -947,25 +791,22 @@ usb2_com_cfg_status_change(struct usb2_p void usb2_com_status_change(struct usb2_com_softc *sc) { - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) { return; } DPRINTF("\n"); - usb2_com_queue_command(sc, USB_COM_CFG_STATUS_CHANGE); + usb2_com_queue_command(sc, &sc->sc_status_task, 0); } static void -usb2_com_cfg_param(struct usb2_proc_msg *_cc) +usb2_com_cfg_param(void *context, struct usb2_task *task) { - struct usb2_com_command_msg *cc = (void *)_cc; - struct usb2_com_softc *sc; + struct usb2_com_softc *sc = context; struct termios t_copy; - sc = cc->cc_softc; - if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) { return; } @@ -977,7 +818,7 @@ usb2_com_cfg_param(struct usb2_proc_msg (sc->sc_callback->usb2_com_cfg_param) (sc, &t_copy); /* wait a little */ - usb2_com_cfg_sleep(sc, hz / 10); + usb2_pause_mtx(sc->sc_mtx, hz / 10); } static int @@ -987,7 +828,7 @@ usb2_com_param(struct tty *tp, struct te uint8_t opened; int error; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); opened = 0; error = 0; @@ -1032,7 +873,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, USB_COM_CFG_PARAM); + usb2_com_queue_command(sc, &sc->sc_param_task, 0); /* Queue transfer enable command last */ usb2_com_start_transfers(sc); @@ -1053,11 +894,11 @@ done: } static void -usb2_com_start_write(struct tty *tp) +usb2_com_outwakeup(struct tty *tp) { struct usb2_com_softc *sc = tty_softc(tp); - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); DPRINTF("sc = %p\n", sc); @@ -1086,7 +927,7 @@ usb2_com_get_data(struct usb2_com_softc uint32_t cnt; uint32_t offset_orig; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); if ((!(sc->sc_flag & UCOM_FLAG_HL_READY)) || (!(sc->sc_flag & UCOM_FLAG_GP_DATA)) || @@ -1134,7 +975,7 @@ usb2_com_put_data(struct usb2_com_softc char *buf; uint32_t cnt; - mtx_assert(sc->sc_parent_mtx, MA_OWNED); + mtx_assert(sc->sc_mtx, MA_OWNED); if ((!(sc->sc_flag & UCOM_FLAG_HL_READY)) || (!(sc->sc_flag & UCOM_FLAG_GP_DATA))) { @@ -1188,8 +1029,8 @@ usb2_com_free(void *xsc) { struct usb2_com_softc *sc = xsc; - mtx_lock(sc->sc_parent_mtx); + mtx_lock(sc->sc_mtx); sc->sc_ttyfreed = 1; usb2_cv_signal(&sc->sc_cv); - mtx_unlock(sc->sc_parent_mtx); + mtx_unlock(sc->sc_mtx); } Modified: user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.h ============================================================================== --- user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.h Tue Jan 27 01:21:11 2009 (r187750) +++ user/thompsa/usb/sys/dev/usb2/serial/usb2_serial.h Tue Jan 27 01:23:25 2009 (r187751) @@ -82,10 +82,7 @@ struct usb2_com_softc; struct thread; -/* NOTE: Only callbacks with "_cfg_" in its name are called - * from a config thread, and are allowed to sleep! The other - * callbacks are _not_ allowed to sleep! - * +/* * NOTE: There is no guarantee that "usb2_com_cfg_close()" will * be called after "usb2_com_cfg_open()" if the device is detached * while it is open! @@ -119,41 +116,17 @@ 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_process sc_config_td; + struct usb2_process sc_tq; }; 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; struct usb2_com_super_softc *sc_super; struct tty *sc_tty; - struct mtx *sc_parent_mtx; + struct mtx *sc_mtx; void *sc_parent; uint32_t sc_unit; uint32_t sc_local_unit; @@ -170,7 +143,15 @@ 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]; + + struct usb2_task sc_start_task; + struct usb2_task sc_open_task; + struct usb2_task sc_close_task; + struct usb2_task sc_break_task; + struct usb2_task sc_dtr_task; + struct usb2_task sc_rts_task; + struct usb2_task sc_status_task; + struct usb2_task sc_param_task; }; int usb2_com_attach(struct usb2_com_super_softc *ssc, @@ -184,6 +165,5 @@ uint8_t usb2_com_get_data(struct usb2_co void usb2_com_put_data(struct usb2_com_softc *sc, struct usb2_page_cache *pc, uint32_t offset, uint32_t len); uint8_t usb2_com_cfg_sleep(struct usb2_com_softc *sc, uint32_t timeout); -uint8_t usb2_com_cfg_is_gone(struct usb2_com_softc *sc); #endif /* _USB2_SERIAL_H_ */ *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901270123.n0R1NPNc069306>