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