2005-04-16 15:20:36 -07:00
/*
2007-08-21 14:26:21 +02:00
* hfc_usb . h
*
* $ Id : hfc_usb . h , v 1.1 .2 .5 2007 / 08 / 20 14 : 36 : 03 mbachem Exp $
*/
2005-04-16 15:20:36 -07:00
# ifndef __HFC_USB_H__
# define __HFC_USB_H__
# define DRIVER_AUTHOR "Peter Sprenger (sprenger@moving-byters.de)"
# define DRIVER_DESC "HFC-S USB based HiSAX ISDN driver"
2007-08-21 14:26:21 +02:00
# define HFC_CTRL_TIMEOUT 20 /* 5ms timeout writing/reading regs */
# define HFC_TIMER_T3 8000 /* timeout for l1 activation timer */
# define HFC_TIMER_T4 500 /* time for state change interval */
2005-04-16 15:20:36 -07:00
2007-08-21 14:26:21 +02:00
# define HFCUSB_L1_STATECHANGE 0 /* L1 state changed */
# define HFCUSB_L1_DRX 1 /* D-frame received */
# define HFCUSB_L1_ERX 2 /* E-frame received */
# define HFCUSB_L1_DTX 4 /* D-frames completed */
2005-04-16 15:20:36 -07:00
2007-08-21 14:26:21 +02:00
# define MAX_BCH_SIZE 2048 /* allowed B-channel packet size */
2005-04-16 15:20:36 -07:00
2007-08-21 14:26:21 +02:00
# define HFCUSB_RX_THRESHOLD 64 /* threshold for fifo report bit rx */
# define HFCUSB_TX_THRESHOLD 64 /* threshold for fifo report bit tx */
2005-04-16 15:20:36 -07:00
# define HFCUSB_CHIP_ID 0x16 /* Chip ID register index */
# define HFCUSB_CIRM 0x00 /* cirm register index */
# define HFCUSB_USB_SIZE 0x07 /* int length register */
# define HFCUSB_USB_SIZE_I 0x06 /* iso length register */
# define HFCUSB_F_CROSS 0x0b /* bit order register */
# define HFCUSB_CLKDEL 0x37 /* bit delay register */
# define HFCUSB_CON_HDLC 0xfa /* channel connect register */
# define HFCUSB_HDLC_PAR 0xfb
# define HFCUSB_SCTRL 0x31 /* S-bus control register (tx) */
# define HFCUSB_SCTRL_E 0x32 /* same for E and special funcs */
# define HFCUSB_SCTRL_R 0x33 /* S-bus control register (rx) */
# define HFCUSB_F_THRES 0x0c /* threshold register */
# define HFCUSB_FIFO 0x0f /* fifo select register */
# define HFCUSB_F_USAGE 0x1a /* fifo usage register */
# define HFCUSB_MST_MODE0 0x14
# define HFCUSB_MST_MODE1 0x15
# define HFCUSB_P_DATA 0x1f
# define HFCUSB_INC_RES_F 0x0e
# define HFCUSB_STATES 0x30
# define HFCUSB_CHIPID 0x40 /* ID value of HFC-S USB */
2007-08-21 14:26:21 +02:00
2005-04-16 15:20:36 -07:00
/* fifo registers */
# define HFCUSB_NUM_FIFOS 8 /* maximum number of fifos */
# define HFCUSB_B1_TX 0 /* index for B1 transmit bulk/int */
# define HFCUSB_B1_RX 1 /* index for B1 receive bulk/int */
# define HFCUSB_B2_TX 2
# define HFCUSB_B2_RX 3
# define HFCUSB_D_TX 4
# define HFCUSB_D_RX 5
# define HFCUSB_PCM_TX 6
# define HFCUSB_PCM_RX 7
/*
2007-08-21 14:26:21 +02:00
* used to switch snd_transfer_mode for different TA modes e . g . the Billion USB TA just
* supports ISO out , while the Cologne Chip EVAL TA just supports BULK out
*/
2005-04-16 15:20:36 -07:00
# define USB_INT 0
# define USB_BULK 1
# define USB_ISOC 2
# define ISOC_PACKETS_D 8
# define ISOC_PACKETS_B 8
# define ISO_BUFFER_SIZE 128
2007-08-21 14:26:21 +02:00
/* Fifo flow Control for TX ISO */
2005-04-16 15:20:36 -07:00
# define SINK_MAX 68
# define SINK_MIN 48
# define SINK_DMIN 12
# define SINK_DMAX 18
# define BITLINE_INF (-64*8)
2007-08-21 14:26:21 +02:00
/* HFC-S USB register access by Control-URSs */
2005-11-07 01:00:20 -08:00
# define write_usb(a,b,c)usb_control_msg((a)->dev,(a)->ctrl_out_pipe,0,0x40,(c),(b),NULL,0,HFC_CTRL_TIMEOUT)
2005-04-16 15:20:36 -07:00
# define read_usb(a,b,c) usb_control_msg((a)->dev,(a)->ctrl_in_pipe,1,0xC0,0,(b),(c),1,HFC_CTRL_TIMEOUT)
# define HFC_CTRL_BUFSIZE 32
/* entry and size of output/input control buffer */
typedef struct {
__u8 hfc_reg ; /* register number */
__u8 reg_val ; /* value to be written (or read) */
int action ; /* data for action handler */
} ctrl_buft ;
2007-08-21 14:26:21 +02:00
/* Debugging Flags */
# define HFCUSB_DBG_INIT 0x0001
# define HFCUSB_DBG_STATES 0x0002
# define HFCUSB_DBG_DCHANNEL 0x0080
# define HFCUSB_DBG_FIFO_ERR 0x4000
# define HFCUSB_DBG_VERBOSE_USB 0x8000
2005-04-16 15:20:36 -07:00
2007-08-21 14:26:21 +02:00
/*
* URB error codes :
* Used to represent a list of values and their respective symbolic names
*/
2005-04-16 15:20:36 -07:00
struct hfcusb_symbolic_list {
const int num ;
const char * name ;
} ;
static struct hfcusb_symbolic_list urb_errlist [ ] = {
{ - ENOMEM , " No memory for allocation of internal structures " } ,
{ - ENOSPC , " The host controller's bandwidth is already consumed " } ,
{ - ENOENT , " URB was canceled by unlink_urb " } ,
{ - EXDEV , " ISO transfer only partially completed " } ,
{ - EAGAIN , " Too match scheduled for the future " } ,
{ - ENXIO , " URB already queued " } ,
{ - EFBIG , " Too much ISO frames requested " } ,
{ - ENOSR , " Buffer error (overrun) " } ,
2007-08-21 14:26:21 +02:00
{ - EPIPE , " Specified endpoint is stalled (device not responding) " } ,
2005-04-16 15:20:36 -07:00
{ - EOVERFLOW , " Babble (bad cable?) " } ,
{ - EPROTO , " Bit-stuff error (bad cable?) " } ,
2007-08-21 14:26:21 +02:00
{ - EILSEQ , " CRC/Timeout " } ,
{ - ETIMEDOUT , " NAK (device does not respond) " } ,
2005-04-16 15:20:36 -07:00
{ - ESHUTDOWN , " Device unplugged " } ,
{ - 1 , NULL }
} ;
2007-08-21 14:26:21 +02:00
/*
* device dependant information to support different
* ISDN Ta ' s using the HFC - S USB chip
*/
2005-04-16 15:20:36 -07:00
/* USB descriptor need to contain one of the following EndPoint combination: */
# define CNF_4INT3ISO 1 // 4 INT IN, 3 ISO OUT
# define CNF_3INT3ISO 2 // 3 INT IN, 3 ISO OUT
# define CNF_4ISO3ISO 3 // 4 ISO IN, 3 ISO OUT
# define CNF_3ISO3ISO 4 // 3 ISO IN, 3 ISO OUT
2007-08-21 14:26:21 +02:00
# define EP_NUL 1 // Endpoint at this position not allowed
# define EP_NOP 2 // all type of endpoints allowed at this position
# define EP_ISO 3 // Isochron endpoint mandatory at this position
# define EP_BLK 4 // Bulk endpoint mandatory at this position
# define EP_INT 5 // Interrupt endpoint mandatory at this position
2005-04-16 15:20:36 -07:00
2007-08-21 14:26:21 +02:00
/*
* List of all supported endpoint configuration sets , used to find the
* best matching endpoint configuration within a devices ' USB descriptor .
* We need at least 3 RX endpoints , and 3 TX endpoints , either
* INT - in and ISO - out , or ISO - in and ISO - out )
* with 4 RX endpoints even E - Channel logging is possible
*/
2005-06-25 14:59:18 -07:00
static int validconf [ ] [ 19 ] = {
2005-04-16 15:20:36 -07:00
// INT in, ISO out config
{ EP_NUL , EP_INT , EP_NUL , EP_INT , EP_NUL , EP_INT , EP_NOP , EP_INT ,
EP_ISO , EP_NUL , EP_ISO , EP_NUL , EP_ISO , EP_NUL , EP_NUL , EP_NUL ,
CNF_4INT3ISO , 2 , 1 } ,
{ EP_NUL , EP_INT , EP_NUL , EP_INT , EP_NUL , EP_INT , EP_NUL , EP_NUL ,
EP_ISO , EP_NUL , EP_ISO , EP_NUL , EP_ISO , EP_NUL , EP_NUL , EP_NUL ,
CNF_3INT3ISO , 2 , 0 } ,
// ISO in, ISO out config
{ EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL ,
EP_ISO , EP_ISO , EP_ISO , EP_ISO , EP_ISO , EP_ISO , EP_NOP , EP_ISO ,
CNF_4ISO3ISO , 2 , 1 } ,
{ EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL , EP_NUL ,
EP_ISO , EP_ISO , EP_ISO , EP_ISO , EP_ISO , EP_ISO , EP_NUL , EP_NUL ,
CNF_3ISO3ISO , 2 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } // EOL element
} ;
2005-11-07 01:00:20 -08:00
# ifdef CONFIG_HISAX_DEBUG
2005-04-16 15:20:36 -07:00
// string description of chosen config
2005-06-25 14:59:18 -07:00
static char * conf_str [ ] = {
2005-04-16 15:20:36 -07:00
" 4 Interrupt IN + 3 Isochron OUT " ,
" 3 Interrupt IN + 3 Isochron OUT " ,
" 4 Isochron IN + 3 Isochron OUT " ,
" 3 Isochron IN + 3 Isochron OUT "
} ;
2005-11-07 01:00:20 -08:00
# endif
2005-04-16 15:20:36 -07:00
typedef struct {
int vendor ; // vendor id
int prod_id ; // product id
char * vend_name ; // vendor string
__u8 led_scheme ; // led display scheme
signed short led_bits [ 8 ] ; // array of 8 possible LED bitmask settings
} vendor_data ;
2007-08-21 14:26:21 +02:00
# define LED_OFF 0 // no LED support
# define LED_SCHEME1 1 // LED standard scheme
# define LED_SCHEME2 2 // not used yet...
2005-04-16 15:20:36 -07:00
# define LED_POWER_ON 1
# define LED_POWER_OFF 2
# define LED_S0_ON 3
# define LED_S0_OFF 4
# define LED_B1_ON 5
# define LED_B1_OFF 6
# define LED_B1_DATA 7
# define LED_B2_ON 8
# define LED_B2_OFF 9
# define LED_B2_DATA 10
2007-08-21 14:26:21 +02:00
# define LED_NORMAL 0 // LEDs are normal
# define LED_INVERTED 1 // LEDs are inverted
2005-04-16 15:20:36 -07:00
2007-08-21 14:26:21 +02:00
# endif // __HFC_USB_H__