1 /* lanai.c -- Copyright 1999 by Mitchell Blank Jr <mitch@sfgoth.com>
2 *
3 * This program is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU General Public License
5 * as published by the Free Software Foundation; either version
6 * 2 of the License, or (at your option) any later version.
7 *
8 * This driver supports ATM cards based on the Efficient "Lanai"
9 * chipset such as the Speedstream 3010 and the ENI-25p. The
10 * Speedstream 3060 is currently not supported since we don't
11 * have the code to drive the on-board Alcatel DSL chipset (yet).
12 *
13 * Thanks to Efficient for supporting this project with hardware,
14 * documentation, and by answering my questions.
15 *
16 * Things not working yet:
17 *
18 * o We're only set up to compile as a module currently. i.e.
19 * you should put the source in drivers/atm/lanai.c and then
20 * just do "make drivers/atm/lanai.o" from the main
21 * source directory. This will produce a drivers/atm/lanai.o
22 * file suitable for insmod'ing
23 *
24 * o We don't support the Speedstream 3060 yet - this card has
25 * an on-board DSL modem chip by Alcatel and the driver will
26 * need some extra code added to handle it
27 *
28 * o Note that due to limitations of the Lanai only one VCC can be
29 * in CBR at once
30 *
31 * o We don't currently parse the EEPROM at all. The code is all
32 * there as per the spec, but it doesn't actually work. I think
33 * there may be some issues with the docs. Anyway, do NOT
34 * enable it yet - bugs in that code may actually damage your
35 * hardware! Because of this you should hardware an ESI before
36 * trying to use this in a LANE or MPOA environment.
37 *
38 * o AAL0 is stubbed in but the actual rx/tx path isn't written yet:
39 * vcc_tx_aal0() needs to send or queue a SKB
40 * vcc_tx_unqueue_aal0() needs to attempt to send queued SKBs
41 * vcc_rx_aal0() needs to handle AAL0 interrupts
42 * This isn't too much work - I just wanted to get other things
43 * done first.
44 *
45 * o lanai_change_qos() isn't written yet
46 *
47 * o There aren't any ioctl's yet -- I'd like to eventually support
48 * setting loopback and LED modes that way. (see lanai_ioctl)
49 *
50 * o If the segmentation engine or DMA gets shut down we should restart
51 * card as per section 17.0i. (see lanai_reset)
52 *
53 * o setsockopt(SO_CIRANGE) isn't done (although despite what the
54 * API says it isn't exactly commonly implemented)
55 */
56
57 /* Version history:
58 * v.0.02 -- 11-JAN-2000 -- Endian fixes
59 * v.0.01 -- 30-NOV-1999 -- Initial release
60 */
61
62 #include <linux/module.h>
63 #include <linux/mm.h>
64 #include <linux/atmdev.h>
65 #include <asm/io.h>
66 #include <asm/byteorder.h>
67 #include <linux/spinlock.h>
68 #include <linux/pci.h>
69 #include <linux/init.h>
70 #include <linux/delay.h>
71 #include <linux/interrupt.h>
72
73 #ifndef PCI_VENDOR_ID_EF_ATM_LANAI2
74 /* These need to eventually go into <linux/pci.h> - they're here for now */
75 #define PCI_VENDOR_ID_EF_ATM_LANAI2 0x0003
76 #define PCI_VENDOR_ID_EF_ATM_LANAIHB 0x0005
77 #endif
78
79 /* -------------------- TUNABLE PARAMATERS: */
80
81 /*
82 * Maximum number of VCIs per card. Setting it lower could theoretically
83 * save some memory, but since we allocate our vcc list with get_free_pages,
84 * it's not really likely for most architectures
85 */
86 #define NUM_VCI (1024)
87
88 /*
89 * Enable extra debugging
90 */
91 #define DEBUG
92 /*
93 * Debug _all_ register operations with card, except the memory test.
94 * Also disables the timed poll to prevent extra chattiness. This
95 * isn't for normal use
96 */
97 #undef DEBUG_RW
98
99 /*
100 * The programming guide specifies a full test of the on-board SRAM
101 * at initialization time. Undefine to remove this
102 */
103 #define FULL_MEMORY_TEST
104
105 /*
106 * This is the number of (4 byte) service entries that we will
107 * try to allocate at startup. Note that we will end up with
108 * one PAGE_SIZE's worth regardless of what this is set to
109 */
110 #define SERVICE_ENTRIES (1024)
111 /* TODO: make above a module load-time option */
112
113 /*
114 * We normally read the onboard EEPROM in order to discover our MAC
115 * address. Undefine to _not_ do this
116 */
117 /* #define READ_EEPROM */ /* ***DONT ENABLE YET*** */
118 /* TODO: make above a module load-time option (also) */
119
120 /*
121 * Depth of TX fifo (in 128 byte units; range 2-31)
122 * Smaller numbers are better for network latency
123 * Larger numbers are better for PCI latency
124 * I'm really sure where the best tradeoff is, but the BSD driver uses
125 * 7 and it seems to work ok.
126 */
127 #define TX_FIFO_DEPTH (7)
128 /* TODO: make above a module load-time option */
129
130 /*
131 * How often (in jiffies) we will try to unstick stuck connections -
132 * shouldn't need to happen much
133 */
134 #define LANAI_POLL_PERIOD (10*HZ)
135 /* TODO: make above a module load-time option */
136
137 /*
138 * When allocating an AAL5 receiving buffer, try to make it at least
139 * large enough to hold this many max_sdu sized PDUs
140 */
141 #define AAL5_RX_MULTIPLIER (3)
142 /* TODO: make above a module load-time option */
143
144 /*
145 * Same for transmitting buffer
146 */
147 #define AAL5_TX_MULTIPLIER (3)
148 /* TODO: make above a module load-time option */
149
150 /*
151 * When allocating an AAL0 transmiting buffer, how many cells should fit.
152 * Remember we'll end up with a PAGE_SIZE of them anyway, so this isn't
153 * really critical
154 */
155 #define AAL0_TX_MULTIPLIER (40)
156 /* TODO: make above a module load-time option */
157
158 /*
159 * How large should we make the AAL0 receiving buffer. Remember that this
160 * is shared between all AAL0 VC's
161 */
162 #define AAL0_RX_BUFFER_SIZE (PAGE_SIZE)
163 /* TODO: make above a module load-time option */
164
165 /*
166 * Should we use Lanai's "powerdown" feature when no vcc's are bound?
167 */
168 /* #define USE_POWERDOWN */
169 /* TODO: make above a module load-time option (also) */
170
171 /* -------------------- DEBUGGING AIDS: */
172
173 #define DEV_LABEL "lanai"
174
175 #ifdef DEBUG
176
177 #define DPRINTK(format, args...) \
178 printk(KERN_DEBUG DEV_LABEL ": " format, ##args)
179 #define APRINTK(truth, format, args...) \
180 do { \
181 if (!(truth)) \
182 printk(KERN_ERR DEV_LABEL ": " format, ##args); \
183 } while (0)
184
185 #else /* !DEBUG */
186
187 #define DPRINTK(format, args...)
188 #define APRINTK(truth, format, args...)
189
190 #endif /* DEBUG */
191
192 #ifdef DEBUG_RW
193 #define RWDEBUG(format, args...) \
194 printk(KERN_DEBUG DEV_LABEL ": " format, ##args)
195 #else /* !DEBUG_RW */
196 #define RWDEBUG(format, args...)
197 #endif
198
199 /* -------------------- DATA DEFINITIONS: */
200
201 #define LANAI_MAPPING_SIZE (0x40000)
202 #define LANAI_EEPROM_SIZE (128)
203
204 typedef int vci_t;
205 typedef unsigned long bus_addr_t;
206
207 /* A bitfield large enough for NUM_VCI */
208 #define VCI_BITFIELD_NELEM ((NUM_VCI + BITS_PER_LONG - 1) / BITS_PER_LONG)
209 typedef struct {
210 unsigned long ul[VCI_BITFIELD_NELEM];
211 } vci_bitfield;
212
213 /* DMA buffer in host memory for TX, RX, or service list. */
214 struct lanai_buffer {
215 u32 *start; /* From get_free_pages */
216 u32 *end; /* One past last byte */
217 u32 *ptr; /* Pointer to current host location */
218 int order; /* log2(size/PAGE_SIZE) */
219 };
220
221 struct lanai_vcc_stats {
222 unsigned rx_nomem;
223 union {
224 struct {
225 unsigned rx_badlen;
226 unsigned service_trash;
227 unsigned service_stream;
228 unsigned service_rxcrc;
229 } aal5;
230 struct {
231 } aal0;
232 } x;
233 };
234
235 struct lanai_dev; /* Forward declaration */
236
237 /*
238 * This is the card-specific per-vcc data. Note that unlike some other
239 * drivers there is NOT a 1-to-1 correspondance between these and
240 * atm_vcc's - each one of these represents an actual 2-way vcc, but
241 * an atm_vcc can be 1-way and share with a 1-way vcc in the other
242 * direction. To make it weirder, there can even be 0-way vccs
243 * bound to us, waiting to do a change_qos
244 */
245 struct lanai_vcc {
246 bus_addr_t vbase; /* Base of VCC's registers */
247 struct lanai_vcc_stats stats;
248 int nref; /* # of atm_vcc's who reference us */
249 vci_t vci;
250 struct {
251 struct lanai_buffer buf;
252 struct atm_vcc *atmvcc; /* atm_vcc who is receiver */
253 } rx;
254 struct {
255 struct lanai_buffer buf;
256 struct atm_vcc *atmvcc; /* atm_vcc who is transmitter */
257 int endptr; /* last endptr from service entry */
258 struct sk_buff_head backlog;
259 struct sk_buff *inprogress; /* We're streaming this PDU */
260 unsigned char *pptr; /* Where we are in above */
261 int inprogleft; /* Bytes left to send "inprogress" */
262 void (*unqueue)(struct lanai_dev *, struct lanai_vcc *, int);
263 } tx;
264 };
265
266 enum lanai_type {
267 lanai2 = PCI_VENDOR_ID_EF_ATM_LANAI2,
268 lanaihb = PCI_VENDOR_ID_EF_ATM_LANAIHB
269 };
270
271 struct lanai_dev_stats {
272 unsigned ovfl_trash; /* # of cells dropped - buffer overflow */
273 unsigned vci_trash; /* # of cells dropped - closed vci */
274 unsigned hec_err; /* # of cells dropped - bad HEC */
275 unsigned atm_ovfl; /* # of cells dropped - rx fifo overflow */
276 unsigned pcierr_parity_detect;
277 unsigned pcierr_serr_set;
278 unsigned pcierr_master_abort;
279 unsigned pcierr_m_target_abort;
280 unsigned pcierr_s_target_abort;
281 unsigned pcierr_master_parity;
282 unsigned service_novcc_rx;
283 unsigned service_novcc_tx;
284 unsigned service_notx;
285 unsigned service_norx;
286 unsigned service_rxnotaal5;
287 unsigned dma_reenable;
288 unsigned card_reset;
289 };
290
291 struct lanai_dev {
292 bus_addr_t base;
293 struct lanai_dev_stats stats;
294 struct lanai_buffer service;
295 struct lanai_vcc **vccs;
296 #ifdef USE_POWERDOWN
297 int nbound; /* number of bound vccs */
298 #endif
299 enum lanai_type type;
300 vci_t num_vci; /* Currently just NUM_VCI */
301 u8 eeprom[LANAI_EEPROM_SIZE];
302 u32 serialno, magicno;
303 struct pci_dev *pci;
304 vci_bitfield backlog_vccs; /* VCCs that are backlogged */
305 vci_bitfield transmit_ready; /* VCCs that have transmit space */
306 struct timer_list timer;
307 int naal0;
308 struct lanai_buffer aal0buf; /* AAL0 RX buffers */
309 u32 conf1, conf2; /* CONFIG[12] registers */
310 u32 status; /* STATUS register */
311 spinlock_t txlock;
312 spinlock_t servicelock;
313 struct atm_vcc *cbrvcc;
314 int number;
315 int board_rev;
316 u8 pci_revision;
317 /* TODO - look at race conditions with maintence of conf1/conf2 */
318 /* TODO - transmit locking: should we use _irq not _irqsave? */
319 /* TODO - organize above in some rational fashion (see <asm/cache.h>) */
320 };
321
322 /* -------------------- VCI_BITFIELD UTILITIES: */
323
324 /*
325 * These functions assume that BITS_PER_LONG is a power of two, which
326 * should be safe
327 */
328 #if (BITS_PER_LONG & (BITS_PER_LONG - 1))
329 #error lanai driver requires type long to have a power of two number of bits
330 #endif
331
332 /*
333 * In vci_bitfield_{set,clear} we do the operation in three
334 * parts to ensure that gcc doesn't cast anything down to
335 * 32 bits (and then sign extend them later) on 64-bit
336 * platforms like the alpha
337 */
vci_bitfield_set(vci_bitfield * bf,vci_t vci)338 static inline void vci_bitfield_set(vci_bitfield *bf, vci_t vci)
339 {
340 unsigned long bit = 1;
341 bit <<= (unsigned long) (vci & (BITS_PER_LONG - 1));
342 bf->ul[vci / BITS_PER_LONG] |= bit;
343 }
344
vci_bitfield_clear(vci_bitfield * bf,vci_t vci)345 static inline void vci_bitfield_clear(vci_bitfield *bf, vci_t vci)
346 {
347 unsigned long bit = 1;
348 bit <<= (unsigned long) (vci & (BITS_PER_LONG - 1));
349 bf->ul[vci / BITS_PER_LONG] &= ~bit;
350 }
351
vci_bitfield_init(vci_bitfield * bf)352 static inline void vci_bitfield_init(vci_bitfield *bf)
353 {
354 memset(bf, 0, sizeof(*bf));
355 }
356
vci_bitfield_iterate(struct lanai_dev * lanai,const vci_bitfield * bf,void (* func)(struct lanai_dev *,vci_t vci))357 static void vci_bitfield_iterate(struct lanai_dev *lanai,
358 const vci_bitfield *bf, void (*func)(struct lanai_dev *,vci_t vci))
359 {
360 vci_t vci;
361 unsigned long mask;
362 const unsigned long *lp = &(bf->ul[0]);
363 for (vci = 0; vci < NUM_VCI; lp++)
364 if (*lp == 0)
365 vci += BITS_PER_LONG;
366 else
367 for (mask = 1; mask != 0; mask <<= 1, vci++)
368 if (*lp & mask)
369 func(lanai, vci);
370 }
371
372 /* -------------------- BUFFER UTILITIES: */
373
374 /*
375 * Lanai needs DMA buffers aligned to 256 bytes of at least 1024 bytes -
376 * we assume that any page allocation will do. I'm sure this is
377 * never going to be a problem, but it's good to document assumtions
378 */
379 #if PAGE_SIZE < 1024
380 #error PAGE_SIZE too small to support LANAI chipset
381 #endif
382 /*
383 * We also assume that the maximum buffer size will be some number
384 * of whole pages, although that wouldn't be too hard to fix
385 */
386 #if PAGE_SIZE > (128 * 1024)
387 #error PAGE_SIZE too large to support LANAI chipset
388 #endif
389
390 /* Convert a size to "order" for __get_free_pages */
bytes_to_order(int bytes)391 static int bytes_to_order(int bytes)
392 {
393 int order = 0;
394 if (bytes > (128 * 1024))
395 bytes = 128 * 1024; /* Max buffer size for lanai */
396 while ((PAGE_SIZE << order) < bytes)
397 order++;
398 return order;
399 }
400
401 /*
402 * Allocate a buffer in host RAM for service list, RX, or TX
403 * Returns buf->order<0 if no memory
404 * Note that the size will be rounded up to an "order" of pages, and
405 * if we can't allocate that we'll settle for something smaller
406 * until minbytes
407 *
408 * NOTE: buffer must be 32-bit DMA capable - when linux can
409 * make distinction, this will need tweaking for this
410 * to work on BIG memory machines.
411 */
lanai_buf_allocate(struct lanai_buffer * buf,int bytes,int minbytes)412 static void lanai_buf_allocate(struct lanai_buffer *buf,
413 int bytes, int minbytes)
414 {
415 unsigned long address;
416 int order = bytes_to_order(bytes);
417 do {
418 address = __get_free_pages(GFP_KERNEL, order);
419 if (address != 0) { /* Success */
420 bytes = PAGE_SIZE << order;
421 buf->start = buf->ptr = (u32 *) address;
422 buf->end = (u32 *) (address + bytes);
423 memset((void *) address, 0, bytes);
424 break;
425 }
426 if ((PAGE_SIZE << --order) < minbytes)
427 order = -1; /* Too small - give up */
428 } while (order >= 0);
429 buf->order = order;
430 }
431
lanai_buf_deallocate(struct lanai_buffer * buf)432 static inline void lanai_buf_deallocate(struct lanai_buffer *buf)
433 {
434 if (buf->order >= 0) {
435 APRINTK(buf->start != 0, "lanai_buf_deallocate: start==0!\n");
436 free_pages((unsigned long) buf->start, buf->order);
437 buf->start = buf->end = buf->ptr = 0;
438 }
439 }
440
441 /* size of buffer in bytes */
lanai_buf_size(const struct lanai_buffer * buf)442 static inline int lanai_buf_size(const struct lanai_buffer *buf)
443 {
444 return ((unsigned long) buf->end) - ((unsigned long) buf->start);
445 }
446
447 /* size of buffer as "card order" (0=1k .. 7=128k) */
lanai_buf_size_cardorder(const struct lanai_buffer * buf)448 static inline int lanai_buf_size_cardorder(const struct lanai_buffer *buf)
449 {
450 return buf->order + PAGE_SHIFT - 10;
451 }
452
453 /* DMA-able address for this buffer */
lanai_buf_dmaaddr(const struct lanai_buffer * buf)454 static unsigned long lanai_buf_dmaaddr(const struct lanai_buffer *buf)
455 {
456 unsigned long r = virt_to_bus(buf->start);
457 APRINTK((r & ~0xFFFFFF00) == 0, "bad dmaaddr: 0x%lx\n", (long) r);
458 return r;
459 }
460
461 /* -------------------- HANDLE BACKLOG_VCCS BITFIELD: */
462
vcc_mark_backlogged(struct lanai_dev * lanai,const struct lanai_vcc * lvcc)463 static inline void vcc_mark_backlogged(struct lanai_dev *lanai,
464 const struct lanai_vcc *lvcc)
465 {
466 APRINTK(lvcc->vbase != 0, "vcc_mark_backlogged: zero vbase!\n");
467 vci_bitfield_set(&lanai->backlog_vccs, lvcc->vci);
468 }
469
vcc_unmark_backlogged(struct lanai_dev * lanai,const struct lanai_vcc * lvcc)470 static inline void vcc_unmark_backlogged(struct lanai_dev *lanai,
471 const struct lanai_vcc *lvcc)
472 {
473 APRINTK(lvcc->vbase != 0, "vcc_unmark_backlogged: zero vbase!\n");
474 vci_bitfield_clear(&lanai->backlog_vccs, lvcc->vci);
475 }
476
vcc_backlog_init(struct lanai_dev * lanai)477 static inline void vcc_backlog_init(struct lanai_dev *lanai)
478 {
479 vci_bitfield_init(&lanai->backlog_vccs);
480 }
481
vcc_is_backlogged(struct lanai_vcc * lvcc)482 static inline int vcc_is_backlogged(/*const*/ struct lanai_vcc *lvcc)
483 {
484 return lvcc->tx.inprogress != NULL ||
485 !skb_queue_empty(&lvcc->tx.backlog);
486 }
487
488 /* -------------------- PORT I/O UTILITIES: */
489
490 /* Registers (and their bit-fields) */
491 enum lanai_register {
492 Reset_Reg = 0x00, /* Reset; read for chip type; bits: */
493 #define RESET_GET_BOARD_REV(x) (((x)>> 0)&0x03) /* Board revision */
494 #define RESET_GET_BOARD_ID(x) (((x)>> 2)&0x03) /* Board ID */
495 #define BOARD_ID_LANAI256 (0) /* 25.6M adaptor card */
496 Endian_Reg = 0x04, /* Endian setting */
497 IntStatus_Reg = 0x08, /* Interrupt status */
498 IntStatusMasked_Reg = 0x0C, /* Interrupt status (masked) */
499 IntAck_Reg = 0x10, /* Interrupt acknowledge */
500 IntAckMasked_Reg = 0x14, /* Interrupt acknowledge (masked) */
501 IntStatusSet_Reg = 0x18, /* Get status + enable/disable */
502 IntStatusSetMasked_Reg = 0x1C, /* Get status + en/di (masked) */
503 IntControlEna_Reg = 0x20, /* Interrupt control enable */
504 IntControlDis_Reg = 0x24, /* Interrupt control disable */
505 Status_Reg = 0x28, /* Status */
506 #define STATUS_PROMDATA (0x00000001) /* PROM_DATA pin */
507 #define STATUS_WAITING (0x00000002) /* Interrupt being delayed */
508 #define STATUS_SOOL (0x00000004) /* SOOL alarm */
509 #define STATUS_LOCD (0x00000008) /* LOCD alarm */
510 #define STATUS_LED (0x00000010) /* LED (HAPPI) output */
511 #define STATUS_GPIN (0x00000020) /* GPIN pin */
512 #define STATUS_BUTTBUSY (0x00000040) /* Butt register is pending */
513 Config1_Reg = 0x2C, /* Config word 1; bits: */
514 #define CONFIG1_PROMDATA (0x00000001) /* PROM_DATA pin */
515 #define CONFIG1_PROMCLK (0x00000002) /* PROM_CLK pin */
516 #define CONFIG1_SET_READMODE(x) ((x)*0x004) /* PCI BM reads; values: */
517 #define READMODE_PLAIN (0) /* Plain memory read */
518 #define READMODE_LINE (2) /* Memory read line */
519 #define READMODE_MULTIPLE (3) /* Memory read multiple */
520 #define CONFIG1_DMA_ENABLE (0x00000010) /* Turn on DMA */
521 #define CONFIG1_POWERDOWN (0x00000020) /* Turn off clocks */
522 #define CONFIG1_SET_LOOPMODE(x) ((x)*0x080) /* Clock&loop mode; values: */
523 #define LOOPMODE_NORMAL (0) /* Normal - no loop */
524 #define LOOPMODE_TIME (1)
525 #define LOOPMODE_DIAG (2)
526 #define LOOPMODE_LINE (3)
527 #define CONFIG1_MASK_LOOPMODE (0x00000180)
528 #define CONFIG1_SET_LEDMODE(x) ((x)*0x0200) /* Mode of LED; values: */
529 #define LEDMODE_NOT_SOOL (0) /* !SOOL */
530 #define LEDMODE_OFF (1) /* 0 */
531 #define LEDMODE_ON (2) /* 1 */
532 #define LEDMODE_NOT_LOCD (3) /* !LOCD */
533 #define LEDMORE_GPIN (4) /* GPIN */
534 #define LEDMODE_NOT_GPIN (7) /* !GPIN */
535 #define CONFIG1_MASK_LEDMODE (0x00000E00)
536 #define CONFIG1_GPOUT1 (0x00001000) /* Toggle for reset */
537 #define CONFIG1_GPOUT2 (0x00002000) /* Loopback PHY */
538 #define CONFIG1_GPOUT3 (0x00004000) /* Loopback lanai */
539 Config2_Reg = 0x30, /* Config word 2; bits: */
540 #define CONFIG2_HOWMANY (0x00000001) /* >512 VCIs? */
541 #define CONFIG2_PTI7_MODE (0x00000002) /* Make PTI=7 RM, not OAM */
542 #define CONFIG2_VPI_CHK_DIS (0x00000004) /* Ignore RX VPI value */
543 #define CONFIG2_HEC_DROP (0x00000008) /* Drop cells w/ HEC errors */
544 #define CONFIG2_VCI0_NORMAL (0x00000010) /* Treat VCI=0 normally */
545 #define CONFIG2_CBR_ENABLE (0x00000020) /* Deal with CBR traffic */
546 #define CONFIG2_TRASH_ALL (0x00000040) /* Trashing incoming cells */
547 #define CONFIG2_TX_DISABLE (0x00000080) /* Trashing outgoing cells */
548 #define CONFIG2_SET_TRASH (0x00000100) /* Turn trashing on */
549 Statistics_Reg = 0x34, /* Statistics; bits: */
550 #define STATS_GET_FIFO_OVFL(x) (((x)>> 0)&0xFF) /* FIFO overflowed */
551 #define STATS_GET_HEC_ERR(x) (((x)>> 8)&0xFF) /* HEC was bad */
552 #define STATS_GET_BAD_VCI(x) (((x)>>16)&0xFF) /* VCI not open */
553 #define STATS_GET_BUF_OVFL(x) (((x)>>24)&0xFF) /* VCC buffer full */
554 ServiceStuff_Reg = 0x38, /* Service stuff; bits: */
555 #define SSTUFF_SET_SIZE(x) ((x)*0x20000000) /* size of service buffer */
556 #define SSTUFF_SET_ADDR(x) ((x)>>8) /* set address of buffer */
557 ServWrite_Reg = 0x3C, /* ServWrite Pointer */
558 ServRead_Reg = 0x40, /* ServRead Pointer */
559 TxDepth_Reg = 0x44, /* FIFO Transmit Depth */
560 Butt_Reg = 0x48, /* Butt register */
561 CBR_ICG_Reg = 0x50,
562 CBR_PTR_Reg = 0x54,
563 PingCount_Reg = 0x58, /* Ping count */
564 DMA_Addr_Reg = 0x5C /* DMA address */
565 };
566
reg_addr(const struct lanai_dev * lanai,enum lanai_register reg)567 static inline bus_addr_t reg_addr(const struct lanai_dev *lanai,
568 enum lanai_register reg)
569 {
570 return lanai->base + (bus_addr_t) reg;
571 }
572
573
reg_read(const struct lanai_dev * lanai,enum lanai_register reg)574 static inline u32 reg_read(const struct lanai_dev *lanai,
575 enum lanai_register reg)
576 {
577 u32 t;
578 t = readl(reg_addr(lanai, reg));
579 RWDEBUG("R [0x%08X] 0x%02X = 0x%08X\n", (unsigned int) lanai->base,
580 (int) reg, t);
581 return t;
582 }
583
reg_write(const struct lanai_dev * lanai,u32 val,enum lanai_register reg)584 static inline void reg_write(const struct lanai_dev *lanai, u32 val,
585 enum lanai_register reg)
586 {
587 RWDEBUG("W [0x%08X] 0x%02X < 0x%08X\n", (unsigned int) lanai->base,
588 (int) reg, val);
589 writel(val, reg_addr(lanai, reg));
590 mdelay(1);
591 }
592
conf1_write(const struct lanai_dev * lanai)593 static inline void conf1_write(const struct lanai_dev *lanai)
594 {
595 reg_write(lanai, lanai->conf1, Config1_Reg);
596 }
597
conf2_write(const struct lanai_dev * lanai)598 static inline void conf2_write(const struct lanai_dev *lanai)
599 {
600 reg_write(lanai, lanai->conf2, Config2_Reg);
601 }
602
reset_board(const struct lanai_dev * lanai)603 static inline void reset_board(const struct lanai_dev *lanai)
604 {
605 DPRINTK("about to reset board\n");
606 reg_write(lanai, 0, Reset_Reg);
607 /*
608 * If we don't delay a little while here then we can end up
609 * leaving the card in a VERY weird state and lock up the
610 * PCI bus. This isn't documented anywhere but I've convinced
611 * myself after a lot of painful experimentation
612 */
613 udelay(5);
614 }
615
616 /* -------------------- VCC LIST LOCK: */
617
618 /*
619 * The linux-atm code disables local IRQs while managing the list of
620 * VCCs on a card. This is good, but it doesn't save us against
621 * SMP. Unfortunately, fixing this will require changes in the
622 * API which will have to wait a little bit. It's a hard race to
623 * trigger accidentally, so it isn't TOO horrible so far.
624 *
625 * One possible solution would be to have an rwlock which is
626 * always grabbed _irq-style on writing. This would automatically
627 * be grabbed (for writing) by the higher layers on things that
628 * would result in a change in the vcc list (_open, _close,
629 * probably _change_qos) - thus it would also protect the
630 * higher-level list of vccs on each device (atm_dev->vccs).
631 * The driver would be responsible for grabbing it as a read_lock
632 * anytime it wants to consult its table of vccs - for instance
633 * when handling an incoming PDU. This also explains why we would
634 * probably want the write_lock while in _change_qos - to prevent
635 * handling of PDUs while possibly in an inconsistant state.
636 * Also, _send would grab the lock for reading.
637 *
638 * One problem with this is that _open and _close could no longer
639 * do anything that might provoke a schedule. First, it would
640 * force us to use GFP_ATOMIC memory (which is bad), but also
641 * some devices pretty much require scheduling due to long
642 * delays (see lanai_close for an example). So in this case
643 * we need a way to schedule without losing the spinlock.
644 * The cleanest way to do this is probably have a way to mark a
645 * VCC as "in progress" so that the interrupt handler can
646 * still disregard any traffic for it while _open or _close
647 * are sleeping on it. Then it will need to be _open and
648 * _close's job to relinquish the write_lock. Thus, the
649 * lock could be dropped around the times that scheduling
650 * might occur. Perhaps the _READY flag can be used for
651 * this purpose.
652 *
653 * One short note about this "upper layer grabs, driver
654 * relinquishes" write lock - since this needs to be
655 * an _irq lock we're going to have problem saving
656 * and restoring flags (_irqsave/_irqrestore). This
657 * shouldn't be a problem, however - we must just
658 * require that those syscalls are never called with
659 * interrupts disabled so we can use the non-flags-saving
660 * versions.
661 *
662 * Anyway, all of the above is vaporware currently - fixing
663 * this right will require changes in the API and all of
664 * the drivers - this will wait until 2.5.x most likely.
665 * The following NOP macros are just here to mark where
666 * the locks will be needed in the future.
667 */
668 #define vcclist_read_lock() do {} while (0)
669 #define vcclist_read_unlock() do {} while (0)
670 #define vcclist_write_lock() do {} while (0)
671 #define vcclist_write_unlock() do {} while (0)
672
673 /* -------------------- CARD SRAM UTILITIES: */
674
675 /* The SRAM is mapped into normal PCI memory space - the only catch is
676 * that it is only 16-bits wide but must be accessed as 32-bit. The
677 * 16 high bits will be zero. We don't hide this, since they get
678 * programmed mostly like discrete registers anyway
679 */
680 #define SRAM_START (0x20000)
681 #define SRAM_BYTES (0x20000) /* Again, half don't really exist */
682
sram_addr(const struct lanai_dev * lanai,int offset)683 static inline bus_addr_t sram_addr(const struct lanai_dev *lanai, int offset)
684 {
685 return lanai->base + SRAM_START + offset;
686 }
687
sram_read(const struct lanai_dev * lanai,int offset)688 static inline u32 sram_read(const struct lanai_dev *lanai, int offset)
689 {
690 return readl(sram_addr(lanai, offset));
691 }
692
sram_write(const struct lanai_dev * lanai,u32 val,int offset)693 static inline void sram_write(const struct lanai_dev *lanai,
694 u32 val, int offset)
695 {
696 writel(val, sram_addr(lanai, offset));
697 }
698
sram_test_word(const struct lanai_dev * lanai,int offset,u32 pattern)699 static int __init sram_test_word(
700 const struct lanai_dev *lanai, int offset, u32 pattern)
701 {
702 u32 readback;
703 sram_write(lanai, pattern, offset);
704 readback = sram_read(lanai, offset);
705 if (readback == pattern)
706 return 0;
707 printk(KERN_ERR DEV_LABEL
708 "(itf %d): SRAM word at %d bad: wrote 0x%X, read 0x%X\n",
709 lanai->number, offset, pattern, readback);
710 return -EIO;
711 }
712
sram_test_pass(const struct lanai_dev * lanai,u32 pattern)713 static int __init sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
714 {
715 int offset, result = 0;
716 for (offset = 0; offset < SRAM_BYTES && result == 0; offset += 4)
717 result = sram_test_word(lanai, offset, pattern);
718 return result;
719 }
720
sram_test_and_clear(const struct lanai_dev * lanai)721 static int __init sram_test_and_clear(const struct lanai_dev *lanai)
722 {
723 #ifdef FULL_MEMORY_TEST
724 int result;
725 DPRINTK("testing SRAM\n");
726 if ((result = sram_test_pass(lanai, 0x5555)) != 0)
727 return result;
728 if ((result = sram_test_pass(lanai, 0xAAAA)) != 0)
729 return result;
730 #endif
731 DPRINTK("clearing SRAM\n");
732 return sram_test_pass(lanai, 0x0000);
733 }
734
735 /* -------------------- CARD-BASED VCC TABLE UTILITIES: */
736
737 /* vcc table */
738 enum lanai_vcc_offset {
739 vcc_rxaddr1 = 0x00, /* Location1, plus bits: */
740 #define RXADDR1_SET_SIZE(x) ((x)*0x0000100) /* size of RX buffer */
741 #define RXADDR1_SET_RMMODE(x) ((x)*0x00800) /* RM cell action; values: */
742 #define RMMODE_TRASH (0) /* discard */
743 #define RMMODE_PRESERVE (1) /* input as AAL0 */
744 #define RMMODE_PIPE (2) /* pipe to coscheduler */
745 #define RMMODE_PIPEALL (3) /* pipe non-RM too */
746 #define RXADDR1_OAM_PRESERVE (0x00002000) /* Input OAM cells as AAL0 */
747 #define RXADDR1_SET_MODE(x) ((x)*0x0004000) /* Reassembly mode */
748 #define RXMODE_TRASH (0) /* discard */
749 #define RXMODE_AAL0 (1) /* non-AAL5 mode */
750 #define RXMODE_AAL5 (2) /* AAL5, intr. each PDU */
751 #define RXMODE_AAL5_STREAM (3) /* AAL5 w/o per-PDU intr */
752 vcc_rxaddr2 = 0x04, /* Location2 */
753 vcc_rxcrc1 = 0x08, /* RX CRC claculation space */
754 vcc_rxcrc2 = 0x0C,
755 vcc_rxwriteptr = 0x10, /* RX writeptr, plus bits: */
756 #define RXWRITEPTR_LASTEFCI (0x00002000) /* Last PDU had EFCI bit */
757 #define RXWRITEPTR_DROPPING (0x00004000) /* Had error, dropping */
758 #define RXWRITEPTR_TRASHING (0x00008000) /* Trashing */
759 vcc_rxbufstart = 0x14, /* RX bufstart, plus bits: */
760 #define RXBUFSTART_CLP (0x00004000)
761 #define RXBUFSTART_CI (0x00008000)
762 vcc_rxreadptr = 0x18, /* RX readptr */
763 vcc_txicg = 0x1C, /* TX ICG */
764 vcc_txaddr1 = 0x20, /* Location1, plus bits: */
765 #define TXADDR1_SET_SIZE(x) ((x)*0x0000100) /* size of TX buffer */
766 #define TXADDR1_ABR (0x00008000) /* use ABR (doesn't work) */
767 vcc_txaddr2 = 0x24, /* Location2 */
768 vcc_txcrc1 = 0x28, /* TX CRC claculation space */
769 vcc_txcrc2 = 0x2C,
770 vcc_txreadptr = 0x30, /* TX Readptr, plus bits: */
771 #define TXREADPTR_GET_PTR(x) ((x)&0x01FFF)
772 #define TXREADPTR_MASK_DELTA (0x0000E000) /* ? */
773 vcc_txendptr = 0x34, /* TX Endptr, plus bits: */
774 #define TXENDPTR_CLP (0x00002000)
775 #define TXENDPTR_MASK_PDUMODE (0x0000C000) /* PDU mode; values: */
776 #define PDUMODE_AAL0 (0*0x04000)
777 #define PDUMODE_AAL5 (2*0x04000)
778 #define PDUMODE_AAL5STREAM (3*0x04000)
779 vcc_txwriteptr = 0x38, /* TX Writeptr */
780 #define TXWRITEPTR_GET_PTR(x) ((x)&0x1FFF)
781 vcc_txcbr_next = 0x3C /* # of next CBR VCI in ring */
782 #define TXCBR_NEXT_BOZO (0x00008000) /* "bozo bit" */
783 };
784
785 #define CARDVCC_SIZE (0x40)
786
cardvcc_addr(const struct lanai_dev * lanai,vci_t vci)787 static inline bus_addr_t cardvcc_addr(const struct lanai_dev *lanai,
788 vci_t vci)
789 {
790 return sram_addr(lanai, vci * CARDVCC_SIZE);
791 }
792
cardvcc_read(const struct lanai_vcc * lvcc,enum lanai_vcc_offset offset)793 static inline u32 cardvcc_read(const struct lanai_vcc *lvcc,
794 enum lanai_vcc_offset offset)
795 {
796 u32 val;
797 APRINTK(lvcc->vbase != 0, "cardvcc_read: unbound vcc!\n");
798 val= readl(lvcc->vbase + (bus_addr_t) offset);
799 RWDEBUG("VR vci=%04d 0x%02X = 0x%08X\n",
800 lvcc->vci, (int) offset, val);
801 return val;
802 }
803
cardvcc_write(const struct lanai_vcc * lvcc,u32 val,enum lanai_vcc_offset offset)804 static inline void cardvcc_write(const struct lanai_vcc *lvcc,
805 u32 val, enum lanai_vcc_offset offset)
806 {
807 APRINTK(lvcc->vbase != 0, "cardvcc_write: unbound vcc!\n");
808 APRINTK((val & ~0xFFFF) == 0,
809 "cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)\n",
810 val, lvcc->vci, (int) offset);
811 RWDEBUG("VW vci=%04d 0x%02X > 0x%08X\n",
812 lvcc->vci, (int) offset, val);
813 writel(val, lvcc->vbase + (bus_addr_t) offset);
814 }
815
816 /* -------------------- COMPUTE SIZE OF AN AAL5 PDU: */
817
818 /* How many bytes will an AAL5 PDU take to transmit - remember that:
819 * o we need to add 8 bytes for length, CPI, UU, and CRC
820 * o we need to round up to 48 bytes for cells
821 */
aal5_size(int size)822 static inline int aal5_size(int size)
823 {
824 int cells = (size + 8 + 47) / 48;
825 return cells * 48;
826 }
827
828 /* How many bytes can we send if we have "space" space, assuming we have
829 * to send full cells
830 */
aal5_spacefor(int space)831 static inline int aal5_spacefor(int space)
832 {
833 int cells = space / 48;
834 return cells * 48;
835 }
836
837 /* -------------------- FREE AN ATM SKB: */
838
lanai_free_skb(struct atm_vcc * atmvcc,struct sk_buff * skb)839 static inline void lanai_free_skb(struct atm_vcc *atmvcc, struct sk_buff *skb)
840 {
841 if (atmvcc->pop != NULL)
842 atmvcc->pop(atmvcc, skb);
843 else
844 dev_kfree_skb_any(skb);
845 }
846
847 /* -------------------- TURN VCCS ON AND OFF: */
848
host_vcc_start_rx(const struct lanai_vcc * lvcc)849 static void host_vcc_start_rx(const struct lanai_vcc *lvcc)
850 {
851 u32 addr1;
852 if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5) {
853 unsigned long dmaaddr = lanai_buf_dmaaddr(&lvcc->rx.buf);
854 cardvcc_write(lvcc, 0xFFFF, vcc_rxcrc1);
855 cardvcc_write(lvcc, 0xFFFF, vcc_rxcrc2);
856 cardvcc_write(lvcc, 0, vcc_rxwriteptr);
857 cardvcc_write(lvcc, 0, vcc_rxbufstart);
858 cardvcc_write(lvcc, 0, vcc_rxreadptr);
859 cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF, vcc_rxaddr2);
860 addr1 = ((dmaaddr >> 8) & 0xFF) |
861 RXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->rx.buf))|
862 RXADDR1_SET_RMMODE(RMMODE_TRASH) | /* ??? */
863 /* RXADDR1_OAM_PRESERVE | --- no OAM support yet */
864 RXADDR1_SET_MODE(RXMODE_AAL5);
865 } else
866 addr1 = RXADDR1_SET_RMMODE(RMMODE_PRESERVE) | /* ??? */
867 RXADDR1_OAM_PRESERVE | /* ??? */
868 RXADDR1_SET_MODE(RXMODE_AAL0);
869 /* This one must be last! */
870 cardvcc_write(lvcc, addr1, vcc_rxaddr1);
871 }
872
host_vcc_start_tx(const struct lanai_vcc * lvcc)873 static void host_vcc_start_tx(const struct lanai_vcc *lvcc)
874 {
875 unsigned long dmaaddr = lanai_buf_dmaaddr(&lvcc->tx.buf);
876 cardvcc_write(lvcc, 0, vcc_txicg);
877 cardvcc_write(lvcc, 0xFFFF, vcc_txcrc1);
878 cardvcc_write(lvcc, 0xFFFF, vcc_txcrc2);
879 cardvcc_write(lvcc, 0, vcc_txreadptr);
880 cardvcc_write(lvcc, 0, vcc_txendptr);
881 cardvcc_write(lvcc, 0, vcc_txwriteptr);
882 cardvcc_write(lvcc,
883 (lvcc->tx.atmvcc->qos.txtp.traffic_class == ATM_CBR) ?
884 TXCBR_NEXT_BOZO | lvcc->vci : 0, vcc_txcbr_next);
885 cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF, vcc_txaddr2);
886 cardvcc_write(lvcc,
887 ((dmaaddr >> 8) & 0xFF) |
888 TXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->tx.buf)),
889 vcc_txaddr1);
890 }
891
892 /* Shutdown receiving on card */
lanai_shutdown_rx_vci(const struct lanai_vcc * lvcc)893 static void lanai_shutdown_rx_vci(const struct lanai_vcc *lvcc)
894 {
895 if (lvcc->vbase == 0) /* We were never bound to a VCI */
896 return;
897 /* 15.1.1 - set to trashing, wait one cell time (15us) */
898 cardvcc_write(lvcc,
899 RXADDR1_SET_RMMODE(RMMODE_TRASH) |
900 RXADDR1_SET_MODE(RXMODE_TRASH), vcc_rxaddr1);
901 udelay(15);
902 /* 15.1.2 - clear rest of entries */
903 cardvcc_write(lvcc, 0, vcc_rxaddr2);
904 cardvcc_write(lvcc, 0, vcc_rxcrc1);
905 cardvcc_write(lvcc, 0, vcc_rxcrc2);
906 cardvcc_write(lvcc, 0, vcc_rxwriteptr);
907 cardvcc_write(lvcc, 0, vcc_rxbufstart);
908 cardvcc_write(lvcc, 0, vcc_rxreadptr);
909 }
910
911 /* Shutdown transmitting on card.
912 * Unfortunately the lanai needs us to wait until all the data
913 * drains out of the buffer before we can dealloc it, so this
914 * can take awhile -- up to 370ms for a full 128KB buffer
915 * assuming everone else is quiet. In theory the time is
916 * boundless if there's a CBR VCC holding things up.
917 */
lanai_shutdown_tx_vci(struct lanai_dev * lanai,struct lanai_vcc * lvcc)918 static void lanai_shutdown_tx_vci(struct lanai_dev *lanai,
919 struct lanai_vcc *lvcc)
920 {
921 struct sk_buff *skb;
922 unsigned long flags, timeout;
923 int read, write, lastread = -1;
924 APRINTK(!in_interrupt(),
925 "lanai_shutdown_tx_vci called w/o process context!\n");
926 if (lvcc->vbase == 0) /* We were never bound to a VCI */
927 return;
928 /* 15.2.1 - wait for queue to drain */
929 spin_lock_irqsave(&lanai->txlock, flags);
930 if (lvcc->tx.inprogress != NULL) {
931 lanai_free_skb(lvcc->tx.atmvcc, lvcc->tx.inprogress);
932 lvcc->tx.inprogress = NULL;
933 }
934 while ((skb = skb_dequeue(&lvcc->tx.backlog)) != NULL)
935 lanai_free_skb(lvcc->tx.atmvcc, skb);
936 vcc_unmark_backlogged(lanai, lvcc);
937 spin_unlock_irqrestore(&lanai->txlock, flags);
938 timeout = jiffies + ((lanai_buf_size(&lvcc->tx.buf) * HZ) >> 17);
939 write = TXWRITEPTR_GET_PTR(cardvcc_read(lvcc, vcc_txwriteptr));
940 goto start;
941 while (time_before_eq(jiffies, timeout)) {
942 schedule_timeout(HZ / 25);
943 start:
944 read = TXREADPTR_GET_PTR(cardvcc_read(lvcc, vcc_txreadptr));
945 if (read == write && /* Is TX buffer empty? */
946 (lvcc->tx.atmvcc->qos.txtp.traffic_class != ATM_CBR ||
947 (cardvcc_read(lvcc, vcc_txcbr_next) &
948 TXCBR_NEXT_BOZO) == 0))
949 goto done;
950 if (read != lastread) { /* Has there been any progress? */
951 lastread = read;
952 timeout += HZ / 10;
953 }
954 }
955 printk(KERN_ERR DEV_LABEL "(itf %d): Timed out on backlog closing "
956 "vci %d\n", lvcc->tx.atmvcc->dev->number, lvcc->vci);
957 DPRINTK("read, write = %d, %d\n", read, write);
958 done:
959 /* 15.2.2 - clear out all tx registers */
960 cardvcc_write(lvcc, 0, vcc_txreadptr);
961 cardvcc_write(lvcc, 0, vcc_txwriteptr);
962 cardvcc_write(lvcc, 0, vcc_txendptr);
963 cardvcc_write(lvcc, 0, vcc_txcrc1);
964 cardvcc_write(lvcc, 0, vcc_txcrc2);
965 cardvcc_write(lvcc, 0, vcc_txaddr2);
966 cardvcc_write(lvcc, 0, vcc_txaddr1);
967 }
968
969 /* -------------------- MANAGING AAL0 RX BUFFER: */
970
aal0_buffer_allocate(struct lanai_dev * lanai)971 static inline int aal0_buffer_allocate(struct lanai_dev *lanai)
972 {
973 DPRINTK("aal0_buffer_allocate: allocating AAL0 RX buffer\n");
974 lanai_buf_allocate(&lanai->aal0buf, AAL0_RX_BUFFER_SIZE, 80);
975 return (lanai->aal0buf.order < 0) ? -ENOMEM : 0;
976 }
977
aal0_buffer_free(struct lanai_dev * lanai)978 static inline void aal0_buffer_free(struct lanai_dev *lanai)
979 {
980 DPRINTK("aal0_buffer_allocate: freeing AAL0 RX buffer\n");
981 lanai_buf_deallocate(&lanai->aal0buf);
982 }
983
984 /* -------------------- EEPROM UTILITIES: */
985
986 /* Offsets of data in the EEPROM */
987 #define EEPROM_COPYRIGHT (0)
988 #define EEPROM_COPYRIGHT_LEN (44)
989 #define EEPROM_CHECKSUM (62)
990 #define EEPROM_CHECKSUM_REV (63)
991 #define EEPROM_MAC (64)
992 #define EEPROM_MAC_REV (70)
993 #define EEPROM_SERIAL (112)
994 #define EEPROM_SERIAL_REV (116)
995 #define EEPROM_MAGIC (120)
996 #define EEPROM_MAGIC_REV (124)
997
998 #define EEPROM_MAGIC_VALUE (0x5AB478D2)
999
1000 #ifndef READ_EEPROM
1001
1002 /* Stub functions to use if EEPROM reading is disabled */
eeprom_read(struct lanai_dev * lanai)1003 static int __init eeprom_read(struct lanai_dev *lanai)
1004 {
1005 printk(KERN_INFO DEV_LABEL "(itf %d): *NOT* reading EEPROM\n",
1006 lanai->number);
1007 memset(&lanai->eeprom[EEPROM_MAC], 0, 6);
1008 return 0;
1009 }
1010
eeprom_validate(struct lanai_dev * lanai)1011 static int __init eeprom_validate(struct lanai_dev *lanai)
1012 {
1013 lanai->serialno = 0;
1014 lanai->magicno = EEPROM_MAGIC_VALUE;
1015 return 0;
1016 }
1017
1018 #else /* READ_EEPROM */
1019
eeprom_read(struct lanai_dev * lanai)1020 static int __init eeprom_read(struct lanai_dev *lanai)
1021 {
1022 int i, address;
1023 u8 data;
1024 u32 tmp;
1025 #define set_config1(x) do { lanai->conf1 = x; conf1_write(lanai); \
1026 } while (0)
1027 #define clock_h() set_config1(lanai->conf1 | CONFIG1_PROMCLK)
1028 #define clock_l() set_config1(lanai->conf1 &~ CONFIG1_PROMCLK)
1029 #define data_h() set_config1(lanai->conf1 | CONFIG1_PROMDATA)
1030 #define data_l() set_config1(lanai->conf1 &~ CONFIG1_PROMDATA)
1031 #define pre_read() do { data_h(); clock_h(); udelay(5); } while (0)
1032 #define read_pin() (reg_read(lanai, Status_Reg) & STATUS_PROMDATA)
1033 #define send_stop() do { data_l(); udelay(5); clock_h(); udelay(5); \
1034 data_h(); udelay(5); } while (0)
1035 /* start with both clock and data high */
1036 data_h(); clock_h(); udelay(5);
1037 for (address = 0; address < LANAI_EEPROM_SIZE; address++) {
1038 data = (address << 1) | 1; /* Command=read + address */
1039 /* send start bit */
1040 data_l(); udelay(5);
1041 clock_l(); udelay(5);
1042 for (i = 128; i != 0; i >>= 1) { /* write command out */
1043 tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) |
1044 (data & i) ? CONFIG1_PROMDATA : 0;
1045 if (lanai->conf1 != tmp) {
1046 set_config1(tmp);
1047 udelay(5); /* Let new data settle */
1048 }
1049 clock_h(); udelay(5); clock_l(); udelay(5);
1050 }
1051 /* look for ack */
1052 data_h(); clock_h(); udelay(5);
1053 if (read_pin() != 0)
1054 goto error; /* No ack seen */
1055 clock_l(); udelay(5);
1056 /* read back result */
1057 for (data = 0, i = 7; i >= 0; i--) {
1058 data_h(); clock_h(); udelay(5);
1059 data = (data << 1) | !!read_pin();
1060 clock_l(); udelay(5);
1061 }
1062 /* look again for ack */
1063 data_h(); clock_h(); udelay(5);
1064 if (read_pin() == 0)
1065 goto error; /* Spurious ack */
1066 clock_l(); udelay(5);
1067 send_stop();
1068 lanai->eeprom[address] = data;
1069 DPRINTK("EEPROM 0x%04X %02X\n", address, data);
1070 }
1071 return 0;
1072 error:
1073 clock_l(); udelay(5); /* finish read */
1074 send_stop();
1075 printk(KERN_ERR DEV_LABEL "(itf %d): error reading EEPROM byte %d\n",
1076 lanai->number, address);
1077 return -EIO;
1078 #undef set_config1
1079 #undef clock_h
1080 #undef clock_l
1081 #undef data_h
1082 #undef data_l
1083 #undef pre_read
1084 #undef read_pin
1085 #undef send_stop
1086 }
1087
1088 /* read a big-endian 4-byte value out of eeprom */
eeprom_be4(const struct lanai_dev * lanai,int address)1089 static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address)
1090 {
1091 return be32_to_cpup((u32 *) (&lanai->eeprom[address]));
1092 }
1093
1094 /* Checksum/validate EEPROM contents */
eeprom_validate(struct lanai_dev * lanai)1095 static int __init eeprom_validate(struct lanai_dev *lanai)
1096 {
1097 int i, s;
1098 u32 v;
1099 const u8 *e = lanai->eeprom;
1100 #ifdef DEBUG
1101 /* First, see if we can get an ASCIIZ string out of the copyright */
1102 for (i = EEPROM_COPYRIGHT;
1103 i < (EEPROM_COPYRIGHT + EEPROM_COPYRIGHT_LEN); i++)
1104 if (e[i] < 0x20 || e[i] > 0x7E)
1105 break;
1106 if ( i != EEPROM_COPYRIGHT &&
1107 i != EEPROM_COPYRIGHT + EEPROM_COPYRIGHT_LEN && e[i] == '\0')
1108 DPRINTK("eeprom: copyright = \"%s\"\n",
1109 (char *) &e[EEPROM_COPYRIGHT]);
1110 else
1111 DPRINTK("eeprom: copyright not found\n");
1112 #endif
1113 /* Validate checksum */
1114 for (i = s = 0; i < EEPROM_CHECKSUM; i++)
1115 s += e[i];
1116 s &= 0xFF;
1117 if (s != e[EEPROM_CHECKSUM]) {
1118 printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM checksum bad "
1119 "(wanted 0x%02X, got 0x%02X)\n", lanai->number,
1120 s, e[EEPROM_CHECKSUM]);
1121 return -EIO;
1122 }
1123 s ^= 0xFF;
1124 if (s != e[EEPROM_CHECKSUM_REV]) {
1125 printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM inverse checksum "
1126 "bad (wanted 0x%02X, got 0x%02X)\n", lanai->number,
1127 s, e[EEPROM_CHECKSUM_REV]);
1128 return -EIO;
1129 }
1130 /* Verify MAC address */
1131 for (i = 0; i < 6; i++)
1132 if ((e[EEPROM_MAC + i] ^ e[EEPROM_MAC_REV + i]) != 0xFF) {
1133 printk(KERN_ERR DEV_LABEL
1134 "(itf %d) : EEPROM MAC addresses don't match "
1135 "(0x%02X, inverse 0x%02X)\n", lanai->number,
1136 e[EEPROM_MAC + i], e[EEPROM_MAC_REV + i]);
1137 return -EIO;
1138 }
1139 DPRINTK("eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02X\n",
1140 e[EEPROM_MAC + 0], e[EEPROM_MAC + 1], e[EEPROM_MAC + 2],
1141 e[EEPROM_MAC + 3], e[EEPROM_MAC + 4], e[EEPROM_MAC + 5]);
1142 /* Verify serial number */
1143 lanai->serialno = eeprom_be4(lanai, EEPROM_SERIAL);
1144 v = eeprom_be4(lanai, EEPROM_SERIAL_REV);
1145 if ((lanai->serialno ^ v) != 0xFFFFFFFF) {
1146 printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM serial numbers "
1147 "don't match (0x%08X, inverse 0x%08X)\n", lanai->number,
1148 lanai->serialno, v);
1149 return -EIO;
1150 }
1151 DPRINTK("eeprom: Serial number = %d\n", lanai->serialno);
1152 /* Verify magic number */
1153 lanai->magicno = eeprom_be4(lanai, EEPROM_MAGIC);
1154 v = eeprom_be4(lanai, EEPROM_MAGIC_REV);
1155 if ((lanai->magicno ^ v) != 0xFFFFFFFF) {
1156 printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM magic numbers "
1157 "don't match (0x%08X, inverse 0x%08X)\n", lanai->number,
1158 lanai->magicno, v);
1159 return -EIO;
1160 }
1161 DPRINTK("eeprom: Magic number = 0x%08X\n", lanai->magicno);
1162 if (lanai->magicno != EEPROM_MAGIC_VALUE)
1163 printk(KERN_WARNING DEV_LABEL "(itf %d): warning - EEPROM "
1164 "magic not what expected (got 0x%08X, not 0x%08X)\n",
1165 lanai->number, lanai->magicno, EEPROM_MAGIC_VALUE);
1166 return 0;
1167 }
1168
1169 #endif /* READ_EEPROM */
1170
eeprom_mac(const struct lanai_dev * lanai)1171 static inline const u8 *eeprom_mac(const struct lanai_dev *lanai)
1172 {
1173 return &lanai->eeprom[EEPROM_MAC];
1174 }
1175
1176 /* -------------------- INTERRUPT HANDLING UTILITIES: */
1177
1178 /* Interrupt types */
1179 #define INT_STATS (0x00000002) /* Statistics counter overflow */
1180 #define INT_SOOL (0x00000004) /* SOOL changed state */
1181 #define INT_LOCD (0x00000008) /* LOCD changed state */
1182 #define INT_LED (0x00000010) /* LED (HAPPI) changed state */
1183 #define INT_GPIN (0x00000020) /* GPIN changed state */
1184 #define INT_PING (0x00000040) /* PING_COUNT fulfilled */
1185 #define INT_WAKE (0x00000080) /* Lanai wants bus */
1186 #define INT_CBR0 (0x00000100) /* CBR sched hit VCI 0 */
1187 #define INT_LOCK (0x00000200) /* Service list overflow */
1188 #define INT_MISMATCH (0x00000400) /* TX magic list mismatch */
1189 #define INT_AAL0_STR (0x00000800) /* Non-AAL5 buffer half filled */
1190 #define INT_AAL0 (0x00001000) /* Non-AAL5 data available */
1191 #define INT_SERVICE (0x00002000) /* Service list entries available */
1192 #define INT_TABORTSENT (0x00004000) /* Target abort sent by lanai */
1193 #define INT_TABORTBM (0x00008000) /* Abort rcv'd as bus master */
1194 #define INT_TIMEOUTBM (0x00010000) /* No response to bus master */
1195 #define INT_PCIPARITY (0x00020000) /* Parity error on PCI */
1196
1197 /* Sets of the above */
1198 #define INT_ALL (0x0003FFFE) /* All interrupts */
1199 #define INT_STATUS (0x0000003C) /* Some status pin changed */
1200 #define INT_DMASHUT (0x00038000) /* DMA engine got shut down */
1201 #define INT_SEGSHUT (0x00000700) /* Segmentation got shut down */
1202
intr_pending(const struct lanai_dev * lanai)1203 static inline u32 intr_pending(const struct lanai_dev *lanai)
1204 {
1205 return reg_read(lanai, IntStatusMasked_Reg);
1206 }
1207
intr_enable(const struct lanai_dev * lanai,u32 i)1208 static inline void intr_enable(const struct lanai_dev *lanai, u32 i)
1209 {
1210 reg_write(lanai, i, IntControlEna_Reg);
1211 }
1212
intr_disable(const struct lanai_dev * lanai,u32 i)1213 static inline void intr_disable(const struct lanai_dev *lanai, u32 i)
1214 {
1215 reg_write(lanai, i, IntControlDis_Reg);
1216 }
1217
1218 /* -------------------- CARD/PCI STATUS: */
1219
status_message(int itf,const char * name,int status)1220 static void status_message(int itf, const char *name, int status)
1221 {
1222 static const char *onoff[2] = { "off to on", "on to off" };
1223 printk(KERN_INFO DEV_LABEL "(itf %d): %s changed from %s\n",
1224 itf, name, onoff[!status]);
1225 }
1226
lanai_check_status(struct lanai_dev * lanai)1227 static void lanai_check_status(struct lanai_dev *lanai)
1228 {
1229 u32 new = reg_read(lanai, Status_Reg);
1230 u32 changes = new ^ lanai->status;
1231 lanai->status = new;
1232 #define e(flag, name) \
1233 if (changes & flag) \
1234 status_message(lanai->number, name, new & flag)
1235 e(STATUS_SOOL, "SOOL");
1236 e(STATUS_LOCD, "LOCD");
1237 e(STATUS_LED, "LED");
1238 e(STATUS_GPIN, "GPIN");
1239 #undef e
1240 }
1241
pcistatus_got(int itf,const char * name)1242 static void pcistatus_got(int itf, const char *name)
1243 {
1244 printk(KERN_INFO DEV_LABEL "(itf %d): PCI got %s error\n", itf, name);
1245 }
1246
pcistatus_check(struct lanai_dev * lanai,int clearonly)1247 static void pcistatus_check(struct lanai_dev *lanai, int clearonly)
1248 {
1249 u16 s;
1250 int result;
1251 result = pci_read_config_word(lanai->pci, PCI_STATUS, &s);
1252 if (result != PCIBIOS_SUCCESSFUL) {
1253 printk(KERN_ERR DEV_LABEL "(itf %d): can't read PCI_STATUS: "
1254 "%d\n", lanai->number, result);
1255 return;
1256 }
1257 s &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR |
1258 PCI_STATUS_REC_MASTER_ABORT | PCI_STATUS_REC_TARGET_ABORT |
1259 PCI_STATUS_SIG_TARGET_ABORT | PCI_STATUS_PARITY;
1260 if (s == 0)
1261 return;
1262 result = pci_write_config_word(lanai->pci, PCI_STATUS, s);
1263 if (result != PCIBIOS_SUCCESSFUL)
1264 printk(KERN_ERR DEV_LABEL "(itf %d): can't write PCI_STATUS: "
1265 "%d\n", lanai->number, result);
1266 if (clearonly)
1267 return;
1268 #define e(flag, name, stat) \
1269 if (s & flag) { \
1270 pcistatus_got(lanai->number, name); \
1271 ++lanai->stats.pcierr_##stat; \
1272 }
1273 e(PCI_STATUS_DETECTED_PARITY, "parity", parity_detect);
1274 e(PCI_STATUS_SIG_SYSTEM_ERROR, "signalled system", serr_set);
1275 e(PCI_STATUS_REC_MASTER_ABORT, "master", master_abort);
1276 e(PCI_STATUS_REC_TARGET_ABORT, "master target", m_target_abort);
1277 e(PCI_STATUS_SIG_TARGET_ABORT, "slave", s_target_abort);
1278 e(PCI_STATUS_PARITY, "master parity", master_parity);
1279 #undef e
1280 }
1281
1282 /* -------------------- VCC TX BUFFER UTILITIES: */
1283
1284 /* space left in tx buffer in bytes */
vcc_tx_space(const struct lanai_vcc * lvcc,int endptr)1285 static inline int vcc_tx_space(const struct lanai_vcc *lvcc, int endptr)
1286 {
1287 int r;
1288 r = endptr * 16;
1289 r -= ((unsigned long) lvcc->tx.buf.ptr) -
1290 ((unsigned long) lvcc->tx.buf.start);
1291 r -= 16; /* Leave "bubble" - if start==end it looks empty */
1292 if (r < 0)
1293 r += lanai_buf_size(&lvcc->tx.buf);
1294 return r;
1295 }
1296
1297 /* Bit fields in the segmentation buffer descriptor */
1298 #define DESCRIPTOR_MAGIC (0xD0000000)
1299 #define DESCRIPTOR_AAL5 (0x00008000)
1300 #define DESCRIPTOR_AAL5_STREAM (0x00004000)
1301 #define DESCRIPTOR_CLP (0x00002000)
1302
1303 /* Add 32-bit descriptor with it's padding */
vcc_tx_add_aal5_descriptor(struct lanai_vcc * lvcc,u32 flags,int len)1304 static inline void vcc_tx_add_aal5_descriptor(struct lanai_vcc *lvcc,
1305 u32 flags, int len)
1306 {
1307 int pos;
1308 APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 0,
1309 "vcc_tx_add_aal5_descriptor: bad ptr=%p\n", lvcc->tx.buf.ptr);
1310 lvcc->tx.buf.ptr += 4; /* Hope the values REALLY don't matter */
1311 pos = ((unsigned char *) lvcc->tx.buf.ptr) -
1312 (unsigned char *) lvcc->tx.buf.start;
1313 APRINTK((pos & ~0x0001FFF0) == 0,
1314 "vcc_tx_add_aal5_descriptor: bad pos (%d) before, vci=%d, "
1315 "start,ptr,end=%p,%p,%p\n", pos, lvcc->vci,
1316 lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end);
1317 pos = (pos + len) & (lanai_buf_size(&lvcc->tx.buf) - 1);
1318 APRINTK((pos & ~0x0001FFF0) == 0,
1319 "vcc_tx_add_aal5_descriptor: bad pos (%d) after, vci=%d, "
1320 "start,ptr,end=%p,%p,%p\n", pos, lvcc->vci,
1321 lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end);
1322 lvcc->tx.buf.ptr[-1] =
1323 cpu_to_le32(DESCRIPTOR_MAGIC | DESCRIPTOR_AAL5 |
1324 ((lvcc->tx.atmvcc->atm_options & ATM_ATMOPT_CLP) ?
1325 DESCRIPTOR_CLP : 0) | flags | pos >> 4);
1326 if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end)
1327 lvcc->tx.buf.ptr = lvcc->tx.buf.start;
1328 }
1329
1330 /* Add 32-bit AAL5 trailer and leave room for its CRC */
vcc_tx_add_aal5trailer(struct lanai_vcc * lvcc,int len,int cpi,int uu)1331 static inline void vcc_tx_add_aal5trailer(struct lanai_vcc *lvcc,
1332 int len, int cpi, int uu)
1333 {
1334 APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 8,
1335 "vcc_tx_add_aal5_descriptor: bad ptr=%p\n", lvcc->tx.buf.ptr);
1336 lvcc->tx.buf.ptr += 2;
1337 lvcc->tx.buf.ptr[-2] = cpu_to_be32((uu << 24) | (cpi << 16) | len);
1338 if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end)
1339 lvcc->tx.buf.ptr = lvcc->tx.buf.start;
1340 }
1341
vcc_tx_memcpy(struct lanai_vcc * lvcc,const unsigned char * src,int n)1342 static inline void vcc_tx_memcpy(struct lanai_vcc *lvcc,
1343 const unsigned char *src, int n)
1344 {
1345 unsigned char *e;
1346 int m;
1347 e = ((unsigned char *) lvcc->tx.buf.ptr) + n;
1348 m = e - (unsigned char *) lvcc->tx.buf.end;
1349 if (m < 0)
1350 m = 0;
1351 memcpy(lvcc->tx.buf.ptr, src, n - m);
1352 if (m != 0) {
1353 memcpy(lvcc->tx.buf.start, src + n - m, m);
1354 e = ((unsigned char *) lvcc->tx.buf.start) + m;
1355 }
1356 lvcc->tx.buf.ptr = (u32 *) e;
1357 }
1358
vcc_tx_memzero(struct lanai_vcc * lvcc,int n)1359 static inline void vcc_tx_memzero(struct lanai_vcc *lvcc, int n)
1360 {
1361 unsigned char *e;
1362 int m;
1363 if (n == 0)
1364 return;
1365 e = ((unsigned char *) lvcc->tx.buf.ptr) + n;
1366 m = e - (unsigned char *) lvcc->tx.buf.end;
1367 if (m < 0)
1368 m = 0;
1369 memset(lvcc->tx.buf.ptr, 0, n - m);
1370 if (m != 0) {
1371 memset(lvcc->tx.buf.start, 0, m);
1372 e = ((unsigned char *) lvcc->tx.buf.start) + m;
1373 }
1374 lvcc->tx.buf.ptr = (u32 *) e;
1375 }
1376
1377 /* Update "butt" register to specify new WritePtr */
lanai_endtx(const struct lanai_dev * lanai,const struct lanai_vcc * lvcc)1378 static inline void lanai_endtx(const struct lanai_dev *lanai,
1379 const struct lanai_vcc *lvcc)
1380 {
1381 int i, ptr = ((unsigned char *) lvcc->tx.buf.ptr) -
1382 (unsigned char *) lvcc->tx.buf.start;
1383 APRINTK((ptr & ~0x0001FFF0) == 0,
1384 "lanai_endtx: bad ptr (%d), vci=%d, start,ptr,end=%p,%p,%p\n",
1385 ptr, lvcc->vci, lvcc->tx.buf.start, lvcc->tx.buf.ptr,
1386 lvcc->tx.buf.end);
1387 /*
1388 * We need to check if the "butt busy" bit is set before
1389 * updating the butt register. In theory this should
1390 * never happen because the ATM card is plenty fast at
1391 * updating the register. Still, we should make sure
1392 */
1393 for (i = 0; reg_read(lanai, Status_Reg) & STATUS_BUTTBUSY; i++) {
1394 if (i > 50) {
1395 printk(KERN_ERR DEV_LABEL "(itf %d): butt register "
1396 "always busy!\n", lanai->number);
1397 break;
1398 }
1399 udelay(5);
1400 }
1401 reg_write(lanai, (ptr << 12) | lvcc->vci, Butt_Reg);
1402 }
1403
1404 /* Try to fill the buffer - don't call unless there is backlog */
vcc_tx_unqueue_aal5(struct lanai_dev * lanai,struct lanai_vcc * lvcc,int endptr)1405 static void vcc_tx_unqueue_aal5(struct lanai_dev *lanai,
1406 struct lanai_vcc *lvcc, int endptr)
1407 {
1408 int pad, n;
1409 struct sk_buff *skb;
1410 int space = vcc_tx_space(lvcc, endptr);
1411 APRINTK(vcc_is_backlogged(lvcc),
1412 "vcc_tx_unqueue() called with empty backlog (vci=%d)\n",
1413 lvcc->vci);
1414 if (space < 64)
1415 return; /* No space for even 1 cell+descriptor */
1416 if (lvcc->tx.inprogress != NULL) {
1417 APRINTK((lvcc->tx.inprogleft % 48) == 0,
1418 "vcc_tx_unqueue_aal5: bad progleft=%d\n",
1419 lvcc->tx.inprogleft);
1420 if (lvcc->tx.inprogleft + 16 > space) { /* Can't send all? */
1421 n = aal5_spacefor(space - 16); /* Bytes to send */
1422 vcc_tx_add_aal5_descriptor(lvcc,
1423 DESCRIPTOR_AAL5_STREAM, n);
1424 pad = lvcc->tx.pptr + n - lvcc->tx.inprogress->tail;
1425 if (pad < 0)
1426 pad = 0;
1427 vcc_tx_memcpy(lvcc, lvcc->tx.pptr, n - pad);
1428 vcc_tx_memzero(lvcc, pad);
1429 lvcc->tx.pptr += n;
1430 lvcc->tx.inprogleft -= n;
1431 goto end; /* Buffer is now full */
1432 }
1433 /* OK, there's at least space for all of "inprogress" skb */
1434 vcc_tx_add_aal5_descriptor(lvcc, 0,
1435 lvcc->tx.inprogleft);
1436 pad = lvcc->tx.pptr + lvcc->tx.inprogleft -
1437 lvcc->tx.inprogress->tail;
1438 if (pad >= lvcc->tx.inprogleft) { /* Nothing but pad left */
1439 APRINTK(lvcc->tx.inprogleft == 48,
1440 "vcc_tx_unqueue_aal5: bad pure-pad=%d\n",
1441 lvcc->tx.inprogleft);
1442 pad = 48;
1443 } else
1444 vcc_tx_memcpy(lvcc, lvcc->tx.pptr,
1445 lvcc->tx.inprogleft - pad);
1446 vcc_tx_memzero(lvcc, pad - 8);
1447 vcc_tx_add_aal5trailer(lvcc, lvcc->tx.inprogress->len, 0, 0);
1448 lanai_free_skb(lvcc->tx.atmvcc, lvcc->tx.inprogress);
1449 lvcc->tx.inprogress = NULL;
1450 space -= lvcc->tx.inprogleft + 16;
1451 atomic_inc(&lvcc->tx.atmvcc->stats->tx);
1452 }
1453 while (space >= 64) {
1454 if ((skb = skb_dequeue(&lvcc->tx.backlog)) == NULL)
1455 break;
1456 n = aal5_size(skb->len);
1457 if (n + 16 > space) { /* Can only send part */
1458 int m = aal5_spacefor(space - 16); /* Bytes to send */
1459 vcc_tx_add_aal5_descriptor(lvcc,
1460 DESCRIPTOR_AAL5_STREAM, m);
1461 lvcc->tx.pptr = skb->data + m;
1462 pad = lvcc->tx.pptr - skb->tail;
1463 if (pad < 0)
1464 pad = 0;
1465 vcc_tx_memcpy(lvcc, skb->data, m - pad);
1466 vcc_tx_memzero(lvcc, pad);
1467 lvcc->tx.inprogleft = n - m;
1468 lvcc->tx.inprogress = skb;
1469 goto end;
1470 }
1471 vcc_tx_add_aal5_descriptor(lvcc, 0, n);
1472 pad = n - skb->len - 8;
1473 vcc_tx_memcpy(lvcc, skb->data, skb->len);
1474 vcc_tx_memzero(lvcc, pad);
1475 lanai_free_skb(lvcc->tx.atmvcc, skb);
1476 vcc_tx_add_aal5trailer(lvcc, skb->len, 0, 0);
1477 space -= n + 16;
1478 atomic_inc(&lvcc->tx.atmvcc->stats->tx);
1479 }
1480 if (skb_queue_empty(&lvcc->tx.backlog))
1481 vcc_unmark_backlogged(lanai, lvcc);
1482 end:
1483 lanai_endtx(lanai, lvcc);
1484 }
1485
1486 /* Given an skb that we want to transmit either send it now or queue */
vcc_tx_aal5(struct lanai_dev * lanai,struct lanai_vcc * lvcc,struct sk_buff * skb)1487 static void vcc_tx_aal5(struct lanai_dev *lanai, struct lanai_vcc *lvcc,
1488 struct sk_buff *skb)
1489 {
1490 int space, n, pad;
1491 if (vcc_is_backlogged(lvcc)) /* Already backlogged */
1492 goto queue_it;
1493 space = vcc_tx_space(lvcc, TXREADPTR_GET_PTR(cardvcc_read(lvcc,
1494 vcc_txreadptr)));
1495 if (space < 64) {
1496 vcc_mark_backlogged(lanai, lvcc); /* No space */
1497 goto queue_it;
1498 }
1499 if (space >= 16 + (n = aal5_size(skb->len))) {
1500 /* We can send the whole thing now */
1501 vcc_tx_add_aal5_descriptor(lvcc, 0, n);
1502 pad = n - skb->len;
1503 vcc_tx_memcpy(lvcc, skb->data, skb->len);
1504 vcc_tx_memzero(lvcc, pad - 8);
1505 vcc_tx_add_aal5trailer(lvcc, skb->len, 0, 0);
1506 lanai_free_skb(lvcc->tx.atmvcc, skb);
1507 atomic_inc(&lvcc->tx.atmvcc->stats->tx);
1508 } else { /* Space for only part of skb */
1509 int bytes = aal5_spacefor(space - 16); /* Bytes to send */
1510 vcc_tx_add_aal5_descriptor(lvcc,
1511 DESCRIPTOR_AAL5_STREAM, bytes);
1512 pad = bytes - skb->len;
1513 if (pad < 0)
1514 pad = 0;
1515 vcc_tx_memcpy(lvcc, skb->data, bytes - pad);
1516 vcc_tx_memzero(lvcc, pad);
1517 lvcc->tx.inprogress = skb;
1518 lvcc->tx.inprogleft = n - bytes;
1519 lvcc->tx.pptr = skb->data + bytes;
1520 vcc_mark_backlogged(lanai, lvcc);
1521 }
1522 lanai_endtx(lanai, lvcc);
1523 return;
1524 queue_it:
1525 skb_queue_tail(&lvcc->tx.backlog, skb);
1526 }
1527
vcc_tx_unqueue_aal0(struct lanai_dev * lanai,struct lanai_vcc * lvcc,int endptr)1528 static void vcc_tx_unqueue_aal0(struct lanai_dev *lanai,
1529 struct lanai_vcc *lvcc, int endptr)
1530 {
1531 printk(KERN_INFO DEV_LABEL
1532 ": vcc_tx_unqueue_aal0: not implemented\n");
1533 }
1534
vcc_tx_aal0(struct lanai_dev * lanai,struct lanai_vcc * lvcc,struct sk_buff * skb)1535 static void vcc_tx_aal0(struct lanai_dev *lanai, struct lanai_vcc *lvcc,
1536 struct sk_buff *skb)
1537 {
1538 printk(KERN_INFO DEV_LABEL ": vcc_tx_aal0: not implemented\n");
1539 /* Remember to increment lvcc->tx.atmvcc->stats->tx */
1540 lanai_free_skb(lvcc->tx.atmvcc, skb);
1541 }
1542
1543 /* Try to undequeue 1 backlogged vcc */
iter_dequeue(struct lanai_dev * lanai,vci_t vci)1544 static void iter_dequeue(struct lanai_dev *lanai, vci_t vci)
1545 {
1546 struct lanai_vcc *lvcc = lanai->vccs[vci];
1547 int endptr;
1548 if (lvcc == NULL || !vcc_is_backlogged(lvcc)) {
1549 vci_bitfield_clear(&lanai->backlog_vccs, vci);
1550 return;
1551 }
1552 endptr = TXREADPTR_GET_PTR(cardvcc_read(lvcc, vcc_txreadptr));
1553 lvcc->tx.unqueue(lanai, lvcc, endptr);
1554 }
1555
1556 /* Try a dequeue on all backlogged connections */
vcc_tx_dequeue_all(struct lanai_dev * lanai)1557 static inline void vcc_tx_dequeue_all(struct lanai_dev *lanai)
1558 {
1559 unsigned long flags;
1560 spin_lock_irqsave(&lanai->txlock, flags);
1561 vci_bitfield_iterate(lanai, &lanai->backlog_vccs, iter_dequeue);
1562 spin_unlock_irqrestore(&lanai->txlock, flags);
1563 }
1564
1565 /* -------------------- VCC RX BUFFER UTILITIES: */
1566
1567 /* unlike the _tx_ cousins, this doesn't update ptr */
vcc_rx_memcpy(unsigned char * dest,const struct lanai_vcc * lvcc,int n)1568 static inline void vcc_rx_memcpy(unsigned char *dest,
1569 const struct lanai_vcc *lvcc, int n)
1570 {
1571 int m = ((const unsigned char *) lvcc->rx.buf.ptr) + n -
1572 ((const unsigned char *) (lvcc->rx.buf.end));
1573 if (m < 0)
1574 m = 0;
1575 memcpy(dest, lvcc->rx.buf.ptr, n - m);
1576 memcpy(dest + n - m, lvcc->rx.buf.start, m);
1577 }
1578
1579 /* Receive AAL5 data on a VCC with a particular endptr */
vcc_rx_aal5(struct lanai_vcc * lvcc,int endptr)1580 static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
1581 {
1582 int size;
1583 struct sk_buff *skb;
1584 /*const*/ u32 *x, *end = &lvcc->rx.buf.start[endptr * 4];
1585 int n = ((unsigned long) end) - ((unsigned long) lvcc->rx.buf.ptr);
1586 if (n < 0)
1587 n += lanai_buf_size(&lvcc->rx.buf);
1588 APRINTK(n >= 0 && n < lanai_buf_size(&lvcc->rx.buf) && !(n & 15),
1589 "vcc_rx_aal5: n out of range (%d/%d)\n",
1590 n, lanai_buf_size(&lvcc->rx.buf));
1591 /* Recover the second-to-last word to get true pdu length */
1592 if ((x = &end[-2]) < lvcc->rx.buf.start)
1593 x = &lvcc->rx.buf.end[-2];
1594 size = be32_to_cpup(x) & 0xffff;
1595 if (n != aal5_size(size)) { /* Make sure size matches padding */
1596 printk(KERN_INFO DEV_LABEL "(itf %d): Got bad AAL5 length "
1597 "on vci=%d - size=%d n=%d\n",
1598 lvcc->rx.atmvcc->dev->number, lvcc->vci, size, n);
1599 lvcc->stats.x.aal5.rx_badlen++;
1600 goto out;
1601 }
1602 skb = atm_alloc_charge(lvcc->rx.atmvcc, size, GFP_ATOMIC);
1603 if (skb == NULL) {
1604 lvcc->stats.rx_nomem++;
1605 goto out;
1606 }
1607 skb_put(skb, size);
1608 ATM_SKB(skb)->vcc = lvcc->rx.atmvcc;
1609 skb->stamp = xtime;
1610 vcc_rx_memcpy(skb->data, lvcc, size);
1611 lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb);
1612 atomic_inc(&lvcc->rx.atmvcc->stats->rx);
1613 out:
1614 lvcc->rx.buf.ptr = end;
1615 cardvcc_write(lvcc, endptr, vcc_rxreadptr);
1616 }
1617
vcc_rx_aal0(struct lanai_dev * lanai)1618 static void vcc_rx_aal0(struct lanai_dev *lanai)
1619 {
1620 printk(KERN_INFO DEV_LABEL ": vcc_rx_aal0: not implemented\n");
1621 /* Remember to get vcclist_read_lock while looking up VC */
1622 /* Remember to increment lvcc->rx.atmvcc->stats->rx */
1623 }
1624
1625 /* -------------------- MANAGING HOST-BASED VCC TABLE: */
1626
1627 /* Decide whether to use vmalloc or get_free_page for VCC table */
1628 #if (NUM_VCI * BITS_PER_LONG) <= PAGE_SIZE
1629 #define VCCTABLE_GETFREEPAGE
1630 #else
1631 #include <linux/vmalloc.h>
1632 #endif
1633
vcc_table_allocate(struct lanai_dev * lanai)1634 static int __init vcc_table_allocate(struct lanai_dev *lanai)
1635 {
1636 #ifdef VCCTABLE_GETFREEPAGE
1637 APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE,
1638 "vcc table > PAGE_SIZE!");
1639 lanai->vccs = (struct lanai_vcc **) get_free_page(GFP_KERNEL);
1640 return (lanai->vccs == NULL) ? -ENOMEM : 0;
1641 #else
1642 int bytes = (lanai->num_vci) * sizeof(struct lanai_vcc *);
1643 lanai->vccs = (struct lanai_vcc **) vmalloc(bytes);
1644 if (lanai->vccs == NULL)
1645 return -ENOMEM;
1646 memset(lanai->vccs, 0, bytes);
1647 return 0;
1648 #endif
1649 }
1650
vcc_table_deallocate(const struct lanai_dev * lanai)1651 static inline void vcc_table_deallocate(const struct lanai_dev *lanai)
1652 {
1653 #ifdef VCCTABLE_GETFREEPAGE
1654 free_page((unsigned long) lanai->vccs);
1655 #else
1656 vfree(lanai->vccs);
1657 #endif
1658 }
1659
1660 /* Allocate a fresh lanai_vcc, with the appropriate things cleared */
new_lanai_vcc(void)1661 static inline struct lanai_vcc *new_lanai_vcc(void)
1662 {
1663 struct lanai_vcc *lvcc;
1664 lvcc = (struct lanai_vcc *) kmalloc(sizeof(*lvcc), GFP_KERNEL);
1665 if (lvcc != NULL) {
1666 lvcc->vbase = 0;
1667 lvcc->rx.atmvcc = lvcc->tx.atmvcc = NULL;
1668 lvcc->nref = 0;
1669 memset(&lvcc->stats, 0, sizeof lvcc->stats);
1670 lvcc->rx.buf.start = lvcc->tx.buf.start = NULL;
1671 skb_queue_head_init(&lvcc->tx.backlog);
1672 lvcc->tx.inprogress = NULL;
1673 #ifdef DEBUG
1674 lvcc->tx.unqueue = NULL;
1675 lvcc->vci = -1;
1676 #endif
1677 }
1678 return lvcc;
1679 }
1680
lanai_get_sized_buffer(int number,struct lanai_buffer * buf,int max_sdu,int multiplier,int min,const char * name)1681 static int lanai_get_sized_buffer(int number, struct lanai_buffer *buf,
1682 int max_sdu, int multiplier, int min, const char *name)
1683 {
1684 int size;
1685 if (max_sdu < 1)
1686 max_sdu = 1;
1687 max_sdu = aal5_size(max_sdu);
1688 size = (max_sdu + 16) * multiplier + 16;
1689 lanai_buf_allocate(buf, size, min);
1690 if (buf->order < 0)
1691 return -ENOMEM;
1692 if (lanai_buf_size(buf) < size)
1693 printk(KERN_WARNING DEV_LABEL "(itf %d): wanted %d bytes "
1694 "for %s buffer, got only %d\n", number, size, name,
1695 lanai_buf_size(buf));
1696 DPRINTK("Allocated %d byte %s buffer\n", lanai_buf_size(buf), name);
1697 return 0;
1698 }
1699
1700 /* Setup a RX buffer for a currently unbound AAL5 vci */
lanai_setup_rx_vci_aal5(int number,struct lanai_vcc * lvcc,const struct atm_qos * qos)1701 static inline int lanai_setup_rx_vci_aal5(int number, struct lanai_vcc *lvcc,
1702 const struct atm_qos *qos)
1703 {
1704 return lanai_get_sized_buffer(number, &lvcc->rx.buf,
1705 qos->rxtp.max_sdu, AAL5_RX_MULTIPLIER, qos->rxtp.max_sdu + 32,
1706 "RX");
1707 }
1708
1709 /* Setup a TX buffer for a currently unbound AAL5 vci */
lanai_setup_tx_vci(int number,struct lanai_vcc * lvcc,const struct atm_qos * qos)1710 static int lanai_setup_tx_vci(int number, struct lanai_vcc *lvcc,
1711 const struct atm_qos *qos)
1712 {
1713 int max_sdu, multiplier;
1714 if (qos->aal == ATM_AAL0) {
1715 lvcc->tx.unqueue = vcc_tx_unqueue_aal0;
1716 max_sdu = ATM_CELL_SIZE - 1;
1717 multiplier = AAL0_TX_MULTIPLIER;
1718 } else {
1719 lvcc->tx.unqueue = vcc_tx_unqueue_aal5;
1720 max_sdu = qos->txtp.max_sdu;
1721 multiplier = AAL5_TX_MULTIPLIER;
1722 }
1723 return lanai_get_sized_buffer(number, &lvcc->tx.buf, max_sdu,
1724 multiplier, 80, "TX");
1725 }
1726
host_vcc_bind(struct lanai_dev * lanai,struct lanai_vcc * lvcc,vci_t vci)1727 static inline void host_vcc_bind(struct lanai_dev *lanai,
1728 struct lanai_vcc *lvcc, vci_t vci)
1729 {
1730 if (lvcc->vbase != 0)
1731 return; /* We already were bound in the other direction */
1732 DPRINTK("Binding vci %d\n", vci);
1733 #ifdef USE_POWERDOWN
1734 if (lanai->nbound++ == 0) {
1735 DPRINTK("Coming out of powerdown\n");
1736 lanai->conf1 &= ~CONFIG1_POWERDOWN;
1737 conf1_write(lanai);
1738 conf2_write(lanai);
1739 }
1740 #endif
1741 lvcc->vbase = cardvcc_addr(lanai, vci);
1742 lanai->vccs[lvcc->vci = vci] = lvcc;
1743 }
1744
host_vcc_unbind(struct lanai_dev * lanai,struct lanai_vcc * lvcc)1745 static inline void host_vcc_unbind(struct lanai_dev *lanai,
1746 struct lanai_vcc *lvcc)
1747 {
1748 if (lvcc->vbase == 0)
1749 return; /* This vcc was never bound */
1750 DPRINTK("Unbinding vci %d\n", lvcc->vci);
1751 lvcc->vbase = 0;
1752 lanai->vccs[lvcc->vci] = NULL;
1753 #ifdef USE_POWERDOWN
1754 if (--lanai->nbound == 0) {
1755 DPRINTK("Going into powerdown\n");
1756 lanai->conf1 |= CONFIG1_POWERDOWN;
1757 conf1_write(lanai);
1758 }
1759 #endif
1760 }
1761
1762 /* -------------------- RESET CARD: */
1763
lanai_reset(struct lanai_dev * lanai)1764 static void lanai_reset(struct lanai_dev *lanai)
1765 {
1766 printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* reseting - not "
1767 "implemented\n", lanai->number);
1768 /* TODO */
1769 /* The following is just a hack until we write the real
1770 * resetter - at least ack whatever interrupt sent us
1771 * here
1772 */
1773 reg_write(lanai, INT_ALL, IntAck_Reg);
1774 lanai->stats.card_reset++;
1775 }
1776
1777 /* -------------------- SERVICE LIST UTILITIES: */
1778
1779 /*
1780 * Allocate service buffer and tell card about it
1781 */
service_buffer_allocate(struct lanai_dev * lanai)1782 static int __init service_buffer_allocate(struct lanai_dev *lanai)
1783 {
1784 lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 0);
1785 if (lanai->service.order < 0)
1786 return -ENOMEM;
1787 DPRINTK("allocated service buffer at 0x%08lX, size %d(%d)\n",
1788 (unsigned long) lanai->service.start,
1789 lanai_buf_size(&lanai->service),
1790 lanai_buf_size_cardorder(&lanai->service));
1791 /* Clear ServWrite register to be safe */
1792 reg_write(lanai, 0, ServWrite_Reg);
1793 /* ServiceStuff register contains size and address of buffer */
1794 reg_write(lanai,
1795 SSTUFF_SET_SIZE(lanai_buf_size_cardorder(&lanai->service)) |
1796 SSTUFF_SET_ADDR(lanai_buf_dmaaddr(&lanai->service)),
1797 ServiceStuff_Reg);
1798 return 0;
1799 }
1800
service_buffer_deallocate(struct lanai_dev * lanai)1801 static inline void service_buffer_deallocate(struct lanai_dev *lanai)
1802 {
1803 lanai_buf_deallocate(&lanai->service);
1804 }
1805
1806 /* Bitfields in service list */
1807 #define SERVICE_TX (0x80000000) /* Was from transmission */
1808 #define SERVICE_TRASH (0x40000000) /* RXed PDU was trashed */
1809 #define SERVICE_CRCERR (0x20000000) /* RXed PDU had CRC error */
1810 #define SERVICE_CI (0x10000000) /* RXed PDU had CI set */
1811 #define SERVICE_CLP (0x08000000) /* RXed PDU had CLP set */
1812 #define SERVICE_STREAM (0x04000000) /* RX Stream mode */
1813 #define SERVICE_GET_VCI(x) (((x)>>16)&0x3FF)
1814 #define SERVICE_GET_END(x) ((x)&0x1FFF)
1815
1816 /* Handle one thing from the service list - returns true if it marked a
1817 * VCC ready for xmit
1818 */
handle_service(struct lanai_dev * lanai,u32 s)1819 static int handle_service(struct lanai_dev *lanai, u32 s)
1820 {
1821 vci_t vci = SERVICE_GET_VCI(s);
1822 struct lanai_vcc *lvcc;
1823 vcclist_read_lock();
1824 lvcc = lanai->vccs[vci];
1825 if (lvcc == NULL) {
1826 vcclist_read_unlock();
1827 DPRINTK("(itf %d) got service entry 0x%X for nonexistent "
1828 "vcc %d\n", lanai->number, s, vci);
1829 if (s & SERVICE_TX)
1830 lanai->stats.service_novcc_tx++;
1831 else
1832 lanai->stats.service_novcc_rx++;
1833 return 0;
1834 }
1835 if (s & SERVICE_TX) { /* segmentation interrupt */
1836 if (lvcc->tx.atmvcc == NULL) {
1837 vcclist_read_unlock();
1838 DPRINTK("(itf %d) got service entry 0x%X for non-TX "
1839 "vcc %d\n", lanai->number, s, vci);
1840 lanai->stats.service_notx++;
1841 return 0;
1842 }
1843 vci_bitfield_set(&lanai->transmit_ready, vci);
1844 lvcc->tx.endptr = SERVICE_GET_END(s);
1845 vcclist_read_unlock();
1846 return 1;
1847 }
1848 if (lvcc->rx.atmvcc == NULL) {
1849 vcclist_read_unlock();
1850 DPRINTK("(itf %d) got service entry 0x%X for non-RX "
1851 "vcc %d\n", lanai->number, s, vci);
1852 lanai->stats.service_norx++;
1853 return 0;
1854 }
1855 if (lvcc->rx.atmvcc->qos.aal != ATM_AAL5) {
1856 vcclist_read_unlock();
1857 DPRINTK("(itf %d) got RX service entry 0x%X for non-AAL5 "
1858 "vcc %d\n", lanai->number, s, vci);
1859 lanai->stats.service_rxnotaal5++;
1860 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
1861 return 0;
1862 }
1863 if ((s & (SERVICE_TRASH | SERVICE_STREAM | SERVICE_CRCERR)) == 0) {
1864 vcc_rx_aal5(lvcc, SERVICE_GET_END(s));
1865 vcclist_read_unlock();
1866 return 0;
1867 }
1868 if (s & SERVICE_TRASH) {
1869 int bytes;
1870 vcclist_read_unlock();
1871 DPRINTK("got trashed rx pdu on vci %d\n", vci);
1872 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
1873 lvcc->stats.x.aal5.service_trash++;
1874 bytes = (SERVICE_GET_END(s) * 16) -
1875 (((unsigned long) lvcc->rx.buf.ptr) -
1876 ((unsigned long) lvcc->rx.buf.start)) + 47;
1877 if (bytes < 0)
1878 bytes += lanai_buf_size(&lvcc->rx.buf);
1879 lanai->stats.ovfl_trash += (bytes / 48);
1880 return 0;
1881 }
1882 if (s & SERVICE_STREAM) {
1883 vcclist_read_unlock();
1884 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
1885 lvcc->stats.x.aal5.service_stream++;
1886 printk(KERN_ERR DEV_LABEL "(itf %d): Got AAL5 stream "
1887 "PDU on VCI %d!\n", lanai->number, vci);
1888 lanai_reset(lanai);
1889 return 0;
1890 }
1891 DPRINTK("got rx crc error on vci %d\n", vci);
1892 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
1893 lvcc->stats.x.aal5.service_rxcrc++;
1894 lvcc->rx.buf.ptr = &lvcc->rx.buf.start[SERVICE_GET_END(s) * 4];
1895 cardvcc_write(lvcc, SERVICE_GET_END(s), vcc_rxreadptr);
1896 vcclist_read_unlock();
1897 return 0;
1898 }
1899
1900 /* Try transmitting on all VCIs that we marked ready to serve */
iter_transmit(struct lanai_dev * lanai,vci_t vci)1901 static void iter_transmit(struct lanai_dev *lanai, vci_t vci)
1902 {
1903 struct lanai_vcc *lvcc = lanai->vccs[vci];
1904 if (!vcc_is_backlogged(lvcc))
1905 return;
1906 lvcc->tx.unqueue(lanai, lvcc, lvcc->tx.endptr);
1907 }
1908
1909 /* Run service queue -- called from interrupt context or with
1910 * interrupts otherwise disabled and with the lanai->servicelock
1911 * lock held
1912 */
run_service(struct lanai_dev * lanai)1913 static void run_service(struct lanai_dev *lanai)
1914 {
1915 int ntx = 0;
1916 u32 wreg = reg_read(lanai, ServWrite_Reg);
1917 const u32 *end = lanai->service.start + wreg;
1918 while (lanai->service.ptr != end) {
1919 ntx += handle_service(lanai,
1920 le32_to_cpup(lanai->service.ptr++));
1921 if (lanai->service.ptr >= lanai->service.end)
1922 lanai->service.ptr = lanai->service.start;
1923 }
1924 reg_write(lanai, wreg, ServRead_Reg);
1925 if (ntx != 0) {
1926 spin_lock(&lanai->txlock);
1927 vcclist_read_lock();
1928 vci_bitfield_iterate(lanai, &lanai->transmit_ready,
1929 iter_transmit);
1930 vci_bitfield_init(&lanai->transmit_ready);
1931 vcclist_read_unlock();
1932 spin_unlock(&lanai->txlock);
1933 }
1934 }
1935
1936 /* -------------------- GATHER STATISTICS: */
1937
get_statistics(struct lanai_dev * lanai)1938 static void get_statistics(struct lanai_dev *lanai)
1939 {
1940 u32 statreg = reg_read(lanai, Statistics_Reg);
1941 lanai->stats.atm_ovfl += STATS_GET_FIFO_OVFL(statreg);
1942 lanai->stats.hec_err += STATS_GET_HEC_ERR(statreg);
1943 lanai->stats.vci_trash += STATS_GET_BAD_VCI(statreg);
1944 lanai->stats.ovfl_trash += STATS_GET_BUF_OVFL(statreg);
1945 }
1946
1947 /* -------------------- POLLING TIMER: */
1948
lanai_timed_poll(unsigned long arg)1949 static void lanai_timed_poll(unsigned long arg)
1950 {
1951 #ifndef DEBUG_RW
1952 struct lanai_dev *lanai = (struct lanai_dev *) arg;
1953 unsigned long flags;
1954 #ifdef USE_POWERDOWN
1955 if (lanai->conf1 & CONFIG1_POWERDOWN)
1956 return;
1957 #endif
1958 spin_lock_irqsave(&lanai->servicelock, flags);
1959 run_service(lanai);
1960 spin_unlock_irqrestore(&lanai->servicelock, flags);
1961 vcc_tx_dequeue_all(lanai);
1962 get_statistics(lanai);
1963 mod_timer(&lanai->timer, jiffies + LANAI_POLL_PERIOD);
1964 #endif /* DEBUG_RW */
1965 }
1966
lanai_timed_poll_start(struct lanai_dev * lanai)1967 static inline void lanai_timed_poll_start(struct lanai_dev *lanai)
1968 {
1969 init_timer(&lanai->timer);
1970 lanai->timer.expires = jiffies + LANAI_POLL_PERIOD;
1971 lanai->timer.data = (unsigned long) lanai;
1972 lanai->timer.function = lanai_timed_poll;
1973 add_timer(&lanai->timer);
1974 }
1975
lanai_timed_poll_stop(struct lanai_dev * lanai)1976 static inline void lanai_timed_poll_stop(struct lanai_dev *lanai)
1977 {
1978 del_timer(&lanai->timer);
1979 }
1980
1981 /* -------------------- INTERRUPT SERVICE: */
1982
lanai_int_1(struct lanai_dev * lanai,u32 reason)1983 static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
1984 {
1985 u32 ack = 0;
1986 if (reason & INT_SERVICE) {
1987 ack = INT_SERVICE;
1988 spin_lock(&lanai->servicelock);
1989 run_service(lanai);
1990 spin_unlock(&lanai->servicelock);
1991 }
1992 if (reason & (INT_AAL0_STR | INT_AAL0)) {
1993 ack |= reason & (INT_AAL0_STR | INT_AAL0);
1994 vcc_rx_aal0(lanai);
1995 }
1996 if (reason & INT_STATS) {
1997 reason &= ~INT_STATS; /* No need to ack */
1998 get_statistics(lanai);
1999 }
2000 if (reason & INT_STATUS) {
2001 ack |= reason & INT_STATUS;
2002 lanai_check_status(lanai);
2003 }
2004 if (reason & INT_DMASHUT) {
2005 printk(KERN_ERR DEV_LABEL "(itf %d): driver error - DMA "
2006 "shutdown, reason=0x%08X, address=0x%08X\n",
2007 lanai->number, reason & INT_DMASHUT,
2008 reg_read(lanai, DMA_Addr_Reg));
2009 if (reason & INT_TABORTBM) {
2010 lanai_reset(lanai);
2011 return;
2012 }
2013 ack |= (reason & INT_DMASHUT);
2014 printk(KERN_ERR DEV_LABEL "(itf %d): re-enabling DMA\n",
2015 lanai->number);
2016 conf1_write(lanai);
2017 lanai->stats.dma_reenable++;
2018 pcistatus_check(lanai, 0);
2019 }
2020 if (reason & INT_TABORTSENT) {
2021 ack |= (reason & INT_TABORTSENT);
2022 printk(KERN_ERR DEV_LABEL "(itf %d): sent PCI target abort\n",
2023 lanai->number);
2024 pcistatus_check(lanai, 0);
2025 }
2026 if (reason & INT_SEGSHUT) {
2027 printk(KERN_ERR DEV_LABEL "(itf %d): driver error - "
2028 "segmentation shutdown, reason=0x%08X\n", lanai->number,
2029 reason & INT_SEGSHUT);
2030 lanai_reset(lanai);
2031 return;
2032 }
2033 if (reason & (INT_PING | INT_WAKE)) {
2034 printk(KERN_ERR DEV_LABEL "(itf %d): driver error - "
2035 "unexpected interrupt 0x%08X, resetting\n",
2036 lanai->number, reason & (INT_PING | INT_WAKE));
2037 lanai_reset(lanai);
2038 return;
2039 }
2040 #ifdef DEBUG
2041 if (ack != reason) {
2042 DPRINTK("unacked ints: 0x%08X\n", reason & ~ack);
2043 ack = reason;
2044 }
2045 #endif
2046 if (ack != 0)
2047 reg_write(lanai, ack, IntAck_Reg);
2048 }
2049
lanai_int(int irq,void * devid,struct pt_regs * regs)2050 static void lanai_int(int irq, void *devid, struct pt_regs *regs)
2051 {
2052 struct lanai_dev *lanai = (struct lanai_dev *) devid;
2053 u32 reason;
2054 (void) irq; (void) regs; /* unused variables */
2055 #ifdef USE_POWERDOWN
2056 if (lanai->conf1 & CONFIG1_POWERDOWN) {
2057 lanai->conf1 &= ~CONFIG1_POWERDOWN;
2058 conf1_write(lanai);
2059 printk(KERN_WARNING DEV_LABEL "(itf %d): Got interrupt "
2060 "0x%08X while in POWERDOWN, powering up\n", lanai->conf1,
2061 intr_pending(lanai));
2062 conf2_write(lanai);
2063 }
2064 #endif
2065 while ((reason = intr_pending(lanai)) != 0)
2066 lanai_int_1(lanai, reason);
2067 }
2068
2069 /* TODO - it would be nice if we could use the "delayed interrupt" system
2070 * to some advantage
2071 */
2072
2073 /* -------------------- CHECK BOARD ID/REV: */
2074
2075 /*
2076 * The board id and revision are stored both in the reset register and
2077 * in the PCI configuration space - the documentation says to check
2078 * each of them. If revp!=NULL we store the revision there
2079 */
check_board_id_and_rev(const char * name,u32 val,int * revp)2080 static int check_board_id_and_rev(const char *name, u32 val, int *revp)
2081 {
2082 DPRINTK("%s says board_id=%d, board_rev=%d\n", name,
2083 RESET_GET_BOARD_ID(val), RESET_GET_BOARD_REV(val));
2084 if (RESET_GET_BOARD_ID(val) != BOARD_ID_LANAI256) {
2085 printk(KERN_ERR DEV_LABEL ": Found %s board-id %d -- not a "
2086 "Lanai 25.6\n", name, RESET_GET_BOARD_ID(val));
2087 return -ENODEV;
2088 }
2089 if (revp != NULL)
2090 *revp = RESET_GET_BOARD_REV(val);
2091 return 0;
2092 }
2093
2094 /* -------------------- PCI INITIALIZATION/SHUTDOWN: */
2095
lanai_pci_start(struct lanai_dev * lanai)2096 static inline int __init lanai_pci_start(struct lanai_dev *lanai)
2097 {
2098 struct pci_dev *pci = lanai->pci;
2099 int result;
2100 u16 w;
2101 /* Get the pci revision byte */
2102 result = pci_read_config_byte(pci, PCI_REVISION_ID,
2103 &lanai->pci_revision);
2104 if (result != PCIBIOS_SUCCESSFUL) {
2105 printk(KERN_ERR DEV_LABEL "(itf %d): can't read "
2106 "PCI_REVISION_ID: %d\n", lanai->number, result);
2107 return -EINVAL;
2108 }
2109 result = pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &w);
2110 if (result != PCIBIOS_SUCCESSFUL) {
2111 printk(KERN_ERR DEV_LABEL "(itf %d): can't read "
2112 "PCI_SUBSYSTEM_ID: %d\n", lanai->number, result);
2113 return -EINVAL;
2114 }
2115 if ((result = check_board_id_and_rev("PCI", w, NULL)) != 0)
2116 return result;
2117 /* Set latency timer to zero as per lanai docs */
2118 result = pci_write_config_byte(pci, PCI_LATENCY_TIMER, 0);
2119 if (result != PCIBIOS_SUCCESSFUL) {
2120 printk(KERN_ERR DEV_LABEL "(itf %d): can't write "
2121 "PCI_LATENCY_TIMER: %d\n", lanai->number, result);
2122 return -EINVAL;
2123 }
2124 result = pci_read_config_word(pci, PCI_COMMAND, &w);
2125 if (result != PCIBIOS_SUCCESSFUL) {
2126 printk(KERN_ERR DEV_LABEL "(itf %d): can't read "
2127 "PCI_COMMAND: %d\n", lanai->number, result);
2128 return -EINVAL;
2129 }
2130 w |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_SERR |
2131 PCI_COMMAND_PARITY);
2132 result = pci_write_config_word(pci, PCI_COMMAND, w);
2133 if (result != PCIBIOS_SUCCESSFUL) {
2134 printk(KERN_ERR DEV_LABEL "(itf %d): can't "
2135 "write PCI_COMMAND: %d\n", lanai->number, result);
2136 return -EINVAL;
2137 }
2138 pcistatus_check(lanai, 1);
2139 pcistatus_check(lanai, 0);
2140 return 0;
2141 }
2142
lanai_pci_stop(struct lanai_dev * lanai)2143 static void lanai_pci_stop(struct lanai_dev *lanai)
2144 {
2145 struct pci_dev *pci = lanai->pci;
2146 int result;
2147 u16 pci_command;
2148 result = pci_read_config_word(pci, PCI_COMMAND, &pci_command);
2149 if (result != PCIBIOS_SUCCESSFUL) {
2150 printk(KERN_ERR DEV_LABEL "(itf %d): can't "
2151 "read PCI_COMMAND: %d\n", lanai->number, result);
2152 return;
2153 }
2154 pci_command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
2155 result = pci_write_config_word(pci, PCI_COMMAND, pci_command);
2156 if (result != PCIBIOS_SUCCESSFUL)
2157 printk(KERN_ERR DEV_LABEL "(itf %d): can't "
2158 "write PCI_COMMAND: %d\n", lanai->number, result);
2159 }
2160
2161 /* -------------------- VPI/VCI ALLOCATION: */
2162
2163 /*
2164 * We _can_ use VCI==0 for normal traffic, but only for UBR (or we'll
2165 * get a CBRZERO interrupt), and we can use it only if noone is receiving
2166 * AAL0 traffic (since they will use the same queue) - according to the
2167 * docs we shouldn't even use it for AAL0 traffic
2168 */
vci0_is_ok(struct lanai_dev * lanai,const struct atm_qos * qos)2169 static inline int vci0_is_ok(struct lanai_dev *lanai,
2170 const struct atm_qos *qos)
2171 {
2172 if (qos->txtp.traffic_class == ATM_CBR || qos->aal == ATM_AAL0)
2173 return 0;
2174 if (qos->rxtp.traffic_class != ATM_NONE) {
2175 if (lanai->naal0 != 0)
2176 return 0;
2177 lanai->conf2 |= CONFIG2_VCI0_NORMAL;
2178 #ifdef USE_POWERDOWN
2179 if ((lanai->conf1 & CONFIG1_POWERDOWN) == 0)
2180 #endif
2181 conf2_write(lanai);
2182 }
2183 return 1;
2184 }
2185
2186 /* return true if vci is currently unused, or if requested qos is
2187 * compatible
2188 */
vci_is_ok(struct lanai_dev * lanai,vci_t vci,const struct atm_vcc * atmvcc)2189 static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
2190 const struct atm_vcc *atmvcc)
2191 {
2192 const struct atm_qos *qos = &atmvcc->qos;
2193 const struct lanai_vcc *lvcc = lanai->vccs[vci];
2194 if (vci == 0 && !vci0_is_ok(lanai, qos))
2195 return 0;
2196 if (lvcc != NULL) {
2197 if (qos->rxtp.traffic_class != ATM_NONE &&
2198 lvcc->rx.atmvcc != NULL && lvcc->rx.atmvcc != atmvcc)
2199 return 0;
2200 if (qos->txtp.traffic_class != ATM_NONE &&
2201 lvcc->tx.atmvcc != NULL && lvcc->tx.atmvcc != atmvcc)
2202 return 0;
2203 if (qos->txtp.traffic_class == ATM_CBR &&
2204 lanai->cbrvcc != NULL && lanai->cbrvcc != atmvcc)
2205 return 0;
2206 }
2207 if (qos->aal == ATM_AAL0 && lanai->naal0 == 0 &&
2208 qos->rxtp.traffic_class != ATM_NONE) {
2209 const struct lanai_vcc *vci0 = lanai->vccs[0];
2210 if (vci0 != NULL && vci0->rx.atmvcc != NULL)
2211 return 0;
2212 lanai->conf2 &= ~CONFIG2_VCI0_NORMAL;
2213 #ifdef USE_POWERDOWN
2214 if ((lanai->conf1 & CONFIG1_POWERDOWN) == 0)
2215 #endif
2216 conf2_write(lanai);
2217 }
2218 return 1;
2219 }
2220
lanai_normalize_ci(struct lanai_dev * lanai,const struct atm_vcc * atmvcc,short * vpip,vci_t * vcip)2221 static int lanai_normalize_ci(struct lanai_dev *lanai,
2222 const struct atm_vcc *atmvcc, short *vpip, vci_t *vcip)
2223 {
2224 switch (*vpip) {
2225 case ATM_VPI_ANY:
2226 *vpip = 0;
2227 /* FALLTHROUGH */
2228 case 0:
2229 break;
2230 default:
2231 return -EADDRINUSE;
2232 }
2233 switch (*vcip) {
2234 case ATM_VCI_ANY:
2235 for (*vcip = ATM_NOT_RSV_VCI; *vcip < lanai->num_vci;
2236 (*vcip)++)
2237 if (vci_is_ok(lanai, *vcip, atmvcc))
2238 return 0;
2239 return -EADDRINUSE;
2240 default:
2241 if (*vcip >= lanai->num_vci || *vcip < 0 ||
2242 !vci_is_ok(lanai, *vcip, atmvcc))
2243 return -EADDRINUSE;
2244 }
2245 return 0;
2246 }
2247
2248 /* -------------------- MANAGE CBR: */
2249
2250 /*
2251 * CBR ICG is stored as a fixed-point number with 4 fractional bits.
2252 * Note that storing a number greater than 2046.0 will result in
2253 * incorrect shaping
2254 */
2255 #define CBRICG_FRAC_BITS (4)
2256 #define CBRICG_MAX (2046 << CBRICG_FRAC_BITS)
2257
2258 /*
2259 * ICG is related to PCR with the formula PCR = MAXPCR / (ICG + 1)
2260 * where MAXPCR is (according to the docs) 25600000/(54*8),
2261 * which is equal to (3125<<9)/27.
2262 *
2263 * Solving for ICG, we get:
2264 * ICG = MAXPCR/PCR - 1
2265 * ICG = (3125<<9)/(27*PCR) - 1
2266 * ICG = ((3125<<9) - (27*PCR)) / (27*PCR)
2267 *
2268 * The end result is supposed to be a fixed-point number with FRAC_BITS
2269 * bits of a fractional part, so we keep everything in the numerator
2270 * shifted by that much as we compute
2271 *
2272 */
pcr_to_cbricg(struct atm_qos * qos)2273 static int pcr_to_cbricg(/*const*/ struct atm_qos *qos)
2274 {
2275 int rounddown = 0; /* 1 = Round PCR down, i.e. round ICG _up_ */
2276 int x, icg, pcr = atm_pcr_goal(&qos->txtp);
2277 if (pcr == 0) /* Use maximum bandwidth */
2278 return 0;
2279 if (pcr < 0) {
2280 rounddown = 1;
2281 pcr = -pcr;
2282 }
2283 x = pcr * 27;
2284 icg = (3125 << (9 + CBRICG_FRAC_BITS)) - (x << CBRICG_FRAC_BITS);
2285 if (rounddown)
2286 icg += x - 1;
2287 icg /= x;
2288 if (icg > CBRICG_MAX)
2289 icg = CBRICG_MAX;
2290 DPRINTK("pcr_to_cbricg: pcr=%d rounddown=%c icg=%d\n",
2291 pcr, rounddown ? 'Y' : 'N', icg);
2292 return icg;
2293 }
2294
lanai_cbr_setup(struct lanai_dev * lanai)2295 static inline void lanai_cbr_setup(struct lanai_dev *lanai)
2296 {
2297 reg_write(lanai, pcr_to_cbricg(&lanai->cbrvcc->qos), CBR_ICG_Reg);
2298 reg_write(lanai, lanai->cbrvcc->vci, CBR_PTR_Reg);
2299 lanai->conf2 |= CONFIG2_CBR_ENABLE;
2300 conf2_write(lanai);
2301 }
2302
lanai_cbr_shutdown(struct lanai_dev * lanai)2303 static inline void lanai_cbr_shutdown(struct lanai_dev *lanai)
2304 {
2305 lanai->conf2 &= ~CONFIG2_CBR_ENABLE;
2306 conf2_write(lanai);
2307 }
2308
2309 /* -------------------- OPERATIONS: */
2310
2311 /* setup a newly detected device */
lanai_dev_open(struct atm_dev * atmdev)2312 static int __init lanai_dev_open(struct atm_dev *atmdev)
2313 {
2314 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
2315 unsigned long raw_base;
2316 int result;
2317
2318 DPRINTK("In lanai_dev_open()\n");
2319 /* Basic device fields */
2320 lanai->number = atmdev->number;
2321 lanai->num_vci = NUM_VCI;
2322 vci_bitfield_init(&lanai->backlog_vccs);
2323 vci_bitfield_init(&lanai->transmit_ready);
2324 lanai->naal0 = 0;
2325 #ifdef USE_POWERDOWN
2326 lanai->nbound = 0;
2327 #endif
2328 lanai->cbrvcc = NULL;
2329 memset(&lanai->stats, 0, sizeof lanai->stats);
2330 spin_lock_init(&lanai->txlock);
2331 spin_lock_init(&lanai->servicelock);
2332 atmdev->ci_range.vpi_bits = 0;
2333 atmdev->ci_range.vci_bits = 0;
2334 while (1 << atmdev->ci_range.vci_bits < lanai->num_vci)
2335 atmdev->ci_range.vci_bits++;
2336 atmdev->link_rate = ((25600000 / 8 - 8000) / 54);
2337
2338 /* 3.2: PCI initialization */
2339 if ((result = lanai_pci_start(lanai)) != 0)
2340 goto error;
2341 raw_base = (bus_addr_t) lanai->pci->resource[0].start;
2342 lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE);
2343 if (lanai->base == 0) {
2344 printk(KERN_ERR DEV_LABEL ": couldn't remap I/O space\n");
2345 goto error_pci;
2346 }
2347 /* 3.3: Reset lanai and PHY */
2348 reset_board(lanai);
2349 lanai->conf1 = reg_read(lanai, Config1_Reg);
2350 lanai->conf1 &= ~(CONFIG1_GPOUT1 | CONFIG1_POWERDOWN |
2351 CONFIG1_MASK_LEDMODE);
2352 lanai->conf1 |= CONFIG1_SET_LEDMODE(LEDMODE_NOT_SOOL);
2353 reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg);
2354 udelay(1000);
2355 conf1_write(lanai);
2356
2357 /*
2358 * 3.4: Turn on endian mode for big-endian hardware
2359 * We don't actually want to do this - the actual bit fields
2360 * in the endian register are not documented anywhere.
2361 * Instead we do the bit-flipping ourselves on big-endian
2362 * hardware.
2363 *
2364 * 3.5: get the board ID/rev by reading the reset register
2365 */
2366 result = check_board_id_and_rev("register",
2367 reg_read(lanai, Reset_Reg), &lanai->board_rev);
2368 if (result != 0)
2369 goto error_unmap;
2370
2371 /* 3.6: read EEPROM */
2372 if ((result = eeprom_read(lanai)) != 0)
2373 goto error_unmap;
2374 if ((result = eeprom_validate(lanai)) != 0)
2375 goto error_unmap;
2376
2377 /* 3.7: re-reset PHY, do loopback tests, setup PHY */
2378 reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg);
2379 udelay(1000);
2380 conf1_write(lanai);
2381 /* TODO - loopback tests */
2382 lanai->conf1 |= (CONFIG1_GPOUT2 | CONFIG1_GPOUT3 | CONFIG1_DMA_ENABLE);
2383 conf1_write(lanai);
2384
2385 /* 3.8/3.9: test and initialize card SRAM */
2386 if ((result = sram_test_and_clear(lanai)) != 0)
2387 goto error_unmap;
2388
2389 /* 3.10: initialize lanai registers */
2390 lanai->conf1 |= CONFIG1_DMA_ENABLE;
2391 conf1_write(lanai);
2392 if ((result = service_buffer_allocate(lanai)) != 0)
2393 goto error_unmap;
2394 if ((result = vcc_table_allocate(lanai)) != 0)
2395 goto error_service;
2396 lanai->conf2 = (lanai->num_vci >= 512 ? CONFIG2_HOWMANY : 0) |
2397 CONFIG2_HEC_DROP | /* ??? */ CONFIG2_PTI7_MODE;
2398 conf2_write(lanai);
2399 reg_write(lanai, TX_FIFO_DEPTH, TxDepth_Reg);
2400 reg_write(lanai, 0, CBR_ICG_Reg); /* CBR defaults to no limit */
2401 if ((result = request_irq(lanai->pci->irq, lanai_int, SA_SHIRQ,
2402 "lanai", lanai)) != 0) {
2403 printk(KERN_ERR DEV_LABEL ": can't allocate interrupt\n");
2404 goto error_vcctable;
2405 }
2406 MOD_INC_USE_COUNT; /* At this point we can't fail */
2407 intr_enable(lanai, INT_ALL & ~(INT_PING | INT_WAKE));
2408 /* 3.11: initialize loop mode (i.e. turn looping off) */
2409 lanai->conf1 = (lanai->conf1 & ~CONFIG1_MASK_LOOPMODE) |
2410 CONFIG1_SET_LOOPMODE(LOOPMODE_NORMAL) |
2411 CONFIG1_GPOUT2 | CONFIG1_GPOUT3;
2412 conf1_write(lanai);
2413 lanai->status = reg_read(lanai, Status_Reg);
2414 /* We're now done initializing this card */
2415 #ifdef USE_POWERDOWN
2416 lanai->conf1 |= CONFIG1_POWERDOWN;
2417 conf1_write(lanai);
2418 #endif
2419 memcpy(atmdev->esi, eeprom_mac(lanai), ESI_LEN);
2420 lanai_timed_poll_start(lanai);
2421 printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d, base=0x%lx, irq=%d "
2422 "(%02X-%02X-%02X-%02X-%02X-%02X)\n", lanai->number,
2423 lanai->pci_revision, (long) lanai->base, lanai->pci->irq,
2424 atmdev->esi[0], atmdev->esi[1], atmdev->esi[2],
2425 atmdev->esi[3], atmdev->esi[4], atmdev->esi[5]);
2426 printk(KERN_NOTICE DEV_LABEL "(itf %d): LANAI%s, serialno=%d(0x%X), "
2427 "board_rev=%d\n", lanai->number,
2428 lanai->type==lanai2 ? "2" : "HB", lanai->serialno,
2429 lanai->serialno, lanai->board_rev);
2430 return 0;
2431
2432 error_vcctable:
2433 vcc_table_deallocate(lanai);
2434 error_service:
2435 service_buffer_deallocate(lanai);
2436 error_unmap:
2437 reset_board(lanai);
2438 #ifdef USE_POWERDOWN
2439 lanai->conf1 = reg_read(lanai, Config1_Reg) | CONFIG1_POWERDOWN;
2440 conf1_write(lanai);
2441 #endif
2442 iounmap((void *) lanai->base);
2443 error_pci:
2444 lanai_pci_stop(lanai);
2445 error:
2446 return result;
2447 }
2448
2449 /* called when device is being shutdown, and all vcc's are gone - higher
2450 * levels will deallocate the atm device for us
2451 */
lanai_dev_close(struct atm_dev * atmdev)2452 static void lanai_dev_close(struct atm_dev *atmdev)
2453 {
2454 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
2455 printk(KERN_INFO DEV_LABEL "(itf %d): shutting down interface\n",
2456 lanai->number);
2457 lanai_timed_poll_stop(lanai);
2458 #ifdef USE_POWERDOWN
2459 lanai->conf1 = reg_read(lanai, Config1_Reg) & ~CONFIG1_POWERDOWN;
2460 conf1_write(lanai);
2461 #endif
2462 intr_disable(lanai, INT_ALL);
2463 free_irq(lanai->pci->irq, lanai);
2464 reset_board(lanai);
2465 #ifdef USE_POWERDOWN
2466 lanai->conf1 |= CONFIG1_POWERDOWN;
2467 conf1_write(lanai);
2468 #endif
2469 lanai_pci_stop(lanai);
2470 vcc_table_deallocate(lanai);
2471 service_buffer_deallocate(lanai);
2472 iounmap((void *) lanai->base);
2473 kfree(lanai);
2474 MOD_DEC_USE_COUNT;
2475 }
2476
2477 /* close a vcc */
lanai_close(struct atm_vcc * atmvcc)2478 static void lanai_close(struct atm_vcc *atmvcc)
2479 {
2480 struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data;
2481 struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
2482 if (lvcc == NULL)
2483 return;
2484 clear_bit(ATM_VF_READY, &atmvcc->flags);
2485 clear_bit(ATM_VF_PARTIAL, &atmvcc->flags);
2486 if (lvcc->rx.atmvcc == atmvcc) {
2487 lanai_shutdown_rx_vci(lvcc);
2488 if (atmvcc->qos.aal == ATM_AAL0) {
2489 if (--lanai->naal0 <= 0)
2490 aal0_buffer_free(lanai);
2491 } else
2492 lanai_buf_deallocate(&lvcc->rx.buf);
2493 lvcc->rx.atmvcc = NULL;
2494 }
2495 if (lvcc->tx.atmvcc == atmvcc) {
2496 if (atmvcc == lanai->cbrvcc) {
2497 if (lvcc->vbase != 0)
2498 lanai_cbr_shutdown(lanai);
2499 lanai->cbrvcc = NULL;
2500 }
2501 lanai_shutdown_tx_vci(lanai, lvcc);
2502 lanai_buf_deallocate(&lvcc->tx.buf);
2503 lvcc->tx.atmvcc = NULL;
2504 }
2505 if (--lvcc->nref == 0) {
2506 host_vcc_unbind(lanai, lvcc);
2507 kfree(lvcc);
2508 }
2509 atmvcc->dev_data = NULL;
2510 clear_bit(ATM_VF_ADDR, &atmvcc->flags);
2511 }
2512
2513 /* open a vcc on the card to vpi/vci */
lanai_open(struct atm_vcc * atmvcc,short vpi,int vci)2514 static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
2515 {
2516 struct lanai_dev *lanai;
2517 struct lanai_vcc *lvcc;
2518 int result = 0;
2519 /* we don't support partial open - it's not really useful anyway */
2520 if ((test_bit(ATM_VF_PARTIAL, &atmvcc->flags)) ||
2521 (vpi == ATM_VPI_UNSPEC) || (vci == ATM_VCI_UNSPEC))
2522 return -EINVAL;
2523 lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
2524 if ((result = lanai_normalize_ci(lanai, atmvcc, &vpi, &vci)) != 0)
2525 goto out;
2526 atmvcc->vpi = vpi;
2527 atmvcc->vci = vci;
2528 set_bit(ATM_VF_ADDR, &atmvcc->flags);
2529 lvcc = lanai->vccs[vci];
2530 if (atmvcc->qos.aal != ATM_AAL0 && atmvcc->qos.aal != ATM_AAL5)
2531 return -EINVAL;
2532 #if 0
2533 DPRINTK(DEV_LABEL "(itf %d): open %d.%d flags=0x%X\n",
2534 lanai->number, vpi, vci, (unsigned long) atmvcc->flags);
2535 #else
2536 DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n", lanai->number, vpi, vci);
2537 #endif
2538 if (lvcc == NULL && (lvcc = new_lanai_vcc()) == NULL)
2539 return -ENOMEM;
2540 atmvcc->dev_data = lvcc;
2541 lvcc->nref++;
2542 if (atmvcc->qos.rxtp.traffic_class != ATM_NONE) {
2543 APRINTK(lvcc->rx.atmvcc == NULL, "rx.atmvcc!=NULL, vci=%d\n",
2544 vci);
2545 if (atmvcc->qos.aal == ATM_AAL0) {
2546 if (lanai->naal0 == 0)
2547 result = aal0_buffer_allocate(lanai);
2548 } else
2549 result = lanai_setup_rx_vci_aal5(
2550 lanai->number, lvcc, &atmvcc->qos);
2551 if (result != 0)
2552 goto out_free;
2553 lvcc->rx.atmvcc = atmvcc;
2554 lvcc->stats.rx_nomem = 0;
2555 lvcc->stats.x.aal5.rx_badlen = 0;
2556 lvcc->stats.x.aal5.service_trash = 0;
2557 lvcc->stats.x.aal5.service_stream = 0;
2558 lvcc->stats.x.aal5.service_rxcrc = 0;
2559 if (atmvcc->qos.aal == ATM_AAL0)
2560 lanai->naal0++;
2561 }
2562 if (atmvcc->qos.txtp.traffic_class != ATM_NONE) {
2563 APRINTK(lvcc->tx.atmvcc == NULL, "tx.atmvcc!=NULL, vci=%d\n",
2564 vci);
2565 result = lanai_setup_tx_vci(lanai->number, lvcc, &atmvcc->qos);
2566 if (result != 0)
2567 goto out_free;
2568 lvcc->tx.atmvcc = atmvcc;
2569 if (atmvcc->qos.txtp.traffic_class == ATM_CBR) {
2570 APRINTK(lanai->cbrvcc == NULL,
2571 "cbrvcc!=NULL, vci=%d\n", vci);
2572 lanai->cbrvcc = atmvcc;
2573 }
2574 }
2575 host_vcc_bind(lanai, lvcc, vci);
2576 if (atmvcc == lvcc->rx.atmvcc)
2577 host_vcc_start_rx(lvcc);
2578 if (atmvcc == lvcc->tx.atmvcc) {
2579 host_vcc_start_tx(lvcc);
2580 if (lanai->cbrvcc == atmvcc)
2581 lanai_cbr_setup(lanai);
2582 }
2583 set_bit(ATM_VF_READY, &atmvcc->flags);
2584 return 0;
2585 out_free:
2586 lanai_close(atmvcc);
2587 out:
2588 return result;
2589 }
2590
2591 /* ioctl operations for card */
2592 /* NOTE: these are all DEBUGGING ONLY currently */
lanai_ioctl(struct atm_dev * atmdev,unsigned int cmd,void * arg)2593 static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg)
2594 {
2595 int result = 0;
2596 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
2597 switch(cmd) {
2598 case 2106275:
2599 shutdown_atm_dev(atmdev);
2600 return 0;
2601 case 2200000: {
2602 unsigned long flags;
2603 spin_lock_irqsave(&lanai->servicelock, flags);
2604 run_service(lanai);
2605 spin_unlock_irqrestore(&lanai->servicelock, flags);
2606 return 0; }
2607 case 2200001:
2608 vcc_tx_dequeue_all(lanai);
2609 return 0;
2610 case 2200002:
2611 get_statistics(lanai);
2612 return 0;
2613 case 2200003: {
2614 int i;
2615 for (i = 0; i <= 0x5C ; i += 4) {
2616 if (i==0x48) /* Write-only butt reg */
2617 continue;
2618 printk(KERN_CRIT DEV_LABEL " 0x%02X: "
2619 "0x%08X\n", i,
2620 (u32) readl(lanai->base + i));
2621 barrier(); mb();
2622 pcistatus_check(lanai, 0);
2623 barrier(); mb();
2624 }
2625 return 0; }
2626 case 2200004: {
2627 u8 b;
2628 u16 w;
2629 u32 dw;
2630 struct pci_dev *pci = lanai->pci;
2631 (void) pci_read_config_word(pci, PCI_VENDOR_ID, &w);
2632 DPRINTK("vendor = 0x%X\n", w);
2633 (void) pci_read_config_word(pci, PCI_DEVICE_ID, &w);
2634 DPRINTK("device = 0x%X\n", w);
2635 (void) pci_read_config_word(pci, PCI_COMMAND, &w);
2636 DPRINTK("command = 0x%X\n", w);
2637 (void) pci_read_config_word(pci, PCI_STATUS, &w);
2638 DPRINTK("status = 0x%X\n", w);
2639 (void) pci_read_config_dword(pci,
2640 PCI_CLASS_REVISION, &dw);
2641 DPRINTK("class/revision = 0x%X\n", dw);
2642 (void) pci_read_config_byte(pci,
2643 PCI_CACHE_LINE_SIZE, &b);
2644 DPRINTK("cache line size = 0x%X\n", b);
2645 (void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b);
2646 DPRINTK("latency = %d (0x%X)\n", b, b);
2647 (void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b);
2648 DPRINTK("header type = 0x%X\n", b);
2649 (void) pci_read_config_byte(pci, PCI_BIST, &b);
2650 DPRINTK("bist = 0x%X\n", b);
2651 /* skipping a few here */
2652 (void) pci_read_config_byte(pci,
2653 PCI_INTERRUPT_LINE, &b);
2654 DPRINTK("pci_int_line = 0x%X\n", b);
2655 (void) pci_read_config_byte(pci,
2656 PCI_INTERRUPT_PIN, &b);
2657 DPRINTK("pci_int_pin = 0x%X\n", b);
2658 (void) pci_read_config_byte(pci, PCI_MIN_GNT, &b);
2659 DPRINTK("min_gnt = 0x%X\n", b);
2660 (void) pci_read_config_byte(pci, PCI_MAX_LAT, &b);
2661 DPRINTK("max_lat = 0x%X\n", b); }
2662 return 0;
2663 #ifdef USE_POWERDOWN
2664 case 2200005:
2665 DPRINTK("Coming out of powerdown\n");
2666 lanai->conf1 &= ~CONFIG1_POWERDOWN;
2667 conf1_write(lanai);
2668 return 0;
2669 #endif
2670 default:
2671 result = -EINVAL;
2672 }
2673 return result;
2674 }
2675
lanai_send(struct atm_vcc * atmvcc,struct sk_buff * skb)2676 static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
2677 {
2678 struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data;
2679 struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
2680 unsigned long flags;
2681 if (lvcc == NULL || lvcc->vbase == 0 || lvcc->tx.atmvcc != atmvcc)
2682 goto einval;
2683 #ifdef DEBUG
2684 if (skb == NULL) {
2685 DPRINTK("lanai_send: skb==NULL for vci=%d\n", atmvcc->vci);
2686 goto einval;
2687 }
2688 if (lanai == NULL) {
2689 DPRINTK("lanai_send: lanai==NULL for vci=%d\n", atmvcc->vci);
2690 goto einval;
2691 }
2692 #endif
2693 ATM_SKB(skb)->vcc = atmvcc;
2694 switch (atmvcc->qos.aal) {
2695 case ATM_AAL5:
2696 spin_lock_irqsave(&lanai->txlock, flags);
2697 vcc_tx_aal5(lanai, lvcc, skb);
2698 spin_unlock_irqrestore(&lanai->txlock, flags);
2699 return 0;
2700 case ATM_AAL0:
2701 if (skb->len != ATM_CELL_SIZE-1)
2702 goto einval;
2703 /* NOTE - this next line is technically invalid - we haven't unshared skb */
2704 cpu_to_be32s((u32 *) skb->data);
2705 spin_lock_irqsave(&lanai->txlock, flags);
2706 vcc_tx_aal0(lanai, lvcc, skb);
2707 spin_unlock_irqrestore(&lanai->txlock, flags);
2708 return 0;
2709 }
2710 DPRINTK("lanai_send: bad aal=%d on vci=%d\n", atmvcc->qos.aal,
2711 atmvcc->vci);
2712 einval:
2713 lanai_free_skb(atmvcc, skb);
2714 return -EINVAL;
2715 }
2716
lanai_change_qos(struct atm_vcc * atmvcc,struct atm_qos * qos,int flags)2717 static int lanai_change_qos(struct atm_vcc *atmvcc,
2718 /*const*/ struct atm_qos *qos, int flags)
2719 {
2720 return -EBUSY; /* TODO: need to write this */
2721 }
2722
2723 #ifndef CONFIG_PROC_FS
2724 #define lanai_proc_read NULL
2725 #else
lanai_proc_read(struct atm_dev * atmdev,loff_t * pos,char * page)2726 static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
2727 {
2728 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
2729 loff_t left = *pos;
2730 struct lanai_vcc *lvcc;
2731 if (left-- == 0)
2732 return sprintf(page, DEV_LABEL "(itf %d): chip=LANAI%s, "
2733 "serial=%d, magic=0x%08X, num_vci=%d\n",
2734 atmdev->number, lanai->type==lanai2 ? "2" : "HB",
2735 lanai->serialno, lanai->magicno, lanai->num_vci);
2736 if (left-- == 0)
2737 return sprintf(page, "revision: board=%d, pci_if=%d\n",
2738 lanai->board_rev, lanai->pci_revision);
2739 if (left-- == 0)
2740 return sprintf(page, "EEPROM ESI: "
2741 "%02X:%02X:%02X:%02X:%02X:%02X\n",
2742 lanai->eeprom[EEPROM_MAC + 0],
2743 lanai->eeprom[EEPROM_MAC + 1],
2744 lanai->eeprom[EEPROM_MAC + 2],
2745 lanai->eeprom[EEPROM_MAC + 3],
2746 lanai->eeprom[EEPROM_MAC + 4],
2747 lanai->eeprom[EEPROM_MAC + 5]);
2748 if (left-- == 0)
2749 return sprintf(page, "status: SOOL=%d, LOCD=%d, LED=%d, "
2750 "GPIN=%d\n", (lanai->status & STATUS_SOOL) ? 1 : 0,
2751 (lanai->status & STATUS_LOCD) ? 1 : 0,
2752 (lanai->status & STATUS_LED) ? 1 : 0,
2753 (lanai->status & STATUS_GPIN) ? 1 : 0);
2754 if (left-- == 0)
2755 return sprintf(page, "global buffer sizes: service=%d, "
2756 "aal0_rx=%d\n", lanai_buf_size(&lanai->service),
2757 lanai->naal0 ? lanai_buf_size(&lanai->aal0buf) : 0);
2758 if (left-- == 0) {
2759 get_statistics(lanai);
2760 return sprintf(page, "cells in error: overflow=%d, "
2761 "closed_vci=%d, bad_HEC=%d, rx_fifo=%d\n",
2762 lanai->stats.ovfl_trash, lanai->stats.vci_trash,
2763 lanai->stats.hec_err, lanai->stats.atm_ovfl);
2764 }
2765 if (left-- == 0)
2766 return sprintf(page, "PCI errors: parity_detect=%d, "
2767 "master_abort=%d, master_target_abort=%d,\n",
2768 lanai->stats.pcierr_parity_detect,
2769 lanai->stats.pcierr_serr_set,
2770 lanai->stats.pcierr_m_target_abort);
2771 if (left-- == 0)
2772 return sprintf(page, " slave_target_abort=%d, "
2773 "master_parity=%d\n", lanai->stats.pcierr_s_target_abort,
2774 lanai->stats.pcierr_master_parity);
2775 if (left-- == 0)
2776 return sprintf(page, "service list errors: no_vcc_rx=%d, "
2777 "no_vcc_tx=%d,\n", lanai->stats.service_novcc_rx,
2778 lanai->stats.service_novcc_tx);
2779 if (left-- == 0)
2780 return sprintf(page, " no_tx=%d, "
2781 "no_rx=%d, bad_rx_aal=%d\n", lanai->stats.service_norx,
2782 lanai->stats.service_notx,
2783 lanai->stats.service_rxnotaal5);
2784 if (left-- == 0)
2785 return sprintf(page, "resets: dma=%d, card=%d\n",
2786 lanai->stats.dma_reenable, lanai->stats.card_reset);
2787 /* At this point, "left" should be the VCI we're looking for */
2788 vcclist_read_lock();
2789 for (; ; left++) {
2790 if (left >= NUM_VCI) {
2791 left = 0;
2792 goto out;
2793 }
2794 if ((lvcc = lanai->vccs[left]) != NULL)
2795 break;
2796 (*pos)++;
2797 }
2798 /* Note that we re-use "left" here since we're done with it */
2799 left = sprintf(page, "VCI %4d: nref=%d, rx_nomem=%d", (vci_t) left,
2800 lvcc->nref, lvcc->stats.rx_nomem);
2801 if (lvcc->rx.atmvcc != NULL) {
2802 left += sprintf(&page[left], ",\n rx_AAL=%d",
2803 lvcc->rx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0);
2804 if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5)
2805 left += sprintf(&page[left], ", rx_buf_size=%d, "
2806 "rx_bad_len=%d,\n rx_service_trash=%d, "
2807 "rx_service_stream=%d, rx_bad_crc=%d",
2808 lanai_buf_size(&lvcc->rx.buf),
2809 lvcc->stats.x.aal5.rx_badlen,
2810 lvcc->stats.x.aal5.service_trash,
2811 lvcc->stats.x.aal5.service_stream,
2812 lvcc->stats.x.aal5.service_rxcrc);
2813 }
2814 if (lvcc->tx.atmvcc != NULL)
2815 left += sprintf(&page[left], ",\n tx_AAL=%d, "
2816 "tx_buf_size=%d, tx_qos=%cBR, tx_backlogged=%c",
2817 lvcc->tx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0,
2818 lanai_buf_size(&lvcc->tx.buf),
2819 lvcc->tx.atmvcc == lanai->cbrvcc ? 'C' : 'U',
2820 vcc_is_backlogged(lvcc) ? 'Y' : 'N');
2821 page[left++] = '\n';
2822 page[left] = '\0';
2823 out:
2824 vcclist_read_unlock();
2825 return left;
2826 }
2827 #endif /* CONFIG_PROC_FS */
2828
2829 /* -------------------- HOOKS: */
2830
2831 static const struct atmdev_ops ops = {
2832 dev_close: lanai_dev_close,
2833 open: lanai_open,
2834 close: lanai_close,
2835 ioctl: lanai_ioctl,
2836 getsockopt: NULL,
2837 setsockopt: NULL,
2838 send: lanai_send,
2839 sg_send: NULL, /* no scatter-gather on card */
2840 send_oam: NULL, /* OAM support not in linux yet */
2841 phy_put: NULL,
2842 phy_get: NULL,
2843 feedback: NULL,
2844 change_qos: lanai_change_qos,
2845 proc_read: lanai_proc_read
2846 };
2847
2848 /* detect one type of card LANAI2 or LANAIHB */
lanai_detect_1(unsigned int vendor,unsigned int device)2849 static int __init lanai_detect_1(unsigned int vendor, unsigned int device)
2850 {
2851 struct pci_dev *pci = NULL;
2852 struct lanai_dev *lanai;
2853 struct atm_dev *atmdev;
2854 int count = 0, result;
2855 while ((pci = pci_find_device(vendor, device, pci)) != NULL) {
2856 lanai = (struct lanai_dev *)
2857 kmalloc(sizeof *lanai, GFP_KERNEL);
2858 if (lanai == NULL) {
2859 printk(KERN_ERR DEV_LABEL ": couldn't allocate "
2860 "dev_data structure!\n");
2861 break;
2862 }
2863 atmdev = atm_dev_register(DEV_LABEL, &ops, -1, 0);
2864 if (atmdev == NULL) {
2865 printk(KERN_ERR DEV_LABEL ": couldn't register "
2866 "atm device!\n");
2867 kfree(lanai);
2868 break;
2869 }
2870 atmdev->dev_data = lanai;
2871 lanai->pci = pci;
2872 lanai->type = (enum lanai_type) device;
2873 if ((result = lanai_dev_open(atmdev)) != 0) {
2874 DPRINTK("lanai_start() failed, err=%d\n", -result);
2875 atm_dev_deregister(atmdev);
2876 kfree(lanai);
2877 continue;
2878 }
2879 count++;
2880 }
2881 return count;
2882 }
2883
2884 #ifdef MODULE
2885 static
2886 #endif
lanai_detect(void)2887 int __init lanai_detect(void)
2888 {
2889 return lanai_detect_1(PCI_VENDOR_ID_EF, PCI_VENDOR_ID_EF_ATM_LANAI2) +
2890 lanai_detect_1(PCI_VENDOR_ID_EF, PCI_VENDOR_ID_EF_ATM_LANAIHB);
2891 }
2892
2893 #ifdef MODULE
2894
init_module(void)2895 int init_module(void)
2896 {
2897 if (lanai_detect() == 0) {
2898 printk(KERN_ERR DEV_LABEL ": no adaptor found\n");
2899 return -ENODEV;
2900 }
2901 return 0;
2902 }
2903
cleanup_module(void)2904 void cleanup_module(void)
2905 {
2906 /* We'll only get called when all the interfaces are already
2907 * gone, so there isn't much to do
2908 */
2909 DPRINTK("cleanup_module()\n");
2910 }
2911
2912 MODULE_AUTHOR("Mitchell Blank Jr <mitch@sfgoth.com>");
2913 MODULE_DESCRIPTION("Efficient Networks Speedstream 3010 driver");
2914 MODULE_LICENSE("GPL");
2915
2916 #endif /* MODULE */
2917