Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 | /********************************************************************* * * Filename: toshoboe.h * Version: 2.16 * Description: Driver for the Toshiba OBOE (or type-O or 701) * FIR Chipset, also supports the DONAUOBOE (type-DO * or d01) FIR chipset which as far as I know is * register compatible. * Status: Experimental. * Author: James McKenzie <james@fishsoup.dhs.org> * Created at: Sat May 8 12:35:27 1999 * Modified: 2.16 Martin Lucina <mato@kotelna.sk> * Modified: 2.16 Sat Jun 22 18:54:29 2002 (sync headers) * Modified: 2.17 Christian Gennerat <christian.gennerat@polytechnique.org> * Modified: 2.17 jeu sep 12 08:50:20 2002 (add lock to be used by spinlocks) * * Copyright (c) 1999 James McKenzie, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * Neither James McKenzie nor Cambridge University admit liability nor * provide warranty for any of this software. This material is * provided "AS-IS" and at no charge. * * Applicable Models : Libretto 100/110CT and many more. * Toshiba refers to this chip as the type-O IR port, * or the type-DO IR port. * * IrDA chip set list from Toshiba Computer Engineering Corp. * model method maker controller Version * Portege 320CT FIR,SIR Toshiba Oboe(Triangle) * Portege 3010CT FIR,SIR Toshiba Oboe(Sydney) * Portege 3015CT FIR,SIR Toshiba Oboe(Sydney) * Portege 3020CT FIR,SIR Toshiba Oboe(Sydney) * Portege 7020CT FIR,SIR ? ? * * Satell. 4090XCDT FIR,SIR ? ? * * Libretto 100CT FIR,SIR Toshiba Oboe * Libretto 1000CT FIR,SIR Toshiba Oboe * * TECRA750DVD FIR,SIR Toshiba Oboe(Triangle) REV ID=14h * TECRA780 FIR,SIR Toshiba Oboe(Sandlot) REV ID=32h,33h * TECRA750CDT FIR,SIR Toshiba Oboe(Triangle) REV ID=13h,14h * TECRA8000 FIR,SIR Toshiba Oboe(ISKUR) REV ID=23h * ********************************************************************/ /* The documentation for this chip is allegedly released */ /* However I have not seen it, not have I managed to contact */ /* anyone who has. HOWEVER the chip bears a striking resemblance */ /* to the IrDA controller in the Toshiba RISC TMPR3922 chip */ /* the documentation for this is freely available at */ /* http://www.madingley.org/james/resources/toshoboe/TMPR3922.pdf */ /* The mapping between the registers in that document and the */ /* Registers in the 701 oboe chip are as follows */ /* 3922 reg 701 regs, by bit numbers */ /* 7- 0 15- 8 24-16 31-25 */ /* $28 0x0 0x1 */ /* $2c SEE NOTE 1 */ /* $30 0x6 0x7 */ /* $34 0x8 0x9 SEE NOTE 2 */ /* $38 0x10 0x11 */ /* $3C 0xe SEE NOTE 3 */ /* $40 0x12 0x13 */ /* $44 0x14 0x15 */ /* $48 0x16 0x17 */ /* $4c 0x18 0x19 */ /* $50 0x1a 0x1b */ /* FIXME: could be 0x1b 0x1a here */ /* $54 0x1d 0x1c */ /* $5C 0xf SEE NOTE 4 */ /* $130 SEE NOTE 5 */ /* $134 SEE NOTE 6 */ /* */ /* NOTES: */ /* 1. The pointer to ring is packed in most unceremoniusly */ /* 701 Register Address bits (A9-A0 must be zero) */ /* 0x4: A17 A16 A15 A14 A13 A12 A11 A10 */ /* 0x5: A25 A24 A23 A22 A21 A20 A19 A18 */ /* 0x2: 0 0 A31 A30 A29 A28 A27 A26 */ /* */ /* 2. The M$ drivers do a write 0x1 to 0x9, however the 3922 */ /* documentation would suggest that a write of 0x1 to 0x8 */ /* would be more appropriate. */ /* */ /* 3. This assignment is tenuous at best, register 0xe seems to */ /* have bits arranged 0 0 0 R/W R/W R/W R/W R/W */ /* if either of the lower two bits are set the chip seems to */ /* switch off */ /* */ /* 4. Bits 7-4 seem to be different 4 seems just to be generic */ /* receiver busy flag */ /* */ /* 5. and 6. The IER and ISR have a different bit assignment */ /* The lower three bits of both read back as ones */ /* ISR is register 0xc, IER is register 0xd */ /* 7 6 5 4 3 2 1 0 */ /* 0xc: TxDone RxDone TxUndr RxOver SipRcv 1 1 1 */ /* 0xd: TxDone RxDone TxUndr RxOver SipRcv 1 1 1 */ /* TxDone xmitt done (generated only if generate interrupt bit */ /* is set in the ring) */ /* RxDone recv completed (or other recv condition if you set it */ /* up */ /* TxUnder underflow in Transmit FIFO */ /* RxOver overflow in Recv FIFO */ /* SipRcv received serial gap (or other condition you set) */ /* Interrupts are enabled by writing a one to the IER register */ /* Interrupts are cleared by writing a one to the ISR register */ /* */ /* 6. The remaining registers: 0x6 and 0x3 appear to be */ /* reserved parts of 16 or 32 bit registersthe remainder */ /* 0xa 0xb 0x1e 0x1f could possibly be (by their behaviour) */ /* the Unicast Filter register at $58. */ /* */ /* 7. While the core obviously expects 32 bit accesses all the */ /* M$ drivers do 8 bit accesses, infact the Miniport ones */ /* write and read back the byte serveral times (why?) */ #ifndef TOSHOBOE_H #define TOSHOBOE_H /* Registers */ #define OBOE_IO_EXTENT 0x1f /*Receive and transmit slot pointers */ #define OBOE_REG(i) (i+(self->base)) #define OBOE_RXSLOT OBOE_REG(0x0) #define OBOE_TXSLOT OBOE_REG(0x1) #define OBOE_SLOT_MASK 0x3f #define OBOE_TXRING_OFFSET 0x200 #define OBOE_TXRING_OFFSET_IN_SLOTS 0x40 /*pointer to the ring */ #define OBOE_RING_BASE0 OBOE_REG(0x4) #define OBOE_RING_BASE1 OBOE_REG(0x5) #define OBOE_RING_BASE2 OBOE_REG(0x2) #define OBOE_RING_BASE3 OBOE_REG(0x3) /*Number of slots in the ring */ #define OBOE_RING_SIZE OBOE_REG(0x7) #define OBOE_RING_SIZE_RX4 0x00 #define OBOE_RING_SIZE_RX8 0x01 #define OBOE_RING_SIZE_RX16 0x03 #define OBOE_RING_SIZE_RX32 0x07 #define OBOE_RING_SIZE_RX64 0x0f #define OBOE_RING_SIZE_TX4 0x00 #define OBOE_RING_SIZE_TX8 0x10 #define OBOE_RING_SIZE_TX16 0x30 #define OBOE_RING_SIZE_TX32 0x70 #define OBOE_RING_SIZE_TX64 0xf0 #define OBOE_RING_MAX_SIZE 64 /*Causes the gubbins to re-examine the ring */ #define OBOE_PROMPT OBOE_REG(0x9) #define OBOE_PROMPT_BIT 0x1 /* Interrupt Status Register */ #define OBOE_ISR OBOE_REG(0xc) /* Interrupt Enable Register */ #define OBOE_IER OBOE_REG(0xd) /* Interrupt bits for IER and ISR */ #define OBOE_INT_TXDONE 0x80 #define OBOE_INT_RXDONE 0x40 #define OBOE_INT_TXUNDER 0x20 #define OBOE_INT_RXOVER 0x10 #define OBOE_INT_SIP 0x08 #define OBOE_INT_MASK 0xf8 /*Reset Register */ #define OBOE_CONFIG1 OBOE_REG(0xe) #define OBOE_CONFIG1_RST 0x01 #define OBOE_CONFIG1_DISABLE 0x02 #define OBOE_CONFIG1_4 0x08 #define OBOE_CONFIG1_8 0x08 #define OBOE_CONFIG1_ON 0x8 #define OBOE_CONFIG1_RESET 0xf #define OBOE_CONFIG1_OFF 0xe #define OBOE_STATUS OBOE_REG(0xf) #define OBOE_STATUS_RXBUSY 0x10 #define OBOE_STATUS_FIRRX 0x04 #define OBOE_STATUS_MIRRX 0x02 #define OBOE_STATUS_SIRRX 0x01 /*Speed control registers */ #define OBOE_CONFIG0L OBOE_REG(0x10) #define OBOE_CONFIG0H OBOE_REG(0x11) #define OBOE_CONFIG0H_TXONLOOP 0x80 /*Transmit when looping (dangerous) */ #define OBOE_CONFIG0H_LOOP 0x40 /*Loopback Tx->Rx */ #define OBOE_CONFIG0H_ENTX 0x10 /*Enable Tx */ #define OBOE_CONFIG0H_ENRX 0x08 /*Enable Rx */ #define OBOE_CONFIG0H_ENDMAC 0x04 /*Enable/reset* the DMA controller */ #define OBOE_CONFIG0H_RCVANY 0x02 /*DMA mode 1=bytes, 0=dwords */ #define OBOE_CONFIG0L_CRC16 0x80 /*CRC 1=16 bit 0=32 bit */ #define OBOE_CONFIG0L_ENFIR 0x40 /*Enable FIR */ #define OBOE_CONFIG0L_ENMIR 0x20 /*Enable MIR */ #define OBOE_CONFIG0L_ENSIR 0x10 /*Enable SIR */ #define OBOE_CONFIG0L_ENSIRF 0x08 /*Enable SIR framer */ #define OBOE_CONFIG0L_SIRTEST 0x04 /*Enable SIR framer in MIR and FIR */ #define OBOE_CONFIG0L_INVERTTX 0x02 /*Invert Tx Line */ #define OBOE_CONFIG0L_INVERTRX 0x01 /*Invert Rx Line */ #define OBOE_BOF OBOE_REG(0x12) #define OBOE_EOF OBOE_REG(0x13) #define OBOE_ENABLEL OBOE_REG(0x14) #define OBOE_ENABLEH OBOE_REG(0x15) #define OBOE_ENABLEH_PHYANDCLOCK 0x80 /*Toggle low to copy config in */ #define OBOE_ENABLEH_CONFIGERR 0x40 #define OBOE_ENABLEH_FIRON 0x20 #define OBOE_ENABLEH_MIRON 0x10 #define OBOE_ENABLEH_SIRON 0x08 #define OBOE_ENABLEH_ENTX 0x04 #define OBOE_ENABLEH_ENRX 0x02 #define OBOE_ENABLEH_CRC16 0x01 #define OBOE_ENABLEL_BROADCAST 0x01 #define OBOE_CURR_PCONFIGL OBOE_REG(0x16) /*Current config */ #define OBOE_CURR_PCONFIGH OBOE_REG(0x17) #define OBOE_NEW_PCONFIGL OBOE_REG(0x18) #define OBOE_NEW_PCONFIGH OBOE_REG(0x19) #define OBOE_PCONFIGH_BAUDMASK 0xfc #define OBOE_PCONFIGH_WIDTHMASK 0x04 #define OBOE_PCONFIGL_WIDTHMASK 0xe0 #define OBOE_PCONFIGL_PREAMBLEMASK 0x1f #define OBOE_PCONFIG_BAUDMASK 0xfc00 #define OBOE_PCONFIG_BAUDSHIFT 10 #define OBOE_PCONFIG_WIDTHMASK 0x04e0 #define OBOE_PCONFIG_WIDTHSHIFT 5 #define OBOE_PCONFIG_PREAMBLEMASK 0x001f #define OBOE_PCONFIG_PREAMBLESHIFT 0 #define OBOE_MAXLENL OBOE_REG(0x1a) #define OBOE_MAXLENH OBOE_REG(0x1b) #define OBOE_RXCOUNTH OBOE_REG(0x1c) /*Reset on recipt */ #define OBOE_RXCOUNTL OBOE_REG(0x1d) /*of whole packet */ /* The PCI ID of the OBOE chip */ #ifndef PCI_DEVICE_ID_FIR701 #define PCI_DEVICE_ID_FIR701 0x0701 #endif #ifndef PCI_DEVICE_ID_FIRD01 #define PCI_DEVICE_ID_FIRD01 0x0d01 #endif struct OboeSlot { __u16 len; /*Tweleve bits of packet length */ __u8 unused; __u8 control; /*Slot control/status see below */ __u32 address; /*Slot buffer address */ } __packed; #define OBOE_NTASKS OBOE_TXRING_OFFSET_IN_SLOTS struct OboeRing { struct OboeSlot rx[OBOE_NTASKS]; struct OboeSlot tx[OBOE_NTASKS]; }; #define OBOE_RING_LEN (sizeof(struct OboeRing)) #define OBOE_CTL_TX_HW_OWNS 0x80 /*W/R This slot owned by the hardware */ #define OBOE_CTL_TX_DISTX_CRC 0x40 /*W Disable CRC generation for [FM]IR */ #define OBOE_CTL_TX_BAD_CRC 0x20 /*W Generate bad CRC */ #define OBOE_CTL_TX_SIP 0x10 /*W Generate an SIP after xmittion */ #define OBOE_CTL_TX_MKUNDER 0x08 /*W Generate an underrun error */ #define OBOE_CTL_TX_RTCENTX 0x04 /*W Enable receiver and generate TXdone */ /* After this slot is processed */ #define OBOE_CTL_TX_UNDER 0x01 /*R Set by hardware to indicate underrun */ #define OBOE_CTL_RX_HW_OWNS 0x80 /*W/R This slot owned by hardware */ #define OBOE_CTL_RX_PHYERR 0x40 /*R Decoder error on receiption */ #define OBOE_CTL_RX_CRCERR 0x20 /*R CRC error only set for [FM]IR */ #define OBOE_CTL_RX_LENGTH 0x10 /*R Packet > max Rx length */ #define OBOE_CTL_RX_OVER 0x08 /*R set to indicate an overflow */ #define OBOE_CTL_RX_SIRBAD 0x04 /*R SIR had BOF in packet or ABORT sequence */ #define OBOE_CTL_RX_RXEOF 0x02 /*R Finished receiving on this slot */ struct toshoboe_cb { struct net_device *netdev; /* Yes! we are some kind of netdevice */ struct tty_driver ttydev; struct irlap_cb *irlap; /* The link layer we are binded to */ chipio_t io; /* IrDA controller information */ struct qos_info qos; /* QoS capabilities for this device */ __u32 flags; /* Interface flags */ struct pci_dev *pdev; /*PCI device */ int base; /*IO base */ int txpending; /*how many tx's are pending */ int txs, rxs; /*Which slots are we at */ int irdad; /*Driver under control of netdev end */ int async; /*Driver under control of async end */ int stopped; /*Stopped by some or other APM stuff */ int filter; /*In SIR mode do we want to receive frames or byte ranges */ void *ringbuf; /*The ring buffer */ struct OboeRing *ring; /*The ring */ void *tx_bufs[OBOE_RING_MAX_SIZE]; /*The buffers */ void *rx_bufs[OBOE_RING_MAX_SIZE]; int speed; /*Current setting of the speed */ int new_speed; /*Set to request a speed change */ /* The spinlock protect critical parts of the driver. * Locking is done like this : * spin_lock_irqsave(&self->spinlock, flags); * Releasing the lock : * spin_unlock_irqrestore(&self->spinlock, flags); */ spinlock_t spinlock; /* Used for the probe and diagnostics code */ int int_rx; int int_tx; int int_txunder; int int_rxover; int int_sip; }; #endif |