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