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