xref: /linux/drivers/atm/he.c (revision 776cfebb430c7b22c208b1b17add97f354d97cab)
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/config.h>
59 #include <linux/module.h>
60 #include <linux/version.h>
61 #include <linux/kernel.h>
62 #include <linux/skbuff.h>
63 #include <linux/pci.h>
64 #include <linux/errno.h>
65 #include <linux/types.h>
66 #include <linux/string.h>
67 #include <linux/delay.h>
68 #include <linux/init.h>
69 #include <linux/mm.h>
70 #include <linux/sched.h>
71 #include <linux/timer.h>
72 #include <linux/interrupt.h>
73 #include <linux/dma-mapping.h>
74 #include <asm/io.h>
75 #include <asm/byteorder.h>
76 #include <asm/uaccess.h>
77 
78 #include <linux/atmdev.h>
79 #include <linux/atm.h>
80 #include <linux/sonet.h>
81 
82 #define USE_TASKLET
83 #undef USE_SCATTERGATHER
84 #undef USE_CHECKSUM_HW			/* still confused about this */
85 #define USE_RBPS
86 #undef USE_RBPS_POOL			/* if memory is tight try this */
87 #undef USE_RBPL_POOL			/* if memory is tight try this */
88 #define USE_TPD_POOL
89 /* #undef CONFIG_ATM_HE_USE_SUNI */
90 /* #undef HE_DEBUG */
91 
92 #include "he.h"
93 #include "suni.h"
94 #include <linux/atm_he.h>
95 
96 #define hprintk(fmt,args...)	printk(KERN_ERR DEV_LABEL "%d: " fmt, he_dev->number , ##args)
97 
98 #ifdef HE_DEBUG
99 #define HPRINTK(fmt,args...)	printk(KERN_DEBUG DEV_LABEL "%d: " fmt, he_dev->number , ##args)
100 #else /* !HE_DEBUG */
101 #define HPRINTK(fmt,args...)	do { } while (0)
102 #endif /* HE_DEBUG */
103 
104 /* version definition */
105 
106 static char *version = "$Id: he.c,v 1.18 2003/05/06 22:57:15 chas Exp $";
107 
108 /* declarations */
109 
110 static int he_open(struct atm_vcc *vcc);
111 static void he_close(struct atm_vcc *vcc);
112 static int he_send(struct atm_vcc *vcc, struct sk_buff *skb);
113 static int he_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg);
114 static irqreturn_t he_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
115 static void he_tasklet(unsigned long data);
116 static int he_proc_read(struct atm_dev *dev,loff_t *pos,char *page);
117 static int he_start(struct atm_dev *dev);
118 static void he_stop(struct he_dev *dev);
119 static void he_phy_put(struct atm_dev *, unsigned char, unsigned long);
120 static unsigned char he_phy_get(struct atm_dev *, unsigned long);
121 
122 static u8 read_prom_byte(struct he_dev *he_dev, int addr);
123 
124 /* globals */
125 
126 static struct he_dev *he_devs;
127 static int disable64;
128 static short nvpibits = -1;
129 static short nvcibits = -1;
130 static short rx_skb_reserve = 16;
131 static int irq_coalesce = 1;
132 static int sdh = 0;
133 
134 /* Read from EEPROM = 0000 0011b */
135 static unsigned int readtab[] = {
136 	CS_HIGH | CLK_HIGH,
137 	CS_LOW | 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,
148 	CLK_HIGH,               /* 0 */
149 	CLK_LOW | SI_HIGH,
150 	CLK_HIGH | SI_HIGH,     /* 1 */
151 	CLK_LOW | SI_HIGH,
152 	CLK_HIGH | SI_HIGH      /* 1 */
153 };
154 
155 /* Clock to read from/write to the EEPROM */
156 static unsigned int clocktab[] = {
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 	CLK_HIGH,
173 	CLK_LOW
174 };
175 
176 static struct atmdev_ops he_ops =
177 {
178 	.open =		he_open,
179 	.close =	he_close,
180 	.ioctl =	he_ioctl,
181 	.send =		he_send,
182 	.phy_put =	he_phy_put,
183 	.phy_get =	he_phy_get,
184 	.proc_read =	he_proc_read,
185 	.owner =	THIS_MODULE
186 };
187 
188 #define he_writel(dev, val, reg)	do { writel(val, (dev)->membase + (reg)); wmb(); } while (0)
189 #define he_readl(dev, reg)		readl((dev)->membase + (reg))
190 
191 /* section 2.12 connection memory access */
192 
193 static __inline__ void
194 he_writel_internal(struct he_dev *he_dev, unsigned val, unsigned addr,
195 								unsigned flags)
196 {
197 	he_writel(he_dev, val, CON_DAT);
198 	(void) he_readl(he_dev, CON_DAT);		/* flush posted writes */
199 	he_writel(he_dev, flags | CON_CTL_WRITE | CON_CTL_ADDR(addr), CON_CTL);
200 	while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY);
201 }
202 
203 #define he_writel_rcm(dev, val, reg) 				\
204 			he_writel_internal(dev, val, reg, CON_CTL_RCM)
205 
206 #define he_writel_tcm(dev, val, reg) 				\
207 			he_writel_internal(dev, val, reg, CON_CTL_TCM)
208 
209 #define he_writel_mbox(dev, val, reg) 				\
210 			he_writel_internal(dev, val, reg, CON_CTL_MBOX)
211 
212 static unsigned
213 he_readl_internal(struct he_dev *he_dev, unsigned addr, unsigned flags)
214 {
215 	he_writel(he_dev, flags | CON_CTL_READ | CON_CTL_ADDR(addr), CON_CTL);
216 	while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY);
217 	return he_readl(he_dev, CON_DAT);
218 }
219 
220 #define he_readl_rcm(dev, reg) \
221 			he_readl_internal(dev, reg, CON_CTL_RCM)
222 
223 #define he_readl_tcm(dev, reg) \
224 			he_readl_internal(dev, reg, CON_CTL_TCM)
225 
226 #define he_readl_mbox(dev, reg) \
227 			he_readl_internal(dev, reg, CON_CTL_MBOX)
228 
229 
230 /* figure 2.2 connection id */
231 
232 #define he_mkcid(dev, vpi, vci)		(((vpi << (dev)->vcibits) | vci) & 0x1fff)
233 
234 /* 2.5.1 per connection transmit state registers */
235 
236 #define he_writel_tsr0(dev, val, cid) \
237 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 0)
238 #define he_readl_tsr0(dev, cid) \
239 		he_readl_tcm(dev, CONFIG_TSRA | (cid << 3) | 0)
240 
241 #define he_writel_tsr1(dev, val, cid) \
242 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 1)
243 
244 #define he_writel_tsr2(dev, val, cid) \
245 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 2)
246 
247 #define he_writel_tsr3(dev, val, cid) \
248 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 3)
249 
250 #define he_writel_tsr4(dev, val, cid) \
251 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 4)
252 
253 	/* from page 2-20
254 	 *
255 	 * NOTE While the transmit connection is active, bits 23 through 0
256 	 *      of this register must not be written by the host.  Byte
257 	 *      enables should be used during normal operation when writing
258 	 *      the most significant byte.
259 	 */
260 
261 #define he_writel_tsr4_upper(dev, val, cid) \
262 		he_writel_internal(dev, val, CONFIG_TSRA | (cid << 3) | 4, \
263 							CON_CTL_TCM \
264 							| CON_BYTE_DISABLE_2 \
265 							| CON_BYTE_DISABLE_1 \
266 							| CON_BYTE_DISABLE_0)
267 
268 #define he_readl_tsr4(dev, cid) \
269 		he_readl_tcm(dev, CONFIG_TSRA | (cid << 3) | 4)
270 
271 #define he_writel_tsr5(dev, val, cid) \
272 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 5)
273 
274 #define he_writel_tsr6(dev, val, cid) \
275 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 6)
276 
277 #define he_writel_tsr7(dev, val, cid) \
278 		he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 7)
279 
280 
281 #define he_writel_tsr8(dev, val, cid) \
282 		he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 0)
283 
284 #define he_writel_tsr9(dev, val, cid) \
285 		he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 1)
286 
287 #define he_writel_tsr10(dev, val, cid) \
288 		he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 2)
289 
290 #define he_writel_tsr11(dev, val, cid) \
291 		he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 3)
292 
293 
294 #define he_writel_tsr12(dev, val, cid) \
295 		he_writel_tcm(dev, val, CONFIG_TSRC | (cid << 1) | 0)
296 
297 #define he_writel_tsr13(dev, val, cid) \
298 		he_writel_tcm(dev, val, CONFIG_TSRC | (cid << 1) | 1)
299 
300 
301 #define he_writel_tsr14(dev, val, cid) \
302 		he_writel_tcm(dev, val, CONFIG_TSRD | cid)
303 
304 #define he_writel_tsr14_upper(dev, val, cid) \
305 		he_writel_internal(dev, val, CONFIG_TSRD | cid, \
306 							CON_CTL_TCM \
307 							| CON_BYTE_DISABLE_2 \
308 							| CON_BYTE_DISABLE_1 \
309 							| CON_BYTE_DISABLE_0)
310 
311 /* 2.7.1 per connection receive state registers */
312 
313 #define he_writel_rsr0(dev, val, cid) \
314 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 0)
315 #define he_readl_rsr0(dev, cid) \
316 		he_readl_rcm(dev, 0x00000 | (cid << 3) | 0)
317 
318 #define he_writel_rsr1(dev, val, cid) \
319 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 1)
320 
321 #define he_writel_rsr2(dev, val, cid) \
322 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 2)
323 
324 #define he_writel_rsr3(dev, val, cid) \
325 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 3)
326 
327 #define he_writel_rsr4(dev, val, cid) \
328 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 4)
329 
330 #define he_writel_rsr5(dev, val, cid) \
331 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 5)
332 
333 #define he_writel_rsr6(dev, val, cid) \
334 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 6)
335 
336 #define he_writel_rsr7(dev, val, cid) \
337 		he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 7)
338 
339 static __inline__ struct atm_vcc*
340 __find_vcc(struct he_dev *he_dev, unsigned cid)
341 {
342 	struct hlist_head *head;
343 	struct atm_vcc *vcc;
344 	struct hlist_node *node;
345 	struct sock *s;
346 	short vpi;
347 	int vci;
348 
349 	vpi = cid >> he_dev->vcibits;
350 	vci = cid & ((1 << he_dev->vcibits) - 1);
351 	head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
352 
353 	sk_for_each(s, node, head) {
354 		vcc = atm_sk(s);
355 		if (vcc->dev == he_dev->atm_dev &&
356 		    vcc->vci == vci && vcc->vpi == vpi &&
357 		    vcc->qos.rxtp.traffic_class != ATM_NONE) {
358 				return vcc;
359 		}
360 	}
361 	return NULL;
362 }
363 
364 static int __devinit
365 he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
366 {
367 	struct atm_dev *atm_dev = NULL;
368 	struct he_dev *he_dev = NULL;
369 	int err = 0;
370 
371 	printk(KERN_INFO "he: %s\n", version);
372 
373 	if (pci_enable_device(pci_dev))
374 		return -EIO;
375 	if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK) != 0) {
376 		printk(KERN_WARNING "he: no suitable dma available\n");
377 		err = -EIO;
378 		goto init_one_failure;
379 	}
380 
381 	atm_dev = atm_dev_register(DEV_LABEL, &he_ops, -1, NULL);
382 	if (!atm_dev) {
383 		err = -ENODEV;
384 		goto init_one_failure;
385 	}
386 	pci_set_drvdata(pci_dev, atm_dev);
387 
388 	he_dev = (struct he_dev *) kmalloc(sizeof(struct he_dev),
389 							GFP_KERNEL);
390 	if (!he_dev) {
391 		err = -ENOMEM;
392 		goto init_one_failure;
393 	}
394 	memset(he_dev, 0, sizeof(struct he_dev));
395 
396 	he_dev->pci_dev = pci_dev;
397 	he_dev->atm_dev = atm_dev;
398 	he_dev->atm_dev->dev_data = he_dev;
399 	atm_dev->dev_data = he_dev;
400 	he_dev->number = atm_dev->number;
401 	if (he_start(atm_dev)) {
402 		he_stop(he_dev);
403 		err = -ENODEV;
404 		goto init_one_failure;
405 	}
406 	he_dev->next = NULL;
407 	if (he_devs)
408 		he_dev->next = he_devs;
409 	he_devs = he_dev;
410 	return 0;
411 
412 init_one_failure:
413 	if (atm_dev)
414 		atm_dev_deregister(atm_dev);
415 	if (he_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 __init
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 __init
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 __init
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 __init
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 __init
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 __init
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 __init
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, SLAB_KERNEL|SLAB_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, SLAB_KERNEL|SLAB_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 __init
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, SA_INTERRUPT|SA_SHIRQ, 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 __init
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 #ifdef USE_TASKLET
1182 	tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev);
1183 #endif
1184 	spin_lock_init(&he_dev->global_lock);
1185 
1186 	/* 4.11 enable pci bus controller state machines */
1187 	host_cntl |= (OUTFF_ENB | CMDFF_ENB |
1188 				QUICK_RD_RETRY | QUICK_WR_RETRY | PERR_INT_ENB);
1189 	he_writel(he_dev, host_cntl, HOST_CNTL);
1190 
1191 	gen_cntl_0 |= INT_PROC_ENBL|INIT_ENB;
1192 	pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1193 
1194 	/*
1195 	 * atm network controller initialization
1196 	 */
1197 
1198 	/* 5.1.1 generic configuration state */
1199 
1200 	/*
1201 	 *		local (cell) buffer memory map
1202 	 *
1203 	 *             HE155                          HE622
1204 	 *
1205 	 *        0 ____________1023 bytes  0 _______________________2047 bytes
1206 	 *         |            |            |                   |   |
1207 	 *         |  utility   |            |        rx0        |   |
1208 	 *        5|____________|         255|___________________| u |
1209 	 *        6|            |         256|                   | t |
1210 	 *         |            |            |                   | i |
1211 	 *         |    rx0     |     row    |        tx         | l |
1212 	 *         |            |            |                   | i |
1213 	 *         |            |         767|___________________| t |
1214 	 *      517|____________|         768|                   | y |
1215 	 * row  518|            |            |        rx1        |   |
1216 	 *         |            |        1023|___________________|___|
1217 	 *         |            |
1218 	 *         |    tx      |
1219 	 *         |            |
1220 	 *         |            |
1221 	 *     1535|____________|
1222 	 *     1536|            |
1223 	 *         |    rx1     |
1224 	 *     2047|____________|
1225 	 *
1226 	 */
1227 
1228 	/* total 4096 connections */
1229 	he_dev->vcibits = CONFIG_DEFAULT_VCIBITS;
1230 	he_dev->vpibits = CONFIG_DEFAULT_VPIBITS;
1231 
1232 	if (nvpibits != -1 && nvcibits != -1 && nvpibits+nvcibits != HE_MAXCIDBITS) {
1233 		hprintk("nvpibits + nvcibits != %d\n", HE_MAXCIDBITS);
1234 		return -ENODEV;
1235 	}
1236 
1237 	if (nvpibits != -1) {
1238 		he_dev->vpibits = nvpibits;
1239 		he_dev->vcibits = HE_MAXCIDBITS - nvpibits;
1240 	}
1241 
1242 	if (nvcibits != -1) {
1243 		he_dev->vcibits = nvcibits;
1244 		he_dev->vpibits = HE_MAXCIDBITS - nvcibits;
1245 	}
1246 
1247 
1248 	if (he_is622(he_dev)) {
1249 		he_dev->cells_per_row = 40;
1250 		he_dev->bytes_per_row = 2048;
1251 		he_dev->r0_numrows = 256;
1252 		he_dev->tx_numrows = 512;
1253 		he_dev->r1_numrows = 256;
1254 		he_dev->r0_startrow = 0;
1255 		he_dev->tx_startrow = 256;
1256 		he_dev->r1_startrow = 768;
1257 	} else {
1258 		he_dev->cells_per_row = 20;
1259 		he_dev->bytes_per_row = 1024;
1260 		he_dev->r0_numrows = 512;
1261 		he_dev->tx_numrows = 1018;
1262 		he_dev->r1_numrows = 512;
1263 		he_dev->r0_startrow = 6;
1264 		he_dev->tx_startrow = 518;
1265 		he_dev->r1_startrow = 1536;
1266 	}
1267 
1268 	he_dev->cells_per_lbuf = 4;
1269 	he_dev->buffer_limit = 4;
1270 	he_dev->r0_numbuffs = he_dev->r0_numrows *
1271 				he_dev->cells_per_row / he_dev->cells_per_lbuf;
1272 	if (he_dev->r0_numbuffs > 2560)
1273 		he_dev->r0_numbuffs = 2560;
1274 
1275 	he_dev->r1_numbuffs = he_dev->r1_numrows *
1276 				he_dev->cells_per_row / he_dev->cells_per_lbuf;
1277 	if (he_dev->r1_numbuffs > 2560)
1278 		he_dev->r1_numbuffs = 2560;
1279 
1280 	he_dev->tx_numbuffs = he_dev->tx_numrows *
1281 				he_dev->cells_per_row / he_dev->cells_per_lbuf;
1282 	if (he_dev->tx_numbuffs > 5120)
1283 		he_dev->tx_numbuffs = 5120;
1284 
1285 	/* 5.1.2 configure hardware dependent registers */
1286 
1287 	he_writel(he_dev,
1288 		SLICE_X(0x2) | ARB_RNUM_MAX(0xf) | TH_PRTY(0x3) |
1289 		RH_PRTY(0x3) | TL_PRTY(0x2) | RL_PRTY(0x1) |
1290 		(he_is622(he_dev) ? BUS_MULTI(0x28) : BUS_MULTI(0x46)) |
1291 		(he_is622(he_dev) ? NET_PREF(0x50) : NET_PREF(0x8c)),
1292 								LBARB);
1293 
1294 	he_writel(he_dev, BANK_ON |
1295 		(he_is622(he_dev) ? (REF_RATE(0x384) | WIDE_DATA) : REF_RATE(0x150)),
1296 								SDRAMCON);
1297 
1298 	he_writel(he_dev,
1299 		(he_is622(he_dev) ? RM_BANK_WAIT(1) : RM_BANK_WAIT(0)) |
1300 						RM_RW_WAIT(1), RCMCONFIG);
1301 	he_writel(he_dev,
1302 		(he_is622(he_dev) ? TM_BANK_WAIT(2) : TM_BANK_WAIT(1)) |
1303 						TM_RW_WAIT(1), TCMCONFIG);
1304 
1305 	he_writel(he_dev, he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD, LB_CONFIG);
1306 
1307 	he_writel(he_dev,
1308 		(he_is622(he_dev) ? UT_RD_DELAY(8) : UT_RD_DELAY(0)) |
1309 		(he_is622(he_dev) ? RC_UT_MODE(0) : RC_UT_MODE(1)) |
1310 		RX_VALVP(he_dev->vpibits) |
1311 		RX_VALVC(he_dev->vcibits),			 RC_CONFIG);
1312 
1313 	he_writel(he_dev, DRF_THRESH(0x20) |
1314 		(he_is622(he_dev) ? TX_UT_MODE(0) : TX_UT_MODE(1)) |
1315 		TX_VCI_MASK(he_dev->vcibits) |
1316 		LBFREE_CNT(he_dev->tx_numbuffs), 		TX_CONFIG);
1317 
1318 	he_writel(he_dev, 0x0, TXAAL5_PROTO);
1319 
1320 	he_writel(he_dev, PHY_INT_ENB |
1321 		(he_is622(he_dev) ? PTMR_PRE(67 - 1) : PTMR_PRE(50 - 1)),
1322 								RH_CONFIG);
1323 
1324 	/* 5.1.3 initialize connection memory */
1325 
1326 	for (i = 0; i < TCM_MEM_SIZE; ++i)
1327 		he_writel_tcm(he_dev, 0, i);
1328 
1329 	for (i = 0; i < RCM_MEM_SIZE; ++i)
1330 		he_writel_rcm(he_dev, 0, i);
1331 
1332 	/*
1333 	 *	transmit connection memory map
1334 	 *
1335 	 *                  tx memory
1336 	 *          0x0 ___________________
1337 	 *             |                   |
1338 	 *             |                   |
1339 	 *             |       TSRa        |
1340 	 *             |                   |
1341 	 *             |                   |
1342 	 *       0x8000|___________________|
1343 	 *             |                   |
1344 	 *             |       TSRb        |
1345 	 *       0xc000|___________________|
1346 	 *             |                   |
1347 	 *             |       TSRc        |
1348 	 *       0xe000|___________________|
1349 	 *             |       TSRd        |
1350 	 *       0xf000|___________________|
1351 	 *             |       tmABR       |
1352 	 *      0x10000|___________________|
1353 	 *             |                   |
1354 	 *             |       tmTPD       |
1355 	 *             |___________________|
1356 	 *             |                   |
1357 	 *                      ....
1358 	 *      0x1ffff|___________________|
1359 	 *
1360 	 *
1361 	 */
1362 
1363 	he_writel(he_dev, CONFIG_TSRB, TSRB_BA);
1364 	he_writel(he_dev, CONFIG_TSRC, TSRC_BA);
1365 	he_writel(he_dev, CONFIG_TSRD, TSRD_BA);
1366 	he_writel(he_dev, CONFIG_TMABR, TMABR_BA);
1367 	he_writel(he_dev, CONFIG_TPDBA, TPD_BA);
1368 
1369 
1370 	/*
1371 	 *	receive connection memory map
1372 	 *
1373 	 *          0x0 ___________________
1374 	 *             |                   |
1375 	 *             |                   |
1376 	 *             |       RSRa        |
1377 	 *             |                   |
1378 	 *             |                   |
1379 	 *       0x8000|___________________|
1380 	 *             |                   |
1381 	 *             |             rx0/1 |
1382 	 *             |       LBM         |   link lists of local
1383 	 *             |             tx    |   buffer memory
1384 	 *             |                   |
1385 	 *       0xd000|___________________|
1386 	 *             |                   |
1387 	 *             |      rmABR        |
1388 	 *       0xe000|___________________|
1389 	 *             |                   |
1390 	 *             |       RSRb        |
1391 	 *             |___________________|
1392 	 *             |                   |
1393 	 *                      ....
1394 	 *       0xffff|___________________|
1395 	 */
1396 
1397 	he_writel(he_dev, 0x08000, RCMLBM_BA);
1398 	he_writel(he_dev, 0x0e000, RCMRSRB_BA);
1399 	he_writel(he_dev, 0x0d800, RCMABR_BA);
1400 
1401 	/* 5.1.4 initialize local buffer free pools linked lists */
1402 
1403 	he_init_rx_lbfp0(he_dev);
1404 	he_init_rx_lbfp1(he_dev);
1405 
1406 	he_writel(he_dev, 0x0, RLBC_H);
1407 	he_writel(he_dev, 0x0, RLBC_T);
1408 	he_writel(he_dev, 0x0, RLBC_H2);
1409 
1410 	he_writel(he_dev, 512, RXTHRSH);	/* 10% of r0+r1 buffers */
1411 	he_writel(he_dev, 256, LITHRSH); 	/* 5% of r0+r1 buffers */
1412 
1413 	he_init_tx_lbfp(he_dev);
1414 
1415 	he_writel(he_dev, he_is622(he_dev) ? 0x104780 : 0x800, UBUFF_BA);
1416 
1417 	/* 5.1.5 initialize intermediate receive queues */
1418 
1419 	if (he_is622(he_dev)) {
1420 		he_writel(he_dev, 0x000f, G0_INMQ_S);
1421 		he_writel(he_dev, 0x200f, G0_INMQ_L);
1422 
1423 		he_writel(he_dev, 0x001f, G1_INMQ_S);
1424 		he_writel(he_dev, 0x201f, G1_INMQ_L);
1425 
1426 		he_writel(he_dev, 0x002f, G2_INMQ_S);
1427 		he_writel(he_dev, 0x202f, G2_INMQ_L);
1428 
1429 		he_writel(he_dev, 0x003f, G3_INMQ_S);
1430 		he_writel(he_dev, 0x203f, G3_INMQ_L);
1431 
1432 		he_writel(he_dev, 0x004f, G4_INMQ_S);
1433 		he_writel(he_dev, 0x204f, G4_INMQ_L);
1434 
1435 		he_writel(he_dev, 0x005f, G5_INMQ_S);
1436 		he_writel(he_dev, 0x205f, G5_INMQ_L);
1437 
1438 		he_writel(he_dev, 0x006f, G6_INMQ_S);
1439 		he_writel(he_dev, 0x206f, G6_INMQ_L);
1440 
1441 		he_writel(he_dev, 0x007f, G7_INMQ_S);
1442 		he_writel(he_dev, 0x207f, G7_INMQ_L);
1443 	} else {
1444 		he_writel(he_dev, 0x0000, G0_INMQ_S);
1445 		he_writel(he_dev, 0x0008, G0_INMQ_L);
1446 
1447 		he_writel(he_dev, 0x0001, G1_INMQ_S);
1448 		he_writel(he_dev, 0x0009, G1_INMQ_L);
1449 
1450 		he_writel(he_dev, 0x0002, G2_INMQ_S);
1451 		he_writel(he_dev, 0x000a, G2_INMQ_L);
1452 
1453 		he_writel(he_dev, 0x0003, G3_INMQ_S);
1454 		he_writel(he_dev, 0x000b, G3_INMQ_L);
1455 
1456 		he_writel(he_dev, 0x0004, G4_INMQ_S);
1457 		he_writel(he_dev, 0x000c, G4_INMQ_L);
1458 
1459 		he_writel(he_dev, 0x0005, G5_INMQ_S);
1460 		he_writel(he_dev, 0x000d, G5_INMQ_L);
1461 
1462 		he_writel(he_dev, 0x0006, G6_INMQ_S);
1463 		he_writel(he_dev, 0x000e, G6_INMQ_L);
1464 
1465 		he_writel(he_dev, 0x0007, G7_INMQ_S);
1466 		he_writel(he_dev, 0x000f, G7_INMQ_L);
1467 	}
1468 
1469 	/* 5.1.6 application tunable parameters */
1470 
1471 	he_writel(he_dev, 0x0, MCC);
1472 	he_writel(he_dev, 0x0, OEC);
1473 	he_writel(he_dev, 0x0, DCC);
1474 	he_writel(he_dev, 0x0, CEC);
1475 
1476 	/* 5.1.7 cs block initialization */
1477 
1478 	he_init_cs_block(he_dev);
1479 
1480 	/* 5.1.8 cs block connection memory initialization */
1481 
1482 	if (he_init_cs_block_rcm(he_dev) < 0)
1483 		return -ENOMEM;
1484 
1485 	/* 5.1.10 initialize host structures */
1486 
1487 	he_init_tpdrq(he_dev);
1488 
1489 #ifdef USE_TPD_POOL
1490 	he_dev->tpd_pool = pci_pool_create("tpd", he_dev->pci_dev,
1491 		sizeof(struct he_tpd), TPD_ALIGNMENT, 0);
1492 	if (he_dev->tpd_pool == NULL) {
1493 		hprintk("unable to create tpd pci_pool\n");
1494 		return -ENOMEM;
1495 	}
1496 
1497 	INIT_LIST_HEAD(&he_dev->outstanding_tpds);
1498 #else
1499 	he_dev->tpd_base = (void *) pci_alloc_consistent(he_dev->pci_dev,
1500 			CONFIG_NUMTPDS * sizeof(struct he_tpd), &he_dev->tpd_base_phys);
1501 	if (!he_dev->tpd_base)
1502 		return -ENOMEM;
1503 
1504 	for (i = 0; i < CONFIG_NUMTPDS; ++i) {
1505 		he_dev->tpd_base[i].status = (i << TPD_ADDR_SHIFT);
1506 		he_dev->tpd_base[i].inuse = 0;
1507 	}
1508 
1509 	he_dev->tpd_head = he_dev->tpd_base;
1510 	he_dev->tpd_end = &he_dev->tpd_base[CONFIG_NUMTPDS - 1];
1511 #endif
1512 
1513 	if (he_init_group(he_dev, 0) != 0)
1514 		return -ENOMEM;
1515 
1516 	for (group = 1; group < HE_NUM_GROUPS; ++group) {
1517 		he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32));
1518 		he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32));
1519 		he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32));
1520 		he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
1521 						G0_RBPS_BS + (group * 32));
1522 
1523 		he_writel(he_dev, 0x0, G0_RBPL_S + (group * 32));
1524 		he_writel(he_dev, 0x0, G0_RBPL_T + (group * 32));
1525 		he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
1526 						G0_RBPL_QI + (group * 32));
1527 		he_writel(he_dev, 0x0, G0_RBPL_BS + (group * 32));
1528 
1529 		he_writel(he_dev, 0x0, G0_RBRQ_ST + (group * 16));
1530 		he_writel(he_dev, 0x0, G0_RBRQ_H + (group * 16));
1531 		he_writel(he_dev, RBRQ_THRESH(0x1) | RBRQ_SIZE(0x0),
1532 						G0_RBRQ_Q + (group * 16));
1533 		he_writel(he_dev, 0x0, G0_RBRQ_I + (group * 16));
1534 
1535 		he_writel(he_dev, 0x0, G0_TBRQ_B_T + (group * 16));
1536 		he_writel(he_dev, 0x0, G0_TBRQ_H + (group * 16));
1537 		he_writel(he_dev, TBRQ_THRESH(0x1),
1538 						G0_TBRQ_THRESH + (group * 16));
1539 		he_writel(he_dev, 0x0, G0_TBRQ_S + (group * 16));
1540 	}
1541 
1542 	/* host status page */
1543 
1544 	he_dev->hsp = pci_alloc_consistent(he_dev->pci_dev,
1545 				sizeof(struct he_hsp), &he_dev->hsp_phys);
1546 	if (he_dev->hsp == NULL) {
1547 		hprintk("failed to allocate host status page\n");
1548 		return -ENOMEM;
1549 	}
1550 	memset(he_dev->hsp, 0, sizeof(struct he_hsp));
1551 	he_writel(he_dev, he_dev->hsp_phys, HSP_BA);
1552 
1553 	/* initialize framer */
1554 
1555 #ifdef CONFIG_ATM_HE_USE_SUNI
1556 	suni_init(he_dev->atm_dev);
1557 	if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start)
1558 		he_dev->atm_dev->phy->start(he_dev->atm_dev);
1559 #endif /* CONFIG_ATM_HE_USE_SUNI */
1560 
1561 	if (sdh) {
1562 		/* this really should be in suni.c but for now... */
1563 		int val;
1564 
1565 		val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM);
1566 		val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT);
1567 		he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM);
1568 	}
1569 
1570 	/* 5.1.12 enable transmit and receive */
1571 
1572 	reg = he_readl_mbox(he_dev, CS_ERCTL0);
1573 	reg |= TX_ENABLE|ER_ENABLE;
1574 	he_writel_mbox(he_dev, reg, CS_ERCTL0);
1575 
1576 	reg = he_readl(he_dev, RC_CONFIG);
1577 	reg |= RX_ENABLE;
1578 	he_writel(he_dev, reg, RC_CONFIG);
1579 
1580 	for (i = 0; i < HE_NUM_CS_STPER; ++i) {
1581 		he_dev->cs_stper[i].inuse = 0;
1582 		he_dev->cs_stper[i].pcr = -1;
1583 	}
1584 	he_dev->total_bw = 0;
1585 
1586 
1587 	/* atm linux initialization */
1588 
1589 	he_dev->atm_dev->ci_range.vpi_bits = he_dev->vpibits;
1590 	he_dev->atm_dev->ci_range.vci_bits = he_dev->vcibits;
1591 
1592 	he_dev->irq_peak = 0;
1593 	he_dev->rbrq_peak = 0;
1594 	he_dev->rbpl_peak = 0;
1595 	he_dev->tbrq_peak = 0;
1596 
1597 	HPRINTK("hell bent for leather!\n");
1598 
1599 	return 0;
1600 }
1601 
1602 static void
1603 he_stop(struct he_dev *he_dev)
1604 {
1605 	u16 command;
1606 	u32 gen_cntl_0, reg;
1607 	struct pci_dev *pci_dev;
1608 
1609 	pci_dev = he_dev->pci_dev;
1610 
1611 	/* disable interrupts */
1612 
1613 	if (he_dev->membase) {
1614 		pci_read_config_dword(pci_dev, GEN_CNTL_0, &gen_cntl_0);
1615 		gen_cntl_0 &= ~(INT_PROC_ENBL | INIT_ENB);
1616 		pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1617 
1618 #ifdef USE_TASKLET
1619 		tasklet_disable(&he_dev->tasklet);
1620 #endif
1621 
1622 		/* disable recv and transmit */
1623 
1624 		reg = he_readl_mbox(he_dev, CS_ERCTL0);
1625 		reg &= ~(TX_ENABLE|ER_ENABLE);
1626 		he_writel_mbox(he_dev, reg, CS_ERCTL0);
1627 
1628 		reg = he_readl(he_dev, RC_CONFIG);
1629 		reg &= ~(RX_ENABLE);
1630 		he_writel(he_dev, reg, RC_CONFIG);
1631 	}
1632 
1633 #ifdef CONFIG_ATM_HE_USE_SUNI
1634 	if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->stop)
1635 		he_dev->atm_dev->phy->stop(he_dev->atm_dev);
1636 #endif /* CONFIG_ATM_HE_USE_SUNI */
1637 
1638 	if (he_dev->irq)
1639 		free_irq(he_dev->irq, he_dev);
1640 
1641 	if (he_dev->irq_base)
1642 		pci_free_consistent(he_dev->pci_dev, (CONFIG_IRQ_SIZE+1)
1643 			* sizeof(struct he_irq), he_dev->irq_base, he_dev->irq_phys);
1644 
1645 	if (he_dev->hsp)
1646 		pci_free_consistent(he_dev->pci_dev, sizeof(struct he_hsp),
1647 						he_dev->hsp, he_dev->hsp_phys);
1648 
1649 	if (he_dev->rbpl_base) {
1650 #ifdef USE_RBPL_POOL
1651 		for (i = 0; i < CONFIG_RBPL_SIZE; ++i) {
1652 			void *cpuaddr = he_dev->rbpl_virt[i].virt;
1653 			dma_addr_t dma_handle = he_dev->rbpl_base[i].phys;
1654 
1655 			pci_pool_free(he_dev->rbpl_pool, cpuaddr, dma_handle);
1656 		}
1657 #else
1658 		pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
1659 			* CONFIG_RBPL_BUFSIZE, he_dev->rbpl_pages, he_dev->rbpl_pages_phys);
1660 #endif
1661 		pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
1662 			* sizeof(struct he_rbp), he_dev->rbpl_base, he_dev->rbpl_phys);
1663 	}
1664 
1665 #ifdef USE_RBPL_POOL
1666 	if (he_dev->rbpl_pool)
1667 		pci_pool_destroy(he_dev->rbpl_pool);
1668 #endif
1669 
1670 #ifdef USE_RBPS
1671 	if (he_dev->rbps_base) {
1672 #ifdef USE_RBPS_POOL
1673 		for (i = 0; i < CONFIG_RBPS_SIZE; ++i) {
1674 			void *cpuaddr = he_dev->rbps_virt[i].virt;
1675 			dma_addr_t dma_handle = he_dev->rbps_base[i].phys;
1676 
1677 			pci_pool_free(he_dev->rbps_pool, cpuaddr, dma_handle);
1678 		}
1679 #else
1680 		pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
1681 			* CONFIG_RBPS_BUFSIZE, he_dev->rbps_pages, he_dev->rbps_pages_phys);
1682 #endif
1683 		pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
1684 			* sizeof(struct he_rbp), he_dev->rbps_base, he_dev->rbps_phys);
1685 	}
1686 
1687 #ifdef USE_RBPS_POOL
1688 	if (he_dev->rbps_pool)
1689 		pci_pool_destroy(he_dev->rbps_pool);
1690 #endif
1691 
1692 #endif /* USE_RBPS */
1693 
1694 	if (he_dev->rbrq_base)
1695 		pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq),
1696 							he_dev->rbrq_base, he_dev->rbrq_phys);
1697 
1698 	if (he_dev->tbrq_base)
1699 		pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
1700 							he_dev->tbrq_base, he_dev->tbrq_phys);
1701 
1702 	if (he_dev->tpdrq_base)
1703 		pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
1704 							he_dev->tpdrq_base, he_dev->tpdrq_phys);
1705 
1706 #ifdef USE_TPD_POOL
1707 	if (he_dev->tpd_pool)
1708 		pci_pool_destroy(he_dev->tpd_pool);
1709 #else
1710 	if (he_dev->tpd_base)
1711 		pci_free_consistent(he_dev->pci_dev, CONFIG_NUMTPDS * sizeof(struct he_tpd),
1712 							he_dev->tpd_base, he_dev->tpd_base_phys);
1713 #endif
1714 
1715 	if (he_dev->pci_dev) {
1716 		pci_read_config_word(he_dev->pci_dev, PCI_COMMAND, &command);
1717 		command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
1718 		pci_write_config_word(he_dev->pci_dev, PCI_COMMAND, command);
1719 	}
1720 
1721 	if (he_dev->membase)
1722 		iounmap(he_dev->membase);
1723 }
1724 
1725 static struct he_tpd *
1726 __alloc_tpd(struct he_dev *he_dev)
1727 {
1728 #ifdef USE_TPD_POOL
1729 	struct he_tpd *tpd;
1730 	dma_addr_t dma_handle;
1731 
1732 	tpd = pci_pool_alloc(he_dev->tpd_pool, SLAB_ATOMIC|SLAB_DMA, &dma_handle);
1733 	if (tpd == NULL)
1734 		return NULL;
1735 
1736 	tpd->status = TPD_ADDR(dma_handle);
1737 	tpd->reserved = 0;
1738 	tpd->iovec[0].addr = 0; tpd->iovec[0].len = 0;
1739 	tpd->iovec[1].addr = 0; tpd->iovec[1].len = 0;
1740 	tpd->iovec[2].addr = 0; tpd->iovec[2].len = 0;
1741 
1742 	return tpd;
1743 #else
1744 	int i;
1745 
1746 	for (i = 0; i < CONFIG_NUMTPDS; ++i) {
1747 		++he_dev->tpd_head;
1748 		if (he_dev->tpd_head > he_dev->tpd_end) {
1749 			he_dev->tpd_head = he_dev->tpd_base;
1750 		}
1751 
1752 		if (!he_dev->tpd_head->inuse) {
1753 			he_dev->tpd_head->inuse = 1;
1754 			he_dev->tpd_head->status &= TPD_MASK;
1755 			he_dev->tpd_head->iovec[0].addr = 0; he_dev->tpd_head->iovec[0].len = 0;
1756 			he_dev->tpd_head->iovec[1].addr = 0; he_dev->tpd_head->iovec[1].len = 0;
1757 			he_dev->tpd_head->iovec[2].addr = 0; he_dev->tpd_head->iovec[2].len = 0;
1758 			return he_dev->tpd_head;
1759 		}
1760 	}
1761 	hprintk("out of tpds -- increase CONFIG_NUMTPDS (%d)\n", CONFIG_NUMTPDS);
1762 	return NULL;
1763 #endif
1764 }
1765 
1766 #define AAL5_LEN(buf,len) 						\
1767 			((((unsigned char *)(buf))[(len)-6] << 8) |	\
1768 				(((unsigned char *)(buf))[(len)-5]))
1769 
1770 /* 2.10.1.2 receive
1771  *
1772  * aal5 packets can optionally return the tcp checksum in the lower
1773  * 16 bits of the crc (RSR0_TCP_CKSUM)
1774  */
1775 
1776 #define TCP_CKSUM(buf,len) 						\
1777 			((((unsigned char *)(buf))[(len)-2] << 8) |	\
1778 				(((unsigned char *)(buf))[(len-1)]))
1779 
1780 static int
1781 he_service_rbrq(struct he_dev *he_dev, int group)
1782 {
1783 	struct he_rbrq *rbrq_tail = (struct he_rbrq *)
1784 				((unsigned long)he_dev->rbrq_base |
1785 					he_dev->hsp->group[group].rbrq_tail);
1786 	struct he_rbp *rbp = NULL;
1787 	unsigned cid, lastcid = -1;
1788 	unsigned buf_len = 0;
1789 	struct sk_buff *skb;
1790 	struct atm_vcc *vcc = NULL;
1791 	struct he_vcc *he_vcc;
1792 	struct he_iovec *iov;
1793 	int pdus_assembled = 0;
1794 	int updated = 0;
1795 
1796 	read_lock(&vcc_sklist_lock);
1797 	while (he_dev->rbrq_head != rbrq_tail) {
1798 		++updated;
1799 
1800 		HPRINTK("%p rbrq%d 0x%x len=%d cid=0x%x %s%s%s%s%s%s\n",
1801 			he_dev->rbrq_head, group,
1802 			RBRQ_ADDR(he_dev->rbrq_head),
1803 			RBRQ_BUFLEN(he_dev->rbrq_head),
1804 			RBRQ_CID(he_dev->rbrq_head),
1805 			RBRQ_CRC_ERR(he_dev->rbrq_head) ? " CRC_ERR" : "",
1806 			RBRQ_LEN_ERR(he_dev->rbrq_head) ? " LEN_ERR" : "",
1807 			RBRQ_END_PDU(he_dev->rbrq_head) ? " END_PDU" : "",
1808 			RBRQ_AAL5_PROT(he_dev->rbrq_head) ? " AAL5_PROT" : "",
1809 			RBRQ_CON_CLOSED(he_dev->rbrq_head) ? " CON_CLOSED" : "",
1810 			RBRQ_HBUF_ERR(he_dev->rbrq_head) ? " HBUF_ERR" : "");
1811 
1812 #ifdef USE_RBPS
1813 		if (RBRQ_ADDR(he_dev->rbrq_head) & RBP_SMALLBUF)
1814 			rbp = &he_dev->rbps_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
1815 		else
1816 #endif
1817 			rbp = &he_dev->rbpl_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
1818 
1819 		buf_len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4;
1820 		cid = RBRQ_CID(he_dev->rbrq_head);
1821 
1822 		if (cid != lastcid)
1823 			vcc = __find_vcc(he_dev, cid);
1824 		lastcid = cid;
1825 
1826 		if (vcc == NULL) {
1827 			hprintk("vcc == NULL  (cid 0x%x)\n", cid);
1828 			if (!RBRQ_HBUF_ERR(he_dev->rbrq_head))
1829 					rbp->status &= ~RBP_LOANED;
1830 
1831 			goto next_rbrq_entry;
1832 		}
1833 
1834 		he_vcc = HE_VCC(vcc);
1835 		if (he_vcc == NULL) {
1836 			hprintk("he_vcc == NULL  (cid 0x%x)\n", cid);
1837 			if (!RBRQ_HBUF_ERR(he_dev->rbrq_head))
1838 					rbp->status &= ~RBP_LOANED;
1839 			goto next_rbrq_entry;
1840 		}
1841 
1842 		if (RBRQ_HBUF_ERR(he_dev->rbrq_head)) {
1843 			hprintk("HBUF_ERR!  (cid 0x%x)\n", cid);
1844 				atomic_inc(&vcc->stats->rx_drop);
1845 			goto return_host_buffers;
1846 		}
1847 
1848 		he_vcc->iov_tail->iov_base = RBRQ_ADDR(he_dev->rbrq_head);
1849 		he_vcc->iov_tail->iov_len = buf_len;
1850 		he_vcc->pdu_len += buf_len;
1851 		++he_vcc->iov_tail;
1852 
1853 		if (RBRQ_CON_CLOSED(he_dev->rbrq_head)) {
1854 			lastcid = -1;
1855 			HPRINTK("wake_up rx_waitq  (cid 0x%x)\n", cid);
1856 			wake_up(&he_vcc->rx_waitq);
1857 			goto return_host_buffers;
1858 		}
1859 
1860 #ifdef notdef
1861 		if ((he_vcc->iov_tail - he_vcc->iov_head) > HE_MAXIOV) {
1862 			hprintk("iovec full!  cid 0x%x\n", cid);
1863 			goto return_host_buffers;
1864 		}
1865 #endif
1866 		if (!RBRQ_END_PDU(he_dev->rbrq_head))
1867 			goto next_rbrq_entry;
1868 
1869 		if (RBRQ_LEN_ERR(he_dev->rbrq_head)
1870 				|| RBRQ_CRC_ERR(he_dev->rbrq_head)) {
1871 			HPRINTK("%s%s (%d.%d)\n",
1872 				RBRQ_CRC_ERR(he_dev->rbrq_head)
1873 							? "CRC_ERR " : "",
1874 				RBRQ_LEN_ERR(he_dev->rbrq_head)
1875 							? "LEN_ERR" : "",
1876 							vcc->vpi, vcc->vci);
1877 			atomic_inc(&vcc->stats->rx_err);
1878 			goto return_host_buffers;
1879 		}
1880 
1881 		skb = atm_alloc_charge(vcc, he_vcc->pdu_len + rx_skb_reserve,
1882 							GFP_ATOMIC);
1883 		if (!skb) {
1884 			HPRINTK("charge failed (%d.%d)\n", vcc->vpi, vcc->vci);
1885 			goto return_host_buffers;
1886 		}
1887 
1888 		if (rx_skb_reserve > 0)
1889 			skb_reserve(skb, rx_skb_reserve);
1890 
1891 		do_gettimeofday(&skb->stamp);
1892 
1893 		for (iov = he_vcc->iov_head;
1894 				iov < he_vcc->iov_tail; ++iov) {
1895 #ifdef USE_RBPS
1896 			if (iov->iov_base & RBP_SMALLBUF)
1897 				memcpy(skb_put(skb, iov->iov_len),
1898 					he_dev->rbps_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
1899 			else
1900 #endif
1901 				memcpy(skb_put(skb, iov->iov_len),
1902 					he_dev->rbpl_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
1903 		}
1904 
1905 		switch (vcc->qos.aal) {
1906 			case ATM_AAL0:
1907 				/* 2.10.1.5 raw cell receive */
1908 				skb->len = ATM_AAL0_SDU;
1909 				skb->tail = skb->data + skb->len;
1910 				break;
1911 			case ATM_AAL5:
1912 				/* 2.10.1.2 aal5 receive */
1913 
1914 				skb->len = AAL5_LEN(skb->data, he_vcc->pdu_len);
1915 				skb->tail = skb->data + skb->len;
1916 #ifdef USE_CHECKSUM_HW
1917 				if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) {
1918 					skb->ip_summed = CHECKSUM_HW;
1919 					skb->csum = TCP_CKSUM(skb->data,
1920 							he_vcc->pdu_len);
1921 				}
1922 #endif
1923 				break;
1924 		}
1925 
1926 #ifdef should_never_happen
1927 		if (skb->len > vcc->qos.rxtp.max_sdu)
1928 			hprintk("pdu_len (%d) > vcc->qos.rxtp.max_sdu (%d)!  cid 0x%x\n", skb->len, vcc->qos.rxtp.max_sdu, cid);
1929 #endif
1930 
1931 #ifdef notdef
1932 		ATM_SKB(skb)->vcc = vcc;
1933 #endif
1934 		vcc->push(vcc, skb);
1935 
1936 		atomic_inc(&vcc->stats->rx);
1937 
1938 return_host_buffers:
1939 		++pdus_assembled;
1940 
1941 		for (iov = he_vcc->iov_head;
1942 				iov < he_vcc->iov_tail; ++iov) {
1943 #ifdef USE_RBPS
1944 			if (iov->iov_base & RBP_SMALLBUF)
1945 				rbp = &he_dev->rbps_base[RBP_INDEX(iov->iov_base)];
1946 			else
1947 #endif
1948 				rbp = &he_dev->rbpl_base[RBP_INDEX(iov->iov_base)];
1949 
1950 			rbp->status &= ~RBP_LOANED;
1951 		}
1952 
1953 		he_vcc->iov_tail = he_vcc->iov_head;
1954 		he_vcc->pdu_len = 0;
1955 
1956 next_rbrq_entry:
1957 		he_dev->rbrq_head = (struct he_rbrq *)
1958 				((unsigned long) he_dev->rbrq_base |
1959 					RBRQ_MASK(++he_dev->rbrq_head));
1960 
1961 	}
1962 	read_unlock(&vcc_sklist_lock);
1963 
1964 	if (updated) {
1965 		if (updated > he_dev->rbrq_peak)
1966 			he_dev->rbrq_peak = updated;
1967 
1968 		he_writel(he_dev, RBRQ_MASK(he_dev->rbrq_head),
1969 						G0_RBRQ_H + (group * 16));
1970 	}
1971 
1972 	return pdus_assembled;
1973 }
1974 
1975 static void
1976 he_service_tbrq(struct he_dev *he_dev, int group)
1977 {
1978 	struct he_tbrq *tbrq_tail = (struct he_tbrq *)
1979 				((unsigned long)he_dev->tbrq_base |
1980 					he_dev->hsp->group[group].tbrq_tail);
1981 	struct he_tpd *tpd;
1982 	int slot, updated = 0;
1983 #ifdef USE_TPD_POOL
1984 	struct he_tpd *__tpd;
1985 #endif
1986 
1987 	/* 2.1.6 transmit buffer return queue */
1988 
1989 	while (he_dev->tbrq_head != tbrq_tail) {
1990 		++updated;
1991 
1992 		HPRINTK("tbrq%d 0x%x%s%s\n",
1993 			group,
1994 			TBRQ_TPD(he_dev->tbrq_head),
1995 			TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "",
1996 			TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : "");
1997 #ifdef USE_TPD_POOL
1998 		tpd = NULL;
1999 		list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) {
2000 			if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) {
2001 				tpd = __tpd;
2002 				list_del(&__tpd->entry);
2003 				break;
2004 			}
2005 		}
2006 
2007 		if (tpd == NULL) {
2008 			hprintk("unable to locate tpd for dma buffer %x\n",
2009 						TBRQ_TPD(he_dev->tbrq_head));
2010 			goto next_tbrq_entry;
2011 		}
2012 #else
2013 		tpd = &he_dev->tpd_base[ TPD_INDEX(TBRQ_TPD(he_dev->tbrq_head)) ];
2014 #endif
2015 
2016 		if (TBRQ_EOS(he_dev->tbrq_head)) {
2017 			HPRINTK("wake_up(tx_waitq) cid 0x%x\n",
2018 				he_mkcid(he_dev, tpd->vcc->vpi, tpd->vcc->vci));
2019 			if (tpd->vcc)
2020 				wake_up(&HE_VCC(tpd->vcc)->tx_waitq);
2021 
2022 			goto next_tbrq_entry;
2023 		}
2024 
2025 		for (slot = 0; slot < TPD_MAXIOV; ++slot) {
2026 			if (tpd->iovec[slot].addr)
2027 				pci_unmap_single(he_dev->pci_dev,
2028 					tpd->iovec[slot].addr,
2029 					tpd->iovec[slot].len & TPD_LEN_MASK,
2030 							PCI_DMA_TODEVICE);
2031 			if (tpd->iovec[slot].len & TPD_LST)
2032 				break;
2033 
2034 		}
2035 
2036 		if (tpd->skb) {	/* && !TBRQ_MULTIPLE(he_dev->tbrq_head) */
2037 			if (tpd->vcc && tpd->vcc->pop)
2038 				tpd->vcc->pop(tpd->vcc, tpd->skb);
2039 			else
2040 				dev_kfree_skb_any(tpd->skb);
2041 		}
2042 
2043 next_tbrq_entry:
2044 #ifdef USE_TPD_POOL
2045 		if (tpd)
2046 			pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
2047 #else
2048 		tpd->inuse = 0;
2049 #endif
2050 		he_dev->tbrq_head = (struct he_tbrq *)
2051 				((unsigned long) he_dev->tbrq_base |
2052 					TBRQ_MASK(++he_dev->tbrq_head));
2053 	}
2054 
2055 	if (updated) {
2056 		if (updated > he_dev->tbrq_peak)
2057 			he_dev->tbrq_peak = updated;
2058 
2059 		he_writel(he_dev, TBRQ_MASK(he_dev->tbrq_head),
2060 						G0_TBRQ_H + (group * 16));
2061 	}
2062 }
2063 
2064 
2065 static void
2066 he_service_rbpl(struct he_dev *he_dev, int group)
2067 {
2068 	struct he_rbp *newtail;
2069 	struct he_rbp *rbpl_head;
2070 	int moved = 0;
2071 
2072 	rbpl_head = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base |
2073 					RBPL_MASK(he_readl(he_dev, G0_RBPL_S)));
2074 
2075 	for (;;) {
2076 		newtail = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base |
2077 						RBPL_MASK(he_dev->rbpl_tail+1));
2078 
2079 		/* table 3.42 -- rbpl_tail should never be set to rbpl_head */
2080 		if ((newtail == rbpl_head) || (newtail->status & RBP_LOANED))
2081 			break;
2082 
2083 		newtail->status |= RBP_LOANED;
2084 		he_dev->rbpl_tail = newtail;
2085 		++moved;
2086 	}
2087 
2088 	if (moved)
2089 		he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T);
2090 }
2091 
2092 #ifdef USE_RBPS
2093 static void
2094 he_service_rbps(struct he_dev *he_dev, int group)
2095 {
2096 	struct he_rbp *newtail;
2097 	struct he_rbp *rbps_head;
2098 	int moved = 0;
2099 
2100 	rbps_head = (struct he_rbp *) ((unsigned long)he_dev->rbps_base |
2101 					RBPS_MASK(he_readl(he_dev, G0_RBPS_S)));
2102 
2103 	for (;;) {
2104 		newtail = (struct he_rbp *) ((unsigned long)he_dev->rbps_base |
2105 						RBPS_MASK(he_dev->rbps_tail+1));
2106 
2107 		/* table 3.42 -- rbps_tail should never be set to rbps_head */
2108 		if ((newtail == rbps_head) || (newtail->status & RBP_LOANED))
2109 			break;
2110 
2111 		newtail->status |= RBP_LOANED;
2112 		he_dev->rbps_tail = newtail;
2113 		++moved;
2114 	}
2115 
2116 	if (moved)
2117 		he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T);
2118 }
2119 #endif /* USE_RBPS */
2120 
2121 static void
2122 he_tasklet(unsigned long data)
2123 {
2124 	unsigned long flags;
2125 	struct he_dev *he_dev = (struct he_dev *) data;
2126 	int group, type;
2127 	int updated = 0;
2128 
2129 	HPRINTK("tasklet (0x%lx)\n", data);
2130 #ifdef USE_TASKLET
2131 	spin_lock_irqsave(&he_dev->global_lock, flags);
2132 #endif
2133 
2134 	while (he_dev->irq_head != he_dev->irq_tail) {
2135 		++updated;
2136 
2137 		type = ITYPE_TYPE(he_dev->irq_head->isw);
2138 		group = ITYPE_GROUP(he_dev->irq_head->isw);
2139 
2140 		switch (type) {
2141 			case ITYPE_RBRQ_THRESH:
2142 				HPRINTK("rbrq%d threshold\n", group);
2143 				/* fall through */
2144 			case ITYPE_RBRQ_TIMER:
2145 				if (he_service_rbrq(he_dev, group)) {
2146 					he_service_rbpl(he_dev, group);
2147 #ifdef USE_RBPS
2148 					he_service_rbps(he_dev, group);
2149 #endif /* USE_RBPS */
2150 				}
2151 				break;
2152 			case ITYPE_TBRQ_THRESH:
2153 				HPRINTK("tbrq%d threshold\n", group);
2154 				/* fall through */
2155 			case ITYPE_TPD_COMPLETE:
2156 				he_service_tbrq(he_dev, group);
2157 				break;
2158 			case ITYPE_RBPL_THRESH:
2159 				he_service_rbpl(he_dev, group);
2160 				break;
2161 			case ITYPE_RBPS_THRESH:
2162 #ifdef USE_RBPS
2163 				he_service_rbps(he_dev, group);
2164 #endif /* USE_RBPS */
2165 				break;
2166 			case ITYPE_PHY:
2167 				HPRINTK("phy interrupt\n");
2168 #ifdef CONFIG_ATM_HE_USE_SUNI
2169 				spin_unlock_irqrestore(&he_dev->global_lock, flags);
2170 				if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->interrupt)
2171 					he_dev->atm_dev->phy->interrupt(he_dev->atm_dev);
2172 				spin_lock_irqsave(&he_dev->global_lock, flags);
2173 #endif
2174 				break;
2175 			case ITYPE_OTHER:
2176 				switch (type|group) {
2177 					case ITYPE_PARITY:
2178 						hprintk("parity error\n");
2179 						break;
2180 					case ITYPE_ABORT:
2181 						hprintk("abort 0x%x\n", he_readl(he_dev, ABORT_ADDR));
2182 						break;
2183 				}
2184 				break;
2185 			case ITYPE_TYPE(ITYPE_INVALID):
2186 				/* see 8.1.1 -- check all queues */
2187 
2188 				HPRINTK("isw not updated 0x%x\n", he_dev->irq_head->isw);
2189 
2190 				he_service_rbrq(he_dev, 0);
2191 				he_service_rbpl(he_dev, 0);
2192 #ifdef USE_RBPS
2193 				he_service_rbps(he_dev, 0);
2194 #endif /* USE_RBPS */
2195 				he_service_tbrq(he_dev, 0);
2196 				break;
2197 			default:
2198 				hprintk("bad isw 0x%x?\n", he_dev->irq_head->isw);
2199 		}
2200 
2201 		he_dev->irq_head->isw = ITYPE_INVALID;
2202 
2203 		he_dev->irq_head = (struct he_irq *) NEXT_ENTRY(he_dev->irq_base, he_dev->irq_head, IRQ_MASK);
2204 	}
2205 
2206 	if (updated) {
2207 		if (updated > he_dev->irq_peak)
2208 			he_dev->irq_peak = updated;
2209 
2210 		he_writel(he_dev,
2211 			IRQ_SIZE(CONFIG_IRQ_SIZE) |
2212 			IRQ_THRESH(CONFIG_IRQ_THRESH) |
2213 			IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD);
2214 		(void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */
2215 	}
2216 #ifdef USE_TASKLET
2217 	spin_unlock_irqrestore(&he_dev->global_lock, flags);
2218 #endif
2219 }
2220 
2221 static irqreturn_t
2222 he_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
2223 {
2224 	unsigned long flags;
2225 	struct he_dev *he_dev = (struct he_dev * )dev_id;
2226 	int handled = 0;
2227 
2228 	if (he_dev == NULL)
2229 		return IRQ_NONE;
2230 
2231 	spin_lock_irqsave(&he_dev->global_lock, flags);
2232 
2233 	he_dev->irq_tail = (struct he_irq *) (((unsigned long)he_dev->irq_base) |
2234 						(*he_dev->irq_tailoffset << 2));
2235 
2236 	if (he_dev->irq_tail == he_dev->irq_head) {
2237 		HPRINTK("tailoffset not updated?\n");
2238 		he_dev->irq_tail = (struct he_irq *) ((unsigned long)he_dev->irq_base |
2239 			((he_readl(he_dev, IRQ0_BASE) & IRQ_MASK) << 2));
2240 		(void) he_readl(he_dev, INT_FIFO);	/* 8.1.2 controller errata */
2241 	}
2242 
2243 #ifdef DEBUG
2244 	if (he_dev->irq_head == he_dev->irq_tail /* && !IRQ_PENDING */)
2245 		hprintk("spurious (or shared) interrupt?\n");
2246 #endif
2247 
2248 	if (he_dev->irq_head != he_dev->irq_tail) {
2249 		handled = 1;
2250 #ifdef USE_TASKLET
2251 		tasklet_schedule(&he_dev->tasklet);
2252 #else
2253 		he_tasklet((unsigned long) he_dev);
2254 #endif
2255 		he_writel(he_dev, INT_CLEAR_A, INT_FIFO);	/* clear interrupt */
2256 		(void) he_readl(he_dev, INT_FIFO);		/* flush posted writes */
2257 	}
2258 	spin_unlock_irqrestore(&he_dev->global_lock, flags);
2259 	return IRQ_RETVAL(handled);
2260 
2261 }
2262 
2263 static __inline__ void
2264 __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid)
2265 {
2266 	struct he_tpdrq *new_tail;
2267 
2268 	HPRINTK("tpdrq %p cid 0x%x -> tpdrq_tail %p\n",
2269 					tpd, cid, he_dev->tpdrq_tail);
2270 
2271 	/* new_tail = he_dev->tpdrq_tail; */
2272 	new_tail = (struct he_tpdrq *) ((unsigned long) he_dev->tpdrq_base |
2273 					TPDRQ_MASK(he_dev->tpdrq_tail+1));
2274 
2275 	/*
2276 	 * check to see if we are about to set the tail == head
2277 	 * if true, update the head pointer from the adapter
2278 	 * to see if this is really the case (reading the queue
2279 	 * head for every enqueue would be unnecessarily slow)
2280 	 */
2281 
2282 	if (new_tail == he_dev->tpdrq_head) {
2283 		he_dev->tpdrq_head = (struct he_tpdrq *)
2284 			(((unsigned long)he_dev->tpdrq_base) |
2285 				TPDRQ_MASK(he_readl(he_dev, TPDRQ_B_H)));
2286 
2287 		if (new_tail == he_dev->tpdrq_head) {
2288 			hprintk("tpdrq full (cid 0x%x)\n", cid);
2289 			/*
2290 			 * FIXME
2291 			 * push tpd onto a transmit backlog queue
2292 			 * after service_tbrq, service the backlog
2293 			 * for now, we just drop the pdu
2294 			 */
2295 			if (tpd->skb) {
2296 				if (tpd->vcc->pop)
2297 					tpd->vcc->pop(tpd->vcc, tpd->skb);
2298 				else
2299 					dev_kfree_skb_any(tpd->skb);
2300 				atomic_inc(&tpd->vcc->stats->tx_err);
2301 			}
2302 #ifdef USE_TPD_POOL
2303 			pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
2304 #else
2305 			tpd->inuse = 0;
2306 #endif
2307 			return;
2308 		}
2309 	}
2310 
2311 	/* 2.1.5 transmit packet descriptor ready queue */
2312 #ifdef USE_TPD_POOL
2313 	list_add_tail(&tpd->entry, &he_dev->outstanding_tpds);
2314 	he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status);
2315 #else
2316 	he_dev->tpdrq_tail->tpd = he_dev->tpd_base_phys +
2317 				(TPD_INDEX(tpd->status) * sizeof(struct he_tpd));
2318 #endif
2319 	he_dev->tpdrq_tail->cid = cid;
2320 	wmb();
2321 
2322 	he_dev->tpdrq_tail = new_tail;
2323 
2324 	he_writel(he_dev, TPDRQ_MASK(he_dev->tpdrq_tail), TPDRQ_T);
2325 	(void) he_readl(he_dev, TPDRQ_T);		/* flush posted writes */
2326 }
2327 
2328 static int
2329 he_open(struct atm_vcc *vcc)
2330 {
2331 	unsigned long flags;
2332 	struct he_dev *he_dev = HE_DEV(vcc->dev);
2333 	struct he_vcc *he_vcc;
2334 	int err = 0;
2335 	unsigned cid, rsr0, rsr1, rsr4, tsr0, tsr0_aal, tsr4, period, reg, clock;
2336 	short vpi = vcc->vpi;
2337 	int vci = vcc->vci;
2338 
2339 	if (vci == ATM_VCI_UNSPEC || vpi == ATM_VPI_UNSPEC)
2340 		return 0;
2341 
2342 	HPRINTK("open vcc %p %d.%d\n", vcc, vpi, vci);
2343 
2344 	set_bit(ATM_VF_ADDR, &vcc->flags);
2345 
2346 	cid = he_mkcid(he_dev, vpi, vci);
2347 
2348 	he_vcc = (struct he_vcc *) kmalloc(sizeof(struct he_vcc), GFP_ATOMIC);
2349 	if (he_vcc == NULL) {
2350 		hprintk("unable to allocate he_vcc during open\n");
2351 		return -ENOMEM;
2352 	}
2353 
2354 	he_vcc->iov_tail = he_vcc->iov_head;
2355 	he_vcc->pdu_len = 0;
2356 	he_vcc->rc_index = -1;
2357 
2358 	init_waitqueue_head(&he_vcc->rx_waitq);
2359 	init_waitqueue_head(&he_vcc->tx_waitq);
2360 
2361 	vcc->dev_data = he_vcc;
2362 
2363 	if (vcc->qos.txtp.traffic_class != ATM_NONE) {
2364 		int pcr_goal;
2365 
2366 		pcr_goal = atm_pcr_goal(&vcc->qos.txtp);
2367 		if (pcr_goal == 0)
2368 			pcr_goal = he_dev->atm_dev->link_rate;
2369 		if (pcr_goal < 0)	/* means round down, technically */
2370 			pcr_goal = -pcr_goal;
2371 
2372 		HPRINTK("open tx cid 0x%x pcr_goal %d\n", cid, pcr_goal);
2373 
2374 		switch (vcc->qos.aal) {
2375 			case ATM_AAL5:
2376 				tsr0_aal = TSR0_AAL5;
2377 				tsr4 = TSR4_AAL5;
2378 				break;
2379 			case ATM_AAL0:
2380 				tsr0_aal = TSR0_AAL0_SDU;
2381 				tsr4 = TSR4_AAL0_SDU;
2382 				break;
2383 			default:
2384 				err = -EINVAL;
2385 				goto open_failed;
2386 		}
2387 
2388 		spin_lock_irqsave(&he_dev->global_lock, flags);
2389 		tsr0 = he_readl_tsr0(he_dev, cid);
2390 		spin_unlock_irqrestore(&he_dev->global_lock, flags);
2391 
2392 		if (TSR0_CONN_STATE(tsr0) != 0) {
2393 			hprintk("cid 0x%x not idle (tsr0 = 0x%x)\n", cid, tsr0);
2394 			err = -EBUSY;
2395 			goto open_failed;
2396 		}
2397 
2398 		switch (vcc->qos.txtp.traffic_class) {
2399 			case ATM_UBR:
2400 				/* 2.3.3.1 open connection ubr */
2401 
2402 				tsr0 = TSR0_UBR | TSR0_GROUP(0) | tsr0_aal |
2403 					TSR0_USE_WMIN | TSR0_UPDATE_GER;
2404 				break;
2405 
2406 			case ATM_CBR:
2407 				/* 2.3.3.2 open connection cbr */
2408 
2409 				/* 8.2.3 cbr scheduler wrap problem -- limit to 90% total link rate */
2410 				if ((he_dev->total_bw + pcr_goal)
2411 					> (he_dev->atm_dev->link_rate * 9 / 10))
2412 				{
2413 					err = -EBUSY;
2414 					goto open_failed;
2415 				}
2416 
2417 				spin_lock_irqsave(&he_dev->global_lock, flags);			/* also protects he_dev->cs_stper[] */
2418 
2419 				/* find an unused cs_stper register */
2420 				for (reg = 0; reg < HE_NUM_CS_STPER; ++reg)
2421 					if (he_dev->cs_stper[reg].inuse == 0 ||
2422 					    he_dev->cs_stper[reg].pcr == pcr_goal)
2423 							break;
2424 
2425 				if (reg == HE_NUM_CS_STPER) {
2426 					err = -EBUSY;
2427 					spin_unlock_irqrestore(&he_dev->global_lock, flags);
2428 					goto open_failed;
2429 				}
2430 
2431 				he_dev->total_bw += pcr_goal;
2432 
2433 				he_vcc->rc_index = reg;
2434 				++he_dev->cs_stper[reg].inuse;
2435 				he_dev->cs_stper[reg].pcr = pcr_goal;
2436 
2437 				clock = he_is622(he_dev) ? 66667000 : 50000000;
2438 				period = clock / pcr_goal;
2439 
2440 				HPRINTK("rc_index = %d period = %d\n",
2441 								reg, period);
2442 
2443 				he_writel_mbox(he_dev, rate_to_atmf(period/2),
2444 							CS_STPER0 + reg);
2445 				spin_unlock_irqrestore(&he_dev->global_lock, flags);
2446 
2447 				tsr0 = TSR0_CBR | TSR0_GROUP(0) | tsr0_aal |
2448 							TSR0_RC_INDEX(reg);
2449 
2450 				break;
2451 			default:
2452 				err = -EINVAL;
2453 				goto open_failed;
2454 		}
2455 
2456 		spin_lock_irqsave(&he_dev->global_lock, flags);
2457 
2458 		he_writel_tsr0(he_dev, tsr0, cid);
2459 		he_writel_tsr4(he_dev, tsr4 | 1, cid);
2460 		he_writel_tsr1(he_dev, TSR1_MCR(rate_to_atmf(0)) |
2461 					TSR1_PCR(rate_to_atmf(pcr_goal)), cid);
2462 		he_writel_tsr2(he_dev, TSR2_ACR(rate_to_atmf(pcr_goal)), cid);
2463 		he_writel_tsr9(he_dev, TSR9_OPEN_CONN, cid);
2464 
2465 		he_writel_tsr3(he_dev, 0x0, cid);
2466 		he_writel_tsr5(he_dev, 0x0, cid);
2467 		he_writel_tsr6(he_dev, 0x0, cid);
2468 		he_writel_tsr7(he_dev, 0x0, cid);
2469 		he_writel_tsr8(he_dev, 0x0, cid);
2470 		he_writel_tsr10(he_dev, 0x0, cid);
2471 		he_writel_tsr11(he_dev, 0x0, cid);
2472 		he_writel_tsr12(he_dev, 0x0, cid);
2473 		he_writel_tsr13(he_dev, 0x0, cid);
2474 		he_writel_tsr14(he_dev, 0x0, cid);
2475 		(void) he_readl_tsr0(he_dev, cid);		/* flush posted writes */
2476 		spin_unlock_irqrestore(&he_dev->global_lock, flags);
2477 	}
2478 
2479 	if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
2480 		unsigned aal;
2481 
2482 		HPRINTK("open rx cid 0x%x (rx_waitq %p)\n", cid,
2483 		 				&HE_VCC(vcc)->rx_waitq);
2484 
2485 		switch (vcc->qos.aal) {
2486 			case ATM_AAL5:
2487 				aal = RSR0_AAL5;
2488 				break;
2489 			case ATM_AAL0:
2490 				aal = RSR0_RAWCELL;
2491 				break;
2492 			default:
2493 				err = -EINVAL;
2494 				goto open_failed;
2495 		}
2496 
2497 		spin_lock_irqsave(&he_dev->global_lock, flags);
2498 
2499 		rsr0 = he_readl_rsr0(he_dev, cid);
2500 		if (rsr0 & RSR0_OPEN_CONN) {
2501 			spin_unlock_irqrestore(&he_dev->global_lock, flags);
2502 
2503 			hprintk("cid 0x%x not idle (rsr0 = 0x%x)\n", cid, rsr0);
2504 			err = -EBUSY;
2505 			goto open_failed;
2506 		}
2507 
2508 #ifdef USE_RBPS
2509 		rsr1 = RSR1_GROUP(0);
2510 		rsr4 = RSR4_GROUP(0);
2511 #else /* !USE_RBPS */
2512 		rsr1 = RSR1_GROUP(0)|RSR1_RBPL_ONLY;
2513 		rsr4 = RSR4_GROUP(0)|RSR4_RBPL_ONLY;
2514 #endif /* USE_RBPS */
2515 		rsr0 = vcc->qos.rxtp.traffic_class == ATM_UBR ?
2516 				(RSR0_EPD_ENABLE|RSR0_PPD_ENABLE) : 0;
2517 
2518 #ifdef USE_CHECKSUM_HW
2519 		if (vpi == 0 && vci >= ATM_NOT_RSV_VCI)
2520 			rsr0 |= RSR0_TCP_CKSUM;
2521 #endif
2522 
2523 		he_writel_rsr4(he_dev, rsr4, cid);
2524 		he_writel_rsr1(he_dev, rsr1, cid);
2525 		/* 5.1.11 last parameter initialized should be
2526 			  the open/closed indication in rsr0 */
2527 		he_writel_rsr0(he_dev,
2528 			rsr0 | RSR0_START_PDU | RSR0_OPEN_CONN | aal, cid);
2529 		(void) he_readl_rsr0(he_dev, cid);		/* flush posted writes */
2530 
2531 		spin_unlock_irqrestore(&he_dev->global_lock, flags);
2532 	}
2533 
2534 open_failed:
2535 
2536 	if (err) {
2537 		if (he_vcc)
2538 			kfree(he_vcc);
2539 		clear_bit(ATM_VF_ADDR, &vcc->flags);
2540 	}
2541 	else
2542 		set_bit(ATM_VF_READY, &vcc->flags);
2543 
2544 	return err;
2545 }
2546 
2547 static void
2548 he_close(struct atm_vcc *vcc)
2549 {
2550 	unsigned long flags;
2551 	DECLARE_WAITQUEUE(wait, current);
2552 	struct he_dev *he_dev = HE_DEV(vcc->dev);
2553 	struct he_tpd *tpd;
2554 	unsigned cid;
2555 	struct he_vcc *he_vcc = HE_VCC(vcc);
2556 #define MAX_RETRY 30
2557 	int retry = 0, sleep = 1, tx_inuse;
2558 
2559 	HPRINTK("close vcc %p %d.%d\n", vcc, vcc->vpi, vcc->vci);
2560 
2561 	clear_bit(ATM_VF_READY, &vcc->flags);
2562 	cid = he_mkcid(he_dev, vcc->vpi, vcc->vci);
2563 
2564 	if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
2565 		int timeout;
2566 
2567 		HPRINTK("close rx cid 0x%x\n", cid);
2568 
2569 		/* 2.7.2.2 close receive operation */
2570 
2571 		/* wait for previous close (if any) to finish */
2572 
2573 		spin_lock_irqsave(&he_dev->global_lock, flags);
2574 		while (he_readl(he_dev, RCC_STAT) & RCC_BUSY) {
2575 			HPRINTK("close cid 0x%x RCC_BUSY\n", cid);
2576 			udelay(250);
2577 		}
2578 
2579 		set_current_state(TASK_UNINTERRUPTIBLE);
2580 		add_wait_queue(&he_vcc->rx_waitq, &wait);
2581 
2582 		he_writel_rsr0(he_dev, RSR0_CLOSE_CONN, cid);
2583 		(void) he_readl_rsr0(he_dev, cid);		/* flush posted writes */
2584 		he_writel_mbox(he_dev, cid, RXCON_CLOSE);
2585 		spin_unlock_irqrestore(&he_dev->global_lock, flags);
2586 
2587 		timeout = schedule_timeout(30*HZ);
2588 
2589 		remove_wait_queue(&he_vcc->rx_waitq, &wait);
2590 		set_current_state(TASK_RUNNING);
2591 
2592 		if (timeout == 0)
2593 			hprintk("close rx timeout cid 0x%x\n", cid);
2594 
2595 		HPRINTK("close rx cid 0x%x complete\n", cid);
2596 
2597 	}
2598 
2599 	if (vcc->qos.txtp.traffic_class != ATM_NONE) {
2600 		volatile unsigned tsr4, tsr0;
2601 		int timeout;
2602 
2603 		HPRINTK("close tx cid 0x%x\n", cid);
2604 
2605 		/* 2.1.2
2606 		 *
2607 		 * ... the host must first stop queueing packets to the TPDRQ
2608 		 * on the connection to be closed, then wait for all outstanding
2609 		 * packets to be transmitted and their buffers returned to the
2610 		 * TBRQ. When the last packet on the connection arrives in the
2611 		 * TBRQ, the host issues the close command to the adapter.
2612 		 */
2613 
2614 		while (((tx_inuse = atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) > 0) &&
2615 		       (retry < MAX_RETRY)) {
2616 			msleep(sleep);
2617 			if (sleep < 250)
2618 				sleep = sleep * 2;
2619 
2620 			++retry;
2621 		}
2622 
2623 		if (tx_inuse)
2624 			hprintk("close tx cid 0x%x tx_inuse = %d\n", cid, tx_inuse);
2625 
2626 		/* 2.3.1.1 generic close operations with flush */
2627 
2628 		spin_lock_irqsave(&he_dev->global_lock, flags);
2629 		he_writel_tsr4_upper(he_dev, TSR4_FLUSH_CONN, cid);
2630 					/* also clears TSR4_SESSION_ENDED */
2631 
2632 		switch (vcc->qos.txtp.traffic_class) {
2633 			case ATM_UBR:
2634 				he_writel_tsr1(he_dev,
2635 					TSR1_MCR(rate_to_atmf(200000))
2636 					| TSR1_PCR(0), cid);
2637 				break;
2638 			case ATM_CBR:
2639 				he_writel_tsr14_upper(he_dev, TSR14_DELETE, cid);
2640 				break;
2641 		}
2642 		(void) he_readl_tsr4(he_dev, cid);		/* flush posted writes */
2643 
2644 		tpd = __alloc_tpd(he_dev);
2645 		if (tpd == NULL) {
2646 			hprintk("close tx he_alloc_tpd failed cid 0x%x\n", cid);
2647 			goto close_tx_incomplete;
2648 		}
2649 		tpd->status |= TPD_EOS | TPD_INT;
2650 		tpd->skb = NULL;
2651 		tpd->vcc = vcc;
2652 		wmb();
2653 
2654 		set_current_state(TASK_UNINTERRUPTIBLE);
2655 		add_wait_queue(&he_vcc->tx_waitq, &wait);
2656 		__enqueue_tpd(he_dev, tpd, cid);
2657 		spin_unlock_irqrestore(&he_dev->global_lock, flags);
2658 
2659 		timeout = schedule_timeout(30*HZ);
2660 
2661 		remove_wait_queue(&he_vcc->tx_waitq, &wait);
2662 		set_current_state(TASK_RUNNING);
2663 
2664 		spin_lock_irqsave(&he_dev->global_lock, flags);
2665 
2666 		if (timeout == 0) {
2667 			hprintk("close tx timeout cid 0x%x\n", cid);
2668 			goto close_tx_incomplete;
2669 		}
2670 
2671 		while (!((tsr4 = he_readl_tsr4(he_dev, cid)) & TSR4_SESSION_ENDED)) {
2672 			HPRINTK("close tx cid 0x%x !TSR4_SESSION_ENDED (tsr4 = 0x%x)\n", cid, tsr4);
2673 			udelay(250);
2674 		}
2675 
2676 		while (TSR0_CONN_STATE(tsr0 = he_readl_tsr0(he_dev, cid)) != 0) {
2677 			HPRINTK("close tx cid 0x%x TSR0_CONN_STATE != 0 (tsr0 = 0x%x)\n", cid, tsr0);
2678 			udelay(250);
2679 		}
2680 
2681 close_tx_incomplete:
2682 
2683 		if (vcc->qos.txtp.traffic_class == ATM_CBR) {
2684 			int reg = he_vcc->rc_index;
2685 
2686 			HPRINTK("cs_stper reg = %d\n", reg);
2687 
2688 			if (he_dev->cs_stper[reg].inuse == 0)
2689 				hprintk("cs_stper[%d].inuse = 0!\n", reg);
2690 			else
2691 				--he_dev->cs_stper[reg].inuse;
2692 
2693 			he_dev->total_bw -= he_dev->cs_stper[reg].pcr;
2694 		}
2695 		spin_unlock_irqrestore(&he_dev->global_lock, flags);
2696 
2697 		HPRINTK("close tx cid 0x%x complete\n", cid);
2698 	}
2699 
2700 	kfree(he_vcc);
2701 
2702 	clear_bit(ATM_VF_ADDR, &vcc->flags);
2703 }
2704 
2705 static int
2706 he_send(struct atm_vcc *vcc, struct sk_buff *skb)
2707 {
2708 	unsigned long flags;
2709 	struct he_dev *he_dev = HE_DEV(vcc->dev);
2710 	unsigned cid = he_mkcid(he_dev, vcc->vpi, vcc->vci);
2711 	struct he_tpd *tpd;
2712 #ifdef USE_SCATTERGATHER
2713 	int i, slot = 0;
2714 #endif
2715 
2716 #define HE_TPD_BUFSIZE 0xffff
2717 
2718 	HPRINTK("send %d.%d\n", vcc->vpi, vcc->vci);
2719 
2720 	if ((skb->len > HE_TPD_BUFSIZE) ||
2721 	    ((vcc->qos.aal == ATM_AAL0) && (skb->len != ATM_AAL0_SDU))) {
2722 		hprintk("buffer too large (or small) -- %d bytes\n", skb->len );
2723 		if (vcc->pop)
2724 			vcc->pop(vcc, skb);
2725 		else
2726 			dev_kfree_skb_any(skb);
2727 		atomic_inc(&vcc->stats->tx_err);
2728 		return -EINVAL;
2729 	}
2730 
2731 #ifndef USE_SCATTERGATHER
2732 	if (skb_shinfo(skb)->nr_frags) {
2733 		hprintk("no scatter/gather support\n");
2734 		if (vcc->pop)
2735 			vcc->pop(vcc, skb);
2736 		else
2737 			dev_kfree_skb_any(skb);
2738 		atomic_inc(&vcc->stats->tx_err);
2739 		return -EINVAL;
2740 	}
2741 #endif
2742 	spin_lock_irqsave(&he_dev->global_lock, flags);
2743 
2744 	tpd = __alloc_tpd(he_dev);
2745 	if (tpd == NULL) {
2746 		if (vcc->pop)
2747 			vcc->pop(vcc, skb);
2748 		else
2749 			dev_kfree_skb_any(skb);
2750 		atomic_inc(&vcc->stats->tx_err);
2751 		spin_unlock_irqrestore(&he_dev->global_lock, flags);
2752 		return -ENOMEM;
2753 	}
2754 
2755 	if (vcc->qos.aal == ATM_AAL5)
2756 		tpd->status |= TPD_CELLTYPE(TPD_USERCELL);
2757 	else {
2758 		char *pti_clp = (void *) (skb->data + 3);
2759 		int clp, pti;
2760 
2761 		pti = (*pti_clp & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT;
2762 		clp = (*pti_clp & ATM_HDR_CLP);
2763 		tpd->status |= TPD_CELLTYPE(pti);
2764 		if (clp)
2765 			tpd->status |= TPD_CLP;
2766 
2767 		skb_pull(skb, ATM_AAL0_SDU - ATM_CELL_PAYLOAD);
2768 	}
2769 
2770 #ifdef USE_SCATTERGATHER
2771 	tpd->iovec[slot].addr = pci_map_single(he_dev->pci_dev, skb->data,
2772 				skb->len - skb->data_len, PCI_DMA_TODEVICE);
2773 	tpd->iovec[slot].len = skb->len - skb->data_len;
2774 	++slot;
2775 
2776 	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
2777 		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
2778 
2779 		if (slot == TPD_MAXIOV) {	/* queue tpd; start new tpd */
2780 			tpd->vcc = vcc;
2781 			tpd->skb = NULL;	/* not the last fragment
2782 						   so dont ->push() yet */
2783 			wmb();
2784 
2785 			__enqueue_tpd(he_dev, tpd, cid);
2786 			tpd = __alloc_tpd(he_dev);
2787 			if (tpd == NULL) {
2788 				if (vcc->pop)
2789 					vcc->pop(vcc, skb);
2790 				else
2791 					dev_kfree_skb_any(skb);
2792 				atomic_inc(&vcc->stats->tx_err);
2793 				spin_unlock_irqrestore(&he_dev->global_lock, flags);
2794 				return -ENOMEM;
2795 			}
2796 			tpd->status |= TPD_USERCELL;
2797 			slot = 0;
2798 		}
2799 
2800 		tpd->iovec[slot].addr = pci_map_single(he_dev->pci_dev,
2801 			(void *) page_address(frag->page) + frag->page_offset,
2802 				frag->size, PCI_DMA_TODEVICE);
2803 		tpd->iovec[slot].len = frag->size;
2804 		++slot;
2805 
2806 	}
2807 
2808 	tpd->iovec[slot - 1].len |= TPD_LST;
2809 #else
2810 	tpd->address0 = pci_map_single(he_dev->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE);
2811 	tpd->length0 = skb->len | TPD_LST;
2812 #endif
2813 	tpd->status |= TPD_INT;
2814 
2815 	tpd->vcc = vcc;
2816 	tpd->skb = skb;
2817 	wmb();
2818 	ATM_SKB(skb)->vcc = vcc;
2819 
2820 	__enqueue_tpd(he_dev, tpd, cid);
2821 	spin_unlock_irqrestore(&he_dev->global_lock, flags);
2822 
2823 	atomic_inc(&vcc->stats->tx);
2824 
2825 	return 0;
2826 }
2827 
2828 static int
2829 he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg)
2830 {
2831 	unsigned long flags;
2832 	struct he_dev *he_dev = HE_DEV(atm_dev);
2833 	struct he_ioctl_reg reg;
2834 	int err = 0;
2835 
2836 	switch (cmd) {
2837 		case HE_GET_REG:
2838 			if (!capable(CAP_NET_ADMIN))
2839 				return -EPERM;
2840 
2841 			if (copy_from_user(&reg, arg,
2842 					   sizeof(struct he_ioctl_reg)))
2843 				return -EFAULT;
2844 
2845 			spin_lock_irqsave(&he_dev->global_lock, flags);
2846 			switch (reg.type) {
2847 				case HE_REGTYPE_PCI:
2848 					reg.val = he_readl(he_dev, reg.addr);
2849 					break;
2850 				case HE_REGTYPE_RCM:
2851 					reg.val =
2852 						he_readl_rcm(he_dev, reg.addr);
2853 					break;
2854 				case HE_REGTYPE_TCM:
2855 					reg.val =
2856 						he_readl_tcm(he_dev, reg.addr);
2857 					break;
2858 				case HE_REGTYPE_MBOX:
2859 					reg.val =
2860 						he_readl_mbox(he_dev, reg.addr);
2861 					break;
2862 				default:
2863 					err = -EINVAL;
2864 					break;
2865 			}
2866 			spin_unlock_irqrestore(&he_dev->global_lock, flags);
2867 			if (err == 0)
2868 				if (copy_to_user(arg, &reg,
2869 							sizeof(struct he_ioctl_reg)))
2870 					return -EFAULT;
2871 			break;
2872 		default:
2873 #ifdef CONFIG_ATM_HE_USE_SUNI
2874 			if (atm_dev->phy && atm_dev->phy->ioctl)
2875 				err = atm_dev->phy->ioctl(atm_dev, cmd, arg);
2876 #else /* CONFIG_ATM_HE_USE_SUNI */
2877 			err = -EINVAL;
2878 #endif /* CONFIG_ATM_HE_USE_SUNI */
2879 			break;
2880 	}
2881 
2882 	return err;
2883 }
2884 
2885 static void
2886 he_phy_put(struct atm_dev *atm_dev, unsigned char val, unsigned long addr)
2887 {
2888 	unsigned long flags;
2889 	struct he_dev *he_dev = HE_DEV(atm_dev);
2890 
2891 	HPRINTK("phy_put(val 0x%x, addr 0x%lx)\n", val, addr);
2892 
2893 	spin_lock_irqsave(&he_dev->global_lock, flags);
2894 	he_writel(he_dev, val, FRAMER + (addr*4));
2895 	(void) he_readl(he_dev, FRAMER + (addr*4));		/* flush posted writes */
2896 	spin_unlock_irqrestore(&he_dev->global_lock, flags);
2897 }
2898 
2899 
2900 static unsigned char
2901 he_phy_get(struct atm_dev *atm_dev, unsigned long addr)
2902 {
2903 	unsigned long flags;
2904 	struct he_dev *he_dev = HE_DEV(atm_dev);
2905 	unsigned reg;
2906 
2907 	spin_lock_irqsave(&he_dev->global_lock, flags);
2908 	reg = he_readl(he_dev, FRAMER + (addr*4));
2909 	spin_unlock_irqrestore(&he_dev->global_lock, flags);
2910 
2911 	HPRINTK("phy_get(addr 0x%lx) =0x%x\n", addr, reg);
2912 	return reg;
2913 }
2914 
2915 static int
2916 he_proc_read(struct atm_dev *dev, loff_t *pos, char *page)
2917 {
2918 	unsigned long flags;
2919 	struct he_dev *he_dev = HE_DEV(dev);
2920 	int left, i;
2921 #ifdef notdef
2922 	struct he_rbrq *rbrq_tail;
2923 	struct he_tpdrq *tpdrq_head;
2924 	int rbpl_head, rbpl_tail;
2925 #endif
2926 	static long mcc = 0, oec = 0, dcc = 0, cec = 0;
2927 
2928 
2929 	left = *pos;
2930 	if (!left--)
2931 		return sprintf(page, "%s\n", version);
2932 
2933 	if (!left--)
2934 		return sprintf(page, "%s%s\n\n",
2935 			he_dev->prod_id, he_dev->media & 0x40 ? "SM" : "MM");
2936 
2937 	if (!left--)
2938 		return sprintf(page, "Mismatched Cells  VPI/VCI Not Open  Dropped Cells  RCM Dropped Cells\n");
2939 
2940 	spin_lock_irqsave(&he_dev->global_lock, flags);
2941 	mcc += he_readl(he_dev, MCC);
2942 	oec += he_readl(he_dev, OEC);
2943 	dcc += he_readl(he_dev, DCC);
2944 	cec += he_readl(he_dev, CEC);
2945 	spin_unlock_irqrestore(&he_dev->global_lock, flags);
2946 
2947 	if (!left--)
2948 		return sprintf(page, "%16ld  %16ld  %13ld  %17ld\n\n",
2949 							mcc, oec, dcc, cec);
2950 
2951 	if (!left--)
2952 		return sprintf(page, "irq_size = %d  inuse = ?  peak = %d\n",
2953 				CONFIG_IRQ_SIZE, he_dev->irq_peak);
2954 
2955 	if (!left--)
2956 		return sprintf(page, "tpdrq_size = %d  inuse = ?\n",
2957 						CONFIG_TPDRQ_SIZE);
2958 
2959 	if (!left--)
2960 		return sprintf(page, "rbrq_size = %d  inuse = ?  peak = %d\n",
2961 				CONFIG_RBRQ_SIZE, he_dev->rbrq_peak);
2962 
2963 	if (!left--)
2964 		return sprintf(page, "tbrq_size = %d  peak = %d\n",
2965 					CONFIG_TBRQ_SIZE, he_dev->tbrq_peak);
2966 
2967 
2968 #ifdef notdef
2969 	rbpl_head = RBPL_MASK(he_readl(he_dev, G0_RBPL_S));
2970 	rbpl_tail = RBPL_MASK(he_readl(he_dev, G0_RBPL_T));
2971 
2972 	inuse = rbpl_head - rbpl_tail;
2973 	if (inuse < 0)
2974 		inuse += CONFIG_RBPL_SIZE * sizeof(struct he_rbp);
2975 	inuse /= sizeof(struct he_rbp);
2976 
2977 	if (!left--)
2978 		return sprintf(page, "rbpl_size = %d  inuse = %d\n\n",
2979 						CONFIG_RBPL_SIZE, inuse);
2980 #endif
2981 
2982 	if (!left--)
2983 		return sprintf(page, "rate controller periods (cbr)\n                 pcr  #vc\n");
2984 
2985 	for (i = 0; i < HE_NUM_CS_STPER; ++i)
2986 		if (!left--)
2987 			return sprintf(page, "cs_stper%-2d  %8ld  %3d\n", i,
2988 						he_dev->cs_stper[i].pcr,
2989 						he_dev->cs_stper[i].inuse);
2990 
2991 	if (!left--)
2992 		return sprintf(page, "total bw (cbr): %d  (limit %d)\n",
2993 			he_dev->total_bw, he_dev->atm_dev->link_rate * 10 / 9);
2994 
2995 	return 0;
2996 }
2997 
2998 /* eeprom routines  -- see 4.7 */
2999 
3000 u8
3001 read_prom_byte(struct he_dev *he_dev, int addr)
3002 {
3003 	u32 val = 0, tmp_read = 0;
3004 	int i, j = 0;
3005 	u8 byte_read = 0;
3006 
3007 	val = readl(he_dev->membase + HOST_CNTL);
3008 	val &= 0xFFFFE0FF;
3009 
3010 	/* Turn on write enable */
3011 	val |= 0x800;
3012 	he_writel(he_dev, val, HOST_CNTL);
3013 
3014 	/* Send READ instruction */
3015 	for (i = 0; i < sizeof(readtab)/sizeof(readtab[0]); i++) {
3016 		he_writel(he_dev, val | readtab[i], HOST_CNTL);
3017 		udelay(EEPROM_DELAY);
3018 	}
3019 
3020 	/* Next, we need to send the byte address to read from */
3021 	for (i = 7; i >= 0; i--) {
3022 		he_writel(he_dev, val | clocktab[j++] | (((addr >> i) & 1) << 9), HOST_CNTL);
3023 		udelay(EEPROM_DELAY);
3024 		he_writel(he_dev, val | clocktab[j++] | (((addr >> i) & 1) << 9), HOST_CNTL);
3025 		udelay(EEPROM_DELAY);
3026 	}
3027 
3028 	j = 0;
3029 
3030 	val &= 0xFFFFF7FF;      /* Turn off write enable */
3031 	he_writel(he_dev, val, HOST_CNTL);
3032 
3033 	/* Now, we can read data from the EEPROM by clocking it in */
3034 	for (i = 7; i >= 0; i--) {
3035 		he_writel(he_dev, val | clocktab[j++], HOST_CNTL);
3036 		udelay(EEPROM_DELAY);
3037 		tmp_read = he_readl(he_dev, HOST_CNTL);
3038 		byte_read |= (unsigned char)
3039 			   ((tmp_read & ID_DOUT) >> ID_DOFFSET << i);
3040 		he_writel(he_dev, val | clocktab[j++], HOST_CNTL);
3041 		udelay(EEPROM_DELAY);
3042 	}
3043 
3044 	he_writel(he_dev, val | ID_CS, HOST_CNTL);
3045 	udelay(EEPROM_DELAY);
3046 
3047 	return byte_read;
3048 }
3049 
3050 MODULE_LICENSE("GPL");
3051 MODULE_AUTHOR("chas williams <chas@cmf.nrl.navy.mil>");
3052 MODULE_DESCRIPTION("ForeRunnerHE ATM Adapter driver");
3053 module_param(disable64, bool, 0);
3054 MODULE_PARM_DESC(disable64, "disable 64-bit pci bus transfers");
3055 module_param(nvpibits, short, 0);
3056 MODULE_PARM_DESC(nvpibits, "numbers of bits for vpi (default 0)");
3057 module_param(nvcibits, short, 0);
3058 MODULE_PARM_DESC(nvcibits, "numbers of bits for vci (default 12)");
3059 module_param(rx_skb_reserve, short, 0);
3060 MODULE_PARM_DESC(rx_skb_reserve, "padding for receive skb (default 16)");
3061 module_param(irq_coalesce, bool, 0);
3062 MODULE_PARM_DESC(irq_coalesce, "use interrupt coalescing (default 1)");
3063 module_param(sdh, bool, 0);
3064 MODULE_PARM_DESC(sdh, "use SDH framing (default 0)");
3065 
3066 static struct pci_device_id he_pci_tbl[] = {
3067 	{ PCI_VENDOR_ID_FORE, PCI_DEVICE_ID_FORE_HE, PCI_ANY_ID, PCI_ANY_ID,
3068 	  0, 0, 0 },
3069 	{ 0, }
3070 };
3071 
3072 MODULE_DEVICE_TABLE(pci, he_pci_tbl);
3073 
3074 static struct pci_driver he_driver = {
3075 	.name =		"he",
3076 	.probe =	he_init_one,
3077 	.remove =	__devexit_p(he_remove_one),
3078 	.id_table =	he_pci_tbl,
3079 };
3080 
3081 static int __init he_init(void)
3082 {
3083 	return pci_register_driver(&he_driver);
3084 }
3085 
3086 static void __exit he_cleanup(void)
3087 {
3088 	pci_unregister_driver(&he_driver);
3089 }
3090 
3091 module_init(he_init);
3092 module_exit(he_cleanup);
3093