linux/drivers/block/cpqarray.c
<<
>>
Prefs
   1/*
   2 *    Disk Array driver for Compaq SMART2 Controllers
   3 *    Copyright 1998 Compaq Computer Corporation
   4 *
   5 *    This program is free software; you can redistribute it and/or modify
   6 *    it under the terms of the GNU General Public License as published by
   7 *    the Free Software Foundation; either version 2 of the License, or
   8 *    (at your option) any later version.
   9 *
  10 *    This program is distributed in the hope that it will be useful,
  11 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 *    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  13 *    NON INFRINGEMENT.  See the GNU General Public License for more details.
  14 *
  15 *    You should have received a copy of the GNU General Public License
  16 *    along with this program; if not, write to the Free Software
  17 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18 *
  19 *    Questions/Comments/Bugfixes to iss_storagedev@hp.com
  20 *
  21 */
  22#include <linux/module.h>
  23#include <linux/types.h>
  24#include <linux/pci.h>
  25#include <linux/bio.h>
  26#include <linux/interrupt.h>
  27#include <linux/kernel.h>
  28#include <linux/slab.h>
  29#include <linux/delay.h>
  30#include <linux/major.h>
  31#include <linux/fs.h>
  32#include <linux/blkpg.h>
  33#include <linux/timer.h>
  34#include <linux/proc_fs.h>
  35#include <linux/seq_file.h>
  36#include <linux/init.h>
  37#include <linux/hdreg.h>
  38#include <linux/mutex.h>
  39#include <linux/spinlock.h>
  40#include <linux/blkdev.h>
  41#include <linux/genhd.h>
  42#include <linux/scatterlist.h>
  43#include <asm/uaccess.h>
  44#include <asm/io.h>
  45
  46
  47#define SMART2_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
  48
  49#define DRIVER_NAME "Compaq SMART2 Driver (v 2.6.0)"
  50#define DRIVER_VERSION SMART2_DRIVER_VERSION(2,6,0)
  51
  52/* Embedded module documentation macros - see modules.h */
  53/* Original author Chris Frantz - Compaq Computer Corporation */
  54MODULE_AUTHOR("Compaq Computer Corporation");
  55MODULE_DESCRIPTION("Driver for Compaq Smart2 Array Controllers version 2.6.0");
  56MODULE_LICENSE("GPL");
  57
  58#include "cpqarray.h"
  59#include "ida_cmd.h"
  60#include "smart1,2.h"
  61#include "ida_ioctl.h"
  62
  63#define READ_AHEAD      128
  64#define NR_CMDS         128 /* This could probably go as high as ~400 */
  65
  66#define MAX_CTLR        8
  67#define CTLR_SHIFT      8
  68
  69#define CPQARRAY_DMA_MASK       0xFFFFFFFF      /* 32 bit DMA */
  70
  71static DEFINE_MUTEX(cpqarray_mutex);
  72static int nr_ctlr;
  73static ctlr_info_t *hba[MAX_CTLR];
  74
  75static int eisa[8];
  76
  77#define NR_PRODUCTS ARRAY_SIZE(products)
  78
  79/*  board_id = Subsystem Device ID & Vendor ID
  80 *  product = Marketing Name for the board
  81 *  access = Address of the struct of function pointers
  82 */
  83static struct board_type products[] = {
  84        { 0x0040110E, "IDA",                    &smart1_access },
  85        { 0x0140110E, "IDA-2",                  &smart1_access },
  86        { 0x1040110E, "IAES",                   &smart1_access },
  87        { 0x2040110E, "SMART",                  &smart1_access },
  88        { 0x3040110E, "SMART-2/E",              &smart2e_access },
  89        { 0x40300E11, "SMART-2/P",              &smart2_access },
  90        { 0x40310E11, "SMART-2SL",              &smart2_access },
  91        { 0x40320E11, "Smart Array 3200",       &smart2_access },
  92        { 0x40330E11, "Smart Array 3100ES",     &smart2_access },
  93        { 0x40340E11, "Smart Array 221",        &smart2_access },
  94        { 0x40400E11, "Integrated Array",       &smart4_access },
  95        { 0x40480E11, "Compaq Raid LC2",        &smart4_access },
  96        { 0x40500E11, "Smart Array 4200",       &smart4_access },
  97        { 0x40510E11, "Smart Array 4250ES",     &smart4_access },
  98        { 0x40580E11, "Smart Array 431",        &smart4_access },
  99};
 100
 101/* define the PCI info for the PCI cards this driver can control */
 102static const struct pci_device_id cpqarray_pci_device_id[] =
 103{
 104        { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_COMPAQ_42XX,
 105                0x0E11, 0x4058, 0, 0, 0},       /* SA431 */
 106        { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_COMPAQ_42XX,
 107                0x0E11, 0x4051, 0, 0, 0},      /* SA4250ES */
 108        { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_COMPAQ_42XX,
 109                0x0E11, 0x4050, 0, 0, 0},      /* SA4200 */
 110        { PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C1510,
 111                0x0E11, 0x4048, 0, 0, 0},       /* LC2 */
 112        { PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C1510,
 113                0x0E11, 0x4040, 0, 0, 0},      /* Integrated Array */
 114        { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
 115                0x0E11, 0x4034, 0, 0, 0},       /* SA 221 */
 116        { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
 117                0x0E11, 0x4033, 0, 0, 0},       /* SA 3100ES*/
 118        { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
 119                0x0E11, 0x4032, 0, 0, 0},       /* SA 3200*/
 120        { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
 121                0x0E11, 0x4031, 0, 0, 0},       /* SA 2SL*/
 122        { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
 123                0x0E11, 0x4030, 0, 0, 0},       /* SA 2P */
 124        { 0 }
 125};
 126
 127MODULE_DEVICE_TABLE(pci, cpqarray_pci_device_id);
 128
 129static struct gendisk *ida_gendisk[MAX_CTLR][NWD];
 130
 131/* Debug... */
 132#define DBG(s)  do { s } while(0)
 133/* Debug (general info)... */
 134#define DBGINFO(s) do { } while(0)
 135/* Debug Paranoid... */
 136#define DBGP(s)  do { } while(0)
 137/* Debug Extra Paranoid... */
 138#define DBGPX(s) do { } while(0)
 139
 140static int cpqarray_pci_init(ctlr_info_t *c, struct pci_dev *pdev);
 141static void __iomem *remap_pci_mem(ulong base, ulong size);
 142static int cpqarray_eisa_detect(void);
 143static int pollcomplete(int ctlr);
 144static void getgeometry(int ctlr);
 145static void start_fwbk(int ctlr);
 146
 147static cmdlist_t * cmd_alloc(ctlr_info_t *h, int get_from_pool);
 148static void cmd_free(ctlr_info_t *h, cmdlist_t *c, int got_from_pool);
 149
 150static void free_hba(int i);
 151static int alloc_cpqarray_hba(void);
 152
 153static int sendcmd(
 154        __u8    cmd,
 155        int     ctlr,
 156        void    *buff,
 157        size_t  size,
 158        unsigned int blk,
 159        unsigned int blkcnt,
 160        unsigned int log_unit );
 161
 162static int ida_unlocked_open(struct block_device *bdev, fmode_t mode);
 163static void ida_release(struct gendisk *disk, fmode_t mode);
 164static int ida_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg);
 165static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 166static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io);
 167
 168static void do_ida_request(struct request_queue *q);
 169static void start_io(ctlr_info_t *h);
 170
 171static inline void addQ(cmdlist_t **Qptr, cmdlist_t *c);
 172static inline cmdlist_t *removeQ(cmdlist_t **Qptr, cmdlist_t *c);
 173static inline void complete_command(cmdlist_t *cmd, int timeout);
 174
 175static irqreturn_t do_ida_intr(int irq, void *dev_id);
 176static void ida_timer(unsigned long tdata);
 177static int ida_revalidate(struct gendisk *disk);
 178static int revalidate_allvol(ctlr_info_t *host);
 179static int cpqarray_register_ctlr(int ctlr, struct pci_dev *pdev);
 180
 181#ifdef CONFIG_PROC_FS
 182static void ida_procinit(int i);
 183#else
 184static void ida_procinit(int i) {}
 185#endif
 186
 187static inline drv_info_t *get_drv(struct gendisk *disk)
 188{
 189        return disk->private_data;
 190}
 191
 192static inline ctlr_info_t *get_host(struct gendisk *disk)
 193{
 194        return disk->queue->queuedata;
 195}
 196
 197
 198static const struct block_device_operations ida_fops  = {
 199        .owner          = THIS_MODULE,
 200        .open           = ida_unlocked_open,
 201        .release        = ida_release,
 202        .ioctl          = ida_ioctl,
 203        .getgeo         = ida_getgeo,
 204        .revalidate_disk= ida_revalidate,
 205};
 206
 207
 208#ifdef CONFIG_PROC_FS
 209
 210static struct proc_dir_entry *proc_array;
 211static const struct file_operations ida_proc_fops;
 212
 213/*
 214 * Get us a file in /proc/array that says something about each controller.
 215 * Create /proc/array if it doesn't exist yet.
 216 */
 217static void __init ida_procinit(int i)
 218{
 219        if (proc_array == NULL) {
 220                proc_array = proc_mkdir("driver/cpqarray", NULL);
 221                if (!proc_array) return;
 222        }
 223
 224        proc_create_data(hba[i]->devname, 0, proc_array, &ida_proc_fops, hba[i]);
 225}
 226
 227/*
 228 * Report information about this controller.
 229 */
 230static int ida_proc_show(struct seq_file *m, void *v)
 231{
 232        int i, ctlr;
 233        ctlr_info_t *h = (ctlr_info_t*)m->private;
 234        drv_info_t *drv;
 235#ifdef CPQ_PROC_PRINT_QUEUES
 236        cmdlist_t *c;
 237        unsigned long flags;
 238#endif
 239
 240        ctlr = h->ctlr;
 241        seq_printf(m, "%s:  Compaq %s Controller\n"
 242                "       Board ID: 0x%08lx\n"
 243                "       Firmware Revision: %c%c%c%c\n"
 244                "       Controller Sig: 0x%08lx\n"
 245                "       Memory Address: 0x%08lx\n"
 246                "       I/O Port: 0x%04x\n"
 247                "       IRQ: %d\n"
 248                "       Logical drives: %d\n"
 249                "       Physical drives: %d\n\n"
 250                "       Current Q depth: %d\n"
 251                "       Max Q depth since init: %d\n\n",
 252                h->devname, 
 253                h->product_name,
 254                (unsigned long)h->board_id,
 255                h->firm_rev[0], h->firm_rev[1], h->firm_rev[2], h->firm_rev[3],
 256                (unsigned long)h->ctlr_sig, (unsigned long)h->vaddr,
 257                (unsigned int) h->io_mem_addr, (unsigned int)h->intr,
 258                h->log_drives, h->phys_drives,
 259                h->Qdepth, h->maxQsinceinit);
 260
 261        seq_puts(m, "Logical Drive Info:\n");
 262
 263        for(i=0; i<h->log_drives; i++) {
 264                drv = &h->drv[i];
 265                seq_printf(m, "ida/c%dd%d: blksz=%d nr_blks=%d\n",
 266                                ctlr, i, drv->blk_size, drv->nr_blks);
 267        }
 268
 269#ifdef CPQ_PROC_PRINT_QUEUES
 270        spin_lock_irqsave(IDA_LOCK(h->ctlr), flags); 
 271        seq_puts(m, "\nCurrent Queues:\n");
 272
 273        c = h->reqQ;
 274        seq_printf(m, "reqQ = %p", c);
 275        if (c) c=c->next;
 276        while(c && c != h->reqQ) {
 277                seq_printf(m, "->%p", c);
 278                c=c->next;
 279        }
 280
 281        c = h->cmpQ;
 282        seq_printf(m, "\ncmpQ = %p", c);
 283        if (c) c=c->next;
 284        while(c && c != h->cmpQ) {
 285                seq_printf(m, "->%p", c);
 286                c=c->next;
 287        }
 288
 289        seq_putc(m, '\n');
 290        spin_unlock_irqrestore(IDA_LOCK(h->ctlr), flags); 
 291#endif
 292        seq_printf(m, "nr_allocs = %d\nnr_frees = %d\n",
 293                        h->nr_allocs, h->nr_frees);
 294        return 0;
 295}
 296
 297static int ida_proc_open(struct inode *inode, struct file *file)
 298{
 299        return single_open(file, ida_proc_show, PDE_DATA(inode));
 300}
 301
 302static const struct file_operations ida_proc_fops = {
 303        .owner          = THIS_MODULE,
 304        .open           = ida_proc_open,
 305        .read           = seq_read,
 306        .llseek         = seq_lseek,
 307        .release        = single_release,
 308};
 309#endif /* CONFIG_PROC_FS */
 310
 311module_param_array(eisa, int, NULL, 0);
 312
 313static void release_io_mem(ctlr_info_t *c)
 314{
 315        /* if IO mem was not protected do nothing */
 316        if( c->io_mem_addr == 0)
 317                return;
 318        release_region(c->io_mem_addr, c->io_mem_length);
 319        c->io_mem_addr = 0;
 320        c->io_mem_length = 0;
 321}
 322
 323static void cpqarray_remove_one(int i)
 324{
 325        int j;
 326        char buff[4];
 327
 328        /* sendcmd will turn off interrupt, and send the flush...
 329         * To write all data in the battery backed cache to disks
 330         * no data returned, but don't want to send NULL to sendcmd */
 331        if( sendcmd(FLUSH_CACHE, i, buff, 4, 0, 0, 0))
 332        {
 333                printk(KERN_WARNING "Unable to flush cache on controller %d\n",
 334                                i);
 335        }
 336        free_irq(hba[i]->intr, hba[i]);
 337        iounmap(hba[i]->vaddr);
 338        unregister_blkdev(COMPAQ_SMART2_MAJOR+i, hba[i]->devname);
 339        del_timer(&hba[i]->timer);
 340        remove_proc_entry(hba[i]->devname, proc_array);
 341        pci_free_consistent(hba[i]->pci_dev,
 342                        NR_CMDS * sizeof(cmdlist_t), (hba[i]->cmd_pool),
 343                        hba[i]->cmd_pool_dhandle);
 344        kfree(hba[i]->cmd_pool_bits);
 345        for(j = 0; j < NWD; j++) {
 346                if (ida_gendisk[i][j]->flags & GENHD_FL_UP)
 347                        del_gendisk(ida_gendisk[i][j]);
 348                put_disk(ida_gendisk[i][j]);
 349        }
 350        blk_cleanup_queue(hba[i]->queue);
 351        release_io_mem(hba[i]);
 352        free_hba(i);
 353}
 354
 355static void cpqarray_remove_one_pci(struct pci_dev *pdev)
 356{
 357        int i;
 358        ctlr_info_t *tmp_ptr;
 359
 360        if (pci_get_drvdata(pdev) == NULL) {
 361                printk( KERN_ERR "cpqarray: Unable to remove device \n");
 362                return;
 363        }
 364
 365        tmp_ptr = pci_get_drvdata(pdev);
 366        i = tmp_ptr->ctlr;
 367        if (hba[i] == NULL) {
 368                printk(KERN_ERR "cpqarray: controller %d appears to have"
 369                        "already been removed \n", i);
 370                return;
 371        }
 372        pci_set_drvdata(pdev, NULL);
 373
 374        cpqarray_remove_one(i);
 375}
 376
 377/* removing an instance that was not removed automatically..
 378 * must be an eisa card.
 379 */
 380static void cpqarray_remove_one_eisa(int i)
 381{
 382        if (hba[i] == NULL) {
 383                printk(KERN_ERR "cpqarray: controller %d appears to have"
 384                        "already been removed \n", i);
 385                return;
 386        }
 387        cpqarray_remove_one(i);
 388}
 389
 390/* pdev is NULL for eisa */
 391static int cpqarray_register_ctlr(int i, struct pci_dev *pdev)
 392{
 393        struct request_queue *q;
 394        int j;
 395
 396        /* 
 397         * register block devices
 398         * Find disks and fill in structs
 399         * Get an interrupt, set the Q depth and get into /proc
 400         */
 401
 402        /* If this successful it should insure that we are the only */
 403        /* instance of the driver */
 404        if (register_blkdev(COMPAQ_SMART2_MAJOR+i, hba[i]->devname)) {
 405                goto Enomem4;
 406        }
 407        hba[i]->access.set_intr_mask(hba[i], 0);
 408        if (request_irq(hba[i]->intr, do_ida_intr,
 409                IRQF_DISABLED|IRQF_SHARED, hba[i]->devname, hba[i]))
 410        {
 411                printk(KERN_ERR "cpqarray: Unable to get irq %d for %s\n",
 412                                hba[i]->intr, hba[i]->devname);
 413                goto Enomem3;
 414        }
 415                
 416        for (j=0; j<NWD; j++) {
 417                ida_gendisk[i][j] = alloc_disk(1 << NWD_SHIFT);
 418                if (!ida_gendisk[i][j])
 419                        goto Enomem2;
 420        }
 421
 422        hba[i]->cmd_pool = pci_alloc_consistent(
 423                hba[i]->pci_dev, NR_CMDS * sizeof(cmdlist_t),
 424                &(hba[i]->cmd_pool_dhandle));
 425        hba[i]->cmd_pool_bits = kcalloc(
 426                DIV_ROUND_UP(NR_CMDS, BITS_PER_LONG), sizeof(unsigned long),
 427                GFP_KERNEL);
 428
 429        if (!hba[i]->cmd_pool_bits || !hba[i]->cmd_pool)
 430                        goto Enomem1;
 431
 432        memset(hba[i]->cmd_pool, 0, NR_CMDS * sizeof(cmdlist_t));
 433        printk(KERN_INFO "cpqarray: Finding drives on %s",
 434                hba[i]->devname);
 435
 436        spin_lock_init(&hba[i]->lock);
 437        q = blk_init_queue(do_ida_request, &hba[i]->lock);
 438        if (!q)
 439                goto Enomem1;
 440
 441        hba[i]->queue = q;
 442        q->queuedata = hba[i];
 443
 444        getgeometry(i);
 445        start_fwbk(i);
 446
 447        ida_procinit(i);
 448
 449        if (pdev)
 450                blk_queue_bounce_limit(q, hba[i]->pci_dev->dma_mask);
 451
 452        /* This is a hardware imposed limit. */
 453        blk_queue_max_segments(q, SG_MAX);
 454
 455        init_timer(&hba[i]->timer);
 456        hba[i]->timer.expires = jiffies + IDA_TIMER;
 457        hba[i]->timer.data = (unsigned long)hba[i];
 458        hba[i]->timer.function = ida_timer;
 459        add_timer(&hba[i]->timer);
 460
 461        /* Enable IRQ now that spinlock and rate limit timer are set up */
 462        hba[i]->access.set_intr_mask(hba[i], FIFO_NOT_EMPTY);
 463
 464        for(j=0; j<NWD; j++) {
 465                struct gendisk *disk = ida_gendisk[i][j];
 466                drv_info_t *drv = &hba[i]->drv[j];
 467                sprintf(disk->disk_name, "ida/c%dd%d", i, j);
 468                disk->major = COMPAQ_SMART2_MAJOR + i;
 469                disk->first_minor = j<<NWD_SHIFT;
 470                disk->fops = &ida_fops;
 471                if (j && !drv->nr_blks)
 472                        continue;
 473                blk_queue_logical_block_size(hba[i]->queue, drv->blk_size);
 474                set_capacity(disk, drv->nr_blks);
 475                disk->queue = hba[i]->queue;
 476                disk->private_data = drv;
 477                add_disk(disk);
 478        }
 479
 480        /* done ! */
 481        return(i);
 482
 483Enomem1:
 484        nr_ctlr = i; 
 485        kfree(hba[i]->cmd_pool_bits);
 486        if (hba[i]->cmd_pool)
 487                pci_free_consistent(hba[i]->pci_dev, NR_CMDS*sizeof(cmdlist_t), 
 488                                    hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
 489Enomem2:
 490        while (j--) {
 491                put_disk(ida_gendisk[i][j]);
 492                ida_gendisk[i][j] = NULL;
 493        }
 494        free_irq(hba[i]->intr, hba[i]);
 495Enomem3:
 496        unregister_blkdev(COMPAQ_SMART2_MAJOR+i, hba[i]->devname);
 497Enomem4:
 498        if (pdev)
 499                pci_set_drvdata(pdev, NULL);
 500        release_io_mem(hba[i]);
 501        free_hba(i);
 502
 503        printk( KERN_ERR "cpqarray: out of memory");
 504
 505        return -1;
 506}
 507
 508static int cpqarray_init_one(struct pci_dev *pdev,
 509                             const struct pci_device_id *ent)
 510{
 511        int i;
 512
 513        printk(KERN_DEBUG "cpqarray: Device 0x%x has been found at"
 514                        " bus %d dev %d func %d\n",
 515                        pdev->device, pdev->bus->number, PCI_SLOT(pdev->devfn),
 516                        PCI_FUNC(pdev->devfn));
 517        i = alloc_cpqarray_hba();
 518        if( i < 0 )
 519                return (-1);
 520        memset(hba[i], 0, sizeof(ctlr_info_t));
 521        sprintf(hba[i]->devname, "ida%d", i);
 522        hba[i]->ctlr = i;
 523        /* Initialize the pdev driver private data */
 524        pci_set_drvdata(pdev, hba[i]);
 525
 526        if (cpqarray_pci_init(hba[i], pdev) != 0) {
 527                pci_set_drvdata(pdev, NULL);
 528                release_io_mem(hba[i]);
 529                free_hba(i);
 530                return -1;
 531        }
 532
 533        return (cpqarray_register_ctlr(i, pdev));
 534}
 535
 536static struct pci_driver cpqarray_pci_driver = {
 537        .name = "cpqarray",
 538        .probe = cpqarray_init_one,
 539        .remove = cpqarray_remove_one_pci,
 540        .id_table = cpqarray_pci_device_id,
 541};
 542
 543/*
 544 *  This is it.  Find all the controllers and register them.
 545 *  returns the number of block devices registered.
 546 */
 547static int __init cpqarray_init(void)
 548{
 549        int num_cntlrs_reg = 0;
 550        int i;
 551        int rc = 0;
 552
 553        /* detect controllers */
 554        printk(DRIVER_NAME "\n");
 555
 556        rc = pci_register_driver(&cpqarray_pci_driver);
 557        if (rc)
 558                return rc;
 559        cpqarray_eisa_detect();
 560        
 561        for (i=0; i < MAX_CTLR; i++) {
 562                if (hba[i] != NULL)
 563                        num_cntlrs_reg++;
 564        }
 565
 566        if (num_cntlrs_reg)
 567                return 0;
 568        else {
 569                pci_unregister_driver(&cpqarray_pci_driver);
 570                return -ENODEV;
 571        }
 572}
 573
 574/* Function to find the first free pointer into our hba[] array */
 575/* Returns -1 if no free entries are left.  */
 576static int alloc_cpqarray_hba(void)
 577{
 578        int i;
 579
 580        for(i=0; i< MAX_CTLR; i++) {
 581                if (hba[i] == NULL) {
 582                        hba[i] = kmalloc(sizeof(ctlr_info_t), GFP_KERNEL);
 583                        if(hba[i]==NULL) {
 584                                printk(KERN_ERR "cpqarray: out of memory.\n");
 585                                return (-1);
 586                        }
 587                        return (i);
 588                }
 589        }
 590        printk(KERN_WARNING "cpqarray: This driver supports a maximum"
 591                " of 8 controllers.\n");
 592        return(-1);
 593}
 594
 595static void free_hba(int i)
 596{
 597        kfree(hba[i]);
 598        hba[i]=NULL;
 599}
 600
 601/*
 602 * Find the IO address of the controller, its IRQ and so forth.  Fill
 603 * in some basic stuff into the ctlr_info_t structure.
 604 */
 605static int cpqarray_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
 606{
 607        ushort vendor_id, device_id, command;
 608        unchar cache_line_size, latency_timer;
 609        unchar irq, revision;
 610        unsigned long addr[6];
 611        __u32 board_id;
 612
 613        int i;
 614
 615        c->pci_dev = pdev;
 616        pci_set_master(pdev);
 617        if (pci_enable_device(pdev)) {
 618                printk(KERN_ERR "cpqarray: Unable to Enable PCI device\n");
 619                return -1;
 620        }
 621        vendor_id = pdev->vendor;
 622        device_id = pdev->device;
 623        revision  = pdev->revision;
 624        irq = pdev->irq;
 625
 626        for(i=0; i<6; i++)
 627                addr[i] = pci_resource_start(pdev, i);
 628
 629        if (pci_set_dma_mask(pdev, CPQARRAY_DMA_MASK) != 0)
 630        {
 631                printk(KERN_ERR "cpqarray: Unable to set DMA mask\n");
 632                return -1;
 633        }
 634
 635        pci_read_config_word(pdev, PCI_COMMAND, &command);
 636        pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_line_size);
 637        pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency_timer);
 638
 639        pci_read_config_dword(pdev, 0x2c, &board_id);
 640
 641        /* check to see if controller has been disabled */
 642        if(!(command & 0x02)) {
 643                printk(KERN_WARNING
 644                        "cpqarray: controller appears to be disabled\n");
 645                return(-1);
 646        }
 647
 648DBGINFO(
 649        printk("vendor_id = %x\n", vendor_id);
 650        printk("device_id = %x\n", device_id);
 651        printk("command = %x\n", command);
 652        for(i=0; i<6; i++)
 653                printk("addr[%d] = %lx\n", i, addr[i]);
 654        printk("revision = %x\n", revision);
 655        printk("irq = %x\n", irq);
 656        printk("cache_line_size = %x\n", cache_line_size);
 657        printk("latency_timer = %x\n", latency_timer);
 658        printk("board_id = %x\n", board_id);
 659);
 660
 661        c->intr = irq;
 662
 663        for(i=0; i<6; i++) {
 664                if (pci_resource_flags(pdev, i) & PCI_BASE_ADDRESS_SPACE_IO)
 665                { /* IO space */
 666                        c->io_mem_addr = addr[i];
 667                        c->io_mem_length = pci_resource_end(pdev, i)
 668                                - pci_resource_start(pdev, i) + 1;
 669                        if(!request_region( c->io_mem_addr, c->io_mem_length,
 670                                "cpqarray"))
 671                        {
 672                                printk( KERN_WARNING "cpqarray I/O memory range already in use addr %lx length = %ld\n", c->io_mem_addr, c->io_mem_length);
 673                                c->io_mem_addr = 0;
 674                                c->io_mem_length = 0;
 675                        }
 676                        break;
 677                }
 678        }
 679
 680        c->paddr = 0;
 681        for(i=0; i<6; i++)
 682                if (!(pci_resource_flags(pdev, i) &
 683                                PCI_BASE_ADDRESS_SPACE_IO)) {
 684                        c->paddr = pci_resource_start (pdev, i);
 685                        break;
 686                }
 687        if (!c->paddr)
 688                return -1;
 689        c->vaddr = remap_pci_mem(c->paddr, 128);
 690        if (!c->vaddr)
 691                return -1;
 692        c->board_id = board_id;
 693
 694        for(i=0; i<NR_PRODUCTS; i++) {
 695                if (board_id == products[i].board_id) {
 696                        c->product_name = products[i].product_name;
 697                        c->access = *(products[i].access);
 698                        break;
 699                }
 700        }
 701        if (i == NR_PRODUCTS) {
 702                printk(KERN_WARNING "cpqarray: Sorry, I don't know how"
 703                        " to access the SMART Array controller %08lx\n", 
 704                                (unsigned long)board_id);
 705                return -1;
 706        }
 707
 708        return 0;
 709}
 710
 711/*
 712 * Map (physical) PCI mem into (virtual) kernel space
 713 */
 714static void __iomem *remap_pci_mem(ulong base, ulong size)
 715{
 716        ulong page_base        = ((ulong) base) & PAGE_MASK;
 717        ulong page_offs        = ((ulong) base) - page_base;
 718        void __iomem *page_remapped    = ioremap(page_base, page_offs+size);
 719
 720        return (page_remapped ? (page_remapped + page_offs) : NULL);
 721}
 722
 723#ifndef MODULE
 724/*
 725 * Config string is a comma separated set of i/o addresses of EISA cards.
 726 */
 727static int cpqarray_setup(char *str)
 728{
 729        int i, ints[9];
 730
 731        (void)get_options(str, ARRAY_SIZE(ints), ints);
 732
 733        for(i=0; i<ints[0] && i<8; i++)
 734                eisa[i] = ints[i+1];
 735        return 1;
 736}
 737
 738__setup("smart2=", cpqarray_setup);
 739
 740#endif
 741
 742/*
 743 * Find an EISA controller's signature.  Set up an hba if we find it.
 744 */
 745static int cpqarray_eisa_detect(void)
 746{
 747        int i=0, j;
 748        __u32 board_id;
 749        int intr;
 750        int ctlr;
 751        int num_ctlr = 0;
 752
 753        while(i<8 && eisa[i]) {
 754                ctlr = alloc_cpqarray_hba();
 755                if(ctlr == -1)
 756                        break;
 757                board_id = inl(eisa[i]+0xC80);
 758                for(j=0; j < NR_PRODUCTS; j++)
 759                        if (board_id == products[j].board_id) 
 760                                break;
 761
 762                if (j == NR_PRODUCTS) {
 763                        printk(KERN_WARNING "cpqarray: Sorry, I don't know how"
 764                                " to access the SMART Array controller %08lx\n",                                 (unsigned long)board_id);
 765                        continue;
 766                }
 767
 768                memset(hba[ctlr], 0, sizeof(ctlr_info_t));
 769                hba[ctlr]->io_mem_addr = eisa[i];
 770                hba[ctlr]->io_mem_length = 0x7FF;
 771                if(!request_region(hba[ctlr]->io_mem_addr,
 772                                hba[ctlr]->io_mem_length,
 773                                "cpqarray"))
 774                {
 775                        printk(KERN_WARNING "cpqarray: I/O range already in "
 776                                        "use addr = %lx length = %ld\n",
 777                                        hba[ctlr]->io_mem_addr,
 778                                        hba[ctlr]->io_mem_length);
 779                        free_hba(ctlr);
 780                        continue;
 781                }
 782
 783                /*
 784                 * Read the config register to find our interrupt
 785                 */
 786                intr = inb(eisa[i]+0xCC0) >> 4;
 787                if (intr & 1) intr = 11;
 788                else if (intr & 2) intr = 10;
 789                else if (intr & 4) intr = 14;
 790                else if (intr & 8) intr = 15;
 791                
 792                hba[ctlr]->intr = intr;
 793                sprintf(hba[ctlr]->devname, "ida%d", nr_ctlr);
 794                hba[ctlr]->product_name = products[j].product_name;
 795                hba[ctlr]->access = *(products[j].access);
 796                hba[ctlr]->ctlr = ctlr;
 797                hba[ctlr]->board_id = board_id;
 798                hba[ctlr]->pci_dev = NULL; /* not PCI */
 799
 800DBGINFO(
 801        printk("i = %d, j = %d\n", i, j);
 802        printk("irq = %x\n", intr);
 803        printk("product name = %s\n", products[j].product_name);
 804        printk("board_id = %x\n", board_id);
 805);
 806
 807                num_ctlr++;
 808                i++;
 809
 810                if (cpqarray_register_ctlr(ctlr, NULL) == -1)
 811                        printk(KERN_WARNING
 812                                "cpqarray: Can't register EISA controller %d\n",
 813                                ctlr);
 814
 815        }
 816
 817        return num_ctlr;
 818}
 819
 820/*
 821 * Open.  Make sure the device is really there.
 822 */
 823static int ida_open(struct block_device *bdev, fmode_t mode)
 824{
 825        drv_info_t *drv = get_drv(bdev->bd_disk);
 826        ctlr_info_t *host = get_host(bdev->bd_disk);
 827
 828        DBGINFO(printk("ida_open %s\n", bdev->bd_disk->disk_name));
 829        /*
 830         * Root is allowed to open raw volume zero even if it's not configured
 831         * so array config can still work.  I don't think I really like this,
 832         * but I'm already using way to many device nodes to claim another one
 833         * for "raw controller".
 834         */
 835        if (!drv->nr_blks) {
 836                if (!capable(CAP_SYS_RAWIO))
 837                        return -ENXIO;
 838                if (!capable(CAP_SYS_ADMIN) && drv != host->drv)
 839                        return -ENXIO;
 840        }
 841        host->usage_count++;
 842        return 0;
 843}
 844
 845static int ida_unlocked_open(struct block_device *bdev, fmode_t mode)
 846{
 847        int ret;
 848
 849        mutex_lock(&cpqarray_mutex);
 850        ret = ida_open(bdev, mode);
 851        mutex_unlock(&cpqarray_mutex);
 852
 853        return ret;
 854}
 855
 856/*
 857 * Close.  Sync first.
 858 */
 859static void ida_release(struct gendisk *disk, fmode_t mode)
 860{
 861        ctlr_info_t *host;
 862
 863        mutex_lock(&cpqarray_mutex);
 864        host = get_host(disk);
 865        host->usage_count--;
 866        mutex_unlock(&cpqarray_mutex);
 867}
 868
 869/*
 870 * Enqueuing and dequeuing functions for cmdlists.
 871 */
 872static inline void addQ(cmdlist_t **Qptr, cmdlist_t *c)
 873{
 874        if (*Qptr == NULL) {
 875                *Qptr = c;
 876                c->next = c->prev = c;
 877        } else {
 878                c->prev = (*Qptr)->prev;
 879                c->next = (*Qptr);
 880                (*Qptr)->prev->next = c;
 881                (*Qptr)->prev = c;
 882        }
 883}
 884
 885static inline cmdlist_t *removeQ(cmdlist_t **Qptr, cmdlist_t *c)
 886{
 887        if (c && c->next != c) {
 888                if (*Qptr == c) *Qptr = c->next;
 889                c->prev->next = c->next;
 890                c->next->prev = c->prev;
 891        } else {
 892                *Qptr = NULL;
 893        }
 894        return c;
 895}
 896
 897/*
 898 * Get a request and submit it to the controller.
 899 * This routine needs to grab all the requests it possibly can from the
 900 * req Q and submit them.  Interrupts are off (and need to be off) when you
 901 * are in here (either via the dummy do_ida_request functions or by being
 902 * called from the interrupt handler
 903 */
 904static void do_ida_request(struct request_queue *q)
 905{
 906        ctlr_info_t *h = q->queuedata;
 907        cmdlist_t *c;
 908        struct request *creq;
 909        struct scatterlist tmp_sg[SG_MAX];
 910        int i, dir, seg;
 911
 912queue_next:
 913        creq = blk_peek_request(q);
 914        if (!creq)
 915                goto startio;
 916
 917        BUG_ON(creq->nr_phys_segments > SG_MAX);
 918
 919        if ((c = cmd_alloc(h,1)) == NULL)
 920                goto startio;
 921
 922        blk_start_request(creq);
 923
 924        c->ctlr = h->ctlr;
 925        c->hdr.unit = (drv_info_t *)(creq->rq_disk->private_data) - h->drv;
 926        c->hdr.size = sizeof(rblk_t) >> 2;
 927        c->size += sizeof(rblk_t);
 928
 929        c->req.hdr.blk = blk_rq_pos(creq);
 930        c->rq = creq;
 931DBGPX(
 932        printk("sector=%d, nr_sectors=%u\n",
 933               blk_rq_pos(creq), blk_rq_sectors(creq));
 934);
 935        sg_init_table(tmp_sg, SG_MAX);
 936        seg = blk_rq_map_sg(q, creq, tmp_sg);
 937
 938        /* Now do all the DMA Mappings */
 939        if (rq_data_dir(creq) == READ)
 940                dir = PCI_DMA_FROMDEVICE;
 941        else
 942                dir = PCI_DMA_TODEVICE;
 943        for( i=0; i < seg; i++)
 944        {
 945                c->req.sg[i].size = tmp_sg[i].length;
 946                c->req.sg[i].addr = (__u32) pci_map_page(h->pci_dev,
 947                                                 sg_page(&tmp_sg[i]),
 948                                                 tmp_sg[i].offset,
 949                                                 tmp_sg[i].length, dir);
 950        }
 951DBGPX(  printk("Submitting %u sectors in %d segments\n", blk_rq_sectors(creq), seg); );
 952        c->req.hdr.sg_cnt = seg;
 953        c->req.hdr.blk_cnt = blk_rq_sectors(creq);
 954        c->req.hdr.cmd = (rq_data_dir(creq) == READ) ? IDA_READ : IDA_WRITE;
 955        c->type = CMD_RWREQ;
 956
 957        /* Put the request on the tail of the request queue */
 958        addQ(&h->reqQ, c);
 959        h->Qdepth++;
 960        if (h->Qdepth > h->maxQsinceinit) 
 961                h->maxQsinceinit = h->Qdepth;
 962
 963        goto queue_next;
 964
 965startio:
 966        start_io(h);
 967}
 968
 969/* 
 970 * start_io submits everything on a controller's request queue
 971 * and moves it to the completion queue.
 972 *
 973 * Interrupts had better be off if you're in here
 974 */
 975static void start_io(ctlr_info_t *h)
 976{
 977        cmdlist_t *c;
 978
 979        while((c = h->reqQ) != NULL) {
 980                /* Can't do anything if we're busy */
 981                if (h->access.fifo_full(h) == 0)
 982                        return;
 983
 984                /* Get the first entry from the request Q */
 985                removeQ(&h->reqQ, c);
 986                h->Qdepth--;
 987        
 988                /* Tell the controller to do our bidding */
 989                h->access.submit_command(h, c);
 990
 991                /* Get onto the completion Q */
 992                addQ(&h->cmpQ, c);
 993        }
 994}
 995
 996/*
 997 * Mark all buffers that cmd was responsible for
 998 */
 999static inline void complete_command(cmdlist_t *cmd, int timeout)
