xref: /linux/drivers/usb/serial/io_ionsp.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1*788a4ee6SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0+ */
21da177e4SLinus Torvalds /************************************************************************
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  *	IONSP.H		Definitions for I/O Networks Serial Protocol
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  *	Copyright (C) 1997-1998 Inside Out Networks, Inc.
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  *	These definitions are used by both kernel-mode driver and the
91da177e4SLinus Torvalds  *	peripheral firmware and MUST be kept in sync.
101da177e4SLinus Torvalds  *
111da177e4SLinus Torvalds  ************************************************************************/
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds /************************************************************************
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds The data to and from all ports on the peripheral is multiplexed
161da177e4SLinus Torvalds through a single endpoint pair (EP1 since it supports 64-byte
171da177e4SLinus Torvalds MaxPacketSize). Therefore, the data, commands, and status for
181da177e4SLinus Torvalds each port must be preceded by a short header identifying the
191da177e4SLinus Torvalds destination port. The header also identifies the bytes that follow
201da177e4SLinus Torvalds as data or as command/status info.
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds Header format, first byte:
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds     CLLLLPPP
251da177e4SLinus Torvalds     --------
261da177e4SLinus Torvalds     | |	 |------ Port Number:	0-7
271da177e4SLinus Torvalds     | |--------- Length:	MSB bits of length
281da177e4SLinus Torvalds     |----------- Data/Command:	0 = Data header
291da177e4SLinus Torvalds 				1 = Cmd / Status (Cmd if OUT, Status if IN)
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds This gives 2 possible formats:
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds     Data header:		0LLLLPPP	LLLLLLLL
351da177e4SLinus Torvalds     ============
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds     Where (LLLL,LLLLLLL) is 12-bit length of data that follows for
381da177e4SLinus Torvalds     port number (PPP). The length is 0-based (0-FFF means 0-4095
391da177e4SLinus Torvalds     bytes). The ~4K limit allows the host driver (which deals in
401da177e4SLinus Torvalds     transfer requests instead of individual packets) to write a
411da177e4SLinus Torvalds     large chunk of data in a single request. Note, however, that
421da177e4SLinus Torvalds     the length must always be <= the current TxCredits for a given
431da177e4SLinus Torvalds     port due to buffering limitations on the peripheral.
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds     Cmd/Status header:		1ccccPPP	[ CCCCCCCC,	 Params ]...
471da177e4SLinus Torvalds     ==================
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds     Where (cccc) or (cccc,CCCCCCCC) is the cmd or status identifier.
501da177e4SLinus Torvalds     Frequently-used values are encoded as (cccc), longer ones using
511da177e4SLinus Torvalds     (cccc,CCCCCCCC). Subsequent bytes are optional parameters and are
521da177e4SLinus Torvalds     specific to the cmd or status code. This may include a length
531da177e4SLinus Torvalds     for command and status codes that need variable-length parameters.
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds In addition, we use another interrupt pipe (endpoint) which the host polls
571da177e4SLinus Torvalds periodically for flow control information. The peripheral, when there has
581da177e4SLinus Torvalds been a change, sends the following 10-byte packet:
591da177e4SLinus Torvalds 
601da177e4SLinus Torvalds 	RRRRRRRRRRRRRRRR
611da177e4SLinus Torvalds 	T0T0T0T0T0T0T0T0
621da177e4SLinus Torvalds 	T1T1T1T1T1T1T1T1
631da177e4SLinus Torvalds 	T2T2T2T2T2T2T2T2
641da177e4SLinus Torvalds 	T3T3T3T3T3T3T3T3
651da177e4SLinus Torvalds 
661da177e4SLinus Torvalds The first field is the 16-bit RxBytesAvail field, which indicates the
671da177e4SLinus Torvalds number of bytes which may be read by the host from EP1. This is necessary:
681da177e4SLinus Torvalds (a) because OSR2.1 has a bug which causes data loss if the peripheral returns
691da177e4SLinus Torvalds fewer bytes than the host expects to read, and (b) because, on Microsoft
701da177e4SLinus Torvalds platforms at least, an outstanding read posted on EP1 consumes about 35% of
711da177e4SLinus Torvalds the CPU just polling the device for data.
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds The next 4 fields are the 16-bit TxCredits for each port, which indicate how
741da177e4SLinus Torvalds many bytes the host is allowed to send on EP1 for transmit to a given port.
751da177e4SLinus Torvalds After an OPEN_PORT command, the Edgeport sends the initial TxCredits for that
761da177e4SLinus Torvalds port.
771da177e4SLinus Torvalds 
781da177e4SLinus Torvalds All 16-bit fields are sent in little-endian (Intel) format.
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds ************************************************************************/
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds //
831da177e4SLinus Torvalds // Define format of InterruptStatus packet returned from the
841da177e4SLinus Torvalds // Interrupt pipe
851da177e4SLinus Torvalds //
861da177e4SLinus Torvalds 
871da177e4SLinus Torvalds struct int_status_pkt {
881da177e4SLinus Torvalds 	__u16 RxBytesAvail;			// Additional bytes available to
891da177e4SLinus Torvalds 						// be read from Bulk IN pipe
901da177e4SLinus Torvalds 	__u16 TxCredits[MAX_RS232_PORTS];	// Additional space available in
911da177e4SLinus Torvalds 						// given port's TxBuffer
921da177e4SLinus Torvalds };
931da177e4SLinus Torvalds 
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds #define GET_INT_STATUS_SIZE(NumPorts) (sizeof(__u16) + (sizeof(__u16) * (NumPorts)))
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds 
991da177e4SLinus Torvalds //
1001da177e4SLinus Torvalds // Define cmd/status header values and macros to extract them.
1011da177e4SLinus Torvalds //
1021da177e4SLinus Torvalds //	Data:		0LLLLPPP LLLLLLLL
1031da177e4SLinus Torvalds //	Cmd/Stat:	1ccccPPP CCCCCCCC
1041da177e4SLinus Torvalds 
1051da177e4SLinus Torvalds #define	IOSP_DATA_HDR_SIZE		2
1061da177e4SLinus Torvalds #define	IOSP_CMD_HDR_SIZE		2
1071da177e4SLinus Torvalds 
1081da177e4SLinus Torvalds #define	IOSP_MAX_DATA_LENGTH		0x0FFF		// 12 bits -> 4K
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds #define	IOSP_PORT_MASK			0x07		// Mask to isolate port number
1111da177e4SLinus Torvalds #define	IOSP_CMD_STAT_BIT		0x80		// If set, this is command/status header
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds #define IS_CMD_STAT_HDR(Byte1)		((Byte1) & IOSP_CMD_STAT_BIT)
1141da177e4SLinus Torvalds #define IS_DATA_HDR(Byte1)		(!IS_CMD_STAT_HDR(Byte1))
1151da177e4SLinus Torvalds 
1161da177e4SLinus Torvalds #define	IOSP_GET_HDR_PORT(Byte1)		((__u8) ((Byte1) & IOSP_PORT_MASK))
1171da177e4SLinus Torvalds #define	IOSP_GET_HDR_DATA_LEN(Byte1, Byte2)	((__u16) (((__u16)((Byte1) & 0x78)) << 5) | (Byte2))
1181da177e4SLinus Torvalds #define	IOSP_GET_STATUS_CODE(Byte1)		((__u8) (((Byte1) &  0x78) >> 3))
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds 
1211da177e4SLinus Torvalds //
1221da177e4SLinus Torvalds // These macros build the 1st and 2nd bytes for a data header
1231da177e4SLinus Torvalds //
1241da177e4SLinus Torvalds #define	IOSP_BUILD_DATA_HDR1(Port, Len)		((__u8) (((Port) | ((__u8) (((__u16) (Len)) >> 5) & 0x78))))
1251da177e4SLinus Torvalds #define	IOSP_BUILD_DATA_HDR2(Port, Len)		((__u8) (Len))
1261da177e4SLinus Torvalds 
1271da177e4SLinus Torvalds 
1281da177e4SLinus Torvalds //
1291da177e4SLinus Torvalds // These macros build the 1st and 2nd bytes for a command header
1301da177e4SLinus Torvalds //
1311da177e4SLinus Torvalds #define	IOSP_BUILD_CMD_HDR1(Port, Cmd)		((__u8) (IOSP_CMD_STAT_BIT | (Port) | ((__u8) ((Cmd) << 3))))
1321da177e4SLinus Torvalds 
1331da177e4SLinus Torvalds 
1341da177e4SLinus Torvalds //--------------------------------------------------------------
1351da177e4SLinus Torvalds //
1361da177e4SLinus Torvalds //	Define values for commands and command parameters
1371da177e4SLinus Torvalds //	(sent from Host to Edgeport)
1381da177e4SLinus Torvalds //
1391da177e4SLinus Torvalds //	1ccccPPP P1P1P1P1 [ P2P2P2P2P2 ]...
1401da177e4SLinus Torvalds //
1411da177e4SLinus Torvalds //	cccc:	00-07	2-byte commands. Write UART register 0-7 with
1421da177e4SLinus Torvalds //					value in P1. See 16650.H for definitions of
1431da177e4SLinus Torvalds //					UART register numbers and contents.
1441da177e4SLinus Torvalds //
1451da177e4SLinus Torvalds //		08-0B	3-byte commands:					==== P1 ====	==== P2 ====
1461da177e4SLinus Torvalds //					08	available for expansion
1471da177e4SLinus Torvalds //					09	1-param commands		Command Code	Param
1481da177e4SLinus Torvalds //					0A	available for expansion
1491da177e4SLinus Torvalds //					0B	available for expansion
1501da177e4SLinus Torvalds //
1511da177e4SLinus Torvalds //		0C-0D	4-byte commands.	P1 = extended cmd and P2,P3 = params
1521da177e4SLinus Torvalds //						Currently unimplemented.
1531da177e4SLinus Torvalds //
1541da177e4SLinus Torvalds //		0E-0F	N-byte commands:	P1 = num bytes after P1 (ie, TotalLen - 2)
1551da177e4SLinus Torvalds //						P2 = extended cmd, P3..Pn = parameters.
1561da177e4SLinus Torvalds //						Currently unimplemented.
1571da177e4SLinus Torvalds //
1581da177e4SLinus Torvalds 
1591da177e4SLinus Torvalds #define	IOSP_WRITE_UART_REG(n)	((n) & 0x07)	// UartReg[ n ] := P1
1601da177e4SLinus Torvalds 
1611da177e4SLinus Torvalds // Register numbers and contents
1621da177e4SLinus Torvalds // defined in 16554.H.
1631da177e4SLinus Torvalds 
1641da177e4SLinus Torvalds //					0x08		// Available for expansion.
1651da177e4SLinus Torvalds #define	IOSP_EXT_CMD			0x09		// P1 = Command code (defined below)
1661da177e4SLinus Torvalds 
1671da177e4SLinus Torvalds // P2 = Parameter
1681da177e4SLinus Torvalds 
1691da177e4SLinus Torvalds //
1701da177e4SLinus Torvalds // Extended Command values, used with IOSP_EXT_CMD, may
1711da177e4SLinus Torvalds // or may not use parameter P2.
1721da177e4SLinus Torvalds //
1731da177e4SLinus Torvalds 
1741da177e4SLinus Torvalds #define	IOSP_CMD_OPEN_PORT		0x00		// Enable ints, init UART. (NO PARAM)
1751da177e4SLinus Torvalds #define	IOSP_CMD_CLOSE_PORT		0x01		// Disable ints, flush buffers. (NO PARAM)
1761da177e4SLinus Torvalds #define	IOSP_CMD_CHASE_PORT		0x02		// Wait for Edgeport TX buffers to empty. (NO PARAM)
1771da177e4SLinus Torvalds #define IOSP_CMD_SET_RX_FLOW		0x03		// Set Rx Flow Control in Edgeport
1781da177e4SLinus Torvalds #define IOSP_CMD_SET_TX_FLOW		0x04		// Set Tx Flow Control in Edgeport
1791da177e4SLinus Torvalds #define IOSP_CMD_SET_XON_CHAR		0x05		// Set XON Character in Edgeport
1801da177e4SLinus Torvalds #define IOSP_CMD_SET_XOFF_CHAR		0x06		// Set XOFF Character in Edgeport
1811da177e4SLinus Torvalds #define IOSP_CMD_RX_CHECK_REQ		0x07		// Request Edgeport to insert a Checkpoint into
1821da177e4SLinus Torvalds 
1831da177e4SLinus Torvalds // the receive data stream (Parameter = 1 byte sequence number)
1841da177e4SLinus Torvalds 
1851da177e4SLinus Torvalds #define IOSP_CMD_SET_BREAK		0x08		// Turn on the BREAK (LCR bit 6)
1861da177e4SLinus Torvalds #define IOSP_CMD_CLEAR_BREAK		0x09		// Turn off the BREAK (LCR bit 6)
1871da177e4SLinus Torvalds 
1881da177e4SLinus Torvalds 
1891da177e4SLinus Torvalds //
1901da177e4SLinus Torvalds // Define macros to simplify building of IOSP cmds
1911da177e4SLinus Torvalds //
1921da177e4SLinus Torvalds 
1931da177e4SLinus Torvalds #define MAKE_CMD_WRITE_REG(ppBuf, pLen, Port, Reg, Val)			\
1941da177e4SLinus Torvalds do {									\
195a3204711SGreg Kroah-Hartman 	(*(ppBuf))[0] = IOSP_BUILD_CMD_HDR1((Port),			\
196a3204711SGreg Kroah-Hartman 					    IOSP_WRITE_UART_REG(Reg));	\
1971da177e4SLinus Torvalds 	(*(ppBuf))[1] = (Val);						\
1981da177e4SLinus Torvalds 									\
1991da177e4SLinus Torvalds 	*ppBuf += 2;							\
2001da177e4SLinus Torvalds 	*pLen  += 2;							\
2011da177e4SLinus Torvalds } while (0)
2021da177e4SLinus Torvalds 
2031da177e4SLinus Torvalds #define MAKE_CMD_EXT_CMD(ppBuf, pLen, Port, ExtCmd, Param)		\
2041da177e4SLinus Torvalds do {									\
2051da177e4SLinus Torvalds 	(*(ppBuf))[0] = IOSP_BUILD_CMD_HDR1((Port), IOSP_EXT_CMD);	\
2061da177e4SLinus Torvalds 	(*(ppBuf))[1] = (ExtCmd);					\
2071da177e4SLinus Torvalds 	(*(ppBuf))[2] = (Param);					\
2081da177e4SLinus Torvalds 									\
2091da177e4SLinus Torvalds 	*ppBuf += 3;							\
2101da177e4SLinus Torvalds 	*pLen  += 3;							\
2111da177e4SLinus Torvalds } while (0)
2121da177e4SLinus Torvalds 
2131da177e4SLinus Torvalds 
2141da177e4SLinus Torvalds 
2151da177e4SLinus Torvalds //--------------------------------------------------------------
2161da177e4SLinus Torvalds //
2171da177e4SLinus Torvalds //	Define format of flow control commands
2181da177e4SLinus Torvalds //	(sent from Host to Edgeport)
2191da177e4SLinus Torvalds //
2201da177e4SLinus Torvalds //	11001PPP FlowCmd FlowTypes
2211da177e4SLinus Torvalds //
2221da177e4SLinus Torvalds //	Note that the 'FlowTypes' parameter is a bit mask; that is,
2231da177e4SLinus Torvalds //	more than one flow control type can be active at the same time.
2241da177e4SLinus Torvalds //	FlowTypes = 0 means 'no flow control'.
2251da177e4SLinus Torvalds //
2261da177e4SLinus Torvalds 
2271da177e4SLinus Torvalds //
2281da177e4SLinus Torvalds //	IOSP_CMD_SET_RX_FLOW
2291da177e4SLinus Torvalds //
2301da177e4SLinus Torvalds //	Tells Edgeport how it can stop incoming UART data
2311da177e4SLinus Torvalds //
2321da177e4SLinus Torvalds //  Example for Port 0
2331da177e4SLinus Torvalds //	P0 = 11001000
2341da177e4SLinus Torvalds //  P1 = IOSP_CMD_SET_RX_FLOW
2351da177e4SLinus Torvalds //  P2 = Bit mask as follows:
2361da177e4SLinus Torvalds 
2371da177e4SLinus Torvalds #define IOSP_RX_FLOW_RTS		0x01	// Edgeport drops RTS to stop incoming data
2381da177e4SLinus Torvalds #define IOSP_RX_FLOW_DTR		0x02	// Edgeport drops DTR to stop incoming data
2391da177e4SLinus Torvalds #define IOSP_RX_FLOW_DSR_SENSITIVITY	0x04	// Ignores Rx data unless DSR high
2401da177e4SLinus Torvalds 
2411da177e4SLinus Torvalds // Not currently implemented by firmware.
2421da177e4SLinus Torvalds #define IOSP_RX_FLOW_XON_XOFF		0x08	// Edgeport sends XOFF char to stop incoming data.
2431da177e4SLinus Torvalds 
2441da177e4SLinus Torvalds // Host must have previously programmed the
2451da177e4SLinus Torvalds // XON/XOFF values with SET_XON/SET_XOFF
2461da177e4SLinus Torvalds // before enabling this bit.
2471da177e4SLinus Torvalds 
2481da177e4SLinus Torvalds //
2491da177e4SLinus Torvalds //	IOSP_CMD_SET_TX_FLOW
2501da177e4SLinus Torvalds //
2511da177e4SLinus Torvalds //	Tells Edgeport what signal(s) will stop it from transmitting UART data
2521da177e4SLinus Torvalds //
2531da177e4SLinus Torvalds //  Example for Port 0
2541da177e4SLinus Torvalds //	P0 = 11001000
2551da177e4SLinus Torvalds //  P1 = IOSP_CMD_SET_TX_FLOW
2561da177e4SLinus Torvalds //  P2 = Bit mask as follows:
2571da177e4SLinus Torvalds 
2581da177e4SLinus Torvalds #define IOSP_TX_FLOW_CTS		0x01	// Edgeport stops Tx if CTS low
2591da177e4SLinus Torvalds #define IOSP_TX_FLOW_DSR		0x02	// Edgeport stops Tx if DSR low
2601da177e4SLinus Torvalds #define IOSP_TX_FLOW_DCD		0x04	// Edgeport stops Tx if DCD low
2611da177e4SLinus Torvalds #define IOSP_TX_FLOW_XON_XOFF		0x08	// Edgeport stops Tx upon receiving XOFF char.
2621da177e4SLinus Torvalds 
2631da177e4SLinus Torvalds // Host must have previously programmed the
2641da177e4SLinus Torvalds // XON/XOFF values with SET_XON/SET_XOFF
2651da177e4SLinus Torvalds // before enabling this bit.
2661da177e4SLinus Torvalds #define IOSP_TX_FLOW_XOFF_CONTINUE	0x10	// If not set, Edgeport stops Tx when
2671da177e4SLinus Torvalds 
2681da177e4SLinus Torvalds // sending XOFF in order to fix broken
2691da177e4SLinus Torvalds // systems that interpret the next
2701da177e4SLinus Torvalds // received char as XON.
2711da177e4SLinus Torvalds // If set, Edgeport continues Tx
2721da177e4SLinus Torvalds // normally after transmitting XOFF.
2731da177e4SLinus Torvalds // Not currently implemented by firmware.
2741da177e4SLinus Torvalds #define IOSP_TX_TOGGLE_RTS		0x20	// Edgeport drives RTS as a true half-duplex
2751da177e4SLinus Torvalds 
2761da177e4SLinus Torvalds // Request-to-Send signal: it is raised before
2771da177e4SLinus Torvalds // beginning transmission and lowered after
2781da177e4SLinus Torvalds // the last Tx char leaves the UART.
2791da177e4SLinus Torvalds // Not currently implemented by firmware.
2801da177e4SLinus Torvalds 
2811da177e4SLinus Torvalds //
2821da177e4SLinus Torvalds //	IOSP_CMD_SET_XON_CHAR
2831da177e4SLinus Torvalds //
2841da177e4SLinus Torvalds //	Sets the character which Edgeport transmits/interprets as XON.
2851da177e4SLinus Torvalds //	Note: This command MUST be sent before sending a SET_RX_FLOW or
2861da177e4SLinus Torvalds //	SET_TX_FLOW with the XON_XOFF bit set.
2871da177e4SLinus Torvalds //
2881da177e4SLinus Torvalds //  Example for Port 0
2891da177e4SLinus Torvalds //	P0 = 11001000
2901da177e4SLinus Torvalds //  P1 = IOSP_CMD_SET_XON_CHAR
2911da177e4SLinus Torvalds //  P2 = 0x11
2921da177e4SLinus Torvalds 
2931da177e4SLinus Torvalds 
2941da177e4SLinus Torvalds //
2951da177e4SLinus Torvalds //	IOSP_CMD_SET_XOFF_CHAR
2961da177e4SLinus Torvalds //
2971da177e4SLinus Torvalds //	Sets the character which Edgeport transmits/interprets as XOFF.
2981da177e4SLinus Torvalds //	Note: This command must be sent before sending a SET_RX_FLOW or
2991da177e4SLinus Torvalds //	SET_TX_FLOW with the XON_XOFF bit set.
3001da177e4SLinus Torvalds //
3011da177e4SLinus Torvalds //  Example for Port 0
3021da177e4SLinus Torvalds //	P0 = 11001000
3031da177e4SLinus Torvalds //  P1 = IOSP_CMD_SET_XOFF_CHAR
3041da177e4SLinus Torvalds //  P2 = 0x13
3051da177e4SLinus Torvalds 
3061da177e4SLinus Torvalds 
3071da177e4SLinus Torvalds //
3081da177e4SLinus Torvalds //	IOSP_CMD_RX_CHECK_REQ
3091da177e4SLinus Torvalds //
3101da177e4SLinus Torvalds //  This command is used to assist in the implementation of the
3111da177e4SLinus Torvalds //  IOCTL_SERIAL_PURGE Windows IOCTL.
3121da177e4SLinus Torvalds //  This IOSP command tries to place a marker at the end of the RX
3131da177e4SLinus Torvalds //  queue in the Edgeport. If the Edgeport RX queue is full then
3141da177e4SLinus Torvalds //  the Check will be discarded.
3151da177e4SLinus Torvalds //  It is up to the device driver to timeout waiting for the
3161da177e4SLinus Torvalds //  RX_CHECK_RSP.  If a RX_CHECK_RSP is received, the driver is
3171da177e4SLinus Torvalds //	sure that all data has been received from the edgeport and
3181da177e4SLinus Torvalds //	may now purge any internal RX buffers.
3191da177e4SLinus Torvalds //  Note tat the sequence numbers may be used to detect lost
3201da177e4SLinus Torvalds //  CHECK_REQs.
3211da177e4SLinus Torvalds 
3221da177e4SLinus Torvalds //  Example for Port 0
3231da177e4SLinus Torvalds //	P0 = 11001000
3241da177e4SLinus Torvalds //  P1 = IOSP_CMD_RX_CHECK_REQ
3251da177e4SLinus Torvalds //  P2 = Sequence number
3261da177e4SLinus Torvalds 
3271da177e4SLinus Torvalds 
3281da177e4SLinus Torvalds //  Response will be:
3291da177e4SLinus Torvalds //  P1 = IOSP_EXT_RX_CHECK_RSP
3301da177e4SLinus Torvalds //  P2 = Request Sequence number
3311da177e4SLinus Torvalds 
3321da177e4SLinus Torvalds 
3331da177e4SLinus Torvalds 
3341da177e4SLinus Torvalds //--------------------------------------------------------------
3351da177e4SLinus Torvalds //
3361da177e4SLinus Torvalds //	Define values for status and status parameters
3371da177e4SLinus Torvalds //	(received by Host from Edgeport)
3381da177e4SLinus Torvalds //
3391da177e4SLinus Torvalds //	1ssssPPP P1P1P1P1 [ P2P2P2P2P2 ]...
3401da177e4SLinus Torvalds //
3411da177e4SLinus Torvalds //	ssss:	00-07	2-byte status.	ssss identifies which UART register
3421da177e4SLinus Torvalds //					has changed value, and the new value is in P1.
3431da177e4SLinus Torvalds //					Note that the ssss values do not correspond to the
3441da177e4SLinus Torvalds //					16554 register numbers given in 16554.H. Instead,
3451da177e4SLinus Torvalds //					see below for definitions of the ssss numbers
3461da177e4SLinus Torvalds //					used in this status message.
3471da177e4SLinus Torvalds //
3481da177e4SLinus Torvalds //		08-0B	3-byte status:					==== P1 ====	==== P2 ====
3491da177e4SLinus Torvalds //					08	LSR_DATA:		New LSR		Errored byte
3501da177e4SLinus Torvalds //					09	1-param responses	Response Code	Param
3511da177e4SLinus Torvalds //					0A	OPEN_RSP:		InitialMsr	TxBufferSize
3521da177e4SLinus Torvalds //					0B	available for expansion
3531da177e4SLinus Torvalds //
3541da177e4SLinus Torvalds //		0C-0D	4-byte status.	P1 = extended status code and P2,P3 = params
3551da177e4SLinus Torvalds //					Not currently implemented.
3561da177e4SLinus Torvalds //
3571da177e4SLinus Torvalds //		0E-0F	N-byte status:	P1 = num bytes after P1 (ie, TotalLen - 2)
3581da177e4SLinus Torvalds //					P2 = extended status, P3..Pn = parameters.
3591da177e4SLinus Torvalds //					Not currently implemented.
3601da177e4SLinus Torvalds //
3611da177e4SLinus Torvalds 
3621da177e4SLinus Torvalds /****************************************************
3631da177e4SLinus Torvalds  *	SSSS values for 2-byte status messages (0-8)
3641da177e4SLinus Torvalds  ****************************************************/
3651da177e4SLinus Torvalds 
3661da177e4SLinus Torvalds #define	IOSP_STATUS_LSR			0x00	// P1 is new value of LSR register.
3671da177e4SLinus Torvalds 
3681da177e4SLinus Torvalds // Bits defined in 16554.H. Edgeport
3691da177e4SLinus Torvalds // returns this in order to report
3701da177e4SLinus Torvalds // line status errors (overrun,
3711da177e4SLinus Torvalds // parity, framing, break). This form
3721da177e4SLinus Torvalds // is used when a errored receive data
3731da177e4SLinus Torvalds // character was NOT present in the
3741da177e4SLinus Torvalds // UART when the LSR error occurred
3751da177e4SLinus Torvalds // (ie, when LSR bit 0 = 0).
3761da177e4SLinus Torvalds 
3771da177e4SLinus Torvalds #define	IOSP_STATUS_MSR			0x01	// P1 is new value of MSR register.
3781da177e4SLinus Torvalds 
3791da177e4SLinus Torvalds // Bits defined in 16554.H. Edgeport
3801da177e4SLinus Torvalds // returns this in order to report
3811da177e4SLinus Torvalds // changes in modem status lines
3821da177e4SLinus Torvalds // (CTS, DSR, RI, CD)
3831da177e4SLinus Torvalds //
3841da177e4SLinus Torvalds 
3851da177e4SLinus Torvalds //					0x02	// Available for future expansion
3861da177e4SLinus Torvalds //					0x03	//
3871da177e4SLinus Torvalds //					0x04	//
3881da177e4SLinus Torvalds //					0x05	//
3891da177e4SLinus Torvalds //					0x06	//
3901da177e4SLinus Torvalds //					0x07	//
3911da177e4SLinus Torvalds 
3921da177e4SLinus Torvalds 
3931da177e4SLinus Torvalds /****************************************************
3941da177e4SLinus Torvalds  *	SSSS values for 3-byte status messages (8-A)
3951da177e4SLinus Torvalds  ****************************************************/
3961da177e4SLinus Torvalds 
3971da177e4SLinus Torvalds #define	IOSP_STATUS_LSR_DATA		0x08	// P1 is new value of LSR register (same as STATUS_LSR)
3981da177e4SLinus Torvalds 
3991da177e4SLinus Torvalds // P2 is errored character read from
4001da177e4SLinus Torvalds //    RxFIFO after LSR reported an error.
4011da177e4SLinus Torvalds 
4021da177e4SLinus Torvalds #define	IOSP_EXT_STATUS			0x09	// P1 is status/response code, param in P2.
4031da177e4SLinus Torvalds 
4041da177e4SLinus Torvalds 
4051da177e4SLinus Torvalds // Response Codes (P1 values) for 3-byte status messages
4061da177e4SLinus Torvalds 
4071da177e4SLinus Torvalds #define	IOSP_EXT_STATUS_CHASE_RSP	0	// Reply to CHASE_PORT cmd. P2 is outcome:
4081da177e4SLinus Torvalds #define	IOSP_EXT_STATUS_CHASE_PASS	0	//	P2 = 0: All Tx data drained successfully
4091da177e4SLinus Torvalds #define	IOSP_EXT_STATUS_CHASE_FAIL	1	//	P2 = 1: Timed out (stuck due to flow
4101da177e4SLinus Torvalds 
4111da177e4SLinus Torvalds //			control from remote device).
4121da177e4SLinus Torvalds 
4131da177e4SLinus Torvalds #define	IOSP_EXT_STATUS_RX_CHECK_RSP	1	// Reply to RX_CHECK cmd. P2 is sequence number
4141da177e4SLinus Torvalds 
4151da177e4SLinus Torvalds 
4161da177e4SLinus Torvalds #define IOSP_STATUS_OPEN_RSP		0x0A	// Reply to OPEN_PORT cmd.
4171da177e4SLinus Torvalds 
4181da177e4SLinus Torvalds // P1 is Initial MSR value
4191da177e4SLinus Torvalds // P2 is encoded TxBuffer Size:
4201da177e4SLinus Torvalds //	TxBufferSize = (P2 + 1) * 64
4211da177e4SLinus Torvalds 
4221da177e4SLinus Torvalds //					0x0B	// Available for future expansion
4231da177e4SLinus Torvalds 
4241da177e4SLinus Torvalds #define GET_TX_BUFFER_SIZE(P2) (((P2) + 1) * 64)
4251da177e4SLinus Torvalds 
4261da177e4SLinus Torvalds 
4271da177e4SLinus Torvalds 
4281da177e4SLinus Torvalds 
4291da177e4SLinus Torvalds /****************************************************
4301da177e4SLinus Torvalds  *	SSSS values for 4-byte status messages
4311da177e4SLinus Torvalds  ****************************************************/
4321da177e4SLinus Torvalds 
4331da177e4SLinus Torvalds #define IOSP_EXT4_STATUS		0x0C	// Extended status code in P1,
4341da177e4SLinus Torvalds 
4351da177e4SLinus Torvalds // Params in P2, P3
4361da177e4SLinus Torvalds // Currently unimplemented.
4371da177e4SLinus Torvalds 
4381da177e4SLinus Torvalds //					0x0D	// Currently unused, available.
4391da177e4SLinus Torvalds 
4401da177e4SLinus Torvalds 
4411da177e4SLinus Torvalds 
4421da177e4SLinus Torvalds //
4431da177e4SLinus Torvalds // Macros to parse status messages
4441da177e4SLinus Torvalds //
4451da177e4SLinus Torvalds 
4461da177e4SLinus Torvalds #define	IOSP_GET_STATUS_LEN(code)	((code) < 8 ? 2 : ((code) < 0x0A ? 3 : 4))
4471da177e4SLinus Torvalds 
4481da177e4SLinus Torvalds #define	IOSP_STATUS_IS_2BYTE(code)	((code) < 0x08)
4491da177e4SLinus Torvalds #define	IOSP_STATUS_IS_3BYTE(code)	(((code) >= 0x08) && ((code) <= 0x0B))
4501da177e4SLinus Torvalds #define	IOSP_STATUS_IS_4BYTE(code)	(((code) >= 0x0C) && ((code) <= 0x0D))
4511da177e4SLinus Torvalds 
452