1 /* $Id: he.c,v 1.18 2003/05/06 22:57:15 chas Exp $ */
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
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.
47 chas williams <chas@cmf.nrl.navy.mil>
48 eric kinzie <ekinzie@cmf.nrl.navy.mil>
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>
69 #include <linux/sched.h>
70 #include <linux/timer.h>
71 #include <linux/interrupt.h>
72 #include <linux/dma-mapping.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>
82 #undef USE_SCATTERGATHER
83 #undef USE_CHECKSUM_HW /* still confused about this */
85 #undef USE_RBPS_POOL /* if memory is tight try this */
86 #undef USE_RBPL_POOL /* if memory is tight try this */
88 /* #undef CONFIG_ATM_HE_USE_SUNI */
93 #include <linux/atm_he.h>
95 #define hprintk(fmt,args...) printk(KERN_ERR DEV_LABEL "%d: " fmt, he_dev->number , ##args)
98 #define HPRINTK(fmt,args...) printk(KERN_DEBUG DEV_LABEL "%d: " fmt, he_dev->number , ##args)
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 $";
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);
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;
133 /* Read from EEPROM = 0000 0011b */
134 static unsigned int readtab[] = {
149 CLK_HIGH | SI_HIGH, /* 1 */
151 CLK_HIGH | SI_HIGH /* 1 */
154 /* Clock to read from/write to the EEPROM */
155 static unsigned int clocktab[] = {
175 static struct atmdev_ops he_ops =
181 .phy_put = he_phy_put,
182 .phy_get = he_phy_get,
183 .proc_read = he_proc_read,
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,
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)
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)
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, \
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, \
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;
343 struct hlist_node *node;
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) {
354 if (vcc->dev == he_dev->atm_dev &&
355 vcc->vci == vci && vcc->vpi == vpi &&
356 vcc->qos.rxtp.traffic_class != ATM_NONE) {
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;
370 printk(KERN_INFO "he: %s\n", version);
372 if (pci_enable_device(pci_dev))
374 if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK) != 0) {
375 printk(KERN_WARNING "he: no suitable dma available\n");
377 goto init_one_failure;
380 atm_dev = atm_dev_register(DEV_LABEL, &he_ops, -1, NULL);
383 goto init_one_failure;
385 pci_set_drvdata(pci_dev, atm_dev);
387 he_dev = (struct he_dev *) kmalloc(sizeof(struct he_dev),
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)) {
403 goto init_one_failure;
407 he_dev->next = he_devs;
413 atm_dev_deregister(atm_dev);
415 pci_disable_device(pci_dev);
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 */
431 atm_dev_deregister(atm_dev);
434 pci_set_drvdata(pci_dev, NULL);
435 pci_disable_device(pci_dev);
440 rate_to_atmf(unsigned rate) /* cps to atm forum format */
442 #define NONZERO (1 << 14)
450 while (rate > 0x3ff) {
455 return (NONZERO | (exp << 9) | (rate & 0x1ff));
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;
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) {
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) {
480 row_offset += he_dev->bytes_per_row;
485 he_writel(he_dev, lbufd_index - 2, RLBF0_T);
486 he_writel(he_dev, he_dev->r0_numbuffs, RLBF0_C);
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;
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) {
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) {
511 row_offset += he_dev->bytes_per_row;
516 he_writel(he_dev, lbufd_index - 2, RLBF1_T);
517 he_writel(he_dev, he_dev->r1_numbuffs, RLBF1_C);
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) {
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) {
542 row_offset += he_dev->bytes_per_row;
547 he_writel(he_dev, lbufd_index - 1, TLBF_T);
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");
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);
573 he_init_cs_block(struct he_dev *he_dev)
575 unsigned clock, rate, delta;
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);
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);
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);
628 he_writel_mbox(he_dev, 0x5, CS_OTPPER);
629 he_writel_mbox(he_dev, 0x14, CS_OTWPER);
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);
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);
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);
669 he_init_cs_block_rcm(struct he_dev *he_dev)
671 unsigned (*rategrid)[16][16];
672 unsigned rate, delta;
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);
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;
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;
716 for (i = 1; i < 16; i++)
717 for (j = 0; j < 16; j++)
719 (*rategrid)[i][j] = (*rategrid)[i - 1][j] / 4;
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
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;
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
756 buf = rate_cps * he_dev->tx_numbuffs /
757 (he_dev->atm_dev->link_rate * 2);
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))
763 else if (rate_cps > (204 * mult))
765 else if (rate_cps > (136 * mult))
767 else if (rate_cps > (68 * mult))
774 reg = (reg << 16) | ((i << 8) | buf);
776 #define RTGTBL_OFFSET 0x400
779 he_writel_rcm(he_dev, reg,
780 CONFIG_RCMABR + RTGTBL_OFFSET + (rate_atmf >> 1));
790 he_init_group(struct he_dev *he_dev, int group)
795 /* small buffer 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");
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");
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");
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;
826 cpuaddr = pci_pool_alloc(he_dev->rbps_pool, SLAB_KERNEL|SLAB_DMA, &dma_handle);
830 cpuaddr = he_dev->rbps_pages + (i * CONFIG_RBPS_BUFSIZE);
831 dma_handle = he_dev->rbps_pages_phys + (i * CONFIG_RBPS_BUFSIZE);
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));
847 RBP_THRESH(CONFIG_RBPS_THRESH) |
848 RBP_QSIZE(CONFIG_RBPS_SIZE - 1) |
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 */
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");
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");
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");
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;
890 cpuaddr = pci_pool_alloc(he_dev->rbpl_pool, SLAB_KERNEL|SLAB_DMA, &dma_handle);
894 cpuaddr = he_dev->rbpl_pages + (i * CONFIG_RBPL_BUFSIZE);
895 dma_handle = he_dev->rbpl_pages_phys + (i * CONFIG_RBPL_BUFSIZE);
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));
910 RBP_THRESH(CONFIG_RBPL_THRESH) |
911 RBP_QSIZE(CONFIG_RBPL_SIZE - 1) |
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");
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));
929 RBRQ_THRESH(CONFIG_RBRQ_THRESH) | RBRQ_SIZE(CONFIG_RBRQ_SIZE - 1),
930 G0_RBRQ_Q + (group * 16));
932 hprintk("coalescing interrupts\n");
933 he_writel(he_dev, RBRQ_TIME(768) | RBRQ_COUNT(7),
934 G0_RBRQ_I + (group * 16));
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");
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));
960 he_init_irq(struct he_dev *he_dev)
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");
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);
984 IRQ_SIZE(CONFIG_IRQ_SIZE) | IRQ_THRESH(CONFIG_IRQ_THRESH),
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);
1016 he_dev->irq = he_dev->pci_dev->irq;
1022 he_start(struct atm_dev *dev)
1024 struct he_dev *he_dev;
1025 struct pci_dev *pci_dev;
1026 unsigned long membase;
1029 u32 gen_cntl_0, host_cntl, lb_swap;
1030 u8 cache_size, timer;
1033 unsigned int status, reg;
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");
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");
1057 if (pci_read_config_word(pci_dev, PCI_COMMAND, &command) != 0) {
1058 hprintk("can't read PCI_COMMAND.\n");
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");
1068 if (pci_read_config_byte(pci_dev, PCI_CACHE_LINE_SIZE, &cache_size)) {
1069 hprintk("can't read cache line size?\n");
1073 if (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");
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);
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");
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");
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;
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",
1144 he_dev->media & 0x40 ? "SM" : "MM",
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 */
1159 lb_swap |= XFER_SIZE; /* 8 cells */
1161 lb_swap |= DESC_WR_SWAP | INTR_SWAP | BIG_ENDIAN_HOST;
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)
1180 tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev);
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
1203 * 0 ____________1023 bytes 0 _______________________2047 bytes
1205 * | utility | | rx0 | |
1206 * 5|____________| 255|___________________| u |
1209 * | rx0 | row | tx | l |
1211 * | | 767|___________________| t |
1212 * 517|____________| 768| | y |
1213 * row 518| | | rx1 | |
1214 * | | 1023|___________________|___|
1219 * 1535|____________|
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);
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;
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 */
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)),
1292 he_writel(he_dev, BANK_ON |
1293 (he_is622(he_dev) ? (REF_RATE(0x384) | WIDE_DATA) : REF_RATE(0x150)),
1297 (he_is622(he_dev) ? RM_BANK_WAIT(1) : RM_BANK_WAIT(0)) |
1298 RM_RW_WAIT(1), RCMCONFIG);
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);
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)),
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
1334 * 0x0 ___________________
1340 * 0x8000|___________________|
1343 * 0xc000|___________________|
1346 * 0xe000|___________________|
1348 * 0xf000|___________________|
1350 * 0x10000|___________________|
1353 * |___________________|
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 ___________________
1377 * 0x8000|___________________|
1380 * | LBM | link lists of local
1381 * | tx | buffer memory
1383 * 0xd000|___________________|
1386 * 0xe000|___________________|
1389 * |___________________|
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);
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)
1483 /* 5.1.10 initialize host structures */
1485 he_init_tpdrq(he_dev);
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");
1495 INIT_LIST_HEAD(&he_dev->outstanding_tpds);
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)
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];
1511 if (he_init_group(he_dev, 0) != 0)
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");
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 */
1560 /* this really should be in suni.c but for now... */
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);
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");
1601 he_stop(struct he_dev *he_dev)
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);
1617 tasklet_disable(&he_dev->tasklet);
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 */
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);
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);
1656 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
1657 * CONFIG_RBPL_BUFSIZE, he_dev->rbpl_pages, he_dev->rbpl_pages_phys);
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);
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);
1678 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
1679 * CONFIG_RBPS_BUFSIZE, he_dev->rbps_pages, he_dev->rbps_pages_phys);
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);
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);
1705 if (he_dev->tpd_pool)
1706 pci_pool_destroy(he_dev->tpd_pool);
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);
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)
1728 dma_addr_t dma_handle;
1730 tpd = pci_pool_alloc(he_dev->tpd_pool, SLAB_ATOMIC|SLAB_DMA, &dma_handle);
1734 tpd->status = TPD_ADDR(dma_handle);
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;
1744 for (i = 0; i < CONFIG_NUMTPDS; ++i) {
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);
1764 #define AAL5_LEN(buf,len) \
1765 ((((unsigned char *)(buf))[(len)-6] << 8) | \
1766 (((unsigned char *)(buf))[(len)-5]))
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)]))
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;
1794 read_lock(&vcc_sklist_lock);
1795 while (he_dev->rbrq_head != rbrq_tail) {
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" : "");
1811 if (RBRQ_ADDR(he_dev->rbrq_head) & RBP_SMALLBUF)
1812 rbp = &he_dev->rbps_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
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);
1821 vcc = __find_vcc(he_dev, cid);
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;
1851 if (RBRQ_CON_CLOSED(he_dev->rbrq_head)) {
1853 HPRINTK("wake_up rx_waitq (cid 0x%x)\n", cid);
1854 wake_up(&he_vcc->rx_waitq);
1855 goto return_host_buffers;
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;
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)
1872 RBRQ_LEN_ERR(he_dev->rbrq_head)
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,
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) {
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);
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) {
1905 /* 2.10.1.5 raw cell receive */
1906 skb->len = ATM_AAL0_SDU;
1907 skb->tail = skb->data + skb->len;
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,
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);
1930 ATM_SKB(skb)->vcc = vcc;
1932 vcc->push(vcc, skb);
1934 atomic_inc(&vcc->stats->rx);
1936 return_host_buffers:
1939 for (iov = he_vcc->iov_head;
1940 iov < he_vcc->iov_tail; ++iov) {
1942 if (iov->iov_base & RBP_SMALLBUF)
1943 rbp = &he_dev->rbps_base[RBP_INDEX(iov->iov_base)];
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;
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);
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;
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);
1980 int slot, updated = 0;
1982 struct he_tpd *__tpd;
1985 /* 2.1.6 transmit buffer return queue */
1987 while (he_dev->tbrq_head != tbrq_tail) {
1990 HPRINTK("tbrq%d 0x%x%s%s\n",
1992 TBRQ_TPD(he_dev->tbrq_head),
1993 TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "",
1994 TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : "");
1997 list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) {
1998 if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) {
2000 list_del(&__tpd->entry);
2006 hprintk("unable to locate tpd for dma buffer %x\n",
2007 TBRQ_TPD(he_dev->tbrq_head));
2008 goto next_tbrq_entry;
2011 tpd = &he_dev->tpd_base[ TPD_INDEX(TBRQ_TPD(he_dev->tbrq_head)) ];
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));
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,
2029 if (tpd->iovec[slot].len & TPD_LST)
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);
2038 dev_kfree_skb_any(tpd->skb);
2044 pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
2048 he_dev->tbrq_head = (struct he_tbrq *)
2049 ((unsigned long) he_dev->tbrq_base |
2050 TBRQ_MASK(++he_dev->tbrq_head));
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));
2064 he_service_rbpl(struct he_dev *he_dev, int group)
2066 struct he_rbp *newtail;
2067 struct he_rbp *rbpl_head;
2070 rbpl_head = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base |
2071 RBPL_MASK(he_readl(he_dev, G0_RBPL_S)));
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))
2081 newtail->status |= RBP_LOANED;
2082 he_dev->rbpl_tail = newtail;
2087 he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T);
2092 he_service_rbps(struct he_dev *he_dev, int group)
2094 struct he_rbp *newtail;
2095 struct he_rbp *rbps_head;
2098 rbps_head = (struct he_rbp *) ((unsigned long)he_dev->rbps_base |
2099 RBPS_MASK(he_readl(he_dev, G0_RBPS_S)));
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))
2109 newtail->status |= RBP_LOANED;
2110 he_dev->rbps_tail = newtail;
2115 he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T);
2117 #endif /* USE_RBPS */
2120 he_tasklet(unsigned long data)
2122 unsigned long flags;
2123 struct he_dev *he_dev = (struct he_dev *) data;
2127 HPRINTK("tasklet (0x%lx)\n", data);
2129 spin_lock_irqsave(&he_dev->global_lock, flags);
2132 while (he_dev->irq_head != he_dev->irq_tail) {
2135 type = ITYPE_TYPE(he_dev->irq_head->isw);
2136 group = ITYPE_GROUP(he_dev->irq_head->isw);
2139 case ITYPE_RBRQ_THRESH:
2140 HPRINTK("rbrq%d threshold\n", group);
2142 case ITYPE_RBRQ_TIMER:
2143 if (he_service_rbrq(he_dev, group)) {
2144 he_service_rbpl(he_dev, group);
2146 he_service_rbps(he_dev, group);
2147 #endif /* USE_RBPS */
2150 case ITYPE_TBRQ_THRESH:
2151 HPRINTK("tbrq%d threshold\n", group);
2153 case ITYPE_TPD_COMPLETE:
2154 he_service_tbrq(he_dev, group);
2156 case ITYPE_RBPL_THRESH:
2157 he_service_rbpl(he_dev, group);
2159 case ITYPE_RBPS_THRESH:
2161 he_service_rbps(he_dev, group);
2162 #endif /* USE_RBPS */
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);
2174 switch (type|group) {
2176 hprintk("parity error\n");
2179 hprintk("abort 0x%x\n", he_readl(he_dev, ABORT_ADDR));
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);
2191 he_service_rbps(he_dev, 0);
2192 #endif /* USE_RBPS */
2193 he_service_tbrq(he_dev, 0);
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);
2205 if (updated > he_dev->irq_peak)
2206 he_dev->irq_peak = updated;
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 */
2215 spin_unlock_irqrestore(&he_dev->global_lock, flags);
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;
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 */
2242 if (he_dev->irq_head == he_dev->irq_tail /* && !IRQ_PENDING */)
2243 hprintk("spurious (or shared) interrupt?\n");
2246 if (he_dev->irq_head != he_dev->irq_tail) {
2249 tasklet_schedule(&he_dev->tasklet);
2251 he_tasklet((unsigned long) he_dev);
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);
2289 * push tpd onto a transmit backlog queue
2290 * after service_tbrq, service the backlog
2291 * for now, we just drop the pdu
2295 tpd->vcc->pop(tpd->vcc, tpd->skb);
2297 dev_kfree_skb_any(tpd->skb);
2298 atomic_inc(&tpd->vcc->stats->tx_err);
2301 pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
2309 /* 2.1.5 transmit packet descriptor ready queue */
2311 list_add_tail(&tpd->entry, &he_dev->outstanding_tpds);
2312 he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status);
2314 he_dev->tpdrq_tail->tpd = he_dev->tpd_base_phys +
2315 (TPD_INDEX(tpd->status) * sizeof(struct he_tpd));
2317 he_dev->tpdrq_tail->cid = cid;
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 */
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;
2333 unsigned cid, rsr0, rsr1, rsr4, tsr0, tsr0_aal, tsr4, period, reg, clock;
2334 short vpi = vcc->vpi;
2337 if (vci == ATM_VCI_UNSPEC || vpi == ATM_VPI_UNSPEC)
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");
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) {
2364 pcr_goal = atm_pcr_goal(&vcc->qos.txtp);
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) {
2374 tsr0_aal = TSR0_AAL5;
2378 tsr0_aal = TSR0_AAL0_SDU;
2379 tsr4 = TSR4_AAL0_SDU;
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);
2396 switch (vcc->qos.txtp.traffic_class) {
2398 /* 2.3.3.1 open connection ubr */
2400 tsr0 = TSR0_UBR | TSR0_GROUP(0) | tsr0_aal |
2401 TSR0_USE_WMIN | TSR0_UPDATE_GER;
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))
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)
2423 if (reg == HE_NUM_CS_STPER) {
2425 spin_unlock_irqrestore(&he_dev->global_lock, flags);
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",
2441 he_writel_mbox(he_dev, rate_to_atmf(period/2),
2443 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2445 tsr0 = TSR0_CBR | TSR0_GROUP(0) | tsr0_aal |
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) {
2480 HPRINTK("open rx cid 0x%x (rx_waitq %p)\n", cid,
2481 &HE_VCC(vcc)->rx_waitq);
2483 switch (vcc->qos.aal) {
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);
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;
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);
2536 clear_bit(ATM_VF_ADDR, &vcc->flags);
2539 set_bit(ATM_VF_READY, &vcc->flags);
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);
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) {
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);
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);
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;
2600 HPRINTK("close tx cid 0x%x\n", cid);
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)) {
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) {
2631 he_writel_tsr1(he_dev,
2632 TSR1_MCR(rate_to_atmf(200000))
2633 | TSR1_PCR(0), cid);
2636 he_writel_tsr14_upper(he_dev, TSR14_DELETE, cid);
2639 (void) he_readl_tsr4(he_dev, cid); /* flush posted writes */
2641 tpd = __alloc_tpd(he_dev);
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;
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);
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);
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);
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);
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);
2699 clear_bit(ATM_VF_ADDR, &vcc->flags);
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);
2709 #ifdef USE_SCATTERGATHER
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 );
2723 dev_kfree_skb_any(skb);
2724 atomic_inc(&vcc->stats->tx_err);
2728 #ifndef USE_SCATTERGATHER
2729 if (skb_shinfo(skb)->nr_frags) {
2730 hprintk("no scatter/gather support\n");
2734 dev_kfree_skb_any(skb);
2735 atomic_inc(&vcc->stats->tx_err);
2739 spin_lock_irqsave(&he_dev->global_lock, flags);
2741 tpd = __alloc_tpd(he_dev);
2746 dev_kfree_skb_any(skb);
2747 atomic_inc(&vcc->stats->tx_err);
2748 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2752 if (vcc->qos.aal == ATM_AAL5)
2753 tpd->status |= TPD_CELLTYPE(TPD_USERCELL);
2755 char *pti_clp = (void *) (skb->data + 3);
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);
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;
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 */
2778 tpd->skb = NULL; /* not the last fragment
2779 so dont ->push() yet */
2782 __enqueue_tpd(he_dev, tpd, cid);
2783 tpd = __alloc_tpd(he_dev);
2788 dev_kfree_skb_any(skb);
2789 atomic_inc(&vcc->stats->tx_err);
2790 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2793 tpd->status |= TPD_USERCELL;
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;
2805 tpd->iovec[slot - 1].len |= TPD_LST;
2807 tpd->address0 = pci_map_single(he_dev->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE);
2808 tpd->length0 = skb->len | TPD_LST;
2810 tpd->status |= TPD_INT;
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);
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;
2835 if (!capable(CAP_NET_ADMIN))
2838 if (copy_from_user(®, arg,
2839 sizeof(struct he_ioctl_reg)))
2842 spin_lock_irqsave(&he_dev->global_lock, flags);
2844 case HE_REGTYPE_PCI:
2845 reg.val = he_readl(he_dev, reg.addr);
2847 case HE_REGTYPE_RCM:
2849 he_readl_rcm(he_dev, reg.addr);
2851 case HE_REGTYPE_TCM:
2853 he_readl_tcm(he_dev, reg.addr);
2855 case HE_REGTYPE_MBOX:
2857 he_readl_mbox(he_dev, reg.addr);
2863 spin_unlock_irqrestore(&he_dev->global_lock, flags);
2865 if (copy_to_user(arg, ®,
2866 sizeof(struct he_ioctl_reg)))
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 */
2875 #endif /* CONFIG_ATM_HE_USE_SUNI */
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);
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);
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);
2919 struct he_rbrq *rbrq_tail;
2920 struct he_tpdrq *tpdrq_head;
2921 int rbpl_head, rbpl_tail;
2923 static long mcc = 0, oec = 0, dcc = 0, cec = 0;
2928 return sprintf(page, "%s\n", version);
2931 return sprintf(page, "%s%s\n\n",
2932 he_dev->prod_id, he_dev->media & 0x40 ? "SM" : "MM");
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);
2945 return sprintf(page, "%16ld %16ld %13ld %17ld\n\n",
2946 mcc, oec, dcc, cec);
2949 return sprintf(page, "irq_size = %d inuse = ? peak = %d\n",
2950 CONFIG_IRQ_SIZE, he_dev->irq_peak);
2953 return sprintf(page, "tpdrq_size = %d inuse = ?\n",
2957 return sprintf(page, "rbrq_size = %d inuse = ? peak = %d\n",
2958 CONFIG_RBRQ_SIZE, he_dev->rbrq_peak);
2961 return sprintf(page, "tbrq_size = %d peak = %d\n",
2962 CONFIG_TBRQ_SIZE, he_dev->tbrq_peak);
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;
2971 inuse += CONFIG_RBPL_SIZE * sizeof(struct he_rbp);
2972 inuse /= sizeof(struct he_rbp);
2975 return sprintf(page, "rbpl_size = %d inuse = %d\n\n",
2976 CONFIG_RBPL_SIZE, inuse);
2980 return sprintf(page, "rate controller periods (cbr)\n pcr #vc\n");
2982 for (i = 0; i < HE_NUM_CS_STPER; ++i)
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);
2989 return sprintf(page, "total bw (cbr): %d (limit %d)\n",
2990 he_dev->total_bw, he_dev->atm_dev->link_rate * 10 / 9);
2995 /* eeprom routines -- see 4.7 */
2998 read_prom_byte(struct he_dev *he_dev, int addr)
3000 u32 val = 0, tmp_read = 0;
3004 val = readl(he_dev->membase + HOST_CNTL);
3007 /* Turn on write enable */
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);
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);
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,
3069 MODULE_DEVICE_TABLE(pci, he_pci_tbl);
3071 static struct pci_driver he_driver = {
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);