Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / atm / he.c
1 /*
2
3   he.c
4
5   ForeRunnerHE ATM Adapter driver for ATM on Linux
6   Copyright (C) 1999-2001  Naval Research Laboratory
7
8   This library is free software; you can redistribute it and/or
9   modify it under the terms of the GNU Lesser General Public
10   License as published by the Free Software Foundation; either
11   version 2.1 of the License, or (at your option) any later version.
12
13   This library is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public
19   License along with this library; if not, write to the Free Software
20   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21
22 */
23
24 /*
25
26   he.c
27
28   ForeRunnerHE ATM Adapter driver for ATM on Linux
29   Copyright (C) 1999-2001  Naval Research Laboratory
30
31   Permission to use, copy, modify and distribute this software and its
32   documentation is hereby granted, provided that both the copyright
33   notice and this permission notice appear in all copies of the software,
34   derivative works or modified versions, and any portions thereof, and
35   that both notices appear in supporting documentation.
36
37   NRL ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
38   DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER
39   RESULTING FROM THE USE OF THIS SOFTWARE.
40
41   This driver was written using the "Programmer's Reference Manual for
42   ForeRunnerHE(tm)", MANU0361-01 - Rev. A, 08/21/98.
43
44   AUTHORS:
45         chas williams <chas@cmf.nrl.navy.mil>
46         eric kinzie <ekinzie@cmf.nrl.navy.mil>
47
48   NOTES:
49         4096 supported 'connections'
50         group 0 is used for all traffic
51         interrupt queue 0 is used for all interrupts
52         aal0 support (based on work from ulrich.u.muller@nokia.com)
53
54  */
55
56 #include <linux/module.h>
57 #include <linux/kernel.h>
58 #include <linux/skbuff.h>
59 #include <linux/pci.h>
60 #include <linux/errno.h>
61 #include <linux/types.h>
62 #include <linux/string.h>
63 #include <linux/delay.h>
64 #include <linux/init.h>
65 #include <linux/mm.h>
66 #include <linux/sched.h>
67 #include <linux/timer.h>
68 #include <linux/interrupt.h>
69 #include <linux/dma-mapping.h>
70 #include <asm/io.h>
71 #include <asm/byteorder.h>
72 #include <asm/uaccess.h>
73
74 #include <linux/atmdev.h>
75 #include <linux/atm.h>
76 #include <linux/sonet.h>
77
78 #undef USE_SCATTERGATHER
79 #undef USE_CHECKSUM_HW                  /* still confused about this */
80 /* #undef HE_DEBUG */
81
82 #include "he.h"
83 #include "suni.h"
84 #include <linux/atm_he.h>
85
86 #define hprintk(fmt,args...)    printk(KERN_ERR DEV_LABEL "%d: " fmt, he_dev->number , ##args)
87
88 #ifdef HE_DEBUG
89 #define HPRINTK(fmt,args...)    printk(KERN_DEBUG DEV_LABEL "%d: " fmt, he_dev->number , ##args)
90 #else /* !HE_DEBUG */
91 #define HPRINTK(fmt,args...)    do { } while (0)
92 #endif /* HE_DEBUG */
93
94 /* declarations */
95
96 static int he_open(struct atm_vcc *vcc);
97 static void he_close(struct atm_vcc *vcc);
98 static int he_send(struct atm_vcc *vcc, struct sk_buff *skb);
99 static int he_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg);
100 static irqreturn_t he_irq_handler(int irq, void *dev_id);
101 static void he_tasklet(unsigned long data);
102 static int he_proc_read(struct atm_dev *dev,loff_t *pos,char *page);
103 static int he_start(struct atm_dev *dev);
104 static void he_stop(struct he_dev *dev);
105 static void he_phy_put(struct atm_dev *, unsigned char, unsigned long);
106 static unsigned char he_phy_get(struct atm_dev *, unsigned long);
107
108 static u8 read_prom_byte(struct he_dev *he_dev, int addr);
109
110 /* globals */
111
112 static struct he_dev *he_devs;
113 static int disable64;
114 static short nvpibits = -1;
115 static short nvcibits = -1;
116 static short rx_skb_reserve = 16;
117 static int irq_coalesce = 1;
118 static int sdh = 0;
119
120 /* Read from EEPROM = 0000 0011b */
121 static unsigned int readtab[] = {
122         CS_HIGH | CLK_HIGH,
123         CS_LOW | CLK_LOW,
124         CLK_HIGH,               /* 0 */
125         CLK_LOW,
126         CLK_HIGH,               /* 0 */
127         CLK_LOW,
128         CLK_HIGH,               /* 0 */
129         CLK_LOW,
130         CLK_HIGH,               /* 0 */
131         CLK_LOW,
132         CLK_HIGH,               /* 0 */
133         CLK_LOW,
134         CLK_HIGH,               /* 0 */
135         CLK_LOW | SI_HIGH,
136         CLK_HIGH | SI_HIGH,     /* 1 */
137         CLK_LOW | SI_HIGH,
138         CLK_HIGH | SI_HIGH      /* 1 */
139 };     
140  
141 /* Clock to read from/write to the EEPROM */
142 static unsigned int clocktab[] = {
143         CLK_LOW,
144         CLK_HIGH,
145         CLK_LOW,
146         CLK_HIGH,
147         CLK_LOW,
148         CLK_HIGH,
149         CLK_LOW,
150         CLK_HIGH,
151         CLK_LOW,
152         CLK_HIGH,
153         CLK_LOW,
154         CLK_HIGH,
155         CLK_LOW,
156         CLK_HIGH,
157         CLK_LOW,
158         CLK_HIGH,
159         CLK_LOW
160 };     
161
162 static struct atmdev_ops he_ops =
163 {
164         .open =         he_open,
165         .close =        he_close,       
166         .ioctl =        he_ioctl,       
167         .send =         he_send,
168         .phy_put =      he_phy_put,
169         .phy_get =      he_phy_get,
170         .proc_read =    he_proc_read,
171         .owner =        THIS_MODULE
172 };
173
174 #define he_writel(dev, val, reg)        do { writel(val, (dev)->membase + (reg)); wmb(); } while (0)
175 #define he_readl(dev, reg)              readl((dev)->membase + (reg))
176
177 /* section 2.12 connection memory access */
178
179 static __inline__ void
180 he_writel_internal(struct he_dev *he_dev, unsigned val, unsigned addr,
181                                                                 unsigned flags)
182 {
183         he_writel(he_dev, val, CON_DAT);
184         (void) he_readl(he_dev, CON_DAT);               /* flush posted writes */
185         he_writel(he_dev, flags | CON_CTL_WRITE | CON_CTL_ADDR(addr), CON_CTL);
186         while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY);
187 }
188
189 #define he_writel_rcm(dev, val, reg)                            \
190                         he_writel_internal(dev, val, reg, CON_CTL_RCM)
191
192 #define he_writel_tcm(dev, val, reg)                            \
193                         he_writel_internal(dev, val, reg, CON_CTL_TCM)
194
195 #define he_writel_mbox(dev, val, reg)                           \
196                         he_writel_internal(dev, val, reg, CON_CTL_MBOX)
197
198 static unsigned
199 he_readl_internal(struct he_dev *he_dev, unsigned addr, unsigned flags)
200 {
201         he_writel(he_dev, flags | CON_CTL_READ | CON_CTL_ADDR(addr), CON_CTL);
202         while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY);
203         return he_readl(he_dev, CON_DAT);
204 }
205
206 #define he_readl_rcm(dev, reg) \
207                         he_readl_internal(dev, reg, CON_CTL_RCM)
208
209 #define he_readl_tcm(dev, reg) \
210                         he_readl_internal(dev, reg, CON_CTL_TCM)
211
212 #define he_readl_mbox(dev, reg) \
213                         he_readl_internal(dev, reg, CON_CTL_MBOX)
214
215
216 /* figure 2.2 connection id */
217
218 #define he_mkcid(dev, vpi, vci)         (((vpi << (dev)->vcibits) | vci) & 0x1fff)
219
220 /* 2.5.1 per connection transmit state registers */
221
222 #define he_writel_tsr0(dev, val, cid) \
223                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 0)
224 #define he_readl_tsr0(dev, cid) \
225                 he_readl_tcm(dev, CONFIG_TSRA | (cid << 3) | 0)
226
227 #define he_writel_tsr1(dev, val, cid) \
228                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 1)
229
230 #define he_writel_tsr2(dev, val, cid) \
231                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 2)
232
233 #define he_writel_tsr3(dev, val, cid) \
234                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 3)
235
236 #define he_writel_tsr4(dev, val, cid) \
237                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 4)
238
239         /* from page 2-20
240          *
241          * NOTE While the transmit connection is active, bits 23 through 0
242          *      of this register must not be written by the host.  Byte
243          *      enables should be used during normal operation when writing
244          *      the most significant byte.
245          */
246
247 #define he_writel_tsr4_upper(dev, val, cid) \
248                 he_writel_internal(dev, val, CONFIG_TSRA | (cid << 3) | 4, \
249                                                         CON_CTL_TCM \
250                                                         | CON_BYTE_DISABLE_2 \
251                                                         | CON_BYTE_DISABLE_1 \
252                                                         | CON_BYTE_DISABLE_0)
253
254 #define he_readl_tsr4(dev, cid) \
255                 he_readl_tcm(dev, CONFIG_TSRA | (cid << 3) | 4)
256
257 #define he_writel_tsr5(dev, val, cid) \
258                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 5)
259
260 #define he_writel_tsr6(dev, val, cid) \
261                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 6)
262
263 #define he_writel_tsr7(dev, val, cid) \
264                 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 7)
265
266
267 #define he_writel_tsr8(dev, val, cid) \
268                 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 0)
269
270 #define he_writel_tsr9(dev, val, cid) \
271                 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 1)
272
273 #define he_writel_tsr10(dev, val, cid) \
274                 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 2)
275
276 #define he_writel_tsr11(dev, val, cid) \
277                 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 3)
278
279
280 #define he_writel_tsr12(dev, val, cid) \
281                 he_writel_tcm(dev, val, CONFIG_TSRC | (cid << 1) | 0)
282
283 #define he_writel_tsr13(dev, val, cid) \
284                 he_writel_tcm(dev, val, CONFIG_TSRC | (cid << 1) | 1)
285
286
287 #define he_writel_tsr14(dev, val, cid) \
288                 he_writel_tcm(dev, val, CONFIG_TSRD | cid)
289
290 #define he_writel_tsr14_upper(dev, val, cid) \
291                 he_writel_internal(dev, val, CONFIG_TSRD | cid, \
292                                                         CON_CTL_TCM \
293                                                         | CON_BYTE_DISABLE_2 \
294                                                         | CON_BYTE_DISABLE_1 \
295                                                         | CON_BYTE_DISABLE_0)
296
297 /* 2.7.1 per connection receive state registers */
298
299 #define he_writel_rsr0(dev, val, cid) \
300                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 0)
301 #define he_readl_rsr0(dev, cid) \
302                 he_readl_rcm(dev, 0x00000 | (cid << 3) | 0)
303
304 #define he_writel_rsr1(dev, val, cid) \
305                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 1)
306
307 #define he_writel_rsr2(dev, val, cid) \
308                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 2)
309
310 #define he_writel_rsr3(dev, val, cid) \
311                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 3)
312
313 #define he_writel_rsr4(dev, val, cid) \
314                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 4)
315
316 #define he_writel_rsr5(dev, val, cid) \
317                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 5)
318
319 #define he_writel_rsr6(dev, val, cid) \
320                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 6)
321
322 #define he_writel_rsr7(dev, val, cid) \
323                 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 7)
324
325 static __inline__ struct atm_vcc*
326 __find_vcc(struct he_dev *he_dev, unsigned cid)
327 {
328         struct hlist_head *head;
329         struct atm_vcc *vcc;
330         struct hlist_node *node;
331         struct sock *s;
332         short vpi;
333         int vci;
334
335         vpi = cid >> he_dev->vcibits;
336         vci = cid & ((1 << he_dev->vcibits) - 1);
337         head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
338
339         sk_for_each(s, node, head) {
340                 vcc = atm_sk(s);
341                 if (vcc->dev == he_dev->atm_dev &&
342                     vcc->vci == vci && vcc->vpi == vpi &&
343                     vcc->qos.rxtp.traffic_class != ATM_NONE) {
344                                 return vcc;
345                 }
346         }
347         return NULL;
348 }
349
350 static int __devinit
351 he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
352 {
353         struct atm_dev *atm_dev = NULL;
354         struct he_dev *he_dev = NULL;
355         int err = 0;
356
357         printk(KERN_INFO "ATM he driver\n");
358
359         if (pci_enable_device(pci_dev))
360                 return -EIO;
361         if (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32)) != 0) {
362                 printk(KERN_WARNING "he: no suitable dma available\n");
363                 err = -EIO;
364                 goto init_one_failure;
365         }
366
367         atm_dev = atm_dev_register(DEV_LABEL, &he_ops, -1, NULL);
368         if (!atm_dev) {
369                 err = -ENODEV;
370                 goto init_one_failure;
371         }
372         pci_set_drvdata(pci_dev, atm_dev);
373
374         he_dev = kzalloc(sizeof(struct he_dev),
375                                                         GFP_KERNEL);
376         if (!he_dev) {
377                 err = -ENOMEM;
378                 goto init_one_failure;
379         }
380         he_dev->pci_dev = pci_dev;
381         he_dev->atm_dev = atm_dev;
382         he_dev->atm_dev->dev_data = he_dev;
383         atm_dev->dev_data = he_dev;
384         he_dev->number = atm_dev->number;
385         tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev);
386         spin_lock_init(&he_dev->global_lock);
387
388         if (he_start(atm_dev)) {
389                 he_stop(he_dev);
390                 err = -ENODEV;
391                 goto init_one_failure;
392         }
393         he_dev->next = NULL;
394         if (he_devs)
395                 he_dev->next = he_devs;
396         he_devs = he_dev;
397         return 0;
398
399 init_one_failure:
400         if (atm_dev)
401                 atm_dev_deregister(atm_dev);
402         kfree(he_dev);
403         pci_disable_device(pci_dev);
404         return err;
405 }
406
407 static void __devexit
408 he_remove_one (struct pci_dev *pci_dev)
409 {
410         struct atm_dev *atm_dev;
411         struct he_dev *he_dev;
412
413         atm_dev = pci_get_drvdata(pci_dev);
414         he_dev = HE_DEV(atm_dev);
415
416         /* need to remove from he_devs */
417
418         he_stop(he_dev);
419         atm_dev_deregister(atm_dev);
420         kfree(he_dev);
421
422         pci_set_drvdata(pci_dev, NULL);
423         pci_disable_device(pci_dev);
424 }
425
426
427 static unsigned
428 rate_to_atmf(unsigned rate)             /* cps to atm forum format */
429 {
430 #define NONZERO (1 << 14)
431
432         unsigned exp = 0;
433
434         if (rate == 0)
435                 return 0;
436
437         rate <<= 9;
438         while (rate > 0x3ff) {
439                 ++exp;
440                 rate >>= 1;
441         }
442
443         return (NONZERO | (exp << 9) | (rate & 0x1ff));
444 }
445
446 static void __devinit
447 he_init_rx_lbfp0(struct he_dev *he_dev)
448 {
449         unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
450         unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
451         unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD;
452         unsigned row_offset = he_dev->r0_startrow * he_dev->bytes_per_row;
453         
454         lbufd_index = 0;
455         lbm_offset = he_readl(he_dev, RCMLBM_BA);
456
457         he_writel(he_dev, lbufd_index, RLBF0_H);
458
459         for (i = 0, lbuf_count = 0; i < he_dev->r0_numbuffs; ++i) {
460                 lbufd_index += 2;
461                 lbuf_addr = (row_offset + (lbuf_count * lbuf_bufsize)) / 32;
462
463                 he_writel_rcm(he_dev, lbuf_addr, lbm_offset);
464                 he_writel_rcm(he_dev, lbufd_index, lbm_offset + 1);
465
466                 if (++lbuf_count == lbufs_per_row) {
467                         lbuf_count = 0;
468                         row_offset += he_dev->bytes_per_row;
469                 }
470                 lbm_offset += 4;
471         }
472                 
473         he_writel(he_dev, lbufd_index - 2, RLBF0_T);
474         he_writel(he_dev, he_dev->r0_numbuffs, RLBF0_C);
475 }
476
477 static void __devinit
478 he_init_rx_lbfp1(struct he_dev *he_dev)
479 {
480         unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
481         unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
482         unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD;
483         unsigned row_offset = he_dev->r1_startrow * he_dev->bytes_per_row;
484         
485         lbufd_index = 1;
486         lbm_offset = he_readl(he_dev, RCMLBM_BA) + (2 * lbufd_index);
487
488         he_writel(he_dev, lbufd_index, RLBF1_H);
489
490         for (i = 0, lbuf_count = 0; i < he_dev->r1_numbuffs; ++i) {
491                 lbufd_index += 2;
492                 lbuf_addr = (row_offset + (lbuf_count * lbuf_bufsize)) / 32;
493
494                 he_writel_rcm(he_dev, lbuf_addr, lbm_offset);
495                 he_writel_rcm(he_dev, lbufd_index, lbm_offset + 1);
496
497                 if (++lbuf_count == lbufs_per_row) {
498                         lbuf_count = 0;
499                         row_offset += he_dev->bytes_per_row;
500                 }
501                 lbm_offset += 4;
502         }
503                 
504         he_writel(he_dev, lbufd_index - 2, RLBF1_T);
505         he_writel(he_dev, he_dev->r1_numbuffs, RLBF1_C);
506 }
507
508 static void __devinit
509 he_init_tx_lbfp(struct he_dev *he_dev)
510 {
511         unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
512         unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
513         unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD;
514         unsigned row_offset = he_dev->tx_startrow * he_dev->bytes_per_row;
515         
516         lbufd_index = he_dev->r0_numbuffs + he_dev->r1_numbuffs;
517         lbm_offset = he_readl(he_dev, RCMLBM_BA) + (2 * lbufd_index);
518
519         he_writel(he_dev, lbufd_index, TLBF_H);
520
521         for (i = 0, lbuf_count = 0; i < he_dev->tx_numbuffs; ++i) {
522                 lbufd_index += 1;
523                 lbuf_addr = (row_offset + (lbuf_count * lbuf_bufsize)) / 32;
524
525                 he_writel_rcm(he_dev, lbuf_addr, lbm_offset);
526                 he_writel_rcm(he_dev, lbufd_index, lbm_offset + 1);
527
528                 if (++lbuf_count == lbufs_per_row) {
529                         lbuf_count = 0;
530                         row_offset += he_dev->bytes_per_row;
531                 }
532                 lbm_offset += 2;
533         }
534                 
535         he_writel(he_dev, lbufd_index - 1, TLBF_T);
536 }
537
538 static int __devinit
539 he_init_tpdrq(struct he_dev *he_dev)
540 {
541         he_dev->tpdrq_base = pci_alloc_consistent(he_dev->pci_dev,
542                 CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq), &he_dev->tpdrq_phys);
543         if (he_dev->tpdrq_base == NULL) {
544                 hprintk("failed to alloc tpdrq\n");
545                 return -ENOMEM;
546         }
547         memset(he_dev->tpdrq_base, 0,
548                                 CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq));
549
550         he_dev->tpdrq_tail = he_dev->tpdrq_base;
551         he_dev->tpdrq_head = he_dev->tpdrq_base;
552
553         he_writel(he_dev, he_dev->tpdrq_phys, TPDRQ_B_H);
554         he_writel(he_dev, 0, TPDRQ_T);  
555         he_writel(he_dev, CONFIG_TPDRQ_SIZE - 1, TPDRQ_S);
556
557         return 0;
558 }
559
560 static void __devinit
561 he_init_cs_block(struct he_dev *he_dev)
562 {
563         unsigned clock, rate, delta;
564         int reg;
565
566         /* 5.1.7 cs block initialization */
567
568         for (reg = 0; reg < 0x20; ++reg)
569                 he_writel_mbox(he_dev, 0x0, CS_STTIM0 + reg);
570
571         /* rate grid timer reload values */
572
573         clock = he_is622(he_dev) ? 66667000 : 50000000;
574         rate = he_dev->atm_dev->link_rate;
575         delta = rate / 16 / 2;
576
577         for (reg = 0; reg < 0x10; ++reg) {
578                 /* 2.4 internal transmit function
579                  *
580                  * we initialize the first row in the rate grid.
581                  * values are period (in clock cycles) of timer
582                  */
583                 unsigned period = clock / rate;
584
585                 he_writel_mbox(he_dev, period, CS_TGRLD0 + reg);
586                 rate -= delta;
587         }
588
589         if (he_is622(he_dev)) {
590                 /* table 5.2 (4 cells per lbuf) */
591                 he_writel_mbox(he_dev, 0x000800fa, CS_ERTHR0);
592                 he_writel_mbox(he_dev, 0x000c33cb, CS_ERTHR1);
593                 he_writel_mbox(he_dev, 0x0010101b, CS_ERTHR2);
594                 he_writel_mbox(he_dev, 0x00181dac, CS_ERTHR3);
595                 he_writel_mbox(he_dev, 0x00280600, CS_ERTHR4);
596
597                 /* table 5.3, 5.4, 5.5, 5.6, 5.7 */
598                 he_writel_mbox(he_dev, 0x023de8b3, CS_ERCTL0);
599                 he_writel_mbox(he_dev, 0x1801, CS_ERCTL1);
600                 he_writel_mbox(he_dev, 0x68b3, CS_ERCTL2);
601                 he_writel_mbox(he_dev, 0x1280, CS_ERSTAT0);
602                 he_writel_mbox(he_dev, 0x68b3, CS_ERSTAT1);
603                 he_writel_mbox(he_dev, 0x14585, CS_RTFWR);
604
605                 he_writel_mbox(he_dev, 0x4680, CS_RTATR);
606
607                 /* table 5.8 */
608                 he_writel_mbox(he_dev, 0x00159ece, CS_TFBSET);
609                 he_writel_mbox(he_dev, 0x68b3, CS_WCRMAX);
610                 he_writel_mbox(he_dev, 0x5eb3, CS_WCRMIN);
611                 he_writel_mbox(he_dev, 0xe8b3, CS_WCRINC);
612                 he_writel_mbox(he_dev, 0xdeb3, CS_WCRDEC);
613                 he_writel_mbox(he_dev, 0x68b3, CS_WCRCEIL);
614
615                 /* table 5.9 */
616                 he_writel_mbox(he_dev, 0x5, CS_OTPPER);
617                 he_writel_mbox(he_dev, 0x14, CS_OTWPER);
618         } else {
619                 /* table 5.1 (4 cells per lbuf) */
620                 he_writel_mbox(he_dev, 0x000400ea, CS_ERTHR0);
621                 he_writel_mbox(he_dev, 0x00063388, CS_ERTHR1);
622                 he_writel_mbox(he_dev, 0x00081018, CS_ERTHR2);
623                 he_writel_mbox(he_dev, 0x000c1dac, CS_ERTHR3);
624                 he_writel_mbox(he_dev, 0x0014051a, CS_ERTHR4);
625
626                 /* table 5.3, 5.4, 5.5, 5.6, 5.7 */
627                 he_writel_mbox(he_dev, 0x0235e4b1, CS_ERCTL0);
628                 he_writel_mbox(he_dev, 0x4701, CS_ERCTL1);
629                 he_writel_mbox(he_dev, 0x64b1, CS_ERCTL2);
630                 he_writel_mbox(he_dev, 0x1280, CS_ERSTAT0);
631                 he_writel_mbox(he_dev, 0x64b1, CS_ERSTAT1);
632                 he_writel_mbox(he_dev, 0xf424, CS_RTFWR);
633
634                 he_writel_mbox(he_dev, 0x4680, CS_RTATR);
635
636                 /* table 5.8 */
637                 he_writel_mbox(he_dev, 0x000563b7, CS_TFBSET);
638                 he_writel_mbox(he_dev, 0x64b1, CS_WCRMAX);
639                 he_writel_mbox(he_dev, 0x5ab1, CS_WCRMIN);
640                 he_writel_mbox(he_dev, 0xe4b1, CS_WCRINC);
641                 he_writel_mbox(he_dev, 0xdab1, CS_WCRDEC);
642                 he_writel_mbox(he_dev, 0x64b1, CS_WCRCEIL);
643
644                 /* table 5.9 */
645                 he_writel_mbox(he_dev, 0x6, CS_OTPPER);
646                 he_writel_mbox(he_dev, 0x1e, CS_OTWPER);
647         }
648
649         he_writel_mbox(he_dev, 0x8, CS_OTTLIM);
650
651         for (reg = 0; reg < 0x8; ++reg)
652                 he_writel_mbox(he_dev, 0x0, CS_HGRRT0 + reg);
653
654 }
655
656 static int __devinit
657 he_init_cs_block_rcm(struct he_dev *he_dev)
658 {
659         unsigned (*rategrid)[16][16];
660         unsigned rate, delta;
661         int i, j, reg;
662
663         unsigned rate_atmf, exp, man;
664         unsigned long long rate_cps;
665         int mult, buf, buf_limit = 4;
666
667         rategrid = kmalloc( sizeof(unsigned) * 16 * 16, GFP_KERNEL);
668         if (!rategrid)
669                 return -ENOMEM;
670
671         /* initialize rate grid group table */
672
673         for (reg = 0x0; reg < 0xff; ++reg)
674                 he_writel_rcm(he_dev, 0x0, CONFIG_RCMABR + reg);
675
676         /* initialize rate controller groups */
677
678         for (reg = 0x100; reg < 0x1ff; ++reg)
679                 he_writel_rcm(he_dev, 0x0, CONFIG_RCMABR + reg);
680         
681         /* initialize tNrm lookup table */
682
683         /* the manual makes reference to a routine in a sample driver
684            for proper configuration; fortunately, we only need this
685            in order to support abr connection */
686         
687         /* initialize rate to group table */
688
689         rate = he_dev->atm_dev->link_rate;
690         delta = rate / 32;
691
692         /*
693          * 2.4 transmit internal functions
694          * 
695          * we construct a copy of the rate grid used by the scheduler
696          * in order to construct the rate to group table below
697          */
698
699         for (j = 0; j < 16; j++) {
700                 (*rategrid)[0][j] = rate;
701                 rate -= delta;
702         }
703
704         for (i = 1; i < 16; i++)
705                 for (j = 0; j < 16; j++)
706                         if (i > 14)
707                                 (*rategrid)[i][j] = (*rategrid)[i - 1][j] / 4;
708                         else
709                                 (*rategrid)[i][j] = (*rategrid)[i - 1][j] / 2;
710
711         /*
712          * 2.4 transmit internal function
713          *
714          * this table maps the upper 5 bits of exponent and mantissa
715          * of the atm forum representation of the rate into an index
716          * on rate grid  
717          */
718
719         rate_atmf = 0;
720         while (rate_atmf < 0x400) {
721                 man = (rate_atmf & 0x1f) << 4;
722                 exp = rate_atmf >> 5;
723
724                 /* 
725                         instead of '/ 512', use '>> 9' to prevent a call
726                         to divdu3 on x86 platforms
727                 */
728                 rate_cps = (unsigned long long) (1 << exp) * (man + 512) >> 9;
729
730                 if (rate_cps < 10)
731                         rate_cps = 10;  /* 2.2.1 minimum payload rate is 10 cps */
732
733                 for (i = 255; i > 0; i--)
734                         if ((*rategrid)[i/16][i%16] >= rate_cps)
735                                 break;   /* pick nearest rate instead? */
736
737                 /*
738                  * each table entry is 16 bits: (rate grid index (8 bits)
739                  * and a buffer limit (8 bits)
740                  * there are two table entries in each 32-bit register
741                  */
742
743 #ifdef notdef
744                 buf = rate_cps * he_dev->tx_numbuffs /
745                                 (he_dev->atm_dev->link_rate * 2);
746 #else
747                 /* this is pretty, but avoids _divdu3 and is mostly correct */
748                 mult = he_dev->atm_dev->link_rate / ATM_OC3_PCR;
749                 if (rate_cps > (272 * mult))
750                         buf = 4;
751                 else if (rate_cps > (204 * mult))
752                         buf = 3;
753                 else if (rate_cps > (136 * mult))
754                         buf = 2;
755                 else if (rate_cps > (68 * mult))
756                         buf = 1;
757                 else
758                         buf = 0;
759 #endif
760                 if (buf > buf_limit)
761                         buf = buf_limit;
762                 reg = (reg << 16) | ((i << 8) | buf);
763
764 #define RTGTBL_OFFSET 0x400
765           
766                 if (rate_atmf & 0x1)
767                         he_writel_rcm(he_dev, reg,
768                                 CONFIG_RCMABR + RTGTBL_OFFSET + (rate_atmf >> 1));
769
770                 ++rate_atmf;
771         }
772
773         kfree(rategrid);
774         return 0;
775 }
776
777 static int __devinit
778 he_init_group(struct he_dev *he_dev, int group)
779 {
780         int i;
781
782         /* small buffer pool */
783         he_dev->rbps_pool = pci_pool_create("rbps", he_dev->pci_dev,
784                         CONFIG_RBPS_BUFSIZE, 8, 0);
785         if (he_dev->rbps_pool == NULL) {
786                 hprintk("unable to create rbps pages\n");
787                 return -ENOMEM;
788         }
789
790         he_dev->rbps_base = pci_alloc_consistent(he_dev->pci_dev,
791                 CONFIG_RBPS_SIZE * sizeof(struct he_rbp), &he_dev->rbps_phys);
792         if (he_dev->rbps_base == NULL) {
793                 hprintk("failed to alloc rbps_base\n");
794                 goto out_destroy_rbps_pool;
795         }
796         memset(he_dev->rbps_base, 0, CONFIG_RBPS_SIZE * sizeof(struct he_rbp));
797         he_dev->rbps_virt = kmalloc(CONFIG_RBPS_SIZE * sizeof(struct he_virt), GFP_KERNEL);
798         if (he_dev->rbps_virt == NULL) {
799                 hprintk("failed to alloc rbps_virt\n");
800                 goto out_free_rbps_base;
801         }
802
803         for (i = 0; i < CONFIG_RBPS_SIZE; ++i) {
804                 dma_addr_t dma_handle;
805                 void *cpuaddr;
806
807                 cpuaddr = pci_pool_alloc(he_dev->rbps_pool, GFP_KERNEL|GFP_DMA, &dma_handle);
808                 if (cpuaddr == NULL)
809                         goto out_free_rbps_virt;
810
811                 he_dev->rbps_virt[i].virt = cpuaddr;
812                 he_dev->rbps_base[i].status = RBP_LOANED | RBP_SMALLBUF | (i << RBP_INDEX_OFF);
813                 he_dev->rbps_base[i].phys = dma_handle;
814
815         }
816         he_dev->rbps_tail = &he_dev->rbps_base[CONFIG_RBPS_SIZE - 1];
817
818         he_writel(he_dev, he_dev->rbps_phys, G0_RBPS_S + (group * 32));
819         he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail),
820                                                 G0_RBPS_T + (group * 32));
821         he_writel(he_dev, CONFIG_RBPS_BUFSIZE/4,
822                                                 G0_RBPS_BS + (group * 32));
823         he_writel(he_dev,
824                         RBP_THRESH(CONFIG_RBPS_THRESH) |
825                         RBP_QSIZE(CONFIG_RBPS_SIZE - 1) |
826                         RBP_INT_ENB,
827                                                 G0_RBPS_QI + (group * 32));
828
829         /* large buffer pool */
830         he_dev->rbpl_pool = pci_pool_create("rbpl", he_dev->pci_dev,
831                         CONFIG_RBPL_BUFSIZE, 8, 0);
832         if (he_dev->rbpl_pool == NULL) {
833                 hprintk("unable to create rbpl pool\n");
834                 goto out_free_rbps_virt;
835         }
836
837         he_dev->rbpl_base = pci_alloc_consistent(he_dev->pci_dev,
838                 CONFIG_RBPL_SIZE * sizeof(struct he_rbp), &he_dev->rbpl_phys);
839         if (he_dev->rbpl_base == NULL) {
840                 hprintk("failed to alloc rbpl_base\n");
841                 goto out_destroy_rbpl_pool;
842         }
843         memset(he_dev->rbpl_base, 0, CONFIG_RBPL_SIZE * sizeof(struct he_rbp));
844         he_dev->rbpl_virt = kmalloc(CONFIG_RBPL_SIZE * sizeof(struct he_virt), GFP_KERNEL);
845         if (he_dev->rbpl_virt == NULL) {
846                 hprintk("failed to alloc rbpl_virt\n");
847                 goto out_free_rbpl_base;
848         }
849
850         for (i = 0; i < CONFIG_RBPL_SIZE; ++i) {
851                 dma_addr_t dma_handle;
852                 void *cpuaddr;
853
854                 cpuaddr = pci_pool_alloc(he_dev->rbpl_pool, GFP_KERNEL|GFP_DMA, &dma_handle);
855                 if (cpuaddr == NULL)
856                         goto out_free_rbpl_virt;
857
858                 he_dev->rbpl_virt[i].virt = cpuaddr;
859                 he_dev->rbpl_base[i].status = RBP_LOANED | (i << RBP_INDEX_OFF);
860                 he_dev->rbpl_base[i].phys = dma_handle;
861         }
862         he_dev->rbpl_tail = &he_dev->rbpl_base[CONFIG_RBPL_SIZE - 1];
863
864         he_writel(he_dev, he_dev->rbpl_phys, G0_RBPL_S + (group * 32));
865         he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail),
866                                                 G0_RBPL_T + (group * 32));
867         he_writel(he_dev, CONFIG_RBPL_BUFSIZE/4,
868                                                 G0_RBPL_BS + (group * 32));
869         he_writel(he_dev,
870                         RBP_THRESH(CONFIG_RBPL_THRESH) |
871                         RBP_QSIZE(CONFIG_RBPL_SIZE - 1) |
872                         RBP_INT_ENB,
873                                                 G0_RBPL_QI + (group * 32));
874
875         /* rx buffer ready queue */
876
877         he_dev->rbrq_base = pci_alloc_consistent(he_dev->pci_dev,
878                 CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq), &he_dev->rbrq_phys);
879         if (he_dev->rbrq_base == NULL) {
880                 hprintk("failed to allocate rbrq\n");
881                 goto out_free_rbpl_virt;
882         }
883         memset(he_dev->rbrq_base, 0, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq));
884
885         he_dev->rbrq_head = he_dev->rbrq_base;
886         he_writel(he_dev, he_dev->rbrq_phys, G0_RBRQ_ST + (group * 16));
887         he_writel(he_dev, 0, G0_RBRQ_H + (group * 16));
888         he_writel(he_dev,
889                 RBRQ_THRESH(CONFIG_RBRQ_THRESH) | RBRQ_SIZE(CONFIG_RBRQ_SIZE - 1),
890                                                 G0_RBRQ_Q + (group * 16));
891         if (irq_coalesce) {
892                 hprintk("coalescing interrupts\n");
893                 he_writel(he_dev, RBRQ_TIME(768) | RBRQ_COUNT(7),
894                                                 G0_RBRQ_I + (group * 16));
895         } else
896                 he_writel(he_dev, RBRQ_TIME(0) | RBRQ_COUNT(1),
897                                                 G0_RBRQ_I + (group * 16));
898
899         /* tx buffer ready queue */
900
901         he_dev->tbrq_base = pci_alloc_consistent(he_dev->pci_dev,
902                 CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq), &he_dev->tbrq_phys);
903         if (he_dev->tbrq_base == NULL) {
904                 hprintk("failed to allocate tbrq\n");
905                 goto out_free_rbpq_base;
906         }
907         memset(he_dev->tbrq_base, 0, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq));
908
909         he_dev->tbrq_head = he_dev->tbrq_base;
910
911         he_writel(he_dev, he_dev->tbrq_phys, G0_TBRQ_B_T + (group * 16));
912         he_writel(he_dev, 0, G0_TBRQ_H + (group * 16));
913         he_writel(he_dev, CONFIG_TBRQ_SIZE - 1, G0_TBRQ_S + (group * 16));
914         he_writel(he_dev, CONFIG_TBRQ_THRESH, G0_TBRQ_THRESH + (group * 16));
915
916         return 0;
917
918 out_free_rbpq_base:
919         pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE *
920                         sizeof(struct he_rbrq), he_dev->rbrq_base,
921                         he_dev->rbrq_phys);
922         i = CONFIG_RBPL_SIZE;
923 out_free_rbpl_virt:
924         while (--i)
925                 pci_pool_free(he_dev->rbps_pool, he_dev->rbpl_virt[i].virt,
926                                 he_dev->rbps_base[i].phys);
927         kfree(he_dev->rbpl_virt);
928
929 out_free_rbpl_base:
930         pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE *
931                         sizeof(struct he_rbp), he_dev->rbpl_base,
932                         he_dev->rbpl_phys);
933 out_destroy_rbpl_pool:
934         pci_pool_destroy(he_dev->rbpl_pool);
935
936         i = CONFIG_RBPL_SIZE;
937 out_free_rbps_virt:
938         while (--i)
939                 pci_pool_free(he_dev->rbpl_pool, he_dev->rbps_virt[i].virt,
940                                 he_dev->rbpl_base[i].phys);
941         kfree(he_dev->rbps_virt);
942
943 out_free_rbps_base:
944         pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE *
945                         sizeof(struct he_rbp), he_dev->rbps_base,
946                         he_dev->rbps_phys);
947 out_destroy_rbps_pool:
948         pci_pool_destroy(he_dev->rbps_pool);
949         return -ENOMEM;
950 }
951
952 static int __devinit
953 he_init_irq(struct he_dev *he_dev)
954 {
955         int i;
956
957         /* 2.9.3.5  tail offset for each interrupt queue is located after the
958                     end of the interrupt queue */
959
960         he_dev->irq_base = pci_alloc_consistent(he_dev->pci_dev,
961                         (CONFIG_IRQ_SIZE+1) * sizeof(struct he_irq), &he_dev->irq_phys);
962         if (he_dev->irq_base == NULL) {
963                 hprintk("failed to allocate irq\n");
964                 return -ENOMEM;
965         }
966         he_dev->irq_tailoffset = (unsigned *)
967                                         &he_dev->irq_base[CONFIG_IRQ_SIZE];
968         *he_dev->irq_tailoffset = 0;
969         he_dev->irq_head = he_dev->irq_base;
970         he_dev->irq_tail = he_dev->irq_base;
971
972         for (i = 0; i < CONFIG_IRQ_SIZE; ++i)
973                 he_dev->irq_base[i].isw = ITYPE_INVALID;
974
975         he_writel(he_dev, he_dev->irq_phys, IRQ0_BASE);
976         he_writel(he_dev,
977                 IRQ_SIZE(CONFIG_IRQ_SIZE) | IRQ_THRESH(CONFIG_IRQ_THRESH),
978                                                                 IRQ0_HEAD);
979         he_writel(he_dev, IRQ_INT_A | IRQ_TYPE_LINE, IRQ0_CNTL);
980         he_writel(he_dev, 0x0, IRQ0_DATA);
981
982         he_writel(he_dev, 0x0, IRQ1_BASE);
983         he_writel(he_dev, 0x0, IRQ1_HEAD);
984         he_writel(he_dev, 0x0, IRQ1_CNTL);
985         he_writel(he_dev, 0x0, IRQ1_DATA);
986
987         he_writel(he_dev, 0x0, IRQ2_BASE);
988         he_writel(he_dev, 0x0, IRQ2_HEAD);
989         he_writel(he_dev, 0x0, IRQ2_CNTL);
990         he_writel(he_dev, 0x0, IRQ2_DATA);
991
992         he_writel(he_dev, 0x0, IRQ3_BASE);
993         he_writel(he_dev, 0x0, IRQ3_HEAD);
994         he_writel(he_dev, 0x0, IRQ3_CNTL);
995         he_writel(he_dev, 0x0, IRQ3_DATA);
996
997         /* 2.9.3.2 interrupt queue mapping registers */
998
999         he_writel(he_dev, 0x0, GRP_10_MAP);
1000         he_writel(he_dev, 0x0, GRP_32_MAP);
1001         he_writel(he_dev, 0x0, GRP_54_MAP);
1002         he_writel(he_dev, 0x0, GRP_76_MAP);
1003
1004         if (request_irq(he_dev->pci_dev->irq, he_irq_handler, IRQF_DISABLED|IRQF_SHARED, DEV_LABEL, he_dev)) {
1005                 hprintk("irq %d already in use\n", he_dev->pci_dev->irq);
1006                 return -EINVAL;
1007         }   
1008
1009         he_dev->irq = he_dev->pci_dev->irq;
1010
1011         return 0;
1012 }
1013
1014 static int __devinit
1015 he_start(struct atm_dev *dev)
1016 {
1017         struct he_dev *he_dev;
1018         struct pci_dev *pci_dev;
1019         unsigned long membase;
1020
1021         u16 command;
1022         u32 gen_cntl_0, host_cntl, lb_swap;
1023         u8 cache_size, timer;
1024         
1025         unsigned err;
1026         unsigned int status, reg;
1027         int i, group;
1028
1029         he_dev = HE_DEV(dev);
1030         pci_dev = he_dev->pci_dev;
1031
1032         membase = pci_resource_start(pci_dev, 0);
1033         HPRINTK("membase = 0x%lx  irq = %d.\n", membase, pci_dev->irq);
1034
1035         /*
1036          * pci bus controller initialization 
1037          */
1038
1039         /* 4.3 pci bus controller-specific initialization */
1040         if (pci_read_config_dword(pci_dev, GEN_CNTL_0, &gen_cntl_0) != 0) {
1041                 hprintk("can't read GEN_CNTL_0\n");
1042                 return -EINVAL;
1043         }
1044         gen_cntl_0 |= (MRL_ENB | MRM_ENB | IGNORE_TIMEOUT);
1045         if (pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0) != 0) {
1046                 hprintk("can't write GEN_CNTL_0.\n");
1047                 return -EINVAL;
1048         }
1049
1050         if (pci_read_config_word(pci_dev, PCI_COMMAND, &command) != 0) {
1051                 hprintk("can't read PCI_COMMAND.\n");
1052                 return -EINVAL;
1053         }
1054
1055         command |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE);
1056         if (pci_write_config_word(pci_dev, PCI_COMMAND, command) != 0) {
1057                 hprintk("can't enable memory.\n");
1058                 return -EINVAL;
1059         }
1060
1061         if (pci_read_config_byte(pci_dev, PCI_CACHE_LINE_SIZE, &cache_size)) {
1062                 hprintk("can't read cache line size?\n");
1063                 return -EINVAL;
1064         }
1065
1066         if (cache_size < 16) {
1067                 cache_size = 16;
1068                 if (pci_write_config_byte(pci_dev, PCI_CACHE_LINE_SIZE, cache_size))
1069                         hprintk("can't set cache line size to %d\n", cache_size);
1070         }
1071
1072         if (pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &timer)) {
1073                 hprintk("can't read latency timer?\n");
1074                 return -EINVAL;
1075         }
1076
1077         /* from table 3.9
1078          *
1079          * LAT_TIMER = 1 + AVG_LAT + BURST_SIZE/BUS_SIZE
1080          * 
1081          * AVG_LAT: The average first data read/write latency [maximum 16 clock cycles]
1082          * BURST_SIZE: 1536 bytes (read) for 622, 768 bytes (read) for 155 [192 clock cycles]
1083          *
1084          */ 
1085 #define LAT_TIMER 209
1086         if (timer < LAT_TIMER) {
1087                 HPRINTK("latency timer was %d, setting to %d\n", timer, LAT_TIMER);
1088                 timer = LAT_TIMER;
1089                 if (pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, timer))
1090                         hprintk("can't set latency timer to %d\n", timer);
1091         }
1092
1093         if (!(he_dev->membase = ioremap(membase, HE_REGMAP_SIZE))) {
1094                 hprintk("can't set up page mapping\n");
1095                 return -EINVAL;
1096         }
1097
1098         /* 4.4 card reset */
1099         he_writel(he_dev, 0x0, RESET_CNTL);
1100         he_writel(he_dev, 0xff, RESET_CNTL);
1101
1102         udelay(16*1000);        /* 16 ms */
1103         status = he_readl(he_dev, RESET_CNTL);
1104         if ((status & BOARD_RST_STATUS) == 0) {
1105                 hprintk("reset failed\n");
1106                 return -EINVAL;
1107         }
1108
1109         /* 4.5 set bus width */
1110         host_cntl = he_readl(he_dev, HOST_CNTL);
1111         if (host_cntl & PCI_BUS_SIZE64)
1112                 gen_cntl_0 |= ENBL_64;
1113         else
1114                 gen_cntl_0 &= ~ENBL_64;
1115
1116         if (disable64 == 1) {
1117                 hprintk("disabling 64-bit pci bus transfers\n");
1118                 gen_cntl_0 &= ~ENBL_64;
1119         }
1120
1121         if (gen_cntl_0 & ENBL_64)
1122                 hprintk("64-bit transfers enabled\n");
1123
1124         pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1125
1126         /* 4.7 read prom contents */
1127         for (i = 0; i < PROD_ID_LEN; ++i)
1128                 he_dev->prod_id[i] = read_prom_byte(he_dev, PROD_ID + i);
1129
1130         he_dev->media = read_prom_byte(he_dev, MEDIA);
1131
1132         for (i = 0; i < 6; ++i)
1133                 dev->esi[i] = read_prom_byte(he_dev, MAC_ADDR + i);
1134
1135         hprintk("%s%s, %x:%x:%x:%x:%x:%x\n",
1136                                 he_dev->prod_id,
1137                                         he_dev->media & 0x40 ? "SM" : "MM",
1138                                                 dev->esi[0],
1139                                                 dev->esi[1],
1140                                                 dev->esi[2],
1141                                                 dev->esi[3],
1142                                                 dev->esi[4],
1143                                                 dev->esi[5]);
1144         he_dev->atm_dev->link_rate = he_is622(he_dev) ?
1145                                                 ATM_OC12_PCR : ATM_OC3_PCR;
1146
1147         /* 4.6 set host endianess */
1148         lb_swap = he_readl(he_dev, LB_SWAP);
1149         if (he_is622(he_dev))
1150                 lb_swap &= ~XFER_SIZE;          /* 4 cells */
1151         else
1152                 lb_swap |= XFER_SIZE;           /* 8 cells */
1153 #ifdef __BIG_ENDIAN
1154         lb_swap |= DESC_WR_SWAP | INTR_SWAP | BIG_ENDIAN_HOST;
1155 #else
1156         lb_swap &= ~(DESC_WR_SWAP | INTR_SWAP | BIG_ENDIAN_HOST |
1157                         DATA_WR_SWAP | DATA_RD_SWAP | DESC_RD_SWAP);
1158 #endif /* __BIG_ENDIAN */
1159         he_writel(he_dev, lb_swap, LB_SWAP);
1160
1161         /* 4.8 sdram controller initialization */
1162         he_writel(he_dev, he_is622(he_dev) ? LB_64_ENB : 0x0, SDRAM_CTL);
1163
1164         /* 4.9 initialize rnum value */
1165         lb_swap |= SWAP_RNUM_MAX(0xf);
1166         he_writel(he_dev, lb_swap, LB_SWAP);
1167
1168         /* 4.10 initialize the interrupt queues */
1169         if ((err = he_init_irq(he_dev)) != 0)
1170                 return err;
1171
1172         /* 4.11 enable pci bus controller state machines */
1173         host_cntl |= (OUTFF_ENB | CMDFF_ENB |
1174                                 QUICK_RD_RETRY | QUICK_WR_RETRY | PERR_INT_ENB);
1175         he_writel(he_dev, host_cntl, HOST_CNTL);
1176
1177         gen_cntl_0 |= INT_PROC_ENBL|INIT_ENB;
1178         pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1179
1180         /*
1181          * atm network controller initialization
1182          */
1183
1184         /* 5.1.1 generic configuration state */
1185
1186         /*
1187          *              local (cell) buffer memory map
1188          *                    
1189          *             HE155                          HE622
1190          *                                                      
1191          *        0 ____________1023 bytes  0 _______________________2047 bytes
1192          *         |            |            |                   |   |
1193          *         |  utility   |            |        rx0        |   |
1194          *        5|____________|         255|___________________| u |
1195          *        6|            |         256|                   | t |
1196          *         |            |            |                   | i |
1197          *         |    rx0     |     row    |        tx         | l |
1198          *         |            |            |                   | i |
1199          *         |            |         767|___________________| t |
1200          *      517|____________|         768|                   | y |
1201          * row  518|            |            |        rx1        |   |
1202          *         |            |        1023|___________________|___|
1203          *         |            |
1204          *         |    tx      |
1205          *         |            |
1206          *         |            |
1207          *     1535|____________|
1208          *     1536|            |
1209          *         |    rx1     |
1210          *     2047|____________|
1211          *
1212          */
1213
1214         /* total 4096 connections */
1215         he_dev->vcibits = CONFIG_DEFAULT_VCIBITS;
1216         he_dev->vpibits = CONFIG_DEFAULT_VPIBITS;
1217
1218         if (nvpibits != -1 && nvcibits != -1 && nvpibits+nvcibits != HE_MAXCIDBITS) {
1219                 hprintk("nvpibits + nvcibits != %d\n", HE_MAXCIDBITS);
1220                 return -ENODEV;
1221         }
1222
1223         if (nvpibits != -1) {
1224                 he_dev->vpibits = nvpibits;
1225                 he_dev->vcibits = HE_MAXCIDBITS - nvpibits;
1226         }
1227
1228         if (nvcibits != -1) {
1229                 he_dev->vcibits = nvcibits;
1230                 he_dev->vpibits = HE_MAXCIDBITS - nvcibits;
1231         }
1232
1233
1234         if (he_is622(he_dev)) {
1235                 he_dev->cells_per_row = 40;
1236                 he_dev->bytes_per_row = 2048;
1237                 he_dev->r0_numrows = 256;
1238                 he_dev->tx_numrows = 512;
1239                 he_dev->r1_numrows = 256;
1240                 he_dev->r0_startrow = 0;
1241                 he_dev->tx_startrow = 256;
1242                 he_dev->r1_startrow = 768;
1243         } else {
1244                 he_dev->cells_per_row = 20;
1245                 he_dev->bytes_per_row = 1024;
1246                 he_dev->r0_numrows = 512;
1247                 he_dev->tx_numrows = 1018;
1248                 he_dev->r1_numrows = 512;
1249                 he_dev->r0_startrow = 6;
1250                 he_dev->tx_startrow = 518;
1251                 he_dev->r1_startrow = 1536;
1252         }
1253
1254         he_dev->cells_per_lbuf = 4;
1255         he_dev->buffer_limit = 4;
1256         he_dev->r0_numbuffs = he_dev->r0_numrows *
1257                                 he_dev->cells_per_row / he_dev->cells_per_lbuf;
1258         if (he_dev->r0_numbuffs > 2560)
1259                 he_dev->r0_numbuffs = 2560;
1260
1261         he_dev->r1_numbuffs = he_dev->r1_numrows *
1262                                 he_dev->cells_per_row / he_dev->cells_per_lbuf;
1263         if (he_dev->r1_numbuffs > 2560)
1264                 he_dev->r1_numbuffs = 2560;
1265
1266         he_dev->tx_numbuffs = he_dev->tx_numrows *
1267                                 he_dev->cells_per_row / he_dev->cells_per_lbuf;
1268         if (he_dev->tx_numbuffs > 5120)
1269                 he_dev->tx_numbuffs = 5120;
1270
1271         /* 5.1.2 configure hardware dependent registers */
1272
1273         he_writel(he_dev, 
1274                 SLICE_X(0x2) | ARB_RNUM_MAX(0xf) | TH_PRTY(0x3) |
1275                 RH_PRTY(0x3) | TL_PRTY(0x2) | RL_PRTY(0x1) |
1276                 (he_is622(he_dev) ? BUS_MULTI(0x28) : BUS_MULTI(0x46)) |
1277                 (he_is622(he_dev) ? NET_PREF(0x50) : NET_PREF(0x8c)),
1278                                                                 LBARB);
1279
1280         he_writel(he_dev, BANK_ON |
1281                 (he_is622(he_dev) ? (REF_RATE(0x384) | WIDE_DATA) : REF_RATE(0x150)),
1282                                                                 SDRAMCON);
1283
1284         he_writel(he_dev,
1285                 (he_is622(he_dev) ? RM_BANK_WAIT(1) : RM_BANK_WAIT(0)) |
1286                                                 RM_RW_WAIT(1), RCMCONFIG);
1287         he_writel(he_dev,
1288                 (he_is622(he_dev) ? TM_BANK_WAIT(2) : TM_BANK_WAIT(1)) |
1289                                                 TM_RW_WAIT(1), TCMCONFIG);
1290
1291         he_writel(he_dev, he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD, LB_CONFIG);
1292
1293         he_writel(he_dev, 
1294                 (he_is622(he_dev) ? UT_RD_DELAY(8) : UT_RD_DELAY(0)) |
1295                 (he_is622(he_dev) ? RC_UT_MODE(0) : RC_UT_MODE(1)) |
1296                 RX_VALVP(he_dev->vpibits) |
1297                 RX_VALVC(he_dev->vcibits),                       RC_CONFIG);
1298
1299         he_writel(he_dev, DRF_THRESH(0x20) |
1300                 (he_is622(he_dev) ? TX_UT_MODE(0) : TX_UT_MODE(1)) |
1301                 TX_VCI_MASK(he_dev->vcibits) |
1302                 LBFREE_CNT(he_dev->tx_numbuffs),                TX_CONFIG);
1303
1304         he_writel(he_dev, 0x0, TXAAL5_PROTO);
1305
1306         he_writel(he_dev, PHY_INT_ENB |
1307                 (he_is622(he_dev) ? PTMR_PRE(67 - 1) : PTMR_PRE(50 - 1)),
1308                                                                 RH_CONFIG);
1309
1310         /* 5.1.3 initialize connection memory */
1311
1312         for (i = 0; i < TCM_MEM_SIZE; ++i)
1313                 he_writel_tcm(he_dev, 0, i);
1314
1315         for (i = 0; i < RCM_MEM_SIZE; ++i)
1316                 he_writel_rcm(he_dev, 0, i);
1317
1318         /*
1319          *      transmit connection memory map
1320          *
1321          *                  tx memory
1322          *          0x0 ___________________
1323          *             |                   |
1324          *             |                   |
1325          *             |       TSRa        |
1326          *             |                   |
1327          *             |                   |
1328          *       0x8000|___________________|
1329          *             |                   |
1330          *             |       TSRb        |
1331          *       0xc000|___________________|
1332          *             |                   |
1333          *             |       TSRc        |
1334          *       0xe000|___________________|
1335          *             |       TSRd        |
1336          *       0xf000|___________________|
1337          *             |       tmABR       |
1338          *      0x10000|___________________|
1339          *             |                   |
1340          *             |       tmTPD       |
1341          *             |___________________|
1342          *             |                   |
1343          *                      ....
1344          *      0x1ffff|___________________|
1345          *
1346          *
1347          */
1348
1349         he_writel(he_dev, CONFIG_TSRB, TSRB_BA);
1350         he_writel(he_dev, CONFIG_TSRC, TSRC_BA);
1351         he_writel(he_dev, CONFIG_TSRD, TSRD_BA);
1352         he_writel(he_dev, CONFIG_TMABR, TMABR_BA);
1353         he_writel(he_dev, CONFIG_TPDBA, TPD_BA);
1354
1355
1356         /*
1357          *      receive connection memory map
1358          *
1359          *          0x0 ___________________
1360          *             |                   |
1361          *             |                   |
1362          *             |       RSRa        |
1363          *             |                   |
1364          *             |                   |
1365          *       0x8000|___________________|
1366          *             |                   |
1367          *             |             rx0/1 |
1368          *             |       LBM         |   link lists of local
1369          *             |             tx    |   buffer memory 
1370          *             |                   |
1371          *       0xd000|___________________|
1372          *             |                   |
1373          *             |      rmABR        |
1374          *       0xe000|___________________|
1375          *             |                   |
1376          *             |       RSRb        |
1377          *             |___________________|
1378          *             |                   |
1379          *                      ....
1380          *       0xffff|___________________|
1381          */
1382
1383         he_writel(he_dev, 0x08000, RCMLBM_BA);
1384         he_writel(he_dev, 0x0e000, RCMRSRB_BA);
1385         he_writel(he_dev, 0x0d800, RCMABR_BA);
1386
1387         /* 5.1.4 initialize local buffer free pools linked lists */
1388
1389         he_init_rx_lbfp0(he_dev);
1390         he_init_rx_lbfp1(he_dev);
1391
1392         he_writel(he_dev, 0x0, RLBC_H);
1393         he_writel(he_dev, 0x0, RLBC_T);
1394         he_writel(he_dev, 0x0, RLBC_H2);
1395
1396         he_writel(he_dev, 512, RXTHRSH);        /* 10% of r0+r1 buffers */
1397         he_writel(he_dev, 256, LITHRSH);        /* 5% of r0+r1 buffers */
1398
1399         he_init_tx_lbfp(he_dev);
1400
1401         he_writel(he_dev, he_is622(he_dev) ? 0x104780 : 0x800, UBUFF_BA);
1402
1403         /* 5.1.5 initialize intermediate receive queues */
1404
1405         if (he_is622(he_dev)) {
1406                 he_writel(he_dev, 0x000f, G0_INMQ_S);
1407                 he_writel(he_dev, 0x200f, G0_INMQ_L);
1408
1409                 he_writel(he_dev, 0x001f, G1_INMQ_S);
1410                 he_writel(he_dev, 0x201f, G1_INMQ_L);
1411
1412                 he_writel(he_dev, 0x002f, G2_INMQ_S);
1413                 he_writel(he_dev, 0x202f, G2_INMQ_L);
1414
1415                 he_writel(he_dev, 0x003f, G3_INMQ_S);
1416                 he_writel(he_dev, 0x203f, G3_INMQ_L);
1417
1418                 he_writel(he_dev, 0x004f, G4_INMQ_S);
1419                 he_writel(he_dev, 0x204f, G4_INMQ_L);
1420
1421                 he_writel(he_dev, 0x005f, G5_INMQ_S);
1422                 he_writel(he_dev, 0x205f, G5_INMQ_L);
1423
1424                 he_writel(he_dev, 0x006f, G6_INMQ_S);
1425                 he_writel(he_dev, 0x206f, G6_INMQ_L);
1426
1427                 he_writel(he_dev, 0x007f, G7_INMQ_S);
1428                 he_writel(he_dev, 0x207f, G7_INMQ_L);
1429         } else {
1430                 he_writel(he_dev, 0x0000, G0_INMQ_S);
1431                 he_writel(he_dev, 0x0008, G0_INMQ_L);
1432
1433                 he_writel(he_dev, 0x0001, G1_INMQ_S);
1434                 he_writel(he_dev, 0x0009, G1_INMQ_L);
1435
1436                 he_writel(he_dev, 0x0002, G2_INMQ_S);
1437                 he_writel(he_dev, 0x000a, G2_INMQ_L);
1438
1439                 he_writel(he_dev, 0x0003, G3_INMQ_S);
1440                 he_writel(he_dev, 0x000b, G3_INMQ_L);
1441
1442                 he_writel(he_dev, 0x0004, G4_INMQ_S);
1443                 he_writel(he_dev, 0x000c, G4_INMQ_L);
1444
1445                 he_writel(he_dev, 0x0005, G5_INMQ_S);
1446                 he_writel(he_dev, 0x000d, G5_INMQ_L);
1447
1448                 he_writel(he_dev, 0x0006, G6_INMQ_S);
1449                 he_writel(he_dev, 0x000e, G6_INMQ_L);
1450
1451                 he_writel(he_dev, 0x0007, G7_INMQ_S);
1452                 he_writel(he_dev, 0x000f, G7_INMQ_L);
1453         }
1454
1455         /* 5.1.6 application tunable parameters */
1456
1457         he_writel(he_dev, 0x0, MCC);
1458         he_writel(he_dev, 0x0, OEC);
1459         he_writel(he_dev, 0x0, DCC);
1460         he_writel(he_dev, 0x0, CEC);
1461         
1462         /* 5.1.7 cs block initialization */
1463
1464         he_init_cs_block(he_dev);
1465
1466         /* 5.1.8 cs block connection memory initialization */
1467         
1468         if (he_init_cs_block_rcm(he_dev) < 0)
1469                 return -ENOMEM;
1470
1471         /* 5.1.10 initialize host structures */
1472
1473         he_init_tpdrq(he_dev);
1474
1475         he_dev->tpd_pool = pci_pool_create("tpd", he_dev->pci_dev,
1476                 sizeof(struct he_tpd), TPD_ALIGNMENT, 0);
1477         if (he_dev->tpd_pool == NULL) {
1478                 hprintk("unable to create tpd pci_pool\n");
1479                 return -ENOMEM;         
1480         }
1481
1482         INIT_LIST_HEAD(&he_dev->outstanding_tpds);
1483
1484         if (he_init_group(he_dev, 0) != 0)
1485                 return -ENOMEM;
1486
1487         for (group = 1; group < HE_NUM_GROUPS; ++group) {
1488                 he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32));
1489                 he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32));
1490                 he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32));
1491                 he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
1492                                                 G0_RBPS_BS + (group * 32));
1493
1494                 he_writel(he_dev, 0x0, G0_RBPL_S + (group * 32));
1495                 he_writel(he_dev, 0x0, G0_RBPL_T + (group * 32));
1496                 he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
1497                                                 G0_RBPL_QI + (group * 32));
1498                 he_writel(he_dev, 0x0, G0_RBPL_BS + (group * 32));
1499
1500                 he_writel(he_dev, 0x0, G0_RBRQ_ST + (group * 16));
1501                 he_writel(he_dev, 0x0, G0_RBRQ_H + (group * 16));
1502                 he_writel(he_dev, RBRQ_THRESH(0x1) | RBRQ_SIZE(0x0),
1503                                                 G0_RBRQ_Q + (group * 16));
1504                 he_writel(he_dev, 0x0, G0_RBRQ_I + (group * 16));
1505
1506                 he_writel(he_dev, 0x0, G0_TBRQ_B_T + (group * 16));
1507                 he_writel(he_dev, 0x0, G0_TBRQ_H + (group * 16));
1508                 he_writel(he_dev, TBRQ_THRESH(0x1),
1509                                                 G0_TBRQ_THRESH + (group * 16));
1510                 he_writel(he_dev, 0x0, G0_TBRQ_S + (group * 16));
1511         }
1512
1513         /* host status page */
1514
1515         he_dev->hsp = pci_alloc_consistent(he_dev->pci_dev,
1516                                 sizeof(struct he_hsp), &he_dev->hsp_phys);
1517         if (he_dev->hsp == NULL) {
1518                 hprintk("failed to allocate host status page\n");
1519                 return -ENOMEM;
1520         }
1521         memset(he_dev->hsp, 0, sizeof(struct he_hsp));
1522         he_writel(he_dev, he_dev->hsp_phys, HSP_BA);
1523
1524         /* initialize framer */
1525
1526 #ifdef CONFIG_ATM_HE_USE_SUNI
1527         if (he_isMM(he_dev))
1528                 suni_init(he_dev->atm_dev);
1529         if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start)
1530                 he_dev->atm_dev->phy->start(he_dev->atm_dev);
1531 #endif /* CONFIG_ATM_HE_USE_SUNI */
1532
1533         if (sdh) {
1534                 /* this really should be in suni.c but for now... */
1535                 int val;
1536
1537                 val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM);
1538                 val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT);
1539                 he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM);
1540                 he_phy_put(he_dev->atm_dev, SUNI_TACP_IUCHP_CLP, SUNI_TACP_IUCHP);
1541         }
1542
1543         /* 5.1.12 enable transmit and receive */
1544
1545         reg = he_readl_mbox(he_dev, CS_ERCTL0);
1546         reg |= TX_ENABLE|ER_ENABLE;
1547         he_writel_mbox(he_dev, reg, CS_ERCTL0);
1548
1549         reg = he_readl(he_dev, RC_CONFIG);
1550         reg |= RX_ENABLE;
1551         he_writel(he_dev, reg, RC_CONFIG);
1552
1553         for (i = 0; i < HE_NUM_CS_STPER; ++i) {
1554                 he_dev->cs_stper[i].inuse = 0;
1555                 he_dev->cs_stper[i].pcr = -1;
1556         }
1557         he_dev->total_bw = 0;
1558
1559
1560         /* atm linux initialization */
1561
1562         he_dev->atm_dev->ci_range.vpi_bits = he_dev->vpibits;
1563         he_dev->atm_dev->ci_range.vci_bits = he_dev->vcibits;
1564
1565         he_dev->irq_peak = 0;
1566         he_dev->rbrq_peak = 0;
1567         he_dev->rbpl_peak = 0;
1568         he_dev->tbrq_peak = 0;
1569
1570         HPRINTK("hell bent for leather!\n");
1571
1572         return 0;
1573 }
1574
1575 static void
1576 he_stop(struct he_dev *he_dev)
1577 {
1578         u16 command;
1579         u32 gen_cntl_0, reg;
1580         struct pci_dev *pci_dev;
1581
1582         pci_dev = he_dev->pci_dev;
1583
1584         /* disable interrupts */
1585
1586         if (he_dev->membase) {
1587                 pci_read_config_dword(pci_dev, GEN_CNTL_0, &gen_cntl_0);
1588                 gen_cntl_0 &= ~(INT_PROC_ENBL | INIT_ENB);
1589                 pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1590
1591                 tasklet_disable(&he_dev->tasklet);
1592
1593                 /* disable recv and transmit */
1594
1595                 reg = he_readl_mbox(he_dev, CS_ERCTL0);
1596                 reg &= ~(TX_ENABLE|ER_ENABLE);
1597                 he_writel_mbox(he_dev, reg, CS_ERCTL0);
1598
1599                 reg = he_readl(he_dev, RC_CONFIG);
1600                 reg &= ~(RX_ENABLE);
1601                 he_writel(he_dev, reg, RC_CONFIG);
1602         }
1603
1604 #ifdef CONFIG_ATM_HE_USE_SUNI
1605         if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->stop)
1606                 he_dev->atm_dev->phy->stop(he_dev->atm_dev);
1607 #endif /* CONFIG_ATM_HE_USE_SUNI */
1608
1609         if (he_dev->irq)
1610                 free_irq(he_dev->irq, he_dev);
1611
1612         if (he_dev->irq_base)
1613                 pci_free_consistent(he_dev->pci_dev, (CONFIG_IRQ_SIZE+1)
1614                         * sizeof(struct he_irq), he_dev->irq_base, he_dev->irq_phys);
1615
1616         if (he_dev->hsp)
1617                 pci_free_consistent(he_dev->pci_dev, sizeof(struct he_hsp),
1618                                                 he_dev->hsp, he_dev->hsp_phys);
1619
1620         if (he_dev->rbpl_base) {
1621                 int i;
1622
1623                 for (i = 0; i < CONFIG_RBPL_SIZE; ++i) {
1624                         void *cpuaddr = he_dev->rbpl_virt[i].virt;
1625                         dma_addr_t dma_handle = he_dev->rbpl_base[i].phys;
1626
1627                         pci_pool_free(he_dev->rbpl_pool, cpuaddr, dma_handle);
1628                 }
1629                 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
1630                         * sizeof(struct he_rbp), he_dev->rbpl_base, he_dev->rbpl_phys);
1631         }
1632
1633         if (he_dev->rbpl_pool)
1634                 pci_pool_destroy(he_dev->rbpl_pool);
1635
1636         if (he_dev->rbps_base) {
1637                 int i;
1638
1639                 for (i = 0; i < CONFIG_RBPS_SIZE; ++i) {
1640                         void *cpuaddr = he_dev->rbps_virt[i].virt;
1641                         dma_addr_t dma_handle = he_dev->rbps_base[i].phys;
1642
1643                         pci_pool_free(he_dev->rbps_pool, cpuaddr, dma_handle);
1644                 }
1645                 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
1646                         * sizeof(struct he_rbp), he_dev->rbps_base, he_dev->rbps_phys);
1647         }
1648
1649         if (he_dev->rbps_pool)
1650                 pci_pool_destroy(he_dev->rbps_pool);
1651
1652         if (he_dev->rbrq_base)
1653                 pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq),
1654                                                         he_dev->rbrq_base, he_dev->rbrq_phys);
1655
1656         if (he_dev->tbrq_base)
1657                 pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
1658                                                         he_dev->tbrq_base, he_dev->tbrq_phys);
1659
1660         if (he_dev->tpdrq_base)
1661                 pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
1662                                                         he_dev->tpdrq_base, he_dev->tpdrq_phys);
1663
1664         if (he_dev->tpd_pool)
1665                 pci_pool_destroy(he_dev->tpd_pool);
1666
1667         if (he_dev->pci_dev) {
1668                 pci_read_config_word(he_dev->pci_dev, PCI_COMMAND, &command);
1669                 command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
1670                 pci_write_config_word(he_dev->pci_dev, PCI_COMMAND, command);
1671         }
1672         
1673         if (he_dev->membase)
1674                 iounmap(he_dev->membase);
1675 }
1676
1677 static struct he_tpd *
1678 __alloc_tpd(struct he_dev *he_dev)
1679 {
1680         struct he_tpd *tpd;
1681         dma_addr_t dma_handle; 
1682
1683         tpd = pci_pool_alloc(he_dev->tpd_pool, GFP_ATOMIC|GFP_DMA, &dma_handle);
1684         if (tpd == NULL)
1685                 return NULL;
1686                         
1687         tpd->status = TPD_ADDR(dma_handle);
1688         tpd->reserved = 0; 
1689         tpd->iovec[0].addr = 0; tpd->iovec[0].len = 0;
1690         tpd->iovec[1].addr = 0; tpd->iovec[1].len = 0;
1691         tpd->iovec[2].addr = 0; tpd->iovec[2].len = 0;
1692
1693         return tpd;
1694 }
1695
1696 #define AAL5_LEN(buf,len)                                               \
1697                         ((((unsigned char *)(buf))[(len)-6] << 8) |     \
1698                                 (((unsigned char *)(buf))[(len)-5]))
1699
1700 /* 2.10.1.2 receive
1701  *
1702  * aal5 packets can optionally return the tcp checksum in the lower
1703  * 16 bits of the crc (RSR0_TCP_CKSUM)
1704  */
1705
1706 #define TCP_CKSUM(buf,len)                                              \
1707                         ((((unsigned char *)(buf))[(len)-2] << 8) |     \
1708                                 (((unsigned char *)(buf))[(len-1)]))
1709
1710 static int
1711 he_service_rbrq(struct he_dev *he_dev, int group)
1712 {
1713         struct he_rbrq *rbrq_tail = (struct he_rbrq *)
1714                                 ((unsigned long)he_dev->rbrq_base |
1715                                         he_dev->hsp->group[group].rbrq_tail);
1716         struct he_rbp *rbp = NULL;
1717         unsigned cid, lastcid = -1;
1718         unsigned buf_len = 0;
1719         struct sk_buff *skb;
1720         struct atm_vcc *vcc = NULL;
1721         struct he_vcc *he_vcc;
1722         struct he_iovec *iov;
1723         int pdus_assembled = 0;
1724         int updated = 0;
1725
1726         read_lock(&vcc_sklist_lock);
1727         while (he_dev->rbrq_head != rbrq_tail) {
1728                 ++updated;
1729
1730                 HPRINTK("%p rbrq%d 0x%x len=%d cid=0x%x %s%s%s%s%s%s\n",
1731                         he_dev->rbrq_head, group,
1732                         RBRQ_ADDR(he_dev->rbrq_head),
1733                         RBRQ_BUFLEN(he_dev->rbrq_head),
1734                         RBRQ_CID(he_dev->rbrq_head),
1735                         RBRQ_CRC_ERR(he_dev->rbrq_head) ? " CRC_ERR" : "",
1736                         RBRQ_LEN_ERR(he_dev->rbrq_head) ? " LEN_ERR" : "",
1737                         RBRQ_END_PDU(he_dev->rbrq_head) ? " END_PDU" : "",
1738                         RBRQ_AAL5_PROT(he_dev->rbrq_head) ? " AAL5_PROT" : "",
1739                         RBRQ_CON_CLOSED(he_dev->rbrq_head) ? " CON_CLOSED" : "",
1740                         RBRQ_HBUF_ERR(he_dev->rbrq_head) ? " HBUF_ERR" : "");
1741
1742                 if (RBRQ_ADDR(he_dev->rbrq_head) & RBP_SMALLBUF)
1743                         rbp = &he_dev->rbps_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
1744                 else
1745                         rbp = &he_dev->rbpl_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
1746                 
1747                 buf_len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4;
1748                 cid = RBRQ_CID(he_dev->rbrq_head);
1749
1750                 if (cid != lastcid)
1751                         vcc = __find_vcc(he_dev, cid);
1752                 lastcid = cid;
1753
1754                 if (vcc == NULL) {
1755                         hprintk("vcc == NULL  (cid 0x%x)\n", cid);
1756                         if (!RBRQ_HBUF_ERR(he_dev->rbrq_head))
1757                                         rbp->status &= ~RBP_LOANED;
1758                                         
1759                         goto next_rbrq_entry;
1760                 }
1761
1762                 he_vcc = HE_VCC(vcc);
1763                 if (he_vcc == NULL) {
1764                         hprintk("he_vcc == NULL  (cid 0x%x)\n", cid);
1765                         if (!RBRQ_HBUF_ERR(he_dev->rbrq_head))
1766                                         rbp->status &= ~RBP_LOANED;
1767                         goto next_rbrq_entry;
1768                 }
1769
1770                 if (RBRQ_HBUF_ERR(he_dev->rbrq_head)) {
1771                         hprintk("HBUF_ERR!  (cid 0x%x)\n", cid);
1772                                 atomic_inc(&vcc->stats->rx_drop);
1773                         goto return_host_buffers;
1774                 }
1775
1776                 he_vcc->iov_tail->iov_base = RBRQ_ADDR(he_dev->rbrq_head);
1777                 he_vcc->iov_tail->iov_len = buf_len;
1778                 he_vcc->pdu_len += buf_len;
1779                 ++he_vcc->iov_tail;
1780
1781                 if (RBRQ_CON_CLOSED(he_dev->rbrq_head)) {
1782                         lastcid = -1;
1783                         HPRINTK("wake_up rx_waitq  (cid 0x%x)\n", cid);
1784                         wake_up(&he_vcc->rx_waitq);
1785                         goto return_host_buffers;
1786                 }
1787
1788 #ifdef notdef
1789                 if ((he_vcc->iov_tail - he_vcc->iov_head) > HE_MAXIOV) {
1790                         hprintk("iovec full!  cid 0x%x\n", cid);
1791                         goto return_host_buffers;
1792                 }
1793 #endif
1794                 if (!RBRQ_END_PDU(he_dev->rbrq_head))
1795                         goto next_rbrq_entry;
1796
1797                 if (RBRQ_LEN_ERR(he_dev->rbrq_head)
1798                                 || RBRQ_CRC_ERR(he_dev->rbrq_head)) {
1799                         HPRINTK("%s%s (%d.%d)\n",
1800                                 RBRQ_CRC_ERR(he_dev->rbrq_head)
1801                                                         ? "CRC_ERR " : "",
1802                                 RBRQ_LEN_ERR(he_dev->rbrq_head)
1803                                                         ? "LEN_ERR" : "",
1804                                                         vcc->vpi, vcc->vci);
1805                         atomic_inc(&vcc->stats->rx_err);
1806                         goto return_host_buffers;
1807                 }
1808
1809                 skb = atm_alloc_charge(vcc, he_vcc->pdu_len + rx_skb_reserve,
1810                                                         GFP_ATOMIC);
1811                 if (!skb) {
1812                         HPRINTK("charge failed (%d.%d)\n", vcc->vpi, vcc->vci);
1813                         goto return_host_buffers;
1814                 }
1815
1816                 if (rx_skb_reserve > 0)
1817                         skb_reserve(skb, rx_skb_reserve);
1818
1819                 __net_timestamp(skb);
1820
1821                 for (iov = he_vcc->iov_head;
1822                                 iov < he_vcc->iov_tail; ++iov) {
1823                         if (iov->iov_base & RBP_SMALLBUF)
1824                                 memcpy(skb_put(skb, iov->iov_len),
1825                                         he_dev->rbps_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
1826                         else
1827                                 memcpy(skb_put(skb, iov->iov_len),
1828                                         he_dev->rbpl_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
1829                 }
1830
1831                 switch (vcc->qos.aal) {
1832                         case ATM_AAL0:
1833                                 /* 2.10.1.5 raw cell receive */
1834                                 skb->len = ATM_AAL0_SDU;
1835                                 skb_set_tail_pointer(skb, skb->len);
1836                                 break;
1837                         case ATM_AAL5:
1838                                 /* 2.10.1.2 aal5 receive */
1839
1840                                 skb->len = AAL5_LEN(skb->data, he_vcc->pdu_len);
1841                                 skb_set_tail_pointer(skb, skb->len);
1842 #ifdef USE_CHECKSUM_HW
1843                                 if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) {
1844                                         skb->ip_summed = CHECKSUM_COMPLETE;
1845                                         skb->csum = TCP_CKSUM(skb->data,
1846                                                         he_vcc->pdu_len);
1847                                 }
1848 #endif
1849                                 break;
1850                 }
1851
1852 #ifdef should_never_happen
1853                 if (skb->len > vcc->qos.rxtp.max_sdu)
1854                         hprintk("pdu_len (%d) > vcc->qos.rxtp.max_sdu (%d)!  cid 0x%x\n", skb->len, vcc->qos.rxtp.max_sdu, cid);
1855 #endif
1856
1857 #ifdef notdef
1858                 ATM_SKB(skb)->vcc = vcc;
1859 #endif
1860                 spin_unlock(&he_dev->global_lock);
1861                 vcc->push(vcc, skb);
1862                 spin_lock(&he_dev->global_lock);
1863
1864                 atomic_inc(&vcc->stats->rx);
1865
1866 return_host_buffers:
1867                 ++pdus_assembled;
1868
1869                 for (iov = he_vcc->iov_head;
1870                                 iov < he_vcc->iov_tail; ++iov) {
1871                         if (iov->iov_base & RBP_SMALLBUF)
1872                                 rbp = &he_dev->rbps_base[RBP_INDEX(iov->iov_base)];
1873                         else
1874                                 rbp = &he_dev->rbpl_base[RBP_INDEX(iov->iov_base)];
1875
1876                         rbp->status &= ~RBP_LOANED;
1877                 }
1878
1879                 he_vcc->iov_tail = he_vcc->iov_head;
1880                 he_vcc->pdu_len = 0;
1881
1882 next_rbrq_entry:
1883                 he_dev->rbrq_head = (struct he_rbrq *)
1884                                 ((unsigned long) he_dev->rbrq_base |
1885                                         RBRQ_MASK(++he_dev->rbrq_head));
1886
1887         }
1888         read_unlock(&vcc_sklist_lock);
1889
1890         if (updated) {
1891                 if (updated > he_dev->rbrq_peak)
1892                         he_dev->rbrq_peak = updated;
1893
1894                 he_writel(he_dev, RBRQ_MASK(he_dev->rbrq_head),
1895                                                 G0_RBRQ_H + (group * 16));
1896         }
1897
1898         return pdus_assembled;
1899 }
1900
1901 static void
1902 he_service_tbrq(struct he_dev *he_dev, int group)
1903 {
1904         struct he_tbrq *tbrq_tail = (struct he_tbrq *)
1905                                 ((unsigned long)he_dev->tbrq_base |
1906                                         he_dev->hsp->group[group].tbrq_tail);
1907         struct he_tpd *tpd;
1908         int slot, updated = 0;
1909         struct he_tpd *__tpd;
1910
1911         /* 2.1.6 transmit buffer return queue */
1912
1913         while (he_dev->tbrq_head != tbrq_tail) {
1914                 ++updated;
1915
1916                 HPRINTK("tbrq%d 0x%x%s%s\n",
1917                         group,
1918                         TBRQ_TPD(he_dev->tbrq_head), 
1919                         TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "",
1920                         TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : "");
1921                 tpd = NULL;
1922                 list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) {
1923                         if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) {
1924                                 tpd = __tpd;
1925                                 list_del(&__tpd->entry);
1926                                 break;
1927                         }
1928                 }
1929
1930                 if (tpd == NULL) {
1931                         hprintk("unable to locate tpd for dma buffer %x\n",
1932                                                 TBRQ_TPD(he_dev->tbrq_head));
1933                         goto next_tbrq_entry;
1934                 }
1935
1936                 if (TBRQ_EOS(he_dev->tbrq_head)) {
1937                         HPRINTK("wake_up(tx_waitq) cid 0x%x\n",
1938                                 he_mkcid(he_dev, tpd->vcc->vpi, tpd->vcc->vci));
1939                         if (tpd->vcc)
1940                                 wake_up(&HE_VCC(tpd->vcc)->tx_waitq);
1941
1942                         goto next_tbrq_entry;
1943                 }
1944
1945                 for (slot = 0; slot < TPD_MAXIOV; ++slot) {
1946                         if (tpd->iovec[slot].addr)
1947                                 pci_unmap_single(he_dev->pci_dev,
1948                                         tpd->iovec[slot].addr,
1949                                         tpd->iovec[slot].len & TPD_LEN_MASK,
1950                                                         PCI_DMA_TODEVICE);
1951                         if (tpd->iovec[slot].len & TPD_LST)
1952                                 break;
1953                                 
1954                 }
1955
1956                 if (tpd->skb) { /* && !TBRQ_MULTIPLE(he_dev->tbrq_head) */
1957                         if (tpd->vcc && tpd->vcc->pop)
1958                                 tpd->vcc->pop(tpd->vcc, tpd->skb);
1959                         else
1960                                 dev_kfree_skb_any(tpd->skb);
1961                 }
1962
1963 next_tbrq_entry:
1964                 if (tpd)
1965                         pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
1966                 he_dev->tbrq_head = (struct he_tbrq *)
1967                                 ((unsigned long) he_dev->tbrq_base |
1968                                         TBRQ_MASK(++he_dev->tbrq_head));
1969         }
1970
1971         if (updated) {
1972                 if (updated > he_dev->tbrq_peak)
1973                         he_dev->tbrq_peak = updated;
1974
1975                 he_writel(he_dev, TBRQ_MASK(he_dev->tbrq_head),
1976                                                 G0_TBRQ_H + (group * 16));
1977         }
1978 }
1979
1980
1981 static void
1982 he_service_rbpl(struct he_dev *he_dev, int group)
1983 {
1984         struct he_rbp *newtail;
1985         struct he_rbp *rbpl_head;
1986         int moved = 0;
1987
1988         rbpl_head = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base |
1989                                         RBPL_MASK(he_readl(he_dev, G0_RBPL_S)));
1990
1991         for (;;) {
1992                 newtail = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base |
1993                                                 RBPL_MASK(he_dev->rbpl_tail+1));
1994
1995                 /* table 3.42 -- rbpl_tail should never be set to rbpl_head */
1996                 if ((newtail == rbpl_head) || (newtail->status & RBP_LOANED))
1997                         break;
1998
1999                 newtail->status |= RBP_LOANED;
2000                 he_dev->rbpl_tail = newtail;
2001                 ++moved;
2002         } 
2003
2004         if (moved)
2005                 he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T);
2006 }
2007
2008 static void
2009 he_service_rbps(struct he_dev *he_dev, int group)
2010 {
2011         struct he_rbp *newtail;
2012         struct he_rbp *rbps_head;
2013         int moved = 0;
2014
2015         rbps_head = (struct he_rbp *) ((unsigned long)he_dev->rbps_base |
2016                                         RBPS_MASK(he_readl(he_dev, G0_RBPS_S)));
2017
2018         for (;;) {
2019                 newtail = (struct he_rbp *) ((unsigned long)he_dev->rbps_base |
2020                                                 RBPS_MASK(he_dev->rbps_tail+1));
2021
2022                 /* table 3.42 -- rbps_tail should never be set to rbps_head */
2023                 if ((newtail == rbps_head) || (newtail->status & RBP_LOANED))
2024                         break;
2025
2026                 newtail->status |= RBP_LOANED;
2027                 he_dev->rbps_tail = newtail;
2028                 ++moved;
2029         } 
2030
2031         if (moved)
2032                 he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T);
2033 }
2034
2035 static void
2036 he_tasklet(unsigned long data)
2037 {
2038         unsigned long flags;
2039         struct he_dev *he_dev = (struct he_dev *) data;
2040         int group, type;
2041         int updated = 0;
2042
2043         HPRINTK("tasklet (0x%lx)\n", data);
2044         spin_lock_irqsave(&he_dev->global_lock, flags);
2045
2046         while (he_dev->irq_head != he_dev->irq_tail) {
2047                 ++updated;
2048
2049                 type = ITYPE_TYPE(he_dev->irq_head->isw);
2050                 group = ITYPE_GROUP(he_dev->irq_head->isw);
2051
2052                 switch (type) {
2053                         case ITYPE_RBRQ_THRESH:
2054                                 HPRINTK("rbrq%d threshold\n", group);
2055                                 /* fall through */
2056                         case ITYPE_RBRQ_TIMER:
2057                                 if (he_service_rbrq(he_dev, group)) {
2058                                         he_service_rbpl(he_dev, group);
2059                                         he_service_rbps(he_dev, group);
2060                                 }
2061                                 break;
2062                         case ITYPE_TBRQ_THRESH:
2063                                 HPRINTK("tbrq%d threshold\n", group);
2064                                 /* fall through */
2065                         case ITYPE_TPD_COMPLETE:
2066                                 he_service_tbrq(he_dev, group);
2067                                 break;
2068                         case ITYPE_RBPL_THRESH:
2069                                 he_service_rbpl(he_dev, group);
2070                                 break;
2071                         case ITYPE_RBPS_THRESH:
2072                                 he_service_rbps(he_dev, group);
2073                                 break;
2074                         case ITYPE_PHY:
2075                                 HPRINTK("phy interrupt\n");
2076 #ifdef CONFIG_ATM_HE_USE_SUNI
2077                                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2078                                 if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->interrupt)
2079                                         he_dev->atm_dev->phy->interrupt(he_dev->atm_dev);
2080                                 spin_lock_irqsave(&he_dev->global_lock, flags);
2081 #endif
2082                                 break;
2083                         case ITYPE_OTHER:
2084                                 switch (type|group) {
2085                                         case ITYPE_PARITY:
2086                                                 hprintk("parity error\n");
2087                                                 break;
2088                                         case ITYPE_ABORT:
2089                                                 hprintk("abort 0x%x\n", he_readl(he_dev, ABORT_ADDR));
2090                                                 break;
2091                                 }
2092                                 break;
2093                         case ITYPE_TYPE(ITYPE_INVALID):
2094                                 /* see 8.1.1 -- check all queues */
2095
2096                                 HPRINTK("isw not updated 0x%x\n", he_dev->irq_head->isw);
2097
2098                                 he_service_rbrq(he_dev, 0);
2099                                 he_service_rbpl(he_dev, 0);
2100                                 he_service_rbps(he_dev, 0);
2101                                 he_service_tbrq(he_dev, 0);
2102                                 break;
2103                         default:
2104                                 hprintk("bad isw 0x%x?\n", he_dev->irq_head->isw);
2105                 }
2106
2107                 he_dev->irq_head->isw = ITYPE_INVALID;
2108
2109                 he_dev->irq_head = (struct he_irq *) NEXT_ENTRY(he_dev->irq_base, he_dev->irq_head, IRQ_MASK);
2110         }
2111
2112         if (updated) {
2113                 if (updated > he_dev->irq_peak)
2114                         he_dev->irq_peak = updated;
2115
2116                 he_writel(he_dev,
2117                         IRQ_SIZE(CONFIG_IRQ_SIZE) |
2118                         IRQ_THRESH(CONFIG_IRQ_THRESH) |
2119                         IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD);
2120                 (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */
2121         }
2122         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2123 }
2124
2125 static irqreturn_t
2126 he_irq_handler(int irq, void *dev_id)
2127 {
2128         unsigned long flags;
2129         struct he_dev *he_dev = (struct he_dev * )dev_id;
2130         int handled = 0;
2131
2132         if (he_dev == NULL)
2133                 return IRQ_NONE;
2134
2135         spin_lock_irqsave(&he_dev->global_lock, flags);
2136
2137         he_dev->irq_tail = (struct he_irq *) (((unsigned long)he_dev->irq_base) |
2138                                                 (*he_dev->irq_tailoffset << 2));
2139
2140         if (he_dev->irq_tail == he_dev->irq_head) {
2141                 HPRINTK("tailoffset not updated?\n");
2142                 he_dev->irq_tail = (struct he_irq *) ((unsigned long)he_dev->irq_base |
2143                         ((he_readl(he_dev, IRQ0_BASE) & IRQ_MASK) << 2));
2144                 (void) he_readl(he_dev, INT_FIFO);      /* 8.1.2 controller errata */
2145         }
2146
2147 #ifdef DEBUG
2148         if (he_dev->irq_head == he_dev->irq_tail /* && !IRQ_PENDING */)
2149                 hprintk("spurious (or shared) interrupt?\n");
2150 #endif
2151
2152         if (he_dev->irq_head != he_dev->irq_tail) {
2153                 handled = 1;
2154                 tasklet_schedule(&he_dev->tasklet);
2155                 he_writel(he_dev, INT_CLEAR_A, INT_FIFO);       /* clear interrupt */
2156                 (void) he_readl(he_dev, INT_FIFO);              /* flush posted writes */
2157         }
2158         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2159         return IRQ_RETVAL(handled);
2160
2161 }
2162
2163 static __inline__ void
2164 __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid)
2165 {
2166         struct he_tpdrq *new_tail;
2167
2168         HPRINTK("tpdrq %p cid 0x%x -> tpdrq_tail %p\n",
2169                                         tpd, cid, he_dev->tpdrq_tail);
2170
2171         /* new_tail = he_dev->tpdrq_tail; */
2172         new_tail = (struct he_tpdrq *) ((unsigned long) he_dev->tpdrq_base |
2173                                         TPDRQ_MASK(he_dev->tpdrq_tail+1));
2174
2175         /*
2176          * check to see if we are about to set the tail == head
2177          * if true, update the head pointer from the adapter
2178          * to see if this is really the case (reading the queue
2179          * head for every enqueue would be unnecessarily slow)
2180          */
2181
2182         if (new_tail == he_dev->tpdrq_head) {
2183                 he_dev->tpdrq_head = (struct he_tpdrq *)
2184                         (((unsigned long)he_dev->tpdrq_base) |
2185                                 TPDRQ_MASK(he_readl(he_dev, TPDRQ_B_H)));
2186
2187                 if (new_tail == he_dev->tpdrq_head) {
2188                         int slot;
2189
2190                         hprintk("tpdrq full (cid 0x%x)\n", cid);
2191                         /*
2192                          * FIXME
2193                          * push tpd onto a transmit backlog queue
2194                          * after service_tbrq, service the backlog
2195                          * for now, we just drop the pdu
2196                          */
2197                         for (slot = 0; slot < TPD_MAXIOV; ++slot) {
2198                                 if (tpd->iovec[slot].addr)
2199                                         pci_unmap_single(he_dev->pci_dev,
2200                                                 tpd->iovec[slot].addr,
2201                                                 tpd->iovec[slot].len & TPD_LEN_MASK,
2202                                                                 PCI_DMA_TODEVICE);
2203                         }
2204                         if (tpd->skb) {
2205                                 if (tpd->vcc->pop)
2206                                         tpd->vcc->pop(tpd->vcc, tpd->skb);
2207                                 else
2208                                         dev_kfree_skb_any(tpd->skb);
2209                                 atomic_inc(&tpd->vcc->stats->tx_err);
2210                         }
2211                         pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
2212                         return;
2213                 }
2214         }
2215
2216         /* 2.1.5 transmit packet descriptor ready queue */
2217         list_add_tail(&tpd->entry, &he_dev->outstanding_tpds);
2218         he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status);
2219         he_dev->tpdrq_tail->cid = cid;
2220         wmb();
2221
2222         he_dev->tpdrq_tail = new_tail;
2223
2224         he_writel(he_dev, TPDRQ_MASK(he_dev->tpdrq_tail), TPDRQ_T);
2225         (void) he_readl(he_dev, TPDRQ_T);               /* flush posted writes */
2226 }
2227
2228 static int
2229 he_open(struct atm_vcc *vcc)
2230 {
2231         unsigned long flags;
2232         struct he_dev *he_dev = HE_DEV(vcc->dev);
2233         struct he_vcc *he_vcc;
2234         int err = 0;
2235         unsigned cid, rsr0, rsr1, rsr4, tsr0, tsr0_aal, tsr4, period, reg, clock;
2236         short vpi = vcc->vpi;
2237         int vci = vcc->vci;
2238
2239         if (vci == ATM_VCI_UNSPEC || vpi == ATM_VPI_UNSPEC)
2240                 return 0;
2241
2242         HPRINTK("open vcc %p %d.%d\n", vcc, vpi, vci);
2243
2244         set_bit(ATM_VF_ADDR, &vcc->flags);
2245
2246         cid = he_mkcid(he_dev, vpi, vci);
2247
2248         he_vcc = kmalloc(sizeof(struct he_vcc), GFP_ATOMIC);
2249         if (he_vcc == NULL) {
2250                 hprintk("unable to allocate he_vcc during open\n");
2251                 return -ENOMEM;
2252         }
2253
2254         he_vcc->iov_tail = he_vcc->iov_head;
2255         he_vcc->pdu_len = 0;
2256         he_vcc->rc_index = -1;
2257
2258         init_waitqueue_head(&he_vcc->rx_waitq);
2259         init_waitqueue_head(&he_vcc->tx_waitq);
2260
2261         vcc->dev_data = he_vcc;
2262
2263         if (vcc->qos.txtp.traffic_class != ATM_NONE) {
2264                 int pcr_goal;
2265
2266                 pcr_goal = atm_pcr_goal(&vcc->qos.txtp);
2267                 if (pcr_goal == 0)
2268                         pcr_goal = he_dev->atm_dev->link_rate;
2269                 if (pcr_goal < 0)       /* means round down, technically */
2270                         pcr_goal = -pcr_goal;
2271
2272                 HPRINTK("open tx cid 0x%x pcr_goal %d\n", cid, pcr_goal);
2273
2274                 switch (vcc->qos.aal) {
2275                         case ATM_AAL5:
2276                                 tsr0_aal = TSR0_AAL5;
2277                                 tsr4 = TSR4_AAL5;
2278                                 break;
2279                         case ATM_AAL0:
2280                                 tsr0_aal = TSR0_AAL0_SDU;
2281                                 tsr4 = TSR4_AAL0_SDU;
2282                                 break;
2283                         default:
2284                                 err = -EINVAL;
2285                                 goto open_failed;
2286                 }
2287
2288                 spin_lock_irqsave(&he_dev->global_lock, flags);
2289                 tsr0 = he_readl_tsr0(he_dev, cid);
2290                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2291
2292                 if (TSR0_CONN_STATE(tsr0) != 0) {
2293                         hprintk("cid 0x%x not idle (tsr0 = 0x%x)\n", cid, tsr0);
2294                         err = -EBUSY;
2295                         goto open_failed;
2296                 }
2297
2298                 switch (vcc->qos.txtp.traffic_class) {
2299                         case ATM_UBR:
2300                                 /* 2.3.3.1 open connection ubr */
2301
2302                                 tsr0 = TSR0_UBR | TSR0_GROUP(0) | tsr0_aal |
2303                                         TSR0_USE_WMIN | TSR0_UPDATE_GER;
2304                                 break;
2305
2306                         case ATM_CBR:
2307                                 /* 2.3.3.2 open connection cbr */
2308
2309                                 /* 8.2.3 cbr scheduler wrap problem -- limit to 90% total link rate */
2310                                 if ((he_dev->total_bw + pcr_goal)
2311                                         > (he_dev->atm_dev->link_rate * 9 / 10))
2312                                 {
2313                                         err = -EBUSY;
2314                                         goto open_failed;
2315                                 }
2316
2317                                 spin_lock_irqsave(&he_dev->global_lock, flags);                 /* also protects he_dev->cs_stper[] */
2318
2319                                 /* find an unused cs_stper register */
2320                                 for (reg = 0; reg < HE_NUM_CS_STPER; ++reg)
2321                                         if (he_dev->cs_stper[reg].inuse == 0 || 
2322                                             he_dev->cs_stper[reg].pcr == pcr_goal)
2323                                                         break;
2324
2325                                 if (reg == HE_NUM_CS_STPER) {
2326                                         err = -EBUSY;
2327                                         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2328                                         goto open_failed;
2329                                 }
2330
2331                                 he_dev->total_bw += pcr_goal;
2332
2333                                 he_vcc->rc_index = reg;
2334                                 ++he_dev->cs_stper[reg].inuse;
2335                                 he_dev->cs_stper[reg].pcr = pcr_goal;
2336
2337                                 clock = he_is622(he_dev) ? 66667000 : 50000000;
2338                                 period = clock / pcr_goal;
2339                                 
2340                                 HPRINTK("rc_index = %d period = %d\n",
2341                                                                 reg, period);
2342
2343                                 he_writel_mbox(he_dev, rate_to_atmf(period/2),
2344                                                         CS_STPER0 + reg);
2345                                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2346
2347                                 tsr0 = TSR0_CBR | TSR0_GROUP(0) | tsr0_aal |
2348                                                         TSR0_RC_INDEX(reg);
2349
2350                                 break;
2351                         default:
2352                                 err = -EINVAL;
2353                                 goto open_failed;
2354                 }
2355
2356                 spin_lock_irqsave(&he_dev->global_lock, flags);
2357
2358                 he_writel_tsr0(he_dev, tsr0, cid);
2359                 he_writel_tsr4(he_dev, tsr4 | 1, cid);
2360                 he_writel_tsr1(he_dev, TSR1_MCR(rate_to_atmf(0)) |
2361                                         TSR1_PCR(rate_to_atmf(pcr_goal)), cid);
2362                 he_writel_tsr2(he_dev, TSR2_ACR(rate_to_atmf(pcr_goal)), cid);
2363                 he_writel_tsr9(he_dev, TSR9_OPEN_CONN, cid);
2364
2365                 he_writel_tsr3(he_dev, 0x0, cid);
2366                 he_writel_tsr5(he_dev, 0x0, cid);
2367                 he_writel_tsr6(he_dev, 0x0, cid);
2368                 he_writel_tsr7(he_dev, 0x0, cid);
2369                 he_writel_tsr8(he_dev, 0x0, cid);
2370                 he_writel_tsr10(he_dev, 0x0, cid);
2371                 he_writel_tsr11(he_dev, 0x0, cid);
2372                 he_writel_tsr12(he_dev, 0x0, cid);
2373                 he_writel_tsr13(he_dev, 0x0, cid);
2374                 he_writel_tsr14(he_dev, 0x0, cid);
2375                 (void) he_readl_tsr0(he_dev, cid);              /* flush posted writes */
2376                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2377         }
2378
2379         if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
2380                 unsigned aal;
2381
2382                 HPRINTK("open rx cid 0x%x (rx_waitq %p)\n", cid,
2383                                                 &HE_VCC(vcc)->rx_waitq);
2384
2385                 switch (vcc->qos.aal) {
2386                         case ATM_AAL5:
2387                                 aal = RSR0_AAL5;
2388                                 break;
2389                         case ATM_AAL0:
2390                                 aal = RSR0_RAWCELL;
2391                                 break;
2392                         default:
2393                                 err = -EINVAL;
2394                                 goto open_failed;
2395                 }
2396
2397                 spin_lock_irqsave(&he_dev->global_lock, flags);
2398
2399                 rsr0 = he_readl_rsr0(he_dev, cid);
2400                 if (rsr0 & RSR0_OPEN_CONN) {
2401                         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2402
2403                         hprintk("cid 0x%x not idle (rsr0 = 0x%x)\n", cid, rsr0);
2404                         err = -EBUSY;
2405                         goto open_failed;
2406                 }
2407
2408                 rsr1 = RSR1_GROUP(0);
2409                 rsr4 = RSR4_GROUP(0);
2410                 rsr0 = vcc->qos.rxtp.traffic_class == ATM_UBR ? 
2411                                 (RSR0_EPD_ENABLE|RSR0_PPD_ENABLE) : 0;
2412
2413 #ifdef USE_CHECKSUM_HW
2414                 if (vpi == 0 && vci >= ATM_NOT_RSV_VCI)
2415                         rsr0 |= RSR0_TCP_CKSUM;
2416 #endif
2417
2418                 he_writel_rsr4(he_dev, rsr4, cid);
2419                 he_writel_rsr1(he_dev, rsr1, cid);
2420                 /* 5.1.11 last parameter initialized should be
2421                           the open/closed indication in rsr0 */
2422                 he_writel_rsr0(he_dev,
2423                         rsr0 | RSR0_START_PDU | RSR0_OPEN_CONN | aal, cid);
2424                 (void) he_readl_rsr0(he_dev, cid);              /* flush posted writes */
2425
2426                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2427         }
2428
2429 open_failed:
2430
2431         if (err) {
2432                 kfree(he_vcc);
2433                 clear_bit(ATM_VF_ADDR, &vcc->flags);
2434         }
2435         else
2436                 set_bit(ATM_VF_READY, &vcc->flags);
2437
2438         return err;
2439 }
2440
2441 static void
2442 he_close(struct atm_vcc *vcc)
2443 {
2444         unsigned long flags;
2445         DECLARE_WAITQUEUE(wait, current);
2446         struct he_dev *he_dev = HE_DEV(vcc->dev);
2447         struct he_tpd *tpd;
2448         unsigned cid;
2449         struct he_vcc *he_vcc = HE_VCC(vcc);
2450 #define MAX_RETRY 30
2451         int retry = 0, sleep = 1, tx_inuse;
2452
2453         HPRINTK("close vcc %p %d.%d\n", vcc, vcc->vpi, vcc->vci);
2454
2455         clear_bit(ATM_VF_READY, &vcc->flags);
2456         cid = he_mkcid(he_dev, vcc->vpi, vcc->vci);
2457
2458         if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
2459                 int timeout;
2460
2461                 HPRINTK("close rx cid 0x%x\n", cid);
2462
2463                 /* 2.7.2.2 close receive operation */
2464
2465                 /* wait for previous close (if any) to finish */
2466
2467                 spin_lock_irqsave(&he_dev->global_lock, flags);
2468                 while (he_readl(he_dev, RCC_STAT) & RCC_BUSY) {
2469                         HPRINTK("close cid 0x%x RCC_BUSY\n", cid);
2470                         udelay(250);
2471                 }
2472
2473                 set_current_state(TASK_UNINTERRUPTIBLE);
2474                 add_wait_queue(&he_vcc->rx_waitq, &wait);
2475
2476                 he_writel_rsr0(he_dev, RSR0_CLOSE_CONN, cid);
2477                 (void) he_readl_rsr0(he_dev, cid);              /* flush posted writes */
2478                 he_writel_mbox(he_dev, cid, RXCON_CLOSE);
2479                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2480
2481                 timeout = schedule_timeout(30*HZ);
2482
2483                 remove_wait_queue(&he_vcc->rx_waitq, &wait);
2484                 set_current_state(TASK_RUNNING);
2485
2486                 if (timeout == 0)
2487                         hprintk("close rx timeout cid 0x%x\n", cid);
2488
2489                 HPRINTK("close rx cid 0x%x complete\n", cid);
2490
2491         }
2492
2493         if (vcc->qos.txtp.traffic_class != ATM_NONE) {
2494                 volatile unsigned tsr4, tsr0;
2495                 int timeout;
2496
2497                 HPRINTK("close tx cid 0x%x\n", cid);
2498                 
2499                 /* 2.1.2
2500                  *
2501                  * ... the host must first stop queueing packets to the TPDRQ
2502                  * on the connection to be closed, then wait for all outstanding
2503                  * packets to be transmitted and their buffers returned to the
2504                  * TBRQ. When the last packet on the connection arrives in the
2505                  * TBRQ, the host issues the close command to the adapter.
2506                  */
2507
2508                 while (((tx_inuse = atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) > 0) &&
2509                        (retry < MAX_RETRY)) {
2510                         msleep(sleep);
2511                         if (sleep < 250)
2512                                 sleep = sleep * 2;
2513
2514                         ++retry;
2515                 }
2516
2517                 if (tx_inuse)
2518                         hprintk("close tx cid 0x%x tx_inuse = %d\n", cid, tx_inuse);
2519
2520                 /* 2.3.1.1 generic close operations with flush */
2521
2522                 spin_lock_irqsave(&he_dev->global_lock, flags);
2523                 he_writel_tsr4_upper(he_dev, TSR4_FLUSH_CONN, cid);
2524                                         /* also clears TSR4_SESSION_ENDED */
2525
2526                 switch (vcc->qos.txtp.traffic_class) {
2527                         case ATM_UBR:
2528                                 he_writel_tsr1(he_dev, 
2529                                         TSR1_MCR(rate_to_atmf(200000))
2530                                         | TSR1_PCR(0), cid);
2531                                 break;
2532                         case ATM_CBR:
2533                                 he_writel_tsr14_upper(he_dev, TSR14_DELETE, cid);
2534                                 break;
2535                 }
2536                 (void) he_readl_tsr4(he_dev, cid);              /* flush posted writes */
2537
2538                 tpd = __alloc_tpd(he_dev);
2539                 if (tpd == NULL) {
2540                         hprintk("close tx he_alloc_tpd failed cid 0x%x\n", cid);
2541                         goto close_tx_incomplete;
2542                 }
2543                 tpd->status |= TPD_EOS | TPD_INT;
2544                 tpd->skb = NULL;
2545                 tpd->vcc = vcc;
2546                 wmb();
2547
2548                 set_current_state(TASK_UNINTERRUPTIBLE);
2549                 add_wait_queue(&he_vcc->tx_waitq, &wait);
2550                 __enqueue_tpd(he_dev, tpd, cid);
2551                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2552
2553                 timeout = schedule_timeout(30*HZ);
2554
2555                 remove_wait_queue(&he_vcc->tx_waitq, &wait);
2556                 set_current_state(TASK_RUNNING);
2557
2558                 spin_lock_irqsave(&he_dev->global_lock, flags);
2559
2560                 if (timeout == 0) {
2561                         hprintk("close tx timeout cid 0x%x\n", cid);
2562                         goto close_tx_incomplete;
2563                 }
2564
2565                 while (!((tsr4 = he_readl_tsr4(he_dev, cid)) & TSR4_SESSION_ENDED)) {
2566                         HPRINTK("close tx cid 0x%x !TSR4_SESSION_ENDED (tsr4 = 0x%x)\n", cid, tsr4);
2567                         udelay(250);
2568                 }
2569
2570                 while (TSR0_CONN_STATE(tsr0 = he_readl_tsr0(he_dev, cid)) != 0) {
2571                         HPRINTK("close tx cid 0x%x TSR0_CONN_STATE != 0 (tsr0 = 0x%x)\n", cid, tsr0);
2572                         udelay(250);
2573                 }
2574
2575 close_tx_incomplete:
2576
2577                 if (vcc->qos.txtp.traffic_class == ATM_CBR) {
2578                         int reg = he_vcc->rc_index;
2579
2580                         HPRINTK("cs_stper reg = %d\n", reg);
2581
2582                         if (he_dev->cs_stper[reg].inuse == 0)
2583                                 hprintk("cs_stper[%d].inuse = 0!\n", reg);
2584                         else
2585                                 --he_dev->cs_stper[reg].inuse;
2586
2587                         he_dev->total_bw -= he_dev->cs_stper[reg].pcr;
2588                 }
2589                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2590
2591                 HPRINTK("close tx cid 0x%x complete\n", cid);
2592         }
2593
2594         kfree(he_vcc);
2595
2596         clear_bit(ATM_VF_ADDR, &vcc->flags);
2597 }
2598
2599 static int
2600 he_send(struct atm_vcc *vcc, struct sk_buff *skb)
2601 {
2602         unsigned long flags;
2603         struct he_dev *he_dev = HE_DEV(vcc->dev);
2604         unsigned cid = he_mkcid(he_dev, vcc->vpi, vcc->vci);
2605         struct he_tpd *tpd;
2606 #ifdef USE_SCATTERGATHER
2607         int i, slot = 0;
2608 #endif
2609
2610 #define HE_TPD_BUFSIZE 0xffff
2611
2612         HPRINTK("send %d.%d\n", vcc->vpi, vcc->vci);
2613
2614         if ((skb->len > HE_TPD_BUFSIZE) ||
2615             ((vcc->qos.aal == ATM_AAL0) && (skb->len != ATM_AAL0_SDU))) {
2616                 hprintk("buffer too large (or small) -- %d bytes\n", skb->len );
2617                 if (vcc->pop)
2618                         vcc->pop(vcc, skb);
2619                 else
2620                         dev_kfree_skb_any(skb);
2621                 atomic_inc(&vcc->stats->tx_err);
2622                 return -EINVAL;
2623         }
2624
2625 #ifndef USE_SCATTERGATHER
2626         if (skb_shinfo(skb)->nr_frags) {
2627                 hprintk("no scatter/gather support\n");
2628                 if (vcc->pop)
2629                         vcc->pop(vcc, skb);
2630                 else
2631                         dev_kfree_skb_any(skb);
2632                 atomic_inc(&vcc->stats->tx_err);
2633                 return -EINVAL;
2634         }
2635 #endif
2636         spin_lock_irqsave(&he_dev->global_lock, flags);
2637
2638         tpd = __alloc_tpd(he_dev);
2639         if (tpd == NULL) {
2640                 if (vcc->pop)
2641                         vcc->pop(vcc, skb);
2642                 else
2643                         dev_kfree_skb_any(skb);
2644                 atomic_inc(&vcc->stats->tx_err);
2645                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2646                 return -ENOMEM;
2647         }
2648
2649         if (vcc->qos.aal == ATM_AAL5)
2650                 tpd->status |= TPD_CELLTYPE(TPD_USERCELL);
2651         else {
2652                 char *pti_clp = (void *) (skb->data + 3);
2653                 int clp, pti;
2654
2655                 pti = (*pti_clp & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT; 
2656                 clp = (*pti_clp & ATM_HDR_CLP);
2657                 tpd->status |= TPD_CELLTYPE(pti);
2658                 if (clp)
2659                         tpd->status |= TPD_CLP;
2660
2661                 skb_pull(skb, ATM_AAL0_SDU - ATM_CELL_PAYLOAD);
2662         }
2663
2664 #ifdef USE_SCATTERGATHER
2665         tpd->iovec[slot].addr = pci_map_single(he_dev->pci_dev, skb->data,
2666                                 skb->len - skb->data_len, PCI_DMA_TODEVICE);
2667         tpd->iovec[slot].len = skb->len - skb->data_len;
2668         ++slot;
2669
2670         for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
2671                 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
2672
2673                 if (slot == TPD_MAXIOV) {       /* queue tpd; start new tpd */
2674                         tpd->vcc = vcc;
2675                         tpd->skb = NULL;        /* not the last fragment
2676                                                    so dont ->push() yet */
2677                         wmb();
2678
2679                         __enqueue_tpd(he_dev, tpd, cid);
2680                         tpd = __alloc_tpd(he_dev);
2681                         if (tpd == NULL) {
2682                                 if (vcc->pop)
2683                                         vcc->pop(vcc, skb);
2684                                 else
2685                                         dev_kfree_skb_any(skb);
2686                                 atomic_inc(&vcc->stats->tx_err);
2687                                 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2688                                 return -ENOMEM;
2689                         }
2690                         tpd->status |= TPD_USERCELL;
2691                         slot = 0;
2692                 }
2693
2694                 tpd->iovec[slot].addr = pci_map_single(he_dev->pci_dev,
2695                         (void *) page_address(frag->page) + frag->page_offset,
2696                                 frag->size, PCI_DMA_TODEVICE);
2697                 tpd->iovec[slot].len = frag->size;
2698                 ++slot;
2699
2700         }
2701
2702         tpd->iovec[slot - 1].len |= TPD_LST;
2703 #else
2704         tpd->address0 = pci_map_single(he_dev->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE);
2705         tpd->length0 = skb->len | TPD_LST;
2706 #endif
2707         tpd->status |= TPD_INT;
2708
2709         tpd->vcc = vcc;
2710         tpd->skb = skb;
2711         wmb();
2712         ATM_SKB(skb)->vcc = vcc;
2713
2714         __enqueue_tpd(he_dev, tpd, cid);
2715         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2716
2717         atomic_inc(&vcc->stats->tx);
2718
2719         return 0;
2720 }
2721
2722 static int
2723 he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg)
2724 {
2725         unsigned long flags;
2726         struct he_dev *he_dev = HE_DEV(atm_dev);
2727         struct he_ioctl_reg reg;
2728         int err = 0;
2729
2730         switch (cmd) {
2731                 case HE_GET_REG:
2732                         if (!capable(CAP_NET_ADMIN))
2733                                 return -EPERM;
2734
2735                         if (copy_from_user(&reg, arg,
2736                                            sizeof(struct he_ioctl_reg)))
2737                                 return -EFAULT;
2738
2739                         spin_lock_irqsave(&he_dev->global_lock, flags);
2740                         switch (reg.type) {
2741                                 case HE_REGTYPE_PCI:
2742                                         if (reg.addr < 0 || reg.addr >= HE_REGMAP_SIZE) {
2743                                                 err = -EINVAL;
2744                                                 break;
2745                                         }
2746
2747                                         reg.val = he_readl(he_dev, reg.addr);
2748                                         break;
2749                                 case HE_REGTYPE_RCM:
2750                                         reg.val =
2751                                                 he_readl_rcm(he_dev, reg.addr);
2752                                         break;
2753                                 case HE_REGTYPE_TCM:
2754                                         reg.val =
2755                                                 he_readl_tcm(he_dev, reg.addr);
2756                                         break;
2757                                 case HE_REGTYPE_MBOX:
2758                                         reg.val =
2759                                                 he_readl_mbox(he_dev, reg.addr);
2760                                         break;
2761                                 default:
2762                                         err = -EINVAL;
2763                                         break;
2764                         }
2765                         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2766                         if (err == 0)
2767                                 if (copy_to_user(arg, &reg,
2768                                                         sizeof(struct he_ioctl_reg)))
2769                                         return -EFAULT;
2770                         break;
2771                 default:
2772 #ifdef CONFIG_ATM_HE_USE_SUNI
2773                         if (atm_dev->phy && atm_dev->phy->ioctl)
2774                                 err = atm_dev->phy->ioctl(atm_dev, cmd, arg);
2775 #else /* CONFIG_ATM_HE_USE_SUNI */
2776                         err = -EINVAL;
2777 #endif /* CONFIG_ATM_HE_USE_SUNI */
2778                         break;
2779         }
2780
2781         return err;
2782 }
2783
2784 static void
2785 he_phy_put(struct atm_dev *atm_dev, unsigned char val, unsigned long addr)
2786 {
2787         unsigned long flags;
2788         struct he_dev *he_dev = HE_DEV(atm_dev);
2789
2790         HPRINTK("phy_put(val 0x%x, addr 0x%lx)\n", val, addr);
2791
2792         spin_lock_irqsave(&he_dev->global_lock, flags);
2793         he_writel(he_dev, val, FRAMER + (addr*4));
2794         (void) he_readl(he_dev, FRAMER + (addr*4));             /* flush posted writes */
2795         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2796 }
2797  
2798         
2799 static unsigned char
2800 he_phy_get(struct atm_dev *atm_dev, unsigned long addr)
2801
2802         unsigned long flags;
2803         struct he_dev *he_dev = HE_DEV(atm_dev);
2804         unsigned reg;
2805
2806         spin_lock_irqsave(&he_dev->global_lock, flags);
2807         reg = he_readl(he_dev, FRAMER + (addr*4));
2808         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2809
2810         HPRINTK("phy_get(addr 0x%lx) =0x%x\n", addr, reg);
2811         return reg;
2812 }
2813
2814 static int
2815 he_proc_read(struct atm_dev *dev, loff_t *pos, char *page)
2816 {
2817         unsigned long flags;
2818         struct he_dev *he_dev = HE_DEV(dev);
2819         int left, i;
2820 #ifdef notdef
2821         struct he_rbrq *rbrq_tail;
2822         struct he_tpdrq *tpdrq_head;
2823         int rbpl_head, rbpl_tail;
2824 #endif
2825         static long mcc = 0, oec = 0, dcc = 0, cec = 0;
2826
2827
2828         left = *pos;
2829         if (!left--)
2830                 return sprintf(page, "ATM he driver\n");
2831
2832         if (!left--)
2833                 return sprintf(page, "%s%s\n\n",
2834                         he_dev->prod_id, he_dev->media & 0x40 ? "SM" : "MM");
2835
2836         if (!left--)
2837                 return sprintf(page, "Mismatched Cells  VPI/VCI Not Open  Dropped Cells  RCM Dropped Cells\n");
2838
2839         spin_lock_irqsave(&he_dev->global_lock, flags);
2840         mcc += he_readl(he_dev, MCC);
2841         oec += he_readl(he_dev, OEC);
2842         dcc += he_readl(he_dev, DCC);
2843         cec += he_readl(he_dev, CEC);
2844         spin_unlock_irqrestore(&he_dev->global_lock, flags);
2845
2846         if (!left--)
2847                 return sprintf(page, "%16ld  %16ld  %13ld  %17ld\n\n", 
2848                                                         mcc, oec, dcc, cec);
2849
2850         if (!left--)
2851                 return sprintf(page, "irq_size = %d  inuse = ?  peak = %d\n",
2852                                 CONFIG_IRQ_SIZE, he_dev->irq_peak);
2853
2854         if (!left--)
2855                 return sprintf(page, "tpdrq_size = %d  inuse = ?\n",
2856                                                 CONFIG_TPDRQ_SIZE);
2857
2858         if (!left--)
2859                 return sprintf(page, "rbrq_size = %d  inuse = ?  peak = %d\n",
2860                                 CONFIG_RBRQ_SIZE, he_dev->rbrq_peak);
2861
2862         if (!left--)
2863                 return sprintf(page, "tbrq_size = %d  peak = %d\n",
2864                                         CONFIG_TBRQ_SIZE, he_dev->tbrq_peak);
2865
2866
2867 #ifdef notdef
2868         rbpl_head = RBPL_MASK(he_readl(he_dev, G0_RBPL_S));
2869         rbpl_tail = RBPL_MASK(he_readl(he_dev, G0_RBPL_T));
2870
2871         inuse = rbpl_head - rbpl_tail;
2872         if (inuse < 0)
2873                 inuse += CONFIG_RBPL_SIZE * sizeof(struct he_rbp);
2874         inuse /= sizeof(struct he_rbp);
2875
2876         if (!left--)
2877                 return sprintf(page, "rbpl_size = %d  inuse = %d\n\n",
2878                                                 CONFIG_RBPL_SIZE, inuse);
2879 #endif
2880
2881         if (!left--)
2882                 return sprintf(page, "rate controller periods (cbr)\n                 pcr  #vc\n");
2883
2884         for (i = 0; i < HE_NUM_CS_STPER; ++i)
2885                 if (!left--)
2886                         return sprintf(page, "cs_stper%-2d  %8ld  %3d\n", i,
2887                                                 he_dev->cs_stper[i].pcr,
2888                                                 he_dev->cs_stper[i].inuse);
2889
2890         if (!left--)
2891                 return sprintf(page, "total bw (cbr): %d  (limit %d)\n",
2892                         he_dev->total_bw, he_dev->atm_dev->link_rate * 10 / 9);
2893
2894         return 0;
2895 }
2896
2897 /* eeprom routines  -- see 4.7 */
2898
2899 static u8 read_prom_byte(struct he_dev *he_dev, int addr)
2900 {
2901         u32 val = 0, tmp_read = 0;
2902         int i, j = 0;
2903         u8 byte_read = 0;
2904
2905         val = readl(he_dev->membase + HOST_CNTL);
2906         val &= 0xFFFFE0FF;
2907        
2908         /* Turn on write enable */
2909         val |= 0x800;
2910         he_writel(he_dev, val, HOST_CNTL);
2911        
2912         /* Send READ instruction */
2913         for (i = 0; i < ARRAY_SIZE(readtab); i++) {
2914                 he_writel(he_dev, val | readtab[i], HOST_CNTL);
2915                 udelay(EEPROM_DELAY);
2916         }
2917        
2918         /* Next, we need to send the byte address to read from */
2919         for (i = 7; i >= 0; i--) {
2920                 he_writel(he_dev, val | clocktab[j++] | (((addr >> i) & 1) << 9), HOST_CNTL);
2921                 udelay(EEPROM_DELAY);
2922                 he_writel(he_dev, val | clocktab[j++] | (((addr >> i) & 1) << 9), HOST_CNTL);
2923                 udelay(EEPROM_DELAY);
2924         }
2925        
2926         j = 0;
2927
2928         val &= 0xFFFFF7FF;      /* Turn off write enable */
2929         he_writel(he_dev, val, HOST_CNTL);
2930        
2931         /* Now, we can read data from the EEPROM by clocking it in */
2932         for (i = 7; i >= 0; i--) {
2933                 he_writel(he_dev, val | clocktab[j++], HOST_CNTL);
2934                 udelay(EEPROM_DELAY);
2935                 tmp_read = he_readl(he_dev, HOST_CNTL);
2936                 byte_read |= (unsigned char)
2937                            ((tmp_read & ID_DOUT) >> ID_DOFFSET << i);
2938                 he_writel(he_dev, val | clocktab[j++], HOST_CNTL);
2939                 udelay(EEPROM_DELAY);
2940         }
2941        
2942         he_writel(he_dev, val | ID_CS, HOST_CNTL);
2943         udelay(EEPROM_DELAY);
2944
2945         return byte_read;
2946 }
2947
2948 MODULE_LICENSE("GPL");
2949 MODULE_AUTHOR("chas williams <chas@cmf.nrl.navy.mil>");
2950 MODULE_DESCRIPTION("ForeRunnerHE ATM Adapter driver");
2951 module_param(disable64, bool, 0);
2952 MODULE_PARM_DESC(disable64, "disable 64-bit pci bus transfers");
2953 module_param(nvpibits, short, 0);
2954 MODULE_PARM_DESC(nvpibits, "numbers of bits for vpi (default 0)");
2955 module_param(nvcibits, short, 0);
2956 MODULE_PARM_DESC(nvcibits, "numbers of bits for vci (default 12)");
2957 module_param(rx_skb_reserve, short, 0);
2958 MODULE_PARM_DESC(rx_skb_reserve, "padding for receive skb (default 16)");
2959 module_param(irq_coalesce, bool, 0);
2960 MODULE_PARM_DESC(irq_coalesce, "use interrupt coalescing (default 1)");
2961 module_param(sdh, bool, 0);
2962 MODULE_PARM_DESC(sdh, "use SDH framing (default 0)");
2963
2964 static struct pci_device_id he_pci_tbl[] = {
2965         { PCI_VENDOR_ID_FORE, PCI_DEVICE_ID_FORE_HE, PCI_ANY_ID, PCI_ANY_ID,
2966           0, 0, 0 },
2967         { 0, }
2968 };
2969
2970 MODULE_DEVICE_TABLE(pci, he_pci_tbl);
2971
2972 static struct pci_driver he_driver = {
2973         .name =         "he",
2974         .probe =        he_init_one,
2975         .remove =       __devexit_p(he_remove_one),
2976         .id_table =     he_pci_tbl,
2977 };
2978
2979 static int __init he_init(void)
2980 {
2981         return pci_register_driver(&he_driver);
2982 }
2983
2984 static void __exit he_cleanup(void)
2985 {
2986         pci_unregister_driver(&he_driver);
2987 }
2988
2989 module_init(he_init);
2990 module_exit(he_cleanup);