1 /* $Id: scc.h,v 1.29 1997/04/02 14:56:45 jreuter Exp jreuter $ */ 2 3 #ifndef _SCC_H 4 #define _SCC_H 5 6 #include <linux/config.h> 7 8 /* selection of hardware types */ 9 10 #define PA0HZP 0x00 /* hardware type for PA0HZP SCC card and compatible */ 11 #define EAGLE 0x01 /* hardware type for EAGLE card */ 12 #define PC100 0x02 /* hardware type for PC100 card */ 13 #define PRIMUS 0x04 /* hardware type for PRIMUS-PC (DG9BL) card */ 14 #define DRSI 0x08 /* hardware type for DRSI PC*Packet card */ 15 #define BAYCOM 0x10 /* hardware type for BayCom (U)SCC */ 16 17 /* DEV ioctl() commands */ 18 19 enum SCC_ioctl_cmds { 20 SIOCSCCRESERVED = SIOCDEVPRIVATE, 21 SIOCSCCCFG, 22 SIOCSCCINI, 23 SIOCSCCCHANINI, 24 SIOCSCCSMEM, 25 SIOCSCCGKISS, 26 SIOCSCCSKISS, 27 SIOCSCCGSTAT, 28 SIOCSCCCAL 29 }; 30 31 /* Device parameter control (from WAMPES) */ 32 33 enum L1_params { 34 PARAM_DATA, 35 PARAM_TXDELAY, 36 PARAM_PERSIST, 37 PARAM_SLOTTIME, 38 PARAM_TXTAIL, 39 PARAM_FULLDUP, 40 PARAM_SOFTDCD, /* was: PARAM_HW */ 41 PARAM_MUTE, /* ??? */ 42 PARAM_DTR, 43 PARAM_RTS, 44 PARAM_SPEED, 45 PARAM_ENDDELAY, /* ??? */ 46 PARAM_GROUP, 47 PARAM_IDLE, 48 PARAM_MIN, 49 PARAM_MAXKEY, 50 PARAM_WAIT, 51 PARAM_MAXDEFER, 52 PARAM_TX, 53 PARAM_HWEVENT = 31, 54 PARAM_RETURN = 255 /* reset kiss mode */ 55 }; 56 57 /* fulldup parameter */ 58 59 enum FULLDUP_modes { 60 KISS_DUPLEX_HALF, /* normal CSMA operation */ 61 KISS_DUPLEX_FULL, /* fullduplex, key down trx after transmission */ 62 KISS_DUPLEX_LINK, /* fullduplex, key down trx after 'idletime' sec */ 63 KISS_DUPLEX_OPTIMA /* fullduplex, let the protocol layer control the hw */ 64 }; 65 66 /* misc. parameters */ 67 68 #define TIMER_OFF 65535U /* to switch off timers */ 69 #define NO_SUCH_PARAM 65534U /* param not implemented */ 70 71 /* HWEVENT parameter */ 72 73 enum HWEVENT_opts { 74 HWEV_DCD_ON, 75 HWEV_DCD_OFF, 76 HWEV_ALL_SENT 77 }; 78 79 /* channel grouping */ 80 81 #define RXGROUP 0100 /* if set, only tx when all channels clear */ 82 #define TXGROUP 0200 /* if set, don't transmit simultaneously */ 83 84 /* Tx/Rx clock sources */ 85 86 enum CLOCK_sources { 87 CLK_DPLL, /* normal halfduplex operation */ 88 CLK_EXTERNAL, /* external clocking (G3RUH/DF9IC modems) */ 89 CLK_DIVIDER, /* Rx = DPLL, Tx = divider (fullduplex with */ 90 /* modems without clock regeneration */ 91 CLK_BRG /* experimental fullduplex mode with DPLL/BRG for */ 92 /* MODEMs without clock recovery */ 93 }; 94 95 /* Tx state */ 96 97 enum TX_state { 98 TXS_IDLE, /* Transmitter off, no data pending */ 99 TXS_BUSY, /* waiting for permission to send / tailtime */ 100 TXS_ACTIVE, /* Transmitter on, sending data */ 101 TXS_NEWFRAME, /* reset CRC and send (next) frame */ 102 TXS_IDLE2, /* Transmitter on, no data pending */ 103 TXS_WAIT, /* Waiting for Mintime to expire */ 104 TXS_TIMEOUT /* We had a transmission timeout */ 105 }; 106 107 typedef unsigned long io_port; /* type definition for an 'io port address' */ 108 109 /* SCC statistical information */ 110 111 struct scc_stat { 112 long rxints; /* Receiver interrupts */ 113 long txints; /* Transmitter interrupts */ 114 long exints; /* External/status interrupts */ 115 long spints; /* Special receiver interrupts */ 116 117 long txframes; /* Packets sent */ 118 long rxframes; /* Number of Frames Actually Received */ 119 long rxerrs; /* CRC Errors */ 120 long txerrs; /* KISS errors */ 121 122 unsigned int nospace; /* "Out of buffers" */ 123 unsigned int rx_over; /* Receiver Overruns */ 124 unsigned int tx_under; /* Transmitter Underruns */ 125 126 unsigned int tx_state; /* Transmitter state */ 127 int tx_queued; /* tx frames enqueued */ 128 129 unsigned int maxqueue; /* allocated tx_buffers */ 130 unsigned int bufsize; /* used buffersize */ 131 }; 132 133 struct scc_modem { 134 long speed; /* Line speed, bps */ 135 char clocksrc; /* 0 = DPLL, 1 = external, 2 = divider */ 136 char nrz; /* NRZ instead of NRZI */ 137 }; 138 139 struct scc_kiss_cmd { 140 int command; /* one of the KISS-Commands defined above */ 141 unsigned param; /* KISS-Param */ 142 }; 143 144 struct scc_hw_config { 145 io_port data_a; /* data port channel A */ 146 io_port ctrl_a; /* control port channel A */ 147 io_port data_b; /* data port channel B */ 148 io_port ctrl_b; /* control port channel B */ 149 io_port vector_latch; /* INTACK-Latch (#) */ 150 io_port special; /* special function port */ 151 152 int irq; /* irq */ 153 long clock; /* clock */ 154 char option; /* command for function port */ 155 156 char brand; /* hardware type */ 157 char escc; /* use ext. features of a 8580/85180/85280 */ 158 }; 159 160 /* (#) only one INTACK latch allowed. */ 161 162 163 struct scc_mem_config { 164 unsigned int dummy; 165 unsigned int bufsize; 166 }; 167 168 struct scc_calibrate { 169 unsigned int time; 170 unsigned char pattern; 171 }; 172 173 #ifdef __KERNEL__ 174 175 enum {TX_OFF, TX_ON}; /* command for scc_key_trx() */ 176 177 /* Vector masks in RR2B */ 178 179 #define VECTOR_MASK 0x06 180 #define TXINT 0x00 181 #define EXINT 0x02 182 #define RXINT 0x04 183 #define SPINT 0x06 184 185 #ifdef CONFIG_SCC_DELAY 186 #define Inb(port) inb_p(port) 187 #define Outb(port, val) outb_p(val, port) 188 #else 189 #define Inb(port) inb(port) 190 #define Outb(port, val) outb(val, port) 191 #endif 192 193 /* SCC channel control structure for KISS */ 194 195 struct scc_kiss { 196 unsigned char txdelay; /* Transmit Delay 10 ms/cnt */ 197 unsigned char persist; /* Persistence (0-255) as a % */ 198 unsigned char slottime; /* Delay to wait on persistence hit */ 199 unsigned char tailtime; /* Delay after last byte written */ 200 unsigned char fulldup; /* Full Duplex mode 0=CSMA 1=DUP 2=ALWAYS KEYED */ 201 unsigned char waittime; /* Waittime before any transmit attempt */ 202 unsigned int maxkeyup; /* Maximum time to transmit (seconds) */ 203 unsigned int mintime; /* Minimal offtime after MAXKEYUP timeout (seconds) */ 204 unsigned int idletime; /* Maximum idle time in ALWAYS KEYED mode (seconds) */ 205 unsigned int maxdefer; /* Timer for CSMA channel busy limit */ 206 unsigned char tx_inhibit; /* Transmit is not allowed when set */ 207 unsigned char group; /* Group ID for AX.25 TX interlocking */ 208 unsigned char mode; /* 'normal' or 'hwctrl' mode (unused) */ 209 unsigned char softdcd; /* Use DPLL instead of DCD pin for carrier detect */ 210 }; 211 212 213 /* SCC channel structure */ 214 215 struct scc_channel { 216 int init; /* channel exists? */ 217 218 struct net_device *dev; /* link to device control structure */ 219 struct net_device_stats dev_stat;/* device statistics */ 220 221 char brand; /* manufacturer of the board */ 222 long clock; /* used clock */ 223 224 io_port ctrl; /* I/O address of CONTROL register */ 225 io_port data; /* I/O address of DATA register */ 226 io_port special; /* I/O address of special function port */ 227 int irq; /* Number of Interrupt */ 228 229 char option; 230 char enhanced; /* Enhanced SCC support */ 231 232 unsigned char wreg[16]; /* Copy of last written value in WRx */ 233 unsigned char status; /* Copy of R0 at last external interrupt */ 234 unsigned char dcd; /* DCD status */ 235 236 struct scc_kiss kiss; /* control structure for KISS params */ 237 struct scc_stat stat; /* statistical information */ 238 struct scc_modem modem; /* modem information */ 239 240 struct sk_buff_head tx_queue; /* next tx buffer */ 241 struct sk_buff *rx_buff; /* pointer to frame currently received */ 242 struct sk_buff *tx_buff; /* pointer to frame currently transmitted */ 243 244 /* Timer */ 245 struct timer_list tx_t; /* tx timer for this channel */ 246 struct timer_list tx_wdog; /* tx watchdogs */ 247 }; 248 249 #endif /* defined(__KERNEL__) */ 250 #endif /* defined(_SCC_H) */ 251