11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Driver for ST5481 USB ISDN modem
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author       Frode Isaksen
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
7475be4d85a274d0961593db41cf85689db1d583cJoe Perches *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software may be used and distributed according to the terms
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the GNU General Public License, incorporated herein by reference.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _ST5481_H_
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _ST5481_H_
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// USB IDs, the Product Id is in the range 0x4810-0x481F
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST_VENDOR_ID 0x0483
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_PRODUCT_ID 0x4810
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_PRODUCT_ID_MASK 0xFFF0
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// ST5481 endpoints when using alternative setting 3 (2B+D).
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// To get the endpoint address, OR with 0x80 for IN endpoints.
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_CTRL   0x00U /* Control endpoint */
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_INT    0x01U /* Interrupt endpoint */
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_B1_OUT 0x02U /* B1 channel out */
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_B1_IN  0x03U /* B1 channel in */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_B2_OUT 0x04U /* B2 channel out */
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_B2_IN  0x05U /* B2 channel in */
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_D_OUT  0x06U /* D channel out */
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EP_D_IN   0x07U /* D channel in */
34475be4d85a274d0961593db41cf85689db1d583cJoe Perches
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Number of isochronous packets. With 20 packets we get
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// 50 interrupts/sec for each endpoint.
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NUM_ISO_PACKETS_D      20
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NUM_ISO_PACKETS_B      20
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Size of each isochronous packet.
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// In outgoing direction we need to match ISDN data rates:
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// D:  2 bytes / msec -> 16 kbit / s
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// B: 16 bytes / msec -> 64 kbit / s
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIZE_ISO_PACKETS_D_IN  16
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIZE_ISO_PACKETS_D_OUT 2
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIZE_ISO_PACKETS_B_IN  32
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIZE_ISO_PACKETS_B_OUT 8
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// If we overrun/underrun, we send one packet with +/- 2 bytes
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B_FLOW_ADJUST 2
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Registers that are written using vendor specific device request
54475be4d85a274d0961593db41cf85689db1d583cJoe Perches// on endpoint 0.
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LBA			0x02 /* S loopback */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SET_DEFAULT		0x06 /* Soft reset */
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LBB			0x1D /* S maintenance loopback */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STT			0x1e /* S force transmission signals */
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SDA_MIN			0x20 /* SDA-sin minimal value */
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SDA_MAX			0x21 /* SDA-sin maximal value */
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SDELAY_VALUE		0x22 /* Delay between Tx and Rx clock */
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IN_D_COUNTER		0x36 /* D receive channel fifo counter */
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUT_D_COUNTER		0x37 /* D transmit channel fifo counter */
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IN_B1_COUNTER		0x38 /* B1 receive channel fifo counter */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUT_B1_COUNTER		0x39 /* B1 transmit channel fifo counter */
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IN_B2_COUNTER		0x3a /* B2 receive channel fifo counter */
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUT_B2_COUNTER		0x3b /* B2 transmit channel fifo counter */
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRL_IN_D		0x3C /* D receive channel fifo threshold low */
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRH_IN_D		0x3D /* D receive channel fifo threshold high */
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRL_OUT_D		0x3E /* D transmit channel fifo threshold low */
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRH_OUT_D		0x3F /* D transmit channel fifo threshold high */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRL_IN_B1		0x40 /* B1 receive channel fifo threshold low */
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRH_IN_B1		0x41 /* B1 receive channel fifo threshold high */
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRL_OUT_B1		0x42 /* B1 transmit channel fifo threshold low */
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRH_OUT_B1		0x43 /* B1 transmit channel fifo threshold high */
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRL_IN_B2		0x44 /* B2 receive channel fifo threshold low */
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRH_IN_B2		0x45 /* B2 receive channel fifo threshold high */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRL_OUT_B2		0x46 /* B2 transmit channel fifo threshold low */
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFCTRH_OUT_B2		0x47 /* B2 transmit channel fifo threshold high */
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MPMSK			0x4A /* Multi purpose interrupt MASK register */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	FFMSK_D			0x4c /* D fifo interrupt MASK register */
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	FFMSK_B1		0x4e /* B1 fifo interrupt MASK register */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	FFMSK_B2		0x50 /* B2 fifo interrupt MASK register */
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GPIO_DIR		0x52 /* GPIO pins direction registers */
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GPIO_OUT		0x53 /* GPIO pins output register */
87475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define GPIO_IN			0x54 /* GPIO pins input register */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TXCI			0x56 /* CI command to be transmitted */
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Format of the interrupt packet received on endpoint 1:
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds//
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// +--------+--------+--------+--------+--------+--------+
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// !MPINT   !FFINT_D !FFINT_B1!FFINT_B2!CCIST   !GPIO_INT!
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// +--------+--------+--------+--------+--------+--------+
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Offsets in the interrupt packet
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MPINT			0
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFINT_D			1
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFINT_B1		2
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FFINT_B2		3
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CCIST			4
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GPIO_INT		5
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INT_PKT_SIZE            6
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// MPINT
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LSD_INT                 0x80 /* S line activity detected */
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RXCI_INT		0x40 /* Indicate primitive arrived */
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	DEN_INT			0x20 /* Signal enabling data out of D Tx fifo */
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DCOLL_INT		0x10 /* D channel collision */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AMIVN_INT		0x04 /* AMI violation number reached 2 */
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INFOI_INT		0x04 /* INFOi changed */
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DRXON_INT               0x02 /* Reception channel active */
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GPCHG_INT               0x01 /* GPIO pin value changed */
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// FFINT_x
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IN_OVERRUN		0x80 /* In fifo overrun */
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUT_UNDERRUN		0x40 /* Out fifo underrun */
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IN_UP			0x20 /* In fifo thresholdh up-crossed */
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IN_DOWN			0x10 /* In fifo thresholdl down-crossed */
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUT_UP			0x08 /* Out fifo thresholdh up-crossed */
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUT_DOWN		0x04 /* Out fifo thresholdl down-crossed */
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IN_COUNTER_ZEROED	0x02 /* In down-counter reached 0 */
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUT_COUNTER_ZEROED	0x01 /* Out down-counter reached 0 */
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
127475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define ANY_REC_INT	(IN_OVERRUN + IN_UP + IN_DOWN + IN_COUNTER_ZEROED)
128475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define ANY_XMIT_INT	(OUT_UNDERRUN + OUT_UP + OUT_DOWN + OUT_COUNTER_ZEROED)
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Level 1 commands that are sent using the TXCI device request
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_DR		 0x0 /* Deactivation Request */
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_RES		 0x1 /* state machine RESet */
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_TM1		 0x2 /* Test Mode 1 */
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_TM2		 0x3 /* Test Mode 2 */
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_PUP		 0x7 /* Power UP */
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_AR8		 0x8 /* Activation Request class 1 */
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_AR10		 0x9 /* Activation Request class 2 */
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_ARL		 0xA /* Activation Request Loopback */
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ST5481_CMD_PDN		 0xF /* Power DoWn */
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Turn on/off the LEDs using the GPIO device request.
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// To use the B LEDs, number_of_leds must be set to 4
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_LED		0x10U
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B2_LED		0x20U
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GREEN_LED	0x40U
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RED_LED	        0x80U
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// D channel out states
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_NONE,
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_SHORT_INIT,
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_SHORT_WAIT_DEN,
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_LONG_INIT,
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_LONG_WAIT_DEN,
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_NORMAL,
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_WAIT_FOR_UNDERRUN,
161475be4d85a274d0961593db41cf85689db1d583cJoe Perches	ST_DOUT_WAIT_FOR_NOT_BUSY,
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_WAIT_FOR_STOP,
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_DOUT_WAIT_FOR_RESET,
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DOUT_STATE_COUNT (ST_DOUT_WAIT_FOR_RESET + 1)
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// D channel out events
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_DOUT_START_XMIT,
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_DOUT_COMPLETE,
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_DOUT_DEN,
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_DOUT_RESETED,
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_DOUT_STOPPED,
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_DOUT_COLL,
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_DOUT_UNDERRUN,
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DOUT_EVENT_COUNT (EV_DOUT_UNDERRUN + 1)
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// ----------------------------------------------------------------------
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_L1_F3,
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_L1_F4,
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_L1_F6,
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_L1_F7,
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ST_L1_F8,
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define L1_STATE_COUNT (ST_L1_F8 + 1)
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
193475be4d85a274d0961593db41cf85689db1d583cJoe Perches// The first 16 entries match the Level 1 indications that
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// are found at offset 4 (CCIST) in the interrupt packet
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_DP,  // 0000 Deactivation Pending
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_1,   // 0001
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_2,   // 0010
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_3,   // 0011
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_RSY, // 0100 ReSYnchronizing
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_5,   // 0101
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_6,   // 0110
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_7,   // 0111
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_AP,  // 1000 Activation Pending
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_9,   // 1001
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_10,  // 1010
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_11,  // 1011
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_AI8, // 1100 Activation Indication class 8
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_AI10,// 1101 Activation Indication class 10
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_AIL, // 1110 Activation Indication Loopback
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_IND_DI,  // 1111 Deactivation Indication
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_PH_ACTIVATE_REQ,
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_PH_DEACTIVATE_REQ,
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EV_TIMER3,
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define L1_EVENT_COUNT (EV_TIMER3 + 1)
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
220475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define ERR(format, arg...)						\
221475be4d85a274d0961593db41cf85689db1d583cJoe Perches	printk(KERN_ERR "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
223475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define WARNING(format, arg...)						\
224475be4d85a274d0961593db41cf85689db1d583cJoe Perches	printk(KERN_WARNING "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
226475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define INFO(format, arg...)						\
227475be4d85a274d0961593db41cf85689db1d583cJoe Perches	printk(KERN_INFO "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
229cb3824bade2549d7ad059d5802da43312540fdeeKarsten Keil#include <linux/isdn/hdlc.h>
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "fsm.h"
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "hisax_if.h"
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/skbuff.h>
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ======================================================================
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FIFO handling
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Generic FIFO structure */
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct fifo {
240475be4d85a274d0961593db41cf85689db1d583cJoe Perches	u_char r, w, count, size;
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t lock;
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Init an FIFO
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void fifo_init(struct fifo *fifo, int size)
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	fifo->r = fifo->w = fifo->count = 0;
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	fifo->size = size;
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spin_lock_init(&fifo->lock);
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Add an entry to the FIFO
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int fifo_add(struct fifo *fifo)
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long flags;
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int index;
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!fifo) {
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spin_lock_irqsave(&fifo->lock, flags);
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (fifo->count == fifo->size) {
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		// FIFO full
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		index = -1;
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		// Return index where to get the next data to add to the FIFO
272475be4d85a274d0961593db41cf85689db1d583cJoe Perches		index = fifo->w++ & (fifo->size - 1);
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fifo->count++;
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spin_unlock_irqrestore(&fifo->lock, flags);
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return index;
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Remove an entry from the FIFO with the index returned.
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int fifo_remove(struct fifo *fifo)
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long flags;
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int index;
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!fifo) {
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spin_lock_irqsave(&fifo->lock, flags);
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!fifo->count) {
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		// FIFO empty
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		index = -1;
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		// Return index where to get the next data from the FIFO
297475be4d85a274d0961593db41cf85689db1d583cJoe Perches		index = fifo->r++ & (fifo->size - 1);
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fifo->count--;
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spin_unlock_irqrestore(&fifo->lock, flags);
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return index;
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ======================================================================
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * control pipe
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef void (*ctrl_complete_t)(void *);
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ctrl_msg {
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct usb_ctrlrequest dr;
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ctrl_complete_t complete;
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void *context;
314475be4d85a274d0961593db41cf85689db1d583cJoe Perches} ctrl_msg;
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* FIFO of ctrl messages waiting to be sent */
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_EP0_MSG 16
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ctrl_msg_fifo {
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct fifo f;
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct ctrl_msg data[MAX_EP0_MSG];
321475be4d85a274d0961593db41cf85689db1d583cJoe Perches};
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_DFRAME_LEN_L1	300
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HSCX_BUFMAX	4096
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct st5481_ctrl {
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct ctrl_msg_fifo msg_fifo;
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long busy;
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct urb *urb;
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct st5481_intr {
333475be4d85a274d0961593db41cf85689db1d583cJoe Perches	//	struct evt_fifo evt_fifo;
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct urb *urb;
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct st5481_d_out {
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct isdnhdlc_vars hdlc_state;
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct urb *urb[2]; /* double buffering */
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long busy;
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *tx_skb;
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct FsmInst fsm;
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct st5481_b_out {
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct isdnhdlc_vars hdlc_state;
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct urb *urb[2]; /* double buffering */
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_char flow_event;
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_long busy;
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *tx_skb;
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct st5481_in {
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct isdnhdlc_vars hdlc_state;
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct urb *urb[2]; /* double buffering */
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int mode;
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int bufsize;
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int num_packets;
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int packet_size;
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char ep, counter;
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char *rcvbuf;
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_adapter *adapter;
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_if *hisax_if;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint st5481_setup_in(struct st5481_in *in);
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_release_in(struct st5481_in *in);
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_in_mode(struct st5481_in *in, int mode);
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct st5481_bcs {
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_b_if b_if;
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_adapter *adapter;
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_in b_in;
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_b_out b_out;
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int channel;
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int mode;
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct st5481_adapter {
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int number_of_leds;
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct usb_device *usb_dev;
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_d_if hisax_d_if;
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_ctrl ctrl;
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_intr intr;
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_in d_in;
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_d_out d_out;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char leds;
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int led_counter;
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long event;
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct FsmInst l1m;
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct FsmTimer timer;
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct st5481_bcs bcs[2];
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TIMER3_VALUE 7000
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ======================================================================
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Submit an URB with error reporting. This is a macro so
408156f1ed640170d70c9fc8e5f6f797ea1f2a1653bHarvey Harrison * the __func__ returns the caller function name.
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
410475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define SUBMIT_URB(urb, mem_flags)					\
411475be4d85a274d0961593db41cf85689db1d583cJoe Perches	({								\
412475be4d85a274d0961593db41cf85689db1d583cJoe Perches		int status;						\
413475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if ((status = usb_submit_urb(urb, mem_flags)) < 0) {	\
414475be4d85a274d0961593db41cf85689db1d583cJoe Perches			WARNING("usb_submit_urb failed,status=%d", status); \
415475be4d85a274d0961593db41cf85689db1d583cJoe Perches		}							\
416475be4d85a274d0961593db41cf85689db1d583cJoe Perches		status;							\
417475be4d85a274d0961593db41cf85689db1d583cJoe Perches	})
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * USB double buffering, return the URB index (0 or 1).
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int get_buf_nr(struct urb *urbs[], struct urb *urb)
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
424475be4d85a274d0961593db41cf85689db1d583cJoe Perches	return (urbs[0] == urb ? 0 : 1);
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ---------------------------------------------------------------------- */
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* B Channel */
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint  st5481_setup_b(struct st5481_bcs *bcs);
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_release_b(struct st5481_bcs *bcs);
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_d_l2l1(struct hisax_if *hisax_d_if, int pr, void *arg);
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* D Channel */
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint  st5481_setup_d(struct st5481_adapter *adapter);
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_release_d(struct st5481_adapter *adapter);
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_b_l2l1(struct hisax_if *b_if, int pr, void *arg);
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint  st5481_d_init(void);
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_d_exit(void);
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* USB */
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_ph_command(struct st5481_adapter *adapter, unsigned int command);
445475be4d85a274d0961593db41cf85689db1d583cJoe Perchesint st5481_setup_isocpipes(struct urb *urb[2], struct usb_device *dev,
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   unsigned int pipe, int num_packets,
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   int packet_size, int buf_size,
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   usb_complete_t complete, void *context);
449475be4d85a274d0961593db41cf85689db1d583cJoe Perchesvoid st5481_release_isocpipes(struct urb *urb[2]);
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_usb_pipe_reset(struct st5481_adapter *adapter,
452475be4d85a274d0961593db41cf85689db1d583cJoe Perches			   u_char pipe, ctrl_complete_t complete, void *context);
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_usb_device_ctrl_msg(struct st5481_adapter *adapter,
454475be4d85a274d0961593db41cf85689db1d583cJoe Perches				u8 request, u16 value,
455475be4d85a274d0961593db41cf85689db1d583cJoe Perches				ctrl_complete_t complete, void *context);
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint  st5481_setup_usb(struct st5481_adapter *adapter);
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_release_usb(struct st5481_adapter *adapter);
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_start(struct st5481_adapter *adapter);
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid st5481_stop(struct st5481_adapter *adapter);
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// ----------------------------------------------------------------------
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// debugging macros
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __debug_variable st5481_debug
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "hisax_debug.h"
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int st5481_debug;
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46961ffcafafb3d985e1ab8463be0187b421614775cKarsten Keil#ifdef CONFIG_HISAX_DEBUG
47061ffcafafb3d985e1ab8463be0187b421614775cKarsten Keil
471475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define DBG_ISO_PACKET(level, urb)					\
472475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (level & __debug_variable) dump_iso_packet(__func__, urb)
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __attribute__((unused))
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdump_iso_packet(const char *name, struct urb *urb)
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
477475be4d85a274d0961593db41cf85689db1d583cJoe Perches	int i, j;
478475be4d85a274d0961593db41cf85689db1d583cJoe Perches	int len, ofs;
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_char *data;
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "%s: packets=%d,errors=%d\n",
482475be4d85a274d0961593db41cf85689db1d583cJoe Perches	       name, urb->number_of_packets, urb->error_count);
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i  < urb->number_of_packets; ++i) {
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (urb->pipe & USB_DIR_IN) {
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len = urb->iso_frame_desc[i].actual_length;
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len = urb->iso_frame_desc[i].length;
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ofs = urb->iso_frame_desc[i].offset;
490475be4d85a274d0961593db41cf85689db1d583cJoe Perches		printk(KERN_DEBUG "len=%.2d,ofs=%.3d ", len, ofs);
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (len) {
492475be4d85a274d0961593db41cf85689db1d583cJoe Perches			data = urb->transfer_buffer + ofs;
493475be4d85a274d0961593db41cf85689db1d583cJoe Perches			for (j = 0; j < len; j++) {
494475be4d85a274d0961593db41cf85689db1d583cJoe Perches				printk("%.2x", data[j]);
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("\n");
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline const char *ST5481_CMD_string(int evt)
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	static char s[16];
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (evt) {
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_DR: return "DR";
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_RES: return "RES";
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_TM1: return "TM1";
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_TM2: return "TM2";
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_PUP: return "PUP";
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_AR8: return "AR8";
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_AR10: return "AR10";
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_ARL: return "ARL";
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ST5481_CMD_PDN: return "PDN";
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	};
516475be4d85a274d0961593db41cf85689db1d583cJoe Perches
517475be4d85a274d0961593db41cf85689db1d583cJoe Perches	sprintf(s, "0x%x", evt);
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return s;
519475be4d85a274d0961593db41cf85689db1d583cJoe Perches}
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
523475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define DBG_ISO_PACKET(level, urb) do {} while (0)
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
529475be4d85a274d0961593db41cf85689db1d583cJoe Perches#endif
530