[PATCH] W1: w1_netlink: New init/fini netlink callbacks.
[linux-2.6/verdex.git] / drivers / atm / he.c
blobfde9334059af595428f3f871599a538e3c3a29b0
1 /* $Id: he.c,v 1.18 2003/05/06 22:57:15 chas Exp $ */
3 /*
5 he.c
7 ForeRunnerHE ATM Adapter driver for ATM on Linux
8 Copyright (C) 1999-2001 Naval Research Laboratory
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.
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.
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
28 he.c
30 ForeRunnerHE ATM Adapter driver for ATM on Linux
31 Copyright (C) 1999-2001 Naval Research Laboratory
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.
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.
43 This driver was written using the "Programmer's Reference Manual for
44 ForeRunnerHE(tm)", MANU0361-01 - Rev. A, 08/21/98.
46 AUTHORS:
47 chas williams <chas@cmf.nrl.navy.mil>
48 eric kinzie <ekinzie@cmf.nrl.navy.mil>
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)
58 #include <linux/config.h>
59 #include <linux/module.h>
60 #include <linux/kernel.h>
61 #include <linux/skbuff.h>
62 #include <linux/pci.h>
63 #include <linux/errno.h>
64 #include <linux/types.h>
65 #include <linux/string.h>
66 #include <linux/delay.h>
67 #include <linux/init.h>
68 #include <linux/mm.h>
69 #include <linux/sched.h>
70 #include <linux/timer.h>
71 #include <linux/interrupt.h>
72 #include <linux/dma-mapping.h>
73 #include <asm/io.h>
74 #include <asm/byteorder.h>
75 #include <asm/uaccess.h>
77 #include <linux/atmdev.h>
78 #include <linux/atm.h>
79 #include <linux/sonet.h>
81 #define USE_TASKLET
82 #undef USE_SCATTERGATHER
83 #undef USE_CHECKSUM_HW /* still confused about this */
84 #define USE_RBPS
85 #undef USE_RBPS_POOL /* if memory is tight try this */
86 #undef USE_RBPL_POOL /* if memory is tight try this */
87 #define USE_TPD_POOL
88 /* #undef CONFIG_ATM_HE_USE_SUNI */
89 /* #undef HE_DEBUG */
91 #include "he.h"
92 #include "suni.h"
93 #include <linux/atm_he.h>
95 #define hprintk(fmt,args...) printk(KERN_ERR DEV_LABEL "%d: " fmt, he_dev->number , ##args)
97 #ifdef HE_DEBUG
98 #define HPRINTK(fmt,args...) printk(KERN_DEBUG DEV_LABEL "%d: " fmt, he_dev->number , ##args)
99 #else /* !HE_DEBUG */
100 #define HPRINTK(fmt,args...) do { } while (0)
101 #endif /* HE_DEBUG */
103 /* version definition */
105 static char *version = "$Id: he.c,v 1.18 2003/05/06 22:57:15 chas Exp $";
107 /* declarations */
109 static int he_open(struct atm_vcc *vcc);
110 static void he_close(struct atm_vcc *vcc);
111 static int he_send(struct atm_vcc *vcc, struct sk_buff *skb);
112 static int he_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg);
113 static irqreturn_t he_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
114 static void he_tasklet(unsigned long data);
115 static int he_proc_read(struct atm_dev *dev,loff_t *pos,char *page);
116 static int he_start(struct atm_dev *dev);
117 static void he_stop(struct he_dev *dev);
118 static void he_phy_put(struct atm_dev *, unsigned char, unsigned long);
119 static unsigned char he_phy_get(struct atm_dev *, unsigned long);
121 static u8 read_prom_byte(struct he_dev *he_dev, int addr);
123 /* globals */
125 static struct he_dev *he_devs;
126 static int disable64;
127 static short nvpibits = -1;
128 static short nvcibits = -1;
129 static short rx_skb_reserve = 16;
130 static int irq_coalesce = 1;
131 static int sdh = 0;
133 /* Read from EEPROM = 0000 0011b */
134 static unsigned int readtab[] = {
135 CS_HIGH | CLK_HIGH,
136 CS_LOW | CLK_LOW,
137 CLK_HIGH, /* 0 */
138 CLK_LOW,
139 CLK_HIGH, /* 0 */
140 CLK_LOW,
141 CLK_HIGH, /* 0 */
142 CLK_LOW,
143 CLK_HIGH, /* 0 */
144 CLK_LOW,
145 CLK_HIGH, /* 0 */
146 CLK_LOW,
147 CLK_HIGH, /* 0 */
148 CLK_LOW | SI_HIGH,
149 CLK_HIGH | SI_HIGH, /* 1 */
150 CLK_LOW | SI_HIGH,
151 CLK_HIGH | SI_HIGH /* 1 */
154 /* Clock to read from/write to the EEPROM */
155 static unsigned int clocktab[] = {
156 CLK_LOW,
157 CLK_HIGH,
158 CLK_LOW,
159 CLK_HIGH,
160 CLK_LOW,
161 CLK_HIGH,
162 CLK_LOW,
163 CLK_HIGH,
164 CLK_LOW,
165 CLK_HIGH,
166 CLK_LOW,
167 CLK_HIGH,
168 CLK_LOW,
169 CLK_HIGH,
170 CLK_LOW,
171 CLK_HIGH,
172 CLK_LOW
175 static struct atmdev_ops he_ops =
177 .open = he_open,
178 .close = he_close,
179 .ioctl = he_ioctl,
180 .send = he_send,
181 .phy_put = he_phy_put,
182 .phy_get = he_phy_get,
183 .proc_read = he_proc_read,
184 .owner = THIS_MODULE
187 #define he_writel(dev, val, reg) do { writel(val, (dev)->membase + (reg)); wmb(); } while (0)
188 #define he_readl(dev, reg) readl((dev)->membase + (reg))
190 /* section 2.12 connection memory access */
192 static __inline__ void
193 he_writel_internal(struct he_dev *he_dev, unsigned val, unsigned addr,
194 unsigned flags)
196 he_writel(he_dev, val, CON_DAT);
197 (void) he_readl(he_dev, CON_DAT); /* flush posted writes */
198 he_writel(he_dev, flags | CON_CTL_WRITE | CON_CTL_ADDR(addr), CON_CTL);
199 while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY);
202 #define he_writel_rcm(dev, val, reg) \
203 he_writel_internal(dev, val, reg, CON_CTL_RCM)
205 #define he_writel_tcm(dev, val, reg) \
206 he_writel_internal(dev, val, reg, CON_CTL_TCM)
208 #define he_writel_mbox(dev, val, reg) \
209 he_writel_internal(dev, val, reg, CON_CTL_MBOX)
211 static unsigned
212 he_readl_internal(struct he_dev *he_dev, unsigned addr, unsigned flags)
214 he_writel(he_dev, flags | CON_CTL_READ | CON_CTL_ADDR(addr), CON_CTL);
215 while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY);
216 return he_readl(he_dev, CON_DAT);
219 #define he_readl_rcm(dev, reg) \
220 he_readl_internal(dev, reg, CON_CTL_RCM)
222 #define he_readl_tcm(dev, reg) \
223 he_readl_internal(dev, reg, CON_CTL_TCM)
225 #define he_readl_mbox(dev, reg) \
226 he_readl_internal(dev, reg, CON_CTL_MBOX)
229 /* figure 2.2 connection id */
231 #define he_mkcid(dev, vpi, vci) (((vpi << (dev)->vcibits) | vci) & 0x1fff)
233 /* 2.5.1 per connection transmit state registers */
235 #define he_writel_tsr0(dev, val, cid) \
236 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 0)
237 #define he_readl_tsr0(dev, cid) \
238 he_readl_tcm(dev, CONFIG_TSRA | (cid << 3) | 0)
240 #define he_writel_tsr1(dev, val, cid) \
241 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 1)
243 #define he_writel_tsr2(dev, val, cid) \
244 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 2)
246 #define he_writel_tsr3(dev, val, cid) \
247 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 3)
249 #define he_writel_tsr4(dev, val, cid) \
250 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 4)
252 /* from page 2-20
254 * NOTE While the transmit connection is active, bits 23 through 0
255 * of this register must not be written by the host. Byte
256 * enables should be used during normal operation when writing
257 * the most significant byte.
260 #define he_writel_tsr4_upper(dev, val, cid) \
261 he_writel_internal(dev, val, CONFIG_TSRA | (cid << 3) | 4, \
262 CON_CTL_TCM \
263 | CON_BYTE_DISABLE_2 \
264 | CON_BYTE_DISABLE_1 \
265 | CON_BYTE_DISABLE_0)
267 #define he_readl_tsr4(dev, cid) \
268 he_readl_tcm(dev, CONFIG_TSRA | (cid << 3) | 4)
270 #define he_writel_tsr5(dev, val, cid) \
271 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 5)
273 #define he_writel_tsr6(dev, val, cid) \
274 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 6)
276 #define he_writel_tsr7(dev, val, cid) \
277 he_writel_tcm(dev, val, CONFIG_TSRA | (cid << 3) | 7)
280 #define he_writel_tsr8(dev, val, cid) \
281 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 0)
283 #define he_writel_tsr9(dev, val, cid) \
284 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 1)
286 #define he_writel_tsr10(dev, val, cid) \
287 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 2)
289 #define he_writel_tsr11(dev, val, cid) \
290 he_writel_tcm(dev, val, CONFIG_TSRB | (cid << 2) | 3)
293 #define he_writel_tsr12(dev, val, cid) \
294 he_writel_tcm(dev, val, CONFIG_TSRC | (cid << 1) | 0)
296 #define he_writel_tsr13(dev, val, cid) \
297 he_writel_tcm(dev, val, CONFIG_TSRC | (cid << 1) | 1)
300 #define he_writel_tsr14(dev, val, cid) \
301 he_writel_tcm(dev, val, CONFIG_TSRD | cid)
303 #define he_writel_tsr14_upper(dev, val, cid) \
304 he_writel_internal(dev, val, CONFIG_TSRD | cid, \
305 CON_CTL_TCM \
306 | CON_BYTE_DISABLE_2 \
307 | CON_BYTE_DISABLE_1 \
308 | CON_BYTE_DISABLE_0)
310 /* 2.7.1 per connection receive state registers */
312 #define he_writel_rsr0(dev, val, cid) \
313 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 0)
314 #define he_readl_rsr0(dev, cid) \
315 he_readl_rcm(dev, 0x00000 | (cid << 3) | 0)
317 #define he_writel_rsr1(dev, val, cid) \
318 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 1)
320 #define he_writel_rsr2(dev, val, cid) \
321 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 2)
323 #define he_writel_rsr3(dev, val, cid) \
324 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 3)
326 #define he_writel_rsr4(dev, val, cid) \
327 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 4)
329 #define he_writel_rsr5(dev, val, cid) \
330 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 5)
332 #define he_writel_rsr6(dev, val, cid) \
333 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 6)
335 #define he_writel_rsr7(dev, val, cid) \
336 he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 7)
338 static __inline__ struct atm_vcc*
339 __find_vcc(struct he_dev *he_dev, unsigned cid)
341 struct hlist_head *head;
342 struct atm_vcc *vcc;
343 struct hlist_node *node;
344 struct sock *s;
345 short vpi;
346 int vci;
348 vpi = cid >> he_dev->vcibits;
349 vci = cid & ((1 << he_dev->vcibits) - 1);
350 head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
352 sk_for_each(s, node, head) {
353 vcc = atm_sk(s);
354 if (vcc->dev == he_dev->atm_dev &&
355 vcc->vci == vci && vcc->vpi == vpi &&
356 vcc->qos.rxtp.traffic_class != ATM_NONE) {
357 return vcc;
360 return NULL;
363 static int __devinit
364 he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
366 struct atm_dev *atm_dev = NULL;
367 struct he_dev *he_dev = NULL;
368 int err = 0;
370 printk(KERN_INFO "he: %s\n", version);
372 if (pci_enable_device(pci_dev))
373 return -EIO;
374 if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK) != 0) {
375 printk(KERN_WARNING "he: no suitable dma available\n");
376 err = -EIO;
377 goto init_one_failure;
380 atm_dev = atm_dev_register(DEV_LABEL, &he_ops, -1, NULL);
381 if (!atm_dev) {
382 err = -ENODEV;
383 goto init_one_failure;
385 pci_set_drvdata(pci_dev, atm_dev);
387 he_dev = (struct he_dev *) kmalloc(sizeof(struct he_dev),
388 GFP_KERNEL);
389 if (!he_dev) {
390 err = -ENOMEM;
391 goto init_one_failure;
393 memset(he_dev, 0, sizeof(struct he_dev));
395 he_dev->pci_dev = pci_dev;
396 he_dev->atm_dev = atm_dev;
397 he_dev->atm_dev->dev_data = he_dev;
398 atm_dev->dev_data = he_dev;
399 he_dev->number = atm_dev->number;
400 if (he_start(atm_dev)) {
401 he_stop(he_dev);
402 err = -ENODEV;
403 goto init_one_failure;
405 he_dev->next = NULL;
406 if (he_devs)
407 he_dev->next = he_devs;
408 he_devs = he_dev;
409 return 0;
411 init_one_failure:
412 if (atm_dev)
413 atm_dev_deregister(atm_dev);
414 kfree(he_dev);
415 pci_disable_device(pci_dev);
416 return err;
419 static void __devexit
420 he_remove_one (struct pci_dev *pci_dev)
422 struct atm_dev *atm_dev;
423 struct he_dev *he_dev;
425 atm_dev = pci_get_drvdata(pci_dev);
426 he_dev = HE_DEV(atm_dev);
428 /* need to remove from he_devs */
430 he_stop(he_dev);
431 atm_dev_deregister(atm_dev);
432 kfree(he_dev);
434 pci_set_drvdata(pci_dev, NULL);
435 pci_disable_device(pci_dev);
439 static unsigned
440 rate_to_atmf(unsigned rate) /* cps to atm forum format */
442 #define NONZERO (1 << 14)
444 unsigned exp = 0;
446 if (rate == 0)
447 return 0;
449 rate <<= 9;
450 while (rate > 0x3ff) {
451 ++exp;
452 rate >>= 1;
455 return (NONZERO | (exp << 9) | (rate & 0x1ff));
458 static void __init
459 he_init_rx_lbfp0(struct he_dev *he_dev)
461 unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
462 unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
463 unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD;
464 unsigned row_offset = he_dev->r0_startrow * he_dev->bytes_per_row;
466 lbufd_index = 0;
467 lbm_offset = he_readl(he_dev, RCMLBM_BA);
469 he_writel(he_dev, lbufd_index, RLBF0_H);
471 for (i = 0, lbuf_count = 0; i < he_dev->r0_numbuffs; ++i) {
472 lbufd_index += 2;
473 lbuf_addr = (row_offset + (lbuf_count * lbuf_bufsize)) / 32;
475 he_writel_rcm(he_dev, lbuf_addr, lbm_offset);
476 he_writel_rcm(he_dev, lbufd_index, lbm_offset + 1);
478 if (++lbuf_count == lbufs_per_row) {
479 lbuf_count = 0;
480 row_offset += he_dev->bytes_per_row;
482 lbm_offset += 4;
485 he_writel(he_dev, lbufd_index - 2, RLBF0_T);
486 he_writel(he_dev, he_dev->r0_numbuffs, RLBF0_C);
489 static void __init
490 he_init_rx_lbfp1(struct he_dev *he_dev)
492 unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
493 unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
494 unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD;
495 unsigned row_offset = he_dev->r1_startrow * he_dev->bytes_per_row;
497 lbufd_index = 1;
498 lbm_offset = he_readl(he_dev, RCMLBM_BA) + (2 * lbufd_index);
500 he_writel(he_dev, lbufd_index, RLBF1_H);
502 for (i = 0, lbuf_count = 0; i < he_dev->r1_numbuffs; ++i) {
503 lbufd_index += 2;
504 lbuf_addr = (row_offset + (lbuf_count * lbuf_bufsize)) / 32;
506 he_writel_rcm(he_dev, lbuf_addr, lbm_offset);
507 he_writel_rcm(he_dev, lbufd_index, lbm_offset + 1);
509 if (++lbuf_count == lbufs_per_row) {
510 lbuf_count = 0;
511 row_offset += he_dev->bytes_per_row;
513 lbm_offset += 4;
516 he_writel(he_dev, lbufd_index - 2, RLBF1_T);
517 he_writel(he_dev, he_dev->r1_numbuffs, RLBF1_C);
520 static void __init
521 he_init_tx_lbfp(struct he_dev *he_dev)
523 unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
524 unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
525 unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD;
526 unsigned row_offset = he_dev->tx_startrow * he_dev->bytes_per_row;
528 lbufd_index = he_dev->r0_numbuffs + he_dev->r1_numbuffs;
529 lbm_offset = he_readl(he_dev, RCMLBM_BA) + (2 * lbufd_index);
531 he_writel(he_dev, lbufd_index, TLBF_H);
533 for (i = 0, lbuf_count = 0; i < he_dev->tx_numbuffs; ++i) {
534 lbufd_index += 1;
535 lbuf_addr = (row_offset + (lbuf_count * lbuf_bufsize)) / 32;
537 he_writel_rcm(he_dev, lbuf_addr, lbm_offset);
538 he_writel_rcm(he_dev, lbufd_index, lbm_offset + 1);
540 if (++lbuf_count == lbufs_per_row) {
541 lbuf_count = 0;
542 row_offset += he_dev->bytes_per_row;
544 lbm_offset += 2;
547 he_writel(he_dev, lbufd_index - 1, TLBF_T);
550 static int __init
551 he_init_tpdrq(struct he_dev *he_dev)
553 he_dev->tpdrq_base = pci_alloc_consistent(he_dev->pci_dev,
554 CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq), &he_dev->tpdrq_phys);
555 if (he_dev->tpdrq_base == NULL) {
556 hprintk("failed to alloc tpdrq\n");
557 return -ENOMEM;
559 memset(he_dev->tpdrq_base, 0,
560 CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq));
562 he_dev->tpdrq_tail = he_dev->tpdrq_base;
563 he_dev->tpdrq_head = he_dev->tpdrq_base;
565 he_writel(he_dev, he_dev->tpdrq_phys, TPDRQ_B_H);
566 he_writel(he_dev, 0, TPDRQ_T);
567 he_writel(he_dev, CONFIG_TPDRQ_SIZE - 1, TPDRQ_S);
569 return 0;
572 static void __init
573 he_init_cs_block(struct he_dev *he_dev)
575 unsigned clock, rate, delta;
576 int reg;
578 /* 5.1.7 cs block initialization */
580 for (reg = 0; reg < 0x20; ++reg)
581 he_writel_mbox(he_dev, 0x0, CS_STTIM0 + reg);
583 /* rate grid timer reload values */
585 clock = he_is622(he_dev) ? 66667000 : 50000000;
586 rate = he_dev->atm_dev->link_rate;
587 delta = rate / 16 / 2;
589 for (reg = 0; reg < 0x10; ++reg) {
590 /* 2.4 internal transmit function
592 * we initialize the first row in the rate grid.
593 * values are period (in clock cycles) of timer
595 unsigned period = clock / rate;
597 he_writel_mbox(he_dev, period, CS_TGRLD0 + reg);
598 rate -= delta;
601 if (he_is622(he_dev)) {
602 /* table 5.2 (4 cells per lbuf) */
603 he_writel_mbox(he_dev, 0x000800fa, CS_ERTHR0);
604 he_writel_mbox(he_dev, 0x000c33cb, CS_ERTHR1);
605 he_writel_mbox(he_dev, 0x0010101b, CS_ERTHR2);
606 he_writel_mbox(he_dev, 0x00181dac, CS_ERTHR3);
607 he_writel_mbox(he_dev, 0x00280600, CS_ERTHR4);
609 /* table 5.3, 5.4, 5.5, 5.6, 5.7 */
610 he_writel_mbox(he_dev, 0x023de8b3, CS_ERCTL0);
611 he_writel_mbox(he_dev, 0x1801, CS_ERCTL1);
612 he_writel_mbox(he_dev, 0x68b3, CS_ERCTL2);
613 he_writel_mbox(he_dev, 0x1280, CS_ERSTAT0);
614 he_writel_mbox(he_dev, 0x68b3, CS_ERSTAT1);
615 he_writel_mbox(he_dev, 0x14585, CS_RTFWR);
617 he_writel_mbox(he_dev, 0x4680, CS_RTATR);
619 /* table 5.8 */
620 he_writel_mbox(he_dev, 0x00159ece, CS_TFBSET);
621 he_writel_mbox(he_dev, 0x68b3, CS_WCRMAX);
622 he_writel_mbox(he_dev, 0x5eb3, CS_WCRMIN);
623 he_writel_mbox(he_dev, 0xe8b3, CS_WCRINC);
624 he_writel_mbox(he_dev, 0xdeb3, CS_WCRDEC);
625 he_writel_mbox(he_dev, 0x68b3, CS_WCRCEIL);
627 /* table 5.9 */
628 he_writel_mbox(he_dev, 0x5, CS_OTPPER);
629 he_writel_mbox(he_dev, 0x14, CS_OTWPER);
630 } else {
631 /* table 5.1 (4 cells per lbuf) */
632 he_writel_mbox(he_dev, 0x000400ea, CS_ERTHR0);
633 he_writel_mbox(he_dev, 0x00063388, CS_ERTHR1);
634 he_writel_mbox(he_dev, 0x00081018, CS_ERTHR2);
635 he_writel_mbox(he_dev, 0x000c1dac, CS_ERTHR3);
636 he_writel_mbox(he_dev, 0x0014051a, CS_ERTHR4);
638 /* table 5.3, 5.4, 5.5, 5.6, 5.7 */
639 he_writel_mbox(he_dev, 0x0235e4b1, CS_ERCTL0);
640 he_writel_mbox(he_dev, 0x4701, CS_ERCTL1);
641 he_writel_mbox(he_dev, 0x64b1, CS_ERCTL2);
642 he_writel_mbox(he_dev, 0x1280, CS_ERSTAT0);
643 he_writel_mbox(he_dev, 0x64b1, CS_ERSTAT1);
644 he_writel_mbox(he_dev, 0xf424, CS_RTFWR);
646 he_writel_mbox(he_dev, 0x4680, CS_RTATR);
648 /* table 5.8 */
649 he_writel_mbox(he_dev, 0x000563b7, CS_TFBSET);
650 he_writel_mbox(he_dev, 0x64b1, CS_WCRMAX);
651 he_writel_mbox(he_dev, 0x5ab1, CS_WCRMIN);
652 he_writel_mbox(he_dev, 0xe4b1, CS_WCRINC);
653 he_writel_mbox(he_dev, 0xdab1, CS_WCRDEC);
654 he_writel_mbox(he_dev, 0x64b1, CS_WCRCEIL);
656 /* table 5.9 */
657 he_writel_mbox(he_dev, 0x6, CS_OTPPER);
658 he_writel_mbox(he_dev, 0x1e, CS_OTWPER);
661 he_writel_mbox(he_dev, 0x8, CS_OTTLIM);
663 for (reg = 0; reg < 0x8; ++reg)
664 he_writel_mbox(he_dev, 0x0, CS_HGRRT0 + reg);
668 static int __init
669 he_init_cs_block_rcm(struct he_dev *he_dev)
671 unsigned (*rategrid)[16][16];
672 unsigned rate, delta;
673 int i, j, reg;
675 unsigned rate_atmf, exp, man;
676 unsigned long long rate_cps;
677 int mult, buf, buf_limit = 4;
679 rategrid = kmalloc( sizeof(unsigned) * 16 * 16, GFP_KERNEL);
680 if (!rategrid)
681 return -ENOMEM;
683 /* initialize rate grid group table */
685 for (reg = 0x0; reg < 0xff; ++reg)
686 he_writel_rcm(he_dev, 0x0, CONFIG_RCMABR + reg);
688 /* initialize rate controller groups */
690 for (reg = 0x100; reg < 0x1ff; ++reg)
691 he_writel_rcm(he_dev, 0x0, CONFIG_RCMABR + reg);
693 /* initialize tNrm lookup table */
695 /* the manual makes reference to a routine in a sample driver
696 for proper configuration; fortunately, we only need this
697 in order to support abr connection */
699 /* initialize rate to group table */
701 rate = he_dev->atm_dev->link_rate;
702 delta = rate / 32;
705 * 2.4 transmit internal functions
707 * we construct a copy of the rate grid used by the scheduler
708 * in order to construct the rate to group table below
711 for (j = 0; j < 16; j++) {
712 (*rategrid)[0][j] = rate;
713 rate -= delta;
716 for (i = 1; i < 16; i++)
717 for (j = 0; j < 16; j++)
718 if (i > 14)
719 (*rategrid)[i][j] = (*rategrid)[i - 1][j] / 4;
720 else
721 (*rategrid)[i][j] = (*rategrid)[i - 1][j] / 2;
724 * 2.4 transmit internal function
726 * this table maps the upper 5 bits of exponent and mantissa
727 * of the atm forum representation of the rate into an index
728 * on rate grid
731 rate_atmf = 0;
732 while (rate_atmf < 0x400) {
733 man = (rate_atmf & 0x1f) << 4;
734 exp = rate_atmf >> 5;
737 instead of '/ 512', use '>> 9' to prevent a call
738 to divdu3 on x86 platforms
740 rate_cps = (unsigned long long) (1 << exp) * (man + 512) >> 9;
742 if (rate_cps < 10)
743 rate_cps = 10; /* 2.2.1 minimum payload rate is 10 cps */
745 for (i = 255; i > 0; i--)
746 if ((*rategrid)[i/16][i%16] >= rate_cps)
747 break; /* pick nearest rate instead? */
750 * each table entry is 16 bits: (rate grid index (8 bits)
751 * and a buffer limit (8 bits)
752 * there are two table entries in each 32-bit register
755 #ifdef notdef
756 buf = rate_cps * he_dev->tx_numbuffs /
757 (he_dev->atm_dev->link_rate * 2);
758 #else
759 /* this is pretty, but avoids _divdu3 and is mostly correct */
760 mult = he_dev->atm_dev->link_rate / ATM_OC3_PCR;
761 if (rate_cps > (272 * mult))
762 buf = 4;
763 else if (rate_cps > (204 * mult))
764 buf = 3;
765 else if (rate_cps > (136 * mult))
766 buf = 2;
767 else if (rate_cps > (68 * mult))
768 buf = 1;
769 else
770 buf = 0;
771 #endif
772 if (buf > buf_limit)
773 buf = buf_limit;
774 reg = (reg << 16) | ((i << 8) | buf);
776 #define RTGTBL_OFFSET 0x400
778 if (rate_atmf & 0x1)
779 he_writel_rcm(he_dev, reg,
780 CONFIG_RCMABR + RTGTBL_OFFSET + (rate_atmf >> 1));
782 ++rate_atmf;
785 kfree(rategrid);
786 return 0;
789 static int __init
790 he_init_group(struct he_dev *he_dev, int group)
792 int i;
794 #ifdef USE_RBPS
795 /* small buffer pool */
796 #ifdef USE_RBPS_POOL
797 he_dev->rbps_pool = pci_pool_create("rbps", he_dev->pci_dev,
798 CONFIG_RBPS_BUFSIZE, 8, 0);
799 if (he_dev->rbps_pool == NULL) {
800 hprintk("unable to create rbps pages\n");
801 return -ENOMEM;
803 #else /* !USE_RBPS_POOL */
804 he_dev->rbps_pages = pci_alloc_consistent(he_dev->pci_dev,
805 CONFIG_RBPS_SIZE * CONFIG_RBPS_BUFSIZE, &he_dev->rbps_pages_phys);
806 if (he_dev->rbps_pages == NULL) {
807 hprintk("unable to create rbps page pool\n");
808 return -ENOMEM;
810 #endif /* USE_RBPS_POOL */
812 he_dev->rbps_base = pci_alloc_consistent(he_dev->pci_dev,
813 CONFIG_RBPS_SIZE * sizeof(struct he_rbp), &he_dev->rbps_phys);
814 if (he_dev->rbps_base == NULL) {
815 hprintk("failed to alloc rbps\n");
816 return -ENOMEM;
818 memset(he_dev->rbps_base, 0, CONFIG_RBPS_SIZE * sizeof(struct he_rbp));
819 he_dev->rbps_virt = kmalloc(CONFIG_RBPS_SIZE * sizeof(struct he_virt), GFP_KERNEL);
821 for (i = 0; i < CONFIG_RBPS_SIZE; ++i) {
822 dma_addr_t dma_handle;
823 void *cpuaddr;
825 #ifdef USE_RBPS_POOL
826 cpuaddr = pci_pool_alloc(he_dev->rbps_pool, SLAB_KERNEL|SLAB_DMA, &dma_handle);
827 if (cpuaddr == NULL)
828 return -ENOMEM;
829 #else
830 cpuaddr = he_dev->rbps_pages + (i * CONFIG_RBPS_BUFSIZE);
831 dma_handle = he_dev->rbps_pages_phys + (i * CONFIG_RBPS_BUFSIZE);
832 #endif
834 he_dev->rbps_virt[i].virt = cpuaddr;
835 he_dev->rbps_base[i].status = RBP_LOANED | RBP_SMALLBUF | (i << RBP_INDEX_OFF);
836 he_dev->rbps_base[i].phys = dma_handle;
839 he_dev->rbps_tail = &he_dev->rbps_base[CONFIG_RBPS_SIZE - 1];
841 he_writel(he_dev, he_dev->rbps_phys, G0_RBPS_S + (group * 32));
842 he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail),
843 G0_RBPS_T + (group * 32));
844 he_writel(he_dev, CONFIG_RBPS_BUFSIZE/4,
845 G0_RBPS_BS + (group * 32));
846 he_writel(he_dev,
847 RBP_THRESH(CONFIG_RBPS_THRESH) |
848 RBP_QSIZE(CONFIG_RBPS_SIZE - 1) |
849 RBP_INT_ENB,
850 G0_RBPS_QI + (group * 32));
851 #else /* !USE_RBPS */
852 he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32));
853 he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32));
854 he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32));
855 he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
856 G0_RBPS_BS + (group * 32));
857 #endif /* USE_RBPS */
859 /* large buffer pool */
860 #ifdef USE_RBPL_POOL
861 he_dev->rbpl_pool = pci_pool_create("rbpl", he_dev->pci_dev,
862 CONFIG_RBPL_BUFSIZE, 8, 0);
863 if (he_dev->rbpl_pool == NULL) {
864 hprintk("unable to create rbpl pool\n");
865 return -ENOMEM;
867 #else /* !USE_RBPL_POOL */
868 he_dev->rbpl_pages = (void *) pci_alloc_consistent(he_dev->pci_dev,
869 CONFIG_RBPL_SIZE * CONFIG_RBPL_BUFSIZE, &he_dev->rbpl_pages_phys);
870 if (he_dev->rbpl_pages == NULL) {
871 hprintk("unable to create rbpl pages\n");
872 return -ENOMEM;
874 #endif /* USE_RBPL_POOL */
876 he_dev->rbpl_base = pci_alloc_consistent(he_dev->pci_dev,
877 CONFIG_RBPL_SIZE * sizeof(struct he_rbp), &he_dev->rbpl_phys);
878 if (he_dev->rbpl_base == NULL) {
879 hprintk("failed to alloc rbpl\n");
880 return -ENOMEM;
882 memset(he_dev->rbpl_base, 0, CONFIG_RBPL_SIZE * sizeof(struct he_rbp));
883 he_dev->rbpl_virt = kmalloc(CONFIG_RBPL_SIZE * sizeof(struct he_virt), GFP_KERNEL);
885 for (i = 0; i < CONFIG_RBPL_SIZE; ++i) {
886 dma_addr_t dma_handle;
887 void *cpuaddr;
889 #ifdef USE_RBPL_POOL
890 cpuaddr = pci_pool_alloc(he_dev->rbpl_pool, SLAB_KERNEL|SLAB_DMA, &dma_handle);
891 if (cpuaddr == NULL)
892 return -ENOMEM;
893 #else
894 cpuaddr = he_dev->rbpl_pages + (i * CONFIG_RBPL_BUFSIZE);
895 dma_handle = he_dev->rbpl_pages_phys + (i * CONFIG_RBPL_BUFSIZE);
896 #endif
898 he_dev->rbpl_virt[i].virt = cpuaddr;
899 he_dev->rbpl_base[i].status = RBP_LOANED | (i << RBP_INDEX_OFF);
900 he_dev->rbpl_base[i].phys = dma_handle;
902 he_dev->rbpl_tail = &he_dev->rbpl_base[CONFIG_RBPL_SIZE - 1];
904 he_writel(he_dev, he_dev->rbpl_phys, G0_RBPL_S + (group * 32));
905 he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail),
906 G0_RBPL_T + (group * 32));
907 he_writel(he_dev, CONFIG_RBPL_BUFSIZE/4,
908 G0_RBPL_BS + (group * 32));
909 he_writel(he_dev,
910 RBP_THRESH(CONFIG_RBPL_THRESH) |
911 RBP_QSIZE(CONFIG_RBPL_SIZE - 1) |
912 RBP_INT_ENB,
913 G0_RBPL_QI + (group * 32));
915 /* rx buffer ready queue */
917 he_dev->rbrq_base = pci_alloc_consistent(he_dev->pci_dev,
918 CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq), &he_dev->rbrq_phys);
919 if (he_dev->rbrq_base == NULL) {
920 hprintk("failed to allocate rbrq\n");
921 return -ENOMEM;
923 memset(he_dev->rbrq_base, 0, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq));
925 he_dev->rbrq_head = he_dev->rbrq_base;
926 he_writel(he_dev, he_dev->rbrq_phys, G0_RBRQ_ST + (group * 16));
927 he_writel(he_dev, 0, G0_RBRQ_H + (group * 16));
928 he_writel(he_dev,
929 RBRQ_THRESH(CONFIG_RBRQ_THRESH) | RBRQ_SIZE(CONFIG_RBRQ_SIZE - 1),
930 G0_RBRQ_Q + (group * 16));
931 if (irq_coalesce) {
932 hprintk("coalescing interrupts\n");
933 he_writel(he_dev, RBRQ_TIME(768) | RBRQ_COUNT(7),
934 G0_RBRQ_I + (group * 16));
935 } else
936 he_writel(he_dev, RBRQ_TIME(0) | RBRQ_COUNT(1),
937 G0_RBRQ_I + (group * 16));
939 /* tx buffer ready queue */
941 he_dev->tbrq_base = pci_alloc_consistent(he_dev->pci_dev,
942 CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq), &he_dev->tbrq_phys);
943 if (he_dev->tbrq_base == NULL) {
944 hprintk("failed to allocate tbrq\n");
945 return -ENOMEM;
947 memset(he_dev->tbrq_base, 0, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq));
949 he_dev->tbrq_head = he_dev->tbrq_base;
951 he_writel(he_dev, he_dev->tbrq_phys, G0_TBRQ_B_T + (group * 16));
952 he_writel(he_dev, 0, G0_TBRQ_H + (group * 16));
953 he_writel(he_dev, CONFIG_TBRQ_SIZE - 1, G0_TBRQ_S + (group * 16));
954 he_writel(he_dev, CONFIG_TBRQ_THRESH, G0_TBRQ_THRESH + (group * 16));
956 return 0;
959 static int __init
960 he_init_irq(struct he_dev *he_dev)
962 int i;
964 /* 2.9.3.5 tail offset for each interrupt queue is located after the
965 end of the interrupt queue */
967 he_dev->irq_base = pci_alloc_consistent(he_dev->pci_dev,
968 (CONFIG_IRQ_SIZE+1) * sizeof(struct he_irq), &he_dev->irq_phys);
969 if (he_dev->irq_base == NULL) {
970 hprintk("failed to allocate irq\n");
971 return -ENOMEM;
973 he_dev->irq_tailoffset = (unsigned *)
974 &he_dev->irq_base[CONFIG_IRQ_SIZE];
975 *he_dev->irq_tailoffset = 0;
976 he_dev->irq_head = he_dev->irq_base;
977 he_dev->irq_tail = he_dev->irq_base;
979 for (i = 0; i < CONFIG_IRQ_SIZE; ++i)
980 he_dev->irq_base[i].isw = ITYPE_INVALID;
982 he_writel(he_dev, he_dev->irq_phys, IRQ0_BASE);
983 he_writel(he_dev,
984 IRQ_SIZE(CONFIG_IRQ_SIZE) | IRQ_THRESH(CONFIG_IRQ_THRESH),
985 IRQ0_HEAD);
986 he_writel(he_dev, IRQ_INT_A | IRQ_TYPE_LINE, IRQ0_CNTL);
987 he_writel(he_dev, 0x0, IRQ0_DATA);
989 he_writel(he_dev, 0x0, IRQ1_BASE);
990 he_writel(he_dev, 0x0, IRQ1_HEAD);
991 he_writel(he_dev, 0x0, IRQ1_CNTL);
992 he_writel(he_dev, 0x0, IRQ1_DATA);
994 he_writel(he_dev, 0x0, IRQ2_BASE);
995 he_writel(he_dev, 0x0, IRQ2_HEAD);
996 he_writel(he_dev, 0x0, IRQ2_CNTL);
997 he_writel(he_dev, 0x0, IRQ2_DATA);
999 he_writel(he_dev, 0x0, IRQ3_BASE);
1000 he_writel(he_dev, 0x0, IRQ3_HEAD);
1001 he_writel(he_dev, 0x0, IRQ3_CNTL);
1002 he_writel(he_dev, 0x0, IRQ3_DATA);
1004 /* 2.9.3.2 interrupt queue mapping registers */
1006 he_writel(he_dev, 0x0, GRP_10_MAP);
1007 he_writel(he_dev, 0x0, GRP_32_MAP);
1008 he_writel(he_dev, 0x0, GRP_54_MAP);
1009 he_writel(he_dev, 0x0, GRP_76_MAP);
1011 if (request_irq(he_dev->pci_dev->irq, he_irq_handler, SA_INTERRUPT|SA_SHIRQ, DEV_LABEL, he_dev)) {
1012 hprintk("irq %d already in use\n", he_dev->pci_dev->irq);
1013 return -EINVAL;
1016 he_dev->irq = he_dev->pci_dev->irq;
1018 return 0;
1021 static int __init
1022 he_start(struct atm_dev *dev)
1024 struct he_dev *he_dev;
1025 struct pci_dev *pci_dev;
1026 unsigned long membase;
1028 u16 command;
1029 u32 gen_cntl_0, host_cntl, lb_swap;
1030 u8 cache_size, timer;
1032 unsigned err;
1033 unsigned int status, reg;
1034 int i, group;
1036 he_dev = HE_DEV(dev);
1037 pci_dev = he_dev->pci_dev;
1039 membase = pci_resource_start(pci_dev, 0);
1040 HPRINTK("membase = 0x%lx irq = %d.\n", membase, pci_dev->irq);
1043 * pci bus controller initialization
1046 /* 4.3 pci bus controller-specific initialization */
1047 if (pci_read_config_dword(pci_dev, GEN_CNTL_0, &gen_cntl_0) != 0) {
1048 hprintk("can't read GEN_CNTL_0\n");
1049 return -EINVAL;
1051 gen_cntl_0 |= (MRL_ENB | MRM_ENB | IGNORE_TIMEOUT);
1052 if (pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0) != 0) {
1053 hprintk("can't write GEN_CNTL_0.\n");
1054 return -EINVAL;
1057 if (pci_read_config_word(pci_dev, PCI_COMMAND, &command) != 0) {
1058 hprintk("can't read PCI_COMMAND.\n");
1059 return -EINVAL;
1062 command |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE);
1063 if (pci_write_config_word(pci_dev, PCI_COMMAND, command) != 0) {
1064 hprintk("can't enable memory.\n");
1065 return -EINVAL;
1068 if (pci_read_config_byte(pci_dev, PCI_CACHE_LINE_SIZE, &cache_size)) {
1069 hprintk("can't read cache line size?\n");
1070 return -EINVAL;
1073 if (cache_size < 16) {
1074 cache_size = 16;
1075 if (pci_write_config_byte(pci_dev, PCI_CACHE_LINE_SIZE, cache_size))
1076 hprintk("can't set cache line size to %d\n", cache_size);
1079 if (pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &timer)) {
1080 hprintk("can't read latency timer?\n");
1081 return -EINVAL;
1084 /* from table 3.9
1086 * LAT_TIMER = 1 + AVG_LAT + BURST_SIZE/BUS_SIZE
1088 * AVG_LAT: The average first data read/write latency [maximum 16 clock cycles]
1089 * BURST_SIZE: 1536 bytes (read) for 622, 768 bytes (read) for 155 [192 clock cycles]
1092 #define LAT_TIMER 209
1093 if (timer < LAT_TIMER) {
1094 HPRINTK("latency timer was %d, setting to %d\n", timer, LAT_TIMER);
1095 timer = LAT_TIMER;
1096 if (pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, timer))
1097 hprintk("can't set latency timer to %d\n", timer);
1100 if (!(he_dev->membase = ioremap(membase, HE_REGMAP_SIZE))) {
1101 hprintk("can't set up page mapping\n");
1102 return -EINVAL;
1105 /* 4.4 card reset */
1106 he_writel(he_dev, 0x0, RESET_CNTL);
1107 he_writel(he_dev, 0xff, RESET_CNTL);
1109 udelay(16*1000); /* 16 ms */
1110 status = he_readl(he_dev, RESET_CNTL);
1111 if ((status & BOARD_RST_STATUS) == 0) {
1112 hprintk("reset failed\n");
1113 return -EINVAL;
1116 /* 4.5 set bus width */
1117 host_cntl = he_readl(he_dev, HOST_CNTL);
1118 if (host_cntl & PCI_BUS_SIZE64)
1119 gen_cntl_0 |= ENBL_64;
1120 else
1121 gen_cntl_0 &= ~ENBL_64;
1123 if (disable64 == 1) {
1124 hprintk("disabling 64-bit pci bus transfers\n");
1125 gen_cntl_0 &= ~ENBL_64;
1128 if (gen_cntl_0 & ENBL_64)
1129 hprintk("64-bit transfers enabled\n");
1131 pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1133 /* 4.7 read prom contents */
1134 for (i = 0; i < PROD_ID_LEN; ++i)
1135 he_dev->prod_id[i] = read_prom_byte(he_dev, PROD_ID + i);
1137 he_dev->media = read_prom_byte(he_dev, MEDIA);
1139 for (i = 0; i < 6; ++i)
1140 dev->esi[i] = read_prom_byte(he_dev, MAC_ADDR + i);
1142 hprintk("%s%s, %x:%x:%x:%x:%x:%x\n",
1143 he_dev->prod_id,
1144 he_dev->media & 0x40 ? "SM" : "MM",
1145 dev->esi[0],
1146 dev->esi[1],
1147 dev->esi[2],
1148 dev->esi[3],
1149 dev->esi[4],
1150 dev->esi[5]);
1151 he_dev->atm_dev->link_rate = he_is622(he_dev) ?
1152 ATM_OC12_PCR : ATM_OC3_PCR;
1154 /* 4.6 set host endianess */
1155 lb_swap = he_readl(he_dev, LB_SWAP);
1156 if (he_is622(he_dev))
1157 lb_swap &= ~XFER_SIZE; /* 4 cells */
1158 else
1159 lb_swap |= XFER_SIZE; /* 8 cells */
1160 #ifdef __BIG_ENDIAN
1161 lb_swap |= DESC_WR_SWAP | INTR_SWAP | BIG_ENDIAN_HOST;
1162 #else
1163 lb_swap &= ~(DESC_WR_SWAP | INTR_SWAP | BIG_ENDIAN_HOST |
1164 DATA_WR_SWAP | DATA_RD_SWAP | DESC_RD_SWAP);
1165 #endif /* __BIG_ENDIAN */
1166 he_writel(he_dev, lb_swap, LB_SWAP);
1168 /* 4.8 sdram controller initialization */
1169 he_writel(he_dev, he_is622(he_dev) ? LB_64_ENB : 0x0, SDRAM_CTL);
1171 /* 4.9 initialize rnum value */
1172 lb_swap |= SWAP_RNUM_MAX(0xf);
1173 he_writel(he_dev, lb_swap, LB_SWAP);
1175 /* 4.10 initialize the interrupt queues */
1176 if ((err = he_init_irq(he_dev)) != 0)
1177 return err;
1179 #ifdef USE_TASKLET
1180 tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev);
1181 #endif
1182 spin_lock_init(&he_dev->global_lock);
1184 /* 4.11 enable pci bus controller state machines */
1185 host_cntl |= (OUTFF_ENB | CMDFF_ENB |
1186 QUICK_RD_RETRY | QUICK_WR_RETRY | PERR_INT_ENB);
1187 he_writel(he_dev, host_cntl, HOST_CNTL);
1189 gen_cntl_0 |= INT_PROC_ENBL|INIT_ENB;
1190 pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1193 * atm network controller initialization
1196 /* 5.1.1 generic configuration state */
1199 * local (cell) buffer memory map
1201 * HE155 HE622
1203 * 0 ____________1023 bytes 0 _______________________2047 bytes
1204 * | | | | |
1205 * | utility | | rx0 | |
1206 * 5|____________| 255|___________________| u |
1207 * 6| | 256| | t |
1208 * | | | | i |
1209 * | rx0 | row | tx | l |
1210 * | | | | i |
1211 * | | 767|___________________| t |
1212 * 517|____________| 768| | y |
1213 * row 518| | | rx1 | |
1214 * | | 1023|___________________|___|
1215 * | |
1216 * | tx |
1217 * | |
1218 * | |
1219 * 1535|____________|
1220 * 1536| |
1221 * | rx1 |
1222 * 2047|____________|
1226 /* total 4096 connections */
1227 he_dev->vcibits = CONFIG_DEFAULT_VCIBITS;
1228 he_dev->vpibits = CONFIG_DEFAULT_VPIBITS;
1230 if (nvpibits != -1 && nvcibits != -1 && nvpibits+nvcibits != HE_MAXCIDBITS) {
1231 hprintk("nvpibits + nvcibits != %d\n", HE_MAXCIDBITS);
1232 return -ENODEV;
1235 if (nvpibits != -1) {
1236 he_dev->vpibits = nvpibits;
1237 he_dev->vcibits = HE_MAXCIDBITS - nvpibits;
1240 if (nvcibits != -1) {
1241 he_dev->vcibits = nvcibits;
1242 he_dev->vpibits = HE_MAXCIDBITS - nvcibits;
1246 if (he_is622(he_dev)) {
1247 he_dev->cells_per_row = 40;
1248 he_dev->bytes_per_row = 2048;
1249 he_dev->r0_numrows = 256;
1250 he_dev->tx_numrows = 512;
1251 he_dev->r1_numrows = 256;
1252 he_dev->r0_startrow = 0;
1253 he_dev->tx_startrow = 256;
1254 he_dev->r1_startrow = 768;
1255 } else {
1256 he_dev->cells_per_row = 20;
1257 he_dev->bytes_per_row = 1024;
1258 he_dev->r0_numrows = 512;
1259 he_dev->tx_numrows = 1018;
1260 he_dev->r1_numrows = 512;
1261 he_dev->r0_startrow = 6;
1262 he_dev->tx_startrow = 518;
1263 he_dev->r1_startrow = 1536;
1266 he_dev->cells_per_lbuf = 4;
1267 he_dev->buffer_limit = 4;
1268 he_dev->r0_numbuffs = he_dev->r0_numrows *
1269 he_dev->cells_per_row / he_dev->cells_per_lbuf;
1270 if (he_dev->r0_numbuffs > 2560)
1271 he_dev->r0_numbuffs = 2560;
1273 he_dev->r1_numbuffs = he_dev->r1_numrows *
1274 he_dev->cells_per_row / he_dev->cells_per_lbuf;
1275 if (he_dev->r1_numbuffs > 2560)
1276 he_dev->r1_numbuffs = 2560;
1278 he_dev->tx_numbuffs = he_dev->tx_numrows *
1279 he_dev->cells_per_row / he_dev->cells_per_lbuf;
1280 if (he_dev->tx_numbuffs > 5120)
1281 he_dev->tx_numbuffs = 5120;
1283 /* 5.1.2 configure hardware dependent registers */
1285 he_writel(he_dev,
1286 SLICE_X(0x2) | ARB_RNUM_MAX(0xf) | TH_PRTY(0x3) |
1287 RH_PRTY(0x3) | TL_PRTY(0x2) | RL_PRTY(0x1) |
1288 (he_is622(he_dev) ? BUS_MULTI(0x28) : BUS_MULTI(0x46)) |
1289 (he_is622(he_dev) ? NET_PREF(0x50) : NET_PREF(0x8c)),
1290 LBARB);
1292 he_writel(he_dev, BANK_ON |
1293 (he_is622(he_dev) ? (REF_RATE(0x384) | WIDE_DATA) : REF_RATE(0x150)),
1294 SDRAMCON);
1296 he_writel(he_dev,
1297 (he_is622(he_dev) ? RM_BANK_WAIT(1) : RM_BANK_WAIT(0)) |
1298 RM_RW_WAIT(1), RCMCONFIG);
1299 he_writel(he_dev,
1300 (he_is622(he_dev) ? TM_BANK_WAIT(2) : TM_BANK_WAIT(1)) |
1301 TM_RW_WAIT(1), TCMCONFIG);
1303 he_writel(he_dev, he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD, LB_CONFIG);
1305 he_writel(he_dev,
1306 (he_is622(he_dev) ? UT_RD_DELAY(8) : UT_RD_DELAY(0)) |
1307 (he_is622(he_dev) ? RC_UT_MODE(0) : RC_UT_MODE(1)) |
1308 RX_VALVP(he_dev->vpibits) |
1309 RX_VALVC(he_dev->vcibits), RC_CONFIG);
1311 he_writel(he_dev, DRF_THRESH(0x20) |
1312 (he_is622(he_dev) ? TX_UT_MODE(0) : TX_UT_MODE(1)) |
1313 TX_VCI_MASK(he_dev->vcibits) |
1314 LBFREE_CNT(he_dev->tx_numbuffs), TX_CONFIG);
1316 he_writel(he_dev, 0x0, TXAAL5_PROTO);
1318 he_writel(he_dev, PHY_INT_ENB |
1319 (he_is622(he_dev) ? PTMR_PRE(67 - 1) : PTMR_PRE(50 - 1)),
1320 RH_CONFIG);
1322 /* 5.1.3 initialize connection memory */
1324 for (i = 0; i < TCM_MEM_SIZE; ++i)
1325 he_writel_tcm(he_dev, 0, i);
1327 for (i = 0; i < RCM_MEM_SIZE; ++i)
1328 he_writel_rcm(he_dev, 0, i);
1331 * transmit connection memory map
1333 * tx memory
1334 * 0x0 ___________________
1335 * | |
1336 * | |
1337 * | TSRa |
1338 * | |
1339 * | |
1340 * 0x8000|___________________|
1341 * | |
1342 * | TSRb |
1343 * 0xc000|___________________|
1344 * | |
1345 * | TSRc |
1346 * 0xe000|___________________|
1347 * | TSRd |
1348 * 0xf000|___________________|
1349 * | tmABR |
1350 * 0x10000|___________________|
1351 * | |
1352 * | tmTPD |
1353 * |___________________|
1354 * | |
1355 * ....
1356 * 0x1ffff|___________________|
1361 he_writel(he_dev, CONFIG_TSRB, TSRB_BA);
1362 he_writel(he_dev, CONFIG_TSRC, TSRC_BA);
1363 he_writel(he_dev, CONFIG_TSRD, TSRD_BA);
1364 he_writel(he_dev, CONFIG_TMABR, TMABR_BA);
1365 he_writel(he_dev, CONFIG_TPDBA, TPD_BA);
1369 * receive connection memory map
1371 * 0x0 ___________________
1372 * | |
1373 * | |
1374 * | RSRa |
1375 * | |
1376 * | |
1377 * 0x8000|___________________|
1378 * | |
1379 * | rx0/1 |
1380 * | LBM | link lists of local
1381 * | tx | buffer memory
1382 * | |
1383 * 0xd000|___________________|
1384 * | |
1385 * | rmABR |
1386 * 0xe000|___________________|
1387 * | |
1388 * | RSRb |
1389 * |___________________|
1390 * | |
1391 * ....
1392 * 0xffff|___________________|
1395 he_writel(he_dev, 0x08000, RCMLBM_BA);
1396 he_writel(he_dev, 0x0e000, RCMRSRB_BA);
1397 he_writel(he_dev, 0x0d800, RCMABR_BA);
1399 /* 5.1.4 initialize local buffer free pools linked lists */
1401 he_init_rx_lbfp0(he_dev);
1402 he_init_rx_lbfp1(he_dev);
1404 he_writel(he_dev, 0x0, RLBC_H);
1405 he_writel(he_dev, 0x0, RLBC_T);
1406 he_writel(he_dev, 0x0, RLBC_H2);
1408 he_writel(he_dev, 512, RXTHRSH); /* 10% of r0+r1 buffers */
1409 he_writel(he_dev, 256, LITHRSH); /* 5% of r0+r1 buffers */
1411 he_init_tx_lbfp(he_dev);
1413 he_writel(he_dev, he_is622(he_dev) ? 0x104780 : 0x800, UBUFF_BA);
1415 /* 5.1.5 initialize intermediate receive queues */
1417 if (he_is622(he_dev)) {
1418 he_writel(he_dev, 0x000f, G0_INMQ_S);
1419 he_writel(he_dev, 0x200f, G0_INMQ_L);
1421 he_writel(he_dev, 0x001f, G1_INMQ_S);
1422 he_writel(he_dev, 0x201f, G1_INMQ_L);
1424 he_writel(he_dev, 0x002f, G2_INMQ_S);
1425 he_writel(he_dev, 0x202f, G2_INMQ_L);
1427 he_writel(he_dev, 0x003f, G3_INMQ_S);
1428 he_writel(he_dev, 0x203f, G3_INMQ_L);
1430 he_writel(he_dev, 0x004f, G4_INMQ_S);
1431 he_writel(he_dev, 0x204f, G4_INMQ_L);
1433 he_writel(he_dev, 0x005f, G5_INMQ_S);
1434 he_writel(he_dev, 0x205f, G5_INMQ_L);
1436 he_writel(he_dev, 0x006f, G6_INMQ_S);
1437 he_writel(he_dev, 0x206f, G6_INMQ_L);
1439 he_writel(he_dev, 0x007f, G7_INMQ_S);
1440 he_writel(he_dev, 0x207f, G7_INMQ_L);
1441 } else {
1442 he_writel(he_dev, 0x0000, G0_INMQ_S);
1443 he_writel(he_dev, 0x0008, G0_INMQ_L);
1445 he_writel(he_dev, 0x0001, G1_INMQ_S);
1446 he_writel(he_dev, 0x0009, G1_INMQ_L);
1448 he_writel(he_dev, 0x0002, G2_INMQ_S);
1449 he_writel(he_dev, 0x000a, G2_INMQ_L);
1451 he_writel(he_dev, 0x0003, G3_INMQ_S);
1452 he_writel(he_dev, 0x000b, G3_INMQ_L);
1454 he_writel(he_dev, 0x0004, G4_INMQ_S);
1455 he_writel(he_dev, 0x000c, G4_INMQ_L);
1457 he_writel(he_dev, 0x0005, G5_INMQ_S);
1458 he_writel(he_dev, 0x000d, G5_INMQ_L);
1460 he_writel(he_dev, 0x0006, G6_INMQ_S);
1461 he_writel(he_dev, 0x000e, G6_INMQ_L);
1463 he_writel(he_dev, 0x0007, G7_INMQ_S);
1464 he_writel(he_dev, 0x000f, G7_INMQ_L);
1467 /* 5.1.6 application tunable parameters */
1469 he_writel(he_dev, 0x0, MCC);
1470 he_writel(he_dev, 0x0, OEC);
1471 he_writel(he_dev, 0x0, DCC);
1472 he_writel(he_dev, 0x0, CEC);
1474 /* 5.1.7 cs block initialization */
1476 he_init_cs_block(he_dev);
1478 /* 5.1.8 cs block connection memory initialization */
1480 if (he_init_cs_block_rcm(he_dev) < 0)
1481 return -ENOMEM;
1483 /* 5.1.10 initialize host structures */
1485 he_init_tpdrq(he_dev);
1487 #ifdef USE_TPD_POOL
1488 he_dev->tpd_pool = pci_pool_create("tpd", he_dev->pci_dev,
1489 sizeof(struct he_tpd), TPD_ALIGNMENT, 0);
1490 if (he_dev->tpd_pool == NULL) {
1491 hprintk("unable to create tpd pci_pool\n");
1492 return -ENOMEM;
1495 INIT_LIST_HEAD(&he_dev->outstanding_tpds);
1496 #else
1497 he_dev->tpd_base = (void *) pci_alloc_consistent(he_dev->pci_dev,
1498 CONFIG_NUMTPDS * sizeof(struct he_tpd), &he_dev->tpd_base_phys);
1499 if (!he_dev->tpd_base)
1500 return -ENOMEM;
1502 for (i = 0; i < CONFIG_NUMTPDS; ++i) {
1503 he_dev->tpd_base[i].status = (i << TPD_ADDR_SHIFT);
1504 he_dev->tpd_base[i].inuse = 0;
1507 he_dev->tpd_head = he_dev->tpd_base;
1508 he_dev->tpd_end = &he_dev->tpd_base[CONFIG_NUMTPDS - 1];
1509 #endif
1511 if (he_init_group(he_dev, 0) != 0)
1512 return -ENOMEM;
1514 for (group = 1; group < HE_NUM_GROUPS; ++group) {
1515 he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32));
1516 he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32));
1517 he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32));
1518 he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
1519 G0_RBPS_BS + (group * 32));
1521 he_writel(he_dev, 0x0, G0_RBPL_S + (group * 32));
1522 he_writel(he_dev, 0x0, G0_RBPL_T + (group * 32));
1523 he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
1524 G0_RBPL_QI + (group * 32));
1525 he_writel(he_dev, 0x0, G0_RBPL_BS + (group * 32));
1527 he_writel(he_dev, 0x0, G0_RBRQ_ST + (group * 16));
1528 he_writel(he_dev, 0x0, G0_RBRQ_H + (group * 16));
1529 he_writel(he_dev, RBRQ_THRESH(0x1) | RBRQ_SIZE(0x0),
1530 G0_RBRQ_Q + (group * 16));
1531 he_writel(he_dev, 0x0, G0_RBRQ_I + (group * 16));
1533 he_writel(he_dev, 0x0, G0_TBRQ_B_T + (group * 16));
1534 he_writel(he_dev, 0x0, G0_TBRQ_H + (group * 16));
1535 he_writel(he_dev, TBRQ_THRESH(0x1),
1536 G0_TBRQ_THRESH + (group * 16));
1537 he_writel(he_dev, 0x0, G0_TBRQ_S + (group * 16));
1540 /* host status page */
1542 he_dev->hsp = pci_alloc_consistent(he_dev->pci_dev,
1543 sizeof(struct he_hsp), &he_dev->hsp_phys);
1544 if (he_dev->hsp == NULL) {
1545 hprintk("failed to allocate host status page\n");
1546 return -ENOMEM;
1548 memset(he_dev->hsp, 0, sizeof(struct he_hsp));
1549 he_writel(he_dev, he_dev->hsp_phys, HSP_BA);
1551 /* initialize framer */
1553 #ifdef CONFIG_ATM_HE_USE_SUNI
1554 suni_init(he_dev->atm_dev);
1555 if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start)
1556 he_dev->atm_dev->phy->start(he_dev->atm_dev);
1557 #endif /* CONFIG_ATM_HE_USE_SUNI */
1559 if (sdh) {
1560 /* this really should be in suni.c but for now... */
1561 int val;
1563 val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM);
1564 val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT);
1565 he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM);
1568 /* 5.1.12 enable transmit and receive */
1570 reg = he_readl_mbox(he_dev, CS_ERCTL0);
1571 reg |= TX_ENABLE|ER_ENABLE;
1572 he_writel_mbox(he_dev, reg, CS_ERCTL0);
1574 reg = he_readl(he_dev, RC_CONFIG);
1575 reg |= RX_ENABLE;
1576 he_writel(he_dev, reg, RC_CONFIG);
1578 for (i = 0; i < HE_NUM_CS_STPER; ++i) {
1579 he_dev->cs_stper[i].inuse = 0;
1580 he_dev->cs_stper[i].pcr = -1;
1582 he_dev->total_bw = 0;
1585 /* atm linux initialization */
1587 he_dev->atm_dev->ci_range.vpi_bits = he_dev->vpibits;
1588 he_dev->atm_dev->ci_range.vci_bits = he_dev->vcibits;
1590 he_dev->irq_peak = 0;
1591 he_dev->rbrq_peak = 0;
1592 he_dev->rbpl_peak = 0;
1593 he_dev->tbrq_peak = 0;
1595 HPRINTK("hell bent for leather!\n");
1597 return 0;
1600 static void
1601 he_stop(struct he_dev *he_dev)
1603 u16 command;
1604 u32 gen_cntl_0, reg;
1605 struct pci_dev *pci_dev;
1607 pci_dev = he_dev->pci_dev;
1609 /* disable interrupts */
1611 if (he_dev->membase) {
1612 pci_read_config_dword(pci_dev, GEN_CNTL_0, &gen_cntl_0);
1613 gen_cntl_0 &= ~(INT_PROC_ENBL | INIT_ENB);
1614 pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
1616 #ifdef USE_TASKLET
1617 tasklet_disable(&he_dev->tasklet);
1618 #endif
1620 /* disable recv and transmit */
1622 reg = he_readl_mbox(he_dev, CS_ERCTL0);
1623 reg &= ~(TX_ENABLE|ER_ENABLE);
1624 he_writel_mbox(he_dev, reg, CS_ERCTL0);
1626 reg = he_readl(he_dev, RC_CONFIG);
1627 reg &= ~(RX_ENABLE);
1628 he_writel(he_dev, reg, RC_CONFIG);
1631 #ifdef CONFIG_ATM_HE_USE_SUNI
1632 if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->stop)
1633 he_dev->atm_dev->phy->stop(he_dev->atm_dev);
1634 #endif /* CONFIG_ATM_HE_USE_SUNI */
1636 if (he_dev->irq)
1637 free_irq(he_dev->irq, he_dev);
1639 if (he_dev->irq_base)
1640 pci_free_consistent(he_dev->pci_dev, (CONFIG_IRQ_SIZE+1)
1641 * sizeof(struct he_irq), he_dev->irq_base, he_dev->irq_phys);
1643 if (he_dev->hsp)
1644 pci_free_consistent(he_dev->pci_dev, sizeof(struct he_hsp),
1645 he_dev->hsp, he_dev->hsp_phys);
1647 if (he_dev->rbpl_base) {
1648 #ifdef USE_RBPL_POOL
1649 for (i = 0; i < CONFIG_RBPL_SIZE; ++i) {
1650 void *cpuaddr = he_dev->rbpl_virt[i].virt;
1651 dma_addr_t dma_handle = he_dev->rbpl_base[i].phys;
1653 pci_pool_free(he_dev->rbpl_pool, cpuaddr, dma_handle);
1655 #else
1656 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
1657 * CONFIG_RBPL_BUFSIZE, he_dev->rbpl_pages, he_dev->rbpl_pages_phys);
1658 #endif
1659 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
1660 * sizeof(struct he_rbp), he_dev->rbpl_base, he_dev->rbpl_phys);
1663 #ifdef USE_RBPL_POOL
1664 if (he_dev->rbpl_pool)
1665 pci_pool_destroy(he_dev->rbpl_pool);
1666 #endif
1668 #ifdef USE_RBPS
1669 if (he_dev->rbps_base) {
1670 #ifdef USE_RBPS_POOL
1671 for (i = 0; i < CONFIG_RBPS_SIZE; ++i) {
1672 void *cpuaddr = he_dev->rbps_virt[i].virt;
1673 dma_addr_t dma_handle = he_dev->rbps_base[i].phys;
1675 pci_pool_free(he_dev->rbps_pool, cpuaddr, dma_handle);
1677 #else
1678 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
1679 * CONFIG_RBPS_BUFSIZE, he_dev->rbps_pages, he_dev->rbps_pages_phys);
1680 #endif
1681 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
1682 * sizeof(struct he_rbp), he_dev->rbps_base, he_dev->rbps_phys);
1685 #ifdef USE_RBPS_POOL
1686 if (he_dev->rbps_pool)
1687 pci_pool_destroy(he_dev->rbps_pool);
1688 #endif
1690 #endif /* USE_RBPS */
1692 if (he_dev->rbrq_base)
1693 pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq),
1694 he_dev->rbrq_base, he_dev->rbrq_phys);
1696 if (he_dev->tbrq_base)
1697 pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
1698 he_dev->tbrq_base, he_dev->tbrq_phys);
1700 if (he_dev->tpdrq_base)
1701 pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
1702 he_dev->tpdrq_base, he_dev->tpdrq_phys);
1704 #ifdef USE_TPD_POOL
1705 if (he_dev->tpd_pool)
1706 pci_pool_destroy(he_dev->tpd_pool);
1707 #else
1708 if (he_dev->tpd_base)
1709 pci_free_consistent(he_dev->pci_dev, CONFIG_NUMTPDS * sizeof(struct he_tpd),
1710 he_dev->tpd_base, he_dev->tpd_base_phys);
1711 #endif
1713 if (he_dev->pci_dev) {
1714 pci_read_config_word(he_dev->pci_dev, PCI_COMMAND, &command);
1715 command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
1716 pci_write_config_word(he_dev->pci_dev, PCI_COMMAND, command);
1719 if (he_dev->membase)
1720 iounmap(he_dev->membase);
1723 static struct he_tpd *
1724 __alloc_tpd(struct he_dev *he_dev)
1726 #ifdef USE_TPD_POOL
1727 struct he_tpd *tpd;
1728 dma_addr_t dma_handle;
1730 tpd = pci_pool_alloc(he_dev->tpd_pool, SLAB_ATOMIC|SLAB_DMA, &dma_handle);
1731 if (tpd == NULL)
1732 return NULL;
1734 tpd->status = TPD_ADDR(dma_handle);
1735 tpd->reserved = 0;
1736 tpd->iovec[0].addr = 0; tpd->iovec[0].len = 0;
1737 tpd->iovec[1].addr = 0; tpd->iovec[1].len = 0;
1738 tpd->iovec[2].addr = 0; tpd->iovec[2].len = 0;
1740 return tpd;
1741 #else
1742 int i;
1744 for (i = 0; i < CONFIG_NUMTPDS; ++i) {
1745 ++he_dev->tpd_head;
1746 if (he_dev->tpd_head > he_dev->tpd_end) {
1747 he_dev->tpd_head = he_dev->tpd_base;
1750 if (!he_dev->tpd_head->inuse) {
1751 he_dev->tpd_head->inuse = 1;
1752 he_dev->tpd_head->status &= TPD_MASK;
1753 he_dev->tpd_head->iovec[0].addr = 0; he_dev->tpd_head->iovec[0].len = 0;
1754 he_dev->tpd_head->iovec[1].addr = 0; he_dev->tpd_head->iovec[1].len = 0;
1755 he_dev->tpd_head->iovec[2].addr = 0; he_dev->tpd_head->iovec[2].len = 0;
1756 return he_dev->tpd_head;
1759 hprintk("out of tpds -- increase CONFIG_NUMTPDS (%d)\n", CONFIG_NUMTPDS);
1760 return NULL;
1761 #endif
1764 #define AAL5_LEN(buf,len) \
1765 ((((unsigned char *)(buf))[(len)-6] << 8) | \
1766 (((unsigned char *)(buf))[(len)-5]))
1768 /* 2.10.1.2 receive
1770 * aal5 packets can optionally return the tcp checksum in the lower
1771 * 16 bits of the crc (RSR0_TCP_CKSUM)
1774 #define TCP_CKSUM(buf,len) \
1775 ((((unsigned char *)(buf))[(len)-2] << 8) | \
1776 (((unsigned char *)(buf))[(len-1)]))
1778 static int
1779 he_service_rbrq(struct he_dev *he_dev, int group)
1781 struct he_rbrq *rbrq_tail = (struct he_rbrq *)
1782 ((unsigned long)he_dev->rbrq_base |
1783 he_dev->hsp->group[group].rbrq_tail);
1784 struct he_rbp *rbp = NULL;
1785 unsigned cid, lastcid = -1;
1786 unsigned buf_len = 0;
1787 struct sk_buff *skb;
1788 struct atm_vcc *vcc = NULL;
1789 struct he_vcc *he_vcc;
1790 struct he_iovec *iov;
1791 int pdus_assembled = 0;
1792 int updated = 0;
1794 read_lock(&vcc_sklist_lock);
1795 while (he_dev->rbrq_head != rbrq_tail) {
1796 ++updated;
1798 HPRINTK("%p rbrq%d 0x%x len=%d cid=0x%x %s%s%s%s%s%s\n",
1799 he_dev->rbrq_head, group,
1800 RBRQ_ADDR(he_dev->rbrq_head),
1801 RBRQ_BUFLEN(he_dev->rbrq_head),
1802 RBRQ_CID(he_dev->rbrq_head),
1803 RBRQ_CRC_ERR(he_dev->rbrq_head) ? " CRC_ERR" : "",
1804 RBRQ_LEN_ERR(he_dev->rbrq_head) ? " LEN_ERR" : "",
1805 RBRQ_END_PDU(he_dev->rbrq_head) ? " END_PDU" : "",
1806 RBRQ_AAL5_PROT(he_dev->rbrq_head) ? " AAL5_PROT" : "",
1807 RBRQ_CON_CLOSED(he_dev->rbrq_head) ? " CON_CLOSED" : "",
1808 RBRQ_HBUF_ERR(he_dev->rbrq_head) ? " HBUF_ERR" : "");
1810 #ifdef USE_RBPS
1811 if (RBRQ_ADDR(he_dev->rbrq_head) & RBP_SMALLBUF)
1812 rbp = &he_dev->rbps_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
1813 else
1814 #endif
1815 rbp = &he_dev->rbpl_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
1817 buf_len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4;
1818 cid = RBRQ_CID(he_dev->rbrq_head);
1820 if (cid != lastcid)
1821 vcc = __find_vcc(he_dev, cid);
1822 lastcid = cid;
1824 if (vcc == NULL) {
1825 hprintk("vcc == NULL (cid 0x%x)\n", cid);
1826 if (!RBRQ_HBUF_ERR(he_dev->rbrq_head))
1827 rbp->status &= ~RBP_LOANED;
1829 goto next_rbrq_entry;
1832 he_vcc = HE_VCC(vcc);
1833 if (he_vcc == NULL) {
1834 hprintk("he_vcc == NULL (cid 0x%x)\n", cid);
1835 if (!RBRQ_HBUF_ERR(he_dev->rbrq_head))
1836 rbp->status &= ~RBP_LOANED;
1837 goto next_rbrq_entry;
1840 if (RBRQ_HBUF_ERR(he_dev->rbrq_head)) {
1841 hprintk("HBUF_ERR! (cid 0x%x)\n", cid);
1842 atomic_inc(&vcc->stats->rx_drop);
1843 goto return_host_buffers;
1846 he_vcc->iov_tail->iov_base = RBRQ_ADDR(he_dev->rbrq_head);
1847 he_vcc->iov_tail->iov_len = buf_len;
1848 he_vcc->pdu_len += buf_len;
1849 ++he_vcc->iov_tail;
1851 if (RBRQ_CON_CLOSED(he_dev->rbrq_head)) {
1852 lastcid = -1;
1853 HPRINTK("wake_up rx_waitq (cid 0x%x)\n", cid);
1854 wake_up(&he_vcc->rx_waitq);
1855 goto return_host_buffers;
1858 #ifdef notdef
1859 if ((he_vcc->iov_tail - he_vcc->iov_head) > HE_MAXIOV) {
1860 hprintk("iovec full! cid 0x%x\n", cid);
1861 goto return_host_buffers;
1863 #endif
1864 if (!RBRQ_END_PDU(he_dev->rbrq_head))
1865 goto next_rbrq_entry;
1867 if (RBRQ_LEN_ERR(he_dev->rbrq_head)
1868 || RBRQ_CRC_ERR(he_dev->rbrq_head)) {
1869 HPRINTK("%s%s (%d.%d)\n",
1870 RBRQ_CRC_ERR(he_dev->rbrq_head)
1871 ? "CRC_ERR " : "",
1872 RBRQ_LEN_ERR(he_dev->rbrq_head)
1873 ? "LEN_ERR" : "",
1874 vcc->vpi, vcc->vci);
1875 atomic_inc(&vcc->stats->rx_err);
1876 goto return_host_buffers;
1879 skb = atm_alloc_charge(vcc, he_vcc->pdu_len + rx_skb_reserve,
1880 GFP_ATOMIC);
1881 if (!skb) {
1882 HPRINTK("charge failed (%d.%d)\n", vcc->vpi, vcc->vci);
1883 goto return_host_buffers;
1886 if (rx_skb_reserve > 0)
1887 skb_reserve(skb, rx_skb_reserve);
1889 __net_timestamp(skb);
1891 for (iov = he_vcc->iov_head;
1892 iov < he_vcc->iov_tail; ++iov) {
1893 #ifdef USE_RBPS
1894 if (iov->iov_base & RBP_SMALLBUF)
1895 memcpy(skb_put(skb, iov->iov_len),
1896 he_dev->rbps_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
1897 else
1898 #endif
1899 memcpy(skb_put(skb, iov->iov_len),
1900 he_dev->rbpl_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
1903 switch (vcc->qos.aal) {
1904 case ATM_AAL0:
1905 /* 2.10.1.5 raw cell receive */
1906 skb->len = ATM_AAL0_SDU;
1907 skb->tail = skb->data + skb->len;
1908 break;
1909 case ATM_AAL5:
1910 /* 2.10.1.2 aal5 receive */
1912 skb->len = AAL5_LEN(skb->data, he_vcc->pdu_len);
1913 skb->tail = skb->data + skb->len;
1914 #ifdef USE_CHECKSUM_HW
1915 if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) {
1916 skb->ip_summed = CHECKSUM_HW;
1917 skb->csum = TCP_CKSUM(skb->data,
1918 he_vcc->pdu_len);
1920 #endif
1921 break;
1924 #ifdef should_never_happen
1925 if (skb->len > vcc->qos.rxtp.max_sdu)
1926 hprintk("pdu_len (%d) > vcc->qos.rxtp.max_sdu (%d)! cid 0x%x\n", skb->len, vcc->qos.rxtp.max_sdu, cid);
1927 #endif
1929 #ifdef notdef
1930 ATM_SKB(skb)->vcc = vcc;
1931 #endif
1932 vcc->push(vcc, skb);
1934 atomic_inc(&vcc->stats->rx);
1936 return_host_buffers:
1937 ++pdus_assembled;
1939 for (iov = he_vcc->iov_head;
1940 iov < he_vcc->iov_tail; ++iov) {
1941 #ifdef USE_RBPS
1942 if (iov->iov_base & RBP_SMALLBUF)
1943 rbp = &he_dev->rbps_base[RBP_INDEX(iov->iov_base)];
1944 else
1945 #endif
1946 rbp = &he_dev->rbpl_base[RBP_INDEX(iov->iov_base)];
1948 rbp->status &= ~RBP_LOANED;
1951 he_vcc->iov_tail = he_vcc->iov_head;
1952 he_vcc->pdu_len = 0;
1954 next_rbrq_entry:
1955 he_dev->rbrq_head = (struct he_rbrq *)
1956 ((unsigned long) he_dev->rbrq_base |
1957 RBRQ_MASK(++he_dev->rbrq_head));
1960 read_unlock(&vcc_sklist_lock);
1962 if (updated) {
1963 if (updated > he_dev->rbrq_peak)
1964 he_dev->rbrq_peak = updated;
1966 he_writel(he_dev, RBRQ_MASK(he_dev->rbrq_head),
1967 G0_RBRQ_H + (group * 16));
1970 return pdus_assembled;
1973 static void
1974 he_service_tbrq(struct he_dev *he_dev, int group)
1976 struct he_tbrq *tbrq_tail = (struct he_tbrq *)
1977 ((unsigned long)he_dev->tbrq_base |
1978 he_dev->hsp->group[group].tbrq_tail);
1979 struct he_tpd *tpd;
1980 int slot, updated = 0;
1981 #ifdef USE_TPD_POOL
1982 struct he_tpd *__tpd;
1983 #endif
1985 /* 2.1.6 transmit buffer return queue */
1987 while (he_dev->tbrq_head != tbrq_tail) {
1988 ++updated;
1990 HPRINTK("tbrq%d 0x%x%s%s\n",
1991 group,
1992 TBRQ_TPD(he_dev->tbrq_head),
1993 TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "",
1994 TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : "");
1995 #ifdef USE_TPD_POOL
1996 tpd = NULL;
1997 list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) {
1998 if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) {
1999 tpd = __tpd;
2000 list_del(&__tpd->entry);
2001 break;
2005 if (tpd == NULL) {
2006 hprintk("unable to locate tpd for dma buffer %x\n",
2007 TBRQ_TPD(he_dev->tbrq_head));
2008 goto next_tbrq_entry;
2010 #else
2011 tpd = &he_dev->tpd_base[ TPD_INDEX(TBRQ_TPD(he_dev->tbrq_head)) ];
2012 #endif
2014 if (TBRQ_EOS(he_dev->tbrq_head)) {
2015 HPRINTK("wake_up(tx_waitq) cid 0x%x\n",
2016 he_mkcid(he_dev, tpd->vcc->vpi, tpd->vcc->vci));
2017 if (tpd->vcc)
2018 wake_up(&HE_VCC(tpd->vcc)->tx_waitq);
2020 goto next_tbrq_entry;
2023 for (slot = 0; slot < TPD_MAXIOV; ++slot) {
2024 if (tpd->iovec[slot].addr)
2025 pci_unmap_single(he_dev->pci_dev,
2026 tpd->iovec[slot].addr,
2027 tpd->iovec[slot].len & TPD_LEN_MASK,
2028 PCI_DMA_TODEVICE);
2029 if (tpd->iovec[slot].len & TPD_LST)
2030 break;
2034 if (tpd->skb) { /* && !TBRQ_MULTIPLE(he_dev->tbrq_head) */
2035 if (tpd->vcc && tpd->vcc->pop)
2036 tpd->vcc->pop(tpd->vcc, tpd->skb);
2037 else
2038 dev_kfree_skb_any(tpd->skb);
2041 next_tbrq_entry:
2042 #ifdef USE_TPD_POOL
2043 if (tpd)
2044 pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
2045 #else
2046 tpd->inuse = 0;
2047 #endif
2048 he_dev->tbrq_head = (struct he_tbrq *)
2049 ((unsigned long) he_dev->tbrq_base |
2050 TBRQ_MASK(++he_dev->tbrq_head));
2053 if (updated) {
2054 if (updated > he_dev->tbrq_peak)
2055 he_dev->tbrq_peak = updated;
2057 he_writel(he_dev, TBRQ_MASK(he_dev->tbrq_head),
2058 G0_TBRQ_H + (group * 16));
2063 static void
2064 he_service_rbpl(struct he_dev *he_dev, int group)
2066 struct he_rbp *newtail;
2067 struct he_rbp *rbpl_head;
2068 int moved = 0;
2070 rbpl_head = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base |
2071 RBPL_MASK(he_readl(he_dev, G0_RBPL_S)));
2073 for (;;) {
2074 newtail = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base |
2075 RBPL_MASK(he_dev->rbpl_tail+1));
2077 /* table 3.42 -- rbpl_tail should never be set to rbpl_head */
2078 if ((newtail == rbpl_head) || (newtail->status & RBP_LOANED))
2079 break;
2081 newtail->status |= RBP_LOANED;
2082 he_dev->rbpl_tail = newtail;
2083 ++moved;
2086 if (moved)
2087 he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T);
2090 #ifdef USE_RBPS
2091 static void
2092 he_service_rbps(struct he_dev *he_dev, int group)
2094 struct he_rbp *newtail;
2095 struct he_rbp *rbps_head;
2096 int moved = 0;
2098 rbps_head = (struct he_rbp *) ((unsigned long)he_dev->rbps_base |
2099 RBPS_MASK(he_readl(he_dev, G0_RBPS_S)));
2101 for (;;) {
2102 newtail = (struct he_rbp *) ((unsigned long)he_dev->rbps_base |
2103 RBPS_MASK(he_dev->rbps_tail+1));
2105 /* table 3.42 -- rbps_tail should never be set to rbps_head */
2106 if ((newtail == rbps_head) || (newtail->status & RBP_LOANED))
2107 break;
2109 newtail->status |= RBP_LOANED;
2110 he_dev->rbps_tail = newtail;
2111 ++moved;
2114 if (moved)
2115 he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T);
2117 #endif /* USE_RBPS */
2119 static void
2120 he_tasklet(unsigned long data)
2122 unsigned long flags;
2123 struct he_dev *he_dev = (struct he_dev *) data;
2124 int group, type;
2125 int updated = 0;
2127 HPRINTK("tasklet (0x%lx)\n", data);
2128 #ifdef USE_TASKLET
2129 spin_lock_irqsave(&he_dev->global_lock, flags);
2130 #endif
2132 while (he_dev->irq_head != he_dev->irq_tail) {
2133 ++updated;
2135 type = ITYPE_TYPE(he_dev->irq_head->isw);
2136 group = ITYPE_GROUP(he_dev->irq_head->isw);
2138 switch (type) {
2139 case ITYPE_RBRQ_THRESH:
2140 HPRINTK("rbrq%d threshold\n", group);
2141 /* fall through */
2142 case ITYPE_RBRQ_TIMER:
2143 if (he_service_rbrq(he_dev, group)) {
2144 he_service_rbpl(he_dev, group);
2145 #ifdef USE_RBPS
2146 he_service_rbps(he_dev, group);
2147 #endif /* USE_RBPS */
2149 break;
2150 case ITYPE_TBRQ_THRESH:
2151 HPRINTK("tbrq%d threshold\n", group);
2152 /* fall through */
2153 case ITYPE_TPD_COMPLETE:
2154 he_service_tbrq(he_dev, group);
2155 break;
2156 case ITYPE_RBPL_THRESH:
2157 he_service_rbpl(he_dev, group);
2158 break;
2159 case ITYPE_RBPS_THRESH:
2160 #ifdef USE_RBPS
2161 he_service_rbps(he_dev, group);
2162 #endif /* USE_RBPS */
2163 break;
2164 case ITYPE_PHY:
2165 HPRINTK("phy interrupt\n");
2166 #ifdef CONFIG_ATM_HE_USE_SUNI
2167 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2168 if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->interrupt)
2169 he_dev->atm_dev->phy->interrupt(he_dev->atm_dev);
2170 spin_lock_irqsave(&he_dev->global_lock, flags);
2171 #endif
2172 break;
2173 case ITYPE_OTHER:
2174 switch (type|group) {
2175 case ITYPE_PARITY:
2176 hprintk("parity error\n");
2177 break;
2178 case ITYPE_ABORT:
2179 hprintk("abort 0x%x\n", he_readl(he_dev, ABORT_ADDR));
2180 break;
2182 break;
2183 case ITYPE_TYPE(ITYPE_INVALID):
2184 /* see 8.1.1 -- check all queues */
2186 HPRINTK("isw not updated 0x%x\n", he_dev->irq_head->isw);
2188 he_service_rbrq(he_dev, 0);
2189 he_service_rbpl(he_dev, 0);
2190 #ifdef USE_RBPS
2191 he_service_rbps(he_dev, 0);
2192 #endif /* USE_RBPS */
2193 he_service_tbrq(he_dev, 0);
2194 break;
2195 default:
2196 hprintk("bad isw 0x%x?\n", he_dev->irq_head->isw);
2199 he_dev->irq_head->isw = ITYPE_INVALID;
2201 he_dev->irq_head = (struct he_irq *) NEXT_ENTRY(he_dev->irq_base, he_dev->irq_head, IRQ_MASK);
2204 if (updated) {
2205 if (updated > he_dev->irq_peak)
2206 he_dev->irq_peak = updated;
2208 he_writel(he_dev,
2209 IRQ_SIZE(CONFIG_IRQ_SIZE) |
2210 IRQ_THRESH(CONFIG_IRQ_THRESH) |
2211 IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD);
2212 (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */
2214 #ifdef USE_TASKLET
2215 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2216 #endif
2219 static irqreturn_t
2220 he_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
2222 unsigned long flags;
2223 struct he_dev *he_dev = (struct he_dev * )dev_id;
2224 int handled = 0;
2226 if (he_dev == NULL)
2227 return IRQ_NONE;
2229 spin_lock_irqsave(&he_dev->global_lock, flags);
2231 he_dev->irq_tail = (struct he_irq *) (((unsigned long)he_dev->irq_base) |
2232 (*he_dev->irq_tailoffset << 2));
2234 if (he_dev->irq_tail == he_dev->irq_head) {
2235 HPRINTK("tailoffset not updated?\n");
2236 he_dev->irq_tail = (struct he_irq *) ((unsigned long)he_dev->irq_base |
2237 ((he_readl(he_dev, IRQ0_BASE) & IRQ_MASK) << 2));
2238 (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata */
2241 #ifdef DEBUG
2242 if (he_dev->irq_head == he_dev->irq_tail /* && !IRQ_PENDING */)
2243 hprintk("spurious (or shared) interrupt?\n");
2244 #endif
2246 if (he_dev->irq_head != he_dev->irq_tail) {
2247 handled = 1;
2248 #ifdef USE_TASKLET
2249 tasklet_schedule(&he_dev->tasklet);
2250 #else
2251 he_tasklet((unsigned long) he_dev);
2252 #endif
2253 he_writel(he_dev, INT_CLEAR_A, INT_FIFO); /* clear interrupt */
2254 (void) he_readl(he_dev, INT_FIFO); /* flush posted writes */
2256 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2257 return IRQ_RETVAL(handled);
2261 static __inline__ void
2262 __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid)
2264 struct he_tpdrq *new_tail;
2266 HPRINTK("tpdrq %p cid 0x%x -> tpdrq_tail %p\n",
2267 tpd, cid, he_dev->tpdrq_tail);
2269 /* new_tail = he_dev->tpdrq_tail; */
2270 new_tail = (struct he_tpdrq *) ((unsigned long) he_dev->tpdrq_base |
2271 TPDRQ_MASK(he_dev->tpdrq_tail+1));
2274 * check to see if we are about to set the tail == head
2275 * if true, update the head pointer from the adapter
2276 * to see if this is really the case (reading the queue
2277 * head for every enqueue would be unnecessarily slow)
2280 if (new_tail == he_dev->tpdrq_head) {
2281 he_dev->tpdrq_head = (struct he_tpdrq *)
2282 (((unsigned long)he_dev->tpdrq_base) |
2283 TPDRQ_MASK(he_readl(he_dev, TPDRQ_B_H)));
2285 if (new_tail == he_dev->tpdrq_head) {
2286 hprintk("tpdrq full (cid 0x%x)\n", cid);
2288 * FIXME
2289 * push tpd onto a transmit backlog queue
2290 * after service_tbrq, service the backlog
2291 * for now, we just drop the pdu
2293 if (tpd->skb) {
2294 if (tpd->vcc->pop)
2295 tpd->vcc->pop(tpd->vcc, tpd->skb);
2296 else
2297 dev_kfree_skb_any(tpd->skb);
2298 atomic_inc(&tpd->vcc->stats->tx_err);
2300 #ifdef USE_TPD_POOL
2301 pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
2302 #else
2303 tpd->inuse = 0;
2304 #endif
2305 return;
2309 /* 2.1.5 transmit packet descriptor ready queue */
2310 #ifdef USE_TPD_POOL
2311 list_add_tail(&tpd->entry, &he_dev->outstanding_tpds);
2312 he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status);
2313 #else
2314 he_dev->tpdrq_tail->tpd = he_dev->tpd_base_phys +
2315 (TPD_INDEX(tpd->status) * sizeof(struct he_tpd));
2316 #endif
2317 he_dev->tpdrq_tail->cid = cid;
2318 wmb();
2320 he_dev->tpdrq_tail = new_tail;
2322 he_writel(he_dev, TPDRQ_MASK(he_dev->tpdrq_tail), TPDRQ_T);
2323 (void) he_readl(he_dev, TPDRQ_T); /* flush posted writes */
2326 static int
2327 he_open(struct atm_vcc *vcc)
2329 unsigned long flags;
2330 struct he_dev *he_dev = HE_DEV(vcc->dev);
2331 struct he_vcc *he_vcc;
2332 int err = 0;
2333 unsigned cid, rsr0, rsr1, rsr4, tsr0, tsr0_aal, tsr4, period, reg, clock;
2334 short vpi = vcc->vpi;
2335 int vci = vcc->vci;
2337 if (vci == ATM_VCI_UNSPEC || vpi == ATM_VPI_UNSPEC)
2338 return 0;
2340 HPRINTK("open vcc %p %d.%d\n", vcc, vpi, vci);
2342 set_bit(ATM_VF_ADDR, &vcc->flags);
2344 cid = he_mkcid(he_dev, vpi, vci);
2346 he_vcc = (struct he_vcc *) kmalloc(sizeof(struct he_vcc), GFP_ATOMIC);
2347 if (he_vcc == NULL) {
2348 hprintk("unable to allocate he_vcc during open\n");
2349 return -ENOMEM;
2352 he_vcc->iov_tail = he_vcc->iov_head;
2353 he_vcc->pdu_len = 0;
2354 he_vcc->rc_index = -1;
2356 init_waitqueue_head(&he_vcc->rx_waitq);
2357 init_waitqueue_head(&he_vcc->tx_waitq);
2359 vcc->dev_data = he_vcc;
2361 if (vcc->qos.txtp.traffic_class != ATM_NONE) {
2362 int pcr_goal;
2364 pcr_goal = atm_pcr_goal(&vcc->qos.txtp);
2365 if (pcr_goal == 0)
2366 pcr_goal = he_dev->atm_dev->link_rate;
2367 if (pcr_goal < 0) /* means round down, technically */
2368 pcr_goal = -pcr_goal;
2370 HPRINTK("open tx cid 0x%x pcr_goal %d\n", cid, pcr_goal);
2372 switch (vcc->qos.aal) {
2373 case ATM_AAL5:
2374 tsr0_aal = TSR0_AAL5;
2375 tsr4 = TSR4_AAL5;
2376 break;
2377 case ATM_AAL0:
2378 tsr0_aal = TSR0_AAL0_SDU;
2379 tsr4 = TSR4_AAL0_SDU;
2380 break;
2381 default:
2382 err = -EINVAL;
2383 goto open_failed;
2386 spin_lock_irqsave(&he_dev->global_lock, flags);
2387 tsr0 = he_readl_tsr0(he_dev, cid);
2388 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2390 if (TSR0_CONN_STATE(tsr0) != 0) {
2391 hprintk("cid 0x%x not idle (tsr0 = 0x%x)\n", cid, tsr0);
2392 err = -EBUSY;
2393 goto open_failed;
2396 switch (vcc->qos.txtp.traffic_class) {
2397 case ATM_UBR:
2398 /* 2.3.3.1 open connection ubr */
2400 tsr0 = TSR0_UBR | TSR0_GROUP(0) | tsr0_aal |
2401 TSR0_USE_WMIN | TSR0_UPDATE_GER;
2402 break;
2404 case ATM_CBR:
2405 /* 2.3.3.2 open connection cbr */
2407 /* 8.2.3 cbr scheduler wrap problem -- limit to 90% total link rate */
2408 if ((he_dev->total_bw + pcr_goal)
2409 > (he_dev->atm_dev->link_rate * 9 / 10))
2411 err = -EBUSY;
2412 goto open_failed;
2415 spin_lock_irqsave(&he_dev->global_lock, flags); /* also protects he_dev->cs_stper[] */
2417 /* find an unused cs_stper register */
2418 for (reg = 0; reg < HE_NUM_CS_STPER; ++reg)
2419 if (he_dev->cs_stper[reg].inuse == 0 ||
2420 he_dev->cs_stper[reg].pcr == pcr_goal)
2421 break;
2423 if (reg == HE_NUM_CS_STPER) {
2424 err = -EBUSY;
2425 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2426 goto open_failed;
2429 he_dev->total_bw += pcr_goal;
2431 he_vcc->rc_index = reg;
2432 ++he_dev->cs_stper[reg].inuse;
2433 he_dev->cs_stper[reg].pcr = pcr_goal;
2435 clock = he_is622(he_dev) ? 66667000 : 50000000;
2436 period = clock / pcr_goal;
2438 HPRINTK("rc_index = %d period = %d\n",
2439 reg, period);
2441 he_writel_mbox(he_dev, rate_to_atmf(period/2),
2442 CS_STPER0 + reg);
2443 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2445 tsr0 = TSR0_CBR | TSR0_GROUP(0) | tsr0_aal |
2446 TSR0_RC_INDEX(reg);
2448 break;
2449 default:
2450 err = -EINVAL;
2451 goto open_failed;
2454 spin_lock_irqsave(&he_dev->global_lock, flags);
2456 he_writel_tsr0(he_dev, tsr0, cid);
2457 he_writel_tsr4(he_dev, tsr4 | 1, cid);
2458 he_writel_tsr1(he_dev, TSR1_MCR(rate_to_atmf(0)) |
2459 TSR1_PCR(rate_to_atmf(pcr_goal)), cid);
2460 he_writel_tsr2(he_dev, TSR2_ACR(rate_to_atmf(pcr_goal)), cid);
2461 he_writel_tsr9(he_dev, TSR9_OPEN_CONN, cid);
2463 he_writel_tsr3(he_dev, 0x0, cid);
2464 he_writel_tsr5(he_dev, 0x0, cid);
2465 he_writel_tsr6(he_dev, 0x0, cid);
2466 he_writel_tsr7(he_dev, 0x0, cid);
2467 he_writel_tsr8(he_dev, 0x0, cid);
2468 he_writel_tsr10(he_dev, 0x0, cid);
2469 he_writel_tsr11(he_dev, 0x0, cid);
2470 he_writel_tsr12(he_dev, 0x0, cid);
2471 he_writel_tsr13(he_dev, 0x0, cid);
2472 he_writel_tsr14(he_dev, 0x0, cid);
2473 (void) he_readl_tsr0(he_dev, cid); /* flush posted writes */
2474 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2477 if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
2478 unsigned aal;
2480 HPRINTK("open rx cid 0x%x (rx_waitq %p)\n", cid,
2481 &HE_VCC(vcc)->rx_waitq);
2483 switch (vcc->qos.aal) {
2484 case ATM_AAL5:
2485 aal = RSR0_AAL5;
2486 break;
2487 case ATM_AAL0:
2488 aal = RSR0_RAWCELL;
2489 break;
2490 default:
2491 err = -EINVAL;
2492 goto open_failed;
2495 spin_lock_irqsave(&he_dev->global_lock, flags);
2497 rsr0 = he_readl_rsr0(he_dev, cid);
2498 if (rsr0 & RSR0_OPEN_CONN) {
2499 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2501 hprintk("cid 0x%x not idle (rsr0 = 0x%x)\n", cid, rsr0);
2502 err = -EBUSY;
2503 goto open_failed;
2506 #ifdef USE_RBPS
2507 rsr1 = RSR1_GROUP(0);
2508 rsr4 = RSR4_GROUP(0);
2509 #else /* !USE_RBPS */
2510 rsr1 = RSR1_GROUP(0)|RSR1_RBPL_ONLY;
2511 rsr4 = RSR4_GROUP(0)|RSR4_RBPL_ONLY;
2512 #endif /* USE_RBPS */
2513 rsr0 = vcc->qos.rxtp.traffic_class == ATM_UBR ?
2514 (RSR0_EPD_ENABLE|RSR0_PPD_ENABLE) : 0;
2516 #ifdef USE_CHECKSUM_HW
2517 if (vpi == 0 && vci >= ATM_NOT_RSV_VCI)
2518 rsr0 |= RSR0_TCP_CKSUM;
2519 #endif
2521 he_writel_rsr4(he_dev, rsr4, cid);
2522 he_writel_rsr1(he_dev, rsr1, cid);
2523 /* 5.1.11 last parameter initialized should be
2524 the open/closed indication in rsr0 */
2525 he_writel_rsr0(he_dev,
2526 rsr0 | RSR0_START_PDU | RSR0_OPEN_CONN | aal, cid);
2527 (void) he_readl_rsr0(he_dev, cid); /* flush posted writes */
2529 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2532 open_failed:
2534 if (err) {
2535 kfree(he_vcc);
2536 clear_bit(ATM_VF_ADDR, &vcc->flags);
2538 else
2539 set_bit(ATM_VF_READY, &vcc->flags);
2541 return err;
2544 static void
2545 he_close(struct atm_vcc *vcc)
2547 unsigned long flags;
2548 DECLARE_WAITQUEUE(wait, current);
2549 struct he_dev *he_dev = HE_DEV(vcc->dev);
2550 struct he_tpd *tpd;
2551 unsigned cid;
2552 struct he_vcc *he_vcc = HE_VCC(vcc);
2553 #define MAX_RETRY 30
2554 int retry = 0, sleep = 1, tx_inuse;
2556 HPRINTK("close vcc %p %d.%d\n", vcc, vcc->vpi, vcc->vci);
2558 clear_bit(ATM_VF_READY, &vcc->flags);
2559 cid = he_mkcid(he_dev, vcc->vpi, vcc->vci);
2561 if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
2562 int timeout;
2564 HPRINTK("close rx cid 0x%x\n", cid);
2566 /* 2.7.2.2 close receive operation */
2568 /* wait for previous close (if any) to finish */
2570 spin_lock_irqsave(&he_dev->global_lock, flags);
2571 while (he_readl(he_dev, RCC_STAT) & RCC_BUSY) {
2572 HPRINTK("close cid 0x%x RCC_BUSY\n", cid);
2573 udelay(250);
2576 set_current_state(TASK_UNINTERRUPTIBLE);
2577 add_wait_queue(&he_vcc->rx_waitq, &wait);
2579 he_writel_rsr0(he_dev, RSR0_CLOSE_CONN, cid);
2580 (void) he_readl_rsr0(he_dev, cid); /* flush posted writes */
2581 he_writel_mbox(he_dev, cid, RXCON_CLOSE);
2582 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2584 timeout = schedule_timeout(30*HZ);
2586 remove_wait_queue(&he_vcc->rx_waitq, &wait);
2587 set_current_state(TASK_RUNNING);
2589 if (timeout == 0)
2590 hprintk("close rx timeout cid 0x%x\n", cid);
2592 HPRINTK("close rx cid 0x%x complete\n", cid);
2596 if (vcc->qos.txtp.traffic_class != ATM_NONE) {
2597 volatile unsigned tsr4, tsr0;
2598 int timeout;
2600 HPRINTK("close tx cid 0x%x\n", cid);
2602 /* 2.1.2
2604 * ... the host must first stop queueing packets to the TPDRQ
2605 * on the connection to be closed, then wait for all outstanding
2606 * packets to be transmitted and their buffers returned to the
2607 * TBRQ. When the last packet on the connection arrives in the
2608 * TBRQ, the host issues the close command to the adapter.
2611 while (((tx_inuse = atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) > 0) &&
2612 (retry < MAX_RETRY)) {
2613 msleep(sleep);
2614 if (sleep < 250)
2615 sleep = sleep * 2;
2617 ++retry;
2620 if (tx_inuse)
2621 hprintk("close tx cid 0x%x tx_inuse = %d\n", cid, tx_inuse);
2623 /* 2.3.1.1 generic close operations with flush */
2625 spin_lock_irqsave(&he_dev->global_lock, flags);
2626 he_writel_tsr4_upper(he_dev, TSR4_FLUSH_CONN, cid);
2627 /* also clears TSR4_SESSION_ENDED */
2629 switch (vcc->qos.txtp.traffic_class) {
2630 case ATM_UBR:
2631 he_writel_tsr1(he_dev,
2632 TSR1_MCR(rate_to_atmf(200000))
2633 | TSR1_PCR(0), cid);
2634 break;
2635 case ATM_CBR:
2636 he_writel_tsr14_upper(he_dev, TSR14_DELETE, cid);
2637 break;
2639 (void) he_readl_tsr4(he_dev, cid); /* flush posted writes */
2641 tpd = __alloc_tpd(he_dev);
2642 if (tpd == NULL) {
2643 hprintk("close tx he_alloc_tpd failed cid 0x%x\n", cid);
2644 goto close_tx_incomplete;
2646 tpd->status |= TPD_EOS | TPD_INT;
2647 tpd->skb = NULL;
2648 tpd->vcc = vcc;
2649 wmb();
2651 set_current_state(TASK_UNINTERRUPTIBLE);
2652 add_wait_queue(&he_vcc->tx_waitq, &wait);
2653 __enqueue_tpd(he_dev, tpd, cid);
2654 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2656 timeout = schedule_timeout(30*HZ);
2658 remove_wait_queue(&he_vcc->tx_waitq, &wait);
2659 set_current_state(TASK_RUNNING);
2661 spin_lock_irqsave(&he_dev->global_lock, flags);
2663 if (timeout == 0) {
2664 hprintk("close tx timeout cid 0x%x\n", cid);
2665 goto close_tx_incomplete;
2668 while (!((tsr4 = he_readl_tsr4(he_dev, cid)) & TSR4_SESSION_ENDED)) {
2669 HPRINTK("close tx cid 0x%x !TSR4_SESSION_ENDED (tsr4 = 0x%x)\n", cid, tsr4);
2670 udelay(250);
2673 while (TSR0_CONN_STATE(tsr0 = he_readl_tsr0(he_dev, cid)) != 0) {
2674 HPRINTK("close tx cid 0x%x TSR0_CONN_STATE != 0 (tsr0 = 0x%x)\n", cid, tsr0);
2675 udelay(250);
2678 close_tx_incomplete:
2680 if (vcc->qos.txtp.traffic_class == ATM_CBR) {
2681 int reg = he_vcc->rc_index;
2683 HPRINTK("cs_stper reg = %d\n", reg);
2685 if (he_dev->cs_stper[reg].inuse == 0)
2686 hprintk("cs_stper[%d].inuse = 0!\n", reg);
2687 else
2688 --he_dev->cs_stper[reg].inuse;
2690 he_dev->total_bw -= he_dev->cs_stper[reg].pcr;
2692 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2694 HPRINTK("close tx cid 0x%x complete\n", cid);
2697 kfree(he_vcc);
2699 clear_bit(ATM_VF_ADDR, &vcc->flags);
2702 static int
2703 he_send(struct atm_vcc *vcc, struct sk_buff *skb)
2705 unsigned long flags;
2706 struct he_dev *he_dev = HE_DEV(vcc->dev);
2707 unsigned cid = he_mkcid(he_dev, vcc->vpi, vcc->vci);
2708 struct he_tpd *tpd;
2709 #ifdef USE_SCATTERGATHER
2710 int i, slot = 0;
2711 #endif
2713 #define HE_TPD_BUFSIZE 0xffff
2715 HPRINTK("send %d.%d\n", vcc->vpi, vcc->vci);
2717 if ((skb->len > HE_TPD_BUFSIZE) ||
2718 ((vcc->qos.aal == ATM_AAL0) && (skb->len != ATM_AAL0_SDU))) {
2719 hprintk("buffer too large (or small) -- %d bytes\n", skb->len );
2720 if (vcc->pop)
2721 vcc->pop(vcc, skb);
2722 else
2723 dev_kfree_skb_any(skb);
2724 atomic_inc(&vcc->stats->tx_err);
2725 return -EINVAL;
2728 #ifndef USE_SCATTERGATHER
2729 if (skb_shinfo(skb)->nr_frags) {
2730 hprintk("no scatter/gather support\n");
2731 if (vcc->pop)
2732 vcc->pop(vcc, skb);
2733 else
2734 dev_kfree_skb_any(skb);
2735 atomic_inc(&vcc->stats->tx_err);
2736 return -EINVAL;
2738 #endif
2739 spin_lock_irqsave(&he_dev->global_lock, flags);
2741 tpd = __alloc_tpd(he_dev);
2742 if (tpd == NULL) {
2743 if (vcc->pop)
2744 vcc->pop(vcc, skb);
2745 else
2746 dev_kfree_skb_any(skb);
2747 atomic_inc(&vcc->stats->tx_err);
2748 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2749 return -ENOMEM;
2752 if (vcc->qos.aal == ATM_AAL5)
2753 tpd->status |= TPD_CELLTYPE(TPD_USERCELL);
2754 else {
2755 char *pti_clp = (void *) (skb->data + 3);
2756 int clp, pti;
2758 pti = (*pti_clp & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT;
2759 clp = (*pti_clp & ATM_HDR_CLP);
2760 tpd->status |= TPD_CELLTYPE(pti);
2761 if (clp)
2762 tpd->status |= TPD_CLP;
2764 skb_pull(skb, ATM_AAL0_SDU - ATM_CELL_PAYLOAD);
2767 #ifdef USE_SCATTERGATHER
2768 tpd->iovec[slot].addr = pci_map_single(he_dev->pci_dev, skb->data,
2769 skb->len - skb->data_len, PCI_DMA_TODEVICE);
2770 tpd->iovec[slot].len = skb->len - skb->data_len;
2771 ++slot;
2773 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
2774 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
2776 if (slot == TPD_MAXIOV) { /* queue tpd; start new tpd */
2777 tpd->vcc = vcc;
2778 tpd->skb = NULL; /* not the last fragment
2779 so dont ->push() yet */
2780 wmb();
2782 __enqueue_tpd(he_dev, tpd, cid);
2783 tpd = __alloc_tpd(he_dev);
2784 if (tpd == NULL) {
2785 if (vcc->pop)
2786 vcc->pop(vcc, skb);
2787 else
2788 dev_kfree_skb_any(skb);
2789 atomic_inc(&vcc->stats->tx_err);
2790 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2791 return -ENOMEM;
2793 tpd->status |= TPD_USERCELL;
2794 slot = 0;
2797 tpd->iovec[slot].addr = pci_map_single(he_dev->pci_dev,
2798 (void *) page_address(frag->page) + frag->page_offset,
2799 frag->size, PCI_DMA_TODEVICE);
2800 tpd->iovec[slot].len = frag->size;
2801 ++slot;
2805 tpd->iovec[slot - 1].len |= TPD_LST;
2806 #else
2807 tpd->address0 = pci_map_single(he_dev->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE);
2808 tpd->length0 = skb->len | TPD_LST;
2809 #endif
2810 tpd->status |= TPD_INT;
2812 tpd->vcc = vcc;
2813 tpd->skb = skb;
2814 wmb();
2815 ATM_SKB(skb)->vcc = vcc;
2817 __enqueue_tpd(he_dev, tpd, cid);
2818 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2820 atomic_inc(&vcc->stats->tx);
2822 return 0;
2825 static int
2826 he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg)
2828 unsigned long flags;
2829 struct he_dev *he_dev = HE_DEV(atm_dev);
2830 struct he_ioctl_reg reg;
2831 int err = 0;
2833 switch (cmd) {
2834 case HE_GET_REG:
2835 if (!capable(CAP_NET_ADMIN))
2836 return -EPERM;
2838 if (copy_from_user(&reg, arg,
2839 sizeof(struct he_ioctl_reg)))
2840 return -EFAULT;
2842 spin_lock_irqsave(&he_dev->global_lock, flags);
2843 switch (reg.type) {
2844 case HE_REGTYPE_PCI:
2845 reg.val = he_readl(he_dev, reg.addr);
2846 break;
2847 case HE_REGTYPE_RCM:
2848 reg.val =
2849 he_readl_rcm(he_dev, reg.addr);
2850 break;
2851 case HE_REGTYPE_TCM:
2852 reg.val =
2853 he_readl_tcm(he_dev, reg.addr);
2854 break;
2855 case HE_REGTYPE_MBOX:
2856 reg.val =
2857 he_readl_mbox(he_dev, reg.addr);
2858 break;
2859 default:
2860 err = -EINVAL;
2861 break;
2863 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2864 if (err == 0)
2865 if (copy_to_user(arg, &reg,
2866 sizeof(struct he_ioctl_reg)))
2867 return -EFAULT;
2868 break;
2869 default:
2870 #ifdef CONFIG_ATM_HE_USE_SUNI
2871 if (atm_dev->phy && atm_dev->phy->ioctl)
2872 err = atm_dev->phy->ioctl(atm_dev, cmd, arg);
2873 #else /* CONFIG_ATM_HE_USE_SUNI */
2874 err = -EINVAL;
2875 #endif /* CONFIG_ATM_HE_USE_SUNI */
2876 break;
2879 return err;
2882 static void
2883 he_phy_put(struct atm_dev *atm_dev, unsigned char val, unsigned long addr)
2885 unsigned long flags;
2886 struct he_dev *he_dev = HE_DEV(atm_dev);
2888 HPRINTK("phy_put(val 0x%x, addr 0x%lx)\n", val, addr);
2890 spin_lock_irqsave(&he_dev->global_lock, flags);
2891 he_writel(he_dev, val, FRAMER + (addr*4));
2892 (void) he_readl(he_dev, FRAMER + (addr*4)); /* flush posted writes */
2893 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2897 static unsigned char
2898 he_phy_get(struct atm_dev *atm_dev, unsigned long addr)
2900 unsigned long flags;
2901 struct he_dev *he_dev = HE_DEV(atm_dev);
2902 unsigned reg;
2904 spin_lock_irqsave(&he_dev->global_lock, flags);
2905 reg = he_readl(he_dev, FRAMER + (addr*4));
2906 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2908 HPRINTK("phy_get(addr 0x%lx) =0x%x\n", addr, reg);
2909 return reg;
2912 static int
2913 he_proc_read(struct atm_dev *dev, loff_t *pos, char *page)
2915 unsigned long flags;
2916 struct he_dev *he_dev = HE_DEV(dev);
2917 int left, i;
2918 #ifdef notdef
2919 struct he_rbrq *rbrq_tail;
2920 struct he_tpdrq *tpdrq_head;
2921 int rbpl_head, rbpl_tail;
2922 #endif
2923 static long mcc = 0, oec = 0, dcc = 0, cec = 0;
2926 left = *pos;
2927 if (!left--)
2928 return sprintf(page, "%s\n", version);
2930 if (!left--)
2931 return sprintf(page, "%s%s\n\n",
2932 he_dev->prod_id, he_dev->media & 0x40 ? "SM" : "MM");
2934 if (!left--)
2935 return sprintf(page, "Mismatched Cells VPI/VCI Not Open Dropped Cells RCM Dropped Cells\n");
2937 spin_lock_irqsave(&he_dev->global_lock, flags);
2938 mcc += he_readl(he_dev, MCC);
2939 oec += he_readl(he_dev, OEC);
2940 dcc += he_readl(he_dev, DCC);
2941 cec += he_readl(he_dev, CEC);
2942 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2944 if (!left--)
2945 return sprintf(page, "%16ld %16ld %13ld %17ld\n\n",
2946 mcc, oec, dcc, cec);
2948 if (!left--)
2949 return sprintf(page, "irq_size = %d inuse = ? peak = %d\n",
2950 CONFIG_IRQ_SIZE, he_dev->irq_peak);
2952 if (!left--)
2953 return sprintf(page, "tpdrq_size = %d inuse = ?\n",
2954 CONFIG_TPDRQ_SIZE);
2956 if (!left--)
2957 return sprintf(page, "rbrq_size = %d inuse = ? peak = %d\n",
2958 CONFIG_RBRQ_SIZE, he_dev->rbrq_peak);
2960 if (!left--)
2961 return sprintf(page, "tbrq_size = %d peak = %d\n",
2962 CONFIG_TBRQ_SIZE, he_dev->tbrq_peak);
2965 #ifdef notdef
2966 rbpl_head = RBPL_MASK(he_readl(he_dev, G0_RBPL_S));
2967 rbpl_tail = RBPL_MASK(he_readl(he_dev, G0_RBPL_T));
2969 inuse = rbpl_head - rbpl_tail;
2970 if (inuse < 0)
2971 inuse += CONFIG_RBPL_SIZE * sizeof(struct he_rbp);
2972 inuse /= sizeof(struct he_rbp);
2974 if (!left--)
2975 return sprintf(page, "rbpl_size = %d inuse = %d\n\n",
2976 CONFIG_RBPL_SIZE, inuse);
2977 #endif
2979 if (!left--)
2980 return sprintf(page, "rate controller periods (cbr)\n pcr #vc\n");
2982 for (i = 0; i < HE_NUM_CS_STPER; ++i)
2983 if (!left--)
2984 return sprintf(page, "cs_stper%-2d %8ld %3d\n", i,
2985 he_dev->cs_stper[i].pcr,
2986 he_dev->cs_stper[i].inuse);
2988 if (!left--)
2989 return sprintf(page, "total bw (cbr): %d (limit %d)\n",
2990 he_dev->total_bw, he_dev->atm_dev->link_rate * 10 / 9);
2992 return 0;
2995 /* eeprom routines -- see 4.7 */
2998 read_prom_byte(struct he_dev *he_dev, int addr)
3000 u32 val = 0, tmp_read = 0;
3001 int i, j = 0;
3002 u8 byte_read = 0;
3004 val = readl(he_dev->membase + HOST_CNTL);
3005 val &= 0xFFFFE0FF;
3007 /* Turn on write enable */
3008 val |= 0x800;
3009 he_writel(he_dev, val, HOST_CNTL);
3011 /* Send READ instruction */
3012 for (i = 0; i < sizeof(readtab)/sizeof(readtab[0]); i++) {
3013 he_writel(he_dev, val | readtab[i], HOST_CNTL);
3014 udelay(EEPROM_DELAY);
3017 /* Next, we need to send the byte address to read from */
3018 for (i = 7; i >= 0; i--) {
3019 he_writel(he_dev, val | clocktab[j++] | (((addr >> i) & 1) << 9), HOST_CNTL);
3020 udelay(EEPROM_DELAY);
3021 he_writel(he_dev, val | clocktab[j++] | (((addr >> i) & 1) << 9), HOST_CNTL);
3022 udelay(EEPROM_DELAY);
3025 j = 0;
3027 val &= 0xFFFFF7FF; /* Turn off write enable */
3028 he_writel(he_dev, val, HOST_CNTL);
3030 /* Now, we can read data from the EEPROM by clocking it in */
3031 for (i = 7; i >= 0; i--) {
3032 he_writel(he_dev, val | clocktab[j++], HOST_CNTL);
3033 udelay(EEPROM_DELAY);
3034 tmp_read = he_readl(he_dev, HOST_CNTL);
3035 byte_read |= (unsigned char)
3036 ((tmp_read & ID_DOUT) >> ID_DOFFSET << i);
3037 he_writel(he_dev, val | clocktab[j++], HOST_CNTL);
3038 udelay(EEPROM_DELAY);
3041 he_writel(he_dev, val | ID_CS, HOST_CNTL);
3042 udelay(EEPROM_DELAY);
3044 return byte_read;
3047 MODULE_LICENSE("GPL");
3048 MODULE_AUTHOR("chas williams <chas@cmf.nrl.navy.mil>");
3049 MODULE_DESCRIPTION("ForeRunnerHE ATM Adapter driver");
3050 module_param(disable64, bool, 0);
3051 MODULE_PARM_DESC(disable64, "disable 64-bit pci bus transfers");
3052 module_param(nvpibits, short, 0);
3053 MODULE_PARM_DESC(nvpibits, "numbers of bits for vpi (default 0)");
3054 module_param(nvcibits, short, 0);
3055 MODULE_PARM_DESC(nvcibits, "numbers of bits for vci (default 12)");
3056 module_param(rx_skb_reserve, short, 0);
3057 MODULE_PARM_DESC(rx_skb_reserve, "padding for receive skb (default 16)");
3058 module_param(irq_coalesce, bool, 0);
3059 MODULE_PARM_DESC(irq_coalesce, "use interrupt coalescing (default 1)");
3060 module_param(sdh, bool, 0);
3061 MODULE_PARM_DESC(sdh, "use SDH framing (default 0)");
3063 static struct pci_device_id he_pci_tbl[] = {
3064 { PCI_VENDOR_ID_FORE, PCI_DEVICE_ID_FORE_HE, PCI_ANY_ID, PCI_ANY_ID,
3065 0, 0, 0 },
3066 { 0, }
3069 MODULE_DEVICE_TABLE(pci, he_pci_tbl);
3071 static struct pci_driver he_driver = {
3072 .name = "he",
3073 .probe = he_init_one,
3074 .remove = __devexit_p(he_remove_one),
3075 .id_table = he_pci_tbl,
3078 static int __init he_init(void)
3080 return pci_register_driver(&he_driver);
3083 static void __exit he_cleanup(void)
3085 pci_unregister_driver(&he_driver);
3088 module_init(he_init);
3089 module_exit(he_cleanup);