1 /**************************************************************************
 
   2  * Initio 9100 device driver for Linux.
 
   4  * Copyright (c) 1994-1998 Initio Corporation
 
   5  * Copyright (c) 1998 Bas Vermeulen <bvermeul@blackstar.xs4all.nl>
 
   6  * Copyright (c) 2004 Christoph Hellwig <hch@lst.de>
 
   7  * Copyright (c) 2007 Red Hat <alan@redhat.com>
 
   9  * This program is free software; you can redistribute it and/or modify
 
  10  * it under the terms of the GNU General Public License as published by
 
  11  * the Free Software Foundation; either version 2, or (at your option)
 
  14  * This program is distributed in the hope that it will be useful,
 
  15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  17  * GNU General Public License for more details.
 
  19  * You should have received a copy of the GNU General Public License
 
  20  * along with this program; see the file COPYING.  If not, write to
 
  21  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 
  24  *************************************************************************
 
  28  * This is the Linux low-level SCSI driver for Initio INI-9X00U/UW SCSI host
 
  31  * 08/06/97 hc  - v1.01h
 
  32  *              - Support inic-940 and inic-935
 
  33  * 09/26/97 hc  - v1.01i
 
  34  *              - Make correction from J.W. Schultz suggestion
 
  35  * 10/13/97 hc  - Support reset function
 
  36  * 10/21/97 hc  - v1.01j
 
  37  *              - Support 32 LUN (SCSI 3)
 
  38  * 01/14/98 hc  - v1.01k
 
  39  *              - Fix memory allocation problem
 
  40  * 03/04/98 hc  - v1.01l
 
  41  *              - Fix tape rewind which will hang the system problem
 
  42  *              - Set can_queue to initio_num_scb
 
  43  * 06/25/98 hc  - v1.01m
 
  44  *              - Get it work for kernel version >= 2.1.75
 
  45  *              - Dynamic assign SCSI bus reset holding time in initio_init()
 
  46  * 07/02/98 hc  - v1.01n
 
  48  * 08/07/98 hc  - v1.01o
 
  49  *              - Change the initio_abort_srb routine to use scsi_done. <01>
 
  51  *              - Change the INI9100U define and proc_dir_entry to
 
  52  *                reflect the newer Kernel 2.1.118, but the v1.o1o
 
  53  *                should work with Kernel 2.1.118.
 
  54  * 09/20/98 wh  - v1.02a
 
  55  *              - Support Abort command.
 
  56  *              - Handle reset routine.
 
  59  * 12/09/98 bv  - v1.03a
 
  60  *              - Removed unused code
 
  61  * 12/13/98 bv  - v1.03b
 
  62  *              - Remove cli() locking for kernels >= 2.1.95. This uses
 
  63  *                spinlocks to serialize access to the pSRB_head and
 
  64  *                pSRB_tail members of the HCS structure.
 
  65  * 09/01/99 bv  - v1.03d
 
  66  *              - Fixed a deadlock problem in SMP.
 
  67  * 21/01/99 bv  - v1.03e
 
  68  *              - Add support for the Domex 3192U PCI SCSI
 
  69  *                This is a slightly modified patch by
 
  70  *                Brian Macy <bmacy@sunshinecomputing.com>
 
  71  * 22/02/99 bv  - v1.03f
 
  72  *              - Didn't detect the INIC-950 in 2.0.x correctly.
 
  74  * 05/07/99 bv  - v1.03g
 
  75  *              - Changed the assumption that HZ = 100
 
  77  *              - added new DMA API support
 
  78  * 06/01/04 jmd - v1.04a
 
  79  *              - Re-add reset_bus support
 
  80  **************************************************************************/
 
  82 #include <linux/module.h>
 
  83 #include <linux/errno.h>
 
  84 #include <linux/delay.h>
 
  85 #include <linux/pci.h>
 
  86 #include <linux/init.h>
 
  87 #include <linux/blkdev.h>
 
  88 #include <linux/spinlock.h>
 
  89 #include <linux/stat.h>
 
  90 #include <linux/kernel.h>
 
  91 #include <linux/proc_fs.h>
 
  92 #include <linux/string.h>
 
  93 #include <linux/interrupt.h>
 
  94 #include <linux/ioport.h>
 
  95 #include <linux/slab.h>
 
  96 #include <linux/jiffies.h>
 
  97 #include <linux/dma-mapping.h>
 
 100 #include <scsi/scsi.h>
 
 101 #include <scsi/scsi_cmnd.h>
 
 102 #include <scsi/scsi_device.h>
 
 103 #include <scsi/scsi_host.h>
 
 104 #include <scsi/scsi_tcq.h>
 
 108 #define SENSE_SIZE              14
 
 110 #define i91u_MAXQUEUE           2
 
 111 #define i91u_REVID "Initio INI-9X00U/UW SCSI device driver; Revision: 1.04a"
 
 113 #define I950_DEVICE_ID  0x9500  /* Initio's inic-950 product ID   */
 
 114 #define I940_DEVICE_ID  0x9400  /* Initio's inic-940 product ID   */
 
 115 #define I935_DEVICE_ID  0x9401  /* Initio's inic-935 product ID   */
 
 116 #define I920_DEVICE_ID  0x0002  /* Initio's other product ID      */
 
 119 static unsigned int i91u_debug = DEBUG_DEFAULT;
 
 122 static int initio_tag_enable = 1;
 
 125 static int setup_debug = 0;
 
 128 static void i91uSCBPost(u8 * pHcb, u8 * pScb);
 
 130 /* PCI Devices supported by this driver */
 
 131 static struct pci_device_id i91u_pci_devices[] = {
 
 132         { PCI_VENDOR_ID_INIT,  I950_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
 133         { PCI_VENDOR_ID_INIT,  I940_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
 134         { PCI_VENDOR_ID_INIT,  I935_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
 135         { PCI_VENDOR_ID_INIT,  I920_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
 136         { PCI_VENDOR_ID_DOMEX, I920_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
 139 MODULE_DEVICE_TABLE(pci, i91u_pci_devices);
 
 141 #define DEBUG_INTERRUPT 0
 
 142 #define DEBUG_QUEUE     0
 
 143 #define DEBUG_STATE     0
 
 146 /*--- forward references ---*/
 
 147 static struct scsi_ctrl_blk *initio_find_busy_scb(struct initio_host * host, u16 tarlun);
 
 148 static struct scsi_ctrl_blk *initio_find_done_scb(struct initio_host * host);
 
 150 static int tulip_main(struct initio_host * host);
 
 152 static int initio_next_state(struct initio_host * host);
 
 153 static int initio_state_1(struct initio_host * host);
 
 154 static int initio_state_2(struct initio_host * host);
 
 155 static int initio_state_3(struct initio_host * host);
 
 156 static int initio_state_4(struct initio_host * host);
 
 157 static int initio_state_5(struct initio_host * host);
 
 158 static int initio_state_6(struct initio_host * host);
 
 159 static int initio_state_7(struct initio_host * host);
 
 160 static int initio_xfer_data_in(struct initio_host * host);
 
 161 static int initio_xfer_data_out(struct initio_host * host);
 
 162 static int initio_xpad_in(struct initio_host * host);
 
 163 static int initio_xpad_out(struct initio_host * host);
 
 164 static int initio_status_msg(struct initio_host * host);
 
 166 static int initio_msgin(struct initio_host * host);
 
 167 static int initio_msgin_sync(struct initio_host * host);
 
 168 static int initio_msgin_accept(struct initio_host * host);
 
 169 static int initio_msgout_reject(struct initio_host * host);
 
 170 static int initio_msgin_extend(struct initio_host * host);
 
 172 static int initio_msgout_ide(struct initio_host * host);
 
 173 static int initio_msgout_abort_targ(struct initio_host * host);
 
 174 static int initio_msgout_abort_tag(struct initio_host * host);
 
 176 static int initio_bus_device_reset(struct initio_host * host);
 
 177 static void initio_select_atn(struct initio_host * host, struct scsi_ctrl_blk * scb);
 
 178 static void initio_select_atn3(struct initio_host * host, struct scsi_ctrl_blk * scb);
 
 179 static void initio_select_atn_stop(struct initio_host * host, struct scsi_ctrl_blk * scb);
 
 180 static int int_initio_busfree(struct initio_host * host);
 
 181 static int int_initio_scsi_rst(struct initio_host * host);
 
 182 static int int_initio_bad_seq(struct initio_host * host);
 
 183 static int int_initio_resel(struct initio_host * host);
 
 184 static int initio_sync_done(struct initio_host * host);
 
 185 static int wdtr_done(struct initio_host * host);
 
 186 static int wait_tulip(struct initio_host * host);
 
 187 static int initio_wait_done_disc(struct initio_host * host);
 
 188 static int initio_wait_disc(struct initio_host * host);
 
 189 static void tulip_scsi(struct initio_host * host);
 
 190 static int initio_post_scsi_rst(struct initio_host * host);
 
 192 static void initio_se2_ew_en(unsigned long base);
 
 193 static void initio_se2_ew_ds(unsigned long base);
 
 194 static int initio_se2_rd_all(unsigned long base);
 
 195 static void initio_se2_update_all(unsigned long base);  /* setup default pattern */
 
 196 static void initio_read_eeprom(unsigned long base);
 
 198 /* ---- INTERNAL VARIABLES ---- */
 
 200 static NVRAM i91unvram;
 
 201 static NVRAM *i91unvramp;
 
 203 static u8 i91udftNvRam[64] =
 
 205         /*----------- header -----------*/
 
 206         0x25, 0xc9,             /* Signature    */
 
 209         /* -- Host Adapter Structure -- */
 
 210         0x95,                   /* ModelByte0   */
 
 211         0x00,                   /* ModelByte1   */
 
 212         0x00,                   /* ModelInfo    */
 
 214         NBC1_DEFAULT,           /* BIOSConfig1  */
 
 218         /* SCSI channel 0 and target Structure  */
 
 220         NCC1_DEFAULT,           /* SCSIconfig1  */
 
 222         0x10,                   /* NumSCSItarget */
 
 224         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 225         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 226         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 227         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 229         /* SCSI channel 1 and target Structure  */
 
 231         NCC1_DEFAULT,           /* SCSIconfig1  */
 
 233         0x10,                   /* NumSCSItarget */
 
 235         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 236         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 237         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 238         NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT, NTC_DEFAULT,
 
 239         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
 240         0, 0};                  /*      - CheckSum -            */
 
 243 static u8 initio_rate_tbl[8] =  /* fast 20      */
 
 245                                 /* nanosecond devide by 4 */
 
 247         18,                     /* 75ns,  13.3M */
 
 250         37,                     /* 150ns, 6.6M  */
 
 251         43,                     /* 175ns, 5.7M  */
 
 256 static void initio_do_pause(unsigned amount)
 
 258         /* Pause for amount jiffies */
 
 259         unsigned long the_time = jiffies + amount;
 
 261         while (time_before_eq(jiffies, the_time))
 
 265 /*-- forward reference --*/
 
 267 /******************************************************************
 
 268  Input: instruction for  Serial E2PROM
 
 270  EX: se2_rd(0 call se2_instr() to send address and read command
 
 272          StartBit  OP_Code   Address                Data
 
 273          --------- --------  ------------------     -------
 
 274          1         1 , 0     A5,A4,A3,A2,A1,A0      D15-D0
 
 276                  +-----------------------------------------------------
 
 279                         +--+  +--+  +--+  +--+  +--+
 
 282  CLK -------+  +--+  +--+  +--+  +--+  +--
 
 283  (leading edge trigger)
 
 287  DI  ----+           +--0------------------
 
 288  (address and cmd sent to nvram)
 
 290          -------------------------------------------+
 
 293  (data sent from nvram)
 
 296 ******************************************************************/
 
 299  *      initio_se2_instr        -       bitbang an instruction
 
 300  *      @base: Base of InitIO controller
 
 301  *      @instr: Instruction for serial E2PROM
 
 303  *      Bitbang an instruction out to the serial E2Prom
 
 306 static void initio_se2_instr(unsigned long base, u8 instr)
 
 311         outb(SE2CS | SE2DO, base + TUL_NVRAM);          /* cs+start bit */
 
 313         outb(SE2CS | SE2CLK | SE2DO, base + TUL_NVRAM); /* +CLK */
 
 316         for (i = 0; i < 8; i++) {
 
 318                         b = SE2CS | SE2DO;              /* -CLK+dataBit */
 
 320                         b = SE2CS;                      /* -CLK */
 
 321                 outb(b, base + TUL_NVRAM);
 
 323                 outb(b | SE2CLK, base + TUL_NVRAM);     /* +CLK */
 
 327         outb(SE2CS, base + TUL_NVRAM);                  /* -CLK */
 
 333  *      initio_se2_ew_en        -       Enable erase/write
 
 334  *      @base: Base address of InitIO controller
 
 336  *      Enable erase/write state of serial EEPROM
 
 338 void initio_se2_ew_en(unsigned long base)
 
 340         initio_se2_instr(base, 0x30);   /* EWEN */
 
 341         outb(0, base + TUL_NVRAM);      /* -CS  */
 
 347  *      initio_se2_ew_ds        -       Disable erase/write
 
 348  *      @base: Base address of InitIO controller
 
 350  *      Disable erase/write state of serial EEPROM
 
 352 void initio_se2_ew_ds(unsigned long base)
 
 354         initio_se2_instr(base, 0);      /* EWDS */
 
 355         outb(0, base + TUL_NVRAM);      /* -CS  */
 
 361  *      initio_se2_rd           -       read E2PROM word
 
 362  *      @base: Base of InitIO controller
 
 363  *      @addr: Address of word in E2PROM
 
 365  *      Read a word from the NV E2PROM device
 
 367 static u16 initio_se2_rd(unsigned long base, u8 addr)
 
 373         instr = (u8) (addr | 0x80);
 
 374         initio_se2_instr(base, instr);  /* READ INSTR */
 
 376         for (i = 15; i >= 0; i--) {
 
 377                 outb(SE2CS | SE2CLK, base + TUL_NVRAM); /* +CLK */
 
 379                 outb(SE2CS, base + TUL_NVRAM);          /* -CLK */
 
 381                 /* sample data after the following edge of clock  */
 
 382                 rb = inb(base + TUL_NVRAM);
 
 385                 udelay(30);     /* 6/20/95 */
 
 388         outb(0, base + TUL_NVRAM);              /* no chip select */
 
 394  *      initio_se2_wr           -       read E2PROM word
 
 395  *      @base: Base of InitIO controller
 
 396  *      @addr: Address of word in E2PROM
 
 397  *      @val: Value to write
 
 399  *      Write a word to the NV E2PROM device. Used when recovering from
 
 400  *      a problem with the NV.
 
 402 static void initio_se2_wr(unsigned long base, u8 addr, u16 val)
 
 408         instr = (u8) (addr | 0x40);
 
 409         initio_se2_instr(base, instr);  /* WRITE INSTR */
 
 410         for (i = 15; i >= 0; i--) {
 
 412                         outb(SE2CS | SE2DO, base + TUL_NVRAM);  /* -CLK+dataBit 1 */
 
 414                         outb(SE2CS, base + TUL_NVRAM);          /* -CLK+dataBit 0 */
 
 416                 outb(SE2CS | SE2CLK, base + TUL_NVRAM);         /* +CLK */
 
 420         outb(SE2CS, base + TUL_NVRAM);                          /* -CLK */
 
 422         outb(0, base + TUL_NVRAM);                              /* -CS  */
 
 425         outb(SE2CS, base + TUL_NVRAM);                          /* +CS  */
 
 429                 outb(SE2CS | SE2CLK, base + TUL_NVRAM);         /* +CLK */
 
 431                 outb(SE2CS, base + TUL_NVRAM);                  /* -CLK */
 
 433                 if ((rb = inb(base + TUL_NVRAM)) & SE2DI)
 
 434                         break;  /* write complete */
 
 436         outb(0, base + TUL_NVRAM);                              /* -CS */
 
 440  *      initio_se2_rd_all       -       read hostadapter NV configuration
 
 441  *      @base: Base address of InitIO controller
 
 443  *      Reads the E2PROM data into main memory. Ensures that the checksum
 
 444  *      and header marker are valid. Returns 1 on success -1 on error.
 
 447 static int initio_se2_rd_all(unsigned long base)
 
 453         i91unvramp = &i91unvram;
 
 454         np = (u16 *) i91unvramp;
 
 455         for (i = 0; i < 32; i++)
 
 456                 *np++ = initio_se2_rd(base, i);
 
 458         /* Is signature "ini" ok ? */
 
 459         if (i91unvramp->NVM_Signature != INI_SIGNATURE)
 
 461         /* Is ckecksum ok ? */
 
 462         np = (u16 *) i91unvramp;
 
 463         for (i = 0; i < 31; i++)
 
 465         if (i91unvramp->NVM_CheckSum != chksum)
 
 471  *      initio_se2_update_all           -       Update E2PROM
 
 472  *      @base: Base of InitIO controller
 
 474  *      Update the E2PROM by wrting any changes into the E2PROM
 
 475  *      chip, rewriting the checksum.
 
 477 static void initio_se2_update_all(unsigned long base)
 
 478 {                               /* setup default pattern */
 
 483         i91unvramp = &i91unvram;
 
 484         /* Calculate checksum first */
 
 485         np = (u16 *) i91udftNvRam;
 
 486         for (i = 0; i < 31; i++)
 
 489         initio_se2_ew_en(base); /* Enable write  */
 
 491         np = (u16 *) i91udftNvRam;
 
 492         np1 = (u16 *) i91unvramp;
 
 493         for (i = 0; i < 32; i++, np++, np1++) {
 
 495                         initio_se2_wr(base, i, *np);
 
 497         initio_se2_ew_ds(base); /* Disable write   */
 
 501  *      initio_read_eeprom              -       Retrieve configuration
 
 502  *      @base: Base of InitIO Host Adapter
 
 504  *      Retrieve the host adapter configuration data from E2Prom. If the
 
 505  *      data is invalid then the defaults are used and are also restored
 
 506  *      into the E2PROM. This forms the access point for the SCSI driver
 
 507  *      into the E2PROM layer, the other functions for the E2PROM are all
 
 510  *      Must be called single threaded, uses a shared global area.
 
 513 static void initio_read_eeprom(unsigned long base)
 
 517         i91unvramp = &i91unvram;
 
 518         /* Enable EEProm programming */
 
 519         gctrl = inb(base + TUL_GCTRL);
 
 520         outb(gctrl | TUL_GCTRL_EEPROM_BIT, base + TUL_GCTRL);
 
 521         if (initio_se2_rd_all(base) != 1) {
 
 522                 initio_se2_update_all(base);    /* setup default pattern */
 
 523                 initio_se2_rd_all(base);        /* load again  */
 
 525         /* Disable EEProm programming */
 
 526         gctrl = inb(base + TUL_GCTRL);
 
 527         outb(gctrl & ~TUL_GCTRL_EEPROM_BIT, base + TUL_GCTRL);
 
 531  *      initio_stop_bm          -       stop bus master
 
 532  *      @host: InitIO we are stopping
 
 534  *      Stop any pending DMA operation, aborting the DMA if neccessary
 
 537 static void initio_stop_bm(struct initio_host * host)
 
 540         if (inb(host->addr + TUL_XStatus) & XPEND) {    /* if DMA xfer is pending, abort DMA xfer */
 
 541                 outb(TAX_X_ABT | TAX_X_CLR_FIFO, host->addr + TUL_XCmd);
 
 542                 /* wait Abort DMA xfer done */
 
 543                 while ((inb(host->addr + TUL_Int) & XABT) == 0)
 
 546         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
 550  *      initio_reset_scsi               -       Reset SCSI host controller
 
 551  *      @host: InitIO host to reset
 
 552  *      @seconds: Recovery time
 
 554  *      Perform a full reset of the SCSI subsystem.
 
 557 static int initio_reset_scsi(struct initio_host * host, int seconds)
 
 559         outb(TSC_RST_BUS, host->addr + TUL_SCtrl0);
 
 561         while (!((host->jsint = inb(host->addr + TUL_SInt)) & TSS_SCSIRST_INT))
 
 564         /* reset tulip chip */
 
 565         outb(0, host->addr + TUL_SSignal);
 
 567         /* Stall for a while, wait for target's firmware ready,make it 2 sec ! */
 
 568         /* SONY 5200 tape drive won't work if only stall for 1 sec */
 
 569         /* FIXME: this is a very long busy wait right now */
 
 570         initio_do_pause(seconds * HZ);
 
 572         inb(host->addr + TUL_SInt);
 
 573         return SCSI_RESET_SUCCESS;
 
 577  *      initio_init             -       set up an InitIO host adapter
 
 578  *      @host: InitIO host adapter
 
 579  *      @num_scbs: Number of SCBS
 
 580  *      @bios_addr: BIOS address
 
 582  *      Set up the host adapter and devices according to the configuration
 
 583  *      retrieved from the E2PROM.
 
 585  *      Locking: Calls E2PROM layer code which is not re-enterable so must
 
 586  *      run single threaded for now.
 
 589 static void initio_init(struct initio_host * host, u8 *bios_addr)
 
 595         /* Get E2Prom configuration */
 
 596         initio_read_eeprom(host->addr);
 
 597         if (i91unvramp->NVM_SCSIInfo[0].NVM_NumOfTarg == 8)
 
 602         host->config = i91unvramp->NVM_SCSIInfo[0].NVM_ChConfig1;
 
 604         host->scsi_id = i91unvramp->NVM_SCSIInfo[0].NVM_ChSCSIID;
 
 605         host->idmask = ~(1 << host->scsi_id);
 
 608         /* Enable parity error response */
 
 609         outb(inb(host->addr + TUL_PCMD) | 0x40, host->addr + TUL_PCMD);
 
 612         /* Mask all the interrupt       */
 
 613         outb(0x1F, host->addr + TUL_Mask);
 
 615         initio_stop_bm(host);
 
 616         /* --- Initialize the tulip --- */
 
 617         outb(TSC_RST_CHIP, host->addr + TUL_SCtrl0);
 
 619         /* program HBA's SCSI ID        */
 
 620         outb(host->scsi_id << 4, host->addr + TUL_SScsiId);
 
 622         /* Enable Initiator Mode ,phase latch,alternate sync period mode,
 
 623            disable SCSI reset */
 
 624         if (host->config & HCC_EN_PAR)
 
 625                 host->sconf1 = (TSC_INITDEFAULT | TSC_EN_SCSI_PAR);
 
 627                 host->sconf1 = (TSC_INITDEFAULT);
 
 628         outb(host->sconf1, host->addr + TUL_SConfig);
 
 630         /* Enable HW reselect */
 
 631         outb(TSC_HW_RESELECT, host->addr + TUL_SCtrl1);
 
 633         outb(0, host->addr + TUL_SPeriod);
 
 635         /* selection time out = 250 ms */
 
 636         outb(153, host->addr + TUL_STimeOut);
 
 638         /* Enable SCSI terminator */
 
 639         outb((host->config & (HCC_ACT_TERM1 | HCC_ACT_TERM2)),
 
 640                 host->addr + TUL_XCtrl);
 
 641         outb(((host->config & HCC_AUTO_TERM) >> 4) |
 
 642                 (inb(host->addr + TUL_GCTRL1) & 0xFE),
 
 643                 host->addr + TUL_GCTRL1);
 
 646              flags = & (i91unvramp->NVM_SCSIInfo[0].NVM_Targ0Config),
 
 647              heads = bios_addr + 0x180;
 
 650                 host->targets[i].flags = *flags & ~(TCF_SYNC_DONE | TCF_WDTR_DONE);
 
 651                 if (host->targets[i].flags & TCF_EN_255)
 
 652                         host->targets[i].drv_flags = TCF_DRV_255_63;
 
 654                         host->targets[i].drv_flags = 0;
 
 655                 host->targets[i].js_period = 0;
 
 656                 host->targets[i].sconfig0 = host->sconf1;
 
 657                 host->targets[i].heads = *heads++;
 
 658                 if (host->targets[i].heads == 255)
 
 659                         host->targets[i].drv_flags = TCF_DRV_255_63;
 
 661                         host->targets[i].drv_flags = 0;
 
 662                 host->targets[i].sectors = *heads++;
 
 663                 host->targets[i].flags &= ~TCF_BUSY;
 
 664                 host->act_tags[i] = 0;
 
 665                 host->max_tags[i] = 0xFF;
 
 667         printk("i91u: PCI Base=0x%04X, IRQ=%d, BIOS=0x%04X0, SCSI ID=%d\n",
 
 668                host->addr, host->pci_dev->irq,
 
 669                host->bios_addr, host->scsi_id);
 
 671         if (host->config & HCC_SCSI_RESET) {
 
 672                 printk(KERN_INFO "i91u: Reset SCSI Bus ... \n");
 
 673                 initio_reset_scsi(host, 10);
 
 675         outb(0x17, host->addr + TUL_SCFG1);
 
 676         outb(0xE9, host->addr + TUL_SIntEnable);
 
 680  *      initio_alloc_scb                -       Allocate an SCB
 
 681  *      @host: InitIO host we are allocating for
 
 683  *      Walk the SCB list for the controller and allocate a free SCB if
 
 686 static struct scsi_ctrl_blk *initio_alloc_scb(struct initio_host *host)
 
 688         struct scsi_ctrl_blk *scb;
 
 691         spin_lock_irqsave(&host->avail_lock, flags);
 
 692         if ((scb = host->first_avail) != NULL) {
 
 694                 printk("find scb at %p\n", scb);
 
 696                 if ((host->first_avail = scb->next) == NULL)
 
 697                         host->last_avail = NULL;
 
 699                 scb->status = SCB_RENT;
 
 701         spin_unlock_irqrestore(&host->avail_lock, flags);
 
 706  *      initio_release_scb              -       Release an SCB
 
 707  *      @host: InitIO host that owns the SCB
 
 708  *      @cmnd: SCB command block being returned
 
 710  *      Return an allocated SCB to the host free list
 
 713 static void initio_release_scb(struct initio_host * host, struct scsi_ctrl_blk * cmnd)
 
 718         printk("Release SCB %p; ", cmnd);
 
 720         spin_lock_irqsave(&(host->avail_lock), flags);
 
 724         if (host->last_avail != NULL) {
 
 725                 host->last_avail->next = cmnd;
 
 726                 host->last_avail = cmnd;
 
 728                 host->first_avail = cmnd;
 
 729                 host->last_avail = cmnd;
 
 731         spin_unlock_irqrestore(&(host->avail_lock), flags);
 
 734 /***************************************************************************/
 
 735 static void initio_append_pend_scb(struct initio_host * host, struct scsi_ctrl_blk * scbp)
 
 739         printk("Append pend SCB %p; ", scbp);
 
 741         scbp->status = SCB_PEND;
 
 743         if (host->last_pending != NULL) {
 
 744                 host->last_pending->next = scbp;
 
 745                 host->last_pending = scbp;
 
 747                 host->first_pending = scbp;
 
 748                 host->last_pending = scbp;
 
 752 /***************************************************************************/
 
 753 static void initio_push_pend_scb(struct initio_host * host, struct scsi_ctrl_blk * scbp)
 
 757         printk("Push pend SCB %p; ", scbp);
 
 759         scbp->status = SCB_PEND;
 
 760         if ((scbp->next = host->first_pending) != NULL) {
 
 761                 host->first_pending = scbp;
 
 763                 host->first_pending = scbp;
 
 764                 host->last_pending = scbp;
 
 768 static struct scsi_ctrl_blk *initio_find_first_pend_scb(struct initio_host * host)
 
 770         struct scsi_ctrl_blk *first;
 
 773         first = host->first_pending;
 
 774         while (first != NULL) {
 
 775                 if (first->opcode != ExecSCSI)
 
 777                 if (first->tagmsg == 0) {
 
 778                         if ((host->act_tags[first->target] == 0) &&
 
 779                             !(host->targets[first->target].flags & TCF_BUSY))
 
 782                         if ((host->act_tags[first->target] >=
 
 783                           host->max_tags[first->target]) |
 
 784                             (host->targets[first->target].flags & TCF_BUSY)) {
 
 795 static void initio_unlink_pend_scb(struct initio_host * host, struct scsi_ctrl_blk * scb)
 
 797         struct scsi_ctrl_blk *tmp, *prev;
 
 800         printk("unlink pend SCB %p; ", scb);
 
 803         prev = tmp = host->first_pending;
 
 804         while (tmp != NULL) {
 
 805                 if (scb == tmp) {       /* Unlink this SCB              */
 
 806                         if (tmp == host->first_pending) {
 
 807                                 if ((host->first_pending = tmp->next) == NULL)
 
 808                                         host->last_pending = NULL;
 
 810                                 prev->next = tmp->next;
 
 811                                 if (tmp == host->last_pending)
 
 812                                         host->last_pending = prev;
 
 822 static void initio_append_busy_scb(struct initio_host * host, struct scsi_ctrl_blk * scbp)
 
 826         printk("append busy SCB %p; ", scbp);
 
 829                 host->act_tags[scbp->target]++;
 
 831                 host->targets[scbp->target].flags |= TCF_BUSY;
 
 832         scbp->status = SCB_BUSY;
 
 834         if (host->last_busy != NULL) {
 
 835                 host->last_busy->next = scbp;
 
 836                 host->last_busy = scbp;
 
 838                 host->first_busy = scbp;
 
 839                 host->last_busy = scbp;
 
 843 /***************************************************************************/
 
 844 static struct scsi_ctrl_blk *initio_pop_busy_scb(struct initio_host * host)
 
 846         struct scsi_ctrl_blk *tmp;
 
 849         if ((tmp = host->first_busy) != NULL) {
 
 850                 if ((host->first_busy = tmp->next) == NULL)
 
 851                         host->last_busy = NULL;
 
 854                         host->act_tags[tmp->target]--;
 
 856                         host->targets[tmp->target].flags &= ~TCF_BUSY;
 
 859         printk("Pop busy SCB %p; ", tmp);
 
 864 /***************************************************************************/
 
 865 static void initio_unlink_busy_scb(struct initio_host * host, struct scsi_ctrl_blk * scb)
 
 867         struct scsi_ctrl_blk *tmp, *prev;
 
 870         printk("unlink busy SCB %p; ", scb);
 
 873         prev = tmp = host->first_busy;
 
 874         while (tmp != NULL) {
 
 875                 if (scb == tmp) {       /* Unlink this SCB              */
 
 876                         if (tmp == host->first_busy) {
 
 877                                 if ((host->first_busy = tmp->next) == NULL)
 
 878                                         host->last_busy = NULL;
 
 880                                 prev->next = tmp->next;
 
 881                                 if (tmp == host->last_busy)
 
 882                                         host->last_busy = prev;
 
 886                                 host->act_tags[tmp->target]--;
 
 888                                 host->targets[tmp->target].flags &= ~TCF_BUSY;
 
 897 struct scsi_ctrl_blk *initio_find_busy_scb(struct initio_host * host, u16 tarlun)
 
 899         struct scsi_ctrl_blk *tmp, *prev;
 
 903         prev = tmp = host->first_busy;
 
 904         while (tmp != NULL) {
 
 905                 scbp_tarlun = (tmp->lun << 8) | (tmp->target);
 
 906                 if (scbp_tarlun == tarlun) {    /* Unlink this SCB              */
 
 913         printk("find busy SCB %p; ", tmp);
 
 918 static void initio_append_done_scb(struct initio_host * host, struct scsi_ctrl_blk * scbp)
 
 921         printk("append done SCB %p; ", scbp);
 
 924         scbp->status = SCB_DONE;
 
 926         if (host->last_done != NULL) {
 
 927                 host->last_done->next = scbp;
 
 928                 host->last_done = scbp;
 
 930                 host->first_done = scbp;
 
 931                 host->last_done = scbp;
 
 935 struct scsi_ctrl_blk *initio_find_done_scb(struct initio_host * host)
 
 937         struct scsi_ctrl_blk *tmp;
 
 939         if ((tmp = host->first_done) != NULL) {
 
 940                 if ((host->first_done = tmp->next) == NULL)
 
 941                         host->last_done = NULL;
 
 945         printk("find done SCB %p; ",tmp);
 
 950 static int initio_abort_srb(struct initio_host * host, struct scsi_cmnd *srbp)
 
 953         struct scsi_ctrl_blk *tmp, *prev;
 
 955         spin_lock_irqsave(&host->semaph_lock, flags);
 
 957         if ((host->semaph == 0) && (host->active == NULL)) {
 
 958                 /* disable Jasmin SCSI Int        */
 
 959                 outb(0x1F, host->addr + TUL_Mask);
 
 960                 spin_unlock_irqrestore(&host->semaph_lock, flags);
 
 961                 /* FIXME: synchronize_irq needed ? */
 
 963                 spin_lock_irqsave(&host->semaph_lock, flags);
 
 965                 outb(0x0F, host->addr + TUL_Mask);
 
 966                 spin_unlock_irqrestore(&host->semaph_lock, flags);
 
 967                 return SCSI_ABORT_SNOOZE;
 
 969         prev = tmp = host->first_pending;       /* Check Pend queue */
 
 970         while (tmp != NULL) {
 
 972                 if (tmp->srb == srbp) {
 
 973                         if (tmp == host->active) {
 
 974                                 spin_unlock_irqrestore(&host->semaph_lock, flags);
 
 975                                 return SCSI_ABORT_BUSY;
 
 976                         } else if (tmp == host->first_pending) {
 
 977                                 if ((host->first_pending = tmp->next) == NULL)
 
 978                                         host->last_pending = NULL;
 
 980                                 prev->next = tmp->next;
 
 981                                 if (tmp == host->last_pending)
 
 982                                         host->last_pending = prev;
 
 984                         tmp->hastat = HOST_ABORTED;
 
 985                         tmp->flags |= SCF_DONE;
 
 986                         if (tmp->flags & SCF_POST)
 
 987                                 (*tmp->post) ((u8 *) host, (u8 *) tmp);
 
 988                         spin_unlock_irqrestore(&host->semaph_lock, flags);
 
 989                         return SCSI_ABORT_SUCCESS;
 
 995         prev = tmp = host->first_busy;  /* Check Busy queue */
 
 996         while (tmp != NULL) {
 
 997                 if (tmp->srb == srbp) {
 
 998                         if (tmp == host->active) {
 
 999                                 spin_unlock_irqrestore(&host->semaph_lock, flags);
 
1000                                 return SCSI_ABORT_BUSY;
 
1001                         } else if (tmp->tagmsg == 0) {
 
1002                                 spin_unlock_irqrestore(&host->semaph_lock, flags);
 
1003                                 return SCSI_ABORT_BUSY;
 
1005                                 host->act_tags[tmp->target]--;
 
1006                                 if (tmp == host->first_busy) {
 
1007                                         if ((host->first_busy = tmp->next) == NULL)
 
1008                                                 host->last_busy = NULL;
 
1010                                         prev->next = tmp->next;
 
1011                                         if (tmp == host->last_busy)
 
1012                                                 host->last_busy = prev;
 
1017                                 tmp->hastat = HOST_ABORTED;
 
1018                                 tmp->flags |= SCF_DONE;
 
1019                                 if (tmp->flags & SCF_POST)
 
1020                                         (*tmp->post) ((u8 *) host, (u8 *) tmp);
 
1021                                 spin_unlock_irqrestore(&host->semaph_lock, flags);
 
1022                                 return SCSI_ABORT_SUCCESS;
 
1028         spin_unlock_irqrestore(&host->semaph_lock, flags);
 
1029         return SCSI_ABORT_NOT_RUNNING;
 
1032 /***************************************************************************/
 
1033 static int initio_bad_seq(struct initio_host * host)
 
1035         struct scsi_ctrl_blk *scb;
 
1037         printk("initio_bad_seg c=%d\n", host->index);
 
1039         if ((scb = host->active) != NULL) {
 
1040                 initio_unlink_busy_scb(host, scb);
 
1041                 scb->hastat = HOST_BAD_PHAS;
 
1043                 initio_append_done_scb(host, scb);
 
1045         initio_stop_bm(host);
 
1046         initio_reset_scsi(host, 8);     /* 7/29/98 */
 
1047         return initio_post_scsi_rst(host);
 
1051 /************************************************************************/
 
1052 static void initio_exec_scb(struct initio_host * host, struct scsi_ctrl_blk * scb)
 
1054         unsigned long flags;
 
1059         scb->sgmax = scb->sglen;
 
1061         spin_lock_irqsave(&host->semaph_lock, flags);
 
1063         initio_append_pend_scb(host, scb);      /* Append this SCB to Pending queue */
 
1065 /* VVVVV 07/21/98 */
 
1066         if (host->semaph == 1) {
 
1067                 /* Disable Jasmin SCSI Int */
 
1068                 outb(0x1F, host->addr + TUL_Mask);
 
1070                 spin_unlock_irqrestore(&host->semaph_lock, flags);
 
1074                 spin_lock_irqsave(&host->semaph_lock, flags);
 
1076                 outb(0x0F, host->addr + TUL_Mask);
 
1078         spin_unlock_irqrestore(&host->semaph_lock, flags);
 
1082 /***************************************************************************/
 
1083 static int initio_isr(struct initio_host * host)
 
1085         if (inb(host->addr + TUL_Int) & TSS_INT_PENDING) {
 
1086                 if (host->semaph == 1) {
 
1087                         outb(0x1F, host->addr + TUL_Mask);
 
1088                         /* Disable Tulip SCSI Int */
 
1094                         outb(0x0F, host->addr + TUL_Mask);
 
1101 static int tulip_main(struct initio_host * host)
 
1103         struct scsi_ctrl_blk *scb;
 
1106                 tulip_scsi(host);       /* Call tulip_scsi              */
 
1108                 /* Walk the list of completed SCBs */
 
1109                 while ((scb = initio_find_done_scb(host)) != NULL) {    /* find done entry */
 
1110                         if (scb->tastat == INI_QUEUE_FULL) {
 
1111                                 host->max_tags[scb->target] =
 
1112                                     host->act_tags[scb->target] - 1;
 
1114                                 initio_append_pend_scb(host, scb);
 
1117                         if (!(scb->mode & SCM_RSENS)) {         /* not in auto req. sense mode */
 
1118                                 if (scb->tastat == 2) {
 
1120                                         /* clr sync. nego flag */
 
1122                                         if (scb->flags & SCF_SENSE) {
 
1124                                                 len = scb->senselen;
 
1127                                                 scb->buflen = scb->senselen;
 
1128                                                 scb->bufptr = scb->senseptr;
 
1129                                                 scb->flags &= ~(SCF_SG | SCF_DIR);      /* for xfer_data_in */
 
1130                                                 /* so, we won't report wrong direction in xfer_data_in,
 
1131                                                    and won't report HOST_DO_DU in state_6 */
 
1132                                                 scb->mode = SCM_RSENS;
 
1133                                                 scb->ident &= 0xBF;     /* Disable Disconnect */
 
1137                                                 scb->cdb[0] = SCSICMD_RequestSense;
 
1143                                                 initio_push_pend_scb(host, scb);
 
1147                         } else {        /* in request sense mode */
 
1149                                 if (scb->tastat == 2) {         /* check contition status again after sending
 
1150                                                                            requset sense cmd 0x3 */
 
1151                                         scb->hastat = HOST_BAD_PHAS;
 
1155                         scb->flags |= SCF_DONE;
 
1156                         if (scb->flags & SCF_POST) {
 
1157                                 /* FIXME: only one post method and lose casts */
 
1158                                 (*scb->post) ((u8 *) host, (u8 *) scb);
 
1162                 if (inb(host->addr + TUL_SStatus0) & TSS_INT_PENDING)
 
1164                 if (host->active)       /* return to OS and wait for xfer_done_ISR/Selected_ISR */
 
1165                         return 1;       /* return to OS, enable interrupt */
 
1166                 /* Check pending SCB            */
 
1167                 if (initio_find_first_pend_scb(host) == NULL)
 
1168                         return 1;       /* return to OS, enable interrupt */
 
1169         }                       /* End of for loop */
 
1170         /* statement won't reach here */
 
1173 static void tulip_scsi(struct initio_host * host)
 
1175         struct scsi_ctrl_blk *scb;
 
1176         struct target_control *active_tc;
 
1178         /* make sure to service interrupt asap */
 
1179         if ((host->jsstatus0 = inb(host->addr + TUL_SStatus0)) & TSS_INT_PENDING) {
 
1180                 host->phase = host->jsstatus0 & TSS_PH_MASK;
 
1181                 host->jsstatus1 = inb(host->addr + TUL_SStatus1);
 
1182                 host->jsint = inb(host->addr + TUL_SInt);
 
1183                 if (host->jsint & TSS_SCSIRST_INT) {    /* SCSI bus reset detected      */
 
1184                         int_initio_scsi_rst(host);
 
1187                 if (host->jsint & TSS_RESEL_INT) {      /* if selected/reselected interrupt */
 
1188                         if (int_initio_resel(host) == 0)
 
1189                                 initio_next_state(host);
 
1192                 if (host->jsint & TSS_SEL_TIMEOUT) {
 
1193                         int_initio_busfree(host);
 
1196                 if (host->jsint & TSS_DISC_INT) {       /* BUS disconnection            */
 
1197                         int_initio_busfree(host);       /* unexpected bus free or sel timeout */
 
1200                 if (host->jsint & (TSS_FUNC_COMP | TSS_BUS_SERV)) {     /* func complete or Bus service */
 
1201                         if ((scb = host->active) != NULL)
 
1202                                 initio_next_state(host);
 
1206         if (host->active != NULL)
 
1209         if ((scb = initio_find_first_pend_scb(host)) == NULL)
 
1212         /* program HBA's SCSI ID & target SCSI ID */
 
1213         outb((host->scsi_id << 4) | (scb->target & 0x0F),
 
1214                 host->addr + TUL_SScsiId);
 
1215         if (scb->opcode == ExecSCSI) {
 
1216                 active_tc = &host->targets[scb->target];
 
1219                         active_tc->drv_flags |= TCF_DRV_EN_TAG;
 
1221                         active_tc->drv_flags &= ~TCF_DRV_EN_TAG;
 
1223                 outb(active_tc->js_period, host->addr + TUL_SPeriod);
 
1224                 if ((active_tc->flags & (TCF_WDTR_DONE | TCF_NO_WDTR)) == 0) {  /* do wdtr negotiation          */
 
1225                         initio_select_atn_stop(host, scb);
 
1227                         if ((active_tc->flags & (TCF_SYNC_DONE | TCF_NO_SYNC_NEGO)) == 0) {     /* do sync negotiation          */
 
1228                                 initio_select_atn_stop(host, scb);
 
1231                                         initio_select_atn3(host, scb);
 
1233                                         initio_select_atn(host, scb);
 
1236                 if (scb->flags & SCF_POLL) {
 
1237                         while (wait_tulip(host) != -1) {
 
1238                                 if (initio_next_state(host) == -1)
 
1242         } else if (scb->opcode == BusDevRst) {
 
1243                 initio_select_atn_stop(host, scb);
 
1244                 scb->next_state = 8;
 
1245                 if (scb->flags & SCF_POLL) {
 
1246                         while (wait_tulip(host) != -1) {
 
1247                                 if (initio_next_state(host) == -1)
 
1251         } else if (scb->opcode == AbortCmd) {
 
1252                 if (initio_abort_srb(host, scb->srb) != 0) {
 
1253                         initio_unlink_pend_scb(host, scb);
 
1254                         initio_release_scb(host, scb);
 
1256                         scb->opcode = BusDevRst;
 
1257                         initio_select_atn_stop(host, scb);
 
1258                         scb->next_state = 8;
 
1261                 initio_unlink_pend_scb(host, scb);
 
1262                 scb->hastat = 0x16;     /* bad command */
 
1263                 initio_append_done_scb(host, scb);
 
1269  *      initio_next_state               -       Next SCSI state
 
1270  *      @host: InitIO host we are processing
 
1272  *      Progress the active command block along the state machine
 
1273  *      until we hit a state which we must wait for activity to occur.
 
1275  *      Returns zero or a negative code.
 
1278 static int initio_next_state(struct initio_host * host)
 
1282         next = host->active->next_state;
 
1286                         next = initio_state_1(host);
 
1289                         next = initio_state_2(host);
 
1292                         next = initio_state_3(host);
 
1295                         next = initio_state_4(host);
 
1298                         next = initio_state_5(host);
 
1301                         next = initio_state_6(host);
 
1304                         next = initio_state_7(host);
 
1307                         return initio_bus_device_reset(host);
 
1309                         return initio_bad_seq(host);
 
1318  *      initio_state_1          -       SCSI state machine
 
1319  *      @host: InitIO host we are controlling
 
1321  *      Perform SCSI state processing for Select/Attention/Stop
 
1324 static int initio_state_1(struct initio_host * host)
 
1326         struct scsi_ctrl_blk *scb = host->active;
 
1327         struct target_control *active_tc = host->active_tc;
 
1332         /* Move the SCB from pending to busy */
 
1333         initio_unlink_pend_scb(host, scb);
 
1334         initio_append_busy_scb(host, scb);
 
1336         outb(active_tc->sconfig0, host->addr + TUL_SConfig );
 
1338         if (host->phase == MSG_OUT) {
 
1339                 outb(TSC_EN_BUS_IN | TSC_HW_RESELECT, host->addr + TUL_SCtrl1);
 
1340                 outb(scb->ident, host->addr + TUL_SFifo);
 
1343                         outb(scb->tagmsg, host->addr + TUL_SFifo);
 
1344                         outb(scb->tagid, host->addr + TUL_SFifo);
 
1346                 if ((active_tc->flags & (TCF_WDTR_DONE | TCF_NO_WDTR)) == 0) {
 
1347                         active_tc->flags |= TCF_WDTR_DONE;
 
1348                         outb(MSG_EXTEND, host->addr + TUL_SFifo);
 
1349                         outb(2, host->addr + TUL_SFifo);        /* Extended msg length */
 
1350                         outb(3, host->addr + TUL_SFifo);        /* Sync request */
 
1351                         outb(1, host->addr + TUL_SFifo);        /* Start from 16 bits */
 
1352                 } else if ((active_tc->flags & (TCF_SYNC_DONE | TCF_NO_SYNC_NEGO)) == 0) {
 
1353                         active_tc->flags |= TCF_SYNC_DONE;
 
1354                         outb(MSG_EXTEND, host->addr + TUL_SFifo);
 
1355                         outb(3, host->addr + TUL_SFifo);        /* extended msg length */
 
1356                         outb(1, host->addr + TUL_SFifo);        /* sync request */
 
1357                         outb(initio_rate_tbl[active_tc->flags & TCF_SCSI_RATE], host->addr + TUL_SFifo);
 
1358                         outb(MAX_OFFSET, host->addr + TUL_SFifo);       /* REQ/ACK offset */
 
1360                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1361                 if (wait_tulip(host) == -1)
 
1364         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1365         outb((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)), host->addr + TUL_SSignal);
 
1366         /* Into before CDB xfer */
 
1372  *      initio_state_2          -       SCSI state machine
 
1373  *      @host: InitIO host we are controlling
 
1375  * state after selection with attention
 
1376  * state after selection with attention3
 
1379 static int initio_state_2(struct initio_host * host)
 
1381         struct scsi_ctrl_blk *scb = host->active;
 
1382         struct target_control *active_tc = host->active_tc;
 
1387         initio_unlink_pend_scb(host, scb);
 
1388         initio_append_busy_scb(host, scb);
 
1390         outb(active_tc->sconfig0, host->addr + TUL_SConfig);
 
1392         if (host->jsstatus1 & TSS_CMD_PH_CMP)
 
1395         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1396         outb((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)), host->addr + TUL_SSignal);
 
1397         /* Into before CDB xfer */
 
1402  *      initio_state_3          -       SCSI state machine
 
1403  *      @host: InitIO host we are controlling
 
1405  * state before CDB xfer is done
 
1408 static int initio_state_3(struct initio_host * host)
 
1410         struct scsi_ctrl_blk *scb = host->active;
 
1411         struct target_control *active_tc = host->active_tc;
 
1418                 switch (host->phase) {
 
1419                 case CMD_OUT:   /* Command out phase            */
 
1420                         for (i = 0; i < (int) scb->cdblen; i++)
 
1421                                 outb(scb->cdb[i], host->addr + TUL_SFifo);
 
1422                         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1423                         if (wait_tulip(host) == -1)
 
1425                         if (host->phase == CMD_OUT)
 
1426                                 return initio_bad_seq(host);
 
1429                 case MSG_IN:    /* Message in phase             */
 
1430                         scb->next_state = 3;
 
1431                         if (initio_msgin(host) == -1)
 
1435                 case STATUS_IN: /* Status phase                 */
 
1436                         if (initio_status_msg(host) == -1)
 
1440                 case MSG_OUT:   /* Message out phase            */
 
1441                         if (active_tc->flags & (TCF_SYNC_DONE | TCF_NO_SYNC_NEGO)) {
 
1442                                 outb(MSG_NOP, host->addr + TUL_SFifo);          /* msg nop */
 
1443                                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1444                                 if (wait_tulip(host) == -1)
 
1447                                 active_tc->flags |= TCF_SYNC_DONE;
 
1449                                 outb(MSG_EXTEND, host->addr + TUL_SFifo);
 
1450                                 outb(3, host->addr + TUL_SFifo);        /* ext. msg len */
 
1451                                 outb(1, host->addr + TUL_SFifo);        /* sync request */
 
1452                                 outb(initio_rate_tbl[active_tc->flags & TCF_SCSI_RATE], host->addr + TUL_SFifo);
 
1453                                 outb(MAX_OFFSET, host->addr + TUL_SFifo);       /* REQ/ACK offset */
 
1454                                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1455                                 if (wait_tulip(host) == -1)
 
1457                                 outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1458                                 outb(inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7), host->addr + TUL_SSignal);
 
1463                         return initio_bad_seq(host);
 
1469  *      initio_state_4          -       SCSI state machine
 
1470  *      @host: InitIO host we are controlling
 
1472  *      SCSI state machine. State 4
 
1475 static int initio_state_4(struct initio_host * host)
 
1477         struct scsi_ctrl_blk *scb = host->active;
 
1482         if ((scb->flags & SCF_DIR) == SCF_NO_XF) {
 
1483                 return 6;       /* Go to state 6 (After data) */
 
1486                 if (scb->buflen == 0)
 
1489                 switch (host->phase) {
 
1491                 case STATUS_IN: /* Status phase                 */
 
1492                         if ((scb->flags & SCF_DIR) != 0)        /* if direction bit set then report data underrun */
 
1493                                 scb->hastat = HOST_DO_DU;
 
1494                         if ((initio_status_msg(host)) == -1)
 
1498                 case MSG_IN:    /* Message in phase             */
 
1499                         scb->next_state = 0x4;
 
1500                         if (initio_msgin(host) == -1)
 
1504                 case MSG_OUT:   /* Message out phase            */
 
1505                         if (host->jsstatus0 & TSS_PAR_ERROR) {
 
1507                                 scb->hastat = HOST_DO_DU;
 
1508                                 if (initio_msgout_ide(host) == -1)
 
1512                                 outb(MSG_NOP, host->addr + TUL_SFifo);          /* msg nop */
 
1513                                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1514                                 if (wait_tulip(host) == -1)
 
1519                 case DATA_IN:   /* Data in phase                */
 
1520                         return initio_xfer_data_in(host);
 
1522                 case DATA_OUT:  /* Data out phase               */
 
1523                         return initio_xfer_data_out(host);
 
1526                         return initio_bad_seq(host);
 
1533  *      initio_state_5          -       SCSI state machine
 
1534  *      @host: InitIO host we are controlling
 
1536  *      State after dma xfer done or phase change before xfer done
 
1539 static int initio_state_5(struct initio_host * host)
 
1541         struct scsi_ctrl_blk *scb = host->active;
 
1542         long cnt, xcnt;         /* cannot use unsigned !! code: if (xcnt < 0) */
 
1547         /*------ get remaining count -------*/
 
1548         cnt = inl(host->addr + TUL_SCnt0) & 0x0FFFFFF;
 
1550         if (inb(host->addr + TUL_XCmd) & 0x20) {
 
1551                 /* ----------------------- DATA_IN ----------------------------- */
 
1552                 /* check scsi parity error */
 
1553                 if (host->jsstatus0 & TSS_PAR_ERROR)
 
1554                         scb->hastat = HOST_DO_DU;
 
1555                 if (inb(host->addr + TUL_XStatus) & XPEND) {    /* DMA xfer pending, Send STOP  */
 
1556                         /* tell Hardware  scsi xfer has been terminated */
 
1557                         outb(inb(host->addr + TUL_XCtrl) | 0x80, host->addr + TUL_XCtrl);
 
1558                         /* wait until DMA xfer not pending */
 
1559                         while (inb(host->addr + TUL_XStatus) & XPEND)
 
1563                 /*-------- DATA OUT -----------*/
 
1564                 if ((inb(host->addr + TUL_SStatus1) & TSS_XFER_CMP) == 0) {
 
1565                         if (host->active_tc->js_period & TSC_WIDE_SCSI)
 
1566                                 cnt += (inb(host->addr + TUL_SFifoCnt) & 0x1F) << 1;
 
1568                                 cnt += (inb(host->addr + TUL_SFifoCnt) & 0x1F);
 
1570                 if (inb(host->addr + TUL_XStatus) & XPEND) {    /* if DMA xfer is pending, abort DMA xfer */
 
1571                         outb(TAX_X_ABT, host->addr + TUL_XCmd);
 
1572                         /* wait Abort DMA xfer done */
 
1573                         while ((inb(host->addr + TUL_Int) & XABT) == 0)
 
1576                 if ((cnt == 1) && (host->phase == DATA_OUT)) {
 
1577                         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1578                         if (wait_tulip(host) == -1)
 
1582                         if ((inb(host->addr + TUL_SStatus1) & TSS_XFER_CMP) == 0)
 
1583                                 outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1588                 return 6;       /* After Data */
 
1590         /* Update active data pointer */
 
1591         xcnt = (long) scb->buflen - cnt;        /* xcnt== bytes already xferred */
 
1592         scb->buflen = (u32) cnt;                /* cnt == bytes left to be xferred */
 
1593         if (scb->flags & SCF_SG) {
 
1594                 struct sg_entry *sgp;
 
1597                 sgp = &scb->sglist[scb->sgidx];
 
1598                 for (i = scb->sgidx; i < scb->sgmax; sgp++, i++) {
 
1599                         xcnt -= (long) sgp->len;
 
1600                         if (xcnt < 0) {         /* this sgp xfer half done */
 
1601                                 xcnt += (long) sgp->len;        /* xcnt == bytes xferred in this sgp */
 
1602                                 sgp->data += (u32) xcnt;        /* new ptr to be xfer */
 
1603                                 sgp->len -= (u32) xcnt; /* new len to be xfer */
 
1604                                 scb->bufptr += ((u32) (i - scb->sgidx) << 3);
 
1605                                 /* new SG table ptr */
 
1606                                 scb->sglen = (u8) (scb->sgmax - i);
 
1607                                 /* new SG table len */
 
1608                                 scb->sgidx = (u16) i;
 
1609                                 /* for next disc and come in this loop */
 
1610                                 return 4;       /* Go to state 4                */
 
1612                         /* else (xcnt >= 0 , i.e. this sgp already xferred */
 
1614                 return 6;       /* Go to state 6                */
 
1616                 scb->bufptr += (u32) xcnt;
 
1618         return 4;               /* Go to state 4                */
 
1622  *      initio_state_6          -       SCSI state machine
 
1623  *      @host: InitIO host we are controlling
 
1625  *      State after Data phase
 
1628 static int initio_state_6(struct initio_host * host)
 
1630         struct scsi_ctrl_blk *scb = host->active;
 
1636                 switch (host->phase) {
 
1637                 case STATUS_IN: /* Status phase                 */
 
1638                         if ((initio_status_msg(host)) == -1)
 
1642                 case MSG_IN:    /* Message in phase             */
 
1643                         scb->next_state = 6;
 
1644                         if ((initio_msgin(host)) == -1)
 
1648                 case MSG_OUT:   /* Message out phase            */
 
1649                         outb(MSG_NOP, host->addr + TUL_SFifo);          /* msg nop */
 
1650                         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1651                         if (wait_tulip(host) == -1)
 
1655                 case DATA_IN:   /* Data in phase                */
 
1656                         return initio_xpad_in(host);
 
1658                 case DATA_OUT:  /* Data out phase               */
 
1659                         return initio_xpad_out(host);
 
1662                         return initio_bad_seq(host);
 
1668  *      initio_state_7          -       SCSI state machine
 
1669  *      @host: InitIO host we are controlling
 
1673 int initio_state_7(struct initio_host * host)
 
1680         /* flush SCSI FIFO */
 
1681         cnt = inb(host->addr + TUL_SFifoCnt) & 0x1F;
 
1683                 for (i = 0; i < cnt; i++)
 
1684                         inb(host->addr + TUL_SFifo);
 
1686         switch (host->phase) {
 
1687         case DATA_IN:           /* Data in phase                */
 
1688         case DATA_OUT:          /* Data out phase               */
 
1689                 return initio_bad_seq(host);
 
1691                 return 6;       /* Go to state 6                */
 
1696  *      initio_xfer_data_in     -       Commence data input
 
1697  *      @host: InitIO host in use
 
1699  *      Commence a block of data transfer. The transfer itself will
 
1700  *      be managed by the controller and we will get a completion (or
 
1701  *      failure) interrupt.
 
1703 static int initio_xfer_data_in(struct initio_host * host)
 
1705         struct scsi_ctrl_blk *scb = host->active;
 
1707         if ((scb->flags & SCF_DIR) == SCF_DOUT)
 
1708                 return 6;       /* wrong direction */
 
1710         outl(scb->buflen, host->addr + TUL_SCnt0);
 
1711         outb(TSC_XF_DMA_IN, host->addr + TUL_SCmd);     /* 7/25/95 */
 
1713         if (scb->flags & SCF_SG) {      /* S/G xfer */
 
1714                 outl(((u32) scb->sglen) << 3, host->addr + TUL_XCntH);
 
1715                 outl(scb->bufptr, host->addr + TUL_XAddH);
 
1716                 outb(TAX_SG_IN, host->addr + TUL_XCmd);
 
1718                 outl(scb->buflen, host->addr + TUL_XCntH);
 
1719                 outl(scb->bufptr, host->addr + TUL_XAddH);
 
1720                 outb(TAX_X_IN, host->addr + TUL_XCmd);
 
1722         scb->next_state = 0x5;
 
1723         return 0;               /* return to OS, wait xfer done , let jas_isr come in */
 
1727  *      initio_xfer_data_out    -       Commence data output
 
1728  *      @host: InitIO host in use
 
1730  *      Commence a block of data transfer. The transfer itself will
 
1731  *      be managed by the controller and we will get a completion (or
 
1732  *      failure) interrupt.
 
1735 static int initio_xfer_data_out(struct initio_host * host)
 
1737         struct scsi_ctrl_blk *scb = host->active;
 
1739         if ((scb->flags & SCF_DIR) == SCF_DIN)
 
1740                 return 6;       /* wrong direction */
 
1742         outl(scb->buflen, host->addr + TUL_SCnt0);
 
1743         outb(TSC_XF_DMA_OUT, host->addr + TUL_SCmd);
 
1745         if (scb->flags & SCF_SG) {      /* S/G xfer */
 
1746                 outl(((u32) scb->sglen) << 3, host->addr + TUL_XCntH);
 
1747                 outl(scb->bufptr, host->addr + TUL_XAddH);
 
1748                 outb(TAX_SG_OUT, host->addr + TUL_XCmd);
 
1750                 outl(scb->buflen, host->addr + TUL_XCntH);
 
1751                 outl(scb->bufptr, host->addr + TUL_XAddH);
 
1752                 outb(TAX_X_OUT, host->addr + TUL_XCmd);
 
1755         scb->next_state = 0x5;
 
1756         return 0;               /* return to OS, wait xfer done , let jas_isr come in */
 
1759 int initio_xpad_in(struct initio_host * host)
 
1761         struct scsi_ctrl_blk *scb = host->active;
 
1762         struct target_control *active_tc = host->active_tc;
 
1764         if ((scb->flags & SCF_DIR) != SCF_NO_DCHK)
 
1765                 scb->hastat = HOST_DO_DU;       /* over run             */
 
1767                 if (active_tc->js_period & TSC_WIDE_SCSI)
 
1768                         outl(2, host->addr + TUL_SCnt0);
 
1770                         outl(1, host->addr + TUL_SCnt0);
 
1772                 outb(TSC_XF_FIFO_IN, host->addr + TUL_SCmd);
 
1773                 if (wait_tulip(host) == -1)
 
1775                 if (host->phase != DATA_IN) {
 
1776                         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1779                 inb(host->addr + TUL_SFifo);
 
1783 int initio_xpad_out(struct initio_host * host)
 
1785         struct scsi_ctrl_blk *scb = host->active;
 
1786         struct target_control *active_tc = host->active_tc;
 
1788         if ((scb->flags & SCF_DIR) != SCF_NO_DCHK)
 
1789                 scb->hastat = HOST_DO_DU;       /* over run             */
 
1791                 if (active_tc->js_period & TSC_WIDE_SCSI)
 
1792                         outl(2, host->addr + TUL_SCnt0);
 
1794                         outl(1, host->addr + TUL_SCnt0);
 
1796                 outb(0, host->addr + TUL_SFifo);
 
1797                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1798                 if ((wait_tulip(host)) == -1)
 
1800                 if (host->phase != DATA_OUT) {  /* Disable wide CPU to allow read 16 bits */
 
1801                         outb(TSC_HW_RESELECT, host->addr + TUL_SCtrl1);
 
1802                         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1808 int initio_status_msg(struct initio_host * host)
 
1809 {                               /* status & MSG_IN */
 
1810         struct scsi_ctrl_blk *scb = host->active;
 
1813         outb(TSC_CMD_COMP, host->addr + TUL_SCmd);
 
1814         if (wait_tulip(host) == -1)
 
1818         scb->tastat = inb(host->addr + TUL_SFifo);
 
1820         if (host->phase == MSG_OUT) {
 
1821                 if (host->jsstatus0 & TSS_PAR_ERROR)
 
1822                         outb(MSG_PARITY, host->addr + TUL_SFifo);
 
1824                         outb(MSG_NOP, host->addr + TUL_SFifo);
 
1825                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1826                 return wait_tulip(host);
 
1828         if (host->phase == MSG_IN) {
 
1829                 msg = inb(host->addr + TUL_SFifo);
 
1830                 if (host->jsstatus0 & TSS_PAR_ERROR) {  /* Parity error                 */
 
1831                         if ((initio_msgin_accept(host)) == -1)
 
1833                         if (host->phase != MSG_OUT)
 
1834                                 return initio_bad_seq(host);
 
1835                         outb(MSG_PARITY, host->addr + TUL_SFifo);
 
1836                         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
1837                         return wait_tulip(host);
 
1839                 if (msg == 0) { /* Command complete             */
 
1841                         if ((scb->tastat & 0x18) == 0x10)       /* No link support              */
 
1842                                 return initio_bad_seq(host);
 
1843                         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1844                         outb(TSC_MSG_ACCEPT, host->addr + TUL_SCmd);
 
1845                         return initio_wait_done_disc(host);
 
1848                 if (msg == MSG_LINK_COMP || msg == MSG_LINK_FLAG) {
 
1849                         if ((scb->tastat & 0x18) == 0x10)
 
1850                                 return initio_msgin_accept(host);
 
1853         return initio_bad_seq(host);
 
1858 int int_initio_busfree(struct initio_host * host)
 
1860         struct scsi_ctrl_blk *scb = host->active;
 
1863                 if (scb->status & SCB_SELECT) {         /* selection timeout */
 
1864                         initio_unlink_pend_scb(host, scb);
 
1865                         scb->hastat = HOST_SEL_TOUT;
 
1866                         initio_append_done_scb(host, scb);
 
1867                 } else {        /* Unexpected bus free          */
 
1868                         initio_unlink_busy_scb(host, scb);
 
1869                         scb->hastat = HOST_BUS_FREE;
 
1870                         initio_append_done_scb(host, scb);
 
1872                 host->active = NULL;
 
1873                 host->active_tc = NULL;
 
1875         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);          /* Flush SCSI FIFO  */
 
1876         outb(TSC_INITDEFAULT, host->addr + TUL_SConfig);
 
1877         outb(TSC_HW_RESELECT, host->addr + TUL_SCtrl1); /* Enable HW reselect       */
 
1883  *      int_initio_scsi_rst     -       SCSI reset occurred
 
1884  *      @host: Host seeing the reset
 
1886  *      A SCSI bus reset has occurred. Clean up any pending transfer
 
1887  *      the hardware is doing by DMA and then abort all active and
 
1888  *      disconnected commands. The mid layer should sort the rest out
 
1892 static int int_initio_scsi_rst(struct initio_host * host)
 
1894         struct scsi_ctrl_blk *scb;
 
1897         /* if DMA xfer is pending, abort DMA xfer */
 
1898         if (inb(host->addr + TUL_XStatus) & 0x01) {
 
1899                 outb(TAX_X_ABT | TAX_X_CLR_FIFO, host->addr + TUL_XCmd);
 
1900                 /* wait Abort DMA xfer done */
 
1901                 while ((inb(host->addr + TUL_Int) & 0x04) == 0)
 
1903                 outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
1905         /* Abort all active & disconnected scb */
 
1906         while ((scb = initio_pop_busy_scb(host)) != NULL) {
 
1907                 scb->hastat = HOST_BAD_PHAS;
 
1908                 initio_append_done_scb(host, scb);
 
1910         host->active = NULL;
 
1911         host->active_tc = NULL;
 
1913         /* clr sync nego. done flag */
 
1914         for (i = 0; i < host->max_tar; i++)
 
1915                 host->targets[i].flags &= ~(TCF_SYNC_DONE | TCF_WDTR_DONE);
 
1920  *      int_initio_scsi_resel   -       Reselection occured
 
1921  *      @host: InitIO host adapter
 
1923  *      A SCSI reselection event has been signalled and the interrupt
 
1924  *      is now being processed. Work out which command block needs attention
 
1925  *      and continue processing that command.
 
1928 int int_initio_resel(struct initio_host * host)
 
1930         struct scsi_ctrl_blk *scb;
 
1931         struct target_control *active_tc;
 
1935         if ((scb = host->active) != NULL) {
 
1936                 /* FIXME: Why check and not just clear ? */
 
1937                 if (scb->status & SCB_SELECT)           /* if waiting for selection complete */
 
1938                         scb->status &= ~SCB_SELECT;
 
1939                 host->active = NULL;
 
1941         /* --------- get target id---------------------- */
 
1942         tar = inb(host->addr + TUL_SBusId);
 
1943         /* ------ get LUN from Identify message----------- */
 
1944         lun = inb(host->addr + TUL_SIdent) & 0x0F;
 
1945         /* 07/22/98 from 0x1F -> 0x0F */
 
1946         active_tc = &host->targets[tar];
 
1947         host->active_tc = active_tc;
 
1948         outb(active_tc->sconfig0, host->addr + TUL_SConfig);
 
1949         outb(active_tc->js_period, host->addr + TUL_SPeriod);
 
1951         /* ------------- tag queueing ? ------------------- */
 
1952         if (active_tc->drv_flags & TCF_DRV_EN_TAG) {
 
1953                 if ((initio_msgin_accept(host)) == -1)
 
1955                 if (host->phase != MSG_IN)
 
1957                 outl(1, host->addr + TUL_SCnt0);
 
1958                 outb(TSC_XF_FIFO_IN, host->addr + TUL_SCmd);
 
1959                 if (wait_tulip(host) == -1)
 
1961                 msg = inb(host->addr + TUL_SFifo);      /* Read Tag Message    */
 
1963                 if (msg < MSG_STAG || msg > MSG_OTAG)           /* Is simple Tag      */
 
1966                 if (initio_msgin_accept(host) == -1)
 
1969                 if (host->phase != MSG_IN)
 
1972                 outl(1, host->addr + TUL_SCnt0);
 
1973                 outb(TSC_XF_FIFO_IN, host->addr + TUL_SCmd);
 
1974                 if (wait_tulip(host) == -1)
 
1976                 tag = inb(host->addr + TUL_SFifo);      /* Read Tag ID       */
 
1977                 scb = host->scb + tag;
 
1978                 if (scb->target != tar || scb->lun != lun) {
 
1979                         return initio_msgout_abort_tag(host);
 
1981                 if (scb->status != SCB_BUSY) {  /* 03/24/95             */
 
1982                         return initio_msgout_abort_tag(host);
 
1985                 if ((initio_msgin_accept(host)) == -1)
 
1987         } else {                /* No tag               */
 
1989                 if ((scb = initio_find_busy_scb(host, tar | (lun << 8))) == NULL) {
 
1990                         return initio_msgout_abort_targ(host);
 
1993                 if (!(active_tc->drv_flags & TCF_DRV_EN_TAG)) {
 
1994                         if ((initio_msgin_accept(host)) == -1)
 
2002  *      int_initio_bad_seq              -       out of phase
 
2003  *      @host: InitIO host flagging event
 
2005  *      We have ended up out of phase somehow. Reset the host controller
 
2006  *      and throw all our toys out of the pram. Let the midlayer clean up
 
2009 static int int_initio_bad_seq(struct initio_host * host)
 
2010 {                               /* target wrong phase           */
 
2011         struct scsi_ctrl_blk *scb;
 
2014         initio_reset_scsi(host, 10);
 
2016         while ((scb = initio_pop_busy_scb(host)) != NULL) {
 
2017                 scb->hastat = HOST_BAD_PHAS;
 
2018                 initio_append_done_scb(host, scb);
 
2020         for (i = 0; i < host->max_tar; i++)
 
2021                 host->targets[i].flags &= ~(TCF_SYNC_DONE | TCF_WDTR_DONE);
 
2027  *      initio_msgout_abort_targ                -       abort a tag
 
2028  *      @host: InitIO host
 
2030  *      Abort when the target/lun does not match or when our SCB is not
 
2031  *      busy. Used by untagged commands.
 
2034 static int initio_msgout_abort_targ(struct initio_host * host)
 
2037         outb(((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN), host->addr + TUL_SSignal);
 
2038         if (initio_msgin_accept(host) == -1)
 
2040         if (host->phase != MSG_OUT)
 
2041                 return initio_bad_seq(host);
 
2043         outb(MSG_ABORT, host->addr + TUL_SFifo);
 
2044         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
2046         return initio_wait_disc(host);
 
2050  *      initio_msgout_abort_tag         -       abort a tag
 
2051  *      @host: InitIO host
 
2053  *      Abort when the target/lun does not match or when our SCB is not
 
2054  *      busy. Used for tagged commands.
 
2057 static int initio_msgout_abort_tag(struct initio_host * host)
 
2060         outb(((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN), host->addr + TUL_SSignal);
 
2061         if (initio_msgin_accept(host) == -1)
 
2063         if (host->phase != MSG_OUT)
 
2064                 return initio_bad_seq(host);
 
2066         outb(MSG_ABORT_TAG, host->addr + TUL_SFifo);
 
2067         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
2069         return initio_wait_disc(host);
 
2074  *      initio_msgin            -       Message in
 
2075  *      @host: InitIO Host
 
2077  *      Process incoming message
 
2079 static int initio_msgin(struct initio_host * host)
 
2081         struct target_control *active_tc;
 
2084                 outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
2086                 outl(1, host->addr + TUL_SCnt0);
 
2087                 outb(TSC_XF_FIFO_IN, host->addr + TUL_SCmd);
 
2088                 if (wait_tulip(host) == -1)
 
2091                 switch (inb(host->addr + TUL_SFifo)) {
 
2092                 case MSG_DISC:  /* Disconnect msg */
 
2093                         outb(TSC_MSG_ACCEPT, host->addr + TUL_SCmd);
 
2094                         return initio_wait_disc(host);
 
2098                         initio_msgin_accept(host);
 
2100                 case MSG_REJ:   /* Clear ATN first              */
 
2101                         outb((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)),
 
2102                                 host->addr + TUL_SSignal);
 
2103                         active_tc = host->active_tc;
 
2104                         if ((active_tc->flags & (TCF_SYNC_DONE | TCF_NO_SYNC_NEGO)) == 0)       /* do sync nego */
 
2105                                 outb(((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN),
 
2106                                         host->addr + TUL_SSignal);
 
2107                         initio_msgin_accept(host);
 
2109                 case MSG_EXTEND:        /* extended msg */
 
2110                         initio_msgin_extend(host);
 
2112                 case MSG_IGNOREWIDE:
 
2113                         initio_msgin_accept(host);
 
2116                         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
2117                         outb(TSC_MSG_ACCEPT, host->addr + TUL_SCmd);
 
2118                         return initio_wait_done_disc(host);
 
2120                         initio_msgout_reject(host);
 
2123                 if (host->phase != MSG_IN)
 
2126         /* statement won't reach here */
 
2129 static int initio_msgout_reject(struct initio_host * host)
 
2131         outb(((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN), host->addr + TUL_SSignal);
 
2133         if (initio_msgin_accept(host) == -1)
 
2136         if (host->phase == MSG_OUT) {
 
2137                 outb(MSG_REJ, host->addr + TUL_SFifo);          /* Msg reject           */
 
2138                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
2139                 return wait_tulip(host);
 
2144 static int initio_msgout_ide(struct initio_host * host)
 
2146         outb(MSG_IDE, host->addr + TUL_SFifo);          /* Initiator Detected Error */
 
2147         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
2148         return wait_tulip(host);
 
2151 static int initio_msgin_extend(struct initio_host * host)
 
2155         if (initio_msgin_accept(host) != MSG_IN)
 
2158         /* Get extended msg length      */
 
2159         outl(1, host->addr + TUL_SCnt0);
 
2160         outb(TSC_XF_FIFO_IN, host->addr + TUL_SCmd);
 
2161         if (wait_tulip(host) == -1)
 
2164         len = inb(host->addr + TUL_SFifo);
 
2166         for (idx = 1; len != 0; len--) {
 
2168                 if ((initio_msgin_accept(host)) != MSG_IN)
 
2170                 outl(1, host->addr + TUL_SCnt0);
 
2171                 outb(TSC_XF_FIFO_IN, host->addr + TUL_SCmd);
 
2172                 if (wait_tulip(host) == -1)
 
2174                 host->msg[idx++] = inb(host->addr + TUL_SFifo);
 
2176         if (host->msg[1] == 1) {                /* if it's synchronous data transfer request */
 
2178                 if (host->msg[0] != 3)  /* if length is not right */
 
2179                         return initio_msgout_reject(host);
 
2180                 if (host->active_tc->flags & TCF_NO_SYNC_NEGO) {        /* Set OFFSET=0 to do async, nego back */
 
2183                         if (initio_msgin_sync(host) == 0 &&
 
2184                             (host->active_tc->flags & TCF_SYNC_DONE)) {
 
2185                                 initio_sync_done(host);
 
2186                                 return initio_msgin_accept(host);
 
2190                 r = inb(host->addr + TUL_SSignal);
 
2191                 outb((r & (TSC_SET_ACK | 7)) | TSC_SET_ATN,
 
2192                         host->addr + TUL_SSignal);
 
2193                 if (initio_msgin_accept(host) != MSG_OUT)
 
2196                 outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);
 
2198                 initio_sync_done(host);
 
2200                 outb(MSG_EXTEND, host->addr + TUL_SFifo);
 
2201                 outb(3, host->addr + TUL_SFifo);
 
2202                 outb(1, host->addr + TUL_SFifo);
 
2203                 outb(host->msg[2], host->addr + TUL_SFifo);
 
2204                 outb(host->msg[3], host->addr + TUL_SFifo);
 
2205                 outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
2206                 return wait_tulip(host);
 
2208         if (host->msg[0] != 2 || host->msg[1] != 3)
 
2209                 return initio_msgout_reject(host);
 
2210         /* if it's WIDE DATA XFER REQ   */
 
2211         if (host->active_tc->flags & TCF_NO_WDTR) {
 
2214                 if (host->msg[2] > 2)   /* > 32 bits            */
 
2215                         return initio_msgout_reject(host);
 
2216                 if (host->msg[2] == 2) {                /* == 32                */
 
2219                         if ((host->active_tc->flags & TCF_NO_WDTR) == 0) {
 
2221                                 if ((host->active_tc->flags & (TCF_SYNC_DONE | TCF_NO_SYNC_NEGO)) == 0)
 
2222                                         outb(((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN), host->addr + TUL_SSignal);
 
2223                                 return initio_msgin_accept(host);
 
2227         outb(((inb(host->addr + TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN), host->addr + TUL_SSignal);
 
2229         if (initio_msgin_accept(host) != MSG_OUT)
 
2232         outb(MSG_EXTEND, host->addr + TUL_SFifo);
 
2233         outb(2, host->addr + TUL_SFifo);
 
2234         outb(3, host->addr + TUL_SFifo);
 
2235         outb(host->msg[2], host->addr + TUL_SFifo);
 
2236         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
2237         return wait_tulip(host);
 
2240 static int initio_msgin_sync(struct initio_host * host)
 
2242         char default_period;
 
2244         default_period = initio_rate_tbl[host->active_tc->flags & TCF_SCSI_RATE];
 
2245         if (host->msg[3] > MAX_OFFSET) {
 
2246                 host->msg[3] = MAX_OFFSET;
 
2247                 if (host->msg[2] < default_period) {
 
2248                         host->msg[2] = default_period;
 
2251                 if (host->msg[2] >= 59) /* Change to async              */
 
2255         /* offset requests asynchronous transfers ? */
 
2256         if (host->msg[3] == 0) {
 
2259         if (host->msg[2] < default_period) {
 
2260                 host->msg[2] = default_period;
 
2263         if (host->msg[2] >= 59) {
 
2270 static int wdtr_done(struct initio_host * host)
 
2272         host->active_tc->flags &= ~TCF_SYNC_DONE;
 
2273         host->active_tc->flags |= TCF_WDTR_DONE;
 
2275         host->active_tc->js_period = 0;
 
2276         if (host->msg[2])       /* if 16 bit */
 
2277                 host->active_tc->js_period |= TSC_WIDE_SCSI;
 
2278         host->active_tc->sconfig0 &= ~TSC_ALT_PERIOD;
 
2279         outb(host->active_tc->sconfig0, host->addr + TUL_SConfig);
 
2280         outb(host->active_tc->js_period, host->addr + TUL_SPeriod);
 
2285 static int initio_sync_done(struct initio_host * host)
 
2289         host->active_tc->flags |= TCF_SYNC_DONE;
 
2292                 host->active_tc->js_period |= host->msg[3];
 
2293                 for (i = 0; i < 8; i++) {
 
2294                         if (initio_rate_tbl[i] >= host->msg[2]) /* pick the big one */
 
2297                 host->active_tc->js_period |= (i << 4);
 
2298                 host->active_tc->sconfig0 |= TSC_ALT_PERIOD;
 
2300         outb(host->active_tc->sconfig0, host->addr + TUL_SConfig);
 
2301         outb(host->active_tc->js_period, host->addr + TUL_SPeriod);
 
2307 static int initio_post_scsi_rst(struct initio_host * host)
 
2309         struct scsi_ctrl_blk *scb;
 
2310         struct target_control *active_tc;
 
2313         host->active = NULL;
 
2314         host->active_tc = NULL;
 
2317         while ((scb = initio_pop_busy_scb(host)) != NULL) {
 
2318                 scb->hastat = HOST_BAD_PHAS;
 
2319                 initio_append_done_scb(host, scb);
 
2321         /* clear sync done flag         */
 
2322         active_tc = &host->targets[0];
 
2323         for (i = 0; i < host->max_tar; active_tc++, i++) {
 
2324                 active_tc->flags &= ~(TCF_SYNC_DONE | TCF_WDTR_DONE);
 
2325                 /* Initialize the sync. xfer register values to an asyn xfer */
 
2326                 active_tc->js_period = 0;
 
2327                 active_tc->sconfig0 = host->sconf1;
 
2328                 host->act_tags[0] = 0;  /* 07/22/98 */
 
2329                 host->targets[i].flags &= ~TCF_BUSY;    /* 07/22/98 */
 
2335 static void initio_select_atn_stop(struct initio_host * host, struct scsi_ctrl_blk * scb)
 
2337         scb->status |= SCB_SELECT;
 
2338         scb->next_state = 0x1;
 
2340         host->active_tc = &host->targets[scb->target];
 
2341         outb(TSC_SELATNSTOP, host->addr + TUL_SCmd);
 
2345 static void initio_select_atn(struct initio_host * host, struct scsi_ctrl_blk * scb)
 
2349         scb->status |= SCB_SELECT;
 
2350         scb->next_state = 0x2;
 
2352         outb(scb->ident, host->addr + TUL_SFifo);
 
2353         for (i = 0; i < (int) scb->cdblen; i++)
 
2354                 outb(scb->cdb[i], host->addr + TUL_SFifo);
 
2355         host->active_tc = &host->targets[scb->target];
 
2357         outb(TSC_SEL_ATN, host->addr + TUL_SCmd);
 
2360 static void initio_select_atn3(struct initio_host * host, struct scsi_ctrl_blk * scb)
 
2364         scb->status |= SCB_SELECT;
 
2365         scb->next_state = 0x2;
 
2367         outb(scb->ident, host->addr + TUL_SFifo);
 
2368         outb(scb->tagmsg, host->addr + TUL_SFifo);
 
2369         outb(scb->tagid, host->addr + TUL_SFifo);
 
2370         for (i = 0; i < scb->cdblen; i++)
 
2371                 outb(scb->cdb[i], host->addr + TUL_SFifo);
 
2372         host->active_tc = &host->targets[scb->target];
 
2374         outb(TSC_SEL_ATN3, host->addr + TUL_SCmd);
 
2378  *      initio_bus_device_reset -        SCSI Bus Device Reset
 
2379  *      @host: InitIO host to reset
 
2381  *      Perform a device reset and abort all pending SCBs for the
 
2384 int initio_bus_device_reset(struct initio_host * host)
 
2386         struct scsi_ctrl_blk *scb = host->active;
 
2387         struct target_control *active_tc = host->active_tc;
 
2388         struct scsi_ctrl_blk *tmp, *prev;
 
2391         if (host->phase != MSG_OUT)
 
2392                 return int_initio_bad_seq(host);        /* Unexpected phase */
 
2394         initio_unlink_pend_scb(host, scb);
 
2395         initio_release_scb(host, scb);
 
2398         tar = scb->target;      /* target                       */
 
2399         active_tc->flags &= ~(TCF_SYNC_DONE | TCF_WDTR_DONE | TCF_BUSY);
 
2400         /* clr sync. nego & WDTR flags  07/22/98 */
 
2402         /* abort all SCB with same target */
 
2403         prev = tmp = host->first_busy;  /* Check Busy queue */
 
2404         while (tmp != NULL) {
 
2405                 if (tmp->target == tar) {
 
2407                         if (tmp == host->first_busy) {
 
2408                                 if ((host->first_busy = tmp->next) == NULL)
 
2409                                         host->last_busy = NULL;
 
2411                                 prev->next = tmp->next;
 
2412                                 if (tmp == host->last_busy)
 
2413                                         host->last_busy = prev;
 
2415                         tmp->hastat = HOST_ABORTED;
 
2416                         initio_append_done_scb(host, tmp);
 
2418                 /* Previous haven't change      */
 
2424         outb(MSG_DEVRST, host->addr + TUL_SFifo);
 
2425         outb(TSC_XF_FIFO_OUT, host->addr + TUL_SCmd);
 
2426         return initio_wait_disc(host);
 
2430 static int initio_msgin_accept(struct initio_host * host)
 
2432         outb(TSC_MSG_ACCEPT, host->addr + TUL_SCmd);
 
2433         return wait_tulip(host);
 
2436 static int wait_tulip(struct initio_host * host)
 
2439         while (!((host->jsstatus0 = inb(host->addr + TUL_SStatus0))
 
2443         host->jsint = inb(host->addr + TUL_SInt);
 
2444         host->phase = host->jsstatus0 & TSS_PH_MASK;
 
2445         host->jsstatus1 = inb(host->addr + TUL_SStatus1);
 
2447         if (host->jsint & TSS_RESEL_INT)        /* if SCSI bus reset detected */
 
2448                 return int_initio_resel(host);
 
2449         if (host->jsint & TSS_SEL_TIMEOUT)      /* if selected/reselected timeout interrupt */
 
2450                 return int_initio_busfree(host);
 
2451         if (host->jsint & TSS_SCSIRST_INT)      /* if SCSI bus reset detected   */
 
2452                 return int_initio_scsi_rst(host);
 
2454         if (host->jsint & TSS_DISC_INT) {       /* BUS disconnection            */
 
2455                 if (host->flags & HCF_EXPECT_DONE_DISC) {
 
2456                         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0); /* Flush SCSI FIFO */
 
2457                         initio_unlink_busy_scb(host, host->active);
 
2458                         host->active->hastat = 0;
 
2459                         initio_append_done_scb(host, host->active);
 
2460                         host->active = NULL;
 
2461                         host->active_tc = NULL;
 
2462                         host->flags &= ~HCF_EXPECT_DONE_DISC;
 
2463                         outb(TSC_INITDEFAULT, host->addr + TUL_SConfig);
 
2464                         outb(TSC_HW_RESELECT, host->addr + TUL_SCtrl1); /* Enable HW reselect */
 
2467                 if (host->flags & HCF_EXPECT_DISC) {
 
2468                         outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0); /* Flush SCSI FIFO */
 
2469                         host->active = NULL;
 
2470                         host->active_tc = NULL;
 
2471                         host->flags &= ~HCF_EXPECT_DISC;
 
2472                         outb(TSC_INITDEFAULT, host->addr + TUL_SConfig);
 
2473                         outb(TSC_HW_RESELECT, host->addr + TUL_SCtrl1); /* Enable HW reselect */
 
2476                 return int_initio_busfree(host);
 
2478         /* The old code really does the below. Can probably be removed */
 
2479         if (host->jsint & (TSS_FUNC_COMP | TSS_BUS_SERV))
 
2484 static int initio_wait_disc(struct initio_host * host)
 
2486         while (!((host->jsstatus0 = inb(host->addr + TUL_SStatus0)) & TSS_INT_PENDING))
 
2489         host->jsint = inb(host->addr + TUL_SInt);
 
2491         if (host->jsint & TSS_SCSIRST_INT)      /* if SCSI bus reset detected */
 
2492                 return int_initio_scsi_rst(host);
 
2493         if (host->jsint & TSS_DISC_INT) {       /* BUS disconnection */
 
2494                 outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0); /* Flush SCSI FIFO */
 
2495                 outb(TSC_INITDEFAULT, host->addr + TUL_SConfig);
 
2496                 outb(TSC_HW_RESELECT, host->addr + TUL_SCtrl1); /* Enable HW reselect */
 
2497                 host->active = NULL;
 
2500         return initio_bad_seq(host);
 
2503 static int initio_wait_done_disc(struct initio_host * host)
 
2505         while (!((host->jsstatus0 = inb(host->addr + TUL_SStatus0))
 
2509         host->jsint = inb(host->addr + TUL_SInt);
 
2511         if (host->jsint & TSS_SCSIRST_INT)      /* if SCSI bus reset detected */
 
2512                 return int_initio_scsi_rst(host);
 
2513         if (host->jsint & TSS_DISC_INT) {       /* BUS disconnection */
 
2514                 outb(TSC_FLUSH_FIFO, host->addr + TUL_SCtrl0);          /* Flush SCSI FIFO */
 
2515                 outb(TSC_INITDEFAULT, host->addr + TUL_SConfig);
 
2516                 outb(TSC_HW_RESELECT, host->addr + TUL_SCtrl1);         /* Enable HW reselect */
 
2517                 initio_unlink_busy_scb(host, host->active);
 
2519                 initio_append_done_scb(host, host->active);
 
2520                 host->active = NULL;
 
2523         return initio_bad_seq(host);
 
2527  *      i91u_intr               -       IRQ handler
 
2528  *      @irqno: IRQ number
 
2529  *      @dev_id: IRQ identifier
 
2531  *      Take the relevant locks and then invoke the actual isr processing
 
2532  *      code under the lock.
 
2535 static irqreturn_t i91u_intr(int irqno, void *dev_id)
 
2537         struct Scsi_Host *dev = dev_id;
 
2538         unsigned long flags;
 
2541         spin_lock_irqsave(dev->host_lock, flags);
 
2542         r = initio_isr((struct initio_host *)dev->hostdata);
 
2543         spin_unlock_irqrestore(dev->host_lock, flags);
 
2552  *      initio_build_scb                -       Build the mappings and SCB
 
2553  *      @host: InitIO host taking the command
 
2554  *      @cblk: Firmware command block
 
2555  *      @cmnd: SCSI midlayer command block
 
2557  *      Translate the abstract SCSI command into a firmware command block
 
2558  *      suitable for feeding to the InitIO host controller. This also requires
 
2559  *      we build the scatter gather lists and ensure they are mapped properly.
 
2562 static void initio_build_scb(struct initio_host * host, struct scsi_ctrl_blk * cblk, struct scsi_cmnd * cmnd)
 
2563 {                               /* Create corresponding SCB     */
 
2564         struct scatterlist *sglist;
 
2565         struct sg_entry *sg;            /* Pointer to SG list           */
 
2568         dma_addr_t dma_addr;
 
2570         /* Fill in the command headers */
 
2571         cblk->post = i91uSCBPost;       /* i91u's callback routine      */
 
2573         cblk->opcode = ExecSCSI;
 
2574         cblk->flags = SCF_POST; /* After SCSI done, call post routine */
 
2575         cblk->target = cmnd->device->id;
 
2576         cblk->lun = cmnd->device->lun;
 
2577         cblk->ident = cmnd->device->lun | DISC_ALLOW;
 
2579         cblk->flags |= SCF_SENSE;       /* Turn on auto request sense   */
 
2581         /* Map the sense buffer into bus memory */
 
2582         dma_addr = dma_map_single(&host->pci_dev->dev, cmnd->sense_buffer,
 
2583                                   SENSE_SIZE, DMA_FROM_DEVICE);
 
2584         cblk->senseptr = (u32)dma_addr;
 
2585         cblk->senselen = SENSE_SIZE;
 
2586         cmnd->SCp.ptr = (char *)(unsigned long)dma_addr;
 
2587         cblk->cdblen = cmnd->cmd_len;
 
2589         /* Clear the returned status */
 
2592         /* Command the command */
 
2593         memcpy(&cblk->cdb[0], &cmnd->cmnd, cmnd->cmd_len);
 
2596         if (cmnd->device->tagged_supported) {   /* Tag Support                  */
 
2597                 cblk->tagmsg = SIMPLE_QUEUE_TAG;        /* Do simple tag only   */
 
2599                 cblk->tagmsg = 0;       /* No tag support               */
 
2602         /* todo handle map_sg error */
 
2603         nseg = scsi_dma_map(cmnd);
 
2606                 dma_addr = dma_map_single(&host->pci_dev->dev, &cblk->sglist[0],
 
2607                                           sizeof(struct sg_entry) * TOTAL_SG_ENTRY,
 
2609                 cblk->bufptr = (u32)dma_addr;
 
2610                 cmnd->SCp.dma_handle = dma_addr;
 
2614                 cblk->flags |= SCF_SG;  /* Turn on SG list flag       */
 
2616                 sg = &cblk->sglist[0];
 
2617                 scsi_for_each_sg(cmnd, sglist, cblk->sglen, i) {
 
2618                         sg->data = cpu_to_le32((u32)sg_dma_address(sglist));
 
2619                         sg->len = cpu_to_le32((u32)sg_dma_len(sglist));
 
2620                         total_len += sg_dma_len(sglist);
 
2624                 cblk->buflen = (scsi_bufflen(cmnd) > total_len) ?
 
2625                         total_len : scsi_bufflen(cmnd);
 
2626         } else {        /* No data transfer required */
 
2633  *      i91u_queuecommand       -       Queue a new command if possible
 
2634  *      @cmd: SCSI command block from the mid layer
 
2635  *      @done: Completion handler
 
2637  *      Attempts to queue a new command with the host adapter. Will return
 
2638  *      zero if successful or indicate a host busy condition if not (which
 
2639  *      will cause the mid layer to call us again later with the command)
 
2642 static int i91u_queuecommand(struct scsi_cmnd *cmd,
 
2643                 void (*done)(struct scsi_cmnd *))
 
2645         struct initio_host *host = (struct initio_host *) cmd->device->host->hostdata;
 
2646         struct scsi_ctrl_blk *cmnd;
 
2648         cmd->scsi_done = done;
 
2650         cmnd = initio_alloc_scb(host);
 
2652                 return SCSI_MLQUEUE_HOST_BUSY;
 
2654         initio_build_scb(host, cmnd, cmd);
 
2655         initio_exec_scb(host, cmnd);
 
2660  *      i91u_bus_reset          -       reset the SCSI bus
 
2661  *      @cmnd: Command block we want to trigger the reset for
 
2663  *      Initiate a SCSI bus reset sequence
 
2666 static int i91u_bus_reset(struct scsi_cmnd * cmnd)
 
2668         struct initio_host *host;
 
2670         host = (struct initio_host *) cmnd->device->host->hostdata;
 
2672         spin_lock_irq(cmnd->device->host->host_lock);
 
2673         initio_reset_scsi(host, 0);
 
2674         spin_unlock_irq(cmnd->device->host->host_lock);
 
2680  *      i91u_biospararm                 -       return the "logical geometry
 
2681  *      @sdev: SCSI device
 
2682  *      @dev; Matching block device
 
2683  *      @capacity: Sector size of drive
 
2684  *      @info_array: Return space for BIOS geometry
 
2686  *      Map the device geometry in a manner compatible with the host
 
2687  *      controller BIOS behaviour.
 
2689  *      FIXME: limited to 2^32 sector devices.
 
2692 static int i91u_biosparam(struct scsi_device *sdev, struct block_device *dev,
 
2693                 sector_t capacity, int *info_array)
 
2695         struct initio_host *host;               /* Point to Host adapter control block */
 
2696         struct target_control *tc;
 
2698         host = (struct initio_host *) sdev->host->hostdata;
 
2699         tc = &host->targets[sdev->id];
 
2702                 info_array[0] = tc->heads;
 
2703                 info_array[1] = tc->sectors;
 
2704                 info_array[2] = (unsigned long)capacity / tc->heads / tc->sectors;
 
2706                 if (tc->drv_flags & TCF_DRV_255_63) {
 
2707                         info_array[0] = 255;
 
2709                         info_array[2] = (unsigned long)capacity / 255 / 63;
 
2713                         info_array[2] = (unsigned long)capacity >> 11;
 
2717 #if defined(DEBUG_BIOSPARAM)
 
2718         if (i91u_debug & debug_biosparam) {
 
2719                 printk("bios geometry: head=%d, sec=%d, cyl=%d\n",
 
2720                        info_array[0], info_array[1], info_array[2]);
 
2721                 printk("WARNING: check, if the bios geometry is correct.\n");
 
2729  *      i91u_unmap_scb          -       Unmap a command
 
2730  *      @pci_dev: PCI device the command is for
 
2731  *      @cmnd: The command itself
 
2733  *      Unmap any PCI mapping/IOMMU resources allocated when the command
 
2734  *      was mapped originally as part of initio_build_scb
 
2737 static void i91u_unmap_scb(struct pci_dev *pci_dev, struct scsi_cmnd *cmnd)
 
2739         /* auto sense buffer */
 
2740         if (cmnd->SCp.ptr) {
 
2741                 dma_unmap_single(&pci_dev->dev,
 
2742                                  (dma_addr_t)((unsigned long)cmnd->SCp.ptr),
 
2743                                  SENSE_SIZE, DMA_FROM_DEVICE);
 
2744                 cmnd->SCp.ptr = NULL;
 
2747         /* request buffer */
 
2748         if (scsi_sg_count(cmnd)) {
 
2749                 dma_unmap_single(&pci_dev->dev, cmnd->SCp.dma_handle,
 
2750                                  sizeof(struct sg_entry) * TOTAL_SG_ENTRY,
 
2753                 scsi_dma_unmap(cmnd);
 
2758  *      i91uSCBPost             -       SCSI callback
 
2759  *      @host: Pointer to host adapter control block.
 
2760  *      @cmnd: Pointer to SCSI control block.
 
2762  *      This is callback routine be called when tulip finish one
 
2766 static void i91uSCBPost(u8 * host_mem, u8 * cblk_mem)
 
2768         struct scsi_cmnd *cmnd; /* Pointer to SCSI request block */
 
2769         struct initio_host *host;
 
2770         struct scsi_ctrl_blk *cblk;
 
2772         host = (struct initio_host *) host_mem;
 
2773         cblk = (struct scsi_ctrl_blk *) cblk_mem;
 
2774         if ((cmnd = cblk->srb) == NULL) {
 
2775                 printk(KERN_ERR "i91uSCBPost: SRB pointer is empty\n");
 
2777                 initio_release_scb(host, cblk); /* Release SCB for current channel */
 
2782          *      Remap the firmware error status into a mid layer one
 
2784         switch (cblk->hastat) {
 
2786         case 0xa:               /* Linked command complete without error and linked normally */
 
2787         case 0xb:               /* Linked command complete without error interrupt generated */
 
2791         case 0x11:              /* Selection time out-The initiator selection or target
 
2792                                    reselection was not complete within the SCSI Time out period */
 
2793                 cblk->hastat = DID_TIME_OUT;
 
2796         case 0x14:              /* Target bus phase sequence failure-An invalid bus phase or bus
 
2797                                    phase sequence was requested by the target. The host adapter
 
2798                                    will generate a SCSI Reset Condition, notifying the host with
 
2800                 cblk->hastat = DID_RESET;
 
2803         case 0x1a:              /* SCB Aborted. 07/21/98 */
 
2804                 cblk->hastat = DID_ABORT;
 
2807         case 0x12:              /* Data overrun/underrun-The target attempted to transfer more data
 
2808                                    than was allocated by the Data Length field or the sum of the
 
2809                                    Scatter / Gather Data Length fields. */
 
2810         case 0x13:              /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
 
2811         case 0x16:              /* Invalid SCB Operation Code. */
 
2814                 printk("ini9100u: %x %x\n", cblk->hastat, cblk->tastat);
 
2815                 cblk->hastat = DID_ERROR;       /* Couldn't find any better */
 
2819         cmnd->result = cblk->tastat | (cblk->hastat << 16);
 
2820         WARN_ON(cmnd == NULL);
 
2821         i91u_unmap_scb(host->pci_dev, cmnd);
 
2822         cmnd->scsi_done(cmnd);  /* Notify system DONE           */
 
2823         initio_release_scb(host, cblk); /* Release SCB for current channel */
 
2826 static struct scsi_host_template initio_template = {
 
2827         .proc_name              = "INI9100U",
 
2828         .name                   = "Initio INI-9X00U/UW SCSI device driver",
 
2829         .queuecommand           = i91u_queuecommand,
 
2830         .eh_bus_reset_handler   = i91u_bus_reset,
 
2831         .bios_param             = i91u_biosparam,
 
2832         .can_queue              = MAX_TARGETS * i91u_MAXQUEUE,
 
2834         .sg_tablesize           = SG_ALL,
 
2836         .use_clustering         = ENABLE_CLUSTERING,
 
2839 static int initio_probe_one(struct pci_dev *pdev,
 
2840         const struct pci_device_id *id)
 
2842         struct Scsi_Host *shost;
 
2843         struct initio_host *host;
 
2846         struct scsi_ctrl_blk *scb, *tmp, *prev = NULL /* silence gcc */;
 
2847         int num_scb, i, error;
 
2849         error = pci_enable_device(pdev);
 
2853         pci_read_config_dword(pdev, 0x44, (u32 *) & reg);
 
2854         bios_seg = (u16) (reg & 0xFF);
 
2855         if (((reg & 0xFF00) >> 8) == 0xFF)
 
2857         bios_seg = (bios_seg << 8) + ((u16) ((reg & 0xFF00) >> 8));
 
2859         if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
 
2860                 printk(KERN_WARNING  "i91u: Could not set 32 bit DMA mask\n");
 
2862                 goto out_disable_device;
 
2864         shost = scsi_host_alloc(&initio_template, sizeof(struct initio_host));
 
2866                 printk(KERN_WARNING "initio: Could not allocate host structure.\n");
 
2868                 goto out_disable_device;
 
2870         host = (struct initio_host *)shost->hostdata;
 
2871         memset(host, 0, sizeof(struct initio_host));
 
2872         host->addr = pci_resource_start(pdev, 0);
 
2873         host->bios_addr = bios_seg;
 
2875         if (!request_region(host->addr, 256, "i91u")) {
 
2876                 printk(KERN_WARNING "initio: I/O port range 0x%x is busy.\n", host->addr);
 
2881         if (initio_tag_enable)  /* 1.01i */
 
2882                 num_scb = MAX_TARGETS * i91u_MAXQUEUE;
 
2884                 num_scb = MAX_TARGETS + 3;      /* 1-tape, 1-CD_ROM, 1- extra */
 
2886         for (; num_scb >= MAX_TARGETS + 3; num_scb--) {
 
2887                 i = num_scb * sizeof(struct scsi_ctrl_blk);
 
2888                 if ((scb = kzalloc(i, GFP_DMA)) != NULL)
 
2893                 printk(KERN_WARNING "initio: Cannot allocate SCB array.\n");
 
2895                 goto out_release_region;
 
2898         host->pci_dev = pdev;
 
2901         spin_lock_init(&host->semaph_lock);
 
2902         host->num_scbs = num_scb;
 
2904         host->next_pending = scb;
 
2905         host->next_avail = scb;
 
2906         for (i = 0, tmp = scb; i < num_scb; i++, tmp++) {
 
2913         host->scb_end = tmp;
 
2914         host->first_avail = scb;
 
2915         host->last_avail = prev;
 
2916         spin_lock_init(&host->avail_lock);
 
2918         initio_init(host, phys_to_virt(((u32)bios_seg << 4)));
 
2920         host->jsstatus0 = 0;
 
2922         shost->io_port = host->addr;
 
2923         shost->n_io_port = 0xff;
 
2924         shost->can_queue = num_scb;             /* 03/05/98                      */
 
2925         shost->unique_id = host->addr;
 
2926         shost->max_id = host->max_tar;
 
2927         shost->max_lun = 32;    /* 10/21/97                     */
 
2928         shost->irq = pdev->irq;
 
2929         shost->this_id = host->scsi_id; /* Assign HCS index           */
 
2930         shost->base = host->addr;
 
2931         shost->sg_tablesize = TOTAL_SG_ENTRY;
 
2933         error = request_irq(pdev->irq, i91u_intr, IRQF_DISABLED|IRQF_SHARED, "i91u", shost);
 
2935                 printk(KERN_WARNING "initio: Unable to request IRQ %d\n", pdev->irq);
 
2939         pci_set_drvdata(pdev, shost);
 
2941         error = scsi_add_host(shost, &pdev->dev);
 
2944         scsi_scan_host(shost);
 
2947         free_irq(pdev->irq, shost);
 
2951         release_region(host->addr, 256);
 
2953         scsi_host_put(shost);
 
2955         pci_disable_device(pdev);
 
2960  *      initio_remove_one       -       control shutdown
 
2961  *      @pdev:  PCI device being released
 
2963  *      Release the resources assigned to this adapter after it has
 
2964  *      finished being used.
 
2967 static void initio_remove_one(struct pci_dev *pdev)
 
2969         struct Scsi_Host *host = pci_get_drvdata(pdev);
 
2970         struct initio_host *s = (struct initio_host *)host->hostdata;
 
2971         scsi_remove_host(host);
 
2972         free_irq(pdev->irq, host);
 
2973         release_region(s->addr, 256);
 
2974         scsi_host_put(host);
 
2975         pci_disable_device(pdev);
 
2978 MODULE_LICENSE("GPL");
 
2980 static struct pci_device_id initio_pci_tbl[] = {
 
2981         {PCI_VENDOR_ID_INIT, 0x9500, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
2982         {PCI_VENDOR_ID_INIT, 0x9400, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
2983         {PCI_VENDOR_ID_INIT, 0x9401, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
2984         {PCI_VENDOR_ID_INIT, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
2985         {PCI_VENDOR_ID_DOMEX, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 
2988 MODULE_DEVICE_TABLE(pci, initio_pci_tbl);
 
2990 static struct pci_driver initio_pci_driver = {
 
2992         .id_table       = initio_pci_tbl,
 
2993         .probe          = initio_probe_one,
 
2994         .remove         = __devexit_p(initio_remove_one),
 
2997 static int __init initio_init_driver(void)
 
2999         return pci_register_driver(&initio_pci_driver);
 
3002 static void __exit initio_exit_driver(void)
 
3004         pci_unregister_driver(&initio_pci_driver);
 
3007 MODULE_DESCRIPTION("Initio INI-9X00U/UW SCSI device driver");
 
3008 MODULE_AUTHOR("Initio Corporation");
 
3009 MODULE_LICENSE("GPL");
 
3011 module_init(initio_init_driver);
 
3012 module_exit(initio_exit_driver);