summaryrefslogtreecommitdiff
path: root/drivers/net/irda/donauboe.h
blob: 36c3060411d28404de1454f57798979c2fb6e211 (plain)
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	controler		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 resemblence */
/* to the IrDA controller in the Toshiba RISC TMPR3922 chip      */
/* the documentation for this is freely available at             */
/* http://www.toshiba.com/taec/components/Generic/TMPR3922.shtml */
/* 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