linux/drivers/atm/solos-pci.c
<<
>>
Prefs
   1/*
   2 * Driver for the Solos PCI ADSL2+ card, designed to support Linux by
   3 *  Traverse Technologies -- http://www.traverse.com.au/
   4 *  Xrio Limited          -- http://www.xrio.com/
   5 *
   6 *
   7 * Copyright © 2008 Traverse Technologies
   8 * Copyright © 2008 Intel Corporation
   9 *
  10 * Authors: Nathan Williams <nathan@traverse.com.au>
  11 *          David Woodhouse <dwmw2@infradead.org>
  12 *          Treker Chen <treker@xrio.com>
  13 *
  14 * This program is free software; you can redistribute it and/or
  15 * modify it under the terms of the GNU General Public License
  16 * version 2, as published by the Free Software Foundation.
  17 *
  18 * This program is distributed in the hope that it will be useful,
  19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 * GNU General Public License for more details.
  22 */
  23
  24#define DEBUG
  25#define VERBOSE_DEBUG
  26
  27#include <linux/interrupt.h>
  28#include <linux/module.h>
  29#include <linux/kernel.h>
  30#include <linux/errno.h>
  31#include <linux/ioport.h>
  32#include <linux/types.h>
  33#include <linux/pci.h>
  34#include <linux/atm.h>
  35#include <linux/atmdev.h>
  36#include <linux/skbuff.h>
  37#include <linux/sysfs.h>
  38#include <linux/device.h>
  39#include <linux/kobject.h>
  40#include <linux/firmware.h>
  41#include <linux/ctype.h>
  42#include <linux/swab.h>
  43#include <linux/slab.h>
  44
  45#define VERSION "0.07"
  46#define PTAG "solos-pci"
  47
  48#define CONFIG_RAM_SIZE 128
  49#define FLAGS_ADDR      0x7C
  50#define IRQ_EN_ADDR     0x78
  51#define FPGA_VER        0x74
  52#define IRQ_CLEAR       0x70
  53#define WRITE_FLASH     0x6C
  54#define PORTS           0x68
  55#define FLASH_BLOCK     0x64
  56#define FLASH_BUSY      0x60
  57#define FPGA_MODE       0x5C
  58#define FLASH_MODE      0x58
  59#define TX_DMA_ADDR(port)       (0x40 + (4 * (port)))
  60#define RX_DMA_ADDR(port)       (0x30 + (4 * (port)))
  61
  62#define DATA_RAM_SIZE   32768
  63#define BUF_SIZE        2048
  64#define OLD_BUF_SIZE    4096 /* For FPGA versions <= 2*/
  65#define FPGA_PAGE       528 /* FPGA flash page size*/
  66#define SOLOS_PAGE      512 /* Solos flash page size*/
  67#define FPGA_BLOCK      (FPGA_PAGE * 8) /* FPGA flash block size*/
  68#define SOLOS_BLOCK     (SOLOS_PAGE * 8) /* Solos flash block size*/
  69
  70#define RX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2)
  71#define TX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2 + (card->buffer_size))
  72#define FLASH_BUF ((card->buffers) + 4*(card->buffer_size)*2)
  73
  74#define RX_DMA_SIZE     2048
  75
  76#define FPGA_VERSION(a,b) (((a) << 8) + (b))
  77#define LEGACY_BUFFERS  2
  78#define DMA_SUPPORTED   4
  79
  80static int reset = 0;
  81static int atmdebug = 0;
  82static int firmware_upgrade = 0;
  83static int fpga_upgrade = 0;
  84static int db_firmware_upgrade = 0;
  85static int db_fpga_upgrade = 0;
  86
  87struct pkt_hdr {
  88        __le16 size;
  89        __le16 vpi;
  90        __le16 vci;
  91        __le16 type;
  92};
  93
  94struct solos_skb_cb {
  95        struct atm_vcc *vcc;
  96        uint32_t dma_addr;
  97};
  98
  99
 100#define SKB_CB(skb)             ((struct solos_skb_cb *)skb->cb)
 101
 102#define PKT_DATA        0
 103#define PKT_COMMAND     1
 104#define PKT_POPEN       3
 105#define PKT_PCLOSE      4
 106#define PKT_STATUS      5
 107
 108struct solos_card {
 109        void __iomem *config_regs;
 110        void __iomem *buffers;
 111        int nr_ports;
 112        int tx_mask;
 113        struct pci_dev *dev;
 114        struct atm_dev *atmdev[4];
 115        struct tasklet_struct tlet;
 116        spinlock_t tx_lock;
 117        spinlock_t tx_queue_lock;
 118        spinlock_t cli_queue_lock;
 119        spinlock_t param_queue_lock;
 120        struct list_head param_queue;
 121        struct sk_buff_head tx_queue[4];
 122        struct sk_buff_head cli_queue[4];
 123        struct sk_buff *tx_skb[4];
 124        struct sk_buff *rx_skb[4];
 125        wait_queue_head_t param_wq;
 126        wait_queue_head_t fw_wq;
 127        int using_dma;
 128        int fpga_version;
 129        int buffer_size;
 130};
 131
 132
 133struct solos_param {
 134        struct list_head list;
 135        pid_t pid;
 136        int port;
 137        struct sk_buff *response;
 138};
 139
 140#define SOLOS_CHAN(atmdev) ((int)(unsigned long)(atmdev)->phy_data)
 141
 142MODULE_AUTHOR("Traverse Technologies <support@traverse.com.au>");
 143MODULE_DESCRIPTION("Solos PCI driver");
 144MODULE_VERSION(VERSION);
 145MODULE_LICENSE("GPL");
 146MODULE_FIRMWARE("solos-FPGA.bin");
 147MODULE_FIRMWARE("solos-Firmware.bin");
 148MODULE_FIRMWARE("solos-db-FPGA.bin");
 149MODULE_PARM_DESC(reset, "Reset Solos chips on startup");
 150MODULE_PARM_DESC(atmdebug, "Print ATM data");
 151MODULE_PARM_DESC(firmware_upgrade, "Initiate Solos firmware upgrade");
 152MODULE_PARM_DESC(fpga_upgrade, "Initiate FPGA upgrade");
 153MODULE_PARM_DESC(db_firmware_upgrade, "Initiate daughter board Solos firmware upgrade");
 154MODULE_PARM_DESC(db_fpga_upgrade, "Initiate daughter board FPGA upgrade");
 155module_param(reset, int, 0444);
 156module_param(atmdebug, int, 0644);
 157module_param(firmware_upgrade, int, 0444);
 158module_param(fpga_upgrade, int, 0444);
 159module_param(db_firmware_upgrade, int, 0444);
 160module_param(db_fpga_upgrade, int, 0444);
 161
 162static void fpga_queue(struct solos_card *card, int port, struct sk_buff *skb,
 163                       struct atm_vcc *vcc);
 164static uint32_t fpga_tx(struct solos_card *);
 165static irqreturn_t solos_irq(int irq, void *dev_id);
 166static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci);
 167static int list_vccs(int vci);
 168static void release_vccs(struct atm_dev *dev);
 169static int atm_init(struct solos_card *, struct device *);
 170static void atm_remove(struct solos_card *);
 171static int send_command(struct solos_card *card, int dev, const char *buf, size_t size);
 172static void solos_bh(unsigned long);
 173static int print_buffer(struct sk_buff *buf);
 174
 175static inline void solos_pop(struct atm_vcc *vcc, struct sk_buff *skb)
 176{
 177        if (vcc->pop)
 178                vcc->pop(vcc, skb);
 179        else
 180                dev_kfree_skb_any(skb);
 181}
 182
 183static ssize_t solos_param_show(struct device *dev, struct device_attribute *attr,
 184                                char *buf)
 185{
 186        struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
 187        struct solos_card *card = atmdev->dev_data;
 188        struct solos_param prm;
 189        struct sk_buff *skb;
 190        struct pkt_hdr *header;
 191        int buflen;
 192
 193        buflen = strlen(attr->attr.name) + 10;
 194
 195        skb = alloc_skb(sizeof(*header) + buflen, GFP_KERNEL);
 196        if (!skb) {
 197                dev_warn(&card->dev->dev, "Failed to allocate sk_buff in solos_param_show()\n");
 198                return -ENOMEM;
 199        }
 200
 201        header = (void *)skb_put(skb, sizeof(*header));
 202
 203        buflen = snprintf((void *)&header[1], buflen - 1,
 204                          "L%05d\n%s\n", current->pid, attr->attr.name);
 205        skb_put(skb, buflen);
 206
 207        header->size = cpu_to_le16(buflen);
 208        header->vpi = cpu_to_le16(0);
 209        header->vci = cpu_to_le16(0);
 210        header->type = cpu_to_le16(PKT_COMMAND);
 211
 212        prm.pid = current->pid;
 213        prm.response = NULL;
 214        prm.port = SOLOS_CHAN(atmdev);
 215
 216        spin_lock_irq(&card->param_queue_lock);
 217        list_add(&prm.list, &card->param_queue);
 218        spin_unlock_irq(&card->param_queue_lock);
 219
 220        fpga_queue(card, prm.port, skb, NULL);
 221
 222        wait_event_timeout(card->param_wq, prm.response, 5 * HZ);
 223
 224        spin_lock_irq(&card->param_queue_lock);
 225        list_del(&prm.list);
 226        spin_unlock_irq(&card->param_queue_lock);
 227
 228        if (!prm.response)
 229                return -EIO;
 230
 231        buflen = prm.response->len;
 232        memcpy(buf, prm.response->data, buflen);
 233        kfree_skb(prm.response);
 234
 235        return buflen;
 236}
 237
 238static ssize_t solos_param_store(struct device *dev, struct device_attribute *attr,
 239                                 const char *buf, size_t count)
 240{
 241        struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
 242        struct solos_card *card = atmdev->dev_data;
 243        struct solos_param prm;
 244        struct sk_buff *skb;
 245        struct pkt_hdr *header;
 246        int buflen;
 247        ssize_t ret;
 248
 249        buflen = strlen(attr->attr.name) + 11 + count;
 250
 251        skb = alloc_skb(sizeof(*header) + buflen, GFP_KERNEL);
 252        if (!skb) {
 253                dev_warn(&card->dev->dev, "Failed to allocate sk_buff in solos_param_store()\n");
 254                return -ENOMEM;
 255        }
 256
 257        header = (void *)skb_put(skb, sizeof(*header));
 258
 259        buflen = snprintf((void *)&header[1], buflen - 1,
 260                          "L%05d\n%s\n%s\n", current->pid, attr->attr.name, buf);
 261
 262        skb_put(skb, buflen);
 263        header->size = cpu_to_le16(buflen);
 264        header->vpi = cpu_to_le16(0);
 265        header->vci = cpu_to_le16(0);
 266        header->type = cpu_to_le16(PKT_COMMAND);
 267
 268        prm.pid = current->pid;
 269        prm.response = NULL;
 270        prm.port = SOLOS_CHAN(atmdev);
 271
 272        spin_lock_irq(&card->param_queue_lock);
 273        list_add(&prm.list, &card->param_queue);
 274        spin_unlock_irq(&card->param_queue_lock);
 275
 276        fpga_queue(card, prm.port, skb, NULL);
 277
 278        wait_event_timeout(card->param_wq, prm.response, 5 * HZ);
 279
 280        spin_lock_irq(&card->param_queue_lock);
 281        list_del(&prm.list);
 282        spin_unlock_irq(&card->param_queue_lock);
 283
 284        skb = prm.response;
 285
 286        if (!skb)
 287                return -EIO;
 288
 289        buflen = skb->len;
 290
 291        /* Sometimes it has a newline, sometimes it doesn't. */
 292        if (skb->data[buflen - 1] == '\n')
 293                buflen--;
 294
 295        if (buflen == 2 && !strncmp(skb->data, "OK", 2))
 296                ret = count;
 297        else if (buflen == 5 && !strncmp(skb->data, "ERROR", 5))
 298                ret = -EIO;
 299        else {
 300                /* We know we have enough space allocated for this; we allocated 
 301                   it ourselves */
 302                skb->data[buflen] = 0;
 303        
 304                dev_warn(&card->dev->dev, "Unexpected parameter response: '%s'\n",
 305                         skb->data);
 306                ret = -EIO;
 307        }
 308        kfree_skb(skb);
 309
 310        return ret;
 311}
 312
 313static char *next_string(struct sk_buff *skb)
 314{
 315        int i = 0;
 316        char *this = skb->data;
 317        
 318        for (i = 0; i < skb->len; i++) {
 319                if (this[i] == '\n') {
 320                        this[i] = 0;
 321                        skb_pull(skb, i + 1);
 322                        return this;
 323                }
 324                if (!isprint(this[i]))
 325                        return NULL;
 326        }
 327        return NULL;
 328}
 329
 330/*
 331 * Status packet has fields separated by \n, starting with a version number
 332 * for the information therein. Fields are....
 333 *
 334 *     packet version
 335 *     RxBitRate        (version >= 1)
 336 *     TxBitRate        (version >= 1)
 337 *     State            (version >= 1)
 338 *     LocalSNRMargin   (version >= 1)
 339 *     LocalLineAttn    (version >= 1)
 340 */       
 341static int process_status(struct solos_card *card, int port, struct sk_buff *skb)
 342{
 343        char *str, *end, *state_str, *snr, *attn;
 344        int ver, rate_up, rate_down;
 345
 346        if (!card->atmdev[port])
 347                return -ENODEV;
 348
 349        str = next_string(skb);
 350        if (!str)
 351                return -EIO;
 352
 353        ver = simple_strtol(str, NULL, 10);
 354        if (ver < 1) {
 355                dev_warn(&card->dev->dev, "Unexpected status interrupt version %d\n",
 356                         ver);
 357                return -EIO;
 358        }
 359
 360        str = next_string(skb);
 361        if (!str)
 362                return -EIO;
 363        if (!strcmp(str, "ERROR")) {
 364                dev_dbg(&card->dev->dev, "Status packet indicated Solos error on port %d (starting up?)\n",
 365                         port);
 366                return 0;
 367        }
 368
 369        rate_down = simple_strtol(str, &end, 10);
 370        if (*end)
 371                return -EIO;
 372
 373        str = next_string(skb);
 374        if (!str)
 375                return -EIO;
 376        rate_up = simple_strtol(str, &end, 10);
 377        if (*end)
 378                return -EIO;
 379
 380        state_str = next_string(skb);
 381        if (!state_str)
 382                return -EIO;
 383
 384        /* Anything but 'Showtime' is down */
 385        if (strcmp(state_str, "Showtime")) {
 386                atm_dev_signal_change(card->atmdev[port], ATM_PHY_SIG_LOST);
 387                release_vccs(card->atmdev[port]);
 388                dev_info(&card->dev->dev, "Port %d: %s\n", port, state_str);
 389                return 0;
 390        }
 391
 392        snr = next_string(skb);
 393        if (!snr)
 394                return -EIO;
 395        attn = next_string(skb);
 396        if (!attn)
 397                return -EIO;
 398
 399        dev_info(&card->dev->dev, "Port %d: %s @%d/%d kb/s%s%s%s%s\n",
 400                 port, state_str, rate_down/1000, rate_up/1000,
 401                 snr[0]?", SNR ":"", snr, attn[0]?", Attn ":"", attn);
 402        
 403        card->atmdev[port]->link_rate = rate_down / 424;
 404        atm_dev_signal_change(card->atmdev[port], ATM_PHY_SIG_FOUND);
 405
 406        return 0;
 407}
 408
 409static int process_command(struct solos_card *card, int port, struct sk_buff *skb)
 410{
 411        struct solos_param *prm;
 412        unsigned long flags;
 413        int cmdpid;
 414        int found = 0;
 415
 416        if (skb->len < 7)
 417                return 0;
 418
 419        if (skb->data[0] != 'L'    || !isdigit(skb->data[1]) ||
 420            !isdigit(skb->data[2]) || !isdigit(skb->data[3]) ||
 421            !isdigit(skb->data[4]) || !isdigit(skb->data[5]) ||
 422            skb->data[6] != '\n')
 423                return 0;
 424
 425        cmdpid = simple_strtol(&skb->data[1], NULL, 10);
 426
 427        spin_lock_irqsave(&card->param_queue_lock, flags);
 428        list_for_each_entry(prm, &card->param_queue, list) {
 429                if (prm->port == port && prm->pid == cmdpid) {
 430                        prm->response = skb;
 431                        skb_pull(skb, 7);
 432                        wake_up(&card->param_wq);
 433                        found = 1;
 434                        break;
 435                }
 436        }
 437        spin_unlock_irqrestore(&card->param_queue_lock, flags);
 438        return found;
 439}
 440
 441static ssize_t console_show(struct device *dev, struct device_attribute *attr,
 442                            char *buf)
 443{
 444        struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
 445        struct solos_card *card = atmdev->dev_data;
 446        struct sk_buff *skb;
 447        unsigned int len;
 448
 449        spin_lock(&card->cli_queue_lock);
 450        skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]);
 451        spin_unlock(&card->cli_queue_lock);
 452        if(skb == NULL)
 453                return sprintf(buf, "No data.\n");
 454
 455        len = skb->len;
 456        memcpy(buf, skb->data, len);
 457        dev_dbg(&card->dev->dev, "len: %d\n", len);
 458
 459        kfree_skb(skb);
 460        return len;
 461}
 462
 463static int send_command(struct solos_card *card, int dev, const char *buf, size_t size)
 464{
 465        struct sk_buff *skb;
 466        struct pkt_hdr *header;
 467
 468        if (size > (BUF_SIZE - sizeof(*header))) {
 469                dev_dbg(&card->dev->dev, "Command is too big.  Dropping request\n");
 470                return 0;
 471        }
 472        skb = alloc_skb(size + sizeof(*header), GFP_ATOMIC);
 473        if (!skb) {
 474                dev_warn(&card->dev->dev, "Failed to allocate sk_buff in send_command()\n");
 475                return 0;
 476        }
 477
 478        header = (void *)skb_put(skb, sizeof(*header));
 479
 480        header->size = cpu_to_le16(size);
 481        header->vpi = cpu_to_le16(0);
 482        header->vci = cpu_to_le16(0);
 483        header->type = cpu_to_le16(PKT_COMMAND);
 484
 485        memcpy(skb_put(skb, size), buf, size);
 486
 487        fpga_queue(card, dev, skb, NULL);
 488
 489        return 0;
 490}
 491
 492static ssize_t console_store(struct device *dev, struct device_attribute *attr,
 493                             const char *buf, size_t count)
 494{
 495        struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
 496        struct solos_card *card = atmdev->dev_data;
 497        int err;
 498
 499        err = send_command(card, SOLOS_CHAN(atmdev), buf, count);
 500
 501        return err?:count;
 502}
 503
 504static DEVICE_ATTR(console, 0644, console_show, console_store);
 505
 506
 507#define SOLOS_ATTR_RO(x) static DEVICE_ATTR(x, 0444, solos_param_show, NULL);
 508#define SOLOS_ATTR_RW(x) static DEVICE_ATTR(x, 0644, solos_param_show, solos_param_store);
 509
 510#include "solos-attrlist.c"
 511
 512#undef SOLOS_ATTR_RO
 513#undef SOLOS_ATTR_RW
 514
 515#define SOLOS_ATTR_RO(x) &dev_attr_##x.attr,
 516#define SOLOS_ATTR_RW(x) &dev_attr_##x.attr,
 517
 518static struct attribute *solos_attrs[] = {
 519#include "solos-attrlist.c"
 520        NULL
 521};
 522
 523static struct attribute_group solos_attr_group = {
 524        .attrs = solos_attrs,
 525        .name = "parameters",
 526};
 527
 528static int flash_upgrade(struct solos_card *card, int chip)
 529{
 530        const struct firmware *fw;
 531        const char *fw_name;
 532        uint32_t data32 = 0;
 533        int blocksize = 0;
 534        int numblocks = 0;
 535        int offset;
 536
 537        switch (chip) {
 538        case 0:
 539                fw_name = "solos-FPGA.bin";
 540                blocksize = FPGA_BLOCK;
 541                break;
 542        case 1:
 543                fw_name = "solos-Firmware.bin";
 544                blocksize = SOLOS_BLOCK;
 545                break;
 546        case 2:
 547                if (card->fpga_version > LEGACY_BUFFERS){
 548                        fw_name = "solos-db-FPGA.bin";
 549                        blocksize = FPGA_BLOCK;
 550                } else {
 551                        dev_info(&card->dev->dev, "FPGA version doesn't support"
 552                                        " daughter board upgrades\n");
 553                        return -EPERM;
 554                }
 555                break;
 556        case 3:
 557                if (card->fpga_version > LEGACY_BUFFERS){
 558                        fw_name = "solos-Firmware.bin";
 559                        blocksize = SOLOS_BLOCK;
 560                } else {
 561                        dev_info(&card->dev->dev, "FPGA version doesn't support"
 562                                        " daughter board upgrades\n");
 563                        return -EPERM;
 564                }
 565                break;
 566        default:
 567                return -ENODEV;
 568        }
 569
 570        if (request_firmware(&fw, fw_name, &card->dev->dev))
 571                return -ENOENT;
 572
 573        dev_info(&card->dev->dev, "Flash upgrade starting\n");
 574
 575        numblocks = fw->size / blocksize;
 576        dev_info(&card->dev->dev, "Firmware size: %zd\n", fw->size);
 577        dev_info(&card->dev->dev, "Number of blocks: %d\n", numblocks);
 578        
 579        dev_info(&card->dev->dev, "Changing FPGA to Update mode\n");
 580        iowrite32(1, card->config_regs + FPGA_MODE);
 581        data32 = ioread32(card->config_regs + FPGA_MODE); 
 582
 583        /* Set mode to Chip Erase */
 584        if(chip == 0 || chip == 2)
 585                dev_info(&card->dev->dev, "Set FPGA Flash mode to FPGA Chip Erase\n");
 586        if(chip == 1 || chip == 3)
 587                dev_info(&card->dev->dev, "Set FPGA Flash mode to Solos Chip Erase\n");
 588        iowrite32((chip * 2), card->config_regs + FLASH_MODE);
 589
 590
 591        iowrite32(1, card->config_regs + WRITE_FLASH);
 592        wait_event(card->fw_wq, !ioread32(card->config_regs + FLASH_BUSY));
 593
 594        for (offset = 0; offset < fw->size; offset += blocksize) {
 595                int i;
 596
 597                /* Clear write flag */
 598                iowrite32(0, card->config_regs + WRITE_FLASH);
 599
 600                /* Set mode to Block Write */
 601                /* dev_info(&card->dev->dev, "Set FPGA Flash mode to Block Write\n"); */
 602                iowrite32(((chip * 2) + 1), card->config_regs + FLASH_MODE);
 603
 604                /* Copy block to buffer, swapping each 16 bits */
 605                for(i = 0; i < blocksize; i += 4) {
 606                        uint32_t word = swahb32p((uint32_t *)(fw->data + offset + i));
 607                        if(card->fpga_version > LEGACY_BUFFERS)
 608                                iowrite32(word, FLASH_BUF + i);
 609                        else
 610                                iowrite32(word, RX_BUF(card, 3) + i);
 611                }
 612
 613                /* Specify block number and then trigger flash write */
 614                iowrite32(offset / blocksize, card->config_regs + FLASH_BLOCK);
 615                iowrite32(1, card->config_regs + WRITE_FLASH);
 616                wait_event(card->fw_wq, !ioread32(card->config_regs + FLASH_BUSY));
 617        }
 618
 619        release_firmware(fw);
 620        iowrite32(0, card->config_regs + WRITE_FLASH);
 621        iowrite32(0, card->config_regs + FPGA_MODE);
 622        iowrite32(0, card->config_regs + FLASH_MODE);
 623        dev_info(&card->dev->dev, "Returning FPGA to Data mode\n");
 624        return 0;
 625}
 626
 627static irqreturn_t solos_irq(int irq, void *dev_id)
 628{
 629        struct solos_card *card = dev_id;
 630        int handled = 1;
 631
 632        iowrite32(0, card->config_regs + IRQ_CLEAR);
 633
 634        /* If we're up and running, just kick the tasklet to process TX/RX */
 635        if (card->atmdev[0])
 636                tasklet_schedule(&card->tlet);
 637        else
 638                wake_up(&card->fw_wq);
 639
 640        return IRQ_RETVAL(handled);
 641}
 642
 643void solos_bh(unsigned long card_arg)
 644{
 645        struct solos_card *card = (void *)card_arg;
 646        uint32_t card_flags;
 647        uint32_t rx_done = 0;
 648        int port;
 649
 650        /*
 651         * Since fpga_tx() is going to need to read the flags under its lock,
 652         * it can return them to us so that we don't have to hit PCI MMIO
 653         * again for the same information
 654         */
 655        card_flags = fpga_tx(card);
 656
 657        for (port = 0; port < card->nr_ports; port++) {
 658                if (card_flags & (0x10 << port)) {
 659                        struct pkt_hdr _hdr, *header;
 660                        struct sk_buff *skb;
 661                        struct atm_vcc *vcc;
 662                        int size;
 663
 664                        if (card->using_dma) {
 665                                skb = card->rx_skb[port];
 666                                card->rx_skb[port] = NULL;
 667
 668                                pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr,
 669                                                 RX_DMA_SIZE, PCI_DMA_FROMDEVICE);
 670
 671                                header = (void *)skb->data;
 672                                size = le16_to_cpu(header->size);
 673                                skb_put(skb, size + sizeof(*header));
 674                                skb_pull(skb, sizeof(*header));
 675                        } else {
 676                                header = &_hdr;
 677
 678                                rx_done |= 0x10 << port;
 679
 680                                memcpy_fromio(header, RX_BUF(card, port), sizeof(*header));
 681
 682                                size = le16_to_cpu(header->size);
 683                                if (size > (card->buffer_size - sizeof(*header))){
 684                                        dev_warn(&card->dev->dev, "Invalid buffer size\n");
 685                                        continue;
 686                                }
 687
 688                                skb = alloc_skb(size + 1, GFP_ATOMIC);
 689                                if (!skb) {
 690                                        if (net_ratelimit())
 691                                                dev_warn(&card->dev->dev, "Failed to allocate sk_buff for RX\n");
 692                                        continue;
 693                                }
 694
 695                                memcpy_fromio(skb_put(skb, size),
 696                                              RX_BUF(card, port) + sizeof(*header),
 697                                              size);
 698                        }
 699                        if (atmdebug) {
 700                                dev_info(&card->dev->dev, "Received: device %d\n", port);
 701                                dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n",
 702                                         size, le16_to_cpu(header->vpi),
 703                                         le16_to_cpu(header->vci));
 704                                print_buffer(skb);
 705                        }
 706
 707                        switch (le16_to_cpu(header->type)) {
 708                        case PKT_DATA:
 709                                vcc = find_vcc(card->atmdev[port], le16_to_cpu(header->vpi),
 710                                               le16_to_cpu(header->vci));
 711                                if (!vcc) {
 712                                        if (net_ratelimit())
 713                                                dev_warn(&card->dev->dev, "Received packet for unknown VCI.VPI %d.%d on port %d\n",
 714                                                         le16_to_cpu(header->vci), le16_to_cpu(header->vpi),
 715                                                         port);
 716                                        continue;
 717                                }
 718                                atm_charge(vcc, skb->truesize);
 719                                vcc->push(vcc, skb);
 720                                atomic_inc(&vcc->stats->rx);
 721                                break;
 722
 723                        case PKT_STATUS:
 724                                if (process_status(card, port, skb) &&
 725                                    net_ratelimit()) {
 726                                        dev_warn(&card->dev->dev, "Bad status packet of %d bytes on port %d:\n", skb->len, port);
 727                                        print_buffer(skb);
 728                                }
 729                                dev_kfree_skb_any(skb);
 730                                break;
 731
 732                        case PKT_COMMAND:
 733                        default: /* FIXME: Not really, surely? */
 734                                if (process_command(card, port, skb))
 735                                        break;
 736                                spin_lock(&card->cli_queue_lock);
 737                                if (skb_queue_len(&card->cli_queue[port]) > 10) {
 738                                        if (net_ratelimit())
 739                                                dev_warn(&card->dev->dev, "Dropping console response on port %d\n",
 740                                                         port);
 741                                        dev_kfree_skb_any(skb);
 742                                } else
 743                                        skb_queue_tail(&card->cli_queue[port], skb);
 744                                spin_unlock(&card->cli_queue_lock);
 745                                break;
 746                        }
 747                }
 748                /* Allocate RX skbs for any ports which need them */
 749                if (card->using_dma && card->atmdev[port] &&
 750                    !card->rx_skb[port]) {
 751                        struct sk_buff *skb = alloc_skb(RX_DMA_SIZE, GFP_ATOMIC);
 752                        if (skb) {
 753                                SKB_CB(skb)->dma_addr =
 754                                        pci_map_single(card->dev, skb->data,
 755                                                       RX_DMA_SIZE, PCI_DMA_FROMDEVICE);
 756                                iowrite32(SKB_CB(skb)->dma_addr,
 757                                          card->config_regs + RX_DMA_ADDR(port));
 758                                card->rx_skb[port] = skb;
 759                        } else {
 760                                if (net_ratelimit())
 761                                        dev_warn(&card->dev->dev, "Failed to allocate RX skb");
 762
 763                                /* We'll have to try again later */
 764                                tasklet_schedule(&card->tlet);
 765                        }
 766                }
 767        }
 768        if (rx_done)
 769                iowrite32(rx_done, card->config_regs + FLAGS_ADDR);
 770
 771        return;
 772}
 773
 774static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci)
 775{
 776        struct hlist_head *head;
 777        struct atm_vcc *vcc = NULL;
 778        struct hlist_node *node;
 779        struct sock *s;
 780
 781        read_lock(&vcc_sklist_lock);
 782        head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
 783        sk_for_each(s, node, head) {
 784                vcc = atm_sk(s);
 785                if (vcc->dev == dev && vcc->vci == vci &&
 786                    vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE &&
 787                    test_bit(ATM_VF_READY, &vcc->flags))
 788                        goto out;
 789        }
 790        vcc = NULL;
 791 out:
 792        read_unlock(&vcc_sklist_lock);
 793        return vcc;
 794}
 795
 796static int list_vccs(int vci)
 797{
 798        struct hlist_head *head;
 799        struct atm_vcc *vcc;
 800        struct hlist_node *node;
 801        struct sock *s;
 802        int num_found = 0;
 803        int i;
 804
 805        read_lock(&vcc_sklist_lock);
 806        if (vci != 0){
 807                head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
 808                sk_for_each(s, node, head) {
 809                        num_found ++;
 810                        vcc = atm_sk(s);
 811                        printk(KERN_DEBUG "Device: %d Vpi: %d Vci: %d\n",
 812                               vcc->dev->number,
 813                               vcc->vpi,
 814                               vcc->vci);
 815                }
 816        } else {
 817                for(i = 0; i < VCC_HTABLE_SIZE; i++){
 818                        head = &vcc_hash[i];
 819                        sk_for_each(s, node, head) {
 820                                num_found ++;
 821                                vcc = atm_sk(s);
 822                                printk(KERN_DEBUG "Device: %d Vpi: %d Vci: %d\n",
 823                                       vcc->dev->number,
 824                                       vcc->vpi,
 825                                       vcc->vci);
 826                        }
 827                }
 828        }
 829        read_unlock(&vcc_sklist_lock);
 830        return num_found;
 831}
 832
 833static void release_vccs(struct atm_dev *dev)
 834{
 835        int i;
 836
 837        write_lock_irq(&vcc_sklist_lock);
 838        for (i = 0; i < VCC_HTABLE_SIZE; i++) {
 839                struct hlist_head *head = &vcc_hash[i];
 840                struct hlist_node *node, *tmp;
 841                struct sock *s;
 842                struct atm_vcc *vcc;
 843
 844                sk_for_each_safe(s, node, tmp, head) {
 845                        vcc = atm_sk(s);
 846                        if (vcc->dev == dev) {
 847                                vcc_release_async(vcc, -EPIPE);
 848                                sk_del_node_init(s);
 849                        }
 850                }
 851        }
 852        write_unlock_irq(&vcc_sklist_lock);
 853}
 854
 855
 856static int popen(struct atm_vcc *vcc)
 857{
 858        struct solos_card *card = vcc->dev->dev_data;
 859        struct sk_buff *skb;
 860        struct pkt_hdr *header;
 861
 862        if (vcc->qos.aal != ATM_AAL5) {
 863                dev_warn(&card->dev->dev, "Unsupported ATM type %d\n",
 864                         vcc->qos.aal);
 865                return -EINVAL;
 866        }
 867
 868        skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
 869        if (!skb) {
 870                if (net_ratelimit())
 871                        dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
 872                return -ENOMEM;
 873        }
 874        header = (void *)skb_put(skb, sizeof(*header));
 875
 876        header->size = cpu_to_le16(0);
 877        header->vpi = cpu_to_le16(vcc->vpi);
 878        header->vci = cpu_to_le16(vcc->vci);
 879        header->type = cpu_to_le16(PKT_POPEN);
 880
 881        fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, NULL);
 882
 883        set_bit(ATM_VF_ADDR, &vcc->flags);
 884        set_bit(ATM_VF_READY, &vcc->flags);
 885        list_vccs(0);
 886
 887
 888        return 0;
 889}
 890
 891static void pclose(struct atm_vcc *vcc)
 892{
 893        struct solos_card *card = vcc->dev->dev_data;
 894        struct sk_buff *skb;
 895        struct pkt_hdr *header;
 896
 897        skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
 898        if (!skb) {
 899                dev_warn(&card->dev->dev, "Failed to allocate sk_buff in pclose()\n");
 900                return;
 901        }
 902        header = (void *)skb_put(skb, sizeof(*header));
 903
 904        header->size = cpu_to_le16(0);
 905        header->vpi = cpu_to_le16(vcc->vpi);
 906        header->vci = cpu_to_le16(vcc->vci);
 907        header->type = cpu_to_le16(PKT_PCLOSE);
 908
 909        fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, NULL);
 910
 911        clear_bit(ATM_VF_ADDR, &vcc->flags);
 912        clear_bit(ATM_VF_READY, &vcc->flags);
 913
 914        /* Hold up vcc_destroy_socket() (our caller) until solos_bh() in the
 915           tasklet has finished processing any incoming packets (and, more to
 916           the point, using the vcc pointer). */
 917        tasklet_unlock_wait(&card->tlet);
 918        return;
 919}
 920
 921static int print_buffer(struct sk_buff *buf)
 922{
 923        int len,i;
 924        char msg[500];
 925        char item[10];
 926
 927        len = buf->len;
 928        for (i = 0; i < len; i++){
 929                if(i % 8 == 0)
 930                        sprintf(msg, "%02X: ", i);
 931
 932                sprintf(item,"%02X ",*(buf->data + i));
 933                strcat(msg, item);
 934                if(i % 8 == 7) {
 935                        sprintf(item, "\n");
 936                        strcat(msg, item);
 937                        printk(KERN_DEBUG "%s", msg);
 938                }
 939        }
 940        if (i % 8 != 0) {
 941                sprintf(item, "\n");
 942                strcat(msg, item);
 943                printk(KERN_DEBUG "%s", msg);
 944        }
 945        printk(KERN_DEBUG "\n");
 946
 947        return 0;
 948}
 949
 950static void fpga_queue(struct solos_card *card, int port, struct sk_buff *skb,
 951                       struct atm_vcc *vcc)
 952{
 953        int old_len;
 954        unsigned long flags;
 955
 956        SKB_CB(skb)->vcc = vcc;
 957
 958        spin_lock_irqsave(&card->tx_queue_lock, flags);
 959        old_len = skb_queue_len(&card->tx_queue[port]);
 960        skb_queue_tail(&card->tx_queue[port], skb);
 961        if (!old_len)
 962                card->tx_mask |= (1 << port);
 963        spin_unlock_irqrestore(&card->tx_queue_lock, flags);
 964
 965        /* Theoretically we could just schedule the tasklet here, but
 966           that introduces latency we don't want -- it's noticeable */
 967        if (!old_len)
 968                fpga_tx(card);
 969}
 970
 971static uint32_t fpga_tx(struct solos_card *card)
 972{
 973        uint32_t tx_pending, card_flags;
 974        uint32_t tx_started = 0;
 975        struct sk_buff *skb;
 976        struct atm_vcc *vcc;
 977        unsigned char port;
 978        unsigned long flags;
 979
 980        spin_lock_irqsave(&card->tx_lock, flags);
 981        
 982        card_flags = ioread32(card->config_regs + FLAGS_ADDR);
 983        /*
 984         * The queue lock is required for _writing_ to tx_mask, but we're
 985         * OK to read it here without locking. The only potential update
 986         * that we could race with is in fpga_queue() where it sets a bit
 987         * for a new port... but it's going to call this function again if
 988         * it's doing that, anyway.
 989         */
 990        tx_pending = card->tx_mask & ~card_flags;
 991
 992        for (port = 0; tx_pending; tx_pending >>= 1, port++) {
 993                if (tx_pending & 1) {
 994                        struct sk_buff *oldskb = card->tx_skb[port];
 995                        if (oldskb)
 996                                pci_unmap_single(card->dev, SKB_CB(oldskb)->dma_addr,
 997                                                 oldskb->len, PCI_DMA_TODEVICE);
 998
 999                        spin_lock(&card->tx_queue_lock);
1000                        skb = skb_dequeue(&card->tx_queue[port]);
1001                        if (!skb)
1002                                card->tx_mask &= ~(1 << port);
1003                        spin_unlock(&card->tx_queue_lock);
1004
1005                        if (skb && !card->using_dma) {
1006                                memcpy_toio(TX_BUF(card, port), skb->data, skb->len);
1007                                tx_started |= 1 << port;
1008                                oldskb = skb; /* We're done with this skb already */
1009                        } else if (skb && card->using_dma) {
1010                                SKB_CB(skb)->dma_addr = pci_map_single(card->dev, skb->data,
1011                                                                       skb->len, PCI_DMA_TODEVICE);
1012                                iowrite32(SKB_CB(skb)->dma_addr,
1013                                          card->config_regs + TX_DMA_ADDR(port));
1014                        }
1015
1016                        if (!oldskb)
1017                                continue;
1018
1019                        /* Clean up and free oldskb now it's gone */
1020                        if (atmdebug) {
1021                                dev_info(&card->dev->dev, "Transmitted: port %d\n",
1022                                         port);
1023                                print_buffer(oldskb);
1024                        }
1025
1026                        vcc = SKB_CB(oldskb)->vcc;
1027
1028                        if (vcc) {
1029                                atomic_inc(&vcc->stats->tx);
1030                                solos_pop(vcc, oldskb);
1031                        } else
1032                                dev_kfree_skb_irq(oldskb);
1033
1034                }
1035        }
1036        /* For non-DMA TX, write the 'TX start' bit for all four ports simultaneously */
1037        if (tx_started)
1038                iowrite32(tx_started, card->config_regs + FLAGS_ADDR);
1039
1040        spin_unlock_irqrestore(&card->tx_lock, flags);
1041        return card_flags;
1042}
1043
1044static int psend(struct atm_vcc *vcc, struct sk_buff *skb)
1045{
1046        struct solos_card *card = vcc->dev->dev_data;
1047        struct pkt_hdr *header;
1048        int pktlen;
1049
1050        pktlen = skb->len;
1051        if (pktlen > (BUF_SIZE - sizeof(*header))) {
1052                dev_warn(&card->dev->dev, "Length of PDU is too large. Dropping PDU.\n");
1053                solos_pop(vcc, skb);
1054                return 0;
1055        }
1056
1057        if (!skb_clone_writable(skb, sizeof(*header))) {
1058                int expand_by = 0;
1059                int ret;
1060
1061                if (skb_headroom(skb) < sizeof(*header))
1062                        expand_by = sizeof(*header) - skb_headroom(skb);
1063
1064                ret = pskb_expand_head(skb, expand_by, 0, GFP_ATOMIC);
1065                if (ret) {
1066                        dev_warn(&card->dev->dev, "pskb_expand_head failed.\n");
1067                        solos_pop(vcc, skb);
1068                        return ret;
1069                }
1070        }
1071
1072        header = (void *)skb_push(skb, sizeof(*header));
1073
1074        /* This does _not_ include the size of the header */
1075        header->size = cpu_to_le16(pktlen);
1076        header->vpi = cpu_to_le16(vcc->vpi);
1077        header->vci = cpu_to_le16(vcc->vci);
1078        header->type = cpu_to_le16(PKT_DATA);
1079
1080        fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, vcc);
1081
1082        return 0;
1083}
1084
1085static struct atmdev_ops fpga_ops = {
1086        .open =         popen,
1087        .close =        pclose,
1088        .ioctl =        NULL,
1089        .getsockopt =   NULL,
1090        .setsockopt =   NULL,
1091        .send =         psend,
1092        .send_oam =     NULL,
1093        .phy_put =      NULL,
1094        .phy_get =      NULL,
1095        .change_qos =   NULL,
1096        .proc_read =    NULL,
1097        .owner =        THIS_MODULE
1098};
1099
1100static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
1101{
1102        int err;
1103        uint16_t fpga_ver;
1104        uint8_t major_ver, minor_ver;
1105        uint32_t data32;
1106        struct solos_card *card;
1107
1108        card = kzalloc(sizeof(*card), GFP_KERNEL);
1109        if (!card)
1110                return -ENOMEM;
1111
1112        card->dev = dev;
1113        init_waitqueue_head(&card->fw_wq);
1114        init_waitqueue_head(&card->param_wq);
1115
1116        err = pci_enable_device(dev);
1117        if (err) {
1118                dev_warn(&dev->dev,  "Failed to enable PCI device\n");
1119                goto out;
1120        }
1121
1122        err = pci_set_dma_mask(dev, DMA_BIT_MASK(32));
1123        if (err) {
1124                dev_warn(&dev->dev, "Failed to set 32-bit DMA mask\n");
1125                goto out;
1126        }
1127
1128        err = pci_request_regions(dev, "solos");
1129        if (err) {
1130                dev_warn(&dev->dev, "Failed to request regions\n");
1131                goto out;
1132        }
1133
1134        card->config_regs = pci_iomap(dev, 0, CONFIG_RAM_SIZE);
1135        if (!card->config_regs) {
1136                dev_warn(&dev->dev, "Failed to ioremap config registers\n");
1137                goto out_release_regions;
1138        }
1139        card->buffers = pci_iomap(dev, 1, DATA_RAM_SIZE);
1140        if (!card->buffers) {
1141                dev_warn(&dev->dev, "Failed to ioremap data buffers\n");
1142                goto out_unmap_config;
1143        }
1144
1145        if (reset) {
1146                iowrite32(1, card->config_regs + FPGA_MODE);
1147                data32 = ioread32(card->config_regs + FPGA_MODE); 
1148
1149                iowrite32(0, card->config_regs + FPGA_MODE);
1150                data32 = ioread32(card->config_regs + FPGA_MODE); 
1151        }
1152
1153        data32 = ioread32(card->config_regs + FPGA_VER);
1154        fpga_ver = (data32 & 0x0000FFFF);
1155        major_ver = ((data32 & 0xFF000000) >> 24);
1156        minor_ver = ((data32 & 0x00FF0000) >> 16);
1157        card->fpga_version = FPGA_VERSION(major_ver,minor_ver);
1158        if (card->fpga_version > LEGACY_BUFFERS)
1159                card->buffer_size = BUF_SIZE;
1160        else
1161                card->buffer_size = OLD_BUF_SIZE;
1162        dev_info(&dev->dev, "Solos FPGA Version %d.%02d svn-%d\n",
1163                 major_ver, minor_ver, fpga_ver);
1164
1165        if (fpga_ver < 37 && (fpga_upgrade || firmware_upgrade ||
1166                              db_fpga_upgrade || db_firmware_upgrade)) {
1167                dev_warn(&dev->dev,
1168                         "FPGA too old; cannot upgrade flash. Use JTAG.\n");
1169                fpga_upgrade = firmware_upgrade = 0;
1170                db_fpga_upgrade = db_firmware_upgrade = 0;
1171        }
1172
1173        if (card->fpga_version >= DMA_SUPPORTED){
1174                card->using_dma = 1;
1175        } else {
1176                card->using_dma = 0;
1177                /* Set RX empty flag for all ports */
1178                iowrite32(0xF0, card->config_regs + FLAGS_ADDR);
1179        }
1180
1181        data32 = ioread32(card->config_regs + PORTS);
1182        card->nr_ports = (data32 & 0x000000FF);
1183
1184        pci_set_drvdata(dev, card);
1185
1186        tasklet_init(&card->tlet, solos_bh, (unsigned long)card);
1187        spin_lock_init(&card->tx_lock);
1188        spin_lock_init(&card->tx_queue_lock);
1189        spin_lock_init(&card->cli_queue_lock);
1190        spin_lock_init(&card->param_queue_lock);
1191        INIT_LIST_HEAD(&card->param_queue);
1192
1193        err = request_irq(dev->irq, solos_irq, IRQF_SHARED,
1194                          "solos-pci", card);
1195        if (err) {
1196                dev_dbg(&card->dev->dev, "Failed to request interrupt IRQ: %d\n", dev->irq);
1197                goto out_unmap_both;
1198        }
1199
1200        iowrite32(1, card->config_regs + IRQ_EN_ADDR);
1201
1202        if (fpga_upgrade)
1203                flash_upgrade(card, 0);
1204
1205        if (firmware_upgrade)
1206                flash_upgrade(card, 1);
1207
1208        if (db_fpga_upgrade)
1209                flash_upgrade(card, 2);
1210
1211        if (db_firmware_upgrade)
1212                flash_upgrade(card, 3);
1213
1214        err = atm_init(card, &dev->dev);
1215        if (err)
1216                goto out_free_irq;
1217
1218        return 0;
1219
1220 out_free_irq:
1221        iowrite32(0, card->config_regs + IRQ_EN_ADDR);
1222        free_irq(dev->irq, card);
1223        tasklet_kill(&card->tlet);
1224        
1225 out_unmap_both:
1226        pci_set_drvdata(dev, NULL);
1227        pci_iounmap(dev, card->config_regs);
1228 out_unmap_config:
1229        pci_iounmap(dev, card->buffers);
1230 out_release_regions:
1231        pci_release_regions(dev);
1232 out:
1233        kfree(card);
1234        return err;
1235}
1236
1237static int atm_init(struct solos_card *card, struct device *parent)
1238{
1239        int i;
1240
1241        for (i = 0; i < card->nr_ports; i++) {
1242                struct sk_buff *skb;
1243                struct pkt_hdr *header;
1244
1245                skb_queue_head_init(&card->tx_queue[i]);
1246                skb_queue_head_init(&card->cli_queue[i]);
1247
1248                card->atmdev[i] = atm_dev_register("solos-pci", parent, &fpga_ops, -1, NULL);
1249                if (!card->atmdev[i]) {
1250                        dev_err(&card->dev->dev, "Could not register ATM device %d\n", i);
1251                        atm_remove(card);
1252                        return -ENODEV;
1253                }
1254                if (device_create_file(&card->atmdev[i]->class_dev, &dev_attr_console))
1255                        dev_err(&card->dev->dev, "Could not register console for ATM device %d\n", i);
1256                if (sysfs_create_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group))
1257                        dev_err(&card->dev->dev, "Could not register parameter group for ATM device %d\n", i);
1258
1259                dev_info(&card->dev->dev, "Registered ATM device %d\n", card->atmdev[i]->number);
1260
1261                card->atmdev[i]->ci_range.vpi_bits = 8;
1262                card->atmdev[i]->ci_range.vci_bits = 16;
1263                card->atmdev[i]->dev_data = card;
1264                card->atmdev[i]->phy_data = (void *)(unsigned long)i;
1265                atm_dev_signal_change(card->atmdev[i], ATM_PHY_SIG_UNKNOWN);
1266
1267                skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
1268                if (!skb) {
1269                        dev_warn(&card->dev->dev, "Failed to allocate sk_buff in atm_init()\n");
1270                        continue;
1271                }
1272
1273                header = (void *)skb_put(skb, sizeof(*header));
1274
1275                header->size = cpu_to_le16(0);
1276                header->vpi = cpu_to_le16(0);
1277                header->vci = cpu_to_le16(0);
1278                header->type = cpu_to_le16(PKT_STATUS);
1279
1280                fpga_queue(card, i, skb, NULL);
1281        }
1282        return 0;
1283}
1284
1285static void atm_remove(struct solos_card *card)
1286{
1287        int i;
1288
1289        for (i = 0; i < card->nr_ports; i++) {
1290                if (card->atmdev[i]) {
1291                        struct sk_buff *skb;
1292
1293                        dev_info(&card->dev->dev, "Unregistering ATM device %d\n", card->atmdev[i]->number);
1294
1295                        sysfs_remove_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group);
1296                        atm_dev_deregister(card->atmdev[i]);
1297
1298                        skb = card->rx_skb[i];
1299                        if (skb) {
1300                                pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr,
1301                                                 RX_DMA_SIZE, PCI_DMA_FROMDEVICE);
1302                                dev_kfree_skb(skb);
1303                        }
1304                        skb = card->tx_skb[i];
1305                        if (skb) {
1306                                pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr,
1307                                                 skb->len, PCI_DMA_TODEVICE);
1308                                dev_kfree_skb(skb);
1309                        }
1310                        while ((skb = skb_dequeue(&card->tx_queue[i])))
1311                                dev_kfree_skb(skb);
1312 
1313                }
1314        }
1315}
1316
1317static void fpga_remove(struct pci_dev *dev)
1318{
1319        struct solos_card *card = pci_get_drvdata(dev);
1320        
1321        /* Disable IRQs */
1322        iowrite32(0, card->config_regs + IRQ_EN_ADDR);
1323
1324        /* Reset FPGA */
1325        iowrite32(1, card->config_regs + FPGA_MODE);
1326        (void)ioread32(card->config_regs + FPGA_MODE); 
1327
1328        atm_remove(card);
1329
1330        free_irq(dev->irq, card);
1331        tasklet_kill(&card->tlet);
1332
1333        /* Release device from reset */
1334        iowrite32(0, card->config_regs + FPGA_MODE);
1335        (void)ioread32(card->config_regs + FPGA_MODE); 
1336
1337        pci_iounmap(dev, card->buffers);
1338        pci_iounmap(dev, card->config_regs);
1339
1340        pci_release_regions(dev);
1341        pci_disable_device(dev);
1342
1343        pci_set_drvdata(dev, NULL);
1344        kfree(card);
1345}
1346
1347static struct pci_device_id fpga_pci_tbl[] __devinitdata = {
1348        { 0x10ee, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
1349        { 0, }
1350};
1351
1352MODULE_DEVICE_TABLE(pci,fpga_pci_tbl);
1353
1354static struct pci_driver fpga_driver = {
1355        .name =         "solos",
1356        .id_table =     fpga_pci_tbl,
1357        .probe =        fpga_probe,
1358        .remove =       fpga_remove,
1359};
1360
1361
1362static int __init solos_pci_init(void)
1363{
1364        printk(KERN_INFO "Solos PCI Driver Version %s\n", VERSION);
1365        return pci_register_driver(&fpga_driver);
1366}
1367
1368static void __exit solos_pci_exit(void)
1369{
1370        pci_unregister_driver(&fpga_driver);
1371        printk(KERN_INFO "Solos PCI Driver %s Unloaded\n", VERSION);
1372}
1373
1374module_init(solos_pci_init);
1375module_exit(solos_pci_exit);
1376