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