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