linux/drivers/scsi/dpt_i2o.c
<<
>>
Prefs
   1/***************************************************************************
   2                          dpti.c  -  description
   3                             -------------------
   4    begin                : Thu Sep 7 2000
   5    copyright            : (C) 2000 by Adaptec
   6
   7                           July 30, 2001 First version being submitted
   8                           for inclusion in the kernel.  V2.4
   9
  10    See Documentation/scsi/dpti.txt for history, notes, license info
  11    and credits
  12 ***************************************************************************/
  13
  14/***************************************************************************
  15 *                                                                         *
  16 *   This program is free software; you can redistribute it and/or modify  *
  17 *   it under the terms of the GNU General Public License as published by  *
  18 *   the Free Software Foundation; either version 2 of the License, or     *
  19 *   (at your option) any later version.                                   *
  20 *                                                                         *
  21 ***************************************************************************/
  22/***************************************************************************
  23 * Sat Dec 20 2003 Go Taniguchi <go@turbolinux.co.jp>
  24 - Support 2.6 kernel and DMA-mapping
  25 - ioctl fix for raid tools
  26 - use schedule_timeout in long long loop
  27 **************************************************************************/
  28
  29/*#define DEBUG 1 */
  30/*#define UARTDELAY 1 */
  31
  32#include <linux/module.h>
  33
  34MODULE_AUTHOR("Deanna Bonds, with _lots_ of help from Mark Salyzyn");
  35MODULE_DESCRIPTION("Adaptec I2O RAID Driver");
  36
  37////////////////////////////////////////////////////////////////
  38
  39#include <linux/ioctl.h>        /* For SCSI-Passthrough */
  40#include <asm/uaccess.h>
  41
  42#include <linux/stat.h>
  43#include <linux/slab.h>         /* for kmalloc() */
  44#include <linux/pci.h>          /* for PCI support */
  45#include <linux/proc_fs.h>
  46#include <linux/blkdev.h>
  47#include <linux/delay.h>        /* for udelay */
  48#include <linux/interrupt.h>
  49#include <linux/kernel.h>       /* for printk */
  50#include <linux/sched.h>
  51#include <linux/reboot.h>
  52#include <linux/spinlock.h>
  53#include <linux/dma-mapping.h>
  54
  55#include <linux/timer.h>
  56#include <linux/string.h>
  57#include <linux/ioport.h>
  58#include <linux/mutex.h>
  59
  60#include <asm/processor.h>      /* for boot_cpu_data */
  61#include <asm/pgtable.h>
  62#include <asm/io.h>             /* for virt_to_bus, etc. */
  63
  64#include <scsi/scsi.h>
  65#include <scsi/scsi_cmnd.h>
  66#include <scsi/scsi_device.h>
  67#include <scsi/scsi_host.h>
  68#include <scsi/scsi_tcq.h>
  69
  70#include "dpt/dptsig.h"
  71#include "dpti.h"
  72
  73/*============================================================================
  74 * Create a binary signature - this is read by dptsig
  75 * Needed for our management apps
  76 *============================================================================
  77 */
  78static DEFINE_MUTEX(adpt_mutex);
  79static dpt_sig_S DPTI_sig = {
  80        {'d', 'P', 't', 'S', 'i', 'G'}, SIG_VERSION,
  81#ifdef __i386__
  82        PROC_INTEL, PROC_386 | PROC_486 | PROC_PENTIUM | PROC_SEXIUM,
  83#elif defined(__ia64__)
  84        PROC_INTEL, PROC_IA64,
  85#elif defined(__sparc__)
  86        PROC_ULTRASPARC, PROC_ULTRASPARC,
  87#elif defined(__alpha__)
  88        PROC_ALPHA, PROC_ALPHA,
  89#else
  90        (-1),(-1),
  91#endif
  92         FT_HBADRVR, 0, OEM_DPT, OS_LINUX, CAP_OVERLAP, DEV_ALL,
  93        ADF_ALL_SC5, 0, 0, DPT_VERSION, DPT_REVISION, DPT_SUBREVISION,
  94        DPT_MONTH, DPT_DAY, DPT_YEAR, "Adaptec Linux I2O RAID Driver"
  95};
  96
  97
  98
  99
 100/*============================================================================
 101 * Globals
 102 *============================================================================
 103 */
 104
 105static DEFINE_MUTEX(adpt_configuration_lock);
 106
 107static struct i2o_sys_tbl *sys_tbl;
 108static dma_addr_t sys_tbl_pa;
 109static int sys_tbl_ind;
 110static int sys_tbl_len;
 111
 112static adpt_hba* hba_chain = NULL;
 113static int hba_count = 0;
 114
 115static struct class *adpt_sysfs_class;
 116
 117static long adpt_unlocked_ioctl(struct file *, unsigned int, unsigned long);
 118#ifdef CONFIG_COMPAT
 119static long compat_adpt_ioctl(struct file *, unsigned int, unsigned long);
 120#endif
 121
 122static const struct file_operations adpt_fops = {
 123        .unlocked_ioctl = adpt_unlocked_ioctl,
 124        .open           = adpt_open,
 125        .release        = adpt_close,
 126#ifdef CONFIG_COMPAT
 127        .compat_ioctl   = compat_adpt_ioctl,
 128#endif
 129        .llseek         = noop_llseek,
 130};
 131
 132/* Structures and definitions for synchronous message posting.
 133 * See adpt_i2o_post_wait() for description
 134 * */
 135struct adpt_i2o_post_wait_data
 136{
 137        int status;
 138        u32 id;
 139        adpt_wait_queue_head_t *wq;
 140        struct adpt_i2o_post_wait_data *next;
 141};
 142
 143static struct adpt_i2o_post_wait_data *adpt_post_wait_queue = NULL;
 144static u32 adpt_post_wait_id = 0;
 145static DEFINE_SPINLOCK(adpt_post_wait_lock);
 146
 147
 148/*============================================================================
 149 *                              Functions
 150 *============================================================================
 151 */
 152
 153static inline int dpt_dma64(adpt_hba *pHba)
 154{
 155        return (sizeof(dma_addr_t) > 4 && (pHba)->dma64);
 156}
 157
 158static inline u32 dma_high(dma_addr_t addr)
 159{
 160        return upper_32_bits(addr);
 161}
 162
 163static inline u32 dma_low(dma_addr_t addr)
 164{
 165        return (u32)addr;
 166}
 167
 168static u8 adpt_read_blink_led(adpt_hba* host)
 169{
 170        if (host->FwDebugBLEDflag_P) {
 171                if( readb(host->FwDebugBLEDflag_P) == 0xbc ){
 172                        return readb(host->FwDebugBLEDvalue_P);
 173                }
 174        }
 175        return 0;
 176}
 177
 178/*============================================================================
 179 * Scsi host template interface functions
 180 *============================================================================
 181 */
 182
 183#ifdef MODULE
 184static struct pci_device_id dptids[] = {
 185        { PCI_DPT_VENDOR_ID, PCI_DPT_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
 186        { PCI_DPT_VENDOR_ID, PCI_DPT_RAPTOR_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
 187        { 0, }
 188};
 189#endif
 190
 191MODULE_DEVICE_TABLE(pci,dptids);
 192
 193static int adpt_detect(struct scsi_host_template* sht)
 194{
 195        struct pci_dev *pDev = NULL;
 196        adpt_hba *pHba;
 197        adpt_hba *next;
 198
 199        PINFO("Detecting Adaptec I2O RAID controllers...\n");
 200
 201        /* search for all Adatpec I2O RAID cards */
 202        while ((pDev = pci_get_device( PCI_DPT_VENDOR_ID, PCI_ANY_ID, pDev))) {
 203                if(pDev->device == PCI_DPT_DEVICE_ID ||
 204                   pDev->device == PCI_DPT_RAPTOR_DEVICE_ID){
 205                        if(adpt_install_hba(sht, pDev) ){
 206                                PERROR("Could not Init an I2O RAID device\n");
 207                                PERROR("Will not try to detect others.\n");
 208                                return hba_count-1;
 209                        }
 210                        pci_dev_get(pDev);
 211                }
 212        }
 213
 214        /* In INIT state, Activate IOPs */
 215        for (pHba = hba_chain; pHba; pHba = next) {
 216                next = pHba->next;
 217                // Activate does get status , init outbound, and get hrt
 218                if (adpt_i2o_activate_hba(pHba) < 0) {
 219                        adpt_i2o_delete_hba(pHba);
 220                }
 221        }
 222
 223
 224        /* Active IOPs in HOLD state */
 225
 226rebuild_sys_tab:
 227        if (hba_chain == NULL) 
 228                return 0;
 229
 230        /*
 231         * If build_sys_table fails, we kill everything and bail
 232         * as we can't init the IOPs w/o a system table
 233         */     
 234        if (adpt_i2o_build_sys_table() < 0) {
 235                adpt_i2o_sys_shutdown();
 236                return 0;
 237        }
 238
 239        PDEBUG("HBA's in HOLD state\n");
 240
 241        /* If IOP don't get online, we need to rebuild the System table */
 242        for (pHba = hba_chain; pHba; pHba = pHba->next) {
 243                if (adpt_i2o_online_hba(pHba) < 0) {
 244                        adpt_i2o_delete_hba(pHba);      
 245                        goto rebuild_sys_tab;
 246                }
 247        }
 248
 249        /* Active IOPs now in OPERATIONAL state */
 250        PDEBUG("HBA's in OPERATIONAL state\n");
 251
 252        printk("dpti: If you have a lot of devices this could take a few minutes.\n");
 253        for (pHba = hba_chain; pHba; pHba = next) {
 254                next = pHba->next;
 255                printk(KERN_INFO"%s: Reading the hardware resource table.\n", pHba->name);
 256                if (adpt_i2o_lct_get(pHba) < 0){
 257                        adpt_i2o_delete_hba(pHba);
 258                        continue;
 259                }
 260
 261                if (adpt_i2o_parse_lct(pHba) < 0){
 262                        adpt_i2o_delete_hba(pHba);
 263                        continue;
 264                }
 265                adpt_inquiry(pHba);
 266        }
 267
 268        adpt_sysfs_class = class_create(THIS_MODULE, "dpt_i2o");
 269        if (IS_ERR(adpt_sysfs_class)) {
 270                printk(KERN_WARNING"dpti: unable to create dpt_i2o class\n");
 271                adpt_sysfs_class = NULL;
 272        }
 273
 274        for (pHba = hba_chain; pHba; pHba = next) {
 275                next = pHba->next;
 276                if (adpt_scsi_host_alloc(pHba, sht) < 0){
 277                        adpt_i2o_delete_hba(pHba);
 278                        continue;
 279                }
 280                pHba->initialized = TRUE;
 281                pHba->state &= ~DPTI_STATE_RESET;
 282                if (adpt_sysfs_class) {
 283                        struct device *dev = device_create(adpt_sysfs_class,
 284                                NULL, MKDEV(DPTI_I2O_MAJOR, pHba->unit), NULL,
 285                                "dpti%d", pHba->unit);
 286                        if (IS_ERR(dev)) {
 287                                printk(KERN_WARNING"dpti%d: unable to "
 288                                        "create device in dpt_i2o class\n",
 289                                        pHba->unit);
 290                        }
 291                }
 292        }
 293
 294        // Register our control device node
 295        // nodes will need to be created in /dev to access this
 296        // the nodes can not be created from within the driver
 297        if (hba_count && register_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER, &adpt_fops)) {
 298                adpt_i2o_sys_shutdown();
 299                return 0;
 300        }
 301        return hba_count;
 302}
 303
 304
 305/*
 306 * scsi_unregister will be called AFTER we return.
 307 */
 308static int adpt_release(struct Scsi_Host *host)
 309{
 310        adpt_hba* pHba = (adpt_hba*) host->hostdata[0];
 311//      adpt_i2o_quiesce_hba(pHba);
 312        adpt_i2o_delete_hba(pHba);
 313        scsi_unregister(host);
 314        return 0;
 315}
 316
 317
 318static void adpt_inquiry(adpt_hba* pHba)
 319{
 320        u32 msg[17]; 
 321        u32 *mptr;
 322        u32 *lenptr;
 323        int direction;
 324        int scsidir;
 325        u32 len;
 326        u32 reqlen;
 327        u8* buf;
 328        dma_addr_t addr;
 329        u8  scb[16];
 330        s32 rcode;
 331
 332        memset(msg, 0, sizeof(msg));
 333        buf = dma_alloc_coherent(&pHba->pDev->dev, 80, &addr, GFP_KERNEL);
 334        if(!buf){
 335                printk(KERN_ERR"%s: Could not allocate buffer\n",pHba->name);
 336                return;
 337        }
 338        memset((void*)buf, 0, 36);
 339        
 340        len = 36;
 341        direction = 0x00000000; 
 342        scsidir  =0x40000000;   // DATA IN  (iop<--dev)
 343
 344        if (dpt_dma64(pHba))
 345                reqlen = 17;            // SINGLE SGE, 64 bit
 346        else
 347                reqlen = 14;            // SINGLE SGE, 32 bit
 348        /* Stick the headers on */
 349        msg[0] = reqlen<<16 | SGL_OFFSET_12;
 350        msg[1] = (0xff<<24|HOST_TID<<12|ADAPTER_TID);
 351        msg[2] = 0;
 352        msg[3]  = 0;
 353        // Adaptec/DPT Private stuff 
 354        msg[4] = I2O_CMD_SCSI_EXEC|DPT_ORGANIZATION_ID<<16;
 355        msg[5] = ADAPTER_TID | 1<<16 /* Interpret*/;
 356        /* Direction, disconnect ok | sense data | simple queue , CDBLen */
 357        // I2O_SCB_FLAG_ENABLE_DISCONNECT | 
 358        // I2O_SCB_FLAG_SIMPLE_QUEUE_TAG | 
 359        // I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
 360        msg[6] = scsidir|0x20a00000| 6 /* cmd len*/;
 361
 362        mptr=msg+7;
 363
 364        memset(scb, 0, sizeof(scb));
 365        // Write SCSI command into the message - always 16 byte block 
 366        scb[0] = INQUIRY;
 367        scb[1] = 0;
 368        scb[2] = 0;
 369        scb[3] = 0;
 370        scb[4] = 36;
 371        scb[5] = 0;
 372        // Don't care about the rest of scb
 373
 374        memcpy(mptr, scb, sizeof(scb));
 375        mptr+=4;
 376        lenptr=mptr++;          /* Remember me - fill in when we know */
 377
 378        /* Now fill in the SGList and command */
 379        *lenptr = len;
 380        if (dpt_dma64(pHba)) {
 381                *mptr++ = (0x7C<<24)+(2<<16)+0x02; /* Enable 64 bit */
 382                *mptr++ = 1 << PAGE_SHIFT;
 383                *mptr++ = 0xD0000000|direction|len;
 384                *mptr++ = dma_low(addr);
 385                *mptr++ = dma_high(addr);
 386        } else {
 387                *mptr++ = 0xD0000000|direction|len;
 388                *mptr++ = addr;
 389        }
 390
 391        // Send it on it's way
 392        rcode = adpt_i2o_post_wait(pHba, msg, reqlen<<2, 120);
 393        if (rcode != 0) {
 394                sprintf(pHba->detail, "Adaptec I2O RAID");
 395                printk(KERN_INFO "%s: Inquiry Error (%d)\n",pHba->name,rcode);
 396                if (rcode != -ETIME && rcode != -EINTR)
 397                        dma_free_coherent(&pHba->pDev->dev, 80, buf, addr);
 398        } else {
 399                memset(pHba->detail, 0, sizeof(pHba->detail));
 400                memcpy(&(pHba->detail), "Vendor: Adaptec ", 16);
 401                memcpy(&(pHba->detail[16]), " Model: ", 8);
 402                memcpy(&(pHba->detail[24]), (u8*) &buf[16], 16);
 403                memcpy(&(pHba->detail[40]), " FW: ", 4);
 404                memcpy(&(pHba->detail[44]), (u8*) &buf[32], 4);
 405                pHba->detail[48] = '\0';        /* precautionary */
 406                dma_free_coherent(&pHba->pDev->dev, 80, buf, addr);
 407        }
 408        adpt_i2o_status_get(pHba);
 409        return ;
 410}
 411
 412
 413static int adpt_slave_configure(struct scsi_device * device)
 414{
 415        struct Scsi_Host *host = device->host;
 416        adpt_hba* pHba;
 417
 418        pHba = (adpt_hba *) host->hostdata[0];
 419
 420        if (host->can_queue && device->tagged_supported) {
 421                scsi_change_queue_depth(device,
 422                                host->can_queue - 1);
 423        }
 424        return 0;
 425}
 426
 427static int adpt_queue_lck(struct scsi_cmnd * cmd, void (*done) (struct scsi_cmnd *))
 428{
 429        adpt_hba* pHba = NULL;
 430        struct adpt_device* pDev = NULL;        /* dpt per device information */
 431
 432        cmd->scsi_done = done;
 433        /*
 434         * SCSI REQUEST_SENSE commands will be executed automatically by the 
 435         * Host Adapter for any errors, so they should not be executed 
 436         * explicitly unless the Sense Data is zero indicating that no error 
 437         * occurred.
 438         */
 439
 440        if ((cmd->cmnd[0] == REQUEST_SENSE) && (cmd->sense_buffer[0] != 0)) {
 441                cmd->result = (DID_OK << 16);
 442                cmd->scsi_done(cmd);
 443                return 0;
 444        }
 445
 446        pHba = (adpt_hba*)cmd->device->host->hostdata[0];
 447        if (!pHba) {
 448                return FAILED;
 449        }
 450
 451        rmb();
 452        if ((pHba->state) & DPTI_STATE_RESET)
 453                return SCSI_MLQUEUE_HOST_BUSY;
 454
 455        // TODO if the cmd->device if offline then I may need to issue a bus rescan
 456        // followed by a get_lct to see if the device is there anymore
 457        if((pDev = (struct adpt_device*) (cmd->device->hostdata)) == NULL) {
 458                /*
 459                 * First command request for this device.  Set up a pointer
 460                 * to the device structure.  This should be a TEST_UNIT_READY
 461                 * command from scan_scsis_single.
 462                 */
 463                if ((pDev = adpt_find_device(pHba, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun)) == NULL) {
 464                        // TODO: if any luns are at this bus, scsi id then fake a TEST_UNIT_READY and INQUIRY response 
 465                        // with type 7F (for all luns less than the max for this bus,id) so the lun scan will continue.
 466                        cmd->result = (DID_NO_CONNECT << 16);
 467                        cmd->scsi_done(cmd);
 468                        return 0;
 469                }
 470                cmd->device->hostdata = pDev;
 471        }
 472        pDev->pScsi_dev = cmd->device;
 473
 474        /*
 475         * If we are being called from when the device is being reset, 
 476         * delay processing of the command until later.
 477         */
 478        if (pDev->state & DPTI_DEV_RESET ) {
 479                return FAILED;
 480        }
 481        return adpt_scsi_to_i2o(pHba, cmd, pDev);
 482}
 483
 484static DEF_SCSI_QCMD(adpt_queue)
 485
 486static int adpt_bios_param(struct scsi_device *sdev, struct block_device *dev,
 487                sector_t capacity, int geom[])
 488{
 489        int heads=-1;
 490        int sectors=-1;
 491        int cylinders=-1;
 492
 493        // *** First lets set the default geometry ****
 494        
 495        // If the capacity is less than ox2000
 496        if (capacity < 0x2000 ) {       // floppy
 497                heads = 18;
 498                sectors = 2;
 499        } 
 500        // else if between 0x2000 and 0x20000
 501        else if (capacity < 0x20000) {
 502                heads = 64;
 503                sectors = 32;
 504        }
 505        // else if between 0x20000 and 0x40000
 506        else if (capacity < 0x40000) {
 507                heads = 65;
 508                sectors = 63;
 509        }
 510        // else if between 0x4000 and 0x80000
 511        else if (capacity < 0x80000) {
 512                heads = 128;
 513                sectors = 63;
 514        }
 515        // else if greater than 0x80000
 516        else {
 517                heads = 255;
 518                sectors = 63;
 519        }
 520        cylinders = sector_div(capacity, heads * sectors);
 521
 522        // Special case if CDROM
 523        if(sdev->type == 5) {  // CDROM
 524                heads = 252;
 525                sectors = 63;
 526                cylinders = 1111;
 527        }
 528
 529        geom[0] = heads;
 530        geom[1] = sectors;
 531        geom[2] = cylinders;
 532        
 533        PDEBUG("adpt_bios_param: exit\n");
 534        return 0;
 535}
 536
 537
 538static const char *adpt_info(struct Scsi_Host *host)
 539{
 540        adpt_hba* pHba;
 541
 542        pHba = (adpt_hba *) host->hostdata[0];
 543        return (char *) (pHba->detail);
 544}
 545
 546static int adpt_show_info(struct seq_file *m, struct Scsi_Host *host)
 547{
 548        struct adpt_device* d;
 549        int id;
 550        int chan;
 551        adpt_hba* pHba;
 552        int unit;
 553
 554        // Find HBA (host bus adapter) we are looking for
 555        mutex_lock(&adpt_configuration_lock);
 556        for (pHba = hba_chain; pHba; pHba = pHba->next) {
 557                if (pHba->host == host) {
 558                        break;  /* found adapter */
 559                }
 560        }
 561        mutex_unlock(&adpt_configuration_lock);
 562        if (pHba == NULL) {
 563                return 0;
 564        }
 565        host = pHba->host;
 566
 567        seq_printf(m, "Adaptec I2O RAID Driver Version: %s\n\n", DPT_I2O_VERSION);
 568        seq_printf(m, "%s\n", pHba->detail);
 569        seq_printf(m, "SCSI Host=scsi%d  Control Node=/dev/%s  irq=%d\n", 
 570                        pHba->host->host_no, pHba->name, host->irq);
 571        seq_printf(m, "\tpost fifo size  = %d\n\treply fifo size = %d\n\tsg table size   = %d\n\n",
 572                        host->can_queue, (int) pHba->reply_fifo_size , host->sg_tablesize);
 573
 574        seq_puts(m, "Devices:\n");
 575        for(chan = 0; chan < MAX_CHANNEL; chan++) {
 576                for(id = 0; id < MAX_ID; id++) {
 577                        d = pHba->channel[chan].device[id];
 578                        while(d) {
 579                                seq_printf(m,"\t%-24.24s", d->pScsi_dev->vendor);
 580                                seq_printf(m," Rev: %-8.8s\n", d->pScsi_dev->rev);
 581
 582                                unit = d->pI2o_dev->lct_data.tid;
 583                                seq_printf(m, "\tTID=%d, (Channel=%d, Target=%d, Lun=%llu)  (%s)\n\n",
 584                                               unit, (int)d->scsi_channel, (int)d->scsi_id, d->scsi_lun,
 585                                               scsi_device_online(d->pScsi_dev)? "online":"offline"); 
 586                                d = d->next_lun;
 587                        }
 588                }
 589        }
 590        return 0;
 591}
 592
 593/*
 594 *      Turn a struct scsi_cmnd * into a unique 32 bit 'context'.
 595 */
 596static u32 adpt_cmd_to_context(struct scsi_cmnd *cmd)
 597{
 598        return (u32)cmd->serial_number;
 599}
 600
 601/*
 602 *      Go from a u32 'context' to a struct scsi_cmnd * .
 603 *      This could probably be made more efficient.
 604 */
 605static struct scsi_cmnd *
 606        adpt_cmd_from_context(adpt_hba * pHba, u32 context)
 607{
 608        struct scsi_cmnd * cmd;
 609        struct scsi_device * d;
 610
 611        if (context == 0)
 612                return NULL;
 613
 614        spin_unlock(pHba->host->host_lock);
 615        shost_for_each_device(d, pHba->host) {
 616                unsigned long flags;
 617                spin_lock_irqsave(&d->list_lock, flags);
 618                list_for_each_entry(cmd, &d->cmd_list, list) {
 619                        if (((u32)cmd->serial_number == context)) {
 620                                spin_unlock_irqrestore(&d->list_lock, flags);
 621                                scsi_device_put(d);
 622                                spin_lock(pHba->host->host_lock);
 623                                return cmd;
 624                        }
 625                }
 626                spin_unlock_irqrestore(&d->list_lock, flags);
 627        }
 628        spin_lock(pHba->host->host_lock);
 629
 630        return NULL;
 631}
 632
 633/*
 634 *      Turn a pointer to ioctl reply data into an u32 'context'
 635 */
 636static u32 adpt_ioctl_to_context(adpt_hba * pHba, void *reply)
 637{
 638#if BITS_PER_LONG == 32
 639        return (u32)(unsigned long)reply;
 640#else
 641        ulong flags = 0;
 642        u32 nr, i;
 643
 644        spin_lock_irqsave(pHba->host->host_lock, flags);
 645        nr = ARRAY_SIZE(pHba->ioctl_reply_context);
 646        for (i = 0; i < nr; i++) {
 647                if (pHba->ioctl_reply_context[i] == NULL) {
 648                        pHba->ioctl_reply_context[i] = reply;
 649                        break;
 650                }
 651        }
 652        spin_unlock_irqrestore(pHba->host->host_lock, flags);
 653        if (i >= nr) {
 654                kfree (reply);
 655                printk(KERN_WARNING"%s: Too many outstanding "
 656                                "ioctl commands\n", pHba->name);
 657                return (u32)-1;
 658        }
 659
 660        return i;
 661#endif
 662}
 663
 664/*
 665 *      Go from an u32 'context' to a pointer to ioctl reply data.
 666 */
 667static void *adpt_ioctl_from_context(adpt_hba *pHba, u32 context)
 668{
 669#if BITS_PER_LONG == 32
 670        return (void *)(unsigned long)context;
 671#else
 672        void *p = pHba->ioctl_reply_context[context];
 673        pHba->ioctl_reply_context[context] = NULL;
 674
 675        return p;
 676#endif
 677}
 678
 679/*===========================================================================
 680 * Error Handling routines
 681 *===========================================================================
 682 */
 683
 684static int adpt_abort(struct scsi_cmnd * cmd)
 685{
 686        adpt_hba* pHba = NULL;  /* host bus adapter structure */
 687        struct adpt_device* dptdevice;  /* dpt per device information */
 688        u32 msg[5];
 689        int rcode;
 690
 691        if(cmd->serial_number == 0){
 692                return FAILED;
 693        }
 694        pHba = (adpt_hba*) cmd->device->host->hostdata[0];
 695        printk(KERN_INFO"%s: Trying to Abort\n",pHba->name);
 696        if ((dptdevice = (void*) (cmd->device->hostdata)) == NULL) {
 697                printk(KERN_ERR "%s: Unable to abort: No device in cmnd\n",pHba->name);
 698                return FAILED;
 699        }
 700
 701        memset(msg, 0, sizeof(msg));
 702        msg[0] = FIVE_WORD_MSG_SIZE|SGL_OFFSET_0;
 703        msg[1] = I2O_CMD_SCSI_ABORT<<24|HOST_TID<<12|dptdevice->tid;
 704        msg[2] = 0;
 705        msg[3]= 0; 
 706        msg[4] = adpt_cmd_to_context(cmd);
 707        if (pHba->host)
 708                spin_lock_irq(pHba->host->host_lock);
 709        rcode = adpt_i2o_post_wait(pHba, msg, sizeof(msg), FOREVER);
 710        if (pHba->host)
 711                spin_unlock_irq(pHba->host->host_lock);
 712        if (rcode != 0) {
 713                if(rcode == -EOPNOTSUPP ){
 714                        printk(KERN_INFO"%s: Abort cmd not supported\n",pHba->name);
 715                        return FAILED;
 716                }
 717                printk(KERN_INFO"%s: Abort failed.\n",pHba->name);
 718                return FAILED;
 719        } 
 720        printk(KERN_INFO"%s: Abort complete.\n",pHba->name);
 721        return SUCCESS;
 722}
 723
 724
 725#define I2O_DEVICE_RESET 0x27
 726// This is the same for BLK and SCSI devices
 727// NOTE this is wrong in the i2o.h definitions
 728// This is not currently supported by our adapter but we issue it anyway
 729static int adpt_device_reset(struct scsi_cmnd* cmd)
 730{
 731        adpt_hba* pHba;
 732        u32 msg[4];
 733        u32 rcode;
 734        int old_state;
 735        struct adpt_device* d = cmd->device->hostdata;
 736
 737        pHba = (void*) cmd->device->host->hostdata[0];
 738        printk(KERN_INFO"%s: Trying to reset device\n",pHba->name);
 739        if (!d) {
 740                printk(KERN_INFO"%s: Reset Device: Device Not found\n",pHba->name);
 741                return FAILED;
 742        }
 743        memset(msg, 0, sizeof(msg));
 744        msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
 745        msg[1] = (I2O_DEVICE_RESET<<24|HOST_TID<<12|d->tid);
 746        msg[2] = 0;
 747        msg[3] = 0;
 748
 749        if (pHba->host)
 750                spin_lock_irq(pHba->host->host_lock);
 751        old_state = d->state;
 752        d->state |= DPTI_DEV_RESET;
 753        rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
 754        d->state = old_state;
 755        if (pHba->host)
 756                spin_unlock_irq(pHba->host->host_lock);
 757        if (rcode != 0) {
 758                if(rcode == -EOPNOTSUPP ){
 759                        printk(KERN_INFO"%s: Device reset not supported\n",pHba->name);
 760                        return FAILED;
 761                }
 762                printk(KERN_INFO"%s: Device reset failed\n",pHba->name);
 763                return FAILED;
 764        } else {
 765                printk(KERN_INFO"%s: Device reset successful\n",pHba->name);
 766                return SUCCESS;
 767        }
 768}
 769
 770
 771#define I2O_HBA_BUS_RESET 0x87
 772// This version of bus reset is called by the eh_error handler
 773static int adpt_bus_reset(struct scsi_cmnd* cmd)
 774{
 775        adpt_hba* pHba;
 776        u32 msg[4];
 777        u32 rcode;
 778
 779        pHba = (adpt_hba*)cmd->device->host->hostdata[0];
 780        memset(msg, 0, sizeof(msg));
 781        printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n",pHba->name, cmd->device->channel,pHba->channel[cmd->device->channel].tid );
 782        msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
 783        msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid);
 784        msg[2] = 0;
 785        msg[3] = 0;
 786        if (pHba->host)
 787                spin_lock_irq(pHba->host->host_lock);
 788        rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
 789        if (pHba->host)
 790                spin_unlock_irq(pHba->host->host_lock);
 791        if (rcode != 0) {
 792                printk(KERN_WARNING"%s: Bus reset failed.\n",pHba->name);
 793                return FAILED;
 794        } else {
 795                printk(KERN_WARNING"%s: Bus reset success.\n",pHba->name);
 796                return SUCCESS;
 797        }
 798}
 799
 800// This version of reset is called by the eh_error_handler
 801static int __adpt_reset(struct scsi_cmnd* cmd)
 802{
 803        adpt_hba* pHba;
 804        int rcode;
 805        pHba = (adpt_hba*)cmd->device->host->hostdata[0];
 806        printk(KERN_WARNING"%s: Hba Reset: scsi id %d: tid: %d\n",pHba->name,cmd->device->channel,pHba->channel[cmd->device->channel].tid );
 807        rcode =  adpt_hba_reset(pHba);
 808        if(rcode == 0){
 809                printk(KERN_WARNING"%s: HBA reset complete\n",pHba->name);
 810                return SUCCESS;
 811        } else {
 812                printk(KERN_WARNING"%s: HBA reset failed (%x)\n",pHba->name, rcode);
 813                return FAILED;
 814        }
 815}
 816
 817static int adpt_reset(struct scsi_cmnd* cmd)
 818{
 819        int rc;
 820
 821        spin_lock_irq(cmd->device->host->host_lock);
 822        rc = __adpt_reset(cmd);
 823        spin_unlock_irq(cmd->device->host->host_lock);
 824
 825        return rc;
 826}
 827
 828// This version of reset is called by the ioctls and indirectly from eh_error_handler via adpt_reset
 829static int adpt_hba_reset(adpt_hba* pHba)
 830{
 831        int rcode;
 832
 833        pHba->state |= DPTI_STATE_RESET;
 834
 835        // Activate does get status , init outbound, and get hrt
 836        if ((rcode=adpt_i2o_activate_hba(pHba)) < 0) {
 837                printk(KERN_ERR "%s: Could not activate\n", pHba->name);
 838                adpt_i2o_delete_hba(pHba);
 839                return rcode;
 840        }
 841
 842        if ((rcode=adpt_i2o_build_sys_table()) < 0) {
 843                adpt_i2o_delete_hba(pHba);
 844                return rcode;
 845        }
 846        PDEBUG("%s: in HOLD state\n",pHba->name);
 847
 848        if ((rcode=adpt_i2o_online_hba(pHba)) < 0) {
 849                adpt_i2o_delete_hba(pHba);      
 850                return rcode;
 851        }
 852        PDEBUG("%s: in OPERATIONAL state\n",pHba->name);
 853
 854        if ((rcode=adpt_i2o_lct_get(pHba)) < 0){
 855                adpt_i2o_delete_hba(pHba);
 856                return rcode;
 857        }
 858
 859        if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0){
 860                adpt_i2o_delete_hba(pHba);
 861                return rcode;
 862        }
 863        pHba->state &= ~DPTI_STATE_RESET;
 864
 865        adpt_fail_posted_scbs(pHba);
 866        return 0;       /* return success */
 867}
 868
 869/*===========================================================================
 870 * 
 871 *===========================================================================
 872 */
 873
 874
 875static void adpt_i2o_sys_shutdown(void)
 876{
 877        adpt_hba *pHba, *pNext;
 878        struct adpt_i2o_post_wait_data *p1, *old;
 879
 880         printk(KERN_INFO"Shutting down Adaptec I2O controllers.\n");
 881         printk(KERN_INFO"   This could take a few minutes if there are many devices attached\n");
 882        /* Delete all IOPs from the controller chain */
 883        /* They should have already been released by the
 884         * scsi-core
 885         */
 886        for (pHba = hba_chain; pHba; pHba = pNext) {
 887                pNext = pHba->next;
 888                adpt_i2o_delete_hba(pHba);
 889        }
 890
 891        /* Remove any timedout entries from the wait queue.  */
 892//      spin_lock_irqsave(&adpt_post_wait_lock, flags);
 893        /* Nothing should be outstanding at this point so just
 894         * free them 
 895         */
 896        for(p1 = adpt_post_wait_queue; p1;) {
 897                old = p1;
 898                p1 = p1->next;
 899                kfree(old);
 900        }
 901//      spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
 902        adpt_post_wait_queue = NULL;
 903
 904         printk(KERN_INFO "Adaptec I2O controllers down.\n");
 905}
 906
 907static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev)
 908{
 909
 910        adpt_hba* pHba = NULL;
 911        adpt_hba* p = NULL;
 912        ulong base_addr0_phys = 0;
 913        ulong base_addr1_phys = 0;
 914        u32 hba_map0_area_size = 0;
 915        u32 hba_map1_area_size = 0;
 916        void __iomem *base_addr_virt = NULL;
 917        void __iomem *msg_addr_virt = NULL;
 918        int dma64 = 0;
 919
 920        int raptorFlag = FALSE;
 921
 922        if(pci_enable_device(pDev)) {
 923                return -EINVAL;
 924        }
 925
 926        if (pci_request_regions(pDev, "dpt_i2o")) {
 927                PERROR("dpti: adpt_config_hba: pci request region failed\n");
 928                return -EINVAL;
 929        }
 930
 931        pci_set_master(pDev);
 932
 933        /*
 934         *      See if we should enable dma64 mode.
 935         */
 936        if (sizeof(dma_addr_t) > 4 &&
 937            pci_set_dma_mask(pDev, DMA_BIT_MASK(64)) == 0) {
 938                if (dma_get_required_mask(&pDev->dev) > DMA_BIT_MASK(32))
 939                        dma64 = 1;
 940        }
 941        if (!dma64 && pci_set_dma_mask(pDev, DMA_BIT_MASK(32)) != 0)
 942                return -EINVAL;
 943
 944        /* adapter only supports message blocks below 4GB */
 945        pci_set_consistent_dma_mask(pDev, DMA_BIT_MASK(32));
 946
 947        base_addr0_phys = pci_resource_start(pDev,0);
 948        hba_map0_area_size = pci_resource_len(pDev,0);
 949
 950        // Check if standard PCI card or single BAR Raptor
 951        if(pDev->device == PCI_DPT_DEVICE_ID){
 952                if(pDev->subsystem_device >=0xc032 && pDev->subsystem_device <= 0xc03b){
 953                        // Raptor card with this device id needs 4M
 954                        hba_map0_area_size = 0x400000;
 955                } else { // Not Raptor - it is a PCI card
 956                        if(hba_map0_area_size > 0x100000 ){ 
 957                                hba_map0_area_size = 0x100000;
 958                        }
 959                }
 960        } else {// Raptor split BAR config
 961                // Use BAR1 in this configuration
 962                base_addr1_phys = pci_resource_start(pDev,1);
 963                hba_map1_area_size = pci_resource_len(pDev,1);
 964                raptorFlag = TRUE;
 965        }
 966
 967#if BITS_PER_LONG == 64
 968        /*
 969         *      The original Adaptec 64 bit driver has this comment here:
 970         *      "x86_64 machines need more optimal mappings"
 971         *
 972         *      I assume some HBAs report ridiculously large mappings
 973         *      and we need to limit them on platforms with IOMMUs.
 974         */
 975        if (raptorFlag == TRUE) {
 976                if (hba_map0_area_size > 128)
 977                        hba_map0_area_size = 128;
 978                if (hba_map1_area_size > 524288)
 979                        hba_map1_area_size = 524288;
 980        } else {
 981                if (hba_map0_area_size > 524288)
 982                        hba_map0_area_size = 524288;
 983        }
 984#endif
 985
 986        base_addr_virt = ioremap(base_addr0_phys,hba_map0_area_size);
 987        if (!base_addr_virt) {
 988                pci_release_regions(pDev);
 989                PERROR("dpti: adpt_config_hba: io remap failed\n");
 990                return -EINVAL;
 991        }
 992
 993        if(raptorFlag == TRUE) {
 994                msg_addr_virt = ioremap(base_addr1_phys, hba_map1_area_size );
 995                if (!msg_addr_virt) {
 996                        PERROR("dpti: adpt_config_hba: io remap failed on BAR1\n");
 997                        iounmap(base_addr_virt);
 998                        pci_release_regions(pDev);
 999                        return -EINVAL;
1000                }
1001        } else {
1002                msg_addr_virt = base_addr_virt;
1003        }
1004        
1005        // Allocate and zero the data structure
1006        pHba = kzalloc(sizeof(adpt_hba), GFP_KERNEL);
1007        if (!pHba) {
1008                if (msg_addr_virt != base_addr_virt)
1009                        iounmap(msg_addr_virt);
1010                iounmap(base_addr_virt);
1011                pci_release_regions(pDev);
1012                return -ENOMEM;
1013        }
1014
1015        mutex_lock(&adpt_configuration_lock);
1016
1017        if(hba_chain != NULL){
1018                for(p = hba_chain; p->next; p = p->next);
1019                p->next = pHba;
1020        } else {
1021                hba_chain = pHba;
1022        }
1023        pHba->next = NULL;
1024        pHba->unit = hba_count;
1025        sprintf(pHba->name, "dpti%d", hba_count);
1026        hba_count++;
1027        
1028        mutex_unlock(&adpt_configuration_lock);
1029
1030        pHba->pDev = pDev;
1031        pHba->base_addr_phys = base_addr0_phys;
1032
1033        // Set up the Virtual Base Address of the I2O Device
1034        pHba->base_addr_virt = base_addr_virt;
1035        pHba->msg_addr_virt = msg_addr_virt;
1036        pHba->irq_mask = base_addr_virt+0x30;
1037        pHba->post_port = base_addr_virt+0x40;
1038        pHba->reply_port = base_addr_virt+0x44;
1039
1040        pHba->hrt = NULL;
1041        pHba->lct = NULL;
1042        pHba->lct_size = 0;
1043        pHba->status_block = NULL;
1044        pHba->post_count = 0;
1045        pHba->state = DPTI_STATE_RESET;
1046        pHba->pDev = pDev;
1047        pHba->devices = NULL;
1048        pHba->dma64 = dma64;
1049
1050        // Initializing the spinlocks
1051        spin_lock_init(&pHba->state_lock);
1052        spin_lock_init(&adpt_post_wait_lock);
1053
1054        if(raptorFlag == 0){
1055                printk(KERN_INFO "Adaptec I2O RAID controller"
1056                                 " %d at %p size=%x irq=%d%s\n", 
1057                        hba_count-1, base_addr_virt,
1058                        hba_map0_area_size, pDev->irq,
1059                        dma64 ? " (64-bit DMA)" : "");
1060        } else {
1061                printk(KERN_INFO"Adaptec I2O RAID controller %d irq=%d%s\n",
1062                        hba_count-1, pDev->irq,
1063                        dma64 ? " (64-bit DMA)" : "");
1064                printk(KERN_INFO"     BAR0 %p - size= %x\n",base_addr_virt,hba_map0_area_size);
1065                printk(KERN_INFO"     BAR1 %p - size= %x\n",msg_addr_virt,hba_map1_area_size);
1066        }
1067
1068        if (request_irq (pDev->irq, adpt_isr, IRQF_SHARED, pHba->name, pHba)) {
1069                printk(KERN_ERR"%s: Couldn't register IRQ %d\n", pHba->name, pDev->irq);
1070                adpt_i2o_delete_hba(pHba);
1071                return -EINVAL;
1072        }
1073
1074        return 0;
1075}
1076
1077
1078static void adpt_i2o_delete_hba(adpt_hba* pHba)
1079{
1080        adpt_hba* p1;
1081        adpt_hba* p2;
1082        struct i2o_device* d;
1083        struct i2o_device* next;
1084        int i;
1085        int j;
1086        struct adpt_device* pDev;
1087        struct adpt_device* pNext;
1088
1089
1090        mutex_lock(&adpt_configuration_lock);
1091        // scsi_unregister calls our adpt_release which
1092        // does a quiese
1093        if(pHba->host){
1094                free_irq(pHba->host->irq, pHba);
1095        }
1096        p2 = NULL;
1097        for( p1 = hba_chain; p1; p2 = p1,p1=p1->next){
1098                if(p1 == pHba) {
1099                        if(p2) {
1100                                p2->next = p1->next;
1101                        } else {
1102                                hba_chain = p1->next;
1103                        }
1104                        break;
1105                }
1106        }
1107
1108        hba_count--;
1109        mutex_unlock(&adpt_configuration_lock);
1110
1111        iounmap(pHba->base_addr_virt);
1112        pci_release_regions(pHba->pDev);
1113        if(pHba->msg_addr_virt != pHba->base_addr_virt){
1114                iounmap(pHba->msg_addr_virt);
1115        }
1116        if(pHba->FwDebugBuffer_P)
1117                iounmap(pHba->FwDebugBuffer_P);
1118        if(pHba->hrt) {
1119                dma_free_coherent(&pHba->pDev->dev,
1120                        pHba->hrt->num_entries * pHba->hrt->entry_len << 2,
1121                        pHba->hrt, pHba->hrt_pa);
1122        }
1123        if(pHba->lct) {
1124                dma_free_coherent(&pHba->pDev->dev, pHba->lct_size,
1125                        pHba->lct, pHba->lct_pa);
1126        }
1127        if(pHba->status_block) {
1128                dma_free_coherent(&pHba->pDev->dev, sizeof(i2o_status_block),
1129                        pHba->status_block, pHba->status_block_pa);
1130        }
1131        if(pHba->reply_pool) {
1132                dma_free_coherent(&pHba->pDev->dev,
1133                        pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4,
1134                        pHba->reply_pool, pHba->reply_pool_pa);
1135        }
1136
1137        for(d = pHba->devices; d ; d = next){
1138                next = d->next;
1139                kfree(d);
1140        }
1141        for(i = 0 ; i < pHba->top_scsi_channel ; i++){
1142                for(j = 0; j < MAX_ID; j++){
1143                        if(pHba->channel[i].device[j] != NULL){
1144                                for(pDev = pHba->channel[i].device[j]; pDev; pDev = pNext){
1145                                        pNext = pDev->next_lun;
1146                                        kfree(pDev);
1147                                }
1148                        }
1149                }
1150        }
1151        pci_dev_put(pHba->pDev);
1152        if (adpt_sysfs_class)
1153                device_destroy(adpt_sysfs_class,
1154                                MKDEV(DPTI_I2O_MAJOR, pHba->unit));
1155        kfree(pHba);
1156
1157        if(hba_count <= 0){
1158                unregister_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER);   
1159                if (adpt_sysfs_class) {
1160                        class_destroy(adpt_sysfs_class);
1161                        adpt_sysfs_class = NULL;
1162                }
1163        }
1164}
1165
1166static struct adpt_device* adpt_find_device(adpt_hba* pHba, u32 chan, u32 id, u64 lun)
1167{
1168        struct adpt_device* d;
1169
1170        if(chan < 0 || chan >= MAX_CHANNEL)
1171                return NULL;
1172        
1173        if( pHba->channel[chan].device == NULL){
1174                printk(KERN_DEBUG"Adaptec I2O RAID: Trying to find device before they are allocated\n");
1175                return NULL;
1176        }
1177
1178        d = pHba->channel[chan].device[id];
1179        if(!d || d->tid == 0) {
1180                return NULL;
1181        }
1182
1183        /* If it is the only lun at that address then this should match*/
1184        if(d->scsi_lun == lun){
1185                return d;
1186        }
1187
1188        /* else we need to look through all the luns */
1189        for(d=d->next_lun ; d ; d = d->next_lun){
1190                if(d->scsi_lun == lun){
1191                        return d;
1192                }
1193        }
1194        return NULL;
1195}
1196
1197
1198static int adpt_i2o_post_wait(adpt_hba* pHba, u32* msg, int len, int timeout)
1199{
1200        // I used my own version of the WAIT_QUEUE_HEAD
1201        // to handle some version differences
1202        // When embedded in the kernel this could go back to the vanilla one
1203        ADPT_DECLARE_WAIT_QUEUE_HEAD(adpt_wq_i2o_post);
1204        int status = 0;
1205        ulong flags = 0;
1206        struct adpt_i2o_post_wait_data *p1, *p2;
1207        struct adpt_i2o_post_wait_data *wait_data =
1208                kmalloc(sizeof(struct adpt_i2o_post_wait_data), GFP_ATOMIC);
1209        DECLARE_WAITQUEUE(wait, current);
1210
1211        if (!wait_data)
1212                return -ENOMEM;
1213
1214        /*
1215         * The spin locking is needed to keep anyone from playing
1216         * with the queue pointers and id while we do the same
1217         */
1218        spin_lock_irqsave(&adpt_post_wait_lock, flags);
1219       // TODO we need a MORE unique way of getting ids
1220       // to support async LCT get
1221        wait_data->next = adpt_post_wait_queue;
1222        adpt_post_wait_queue = wait_data;
1223        adpt_post_wait_id++;
1224        adpt_post_wait_id &= 0x7fff;
1225        wait_data->id =  adpt_post_wait_id;
1226        spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
1227
1228        wait_data->wq = &adpt_wq_i2o_post;
1229        wait_data->status = -ETIMEDOUT;
1230
1231        add_wait_queue(&adpt_wq_i2o_post, &wait);
1232
1233        msg[2] |= 0x80000000 | ((u32)wait_data->id);
1234        timeout *= HZ;
1235        if((status = adpt_i2o_post_this(pHba, msg, len)) == 0){
1236                set_current_state(TASK_INTERRUPTIBLE);
1237                if(pHba->host)
1238                        spin_unlock_irq(pHba->host->host_lock);
1239                if (!timeout)
1240                        schedule();
1241                else{
1242                        timeout = schedule_timeout(timeout);
1243                        if (timeout == 0) {
1244                                // I/O issued, but cannot get result in
1245                                // specified time. Freeing resorces is
1246                                // dangerous.
1247                                status = -ETIME;
1248                        }
1249                }
1250                if(pHba->host)
1251                        spin_lock_irq(pHba->host->host_lock);
1252        }
1253        remove_wait_queue(&adpt_wq_i2o_post, &wait);
1254
1255        if(status == -ETIMEDOUT){
1256                printk(KERN_INFO"dpti%d: POST WAIT TIMEOUT\n",pHba->unit);
1257                // We will have to free the wait_data memory during shutdown
1258                return status;
1259        }
1260
1261        /* Remove the entry from the queue.  */
1262        p2 = NULL;
1263        spin_lock_irqsave(&adpt_post_wait_lock, flags);
1264        for(p1 = adpt_post_wait_queue; p1; p2 = p1, p1 = p1->next) {
1265                if(p1 == wait_data) {
1266                        if(p1->status == I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION ) {
1267                                status = -EOPNOTSUPP;
1268                        }
1269                        if(p2) {
1270                                p2->next = p1->next;
1271                        } else {
1272                                adpt_post_wait_queue = p1->next;
1273                        }
1274                        break;
1275                }
1276        }
1277        spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
1278
1279        kfree(wait_data);
1280
1281        return status;
1282}
1283
1284
1285static s32 adpt_i2o_post_this(adpt_hba* pHba, u32* data, int len)
1286{
1287
1288        u32 m = EMPTY_QUEUE;
1289        u32 __iomem *msg;
1290        ulong timeout = jiffies + 30*HZ;
1291        do {
1292                rmb();
1293                m = readl(pHba->post_port);
1294                if (m != EMPTY_QUEUE) {
1295                        break;
1296                }
1297                if(time_after(jiffies,timeout)){
1298                        printk(KERN_WARNING"dpti%d: Timeout waiting for message frame!\n", pHba->unit);
1299                        return -ETIMEDOUT;
1300                }
1301                schedule_timeout_uninterruptible(1);
1302        } while(m == EMPTY_QUEUE);
1303                
1304        msg = pHba->msg_addr_virt + m;
1305        memcpy_toio(msg, data, len);
1306        wmb();
1307
1308        //post message
1309        writel(m, pHba->post_port);
1310        wmb();
1311
1312        return 0;
1313}
1314
1315
1316static void adpt_i2o_post_wait_complete(u32 context, int status)
1317{
1318        struct adpt_i2o_post_wait_data *p1 = NULL;
1319        /*
1320         * We need to search through the adpt_post_wait
1321         * queue to see if the given message is still
1322         * outstanding.  If not, it means that the IOP
1323         * took longer to respond to the message than we
1324         * had allowed and timer has already expired.
1325         * Not much we can do about that except log
1326         * it for debug purposes, increase timeout, and recompile
1327         *
1328         * Lock needed to keep anyone from moving queue pointers
1329         * around while we're looking through them.
1330         */
1331
1332        context &= 0x7fff;
1333
1334        spin_lock(&adpt_post_wait_lock);
1335        for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
1336                if(p1->id == context) {
1337                        p1->status = status;
1338                        spin_unlock(&adpt_post_wait_lock);
1339                        wake_up_interruptible(p1->wq);
1340                        return;
1341                }
1342        }
1343        spin_unlock(&adpt_post_wait_lock);
1344        // If this happens we lose commands that probably really completed
1345        printk(KERN_DEBUG"dpti: Could Not find task %d in wait queue\n",context);
1346        printk(KERN_DEBUG"      Tasks in wait queue:\n");
1347        for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
1348                printk(KERN_DEBUG"           %d\n",p1->id);
1349        }
1350        return;
1351}
1352
1353static s32 adpt_i2o_reset_hba(adpt_hba* pHba)                   
1354{
1355        u32 msg[8];
1356        u8* status;
1357        dma_addr_t addr;
1358        u32 m = EMPTY_QUEUE ;
1359        ulong timeout = jiffies + (TMOUT_IOPRESET*HZ);
1360
1361        if(pHba->initialized  == FALSE) {       // First time reset should be quick
1362                timeout = jiffies + (25*HZ);
1363        } else {
1364                adpt_i2o_quiesce_hba(pHba);
1365        }
1366
1367        do {
1368                rmb();
1369                m = readl(pHba->post_port);
1370                if (m != EMPTY_QUEUE) {
1371                        break;
1372                }
1373                if(time_after(jiffies,timeout)){
1374                        printk(KERN_WARNING"Timeout waiting for message!\n");
1375                        return -ETIMEDOUT;
1376                }
1377                schedule_timeout_uninterruptible(1);
1378        } while (m == EMPTY_QUEUE);
1379
1380        status = dma_alloc_coherent(&pHba->pDev->dev, 4, &addr, GFP_KERNEL);
1381        if(status == NULL) {
1382                adpt_send_nop(pHba, m);
1383                printk(KERN_ERR"IOP reset failed - no free memory.\n");
1384                return -ENOMEM;
1385        }
1386        memset(status,0,4);
1387
1388        msg[0]=EIGHT_WORD_MSG_SIZE|SGL_OFFSET_0;
1389        msg[1]=I2O_CMD_ADAPTER_RESET<<24|HOST_TID<<12|ADAPTER_TID;
1390        msg[2]=0;
1391        msg[3]=0;
1392        msg[4]=0;
1393        msg[5]=0;
1394        msg[6]=dma_low(addr);
1395        msg[7]=dma_high(addr);
1396
1397        memcpy_toio(pHba->msg_addr_virt+m, msg, sizeof(msg));
1398        wmb();
1399        writel(m, pHba->post_port);
1400        wmb();
1401
1402        while(*status == 0){
1403                if(time_after(jiffies,timeout)){
1404                        printk(KERN_WARNING"%s: IOP Reset Timeout\n",pHba->name);
1405                        /* We lose 4 bytes of "status" here, but we cannot
1406                           free these because controller may awake and corrupt
1407                           those bytes at any time */
1408                        /* dma_free_coherent(&pHba->pDev->dev, 4, buf, addr); */
1409                        return -ETIMEDOUT;
1410                }
1411                rmb();
1412                schedule_timeout_uninterruptible(1);
1413        }
1414
1415        if(*status == 0x01 /*I2O_EXEC_IOP_RESET_IN_PROGRESS*/) {
1416                PDEBUG("%s: Reset in progress...\n", pHba->name);
1417                // Here we wait for message frame to become available
1418                // indicated that reset has finished
1419                do {
1420                        rmb();
1421                        m = readl(pHba->post_port);
1422                        if (m != EMPTY_QUEUE) {
1423                                break;
1424                        }
1425                        if(time_after(jiffies,timeout)){
1426                                printk(KERN_ERR "%s:Timeout waiting for IOP Reset.\n",pHba->name);
1427                                /* We lose 4 bytes of "status" here, but we
1428                                   cannot free these because controller may
1429                                   awake and corrupt those bytes at any time */
1430                                /* dma_free_coherent(&pHba->pDev->dev, 4, buf, addr); */
1431                                return -ETIMEDOUT;
1432                        }
1433                        schedule_timeout_uninterruptible(1);
1434                } while (m == EMPTY_QUEUE);
1435                // Flush the offset
1436                adpt_send_nop(pHba, m);
1437        }
1438        adpt_i2o_status_get(pHba);
1439        if(*status == 0x02 ||
1440                        pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
1441                printk(KERN_WARNING"%s: Reset reject, trying to clear\n",
1442                                pHba->name);
1443        } else {
1444                PDEBUG("%s: Reset completed.\n", pHba->name);
1445        }
1446
1447        dma_free_coherent(&pHba->pDev->dev, 4, status, addr);
1448#ifdef UARTDELAY
1449        // This delay is to allow someone attached to the card through the debug UART to 
1450        // set up the dump levels that they want before the rest of the initialization sequence
1451        adpt_delay(20000);
1452#endif
1453        return 0;
1454}
1455
1456
1457static int adpt_i2o_parse_lct(adpt_hba* pHba)
1458{
1459        int i;
1460        int max;
1461        int tid;
1462        struct i2o_device *d;
1463        i2o_lct *lct = pHba->lct;
1464        u8 bus_no = 0;
1465        s16 scsi_id;
1466        u64 scsi_lun;
1467        u32 buf[10]; // larger than 7, or 8 ...
1468        struct adpt_device* pDev; 
1469        
1470        if (lct == NULL) {
1471                printk(KERN_ERR "%s: LCT is empty???\n",pHba->name);
1472                return -1;
1473        }
1474        
1475        max = lct->table_size;  
1476        max -= 3;
1477        max /= 9;
1478
1479        for(i=0;i<max;i++) {
1480                if( lct->lct_entry[i].user_tid != 0xfff){
1481                        /*
1482                         * If we have hidden devices, we need to inform the upper layers about
1483                         * the possible maximum id reference to handle device access when
1484                         * an array is disassembled. This code has no other purpose but to
1485                         * allow us future access to devices that are currently hidden
1486                         * behind arrays, hotspares or have not been configured (JBOD mode).
1487                         */
1488                        if( lct->lct_entry[i].class_id != I2O_CLASS_RANDOM_BLOCK_STORAGE &&
1489                            lct->lct_entry[i].class_id != I2O_CLASS_SCSI_PERIPHERAL &&
1490                            lct->lct_entry[i].class_id != I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
1491                                continue;
1492                        }
1493                        tid = lct->lct_entry[i].tid;
1494                        // I2O_DPT_DEVICE_INFO_GROUP_NO;
1495                        if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
1496                                continue;
1497                        }
1498                        bus_no = buf[0]>>16;
1499                        scsi_id = buf[1];
1500                        scsi_lun = scsilun_to_int((struct scsi_lun *)&buf[2]);
1501                        if(bus_no >= MAX_CHANNEL) {     // Something wrong skip it
1502                                printk(KERN_WARNING"%s: Channel number %d out of range \n", pHba->name, bus_no);
1503                                continue;
1504                        }
1505                        if (scsi_id >= MAX_ID){
1506                                printk(KERN_WARNING"%s: SCSI ID %d out of range \n", pHba->name, bus_no);
1507                                continue;
1508                        }
1509                        if(bus_no > pHba->top_scsi_channel){
1510                                pHba->top_scsi_channel = bus_no;
1511                        }
1512                        if(scsi_id > pHba->top_scsi_id){
1513                                pHba->top_scsi_id = scsi_id;
1514                        }
1515                        if(scsi_lun > pHba->top_scsi_lun){
1516                                pHba->top_scsi_lun = scsi_lun;
1517                        }
1518                        continue;
1519                }
1520                d = kmalloc(sizeof(struct i2o_device), GFP_KERNEL);
1521                if(d==NULL)
1522                {
1523                        printk(KERN_CRIT"%s: Out of memory for I2O device data.\n",pHba->name);
1524                        return -ENOMEM;
1525                }
1526                
1527                d->controller = pHba;
1528                d->next = NULL;
1529
1530                memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
1531
1532                d->flags = 0;
1533                tid = d->lct_data.tid;
1534                adpt_i2o_report_hba_unit(pHba, d);
1535                adpt_i2o_install_device(pHba, d);
1536        }
1537        bus_no = 0;
1538        for(d = pHba->devices; d ; d = d->next) {
1539                if(d->lct_data.class_id  == I2O_CLASS_BUS_ADAPTER_PORT ||
1540                   d->lct_data.class_id  == I2O_CLASS_FIBRE_CHANNEL_PORT){
1541                        tid = d->lct_data.tid;
1542                        // TODO get the bus_no from hrt-but for now they are in order
1543                        //bus_no = 
1544                        if(bus_no > pHba->top_scsi_channel){
1545                                pHba->top_scsi_channel = bus_no;
1546                        }
1547                        pHba->channel[bus_no].type = d->lct_data.class_id;
1548                        pHba->channel[bus_no].tid = tid;
1549                        if(adpt_i2o_query_scalar(pHba, tid, 0x0200, -1, buf, 28)>=0)
1550                        {
1551                                pHba->channel[bus_no].scsi_id = buf[1];
1552                                PDEBUG("Bus %d - SCSI ID %d.\n", bus_no, buf[1]);
1553                        }
1554                        // TODO remove - this is just until we get from hrt
1555                        bus_no++;
1556                        if(bus_no >= MAX_CHANNEL) {     // Something wrong skip it
1557                                printk(KERN_WARNING"%s: Channel number %d out of range - LCT\n", pHba->name, bus_no);
1558                                break;
1559                        }
1560                }
1561        }
1562
1563        // Setup adpt_device table
1564        for(d = pHba->devices; d ; d = d->next) {
1565                if(d->lct_data.class_id  == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
1566                   d->lct_data.class_id  == I2O_CLASS_SCSI_PERIPHERAL ||
1567                   d->lct_data.class_id  == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
1568
1569                        tid = d->lct_data.tid;
1570                        scsi_id = -1;
1571                        // I2O_DPT_DEVICE_INFO_GROUP_NO;
1572                        if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)>=0) {
1573                                bus_no = buf[0]>>16;
1574                                scsi_id = buf[1];
1575                                scsi_lun = scsilun_to_int((struct scsi_lun *)&buf[2]);
1576                                if(bus_no >= MAX_CHANNEL) {     // Something wrong skip it
1577                                        continue;
1578                                }
1579                                if (scsi_id >= MAX_ID) {
1580                                        continue;
1581                                }
1582                                if( pHba->channel[bus_no].device[scsi_id] == NULL){
1583                                        pDev =  kzalloc(sizeof(struct adpt_device),GFP_KERNEL);
1584                                        if(pDev == NULL) {
1585                                                return -ENOMEM;
1586                                        }
1587                                        pHba->channel[bus_no].device[scsi_id] = pDev;
1588                                } else {
1589                                        for( pDev = pHba->channel[bus_no].device[scsi_id];      
1590                                                        pDev->next_lun; pDev = pDev->next_lun){
1591                                        }
1592                                        pDev->next_lun = kzalloc(sizeof(struct adpt_device),GFP_KERNEL);
1593                                        if(pDev->next_lun == NULL) {
1594                                                return -ENOMEM;
1595                                        }
1596                                        pDev = pDev->next_lun;
1597                                }
1598                                pDev->tid = tid;
1599                                pDev->scsi_channel = bus_no;
1600                                pDev->scsi_id = scsi_id;
1601                                pDev->scsi_lun = scsi_lun;
1602                                pDev->pI2o_dev = d;
1603                                d->owner = pDev;
1604                                pDev->type = (buf[0])&0xff;
1605                                pDev->flags = (buf[0]>>8)&0xff;
1606                                if(scsi_id > pHba->top_scsi_id){
1607                                        pHba->top_scsi_id = scsi_id;
1608                                }
1609                                if(scsi_lun > pHba->top_scsi_lun){
1610                                        pHba->top_scsi_lun = scsi_lun;
1611                                }
1612                        }
1613                        if(scsi_id == -1){
1614                                printk(KERN_WARNING"Could not find SCSI ID for %s\n",
1615                                                d->lct_data.identity_tag);
1616                        }
1617                }
1618        }
1619        return 0;
1620}
1621
1622
1623/*
1624 *      Each I2O controller has a chain of devices on it - these match
1625 *      the useful parts of the LCT of the board.
1626 */
1627 
1628static int adpt_i2o_install_device(adpt_hba* pHba, struct i2o_device *d)
1629{
1630        mutex_lock(&adpt_configuration_lock);
1631        d->controller=pHba;
1632        d->owner=NULL;
1633        d->next=pHba->devices;
1634        d->prev=NULL;
1635        if (pHba->devices != NULL){
1636                pHba->devices->prev=d;
1637        }
1638        pHba->devices=d;
1639        *d->dev_name = 0;
1640
1641        mutex_unlock(&adpt_configuration_lock);
1642        return 0;
1643}
1644
1645static int adpt_open(struct inode *inode, struct file *file)
1646{
1647        int minor;
1648        adpt_hba* pHba;
1649
1650        mutex_lock(&adpt_mutex);
1651        //TODO check for root access
1652        //
1653        minor = iminor(inode);
1654        if (minor >= hba_count) {
1655                mutex_unlock(&adpt_mutex);
1656                return -ENXIO;
1657        }
1658        mutex_lock(&adpt_configuration_lock);
1659        for (pHba = hba_chain; pHba; pHba = pHba->next) {
1660                if (pHba->unit == minor) {
1661                        break;  /* found adapter */
1662                }
1663        }
1664        if (pHba == NULL) {
1665                mutex_unlock(&adpt_configuration_lock);
1666                mutex_unlock(&adpt_mutex);
1667                return -ENXIO;
1668        }
1669
1670//      if(pHba->in_use){
1671        //      mutex_unlock(&adpt_configuration_lock);
1672//              return -EBUSY;
1673//      }
1674
1675        pHba->in_use = 1;
1676        mutex_unlock(&adpt_configuration_lock);
1677        mutex_unlock(&adpt_mutex);
1678
1679        return 0;
1680}
1681
1682static int adpt_close(struct inode *inode, struct file *file)
1683{
1684        int minor;
1685        adpt_hba* pHba;
1686
1687        minor = iminor(inode);
1688        if (minor >= hba_count) {
1689                return -ENXIO;
1690        }
1691        mutex_lock(&adpt_configuration_lock);
1692        for (pHba = hba_chain; pHba; pHba = pHba->next) {
1693                if (pHba->unit == minor) {
1694                        break;  /* found adapter */
1695                }
1696        }
1697        mutex_unlock(&adpt_configuration_lock);
1698        if (pHba == NULL) {
1699                return -ENXIO;
1700        }
1701
1702        pHba->in_use = 0;
1703
1704        return 0;
1705}
1706
1707
1708static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg)
1709{
1710        u32 msg[MAX_MESSAGE_SIZE];
1711        u32* reply = NULL;
1712        u32 size = 0;
1713        u32 reply_size = 0;
1714        u32 __user *user_msg = arg;
1715        u32 __user * user_reply = NULL;
1716        void *sg_list[pHba->sg_tablesize];
1717        u32 sg_offset = 0;
1718        u32 sg_count = 0;
1719        int sg_index = 0;
1720        u32 i = 0;
1721        u32 rcode = 0;
1722        void *p = NULL;
1723        dma_addr_t addr;
1724        ulong flags = 0;
1725
1726        memset(&msg, 0, MAX_MESSAGE_SIZE*4);
1727        // get user msg size in u32s 
1728        if(get_user(size, &user_msg[0])){
1729                return -EFAULT;
1730        }
1731        size = size>>16;
1732
1733        user_reply = &user_msg[size];
1734        if(size > MAX_MESSAGE_SIZE){
1735                return -EFAULT;
1736        }
1737        size *= 4; // Convert to bytes
1738
1739        /* Copy in the user's I2O command */
1740        if(copy_from_user(msg, user_msg, size)) {
1741                return -EFAULT;
1742        }
1743        get_user(reply_size, &user_reply[0]);
1744        reply_size = reply_size>>16;
1745        if(reply_size > REPLY_FRAME_SIZE){
1746                reply_size = REPLY_FRAME_SIZE;
1747        }
1748        reply_size *= 4;
1749        reply = kzalloc(REPLY_FRAME_SIZE*4, GFP_KERNEL);
1750        if(reply == NULL) {
1751                printk(KERN_WARNING"%s: Could not allocate reply buffer\n",pHba->name);
1752                return -ENOMEM;
1753        }
1754        sg_offset = (msg[0]>>4)&0xf;
1755        msg[2] = 0x40000000; // IOCTL context
1756        msg[3] = adpt_ioctl_to_context(pHba, reply);
1757        if (msg[3] == (u32)-1)
1758                return -EBUSY;
1759
1760        memset(sg_list,0, sizeof(sg_list[0])*pHba->sg_tablesize);
1761        if(sg_offset) {
1762                // TODO add 64 bit API
1763                struct sg_simple_element *sg =  (struct sg_simple_element*) (msg+sg_offset);
1764                sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
1765                if (sg_count > pHba->sg_tablesize){
1766                        printk(KERN_DEBUG"%s:IOCTL SG List too large (%u)\n", pHba->name,sg_count);
1767                        kfree (reply);
1768                        return -EINVAL;
1769                }
1770
1771                for(i = 0; i < sg_count; i++) {
1772                        int sg_size;
1773
1774                        if (!(sg[i].flag_count & 0x10000000 /*I2O_SGL_FLAGS_SIMPLE_ADDRESS_ELEMENT*/)) {
1775                                printk(KERN_DEBUG"%s:Bad SG element %d - not simple (%x)\n",pHba->name,i,  sg[i].flag_count);
1776                                rcode = -EINVAL;
1777                                goto cleanup;
1778                        }
1779                        sg_size = sg[i].flag_count & 0xffffff;      
1780                        /* Allocate memory for the transfer */
1781                        p = dma_alloc_coherent(&pHba->pDev->dev, sg_size, &addr, GFP_KERNEL);
1782                        if(!p) {
1783                                printk(KERN_DEBUG"%s: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
1784                                                pHba->name,sg_size,i,sg_count);
1785                                rcode = -ENOMEM;
1786                                goto cleanup;
1787                        }
1788                        sg_list[sg_index++] = p; // sglist indexed with input frame, not our internal frame.
1789                        /* Copy in the user's SG buffer if necessary */
1790                        if(sg[i].flag_count & 0x04000000 /*I2O_SGL_FLAGS_DIR*/) {
1791                                // sg_simple_element API is 32 bit
1792                                if (copy_from_user(p,(void __user *)(ulong)sg[i].addr_bus, sg_size)) {
1793                                        printk(KERN_DEBUG"%s: Could not copy SG buf %d FROM user\n",pHba->name,i);
1794                                        rcode = -EFAULT;
1795                                        goto cleanup;
1796                                }
1797                        }
1798                        /* sg_simple_element API is 32 bit, but addr < 4GB */
1799                        sg[i].addr_bus = addr;
1800                }
1801        }
1802
1803        do {
1804                /*
1805                 * Stop any new commands from enterring the
1806                 * controller while processing the ioctl
1807                 */
1808                if (pHba->host) {
1809                        scsi_block_requests(pHba->host);
1810                        spin_lock_irqsave(pHba->host->host_lock, flags);
1811                }
1812                rcode = adpt_i2o_post_wait(pHba, msg, size, FOREVER);
1813                if (rcode != 0)
1814                        printk("adpt_i2o_passthru: post wait failed %d %p\n",
1815                                        rcode, reply);
1816                if (pHba->host) {
1817                        spin_unlock_irqrestore(pHba->host->host_lock, flags);
1818                        scsi_unblock_requests(pHba->host);
1819                }
1820        } while (rcode == -ETIMEDOUT);
1821
1822        if(rcode){
1823                goto cleanup;
1824        }
1825
1826        if(sg_offset) {
1827        /* Copy back the Scatter Gather buffers back to user space */
1828                u32 j;
1829                // TODO add 64 bit API
1830                struct sg_simple_element* sg;
1831                int sg_size;
1832
1833                // re-acquire the original message to handle correctly the sg copy operation
1834                memset(&msg, 0, MAX_MESSAGE_SIZE*4); 
1835                // get user msg size in u32s 
1836                if(get_user(size, &user_msg[0])){
1837                        rcode = -EFAULT; 
1838                        goto cleanup; 
1839                }
1840                size = size>>16;
1841                size *= 4;
1842                if (size > MAX_MESSAGE_SIZE) {
1843                        rcode = -EINVAL;
1844                        goto cleanup;
1845                }
1846                /* Copy in the user's I2O command */
1847                if (copy_from_user (msg, user_msg, size)) {
1848                        rcode = -EFAULT;
1849                        goto cleanup;
1850                }
1851                sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
1852
1853                // TODO add 64 bit API
1854                sg       = (struct sg_simple_element*)(msg + sg_offset);
1855                for (j = 0; j < sg_count; j++) {
1856                        /* Copy out the SG list to user's buffer if necessary */
1857                        if(! (sg[j].flag_count & 0x4000000 /*I2O_SGL_FLAGS_DIR*/)) {
1858                                sg_size = sg[j].flag_count & 0xffffff; 
1859                                // sg_simple_element API is 32 bit
1860                                if (copy_to_user((void __user *)(ulong)sg[j].addr_bus,sg_list[j], sg_size)) {
1861                                        printk(KERN_WARNING"%s: Could not copy %p TO user %x\n",pHba->name, sg_list[j], sg[j].addr_bus);
1862                                        rcode = -EFAULT;
1863                                        goto cleanup;
1864                                }
1865                        }
1866                }
1867        } 
1868
1869        /* Copy back the reply to user space */
1870        if (reply_size) {
1871                // we wrote our own values for context - now restore the user supplied ones
1872                if(copy_from_user(reply+2, user_msg+2, sizeof(u32)*2)) {
1873                        printk(KERN_WARNING"%s: Could not copy message context FROM user\n",pHba->name);
1874                        rcode = -EFAULT;
1875                }
1876                if(copy_to_user(user_reply, reply, reply_size)) {
1877                        printk(KERN_WARNING"%s: Could not copy reply TO user\n",pHba->name);
1878                        rcode = -EFAULT;
1879                }
1880        }
1881
1882
1883cleanup:
1884        if (rcode != -ETIME && rcode != -EINTR) {
1885                struct sg_simple_element *sg =
1886                                (struct sg_simple_element*) (msg +sg_offset);
1887                kfree (reply);
1888                while(sg_index) {
1889                        if(sg_list[--sg_index]) {
1890                                dma_free_coherent(&pHba->pDev->dev,
1891                                        sg[sg_index].flag_count & 0xffffff,
1892                                        sg_list[sg_index],
1893                                        sg[sg_index].addr_bus);
1894                        }
1895                }
1896        }
1897        return rcode;
1898}
1899
1900#if defined __ia64__ 
1901static void adpt_ia64_info(sysInfo_S* si)
1902{
1903        // This is all the info we need for now
1904        // We will add more info as our new
1905        // managmenent utility requires it
1906        si->processorType = PROC_IA64;
1907}
1908#endif
1909
1910#if defined __sparc__ 
1911static void adpt_sparc_info(sysInfo_S* si)
1912{
1913        // This is all the info we need for now
1914        // We will add more info as our new
1915        // managmenent utility requires it
1916        si->processorType = PROC_ULTRASPARC;
1917}
1918#endif
1919#if defined __alpha__ 
1920static void adpt_alpha_info(sysInfo_S* si)
1921{
1922        // This is all the info we need for now
1923        // We will add more info as our new
1924        // managmenent utility requires it
1925        si->processorType = PROC_ALPHA;
1926}
1927#endif
1928
1929#if defined __i386__
1930
1931#include <uapi/asm/vm86.h>
1932
1933static void adpt_i386_info(sysInfo_S* si)
1934{
1935        // This is all the info we need for now
1936        // We will add more info as our new
1937        // managmenent utility requires it
1938        switch (boot_cpu_data.x86) {
1939        case CPU_386:
1940                si->processorType = PROC_386;
1941                break;
1942        case CPU_486:
1943                si->processorType = PROC_486;
1944                break;
1945        case CPU_586:
1946                si->processorType = PROC_PENTIUM;
1947                break;
1948        default:  // Just in case 
1949                si->processorType = PROC_PENTIUM;
1950                break;
1951        }
1952}
1953#endif
1954
1955/*
1956 * This routine returns information about the system.  This does not effect
1957 * any logic and if the info is wrong - it doesn't matter.
1958 */
1959
1960/* Get all the info we can not get from kernel services */
1961static int adpt_system_info(void __user *buffer)
1962{
1963        sysInfo_S si;
1964
1965        memset(&si, 0, sizeof(si));
1966
1967        si.osType = OS_LINUX;
1968        si.osMajorVersion = 0;
1969        si.osMinorVersion = 0;
1970        si.osRevision = 0;
1971        si.busType = SI_PCI_BUS;
1972        si.processorFamily = DPTI_sig.dsProcessorFamily;
1973
1974#if defined __i386__
1975        adpt_i386_info(&si);
1976#elif defined (__ia64__)
1977        adpt_ia64_info(&si);
1978#elif defined(__sparc__)
1979        adpt_sparc_info(&si);
1980#elif defined (__alpha__)
1981        adpt_alpha_info(&si);
1982#else
1983        si.processorType = 0xff ;
1984#endif
1985        if (copy_to_user(buffer, &si, sizeof(si))){
1986                printk(KERN_WARNING"dpti: Could not copy buffer TO user\n");
1987                return -EFAULT;
1988        }
1989
1990        return 0;
1991}
1992
1993static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
1994{
1995        int minor;
1996        int error = 0;
1997        adpt_hba* pHba;
1998        ulong flags = 0;
1999        void __user *argp = (void __user *)arg;
2000
2001        minor = iminor(inode);
2002        if (minor >= DPTI_MAX_HBA){
2003                return -ENXIO;
2004        }
2005        mutex_lock(&adpt_configuration_lock);
2006        for (pHba = hba_chain; pHba; pHba = pHba->next) {
2007                if (pHba->unit == minor) {
2008                        break;  /* found adapter */
2009                }
2010        }
2011        mutex_unlock(&adpt_configuration_lock);
2012        if(pHba == NULL){
2013                return -ENXIO;
2014        }
2015
2016        while((volatile u32) pHba->state & DPTI_STATE_RESET )
2017                schedule_timeout_uninterruptible(2);
2018
2019        switch (cmd) {
2020        // TODO: handle 3 cases
2021        case DPT_SIGNATURE:
2022                if (copy_to_user(argp, &DPTI_sig, sizeof(DPTI_sig))) {
2023                        return -EFAULT;
2024                }
2025                break;
2026        case I2OUSRCMD:
2027                return adpt_i2o_passthru(pHba, argp);
2028
2029        case DPT_CTRLINFO:{
2030                drvrHBAinfo_S HbaInfo;
2031
2032#define FLG_OSD_PCI_VALID 0x0001
2033#define FLG_OSD_DMA       0x0002
2034#define FLG_OSD_I2O       0x0004
2035                memset(&HbaInfo, 0, sizeof(HbaInfo));
2036                HbaInfo.drvrHBAnum = pHba->unit;
2037                HbaInfo.baseAddr = (ulong) pHba->base_addr_phys;
2038                HbaInfo.blinkState = adpt_read_blink_led(pHba);
2039                HbaInfo.pciBusNum =  pHba->pDev->bus->number;
2040                HbaInfo.pciDeviceNum=PCI_SLOT(pHba->pDev->devfn); 
2041                HbaInfo.Interrupt = pHba->pDev->irq; 
2042                HbaInfo.hbaFlags = FLG_OSD_PCI_VALID | FLG_OSD_DMA | FLG_OSD_I2O;
2043                if(copy_to_user(argp, &HbaInfo, sizeof(HbaInfo))){
2044                        printk(KERN_WARNING"%s: Could not copy HbaInfo TO user\n",pHba->name);
2045                        return -EFAULT;
2046                }
2047                break;
2048                }
2049        case DPT_SYSINFO:
2050                return adpt_system_info(argp);
2051        case DPT_BLINKLED:{
2052                u32 value;
2053                value = (u32)adpt_read_blink_led(pHba);
2054                if (copy_to_user(argp, &value, sizeof(value))) {
2055                        return -EFAULT;
2056                }
2057                break;
2058                }
2059        case I2ORESETCMD:
2060                if(pHba->host)
2061                        spin_lock_irqsave(pHba->host->host_lock, flags);
2062                adpt_hba_reset(pHba);
2063                if(pHba->host)
2064                        spin_unlock_irqrestore(pHba->host->host_lock, flags);
2065                break;
2066        case I2ORESCANCMD:
2067                adpt_rescan(pHba);
2068                break;
2069        default:
2070                return -EINVAL;
2071        }
2072
2073        return error;
2074}
2075
2076static long adpt_unlocked_ioctl(struct file *file, uint cmd, ulong arg)
2077{
2078        struct inode *inode;
2079        long ret;
2080 
2081        inode = file_inode(file);
2082 
2083        mutex_lock(&adpt_mutex);
2084        ret = adpt_ioctl(inode, file, cmd, arg);
2085        mutex_unlock(&adpt_mutex);
2086
2087        return ret;
2088}
2089
2090#ifdef CONFIG_COMPAT
2091static long compat_adpt_ioctl(struct file *file,
2092                                unsigned int cmd, unsigned long arg)
2093{
2094        struct inode *inode;
2095        long ret;
2096 
2097        inode = file_inode(file);
2098 
2099        mutex_lock(&adpt_mutex);
2100 
2101        switch(cmd) {
2102                case DPT_SIGNATURE:
2103                case I2OUSRCMD:
2104                case DPT_CTRLINFO:
2105                case DPT_SYSINFO:
2106                case DPT_BLINKLED:
2107                case I2ORESETCMD:
2108                case I2ORESCANCMD:
2109                case (DPT_TARGET_BUSY & 0xFFFF):
2110                case DPT_TARGET_BUSY:
2111                        ret = adpt_ioctl(inode, file, cmd, arg);
2112                        break;
2113                default:
2114                        ret =  -ENOIOCTLCMD;
2115        }
2116 
2117        mutex_unlock(&adpt_mutex);
2118 
2119        return ret;
2120}
2121#endif
2122
2123static irqreturn_t adpt_isr(int irq, void *dev_id)
2124{
2125        struct scsi_cmnd* cmd;
2126        adpt_hba* pHba = dev_id;
2127        u32 m;
2128        void __iomem *reply;
2129        u32 status=0;
2130        u32 context;
2131        ulong flags = 0;
2132        int handled = 0;
2133
2134        if (pHba == NULL){
2135                printk(KERN_WARNING"adpt_isr: NULL dev_id\n");
2136                return IRQ_NONE;
2137        }
2138        if(pHba->host)
2139                spin_lock_irqsave(pHba->host->host_lock, flags);
2140
2141        while( readl(pHba->irq_mask) & I2O_INTERRUPT_PENDING_B) {
2142                m = readl(pHba->reply_port);
2143                if(m == EMPTY_QUEUE){
2144                        // Try twice then give up
2145                        rmb();
2146                        m = readl(pHba->reply_port);
2147                        if(m == EMPTY_QUEUE){ 
2148                                // This really should not happen
2149                                printk(KERN_ERR"dpti: Could not get reply frame\n");
2150                                goto out;
2151                        }
2152                }
2153                if (pHba->reply_pool_pa <= m &&
2154                    m < pHba->reply_pool_pa +
2155                        (pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4)) {
2156                        reply = (u8 *)pHba->reply_pool +
2157                                                (m - pHba->reply_pool_pa);
2158                } else {
2159                        /* Ick, we should *never* be here */
2160                        printk(KERN_ERR "dpti: reply frame not from pool\n");
2161                        reply = (u8 *)bus_to_virt(m);
2162                }
2163
2164                if (readl(reply) & MSG_FAIL) {
2165                        u32 old_m = readl(reply+28); 
2166                        void __iomem *msg;
2167                        u32 old_context;
2168                        PDEBUG("%s: Failed message\n",pHba->name);
2169                        if(old_m >= 0x100000){
2170                                printk(KERN_ERR"%s: Bad preserved MFA (%x)- dropping frame\n",pHba->name,old_m);
2171                                writel(m,pHba->reply_port);
2172                                continue;
2173                        }
2174                        // Transaction context is 0 in failed reply frame
2175                        msg = pHba->msg_addr_virt + old_m;
2176                        old_context = readl(msg+12);
2177                        writel(old_context, reply+12);
2178                        adpt_send_nop(pHba, old_m);
2179                } 
2180                context = readl(reply+8);
2181                if(context & 0x40000000){ // IOCTL
2182                        void *p = adpt_ioctl_from_context(pHba, readl(reply+12));
2183                        if( p != NULL) {
2184                                memcpy_fromio(p, reply, REPLY_FRAME_SIZE * 4);
2185                        }
2186                        // All IOCTLs will also be post wait
2187                }
2188                if(context & 0x80000000){ // Post wait message
2189                        status = readl(reply+16);
2190                        if(status  >> 24){
2191                                status &=  0xffff; /* Get detail status */
2192                        } else {
2193                                status = I2O_POST_WAIT_OK;
2194                        }
2195                        if(!(context & 0x40000000)) {
2196                                cmd = adpt_cmd_from_context(pHba,
2197                                                        readl(reply+12));
2198                                if(cmd != NULL) {
2199                                        printk(KERN_WARNING"%s: Apparent SCSI cmd in Post Wait Context - cmd=%p context=%x\n", pHba->name, cmd, context);
2200                                }
2201                        }
2202                        adpt_i2o_post_wait_complete(context, status);
2203                } else { // SCSI message
2204                        cmd = adpt_cmd_from_context (pHba, readl(reply+12));
2205                        if(cmd != NULL){
2206                                scsi_dma_unmap(cmd);
2207                                if(cmd->serial_number != 0) { // If not timedout
2208                                        adpt_i2o_to_scsi(reply, cmd);
2209                                }
2210                        }
2211                }
2212                writel(m, pHba->reply_port);
2213                wmb();
2214                rmb();
2215        }
2216        handled = 1;
2217out:    if(pHba->host)
2218                spin_unlock_irqrestore(pHba->host->host_lock, flags);
2219        return IRQ_RETVAL(handled);
2220}
2221
2222static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_device* d)
2223{
2224        int i;
2225        u32 msg[MAX_MESSAGE_SIZE];
2226        u32* mptr;
2227        u32* lptr;
2228        u32 *lenptr;
2229        int direction;
2230        int scsidir;
2231        int nseg;
2232        u32 len;
2233        u32 reqlen;
2234        s32 rcode;
2235        dma_addr_t addr;
2236
2237        memset(msg, 0 , sizeof(msg));
2238        len = scsi_bufflen(cmd);
2239        direction = 0x00000000; 
2240        
2241        scsidir = 0x00000000;                   // DATA NO XFER
2242        if(len) {
2243                /*
2244                 * Set SCBFlags to indicate if data is being transferred
2245                 * in or out, or no data transfer
2246                 * Note:  Do not have to verify index is less than 0 since
2247                 * cmd->cmnd[0] is an unsigned char
2248                 */
2249                switch(cmd->sc_data_direction){
2250                case DMA_FROM_DEVICE:
2251                        scsidir  =0x40000000;   // DATA IN  (iop<--dev)
2252                        break;
2253                case DMA_TO_DEVICE:
2254                        direction=0x04000000;   // SGL OUT
2255                        scsidir  =0x80000000;   // DATA OUT (iop-->dev)
2256                        break;
2257                case DMA_NONE:
2258                        break;
2259                case DMA_BIDIRECTIONAL:
2260                        scsidir  =0x40000000;   // DATA IN  (iop<--dev)
2261                        // Assume In - and continue;
2262                        break;
2263                default:
2264                        printk(KERN_WARNING"%s: scsi opcode 0x%x not supported.\n",
2265                             pHba->name, cmd->cmnd[0]);
2266                        cmd->result = (DID_OK <<16) | (INITIATOR_ERROR << 8);
2267                        cmd->scsi_done(cmd);
2268                        return  0;
2269                }
2270        }
2271        // msg[0] is set later
2272        // I2O_CMD_SCSI_EXEC
2273        msg[1] = ((0xff<<24)|(HOST_TID<<12)|d->tid);
2274        msg[2] = 0;
2275        msg[3] = adpt_cmd_to_context(cmd);  /* Want SCSI control block back */
2276        // Our cards use the transaction context as the tag for queueing
2277        // Adaptec/DPT Private stuff 
2278        msg[4] = I2O_CMD_SCSI_EXEC|(DPT_ORGANIZATION_ID<<16);
2279        msg[5] = d->tid;
2280        /* Direction, disconnect ok | sense data | simple queue , CDBLen */
2281        // I2O_SCB_FLAG_ENABLE_DISCONNECT | 
2282        // I2O_SCB_FLAG_SIMPLE_QUEUE_TAG | 
2283        // I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
2284        msg[6] = scsidir|0x20a00000|cmd->cmd_len;
2285
2286        mptr=msg+7;
2287
2288        // Write SCSI command into the message - always 16 byte block 
2289        memset(mptr, 0,  16);
2290        memcpy(mptr, cmd->cmnd, cmd->cmd_len);
2291        mptr+=4;
2292        lenptr=mptr++;          /* Remember me - fill in when we know */
2293        if (dpt_dma64(pHba)) {
2294                reqlen = 16;            // SINGLE SGE
2295                *mptr++ = (0x7C<<24)+(2<<16)+0x02; /* Enable 64 bit */
2296                *mptr++ = 1 << PAGE_SHIFT;
2297        } else {
2298                reqlen = 14;            // SINGLE SGE
2299        }
2300        /* Now fill in the SGList and command */
2301
2302        nseg = scsi_dma_map(cmd);
2303        BUG_ON(nseg < 0);
2304        if (nseg) {
2305                struct scatterlist *sg;
2306
2307                len = 0;
2308                scsi_for_each_sg(cmd, sg, nseg, i) {
2309                        lptr = mptr;
2310                        *mptr++ = direction|0x10000000|sg_dma_len(sg);
2311                        len+=sg_dma_len(sg);
2312                        addr = sg_dma_address(sg);
2313                        *mptr++ = dma_low(addr);
2314                        if (dpt_dma64(pHba))
2315                                *mptr++ = dma_high(addr);
2316                        /* Make this an end of list */
2317                        if (i == nseg - 1)
2318                                *lptr = direction|0xD0000000|sg_dma_len(sg);
2319                }
2320                reqlen = mptr - msg;
2321                *lenptr = len;
2322                
2323                if(cmd->underflow && len != cmd->underflow){
2324                        printk(KERN_WARNING"Cmd len %08X Cmd underflow %08X\n",
2325                                len, cmd->underflow);
2326                }
2327        } else {
2328                *lenptr = len = 0;
2329                reqlen = 12;
2330        }
2331        
2332        /* Stick the headers on */
2333        msg[0] = reqlen<<16 | ((reqlen > 12) ? SGL_OFFSET_12 : SGL_OFFSET_0);
2334        
2335        // Send it on it's way
2336        rcode = adpt_i2o_post_this(pHba, msg, reqlen<<2);
2337        if (rcode == 0) {
2338                return 0;
2339        }
2340        return rcode;
2341}
2342
2343
2344static s32 adpt_scsi_host_alloc(adpt_hba* pHba, struct scsi_host_template *sht)
2345{
2346        struct Scsi_Host *host;
2347
2348        host = scsi_host_alloc(sht, sizeof(adpt_hba*));
2349        if (host == NULL) {
2350                printk("%s: scsi_host_alloc returned NULL\n", pHba->name);
2351                return -1;
2352        }
2353        host->hostdata[0] = (unsigned long)pHba;
2354        pHba->host = host;
2355
2356        host->irq = pHba->pDev->irq;
2357        /* no IO ports, so don't have to set host->io_port and
2358         * host->n_io_port
2359         */
2360        host->io_port = 0;
2361        host->n_io_port = 0;
2362                                /* see comments in scsi_host.h */
2363        host->max_id = 16;
2364        host->max_lun = 256;
2365        host->max_channel = pHba->top_scsi_channel + 1;
2366        host->cmd_per_lun = 1;
2367        host->unique_id = (u32)sys_tbl_pa + pHba->unit;
2368        host->sg_tablesize = pHba->sg_tablesize;
2369        host->can_queue = pHba->post_fifo_size;
2370        host->use_cmd_list = 1;
2371
2372        return 0;
2373}
2374
2375
2376static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
2377{
2378        adpt_hba* pHba;
2379        u32 hba_status;
2380        u32 dev_status;
2381        u32 reply_flags = readl(reply) & 0xff00; // Leave it shifted up 8 bits 
2382        // I know this would look cleaner if I just read bytes
2383        // but the model I have been using for all the rest of the
2384        // io is in 4 byte words - so I keep that model
2385        u16 detailed_status = readl(reply+16) &0xffff;
2386        dev_status = (detailed_status & 0xff);
2387        hba_status = detailed_status >> 8;
2388
2389        // calculate resid for sg 
2390        scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+20));
2391
2392        pHba = (adpt_hba*) cmd->device->host->hostdata[0];
2393
2394        cmd->sense_buffer[0] = '\0';  // initialize sense valid flag to false
2395
2396        if(!(reply_flags & MSG_FAIL)) {
2397                switch(detailed_status & I2O_SCSI_DSC_MASK) {
2398                case I2O_SCSI_DSC_SUCCESS:
2399                        cmd->result = (DID_OK << 16);
2400                        // handle underflow
2401                        if (readl(reply+20) < cmd->underflow) {
2402                                cmd->result = (DID_ERROR <<16);
2403                                printk(KERN_WARNING"%s: SCSI CMD underflow\n",pHba->name);
2404                        }
2405                        break;
2406                case I2O_SCSI_DSC_REQUEST_ABORTED:
2407                        cmd->result = (DID_ABORT << 16);
2408                        break;
2409                case I2O_SCSI_DSC_PATH_INVALID:
2410                case I2O_SCSI_DSC_DEVICE_NOT_PRESENT:
2411                case I2O_SCSI_DSC_SELECTION_TIMEOUT:
2412                case I2O_SCSI_DSC_COMMAND_TIMEOUT:
2413                case I2O_SCSI_DSC_NO_ADAPTER:
2414                case I2O_SCSI_DSC_RESOURCE_UNAVAILABLE:
2415                        printk(KERN_WARNING"%s: SCSI Timeout-Device (%d,%d,%llu) hba status=0x%x, dev status=0x%x, cmd=0x%x\n",
2416                                pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun, hba_status, dev_status, cmd->cmnd[0]);
2417                        cmd->result = (DID_TIME_OUT << 16);
2418                        break;
2419                case I2O_SCSI_DSC_ADAPTER_BUSY:
2420                case I2O_SCSI_DSC_BUS_BUSY:
2421                        cmd->result = (DID_BUS_BUSY << 16);
2422                        break;
2423                case I2O_SCSI_DSC_SCSI_BUS_RESET:
2424                case I2O_SCSI_DSC_BDR_MESSAGE_SENT:
2425                        cmd->result = (DID_RESET << 16);
2426                        break;
2427                case I2O_SCSI_DSC_PARITY_ERROR_FAILURE:
2428                        printk(KERN_WARNING"%s: SCSI CMD parity error\n",pHba->name);
2429                        cmd->result = (DID_PARITY << 16);
2430                        break;
2431                case I2O_SCSI_DSC_UNABLE_TO_ABORT:
2432                case I2O_SCSI_DSC_COMPLETE_WITH_ERROR:
2433                case I2O_SCSI_DSC_UNABLE_TO_TERMINATE:
2434                case I2O_SCSI_DSC_MR_MESSAGE_RECEIVED:
2435                case I2O_SCSI_DSC_AUTOSENSE_FAILED:
2436                case I2O_SCSI_DSC_DATA_OVERRUN:
2437                case I2O_SCSI_DSC_UNEXPECTED_BUS_FREE:
2438                case I2O_SCSI_DSC_SEQUENCE_FAILURE:
2439                case I2O_SCSI_DSC_REQUEST_LENGTH_ERROR:
2440                case I2O_SCSI_DSC_PROVIDE_FAILURE:
2441                case I2O_SCSI_DSC_REQUEST_TERMINATED:
2442                case I2O_SCSI_DSC_IDE_MESSAGE_SENT:
2443                case I2O_SCSI_DSC_UNACKNOWLEDGED_EVENT:
2444                case I2O_SCSI_DSC_MESSAGE_RECEIVED:
2445                case I2O_SCSI_DSC_INVALID_CDB:
2446                case I2O_SCSI_DSC_LUN_INVALID:
2447                case I2O_SCSI_DSC_SCSI_TID_INVALID:
2448                case I2O_SCSI_DSC_FUNCTION_UNAVAILABLE:
2449                case I2O_SCSI_DSC_NO_NEXUS:
2450                case I2O_SCSI_DSC_CDB_RECEIVED:
2451                case I2O_SCSI_DSC_LUN_ALREADY_ENABLED:
2452                case I2O_SCSI_DSC_QUEUE_FROZEN:
2453                case I2O_SCSI_DSC_REQUEST_INVALID:
2454                default:
2455                        printk(KERN_WARNING"%s: SCSI error %0x-Device(%d,%d,%llu) hba_status=0x%x, dev_status=0x%x, cmd=0x%x\n",
2456                                pHba->name, detailed_status & I2O_SCSI_DSC_MASK, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun,
2457                               hba_status, dev_status, cmd->cmnd[0]);
2458                        cmd->result = (DID_ERROR << 16);
2459                        break;
2460                }
2461
2462                // copy over the request sense data if it was a check
2463                // condition status
2464                if (dev_status == SAM_STAT_CHECK_CONDITION) {
2465                        u32 len = min(SCSI_SENSE_BUFFERSIZE, 40);
2466                        // Copy over the sense data
2467                        memcpy_fromio(cmd->sense_buffer, (reply+28) , len);
2468                        if(cmd->sense_buffer[0] == 0x70 /* class 7 */ && 
2469                           cmd->sense_buffer[2] == DATA_PROTECT ){
2470                                /* This is to handle an array failed */
2471                                cmd->result = (DID_TIME_OUT << 16);
2472                                printk(KERN_WARNING"%s: SCSI Data Protect-Device (%d,%d,%llu) hba_status=0x%x, dev_status=0x%x, cmd=0x%x\n",
2473                                        pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun,
2474                                        hba_status, dev_status, cmd->cmnd[0]);
2475
2476                        }
2477                }
2478        } else {
2479                /* In this condtion we could not talk to the tid
2480                 * the card rejected it.  We should signal a retry
2481                 * for a limitted number of retries.
2482                 */
2483                cmd->result = (DID_TIME_OUT << 16);
2484                printk(KERN_WARNING"%s: I2O MSG_FAIL - Device (%d,%d,%llu) tid=%d, cmd=0x%x\n",
2485                        pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun,
2486                        ((struct adpt_device*)(cmd->device->hostdata))->tid, cmd->cmnd[0]);
2487        }
2488
2489        cmd->result |= (dev_status);
2490
2491        if(cmd->scsi_done != NULL){
2492                cmd->scsi_done(cmd);
2493        } 
2494        return cmd->result;
2495}
2496
2497
2498static s32 adpt_rescan(adpt_hba* pHba)
2499{
2500        s32 rcode;
2501        ulong flags = 0;
2502
2503        if(pHba->host)
2504                spin_lock_irqsave(pHba->host->host_lock, flags);
2505        if ((rcode=adpt_i2o_lct_get(pHba)) < 0)
2506                goto out;
2507        if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0)
2508                goto out;
2509        rcode = 0;
2510out:    if(pHba->host)
2511                spin_unlock_irqrestore(pHba->host->host_lock, flags);
2512        return rcode;
2513}
2514
2515
2516static s32 adpt_i2o_reparse_lct(adpt_hba* pHba)
2517{
2518        int i;
2519        int max;
2520        int tid;
2521        struct i2o_device *d;
2522        i2o_lct *lct = pHba->lct;
2523        u8 bus_no = 0;
2524        s16 scsi_id;
2525        u64 scsi_lun;
2526        u32 buf[10]; // at least 8 u32's
2527        struct adpt_device* pDev = NULL;
2528        struct i2o_device* pI2o_dev = NULL;
2529        
2530        if (lct == NULL) {
2531                printk(KERN_ERR "%s: LCT is empty???\n",pHba->name);
2532                return -1;
2533        }
2534        
2535        max = lct->table_size;  
2536        max -= 3;
2537        max /= 9;
2538
2539        // Mark each drive as unscanned
2540        for (d = pHba->devices; d; d = d->next) {
2541                pDev =(struct adpt_device*) d->owner;
2542                if(!pDev){
2543                        continue;
2544                }
2545                pDev->state |= DPTI_DEV_UNSCANNED;
2546        }
2547
2548        printk(KERN_INFO "%s: LCT has %d entries.\n", pHba->name,max);
2549        
2550        for(i=0;i<max;i++) {
2551                if( lct->lct_entry[i].user_tid != 0xfff){
2552                        continue;
2553                }
2554
2555                if( lct->lct_entry[i].class_id == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
2556                    lct->lct_entry[i].class_id == I2O_CLASS_SCSI_PERIPHERAL ||
2557                    lct->lct_entry[i].class_id == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
2558                        tid = lct->lct_entry[i].tid;
2559                        if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
2560                                printk(KERN_ERR"%s: Could not query device\n",pHba->name);
2561                                continue;
2562                        }
2563                        bus_no = buf[0]>>16;
2564                        if (bus_no >= MAX_CHANNEL) {    /* Something wrong skip it */
2565                                printk(KERN_WARNING
2566                                        "%s: Channel number %d out of range\n",
2567                                        pHba->name, bus_no);
2568                                continue;
2569                        }
2570
2571                        scsi_id = buf[1];
2572                        scsi_lun = scsilun_to_int((struct scsi_lun *)&buf[2]);
2573                        pDev = pHba->channel[bus_no].device[scsi_id];
2574                        /* da lun */
2575                        while(pDev) {
2576                                if(pDev->scsi_lun == scsi_lun) {
2577                                        break;
2578                                }
2579                                pDev = pDev->next_lun;
2580                        }
2581                        if(!pDev ) { // Something new add it
2582                                d = kmalloc(sizeof(struct i2o_device),
2583                                            GFP_ATOMIC);
2584                                if(d==NULL)
2585                                {
2586                                        printk(KERN_CRIT "Out of memory for I2O device data.\n");
2587                                        return -ENOMEM;
2588                                }
2589                                
2590                                d->controller = pHba;
2591                                d->next = NULL;
2592
2593                                memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
2594
2595                                d->flags = 0;
2596                                adpt_i2o_report_hba_unit(pHba, d);
2597                                adpt_i2o_install_device(pHba, d);
2598        
2599                                pDev = pHba->channel[bus_no].device[scsi_id];   
2600                                if( pDev == NULL){
2601                                        pDev =
2602                                          kzalloc(sizeof(struct adpt_device),
2603                                                  GFP_ATOMIC);
2604                                        if(pDev == NULL) {
2605                                                return -ENOMEM;
2606                                        }
2607                                        pHba->channel[bus_no].device[scsi_id] = pDev;
2608                                } else {
2609                                        while (pDev->next_lun) {
2610                                                pDev = pDev->next_lun;
2611                                        }
2612                                        pDev = pDev->next_lun =
2613                                          kzalloc(sizeof(struct adpt_device),
2614                                                  GFP_ATOMIC);
2615                                        if(pDev == NULL) {
2616                                                return -ENOMEM;
2617                                        }
2618                                }
2619                                pDev->tid = d->lct_data.tid;
2620                                pDev->scsi_channel = bus_no;
2621                                pDev->scsi_id = scsi_id;
2622                                pDev->scsi_lun = scsi_lun;
2623                                pDev->pI2o_dev = d;
2624                                d->owner = pDev;
2625                                pDev->type = (buf[0])&0xff;
2626                                pDev->flags = (buf[0]>>8)&0xff;
2627                                // Too late, SCSI system has made up it's mind, but what the hey ...
2628                                if(scsi_id > pHba->top_scsi_id){
2629                                        pHba->top_scsi_id = scsi_id;
2630                                }
2631                                if(scsi_lun > pHba->top_scsi_lun){
2632                                        pHba->top_scsi_lun = scsi_lun;
2633                                }
2634                                continue;
2635                        } // end of new i2o device
2636
2637                        // We found an old device - check it
2638                        while(pDev) {
2639                                if(pDev->scsi_lun == scsi_lun) {
2640                                        if(!scsi_device_online(pDev->pScsi_dev)) {
2641                                                printk(KERN_WARNING"%s: Setting device (%d,%d,%llu) back online\n",
2642                                                                pHba->name,bus_no,scsi_id,scsi_lun);
2643                                                if (pDev->pScsi_dev) {
2644                                                        scsi_device_set_state(pDev->pScsi_dev, SDEV_RUNNING);
2645                                                }
2646                                        }
2647                                        d = pDev->pI2o_dev;
2648                                        if(d->lct_data.tid != tid) { // something changed
2649                                                pDev->tid = tid;
2650                                                memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
2651                                                if (pDev->pScsi_dev) {
2652                                                        pDev->pScsi_dev->changed = TRUE;
2653                                                        pDev->pScsi_dev->removable = TRUE;
2654                                                }
2655                                        }
2656                                        // Found it - mark it scanned
2657                                        pDev->state = DPTI_DEV_ONLINE;
2658                                        break;
2659                                }
2660                                pDev = pDev->next_lun;
2661                        }
2662                }
2663        }
2664        for (pI2o_dev = pHba->devices; pI2o_dev; pI2o_dev = pI2o_dev->next) {
2665                pDev =(struct adpt_device*) pI2o_dev->owner;
2666                if(!pDev){
2667                        continue;
2668                }
2669                // Drive offline drives that previously existed but could not be found
2670                // in the LCT table
2671                if (pDev->state & DPTI_DEV_UNSCANNED){
2672                        pDev->state = DPTI_DEV_OFFLINE;
2673                        printk(KERN_WARNING"%s: Device (%d,%d,%llu) offline\n",pHba->name,pDev->scsi_channel,pDev->scsi_id,pDev->scsi_lun);
2674                        if (pDev->pScsi_dev) {
2675                                scsi_device_set_state(pDev->pScsi_dev, SDEV_OFFLINE);
2676                        }
2677                }
2678        }
2679        return 0;
2680}
2681
2682static void adpt_fail_posted_scbs(adpt_hba* pHba)
2683{
2684        struct scsi_cmnd*       cmd = NULL;
2685        struct scsi_device*     d = NULL;
2686
2687        shost_for_each_device(d, pHba->host) {
2688                unsigned long flags;
2689                spin_lock_irqsave(&d->list_lock, flags);
2690                list_for_each_entry(cmd, &d->cmd_list, list) {
2691                        if(cmd->serial_number == 0){
2692                                continue;
2693                        }
2694                        cmd->result = (DID_OK << 16) | (QUEUE_FULL <<1);
2695                        cmd->scsi_done(cmd);
2696                }
2697                spin_unlock_irqrestore(&d->list_lock, flags);
2698        }
2699}
2700
2701
2702/*============================================================================
2703 *  Routines from i2o subsystem
2704 *============================================================================
2705 */
2706
2707
2708
2709/*
2710 *      Bring an I2O controller into HOLD state. See the spec.
2711 */
2712static int adpt_i2o_activate_hba(adpt_hba* pHba)
2713{
2714        int rcode;
2715
2716        if(pHba->initialized ) {
2717                if (adpt_i2o_status_get(pHba) < 0) {
2718                        if((rcode = adpt_i2o_reset_hba(pHba)) != 0){
2719                                printk(KERN_WARNING"%s: Could NOT reset.\n", pHba->name);
2720                                return rcode;
2721                        }
2722                        if (adpt_i2o_status_get(pHba) < 0) {
2723                                printk(KERN_INFO "HBA not responding.\n");
2724                                return -1;
2725                        }
2726                }
2727
2728                if(pHba->status_block->iop_state == ADAPTER_STATE_FAULTED) {
2729                        printk(KERN_CRIT "%s: hardware fault\n", pHba->name);
2730                        return -1;
2731                }
2732
2733                if (pHba->status_block->iop_state == ADAPTER_STATE_READY ||
2734                    pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL ||
2735                    pHba->status_block->iop_state == ADAPTER_STATE_HOLD ||
2736                    pHba->status_block->iop_state == ADAPTER_STATE_FAILED) {
2737                        adpt_i2o_reset_hba(pHba);                       
2738                        if (adpt_i2o_status_get(pHba) < 0 || pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
2739                                printk(KERN_ERR "%s: Failed to initialize.\n", pHba->name);
2740                                return -1;
2741                        }
2742                }
2743        } else {
2744                if((rcode = adpt_i2o_reset_hba(pHba)) != 0){
2745                        printk(KERN_WARNING"%s: Could NOT reset.\n", pHba->name);
2746                        return rcode;
2747                }
2748
2749        }
2750
2751        if (adpt_i2o_init_outbound_q(pHba) < 0) {
2752                return -1;
2753        }
2754
2755        /* In HOLD state */
2756        
2757        if (adpt_i2o_hrt_get(pHba) < 0) {
2758                return -1;
2759        }
2760
2761        return 0;
2762}
2763
2764/*
2765 *      Bring a controller online into OPERATIONAL state. 
2766 */
2767 
2768static int adpt_i2o_online_hba(adpt_hba* pHba)
2769{
2770        if (adpt_i2o_systab_send(pHba) < 0) {
2771                adpt_i2o_delete_hba(pHba);
2772                return -1;
2773        }
2774        /* In READY state */
2775
2776        if (adpt_i2o_enable_hba(pHba) < 0) {
2777                adpt_i2o_delete_hba(pHba);
2778                return -1;
2779        }
2780
2781        /* In OPERATIONAL state  */
2782        return 0;
2783}
2784
2785static s32 adpt_send_nop(adpt_hba*pHba,u32 m)
2786{
2787        u32 __iomem *msg;
2788        ulong timeout = jiffies + 5*HZ;
2789
2790        while(m == EMPTY_QUEUE){
2791                rmb();
2792                m = readl(pHba->post_port);
2793                if(m != EMPTY_QUEUE){
2794                        break;
2795                }
2796                if(time_after(jiffies,timeout)){
2797                        printk(KERN_ERR "%s: Timeout waiting for message frame!\n",pHba->name);
2798                        return 2;
2799                }
2800                schedule_timeout_uninterruptible(1);
2801        }
2802        msg = (u32 __iomem *)(pHba->msg_addr_virt + m);
2803        writel( THREE_WORD_MSG_SIZE | SGL_OFFSET_0,&msg[0]);
2804        writel( I2O_CMD_UTIL_NOP << 24 | HOST_TID << 12 | 0,&msg[1]);
2805        writel( 0,&msg[2]);
2806        wmb();
2807
2808        writel(m, pHba->post_port);
2809        wmb();
2810        return 0;
2811}
2812
2813static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba)
2814{
2815        u8 *status;
2816        dma_addr_t addr;
2817        u32 __iomem *msg = NULL;
2818        int i;
2819        ulong timeout = jiffies + TMOUT_INITOUTBOUND*HZ;
2820        u32 m;
2821
2822        do {
2823                rmb();
2824                m = readl(pHba->post_port);
2825                if (m != EMPTY_QUEUE) {
2826                        break;
2827                }
2828
2829                if(time_after(jiffies,timeout)){
2830                        printk(KERN_WARNING"%s: Timeout waiting for message frame\n",pHba->name);
2831                        return -ETIMEDOUT;
2832                }
2833                schedule_timeout_uninterruptible(1);
2834        } while(m == EMPTY_QUEUE);
2835
2836        msg=(u32 __iomem *)(pHba->msg_addr_virt+m);
2837
2838        status = dma_alloc_coherent(&pHba->pDev->dev, 4, &addr, GFP_KERNEL);
2839        if (!status) {
2840                adpt_send_nop(pHba, m);
2841                printk(KERN_WARNING"%s: IOP reset failed - no free memory.\n",
2842                        pHba->name);
2843                return -ENOMEM;
2844        }
2845        memset(status, 0, 4);
2846
2847        writel(EIGHT_WORD_MSG_SIZE| SGL_OFFSET_6, &msg[0]);
2848        writel(I2O_CMD_OUTBOUND_INIT<<24 | HOST_TID<<12 | ADAPTER_TID, &msg[1]);
2849        writel(0, &msg[2]);
2850        writel(0x0106, &msg[3]);        /* Transaction context */
2851        writel(4096, &msg[4]);          /* Host page frame size */
2852        writel((REPLY_FRAME_SIZE)<<16|0x80, &msg[5]);   /* Outbound msg frame size and Initcode */
2853        writel(0xD0000004, &msg[6]);            /* Simple SG LE, EOB */
2854        writel((u32)addr, &msg[7]);
2855
2856        writel(m, pHba->post_port);
2857        wmb();
2858
2859        // Wait for the reply status to come back
2860        do {
2861                if (*status) {
2862                        if (*status != 0x01 /*I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS*/) {
2863                                break;
2864                        }
2865                }
2866                rmb();
2867                if(time_after(jiffies,timeout)){
2868                        printk(KERN_WARNING"%s: Timeout Initializing\n",pHba->name);
2869                        /* We lose 4 bytes of "status" here, but we
2870                           cannot free these because controller may
2871                           awake and corrupt those bytes at any time */
2872                        /* dma_free_coherent(&pHba->pDev->dev, 4, status, addr); */
2873                        return -ETIMEDOUT;
2874                }
2875                schedule_timeout_uninterruptible(1);
2876        } while (1);
2877
2878        // If the command was successful, fill the fifo with our reply
2879        // message packets
2880        if(*status != 0x04 /*I2O_EXEC_OUTBOUND_INIT_COMPLETE*/) {
2881                dma_free_coherent(&pHba->pDev->dev, 4, status, addr);
2882                return -2;
2883        }
2884        dma_free_coherent(&pHba->pDev->dev, 4, status, addr);
2885
2886        if(pHba->reply_pool != NULL) {
2887                dma_free_coherent(&pHba->pDev->dev,
2888                        pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4,
2889                        pHba->reply_pool, pHba->reply_pool_pa);
2890        }
2891
2892        pHba->reply_pool = dma_alloc_coherent(&pHba->pDev->dev,
2893                                pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4,
2894                                &pHba->reply_pool_pa, GFP_KERNEL);
2895        if (!pHba->reply_pool) {
2896                printk(KERN_ERR "%s: Could not allocate reply pool\n", pHba->name);
2897                return -ENOMEM;
2898        }
2899        memset(pHba->reply_pool, 0 , pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4);
2900
2901        for(i = 0; i < pHba->reply_fifo_size; i++) {
2902                writel(pHba->reply_pool_pa + (i * REPLY_FRAME_SIZE * 4),
2903                        pHba->reply_port);
2904                wmb();
2905        }
2906        adpt_i2o_status_get(pHba);
2907        return 0;
2908}
2909
2910
2911/*
2912 * I2O System Table.  Contains information about
2913 * all the IOPs in the system.  Used to inform IOPs
2914 * about each other's existence.
2915 *
2916 * sys_tbl_ver is the CurrentChangeIndicator that is
2917 * used by IOPs to track changes.
2918 */
2919
2920
2921
2922static s32 adpt_i2o_status_get(adpt_hba* pHba)
2923{
2924        ulong timeout;
2925        u32 m;
2926        u32 __iomem *msg;
2927        u8 *status_block=NULL;
2928
2929        if(pHba->status_block == NULL) {
2930                pHba->status_block = dma_alloc_coherent(&pHba->pDev->dev,
2931                                        sizeof(i2o_status_block),
2932                                        &pHba->status_block_pa, GFP_KERNEL);
2933                if(pHba->status_block == NULL) {
2934                        printk(KERN_ERR
2935                        "dpti%d: Get Status Block failed; Out of memory. \n", 
2936                        pHba->unit);
2937                        return -ENOMEM;
2938                }
2939        }
2940        memset(pHba->status_block, 0, sizeof(i2o_status_block));
2941        status_block = (u8*)(pHba->status_block);
2942        timeout = jiffies+TMOUT_GETSTATUS*HZ;
2943        do {
2944                rmb();
2945                m = readl(pHba->post_port);
2946                if (m != EMPTY_QUEUE) {
2947                        break;
2948                }
2949                if(time_after(jiffies,timeout)){
2950                        printk(KERN_ERR "%s: Timeout waiting for message !\n",
2951                                        pHba->name);
2952                        return -ETIMEDOUT;
2953                }
2954                schedule_timeout_uninterruptible(1);
2955        } while(m==EMPTY_QUEUE);
2956
2957        
2958        msg=(u32 __iomem *)(pHba->msg_addr_virt+m);
2959
2960        writel(NINE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg[0]);
2961        writel(I2O_CMD_STATUS_GET<<24|HOST_TID<<12|ADAPTER_TID, &msg[1]);
2962        writel(1, &msg[2]);
2963        writel(0, &msg[3]);
2964        writel(0, &msg[4]);
2965        writel(0, &msg[5]);
2966        writel( dma_low(pHba->status_block_pa), &msg[6]);
2967        writel( dma_high(pHba->status_block_pa), &msg[7]);
2968        writel(sizeof(i2o_status_block), &msg[8]); // 88 bytes
2969
2970        //post message
2971        writel(m, pHba->post_port);
2972        wmb();
2973
2974        while(status_block[87]!=0xff){
2975                if(time_after(jiffies,timeout)){
2976                        printk(KERN_ERR"dpti%d: Get status timeout.\n",
2977                                pHba->unit);
2978                        return -ETIMEDOUT;
2979                }
2980                rmb();
2981                schedule_timeout_uninterruptible(1);
2982        }
2983
2984        // Set up our number of outbound and inbound messages
2985        pHba->post_fifo_size = pHba->status_block->max_inbound_frames;
2986        if (pHba->post_fifo_size > MAX_TO_IOP_MESSAGES) {
2987                pHba->post_fifo_size = MAX_TO_IOP_MESSAGES;
2988        }
2989
2990        pHba->reply_fifo_size = pHba->status_block->max_outbound_frames;
2991        if (pHba->reply_fifo_size > MAX_FROM_IOP_MESSAGES) {
2992                pHba->reply_fifo_size = MAX_FROM_IOP_MESSAGES;
2993        }
2994
2995        // Calculate the Scatter Gather list size
2996        if (dpt_dma64(pHba)) {
2997                pHba->sg_tablesize
2998                  = ((pHba->status_block->inbound_frame_size * 4
2999                  - 14 * sizeof(u32))
3000                  / (sizeof(struct sg_simple_element) + sizeof(u32)));
3001        } else {
3002                pHba->sg_tablesize
3003                  = ((pHba->status_block->inbound_frame_size * 4
3004                  - 12 * sizeof(u32))
3005                  / sizeof(struct sg_simple_element));
3006        }
3007        if (pHba->sg_tablesize > SG_LIST_ELEMENTS) {
3008                pHba->sg_tablesize = SG_LIST_ELEMENTS;
3009        }
3010
3011
3012#ifdef DEBUG
3013        printk("dpti%d: State = ",pHba->unit);
3014        switch(pHba->status_block->iop_state) {
3015                case 0x01:
3016                        printk("INIT\n");
3017                        break;
3018                case 0x02:
3019                        printk("RESET\n");
3020                        break;
3021                case 0x04:
3022                        printk("HOLD\n");
3023                        break;
3024                case 0x05:
3025                        printk("READY\n");
3026                        break;
3027                case 0x08:
3028                        printk("OPERATIONAL\n");
3029                        break;
3030                case 0x10:
3031                        printk("FAILED\n");
3032                        break;
3033                case 0x11:
3034                        printk("FAULTED\n");
3035                        break;
3036                default:
3037                        printk("%x (unknown!!)\n",pHba->status_block->iop_state);
3038        }
3039#endif
3040        return 0;
3041}
3042
3043/*
3044 * Get the IOP's Logical Configuration Table
3045 */
3046static int adpt_i2o_lct_get(adpt_hba* pHba)
3047{
3048        u32 msg[8];
3049        int ret;
3050        u32 buf[16];
3051
3052        if ((pHba->lct_size == 0) || (pHba->lct == NULL)){
3053                pHba->lct_size = pHba->status_block->expected_lct_size;
3054        }
3055        do {
3056                if (pHba->lct == NULL) {
3057                        pHba->lct = dma_alloc_coherent(&pHba->pDev->dev,
3058                                        pHba->lct_size, &pHba->lct_pa,
3059                                        GFP_ATOMIC);
3060                        if(pHba->lct == NULL) {
3061                                printk(KERN_CRIT "%s: Lct Get failed. Out of memory.\n",
3062                                        pHba->name);
3063                                return -ENOMEM;
3064                        }
3065                }
3066                memset(pHba->lct, 0, pHba->lct_size);
3067
3068                msg[0] = EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6;
3069                msg[1] = I2O_CMD_LCT_NOTIFY<<24 | HOST_TID<<12 | ADAPTER_TID;
3070                msg[2] = 0;
3071                msg[3] = 0;
3072                msg[4] = 0xFFFFFFFF;    /* All devices */
3073                msg[5] = 0x00000000;    /* Report now */
3074                msg[6] = 0xD0000000|pHba->lct_size;
3075                msg[7] = (u32)pHba->lct_pa;
3076
3077                if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 360))) {
3078                        printk(KERN_ERR "%s: LCT Get failed (status=%#10x.\n", 
3079                                pHba->name, ret);       
3080                        printk(KERN_ERR"Adaptec: Error Reading Hardware.\n");
3081                        return ret;
3082                }
3083
3084                if ((pHba->lct->table_size << 2) > pHba->lct_size) {
3085                        pHba->lct_size = pHba->lct->table_size << 2;
3086                        dma_free_coherent(&pHba->pDev->dev, pHba->lct_size,
3087                                        pHba->lct, pHba->lct_pa);
3088                        pHba->lct = NULL;
3089                }
3090        } while (pHba->lct == NULL);
3091
3092        PDEBUG("%s: Hardware resource table read.\n", pHba->name);
3093
3094
3095        // I2O_DPT_EXEC_IOP_BUFFERS_GROUP_NO;
3096        if(adpt_i2o_query_scalar(pHba, 0 , 0x8000, -1, buf, sizeof(buf))>=0) {
3097                pHba->FwDebugBufferSize = buf[1];
3098                pHba->FwDebugBuffer_P = ioremap(pHba->base_addr_phys + buf[0],
3099                                                pHba->FwDebugBufferSize);
3100                if (pHba->FwDebugBuffer_P) {
3101                        pHba->FwDebugFlags_P     = pHba->FwDebugBuffer_P +
3102                                                        FW_DEBUG_FLAGS_OFFSET;
3103                        pHba->FwDebugBLEDvalue_P = pHba->FwDebugBuffer_P +
3104                                                        FW_DEBUG_BLED_OFFSET;
3105                        pHba->FwDebugBLEDflag_P  = pHba->FwDebugBLEDvalue_P + 1;
3106                        pHba->FwDebugStrLength_P = pHba->FwDebugBuffer_P +
3107                                                FW_DEBUG_STR_LENGTH_OFFSET;
3108                        pHba->FwDebugBuffer_P += buf[2]; 
3109                        pHba->FwDebugFlags = 0;
3110                }
3111        }
3112
3113        return 0;
3114}
3115
3116static int adpt_i2o_build_sys_table(void)
3117{
3118        adpt_hba* pHba = hba_chain;
3119        int count = 0;
3120
3121        if (sys_tbl)
3122                dma_free_coherent(&pHba->pDev->dev, sys_tbl_len,
3123                                        sys_tbl, sys_tbl_pa);
3124
3125        sys_tbl_len = sizeof(struct i2o_sys_tbl) +      // Header + IOPs
3126                                (hba_count) * sizeof(struct i2o_sys_tbl_entry);
3127
3128        sys_tbl = dma_alloc_coherent(&pHba->pDev->dev,
3129                                sys_tbl_len, &sys_tbl_pa, GFP_KERNEL);
3130        if (!sys_tbl) {
3131                printk(KERN_WARNING "SysTab Set failed. Out of memory.\n");     
3132                return -ENOMEM;
3133        }
3134        memset(sys_tbl, 0, sys_tbl_len);
3135
3136        sys_tbl->num_entries = hba_count;
3137        sys_tbl->version = I2OVERSION;
3138        sys_tbl->change_ind = sys_tbl_ind++;
3139
3140        for(pHba = hba_chain; pHba; pHba = pHba->next) {
3141                u64 addr;
3142                // Get updated Status Block so we have the latest information
3143                if (adpt_i2o_status_get(pHba)) {
3144                        sys_tbl->num_entries--;
3145                        continue; // try next one       
3146                }
3147
3148                sys_tbl->iops[count].org_id = pHba->status_block->org_id;
3149                sys_tbl->iops[count].iop_id = pHba->unit + 2;
3150                sys_tbl->iops[count].seg_num = 0;
3151                sys_tbl->iops[count].i2o_version = pHba->status_block->i2o_version;
3152                sys_tbl->iops[count].iop_state = pHba->status_block->iop_state;
3153                sys_tbl->iops[count].msg_type = pHba->status_block->msg_type;
3154                sys_tbl->iops[count].frame_size = pHba->status_block->inbound_frame_size;
3155                sys_tbl->iops[count].last_changed = sys_tbl_ind - 1; // ??
3156                sys_tbl->iops[count].iop_capabilities = pHba->status_block->iop_capabilities;
3157                addr = pHba->base_addr_phys + 0x40;
3158                sys_tbl->iops[count].inbound_low = dma_low(addr);
3159                sys_tbl->iops[count].inbound_high = dma_high(addr);
3160
3161                count++;
3162        }
3163
3164#ifdef DEBUG
3165{
3166        u32 *table = (u32*)sys_tbl;
3167        printk(KERN_DEBUG"sys_tbl_len=%d in 32bit words\n",(sys_tbl_len >>2));
3168        for(count = 0; count < (sys_tbl_len >>2); count++) {
3169                printk(KERN_INFO "sys_tbl[%d] = %0#10x\n", 
3170                        count, table[count]);
3171        }
3172}
3173#endif
3174
3175        return 0;
3176}
3177
3178
3179/*
3180 *       Dump the information block associated with a given unit (TID)
3181 */
3182 
3183static void adpt_i2o_report_hba_unit(adpt_hba* pHba, struct i2o_device *d)
3184{
3185        char buf[64];
3186        int unit = d->lct_data.tid;
3187
3188        printk(KERN_INFO "TID %3.3d ", unit);
3189
3190        if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 3, buf, 16)>=0)
3191        {
3192                buf[16]=0;
3193                printk(" Vendor: %-12.12s", buf);
3194        }
3195        if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 4, buf, 16)>=0)
3196        {
3197                buf[16]=0;
3198                printk(" Device: %-12.12s", buf);
3199        }
3200        if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 6, buf, 8)>=0)
3201        {
3202                buf[8]=0;
3203                printk(" Rev: %-12.12s\n", buf);
3204        }
3205#ifdef DEBUG
3206         printk(KERN_INFO "\tClass: %.21s\n", adpt_i2o_get_class_name(d->lct_data.class_id));
3207         printk(KERN_INFO "\tSubclass: 0x%04X\n", d->lct_data.sub_class);
3208         printk(KERN_INFO "\tFlags: ");
3209
3210         if(d->lct_data.device_flags&(1<<0))
3211                  printk("C");       // ConfigDialog requested
3212         if(d->lct_data.device_flags&(1<<1))
3213                  printk("U");       // Multi-user capable
3214         if(!(d->lct_data.device_flags&(1<<4)))
3215                  printk("P");       // Peer service enabled!
3216         if(!(d->lct_data.device_flags&(1<<5)))
3217                  printk("M");       // Mgmt service enabled!
3218         printk("\n");
3219#endif
3220}
3221
3222#ifdef DEBUG
3223/*
3224 *      Do i2o class name lookup
3225 */
3226static const char *adpt_i2o_get_class_name(int class)
3227{
3228        int idx = 16;
3229        static char *i2o_class_name[] = {
3230                "Executive",
3231                "Device Driver Module",
3232                "Block Device",
3233                "Tape Device",
3234                "LAN Interface",
3235                "WAN Interface",
3236                "Fibre Channel Port",
3237                "Fibre Channel Device",
3238                "SCSI Device",
3239                "ATE Port",
3240                "ATE Device",
3241                "Floppy Controller",
3242                "Floppy Device",
3243                "Secondary Bus Port",
3244                "Peer Transport Agent",
3245                "Peer Transport",
3246                "Unknown"
3247        };
3248        
3249        switch(class&0xFFF) {
3250        case I2O_CLASS_EXECUTIVE:
3251                idx = 0; break;
3252        case I2O_CLASS_DDM:
3253                idx = 1; break;
3254        case I2O_CLASS_RANDOM_BLOCK_STORAGE:
3255                idx = 2; break;
3256        case I2O_CLASS_SEQUENTIAL_STORAGE:
3257                idx = 3; break;
3258        case I2O_CLASS_LAN:
3259                idx = 4; break;
3260        case I2O_CLASS_WAN:
3261                idx = 5; break;
3262        case I2O_CLASS_FIBRE_CHANNEL_PORT:
3263                idx = 6; break;
3264        case I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL:
3265                idx = 7; break;
3266        case I2O_CLASS_SCSI_PERIPHERAL:
3267                idx = 8; break;
3268        case I2O_CLASS_ATE_PORT:
3269                idx = 9; break;
3270        case I2O_CLASS_ATE_PERIPHERAL:
3271                idx = 10; break;
3272        case I2O_CLASS_FLOPPY_CONTROLLER:
3273                idx = 11; break;
3274        case I2O_CLASS_FLOPPY_DEVICE:
3275                idx = 12; break;
3276        case I2O_CLASS_BUS_ADAPTER_PORT:
3277                idx = 13; break;
3278        case I2O_CLASS_PEER_TRANSPORT_AGENT:
3279                idx = 14; break;
3280        case I2O_CLASS_PEER_TRANSPORT:
3281                idx = 15; break;
3282        }
3283        return i2o_class_name[idx];
3284}
3285#endif
3286
3287
3288static s32 adpt_i2o_hrt_get(adpt_hba* pHba)
3289{
3290        u32 msg[6];
3291        int ret, size = sizeof(i2o_hrt);
3292
3293        do {
3294                if (pHba->hrt == NULL) {
3295                        pHba->hrt = dma_alloc_coherent(&pHba->pDev->dev,
3296                                        size, &pHba->hrt_pa, GFP_KERNEL);
3297                        if (pHba->hrt == NULL) {
3298                                printk(KERN_CRIT "%s: Hrt Get failed; Out of memory.\n", pHba->name);
3299                                return -ENOMEM;
3300                        }
3301                }
3302
3303                msg[0]= SIX_WORD_MSG_SIZE| SGL_OFFSET_4;
3304                msg[1]= I2O_CMD_HRT_GET<<24 | HOST_TID<<12 | ADAPTER_TID;
3305                msg[2]= 0;
3306                msg[3]= 0;
3307                msg[4]= (0xD0000000 | size);    /* Simple transaction */
3308                msg[5]= (u32)pHba->hrt_pa;      /* Dump it here */
3309
3310                if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg),20))) {
3311                        printk(KERN_ERR "%s: Unable to get HRT (status=%#10x)\n", pHba->name, ret);
3312                        return ret;
3313                }
3314
3315                if (pHba->hrt->num_entries * pHba->hrt->entry_len << 2 > size) {
3316                        int newsize = pHba->hrt->num_entries * pHba->hrt->entry_len << 2;
3317                        dma_free_coherent(&pHba->pDev->dev, size,
3318                                pHba->hrt, pHba->hrt_pa);
3319                        size = newsize;
3320                        pHba->hrt = NULL;
3321                }
3322        } while(pHba->hrt == NULL);
3323        return 0;
3324}                                                                                                                                       
3325
3326/*
3327 *       Query one scalar group value or a whole scalar group.
3328 */                     
3329static int adpt_i2o_query_scalar(adpt_hba* pHba, int tid, 
3330                        int group, int field, void *buf, int buflen)
3331{
3332        u16 opblk[] = { 1, 0, I2O_PARAMS_FIELD_GET, group, 1, field };
3333        u8 *opblk_va;
3334        dma_addr_t opblk_pa;
3335        u8 *resblk_va;
3336        dma_addr_t resblk_pa;
3337
3338        int size;
3339
3340        /* 8 bytes for header */
3341        resblk_va = dma_alloc_coherent(&pHba->pDev->dev,
3342                        sizeof(u8) * (8 + buflen), &resblk_pa, GFP_KERNEL);
3343        if (resblk_va == NULL) {
3344                printk(KERN_CRIT "%s: query scalar failed; Out of memory.\n", pHba->name);
3345                return -ENOMEM;
3346        }
3347
3348        opblk_va = dma_alloc_coherent(&pHba->pDev->dev,
3349                        sizeof(opblk), &opblk_pa, GFP_KERNEL);
3350        if (opblk_va == NULL) {
3351                dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3352                        resblk_va, resblk_pa);
3353                printk(KERN_CRIT "%s: query operatio failed; Out of memory.\n",
3354                        pHba->name);
3355                return -ENOMEM;
3356        }
3357        if (field == -1)                /* whole group */
3358                        opblk[4] = -1;
3359
3360        memcpy(opblk_va, opblk, sizeof(opblk));
3361        size = adpt_i2o_issue_params(I2O_CMD_UTIL_PARAMS_GET, pHba, tid, 
3362                opblk_va, opblk_pa, sizeof(opblk),
3363                resblk_va, resblk_pa, sizeof(u8)*(8+buflen));
3364        dma_free_coherent(&pHba->pDev->dev, sizeof(opblk), opblk_va, opblk_pa);
3365        if (size == -ETIME) {
3366                dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3367                                                        resblk_va, resblk_pa);
3368                printk(KERN_WARNING "%s: issue params failed; Timed out.\n", pHba->name);
3369                return -ETIME;
3370        } else if (size == -EINTR) {
3371                dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3372                                                        resblk_va, resblk_pa);
3373                printk(KERN_WARNING "%s: issue params failed; Interrupted.\n", pHba->name);
3374                return -EINTR;
3375        }
3376                        
3377        memcpy(buf, resblk_va+8, buflen);  /* cut off header */
3378
3379        dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3380                                                resblk_va, resblk_pa);
3381        if (size < 0)
3382                return size;    
3383
3384        return buflen;
3385}
3386
3387
3388/*      Issue UTIL_PARAMS_GET or UTIL_PARAMS_SET
3389 *
3390 *      This function can be used for all UtilParamsGet/Set operations.
3391 *      The OperationBlock is given in opblk-buffer, 
3392 *      and results are returned in resblk-buffer.
3393 *      Note that the minimum sized resblk is 8 bytes and contains
3394 *      ResultCount, ErrorInfoSize, BlockStatus and BlockSize.
3395 */
3396static int adpt_i2o_issue_params(int cmd, adpt_hba* pHba, int tid, 
3397                  void *opblk_va,  dma_addr_t opblk_pa, int oplen,
3398                void *resblk_va, dma_addr_t resblk_pa, int reslen)
3399{
3400        u32 msg[9]; 
3401        u32 *res = (u32 *)resblk_va;
3402        int wait_status;
3403
3404        msg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_5;
3405        msg[1] = cmd << 24 | HOST_TID << 12 | tid; 
3406        msg[2] = 0;
3407        msg[3] = 0;
3408        msg[4] = 0;
3409        msg[5] = 0x54000000 | oplen;    /* OperationBlock */
3410        msg[6] = (u32)opblk_pa;
3411        msg[7] = 0xD0000000 | reslen;   /* ResultBlock */
3412        msg[8] = (u32)resblk_pa;
3413
3414        if ((wait_status = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 20))) {
3415                printk("adpt_i2o_issue_params: post_wait failed (%p)\n", resblk_va);
3416                return wait_status;     /* -DetailedStatus */
3417        }
3418
3419        if (res[1]&0x00FF0000) {        /* BlockStatus != SUCCESS */
3420                printk(KERN_WARNING "%s: %s - Error:\n  ErrorInfoSize = 0x%02x, "
3421                        "BlockStatus = 0x%02x, BlockSize = 0x%04x\n",
3422                        pHba->name,
3423                        (cmd == I2O_CMD_UTIL_PARAMS_SET) ? "PARAMS_SET"
3424                                                         : "PARAMS_GET",   
3425                        res[1]>>24, (res[1]>>16)&0xFF, res[1]&0xFFFF);
3426                return -((res[1] >> 16) & 0xFF); /* -BlockStatus */
3427        }
3428
3429         return 4 + ((res[1] & 0x0000FFFF) << 2); /* bytes used in resblk */ 
3430}
3431
3432
3433static s32 adpt_i2o_quiesce_hba(adpt_hba* pHba)
3434{
3435        u32 msg[4];
3436        int ret;
3437
3438        adpt_i2o_status_get(pHba);
3439
3440        /* SysQuiesce discarded if IOP not in READY or OPERATIONAL state */
3441
3442        if((pHba->status_block->iop_state != ADAPTER_STATE_READY) &&
3443           (pHba->status_block->iop_state != ADAPTER_STATE_OPERATIONAL)){
3444                return 0;
3445        }
3446
3447        msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
3448        msg[1] = I2O_CMD_SYS_QUIESCE<<24|HOST_TID<<12|ADAPTER_TID;
3449        msg[2] = 0;
3450        msg[3] = 0;
3451
3452        if((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
3453                printk(KERN_INFO"dpti%d: Unable to quiesce (status=%#x).\n",
3454                                pHba->unit, -ret);
3455        } else {
3456                printk(KERN_INFO"dpti%d: Quiesced.\n",pHba->unit);
3457        }
3458
3459        adpt_i2o_status_get(pHba);
3460        return ret;
3461}
3462
3463
3464/* 
3465 * Enable IOP. Allows the IOP to resume external operations.
3466 */
3467static int adpt_i2o_enable_hba(adpt_hba* pHba)
3468{
3469        u32 msg[4];
3470        int ret;
3471        
3472        adpt_i2o_status_get(pHba);
3473        if(!pHba->status_block){
3474                return -ENOMEM;
3475        }
3476        /* Enable only allowed on READY state */
3477        if(pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL)
3478                return 0;
3479
3480        if(pHba->status_block->iop_state != ADAPTER_STATE_READY)
3481                return -EINVAL;
3482
3483        msg[0]=FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
3484        msg[1]=I2O_CMD_SYS_ENABLE<<24|HOST_TID<<12|ADAPTER_TID;
3485        msg[2]= 0;
3486        msg[3]= 0;
3487
3488        if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
3489                printk(KERN_WARNING"%s: Could not enable (status=%#10x).\n", 
3490                        pHba->name, ret);
3491        } else {
3492                PDEBUG("%s: Enabled.\n", pHba->name);
3493        }
3494
3495        adpt_i2o_status_get(pHba);
3496        return ret;
3497}
3498
3499
3500static int adpt_i2o_systab_send(adpt_hba* pHba)
3501{
3502         u32 msg[12];
3503         int ret;
3504
3505        msg[0] = I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6;
3506        msg[1] = I2O_CMD_SYS_TAB_SET<<24 | HOST_TID<<12 | ADAPTER_TID;
3507        msg[2] = 0;
3508        msg[3] = 0;
3509        msg[4] = (0<<16) | ((pHba->unit+2) << 12); /* Host 0 IOP ID (unit + 2) */
3510        msg[5] = 0;                                /* Segment 0 */
3511
3512        /* 
3513         * Provide three SGL-elements:
3514         * System table (SysTab), Private memory space declaration and 
3515         * Private i/o space declaration  
3516         */
3517        msg[6] = 0x54000000 | sys_tbl_len;
3518        msg[7] = (u32)sys_tbl_pa;
3519        msg[8] = 0x54000000 | 0;
3520        msg[9] = 0;
3521        msg[10] = 0xD4000000 | 0;
3522        msg[11] = 0;
3523
3524        if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 120))) {
3525                printk(KERN_INFO "%s: Unable to set SysTab (status=%#10x).\n", 
3526                        pHba->name, ret);
3527        }
3528#ifdef DEBUG
3529        else {
3530                PINFO("%s: SysTab set.\n", pHba->name);
3531        }
3532#endif
3533
3534        return ret;     
3535 }
3536
3537
3538/*============================================================================
3539 *
3540 *============================================================================
3541 */
3542
3543
3544#ifdef UARTDELAY 
3545
3546static static void adpt_delay(int millisec)
3547{
3548        int i;
3549        for (i = 0; i < millisec; i++) {
3550                udelay(1000);   /* delay for one millisecond */
3551        }
3552}
3553
3554#endif
3555
3556static struct scsi_host_template driver_template = {
3557        .module                 = THIS_MODULE,
3558        .name                   = "dpt_i2o",
3559        .proc_name              = "dpt_i2o",
3560        .show_info              = adpt_show_info,
3561        .info                   = adpt_info,
3562        .queuecommand           = adpt_queue,
3563        .eh_abort_handler       = adpt_abort,
3564        .eh_device_reset_handler = adpt_device_reset,
3565        .eh_bus_reset_handler   = adpt_bus_reset,
3566        .eh_host_reset_handler  = adpt_reset,
3567        .bios_param             = adpt_bios_param,
3568        .slave_configure        = adpt_slave_configure,
3569        .can_queue              = MAX_TO_IOP_MESSAGES,
3570        .this_id                = 7,
3571        .use_clustering         = ENABLE_CLUSTERING,
3572};
3573
3574static int __init adpt_init(void)
3575{
3576        int             error;
3577        adpt_hba        *pHba, *next;
3578
3579        printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
3580
3581        error = adpt_detect(&driver_template);
3582        if (error < 0)
3583                return error;
3584        if (hba_chain == NULL)
3585                return -ENODEV;
3586
3587        for (pHba = hba_chain; pHba; pHba = pHba->next) {
3588                error = scsi_add_host(pHba->host, &pHba->pDev->dev);
3589                if (error)
3590                        goto fail;
3591                scsi_scan_host(pHba->host);
3592        }
3593        return 0;
3594fail:
3595        for (pHba = hba_chain; pHba; pHba = next) {
3596                next = pHba->next;
3597                scsi_remove_host(pHba->host);
3598        }
3599        return error;
3600}
3601
3602static void __exit adpt_exit(void)
3603{
3604        adpt_hba        *pHba, *next;
3605
3606        for (pHba = hba_chain; pHba; pHba = pHba->next)
3607                scsi_remove_host(pHba->host);
3608        for (pHba = hba_chain; pHba; pHba = next) {
3609                next = pHba->next;
3610                adpt_release(pHba->host);
3611        }
3612}
3613
3614module_init(adpt_init);
3615module_exit(adpt_exit);
3616
3617MODULE_LICENSE("GPL");
3618