1#ifndef _LINUX_ISICOM_H 2#define _LINUX_ISICOM_H 3 4/*#define ISICOM_DEBUG*/ 5/*#define ISICOM_DEBUG_DTR_RTS*/ 6 7 8/* 9 * Firmware Loader definitions ... 10 */ 11 12#define __MultiTech ('M'<<8) 13#define MIOCTL_LOAD_FIRMWARE (__MultiTech | 0x01) 14#define MIOCTL_READ_FIRMWARE (__MultiTech | 0x02) 15#define MIOCTL_XFER_CTRL (__MultiTech | 0x03) 16#define MIOCTL_RESET_CARD (__MultiTech | 0x04) 17 18#define DATA_SIZE 16 19 20typedef struct { 21 unsigned short exec_segment; 22 unsigned short exec_addr; 23} exec_record; 24 25typedef struct { 26 int board; /* Board to load */ 27 unsigned short addr; 28 unsigned short count; 29} bin_header; 30 31typedef struct { 32 int board; /* Board to load */ 33 unsigned short addr; 34 unsigned short count; 35 unsigned short segment; 36 unsigned char bin_data[DATA_SIZE]; 37} bin_frame; 38 39#ifdef __KERNEL__ 40 41#define YES 1 42#define NO 0 43 44#define ISILOAD_MISC_MINOR 155 /* /dev/isctl */ 45#define ISILOAD_NAME "ISILoad" 46 47/* 48 * ISICOM Driver definitions ... 49 * 50 */ 51 52#define ISICOM_NAME "ISICom" 53 54/* 55 * PCI definitions 56 */ 57 58 #define DEVID_COUNT 9 59 #define VENDOR_ID 0x10b5 60 61/* 62 * These are now officially allocated numbers 63 */ 64 65#define ISICOM_NMAJOR 112 /* normal */ 66#define ISICOM_CMAJOR 113 /* callout */ 67#define ISICOM_MAGIC (('M' << 8) | 'T') 68 69#define WAKEUP_CHARS 256 /* hard coded for now */ 70#define TX_SIZE 254 71 72#define BOARD_COUNT 4 73#define PORT_COUNT (BOARD_COUNT*16) 74 75#define SERIAL_TYPE_NORMAL 1 76#define SERIAL_TYPE_CALLOUT 2 77 78/* character sizes */ 79 80#define ISICOM_CS5 0x0000 81#define ISICOM_CS6 0x0001 82#define ISICOM_CS7 0x0002 83#define ISICOM_CS8 0x0003 84 85/* stop bits */ 86 87#define ISICOM_1SB 0x0000 88#define ISICOM_2SB 0x0004 89 90/* parity */ 91 92#define ISICOM_NOPAR 0x0000 93#define ISICOM_ODPAR 0x0008 94#define ISICOM_EVPAR 0x0018 95 96/* flow control */ 97 98#define ISICOM_CTSRTS 0x03 99#define ISICOM_INITIATE_XONXOFF 0x04 100#define ISICOM_RESPOND_XONXOFF 0x08 101 102#define InterruptTheCard(base) (outw(0,(base)+0xc)) 103#define ClearInterrupt(base) (inw((base)+0x0a)) 104 105#define BOARD(line) (((line) >> 4) & 0x3) 106#define MIN(a, b) ( (a) < (b) ? (a) : (b) ) 107 108 /* isi kill queue bitmap */ 109 110#define ISICOM_KILLTX 0x01 111#define ISICOM_KILLRX 0x02 112 113 /* isi_board status bitmap */ 114 115#define FIRMWARE_LOADED 0x0001 116#define BOARD_ACTIVE 0x0002 117 118 /* isi_port status bitmap */ 119 120#define ISI_CTS 0x1000 121#define ISI_DSR 0x2000 122#define ISI_RI 0x4000 123#define ISI_DCD 0x8000 124#define ISI_DTR 0x0100 125#define ISI_RTS 0x0200 126 127 128#define ISI_TXOK 0x0001 129 130struct isi_board { 131 unsigned short base; 132 unsigned char irq; 133 unsigned char port_count; 134 unsigned short status; 135 unsigned short port_status; /* each bit represents a single port */ 136 unsigned short shift_count; 137 struct isi_port * ports; 138 signed char count; 139 unsigned char isa; 140}; 141 142struct isi_port { 143 unsigned short magic; 144 unsigned int flags; 145 int count; 146 int blocked_open; 147 int close_delay; 148 unsigned short channel; 149 unsigned short status; 150 unsigned short closing_wait; 151 long session; 152 long pgrp; 153 struct isi_board * card; 154 struct tty_struct * tty; 155 wait_queue_head_t close_wait; 156 wait_queue_head_t open_wait; 157 struct tq_struct hangup_tq; 158 struct tq_struct bh_tqueue; 159 unsigned char * xmit_buf; 160 int xmit_head; 161 int xmit_tail; 162 int xmit_cnt; 163 struct termios normal_termios; 164 struct termios callout_termios; 165}; 166 167 168/* 169 * ISI Card specific ops ... 170 */ 171 172static inline void raise_dtr(struct isi_port * port) 173{ 174 struct isi_board * card = port->card; 175 unsigned short base = card->base; 176 unsigned char channel = port->channel; 177 short wait=400; 178 while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0)); 179 if (wait <= 0) { 180 printk(KERN_WARNING "ISICOM: Card found busy in raise_dtr.\n"); 181 return; 182 } 183#ifdef ISICOM_DEBUG_DTR_RTS 184 printk(KERN_DEBUG "ISICOM: raise_dtr.\n"); 185#endif 186 outw(0x8000 | (channel << card->shift_count) | 0x02 , base); 187 outw(0x0504, base); 188 InterruptTheCard(base); 189 port->status |= ISI_DTR; 190} 191 192static inline void drop_dtr(struct isi_port * port) 193{ 194 struct isi_board * card = port->card; 195 unsigned short base = card->base; 196 unsigned char channel = port->channel; 197 short wait=400; 198 while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0)); 199 if (wait <= 0) { 200 printk(KERN_WARNING "ISICOM: Card found busy in drop_dtr.\n"); 201 return; 202 } 203#ifdef ISICOM_DEBUG_DTR_RTS 204 printk(KERN_DEBUG "ISICOM: drop_dtr.\n"); 205#endif 206 outw(0x8000 | (channel << card->shift_count) | 0x02 , base); 207 outw(0x0404, base); 208 InterruptTheCard(base); 209 port->status &= ~ISI_DTR; 210} 211static inline void raise_rts(struct isi_port * port) 212{ 213 struct isi_board * card = port->card; 214 unsigned short base = card->base; 215 unsigned char channel = port->channel; 216 short wait=400; 217 while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0)); 218 if (wait <= 0) { 219 printk(KERN_WARNING "ISICOM: Card found busy in raise_rts.\n"); 220 return; 221 } 222#ifdef ISICOM_DEBUG_DTR_RTS 223 printk(KERN_DEBUG "ISICOM: raise_rts.\n"); 224#endif 225 outw(0x8000 | (channel << card->shift_count) | 0x02 , base); 226 outw(0x0a04, base); 227 InterruptTheCard(base); 228 port->status |= ISI_RTS; 229} 230static inline void drop_rts(struct isi_port * port) 231{ 232 struct isi_board * card = port->card; 233 unsigned short base = card->base; 234 unsigned char channel = port->channel; 235 short wait=400; 236 while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0)); 237 if (wait <= 0) { 238 printk(KERN_WARNING "ISICOM: Card found busy in drop_rts.\n"); 239 return; 240 } 241#ifdef ISICOM_DEBUG_DTR_RTS 242 printk(KERN_DEBUG "ISICOM: drop_rts.\n"); 243#endif 244 outw(0x8000 | (channel << card->shift_count) | 0x02 , base); 245 outw(0x0804, base); 246 InterruptTheCard(base); 247 port->status &= ~ISI_RTS; 248} 249static inline void raise_dtr_rts(struct isi_port * port) 250{ 251 struct isi_board * card = port->card; 252 unsigned short base = card->base; 253 unsigned char channel = port->channel; 254 short wait=400; 255 while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0)); 256 if (wait <= 0) { 257 printk(KERN_WARNING "ISICOM: Card found busy in raise_dtr_rts.\n"); 258 return; 259 } 260#ifdef ISICOM_DEBUG_DTR_RTS 261 printk(KERN_DEBUG "ISICOM: raise_dtr_rts.\n"); 262#endif 263 outw(0x8000 | (channel << card->shift_count) | 0x02 , base); 264 outw(0x0f04, base); 265 InterruptTheCard(base); 266 port->status |= (ISI_DTR | ISI_RTS); 267} 268static inline void drop_dtr_rts(struct isi_port * port) 269{ 270 struct isi_board * card = port->card; 271 unsigned short base = card->base; 272 unsigned char channel = port->channel; 273 short wait=400; 274 while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0)); 275 if (wait <= 0) { 276 printk(KERN_WARNING "ISICOM: Card found busy in drop_dtr_rts.\n"); 277 return; 278 } 279#ifdef ISICOM_DEBUG_DTR_RTS 280 printk(KERN_DEBUG "ISICOM: drop_dtr_rts.\n"); 281#endif 282 outw(0x8000 | (channel << card->shift_count) | 0x02 , base); 283 outw(0x0c04, base); 284 InterruptTheCard(base); 285 port->status &= ~(ISI_RTS | ISI_DTR); 286} 287 288static inline void kill_queue(struct isi_port * port, short queue) 289{ 290 struct isi_board * card = port->card; 291 unsigned short base = card->base; 292 unsigned char channel = port->channel; 293 short wait=400; 294 while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0)); 295 if (wait <= 0) { 296 printk(KERN_WARNING "ISICOM: Card found busy in kill_queue.\n"); 297 return; 298 } 299#ifdef ISICOM_DEBUG 300 printk(KERN_DEBUG "ISICOM: kill_queue 0x%x.\n", queue); 301#endif 302 outw(0x8000 | (channel << card->shift_count) | 0x02 , base); 303 outw((queue << 8) | 0x06, base); 304 InterruptTheCard(base); 305} 306 307#endif /* __KERNEL__ */ 308 309#endif /* ISICOM_H */ 310 311