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