10Sstevel@tonic-gate# 20Sstevel@tonic-gate# CDDL HEADER START 30Sstevel@tonic-gate# 40Sstevel@tonic-gate# The contents of this file are subject to the terms of the 5*7425SGongtian.Zhao@Sun.COM# Common Development and Distribution License (the "License"). 6*7425SGongtian.Zhao@Sun.COM# You may not use this file except in compliance with the License. 70Sstevel@tonic-gate# 80Sstevel@tonic-gate# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90Sstevel@tonic-gate# or http://www.opensolaris.org/os/licensing. 100Sstevel@tonic-gate# See the License for the specific language governing permissions 110Sstevel@tonic-gate# and limitations under the License. 120Sstevel@tonic-gate# 130Sstevel@tonic-gate# When distributing Covered Code, include this CDDL HEADER in each 140Sstevel@tonic-gate# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150Sstevel@tonic-gate# If applicable, add the following below this CDDL HEADER, with the 160Sstevel@tonic-gate# fields enclosed by brackets "[]" replaced with your own identifying 170Sstevel@tonic-gate# information: Portions Copyright [yyyy] [name of copyright owner] 180Sstevel@tonic-gate# 190Sstevel@tonic-gate# CDDL HEADER END 200Sstevel@tonic-gate# 210Sstevel@tonic-gate/* 22*7425SGongtian.Zhao@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 230Sstevel@tonic-gate * Use is subject to license terms. 240Sstevel@tonic-gate */ 250Sstevel@tonic-gate 260Sstevel@tonic-gate 270Sstevel@tonic-gate USBA PIPE STATE TRANSITIONS INFORMATION 280Sstevel@tonic-gate --------------------------------------- 290Sstevel@tonic-gate 300Sstevel@tonic-gate1. Control pipe state transitions:- 310Sstevel@tonic-gate 320Sstevel@tonic-gate o Default control pipe (endpoint number 0): 330Sstevel@tonic-gate 340Sstevel@tonic-gate NOTE:- Queuing of control requests are allowed at USBA level. 350Sstevel@tonic-gate 360Sstevel@tonic-gate Calls Current state additional condition Action Next state 370Sstevel@tonic-gate ----- ------------- -------------------- ------ ----------- 380Sstevel@tonic-gate usb_pipe_open USB_PIPE_STATE_CLOSED - Initialize pipe USB_PIPE_STATE_IDLE 390Sstevel@tonic-gate 400Sstevel@tonic-gate usb_pipe_ctrl_xfer USB_PIPE_STATE_IDLE No outstanding request send req to hcd USB_PIPE_STATE_ACTIVE 410Sstevel@tonic-gate Outstanding reqs pending queue the requests USB_PIPE_STATE_IDLE 420Sstevel@tonic-gate (cb() will send 430Sstevel@tonic-gate next reqs to hcd) 440Sstevel@tonic-gate 450Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE - queue the requests USB_PIPE_STATE_ACTIVE 460Sstevel@tonic-gate (cb() will send 470Sstevel@tonic-gate next reqs to hcd) 480Sstevel@tonic-gate 490Sstevel@tonic-gate USB_PIPE_STATE_ERROR - queue the requests USB_PIPE_STATE_ERROR 500Sstevel@tonic-gate (cb() will send 510Sstevel@tonic-gate next reqs to hcd) 520Sstevel@tonic-gate 530Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - return failure USB_PIPE_STATE_CLOSING 540Sstevel@tonic-gate 550Sstevel@tonic-gate 560Sstevel@tonic-gate usba_hcdi_cb USB_PIPE_STATE_ACTIVE - Before doing callback USB_PIPE_STATE_IDLE 570Sstevel@tonic-gate (Normal callback) No outstanding request - USB_PIPE_STATE_IDLE 580Sstevel@tonic-gate Outstanding reqs pending Send next req to hcd USB_PIPE_STATE_ACTIVE 590Sstevel@tonic-gate 600Sstevel@tonic-gate 610Sstevel@tonic-gate USB_PIPE_STATE_ERROR - Don't send any more req USB_PIPE_STATE_ERROR 620Sstevel@tonic-gate 630Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - Don't send any more req USB_PIPE_STATE_CLOSING 640Sstevel@tonic-gate 650Sstevel@tonic-gate 660Sstevel@tonic-gate usba_hcdi_cb 670Sstevel@tonic-gate (exceptional callback) USB_PIPE_STATE_ACTIVE - Before auto clear USB_PIPE_STATE_ERROR 680Sstevel@tonic-gate - On auto clear USB_PIPE_STATE_IDLE 690Sstevel@tonic-gate (Don't remove 700Sstevel@tonic-gate outstanding requests) 710Sstevel@tonic-gate No outstanding request - USB_PIPE_STATE_IDLE 720Sstevel@tonic-gate Outstanding reqs pending Send next req to hcd USB_PIPE_STATE_ACTIVE 730Sstevel@tonic-gate 740Sstevel@tonic-gate usb_pipe_reset USB_PIPE_STATE_XXXX - Return failure USB_PIPE_STATE_XXXX 750Sstevel@tonic-gate (Not allowed) 760Sstevel@tonic-gate 770Sstevel@tonic-gate 780Sstevel@tonic-gate usb_pipe_close USB_PIPE_STATE_IDLE - - USB_PIPE_STATE_CLOSING 790Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE 800Sstevel@tonic-gate USB_PIPE_STATE_ERROR 810Sstevel@tonic-gate Once pipe is closed - USB_PIPE_STATE_CLOSED 820Sstevel@tonic-gate 830Sstevel@tonic-gate 840Sstevel@tonic-gate o Normal control pipe (endpoint number > 0): 850Sstevel@tonic-gate 860Sstevel@tonic-gate NOTE:- Queuing of control requests are allowed at USBA level. 870Sstevel@tonic-gate 880Sstevel@tonic-gate Calls Current state additional condition Action Next state 890Sstevel@tonic-gate ----- ------------- -------------------- ------ ----------- 900Sstevel@tonic-gate usb_pipe_open USB_PIPE_STATE_CLOSED - Initialize pipe USB_PIPE_STATE_IDLE 910Sstevel@tonic-gate 920Sstevel@tonic-gate usb_pipe_ctrl_xfer USB_PIPE_STATE_IDLE No outstanding request send req to hcd USB_PIPE_STATE_ACTIVE 930Sstevel@tonic-gate Outstanding reqs pending queue the requests USB_PIPE_STATE_IDLE 940Sstevel@tonic-gate (cb() will send 950Sstevel@tonic-gate next reqs to hcd) 960Sstevel@tonic-gate 970Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE - queue the requests USB_PIPE_STATE_ACTIVE 980Sstevel@tonic-gate (cb() will send 990Sstevel@tonic-gate next reqs to hcd) 1000Sstevel@tonic-gate 1010Sstevel@tonic-gate USB_PIPE_STATE_ERROR - return failure USB_PIPE_STATE_ERROR 1020Sstevel@tonic-gate 1030Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - return failure USB_PIPE_STATE_CLOSING 1040Sstevel@tonic-gate 1050Sstevel@tonic-gate 1060Sstevel@tonic-gate usba_hcdi_cb USB_PIPE_STATE_ACTIVE - Before doing callback USB_PIPE_STATE_IDLE 1070Sstevel@tonic-gate (Normal callback) No outstanding request - USB_PIPE_STATE_IDLE 1080Sstevel@tonic-gate Outstanding reqs pending Send next req to hcd USB_PIPE_STATE_ACTIVE 1090Sstevel@tonic-gate 1100Sstevel@tonic-gate 1110Sstevel@tonic-gate USB_PIPE_STATE_ERROR - Don't send any more req USB_PIPE_STATE_ERROR 1120Sstevel@tonic-gate USB_PIPE_STATE_CLOSING 1130Sstevel@tonic-gate 1140Sstevel@tonic-gate 1150Sstevel@tonic-gate usba_hcdi_cb 1160Sstevel@tonic-gate (exceptional callback) USB_PIPE_STATE_ACTIVE - Before auto clear USB_PIPE_STATE_ERROR 1170Sstevel@tonic-gate - On auto clear USB_PIPE_STATE_IDLE 1180Sstevel@tonic-gate (Remove all outstanding 1190Sstevel@tonic-gate requests) 1200Sstevel@tonic-gate 1210Sstevel@tonic-gate usb_pipe_reset USB_PIPE_STATE_XXXX - Remove all outstanding USB_PIPE_STATE_IDLE 1220Sstevel@tonic-gate requests 1230Sstevel@tonic-gate 1240Sstevel@tonic-gate 1250Sstevel@tonic-gate usb_pipe_close USB_PIPE_STATE_IDLE - - USB_PIPE_STATE_CLOSING 1260Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE 1270Sstevel@tonic-gate USB_PIPE_STATE_ERROR 1280Sstevel@tonic-gate Once pipe is closed - USB_PIPE_STATE_CLOSED 1290Sstevel@tonic-gate 1300Sstevel@tonic-gate2. Bulk pipe state transitions (endpoint number > 1, both IN and OUT):- 1310Sstevel@tonic-gate 1320Sstevel@tonic-gate NOTE:- Queuing of bulk requests are allowed at USBA level. 1330Sstevel@tonic-gate 1340Sstevel@tonic-gate Calls Current state additional condition Action Next state 1350Sstevel@tonic-gate ----- ------------- -------------------- ------ ----------- 1360Sstevel@tonic-gate usb_pipe_open USB_PIPE_STATE_CLOSED - Initialize pipe USB_PIPE_STATE_IDLE 1370Sstevel@tonic-gate 1380Sstevel@tonic-gate usb_pipe_bulk_xfer USB_PIPE_STATE_IDLE No outstanding request send req to hcd USB_PIPE_STATE_ACTIVE 1390Sstevel@tonic-gate 1400Sstevel@tonic-gate 1410Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE - send req to hcd USB_PIPE_STATE_ACTIVE 1420Sstevel@tonic-gate 1430Sstevel@tonic-gate USB_PIPE_STATE_ERROR - return failure USB_PIPE_STATE_ERROR 1440Sstevel@tonic-gate 1450Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - return failure USB_PIPE_STATE_CLOSING 1460Sstevel@tonic-gate 1470Sstevel@tonic-gate usba_hcdi_cb USB_PIPE_STATE_ACTIVE if no requests are pending Before doing callback USB_PIPE_STATE_IDLE 1480Sstevel@tonic-gate else outstanding reqs pending Before doing callback USB_PIPE_STATE_ACTIVE 1490Sstevel@tonic-gate 1500Sstevel@tonic-gate 1510Sstevel@tonic-gate USB_PIPE_STATE_ERROR - - USB_PIPE_STATE_ERROR 1520Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - - USB_PIPE_STATE_CLOSING 1530Sstevel@tonic-gate 1540Sstevel@tonic-gate 1550Sstevel@tonic-gate usba_hcdi_cb 1560Sstevel@tonic-gate (exceptional callback) USB_PIPE_STATE_ACTIVE - Before auto clear USB_PIPE_STATE_ERROR 1570Sstevel@tonic-gate - On auto clear USB_PIPE_STATE_IDLE 1580Sstevel@tonic-gate (Remove all outstanding 1590Sstevel@tonic-gate requests) 1600Sstevel@tonic-gate 1610Sstevel@tonic-gate usb_pipe_reset USB_PIPE_STATE_XXXX - Remove all outstanding USB_PIPE_STATE_IDLE 1620Sstevel@tonic-gate requests 1630Sstevel@tonic-gate 1640Sstevel@tonic-gate 1650Sstevel@tonic-gate usb_pipe_close USB_PIPE_STATE_IDLE - - USB_PIPE_STATE_CLOSING 1660Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE 1670Sstevel@tonic-gate USB_PIPE_STATE_ERROR 1680Sstevel@tonic-gate Once pipe is closed - USB_PIPE_STATE_CLOSED 1690Sstevel@tonic-gate 1700Sstevel@tonic-gate3. Interrupt pipe state transitions (endpoint number > 1, both IN and OUT) :- 1710Sstevel@tonic-gate 1720Sstevel@tonic-gate Interrupt IN: 1730Sstevel@tonic-gate 1740Sstevel@tonic-gate Calls Current state additional condition Action Next state 1750Sstevel@tonic-gate ----- ------------- -------------------- ------ ----------- 1760Sstevel@tonic-gate usb_pipe_open USB_PIPE_STATE_CLOSED - Initialize pipe USB_PIPE_STATE_IDLE 1770Sstevel@tonic-gate 1780Sstevel@tonic-gate usb_pipe_intr_xfer USB_PIPE_STATE_IDLE - send req to hcd USB_PIPE_STATE_ACTIVE 1790Sstevel@tonic-gate 1800Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE - return failure USB_PIPE_STATE_ACTIVE 1810Sstevel@tonic-gate USB_PIPE_STATE_ERROR 1820Sstevel@tonic-gate USB_PIPE_STATE_CLOSING 1830Sstevel@tonic-gate 1840Sstevel@tonic-gate usba_hcdi_cb USB_PIPE_STATE_ACTIVE One time xfer Before doing callback USB_PIPE_STATE_IDLE 1850Sstevel@tonic-gate USB_CR_STOPPED_POLLING 1860Sstevel@tonic-gate USB_CR_PIPE_RESET 1870Sstevel@tonic-gate 1880Sstevel@tonic-gate USB_PIPE_STATE_ERROR - - USB_PIPE_STATE_ERROR 1890Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - - USB_PIPE_STATE_CLOSING 1900Sstevel@tonic-gate 1910Sstevel@tonic-gate 1920Sstevel@tonic-gate usba_hcdi_cb 1930Sstevel@tonic-gate (exceptional callback) USB_PIPE_STATE_ACTIVE - Before auto clear USB_PIPE_STATE_ERROR 1940Sstevel@tonic-gate - On auto clear USB_PIPE_STATE_IDLE 1950Sstevel@tonic-gate (Remove all outstanding 1960Sstevel@tonic-gate requests) 1970Sstevel@tonic-gate 1980Sstevel@tonic-gate usb_pipe_reset USB_PIPE_STATE_XXXX - Remove all outstanding USB_PIPE_STATE_IDLE 1990Sstevel@tonic-gate requests 2000Sstevel@tonic-gate 2010Sstevel@tonic-gate 2020Sstevel@tonic-gate usb_pipe_close USB_PIPE_STATE_IDLE - - USB_PIPE_STATE_CLOSING 2030Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE 2040Sstevel@tonic-gate USB_PIPE_STATE_ERROR 2050Sstevel@tonic-gate Once pipe is closed - USB_PIPE_STATE_CLOSED 2060Sstevel@tonic-gate 2070Sstevel@tonic-gate Interrupt OUT: 2080Sstevel@tonic-gate 2090Sstevel@tonic-gate NOTE: Send all interrupt OUT requests to HCD and no queuing at USBA level. 2100Sstevel@tonic-gate 2110Sstevel@tonic-gate Calls Current state additional condition Action Next state 2120Sstevel@tonic-gate ----- ------------- -------------------- ------ ----------- 2130Sstevel@tonic-gate usb_pipe_open USB_PIPE_STATE_CLOSED - Initialize pipe USB_PIPE_STATE_IDLE 2140Sstevel@tonic-gate 2150Sstevel@tonic-gate usb_pipe_intr_xfer USB_PIPE_STATE_IDLE - send req to hcd USB_PIPE_STATE_ACTIVE 2160Sstevel@tonic-gate 2170Sstevel@tonic-gate 2180Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE - send req to hcd USB_PIPE_STATE_ACTIVE 2190Sstevel@tonic-gate 2200Sstevel@tonic-gate USB_PIPE_STATE_ERROR - return failure USB_PIPE_STATE_ERROR 2210Sstevel@tonic-gate 2220Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - return failure USB_PIPE_STATE_CLOSING 2230Sstevel@tonic-gate 2240Sstevel@tonic-gate usba_hcdi_cb USB_PIPE_STATE_ACTIVE if no requests are pending Before doing callback USB_PIPE_STATE_IDLE 2250Sstevel@tonic-gate else outstanding reqs pending Before doing callback USB_PIPE_STATE_ACTIVE 2260Sstevel@tonic-gate 2270Sstevel@tonic-gate 2280Sstevel@tonic-gate USB_PIPE_STATE_ERROR - - USB_PIPE_STATE_ERROR 2290Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - - USB_PIPE_STATE_CLOSING 2300Sstevel@tonic-gate 2310Sstevel@tonic-gate 2320Sstevel@tonic-gate usba_hcdi_cb 2330Sstevel@tonic-gate (exceptional callback) USB_PIPE_STATE_ACTIVE - Before auto clear USB_PIPE_STATE_ERROR 2340Sstevel@tonic-gate - On auto clear USB_PIPE_STATE_IDLE 2350Sstevel@tonic-gate (Remove all outstanding 2360Sstevel@tonic-gate requests) 2370Sstevel@tonic-gate 2380Sstevel@tonic-gate usb_pipe_reset USB_PIPE_STATE_XXXX - Remove all outstanding USB_PIPE_STATE_IDLE 2390Sstevel@tonic-gate requests 2400Sstevel@tonic-gate 2410Sstevel@tonic-gate 2420Sstevel@tonic-gate usb_pipe_close USB_PIPE_STATE_IDLE - - USB_PIPE_STATE_CLOSING 2430Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE 2440Sstevel@tonic-gate USB_PIPE_STATE_ERROR 2450Sstevel@tonic-gate Once pipe is closed - USB_PIPE_STATE_CLOSED 2460Sstevel@tonic-gate 2470Sstevel@tonic-gate4. Isochronous pipe state transitions (endpoint number > 1, both IN and OUT):- 2480Sstevel@tonic-gate 2490Sstevel@tonic-gate Isochronous IN: 2500Sstevel@tonic-gate 2510Sstevel@tonic-gate Calls Current state additional condition Action Next state 2520Sstevel@tonic-gate ----- ------------- -------------------- ------ ----------- 2530Sstevel@tonic-gate usb_pipe_open USB_PIPE_STATE_CLOSED - Initialize pipe USB_PIPE_STATE_IDLE 2540Sstevel@tonic-gate 2550Sstevel@tonic-gate usb_pipe_isoch_xfer USB_PIPE_STATE_IDLE - send req to hcd USB_PIPE_STATE_ACTIVE 2560Sstevel@tonic-gate 2570Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE - return failure USB_PIPE_STATE_ACTIVE 2580Sstevel@tonic-gate USB_PIPE_STATE_ERROR 2590Sstevel@tonic-gate USB_PIPE_STATE_CLOSING 2600Sstevel@tonic-gate 2610Sstevel@tonic-gate usba_hcdi_cb USB_PIPE_STATE_ACTIVE One time xfer Before doing callback USB_PIPE_STATE_IDLE 2620Sstevel@tonic-gate USB_CR_STOPPED_POLLING 2630Sstevel@tonic-gate USB_CR_PIPE_RESET 2640Sstevel@tonic-gate 2650Sstevel@tonic-gate USB_PIPE_STATE_ERROR - - USB_PIPE_STATE_ERROR 2660Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - - USB_PIPE_STATE_CLOSING 2670Sstevel@tonic-gate 2680Sstevel@tonic-gate 2690Sstevel@tonic-gate usba_hcdi_cb 2700Sstevel@tonic-gate (exceptional callback) USB_PIPE_STATE_ACTIVE - Before auto clear USB_PIPE_STATE_ERROR 2710Sstevel@tonic-gate - On auto clear USB_PIPE_STATE_IDLE 2720Sstevel@tonic-gate (Remove all outstanding 2730Sstevel@tonic-gate requests) 2740Sstevel@tonic-gate 2750Sstevel@tonic-gate usb_pipe_reset USB_PIPE_STATE_XXXX - Remove all outstanding USB_PIPE_STATE_IDLE 2760Sstevel@tonic-gate requests 2770Sstevel@tonic-gate 2780Sstevel@tonic-gate 2790Sstevel@tonic-gate usb_pipe_close USB_PIPE_STATE_IDLE - - USB_PIPE_STATE_CLOSING 2800Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE 2810Sstevel@tonic-gate USB_PIPE_STATE_ERROR 2820Sstevel@tonic-gate Once pipe is closed - USB_PIPE_STATE_CLOSED 2830Sstevel@tonic-gate 2840Sstevel@tonic-gate Isochronous OUT:- 2850Sstevel@tonic-gate 2860Sstevel@tonic-gate NOTE: Send all isochronous OUT requests to HCD and no queuing at USBA level. 2870Sstevel@tonic-gate 2880Sstevel@tonic-gate Calls Current state additional condition Action Next state 2890Sstevel@tonic-gate ----- ------------- -------------------- ------ ----------- 2900Sstevel@tonic-gate usb_pipe_open USB_PIPE_STATE_CLOSED - Initialize pipe USB_PIPE_STATE_IDLE 2910Sstevel@tonic-gate 2920Sstevel@tonic-gate usb_pipe_intr_xfer USB_PIPE_STATE_IDLE - send req to hcd USB_PIPE_STATE_ACTIVE 2930Sstevel@tonic-gate 2940Sstevel@tonic-gate 2950Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE - send req to hcd USB_PIPE_STATE_ACTIVE 2960Sstevel@tonic-gate 2970Sstevel@tonic-gate USB_PIPE_STATE_ERROR - return failure USB_PIPE_STATE_ERROR 2980Sstevel@tonic-gate 2990Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - return failure USB_PIPE_STATE_CLOSING 3000Sstevel@tonic-gate 3010Sstevel@tonic-gate usba_hcdi_cb USB_PIPE_STATE_ACTIVE if no requests are pending Before doing callback USB_PIPE_STATE_IDLE 3020Sstevel@tonic-gate else outstanding reqs pending Before doing callback USB_PIPE_STATE_ACTIVE 3030Sstevel@tonic-gate 3040Sstevel@tonic-gate 3050Sstevel@tonic-gate USB_PIPE_STATE_ERROR - - USB_PIPE_STATE_ERROR 3060Sstevel@tonic-gate USB_PIPE_STATE_CLOSING - - USB_PIPE_STATE_CLOSING 3070Sstevel@tonic-gate 3080Sstevel@tonic-gate 3090Sstevel@tonic-gate usba_hcdi_cb 3100Sstevel@tonic-gate (exceptional callback) USB_PIPE_STATE_ACTIVE - Before auto clear USB_PIPE_STATE_ERROR 3110Sstevel@tonic-gate - On auto clear USB_PIPE_STATE_IDLE 3120Sstevel@tonic-gate (Remove all outstanding 3130Sstevel@tonic-gate requests) 3140Sstevel@tonic-gate 3150Sstevel@tonic-gate usb_pipe_reset USB_PIPE_STATE_XXXX - Remove all outstanding USB_PIPE_STATE_IDLE 3160Sstevel@tonic-gate requests 3170Sstevel@tonic-gate 3180Sstevel@tonic-gate 3190Sstevel@tonic-gate usb_pipe_close USB_PIPE_STATE_IDLE - - USB_PIPE_STATE_CLOSING 3200Sstevel@tonic-gate USB_PIPE_STATE_ACTIVE 3210Sstevel@tonic-gate USB_PIPE_STATE_ERROR 3220Sstevel@tonic-gate Once pipe is closed - USB_PIPE_STATE_CLOSED 3230Sstevel@tonic-gate 324