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