1000{
1001        struct request *rq = cmd->rq;
1002        int error = 0;
1003        int i, ddir;
1004
1005        if (cmd->req.hdr.rcode & RCODE_NONFATAL &&
1006           (hba[cmd->ctlr]->misc_tflags & MISC_NONFATAL_WARN) == 0) {
1007                printk(KERN_NOTICE "Non Fatal error on ida/c%dd%d\n",
1008                                cmd->ctlr, cmd->hdr.unit);
1009                hba[cmd->ctlr]->misc_tflags |= MISC_NONFATAL_WARN;
1010        }
1011        if (cmd->req.hdr.rcode & RCODE_FATAL) {
1012                printk(KERN_WARNING "Fatal error on ida/c%dd%d\n",
1013                                cmd->ctlr, cmd->hdr.unit);
1014                error = -EIO;
1015        }
1016        if (cmd->req.hdr.rcode & RCODE_INVREQ) {
1017                                printk(KERN_WARNING "Invalid request on ida/c%dd%d = (cmd=%x sect=%d cnt=%d sg=%d ret=%x)\n",
1018                                cmd->ctlr, cmd->hdr.unit, cmd->req.hdr.cmd,
1019                                cmd->req.hdr.blk, cmd->req.hdr.blk_cnt,
1020                                cmd->req.hdr.sg_cnt, cmd->req.hdr.rcode);
1021                error = -EIO;
1022        }
1023        if (timeout)
1024                error = -EIO;
1025        /* unmap the DMA mapping for all the scatter gather elements */
1026        if (cmd->req.hdr.cmd == IDA_READ)
1027                ddir = PCI_DMA_FROMDEVICE;
1028        else
1029                ddir = PCI_DMA_TODEVICE;
1030        for(i=0; i<cmd->req.hdr.sg_cnt; i++)
1031                pci_unmap_page(hba[cmd->ctlr]->pci_dev, cmd->req.sg[i].addr,
1032                                cmd->req.sg[i].size, ddir);
1033
1034        DBGPX(printk("Done with %p\n", rq););
1035        __blk_end_request_all(rq, error);
1036}
1037
1038/*
1039 *  The controller will interrupt us upon completion of commands.
1040 *  Find the command on the completion queue, remove it, tell the OS and
1041 *  try to queue up more IO
1042 */
1043static irqreturn_t do_ida_intr(int irq, void *dev_id)
1044{
1045        ctlr_info_t *h = dev_id;
1046        cmdlist_t *c;
1047        unsigned long istat;
1048        unsigned long flags;
1049        __u32 a,a1;
1050
1051        istat = h->access.intr_pending(h);
1052        /* Is this interrupt for us? */
1053        if (istat == 0)
1054                return IRQ_NONE;
1055
1056        /*
1057         * If there are completed commands in the completion queue,
1058         * we had better do something about it.
1059         */
1060        spin_lock_irqsave(IDA_LOCK(h->ctlr), flags);
1061        if (istat & FIFO_NOT_EMPTY) {
1062                while((a = h->access.command_completed(h))) {
1063                        a1 = a; a &= ~3;
1064                        if ((c = h->cmpQ) == NULL)
1065                        {  
1066                                printk(KERN_WARNING "cpqarray: Completion of %08lx ignored\n", (unsigned long)a1);
1067                                continue;       
1068                        } 
1069                        while(c->busaddr != a) {
1070                                c = c->next;
1071                                if (c == h->cmpQ) 
1072                                        break;
1073                        }
1074                        /*
1075                         * If we've found the command, take it off the
1076                         * completion Q and free it
1077                         */
1078                        if (c->busaddr == a) {
1079                                removeQ(&h->cmpQ, c);
1080                                /*  Check for invalid command.
1081                                 *  Controller returns command error,
1082                                 *  But rcode = 0.
1083                                 */
1084
1085                                if((a1 & 0x03) && (c->req.hdr.rcode == 0))
1086                                {
1087                                        c->req.hdr.rcode = RCODE_INVREQ;
1088                                }
1089                                if (c->type == CMD_RWREQ) {
1090                                        complete_command(c, 0);
1091                                        cmd_free(h, c, 1);
1092                                } else if (c->type == CMD_IOCTL_PEND) {
1093                                        c->type = CMD_IOCTL_DONE;
1094                                }
1095                                continue;
1096                        }
1097                }
1098        }
1099
1100        /*
1101         * See if we can queue up some more IO
1102         */
1103        do_ida_request(h->queue);
1104        spin_unlock_irqrestore(IDA_LOCK(h->ctlr), flags); 
1105        return IRQ_HANDLED;
1106}
1107
1108/*
1109 * This timer was for timing out requests that haven't happened after
1110 * IDA_TIMEOUT.  That wasn't such a good idea.  This timer is used to
1111 * reset a flags structure so we don't flood the user with
1112 * "Non-Fatal error" messages.
1113 */
1114static void ida_timer(unsigned long tdata)
1115{
1116        ctlr_info_t *h = (ctlr_info_t*)tdata;
1117
1118        h->timer.expires = jiffies + IDA_TIMER;
1119        add_timer(&h->timer);
1120        h->misc_tflags = 0;
1121}
1122
1123static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo)
1124{
1125        drv_info_t *drv = get_drv(bdev->bd_disk);
1126
1127        if (drv->cylinders) {
1128                geo->heads = drv->heads;
1129                geo->sectors = drv->sectors;
1130                geo->cylinders = drv->cylinders;
1131        } else {
1132                geo->heads = 0xff;
1133                geo->sectors = 0x3f;
1134                geo->cylinders = drv->nr_blks / (0xff*0x3f);
1135        }
1136
1137        return 0;
1138}
1139
1140/*
1141 *  ida_ioctl does some miscellaneous stuff like reporting drive geometry,
1142 *  setting readahead and submitting commands from userspace to the controller.
1143 */
1144static int ida_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
1145{
1146        drv_info_t *drv = get_drv(bdev->bd_disk);
1147        ctlr_info_t *host = get_host(bdev->bd_disk);
1148        int error;
1149        ida_ioctl_t __user *io = (ida_ioctl_t __user *)arg;
1150        ida_ioctl_t *my_io;
1151
1152        switch(cmd) {
1153        case IDAGETDRVINFO:
1154                if (copy_to_user(&io->c.drv, drv, sizeof(drv_info_t)))
1155                        return -EFAULT;
1156                return 0;
1157        case IDAPASSTHRU:
1158                if (!capable(CAP_SYS_RAWIO))
1159                        return -EPERM;
1160                my_io = kmalloc(sizeof(ida_ioctl_t), GFP_KERNEL);
1161                if (!my_io)
1162                        return -ENOMEM;
1163                error = -EFAULT;
1164                if (copy_from_user(my_io, io, sizeof(*my_io)))
1165                        goto out_passthru;
1166                error = ida_ctlr_ioctl(host, drv - host->drv, my_io);
1167                if (error)
1168                        goto out_passthru;
1169                error = -EFAULT;
1170                if (copy_to_user(io, my_io, sizeof(*my_io)))
1171                        goto out_passthru;
1172                error = 0;
1173out_passthru:
1174                kfree(my_io);
1175                return error;
1176        case IDAGETCTLRSIG:
1177                if (!arg) return -EINVAL;
1178                if (put_user(host->ctlr_sig, (int __user *)arg))
1179                        return -EFAULT;
1180                return 0;
1181        case IDAREVALIDATEVOLS:
1182                if (MINOR(bdev->bd_dev) != 0)
1183                        return -ENXIO;
1184                return revalidate_allvol(host);
1185        case IDADRIVERVERSION:
1186                if (!arg) return -EINVAL;
1187                if (put_user(DRIVER_VERSION, (unsigned long __user *)arg))
1188                        return -EFAULT;
1189                return 0;
1190        case IDAGETPCIINFO:
1191        {
1192                
1193                ida_pci_info_struct pciinfo;
1194
1195                if (!arg) return -EINVAL;
1196                memset(&pciinfo, 0, sizeof(pciinfo));
1197                pciinfo.bus = host->pci_dev->bus->number;
1198                pciinfo.dev_fn = host->pci_dev->devfn;
1199                pciinfo.board_id = host->board_id;
1200                if(copy_to_user((void __user *) arg, &pciinfo,  
1201                        sizeof( ida_pci_info_struct)))
1202                                return -EFAULT;
1203                return(0);
1204        }       
1205
1206        default:
1207                return -EINVAL;
1208        }
1209                
1210}
1211
1212static int ida_ioctl(struct block_device *bdev, fmode_t mode,
1213                             unsigned int cmd, unsigned long param)
1214{
1215        int ret;
1216
1217        mutex_lock(&cpqarray_mutex);
1218        ret = ida_locked_ioctl(bdev, mode, cmd, param);
1219        mutex_unlock(&cpqarray_mutex);
1220
1221        return ret;
1222}
1223
1224/*
1225 * ida_ctlr_ioctl is for passing commands to the controller from userspace.
1226 * The command block (io) has already been copied to kernel space for us,
1227 * however, any elements in the sglist need to be copied to kernel space
1228 * or copied back to userspace.
1229 *
1230 * Only root may perform a controller passthru command, however I'm not doing
1231 * any serious sanity checking on the arguments.  Doing an IDA_WRITE_MEDIA and
1232 * putting a 64M buffer in the sglist is probably a *bad* idea.
1233 */
1234static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io)
1235{
1236        int ctlr = h->ctlr;
1237        cmdlist_t *c;
1238        void *p = NULL;
1239        unsigned long flags;
1240        int error;
1241
1242        if ((c = cmd_alloc(h, 0)) == NULL)
1243                return -ENOMEM;
1244        c->ctlr = ctlr;
1245        c->hdr.unit = (io->unit & UNITVALID) ? (io->unit & ~UNITVALID) : dsk;
1246        c->hdr.size = sizeof(rblk_t) >> 2;
1247        c->size += sizeof(rblk_t);
1248
1249        c->req.hdr.cmd = io->cmd;
1250        c->req.hdr.blk = io->blk;
1251        c->req.hdr.blk_cnt = io->blk_cnt;
1252        c->type = CMD_IOCTL_PEND;
1253
1254        /* Pre submit processing */
1255        switch(io->cmd) {
1256        case PASSTHRU_A:
1257                p = memdup_user(io->sg[0].addr, io->sg[0].size);
1258                if (IS_ERR(p)) {
1259                        error = PTR_ERR(p);
1260                        cmd_free(h, c, 0);
1261                        return error;
1262                }
1263                c->req.hdr.blk = pci_map_single(h->pci_dev, &(io->c), 
1264                                sizeof(ida_ioctl_t), 
1265                                PCI_DMA_BIDIRECTIONAL);
1266                c->req.sg[0].size = io->sg[0].size;
1267                c->req.sg[0].addr = pci_map_single(h->pci_dev, p, 
1268                        c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
1269                c->req.hdr.sg_cnt = 1;
1270                break;
1271        case IDA_READ:
1272        case READ_FLASH_ROM:
1273        case SENSE_CONTROLLER_PERFORMANCE:
1274                p = kmalloc(io->sg[0].size, GFP_KERNEL);
1275                if (!p) 
1276                { 
1277                        error = -ENOMEM; 
1278                        cmd_free(h, c, 0);
1279                        return(error);
1280                }
1281
1282                c->req.sg[0].size = io->sg[0].size;
1283                c->req.sg[0].addr = pci_map_single(h->pci_dev, p, 
1284                        c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL); 
1285                c->req.hdr.sg_cnt = 1;
1286                break;
1287        case IDA_WRITE:
1288        case IDA_WRITE_MEDIA:
1289        case DIAG_PASS_THRU:
1290        case COLLECT_BUFFER:
1291        case WRITE_FLASH_ROM:
1292                p = memdup_user(io->sg[0].addr, io->sg[0].size);
1293                if (IS_ERR(p)) {
1294                        error = PTR_ERR(p);
1295                        cmd_free(h, c, 0);
1296                        return error;
1297                }
1298                c->req.sg[0].size = io->sg[0].size;
1299                c->req.sg[0].addr = pci_map_single(h->pci_dev, p, 
1300                        c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL); 
1301                c->req.hdr.sg_cnt = 1;
1302                break;
1303        default:
1304                c->req.sg[0].size = sizeof(io->c);
1305                c->req.sg[0].addr = pci_map_single(h->pci_dev,&io->c, 
1306                        c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
1307                c->req.hdr.sg_cnt = 1;
1308        }
1309        
1310        /* Put the request on the tail of the request queue */
1311        spin_lock_irqsave(IDA_LOCK(ctlr), flags);
1312        addQ(&h->reqQ, c);
1313        h->Qdepth++;
1314        start_io(h);
1315        spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
1316
1317        /* Wait for completion */
1318        while(c->type != CMD_IOCTL_DONE)
1319                schedule();
1320
1321        /* Unmap the DMA  */
1322        pci_unmap_single(h->pci_dev, c->req.sg[0].addr, c->req.sg[0].size, 
1323                PCI_DMA_BIDIRECTIONAL);
1324        /* Post submit processing */
1325        switch(io->cmd) {
1326        case PASSTHRU_A:
1327                pci_unmap_single(h->pci_dev, c->req.hdr.blk,
1328                                sizeof(ida_ioctl_t),
1329                                PCI_DMA_BIDIRECTIONAL);
1330        case IDA_READ:
1331        case DIAG_PASS_THRU:
1332        case SENSE_CONTROLLER_PERFORMANCE:
1333        case READ_FLASH_ROM:
1334                if (copy_to_user(io->sg[0].addr, p, io->sg[0].size)) {
1335                        kfree(p);
1336                        return -EFAULT;
1337                }
1338                /* fall through and free p */
1339        case IDA_WRITE:
1340        case IDA_WRITE_MEDIA:
1341        case COLLECT_BUFFER:
1342        case WRITE_FLASH_ROM:
1343                kfree(p);
1344                break;
1345        default:;
1346                /* Nothing to do */
1347        }
1348
1349        io->rcode = c->req.hdr.rcode;
1350        cmd_free(h, c, 0);
1351        return(0);
1352}
1353
1354/*
1355 * Commands are pre-allocated in a large block.  Here we use a simple bitmap
1356 * scheme to suballocte them to the driver.  Operations that are not time
1357 * critical (and can wait for kmalloc and possibly sleep) can pass in NULL
1358 * as the first argument to get a new command.
1359 */
1360static cmdlist_t * cmd_alloc(ctlr_info_t *h, int get_from_pool)
1361{
1362        cmdlist_t * c;
1363        int i;
1364        dma_addr_t cmd_dhandle;
1365
1366        if (!get_from_pool) {
1367                c = (cmdlist_t*)pci_alloc_consistent(h->pci_dev, 
1368                        sizeof(cmdlist_t), &cmd_dhandle);
1369                if(c==NULL)
1370                        return NULL;
1371        } else {
1372                do {
1373                        i = find_first_zero_bit(h->cmd_pool_bits, NR_CMDS);
1374                        if (i == NR_CMDS)
1375                                return NULL;
1376                } while(test_and_set_bit(i&(BITS_PER_LONG-1), h->cmd_pool_bits+(i/BITS_PER_LONG)) != 0);
1377                c = h->cmd_pool + i;
1378                cmd_dhandle = h->cmd_pool_dhandle + i*sizeof(cmdlist_t);
1379                h->nr_allocs++;
1380        }
1381
1382        memset(c, 0, sizeof(cmdlist_t));
1383        c->busaddr = cmd_dhandle; 
1384        return c;
1385}
1386
1387static void cmd_free(ctlr_info_t *h, cmdlist_t *c, int got_from_pool)
1388{
1389        int i;
1390
1391        if (!got_from_pool) {
1392                pci_free_consistent(h->pci_dev, sizeof(cmdlist_t), c,
1393                        c->busaddr);
1394        } else {
1395                i = c - h->cmd_pool;
1396                clear_bit(i&(BITS_PER_LONG-1), h->cmd_pool_bits+(i/BITS_PER_LONG));
1397                h->nr_frees++;
1398        }
1399}
1400
1401/***********************************************************************
1402    name:        sendcmd
1403    Send a command to an IDA using the memory mapped FIFO interface
1404    and wait for it to complete.  
1405    This routine should only be called at init time.
1406***********************************************************************/
1407static int sendcmd(
1408        __u8    cmd,
1409        int     ctlr,
1410        void    *buff,
1411        size_t  size,
1412        unsigned int blk,
1413        unsigned int blkcnt,
1414        unsigned int log_unit )
1415{
1416        cmdlist_t *c;
1417        int complete;
1418        unsigned long temp;
1419        unsigned long i;
1420        ctlr_info_t *info_p = hba[ctlr];
1421
1422        c = cmd_alloc(info_p, 1);
1423        if(!c)
1424                return IO_ERROR;
1425        c->ctlr = ctlr;
1426        c->hdr.unit = log_unit;
1427        c->hdr.prio = 0;
1428        c->hdr.size = sizeof(rblk_t) >> 2;
1429        c->size += sizeof(rblk_t);
1430
1431        /* The request information. */
1432        c->req.hdr.next = 0;
1433        c->req.hdr.rcode = 0;
1434        c->req.bp = 0;
1435        c->req.hdr.sg_cnt = 1;
1436        c->req.hdr.reserved = 0;
1437        
1438        if (size == 0)
1439                c->req.sg[0].size = 512;
1440        else
1441                c->req.sg[0].size = size;
1442
1443        c->req.hdr.blk = blk;
1444        c->req.hdr.blk_cnt = blkcnt;
1445        c->req.hdr.cmd = (unsigned char) cmd;
1446        c->req.sg[0].addr = (__u32) pci_map_single(info_p->pci_dev, 
1447                buff, c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
1448        /*
1449         * Disable interrupt
1450         */
1451        info_p->access.set_intr_mask(info_p, 0);
1452        /* Make sure there is room in the command FIFO */
1453        /* Actually it should be completely empty at this time. */
1454        for (i = 200000; i > 0; i--) {
1455                temp = info_p->access.fifo_full(info_p);
1456                if (temp != 0) {
1457                        break;
1458                }
1459                udelay(10);
1460DBG(
1461                printk(KERN_WARNING "cpqarray ida%d: idaSendPciCmd FIFO full,"
1462                        " waiting!\n", ctlr);
1463);
1464        } 
1465        /*
1466         * Send the cmd
1467         */
1468        info_p->access.submit_command(info_p, c);
1469        complete = pollcomplete(ctlr);
1470        
1471        pci_unmap_single(info_p->pci_dev, (dma_addr_t) c->req.sg[0].addr, 
1472                c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
1473        if (complete != 1) {
1474                if (complete != c->busaddr) {
1475                        printk( KERN_WARNING
1476                        "cpqarray ida%d: idaSendPciCmd "
1477                      "Invalid command list address returned! (%08lx)\n",
1478                                ctlr, (unsigned long)complete);
1479                        cmd_free(info_p, c, 1);
1480                        return (IO_ERROR);
1481                }
1482        } else {
1483                printk( KERN_WARNING
1484                        "cpqarray ida%d: idaSendPciCmd Timeout out, "
1485                        "No command list address returned!\n",
1486                        ctlr);
1487                cmd_free(info_p, c, 1);
1488                return (IO_ERROR);
1489        }
1490
1491        if (c->req.hdr.rcode & 0x00FE) {
1492                if (!(c->req.hdr.rcode & BIG_PROBLEM)) {
1493                        printk( KERN_WARNING
1494                        "cpqarray ida%d: idaSendPciCmd, error: "
1495                                "Controller failed at init time "
1496                                "cmd: 0x%x, return code = 0x%x\n",
1497                                ctlr, c->req.hdr.cmd, c->req.hdr.rcode);
1498
1499                        cmd_free(info_p, c, 1);
1500                        return (IO_ERROR);
1501                }
1502        }
1503        cmd_free(info_p, c, 1);
1504        return (IO_OK);
1505}
1506
1507/*
1508 * revalidate_allvol is for online array config utilities.  After a
1509 * utility reconfigures the drives in the array, it can use this function
1510 * (through an ioctl) to make the driver zap any previous disk structs for
1511 * that controller and get new ones.
1512 *
1513 * Right now I'm using the getgeometry() function to do this, but this
1514 * function should probably be finer grained and allow you to revalidate one
1515 * particualar logical volume (instead of all of them on a particular
1516 * controller).
1517 */
1518static int revalidate_allvol(ctlr_info_t *host)
1519{
1520        int ctlr = host->ctlr;
1521        int i;
1522        unsigned long flags;
1523
1524        spin_lock_irqsave(IDA_LOCK(ctlr), flags);
1525        if (host->usage_count > 1) {
1526                spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
1527                printk(KERN_WARNING "cpqarray: Device busy for volume"
1528                        " revalidation (usage=%d)\n", host->usage_count);
1529                return -EBUSY;
1530        }
1531        host->usage_count++;
1532        spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
1533
1534        /*
1535         * Set the partition and block size structures for all volumes
1536         * on this controller to zero.  We will reread all of this data
1537         */
1538        set_capacity(ida_gendisk[ctlr][0], 0);
1539        for (i = 1; i < NWD; i++) {
1540                struct gendisk *disk = ida_gendisk[ctlr][i];
1541                if (disk->flags & GENHD_FL_UP)
1542                        del_gendisk(disk);
1543        }
1544        memset(host->drv, 0, sizeof(drv_info_t)*NWD);
1545
1546        /*
1547         * Tell the array controller not to give us any interrupts while
1548         * we check the new geometry.  Then turn interrupts back on when
1549         * we're done.
1550         */
1551        host->access.set_intr_mask(host, 0);
1552        getgeometry(ctlr);
1553        host->access.set_intr_mask(host, FIFO_NOT_EMPTY);
1554
1555        for(i=0; i<NWD; i++) {
1556                struct gendisk *disk = ida_gendisk[ctlr][i];
1557                drv_info_t *drv = &host->drv[i];
1558                if (i && !drv->nr_blks)
1559                        continue;
1560                blk_queue_logical_block_size(host->queue, drv->blk_size);
1561                set_capacity(disk, drv->nr_blks);
1562                disk->queue = host->queue;
1563                disk->private_data = drv;
1564                if (i)
1565                        add_disk(disk);
1566        }
1567
1568        host->usage_count--;
1569        return 0;
1570}
1571
1572static int ida_revalidate(struct gendisk *disk)
1573{
1574        drv_info_t *drv = disk->private_data;
1575        set_capacity(disk, drv->nr_blks);
1576        return 0;
1577}
1578
1579/********************************************************************
1580    name: pollcomplete
1581    Wait polling for a command to complete.
1582    The memory mapped FIFO is polled for the completion.
1583    Used only at init time, interrupts disabled.
1584 ********************************************************************/
1585static int pollcomplete(int ctlr)
1586{
1587        int done;
1588        int i;
1589
1590        /* Wait (up to 2 seconds) for a command to complete */
1591
1592        for (i = 200000; i > 0; i--) {
1593                done = hba[ctlr]->access.command_completed(hba[ctlr]);
1594                if (done == 0) {
1595                        udelay(10);     /* a short fixed delay */
1596                } else
1597                        return (done);
1598        }
1599        /* Invalid address to tell caller we ran out of time */
1600        return 1;
1601}
1602/*****************************************************************
1603    start_fwbk
1604    Starts controller firmwares background processing. 
1605    Currently only the Integrated Raid controller needs this done.
1606    If the PCI mem address registers are written to after this, 
1607         data corruption may occur
1608*****************************************************************/
1609static void start_fwbk(int ctlr)
1610{
1611                id_ctlr_t *id_ctlr_buf; 
1612        int ret_code;
1613
1614        if(     (hba[ctlr]->board_id != 0x40400E11)
1615                && (hba[ctlr]->board_id != 0x40480E11) )
1616
1617        /* Not a Integrated Raid, so there is nothing for us to do */
1618                return;
1619        printk(KERN_DEBUG "cpqarray: Starting firmware's background"
1620                " processing\n");
1621        /* Command does not return anything, but idasend command needs a 
1622                buffer */
1623        id_ctlr_buf = kmalloc(sizeof(id_ctlr_t), GFP_KERNEL);
1624        if(id_ctlr_buf==NULL)
1625        {
1626                printk(KERN_WARNING "cpqarray: Out of memory. "
1627                        "Unable to start background processing.\n");
1628                return;
1629        }               
1630        ret_code = sendcmd(RESUME_BACKGROUND_ACTIVITY, ctlr, 
1631                id_ctlr_buf, 0, 0, 0, 0);
1632        if(ret_code != IO_OK)
1633                printk(KERN_WARNING "cpqarray: Unable to start"
1634                        " background processing\n");
1635
1636        kfree(id_ctlr_buf);
1637}
1638/*****************************************************************
1639    getgeometry
1640    Get ida logical volume geometry from the controller 
1641    This is a large bit of code which once existed in two flavors,
1642    It is used only at init time.
1643*****************************************************************/
1644static void getgeometry(int ctlr)
1645{                               
1646        id_log_drv_t *id_ldrive;
1647        id_ctlr_t *id_ctlr_buf;
1648        sense_log_drv_stat_t *id_lstatus_buf;
1649        config_t *sense_config_buf;
1650        unsigned int log_unit, log_index;
1651        int ret_code, size;
1652        drv_info_t *drv;
1653        ctlr_info_t *info_p = hba[ctlr];
1654        int i;
1655
1656        info_p->log_drv_map = 0;        
1657        
1658        id_ldrive = kzalloc(sizeof(id_log_drv_t), GFP_KERNEL);
1659        if (!id_ldrive) {
1660                printk( KERN_ERR "cpqarray:  out of memory.\n");
1661                goto err_0;
1662        }
1663
1664        id_ctlr_buf = kzalloc(sizeof(id_ctlr_t), GFP_KERNEL);
1665        if (!id_ctlr_buf) {
1666                printk( KERN_ERR "cpqarray:  out of memory.\n");
1667                goto err_1;
1668        }
1669
1670        id_lstatus_buf = kzalloc(sizeof(sense_log_drv_stat_t), GFP_KERNEL);
1671        if (!id_lstatus_buf) {
1672                printk( KERN_ERR "cpqarray:  out of memory.\n");
1673                goto err_2;
1674        }
1675
1676        sense_config_buf = kzalloc(sizeof(config_t), GFP_KERNEL);
1677        if (!sense_config_buf) {
1678                printk( KERN_ERR "cpqarray:  out of memory.\n");
1679                goto err_3;
1680        }
1681
1682        info_p->phys_drives = 0;
1683        info_p->log_drv_map = 0;
1684        info_p->drv_assign_map = 0;
1685        info_p->drv_spare_map = 0;
1686        info_p->mp_failed_drv_map = 0;  /* only initialized here */
1687        /* Get controllers info for this logical drive */
1688        ret_code = sendcmd(ID_CTLR, ctlr, id_ctlr_buf, 0, 0, 0, 0);
1689        if (ret_code == IO_ERROR) {
1690                /*
1691                 * If can't get controller info, set the logical drive map to 0,
1692                 * so the idastubopen will fail on all logical drives
1693                 * on the controller.
1694                 */
1695                printk(KERN_ERR "cpqarray: error sending ID controller\n");
1696                goto err_4;
1697        }
1698
1699        info_p->log_drives = id_ctlr_buf->nr_drvs;
1700        for(i=0;i<4;i++)
1701                info_p->firm_rev[i] = id_ctlr_buf->firm_rev[i];
1702        info_p->ctlr_sig = id_ctlr_buf->cfg_sig;
1703
1704        printk(" (%s)\n", info_p->product_name);
1705        /*
1706         * Initialize logical drive map to zero
1707         */
1708        log_index = 0;
1709        /*
1710         * Get drive geometry for all logical drives
1711         */
1712        if (id_ctlr_buf->nr_drvs > 16)
1713                printk(KERN_WARNING "cpqarray ida%d:  This driver supports "
1714                        "16 logical drives per controller.\n.  "
1715                        " Additional drives will not be "
1716                        "detected\n", ctlr);
1717
1718        for (log_unit = 0;
1719             (log_index < id_ctlr_buf->nr_drvs)
1720             && (log_unit < NWD);
1721             log_unit++) {
1722                size = sizeof(sense_log_drv_stat_t);
1723
1724                /*
1725                   Send "Identify logical drive status" cmd
1726                 */
1727                ret_code = sendcmd(SENSE_LOG_DRV_STAT,
1728                             ctlr, id_lstatus_buf, size, 0, 0, log_unit);
1729                if (ret_code == IO_ERROR) {
1730                        /*
1731                           If can't get logical drive status, set
1732                           the logical drive map to 0, so the
1733                           idastubopen will fail for all logical drives
1734                           on the controller. 
1735                         */
1736                        info_p->log_drv_map = 0;        
1737                        printk( KERN_WARNING
1738                             "cpqarray ida%d: idaGetGeometry - Controller"
1739                                " failed to report status of logical drive %d\n"
1740                         "Access to this controller has been disabled\n",
1741                                ctlr, log_unit);
1742                        goto err_4;
1743                }
1744                /*
1745                   Make sure the logical drive is configured
1746                 */
1747                if (id_lstatus_buf->status != LOG_NOT_CONF) {
1748                        ret_code = sendcmd(ID_LOG_DRV, ctlr, id_ldrive,
1749                               sizeof(id_log_drv_t), 0, 0, log_unit);
1750                        /*
1751                           If error, the bit for this
1752                           logical drive won't be set and
1753                           idastubopen will return error. 
1754                         */
1755                        if (ret_code != IO_ERROR) {
1756                                drv = &info_p->drv[log_unit];
1757                                drv->blk_size = id_ldrive->blk_size;
1758                                drv->nr_blks = id_ldrive->nr_blks;
1759                                drv->cylinders = id_ldrive->drv.cyl;
1760                                drv->heads = id_ldrive->drv.heads;
1761                                drv->sectors = id_ldrive->drv.sect_per_track;
1762                                info_p->log_drv_map |=  (1 << log_unit);
1763
1764        printk(KERN_INFO "cpqarray ida/c%dd%d: blksz=%d nr_blks=%d\n",
1765                ctlr, log_unit, drv->blk_size, drv->nr_blks);
1766                                ret_code = sendcmd(SENSE_CONFIG,
1767                                                  ctlr, sense_config_buf,
1768                                 sizeof(config_t), 0, 0, log_unit);
1769                                if (ret_code == IO_ERROR) {
1770                                        info_p->log_drv_map = 0;
1771                                        printk(KERN_ERR "cpqarray: error sending sense config\n");
1772                                        goto err_4;
1773                                }
1774
1775                                info_p->phys_drives =
1776                                    sense_config_buf->ctlr_phys_drv;
1777                                info_p->drv_assign_map
1778                                    |= sense_config_buf->drv_asgn_map;
1779                                info_p->drv_assign_map
1780                                    |= sense_config_buf->spare_asgn_map;
1781                                info_p->drv_spare_map
1782                                    |= sense_config_buf->spare_asgn_map;
1783                        }       /* end of if no error on id_ldrive */
1784                        log_index = log_index + 1;
1785                }               /* end of if logical drive configured */
1786        }                       /* end of for log_unit */
1787
1788        /* Free all the buffers and return */
1789err_4:
1790        kfree(sense_config_buf);
1791err_3:
1792        kfree(id_lstatus_buf);
1793err_2:
1794        kfree(id_ctlr_buf);
1795err_1:
1796        kfree(id_ldrive);
1797err_0:
1798        return;
1799}
1800
1801static void __exit cpqarray_exit(void)
1802{
1803        int i;
1804
1805        pci_unregister_driver(&cpqarray_pci_driver);
1806
1807        /* Double check that all controller entries have been removed */
1808        for(i=0; i<MAX_CTLR; i++) {
1809                if (hba[i] != NULL) {
1810                        printk(KERN_WARNING "cpqarray: Removing EISA "
1811                                        "controller %d\n", i);
1812                        cpqarray_remove_one_eisa(i);
1813                }
1814        }
1815
1816        remove_proc_entry("driver/cpqarray", NULL);
1817}
1818
1819module_init(cpqarray_init)
1820module_exit(cpqarray_exit)
1821