root/drivers/scsi/eata.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. wait_on_busy
  2. do_dma
  3. read_pio
  4. port_detect
  5. eata2x_detect
  6. build_sg_list
  7. eata2x_queuecommand
  8. eata2x_abort
  9. eata2x_reset
  10. eata2x_interrupt_handler

   1 /*
   2  *      eata.c - Low-level driver for EATA/DMA SCSI host adapters.
   3  *
   4  *       6 Jul 1995 rev. 2.01 for linux 1.3.7
   5  *          Update required by the new /proc/scsi support.
   6  *
   7  *      11 Mar 1995 rev. 2.00 for linux 1.2.0
   8  *          Fixed a bug which prevented media change detection for removable
   9  *          disk drives.
  10  *
  11  *      23 Feb 1995 rev. 1.18 for linux 1.1.94
  12  *          Added a check for scsi_register returning NULL.
  13  *
  14  *      11 Feb 1995 rev. 1.17 for linux 1.1.91
  15  *          Now DEBUG_RESET is disabled by default.
  16  *          Register a board even if it does not assert DMA protocol support
  17  *          (DPT SK2011B does not report correctly the dmasup bit).
  18  *
  19  *       9 Feb 1995 rev. 1.16 for linux 1.1.90
  20  *          Use host->wish_block instead of host->block.
  21  *          New list of Data Out SCSI commands.
  22  *
  23  *       8 Feb 1995 rev. 1.15 for linux 1.1.89
  24  *          Cleared target_time_out counter while performing a reset.
  25  *          All external symbols renamed to avoid possible name conflicts.
  26  *
  27  *      28 Jan 1995 rev. 1.14 for linux 1.1.86
  28  *          Added module support.
  29  *          Log and do a retry when a disk drive returns a target status 
  30  *          different from zero on a recovered error.
  31  *
  32  *      24 Jan 1995 rev. 1.13 for linux 1.1.85
  33  *          Use optimized board configuration, with a measured performance
  34  *          increase in the range 10%-20% on i/o throughput.
  35  *
  36  *      16 Jan 1995 rev. 1.12 for linux 1.1.81
  37  *          Fix mscp structure comments (no functional change).
  38  *          Display a message if check_region detects a port address
  39  *          already in use.
  40  *
  41  *      17 Dec 1994 rev. 1.11 for linux 1.1.74
  42  *          Use the scsicam_bios_param routine. This allows an easy
  43  *          migration path from disk partition tables created using 
  44  *          different SCSI drivers and non optimal disk geometry.
  45  *
  46  *      15 Dec 1994 rev. 1.10 for linux 1.1.74
  47  *          Added support for ISA EATA boards (DPT PM2011, DPT PM2021).
  48  *          The host->block flag is set for all the detected ISA boards.
  49  *          The detect routine no longer enforces LEVEL triggering
  50  *          for EISA boards, it just prints a warning message.
  51  *
  52  *      30 Nov 1994 rev. 1.09 for linux 1.1.68
  53  *          Redo i/o on target status CHECK_CONDITION for TYPE_DISK only.
  54  *          Added optional support for using a single board at a time.
  55  *
  56  *      18 Nov 1994 rev. 1.08 for linux 1.1.64
  57  *          Forces sg_tablesize = 64 and can_queue = 64 if these
  58  *          values are not correctly detected (DPT PM2012).
  59  *
  60  *      14 Nov 1994 rev. 1.07 for linux 1.1.63  Final BETA release.
  61  *      04 Aug 1994 rev. 1.00 for linux 1.1.39  First BETA release.
  62  *
  63  *
  64  *          This driver is based on the CAM (Common Access Method Committee)
  65  *          EATA (Enhanced AT Bus Attachment) rev. 2.0A, using DMA protocol.
  66  *
  67  *      Copyright (C) 1994, 1995 Dario Ballabio (dario@milano.europe.dg.com)
  68  *
  69  */
  70 
  71 /*
  72  *
  73  *  Here is a brief description of the DPT SCSI host adapters.
  74  *  All these boards provide an EATA/DMA compatible programming interface
  75  *  and are fully supported by this driver:
  76  *
  77  *  PM2011B/9X -  Entry Level ISA
  78  *  PM2021A/9X -  High Performance ISA
  79  *  PM2012A       Old EISA
  80  *  PM2012B       Old EISA
  81  *  PM2022A/9X -  Entry Level EISA
  82  *  PM2122A/9X -  High Performance EISA
  83  *  PM2322A/9X -  Extra High Performance EISA
  84  *
  85  *  The DPT PM2001 provides only the EATA/PIO interface and hence is not
  86  *  supported by this driver.
  87  *
  88  *  This code has been tested with up to 3 Distributed Processing Technology 
  89  *  PM2122A/9X (DPT SCSI BIOS v002.D1, firmware v05E.0) eisa controllers,
  90  *  no on board cache and no RAID option. 
  91  *  BIOS must be enabled on the first board and must be disabled for all other 
  92  *  boards. 
  93  *  Support is provided for any number of DPT PM2122 eisa boards.
  94  *  All boards should be configured at the same IRQ level.
  95  *  Multiple IRQ configurations are supported too.
  96  *  Boards can be located in any eisa slot (1-15) and are named EATA0, 
  97  *  EATA1,... in increasing eisa slot number. ISA boards are detected
  98  *  after the eisa slot probes.
  99  *
 100  *  The IRQ for EISA boards should be _level_ triggered (not _edge_ triggered).
 101  *  This is a requirement in order to support multiple boards on the same IRQ.
 102  *
 103  *  Other eisa configuration parameters are:
 104  *
 105  *  COMMAND QUEUING   : ENABLED
 106  *  COMMAND TIMEOUT   : ENABLED
 107  *  CACHE             : DISABLED
 108  *
 109  *  In order to support multiple ISA boards in a reliable way,
 110  *  the driver sets host->wish_block = TRUE for all ISA boards.
 111  */
 112 
 113 #if defined(MODULE)
 114 #include <linux/module.h>
 115 #include <linux/version.h>
 116 #endif
 117 
 118 #include <linux/string.h>
 119 #include <linux/sched.h>
 120 #include <linux/kernel.h>
 121 #include <linux/ioport.h>
 122 #include <asm/io.h>
 123 #include <asm/system.h>
 124 #include <linux/proc_fs.h>
 125 #include <linux/blk.h>
 126 #include "scsi.h"
 127 #include "hosts.h"
 128 #include "sd.h"
 129 #include <asm/dma.h>
 130 #include <asm/irq.h>
 131 #include "linux/in.h"
 132 #include "eata.h"
 133 #include<linux/stat.h>
 134 
 135 struct proc_dir_entry proc_scsi_eata2x = {
 136     PROC_SCSI_EATA2X, 6, "eata2x",
 137     S_IFDIR | S_IRUGO | S_IXUGO, 2
 138 };
 139 
 140 /* Subversion values */
 141 #define ISA  0
 142 #define ESA 1
 143 
 144 #undef FORCE_CONFIG
 145 
 146 #undef  DEBUG_DETECT
 147 #undef  DEBUG_INTERRUPT
 148 #undef  DEBUG_STATISTICS
 149 #undef  DEBUG_RESET
 150 
 151 #define MAX_TARGET 8
 152 #define MAX_IRQ 16
 153 #define MAX_BOARDS 18
 154 #define MAX_MAILBOXES 64
 155 #define MAX_SGLIST 64
 156 #define MAX_CMD_PER_LUN 2
 157 
 158 #define FALSE 0
 159 #define TRUE 1
 160 #define FREE 0
 161 #define IN_USE   1
 162 #define LOCKED   2
 163 #define IN_RESET 3
 164 #define IGNORE   4
 165 #define NO_IRQ  0xff
 166 #define NO_DMA  0xff
 167 #define MAXLOOP 200000
 168 
 169 #define REG_CMD         7
 170 #define REG_STATUS      7
 171 #define REG_AUX_STATUS  8
 172 #define REG_DATA        0
 173 #define REG_DATA2       1
 174 #define REG_SEE         6
 175 #define REG_LOW         2
 176 #define REG_LM          3
 177 #define REG_MID         4
 178 #define REG_MSB         5
 179 #define REGION_SIZE     9
 180 #define EISA_RANGE      0xf000
 181 #define BSY_ASSERTED      0x80
 182 #define DRQ_ASSERTED      0x08
 183 #define ABSY_ASSERTED     0x01
 184 #define IRQ_ASSERTED      0x02
 185 #define READ_CONFIG_PIO   0xf0
 186 #define SET_CONFIG_PIO    0xf1
 187 #define SEND_CP_PIO       0xf2
 188 #define RECEIVE_SP_PIO    0xf3
 189 #define TRUNCATE_XFR_PIO  0xf4
 190 #define RESET_PIO         0xf9
 191 #define READ_CONFIG_DMA   0xfd
 192 #define SET_CONFIG_DMA    0xfe
 193 #define SEND_CP_DMA       0xff
 194 #define ASOK              0x00
 195 #define ASST              0x01
 196 
 197 #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr)[0])
 198 
 199 /* "EATA", in Big Endian format */
 200 #define EATA_SIGNATURE 0x41544145
 201 
 202 /* Number of valid bytes in the board config structure for EATA 2.0x */
 203 #define EATA_2_0A_SIZE 28
 204 #define EATA_2_0B_SIZE 30
 205 
 206 /* Board info structure */
 207 struct eata_info {
 208    ulong  data_len;     /* Number of valid bytes after this field */
 209    ulong  sign;         /* ASCII "EATA" signature */
 210    unchar        :4,    /* unused low nibble */
 211           version:4;    /* EATA version, should be 0x1 */
 212    unchar  ocsena:1,    /* Overlap Command Support Enabled */
 213            tarsup:1,    /* Target Mode Supported */
 214                  :2,
 215            dmasup:1,    /* DMA Supported */
 216            drqvld:1,    /* DRQ Index (DRQX) is valid */
 217               ata:1,    /* This is an ATA device */
 218            haaval:1;    /* Host Adapter Address Valid */
 219    ushort cp_pad_len;   /* Number of pad bytes after cp_len */
 220    unchar host_addr[3]; /* Host Adapter SCSI ID for channels 2, 1, 0 */
 221    unchar reserved;
 222    ulong  cp_len;       /* Number of valid bytes in cp */
 223    ulong  sp_len;       /* Number of valid bytes in sp */
 224    ushort queue_size;   /* Max number of cp that can be queued */
 225    ushort unused;
 226    ushort scatt_size;   /* Max number of entries in scatter/gather table */
 227    unchar     irq:4,    /* Interrupt Request assigned to this controller */
 228            irq_tr:1,    /* 0 for edge triggered, 1 for level triggered */
 229            second:1,    /* 1 if this is a secondary (not primary) controller */
 230              drqx:2;    /* DRQ Index (0=DMA0, 1=DMA7, 2=DMA6, 3=DMA5) */
 231    unchar  sync;        /* 1 if scsi target id 7...0 is running sync scsi */
 232 
 233    /* Structure extension defined in EATA 2.0B */
 234    unchar  isaena:1,    /* ISA i/o addressing is disabled/enabled */
 235          forcaddr:1,    /* Port address has been forced */
 236                  :6;
 237    unchar  max_id:5,    /* Max number of SCSI target IDs */
 238          max_chan:3;    /* Max SCSI channel number on this board */
 239 
 240    ushort ipad[249];
 241    };
 242 
 243 /* Board config structure */
 244 struct eata_config {
 245    ushort len;          /* Number of bytes following this field */
 246    unchar edis:1,       /* Disable EATA interface after config command */
 247          ocena:1,       /* Overlapped Commands Enabled */
 248         mdpena:1,       /* Transfer all Modified Data Pointer Messages */
 249         tarena:1,       /* Target Mode Enabled for this controller */
 250               :4;
 251    unchar cpad[511];
 252    };
 253 
 254 /* Returned status packet structure */
 255 struct mssp {
 256    unchar adapter_status:7,    /* State related to current command */
 257                      eoc:1;    /* End Of Command (1 = command completed) */
 258    unchar target_status;       /* SCSI status received after data transfer */
 259    unchar unused[2];
 260    ulong inv_res_len;          /* Number of bytes not transferred */
 261    Scsi_Cmnd *SCpnt;           /* Address set in cp */
 262    char mess[12];
 263    };
 264 
 265 /* MailBox SCSI Command Packet */
 266 struct mscp {
 267    unchar  sreset:1,     /* SCSI Bus Reset Signal should be asserted */
 268              init:1,     /* Re-initialize controller and self test */
 269            reqsen:1,     /* Transfer Request Sense Data to addr using DMA */
 270                sg:1,     /* Use Scatter/Gather */
 271                  :1,
 272            interp:1,     /* The controller interprets cp, not the target */ 
 273              dout:1,     /* Direction of Transfer is Out (Host to Target) */
 274               din:1;     /* Direction of Transfer is In (Target to Host) */
 275    unchar sense_len;     /* Request Sense Length */
 276    unchar unused[4];
 277    unchar phsunit:1,     /* Send to Target Physical Unit (bypass RAID) */
 278           notused:7;
 279    unchar target;        /* SCSI Target ID */
 280    unchar     lun:3,     /* LUN */
 281                  :2,
 282            luntar:1,     /* This cp is for Target (not LUN) */
 283            dispri:1,     /* Disconnect Privilege granted */
 284               one:1;     /* 1 */
 285    unchar mess[3];       /* Massage to/from Target */
 286    unchar cdb[12];       /* Command Descriptor Block */
 287    ulong  data_len;      /* If sg=0 Data Length, if sg=1 sglist length */
 288    Scsi_Cmnd *SCpnt;     /* Address to be returned is sp */
 289    ulong  data_address;  /* If sg=0 Data Address, if sg=1 sglist address */
 290    ulong  sp_addr;       /* Address where sp is DMA'ed when cp completes */
 291    ulong  sense_addr;    /* Address where Sense Data is DMA'ed on error */
 292 
 293    struct sg_list {
 294       unsigned int address;     /* Segment Address */
 295       unsigned int num_bytes;   /* Segment Length */
 296       } sglist[MAX_SGLIST];
 297 
 298    unsigned int index;   /* cp index */
 299    };
 300 
 301 struct hostdata {
 302    struct mscp cp[MAX_MAILBOXES];       /* Mailboxes for this board */
 303    unsigned int cp_stat[MAX_MAILBOXES]; /* FREE, IN_USE, LOCKED, IN_RESET */
 304    unsigned int last_cp_used;           /* Index of last mailbox used */
 305    unsigned int iocount;                /* Total i/o done for this board */
 306    unsigned int multicount;             /* Total ... in second ihdlr loop */
 307    int board_number;                    /* Number of this board */
 308    char board_name[16];                 /* Name of this board */
 309    char board_id[256];                  /* data from INQUIRY on this board */
 310    int in_reset;                        /* True if board is doing a reset */
 311    int target_time_out[MAX_TARGET];     /* N. of timeout errors on target */
 312    int target_reset[MAX_TARGET];        /* If TRUE redo operation on target */
 313    unsigned char subversion;            /* Bus type, either ISA or ESA */
 314    unsigned char protocol_rev;          /* EATA 2.0 rev., 'A' or 'B' or 'C' */
 315    struct mssp sp[MAX_MAILBOXES];       /* Returned status for this board */
 316    };
 317 
 318 static struct Scsi_Host * sh[MAX_BOARDS + 1];
 319 static const char* driver_name = "EATA";
 320 static unsigned int irqlist[MAX_IRQ], calls[MAX_IRQ];
 321 
 322 #define HD(board) ((struct hostdata *) &sh[board]->hostdata)
 323 #define BN(board) (HD(board)->board_name)
 324 
 325 static void eata2x_interrupt_handler(int, void *, struct pt_regs *);
 326 static int do_trace = FALSE;
 327 
 328 static inline unchar wait_on_busy(ushort iobase) {
     /* [previous][next][first][last][top][bottom][index][help] */
 329    unsigned int loop = MAXLOOP;
 330 
 331    while (inb(iobase + REG_AUX_STATUS) & ABSY_ASSERTED)
 332       if (--loop == 0) return TRUE;
 333 
 334    return FALSE;
 335 }
 336 
 337 static inline unchar do_dma (ushort iobase, unsigned int addr, unchar cmd) {
     /* [previous][next][first][last][top][bottom][index][help] */
 338 
 339    if (wait_on_busy(iobase)) return TRUE;
 340 
 341    if (addr) {
 342       outb((char)  addr,        iobase + REG_LOW);
 343       outb((char) (addr >> 8),  iobase + REG_LM);
 344       outb((char) (addr >> 16), iobase + REG_MID);
 345       outb((char) (addr >> 24), iobase + REG_MSB);
 346       }
 347 
 348    outb(cmd, iobase + REG_CMD);
 349    return FALSE;
 350 }
 351 
 352 static inline unchar read_pio (ushort iobase, ushort *start, ushort *end) {
     /* [previous][next][first][last][top][bottom][index][help] */
 353    unsigned int loop = MAXLOOP;
 354    ushort *p;
 355 
 356    for (p = start; p <= end; p++) {
 357 
 358       while (!(inb(iobase + REG_STATUS) & DRQ_ASSERTED)) 
 359          if (--loop == 0) return TRUE;
 360 
 361       loop = MAXLOOP;
 362       *p = inw(iobase);
 363       }
 364 
 365    return FALSE;
 366 }
 367 
 368 static inline int port_detect(ushort *port_base, unsigned int j, 
     /* [previous][next][first][last][top][bottom][index][help] */
 369                               Scsi_Host_Template * tpnt) {
 370    unsigned char irq, dma_channel, subversion;
 371    unsigned char protocol_rev;
 372    struct eata_info info;
 373    const char *board_status;
 374 
 375    /* Allowed DMA channels for ISA (0 indicates reserved) */
 376    unsigned char dma_channel_table[4] = { 5, 6, 7, 0 };
 377 
 378    char name[16];
 379 
 380    sprintf(name, "%s%d", driver_name, j);
 381 
 382    if(check_region(*port_base, REGION_SIZE)) {
 383       printk("%s: address 0x%03x in use, skipping probe.\n", 
 384              name, *port_base);
 385       return FALSE;
 386       }
 387 
 388    if (do_dma(*port_base, 0, READ_CONFIG_PIO)) return FALSE;
 389 
 390    /* Read the info structure */
 391    if (read_pio(*port_base, (ushort *)&info, (ushort *)&info.ipad[0])) 
 392       return FALSE;
 393 
 394    /* Check the controller "EATA" signature */
 395    if (info.sign != EATA_SIGNATURE) return FALSE;
 396 
 397    if (ntohl(info.data_len) < EATA_2_0A_SIZE) {
 398       printk("%s: config structure size (%ld bytes) too short, detaching.\n", 
 399              name, ntohl(info.data_len));
 400       return FALSE;
 401       }
 402    else if (ntohl(info.data_len) == EATA_2_0A_SIZE)
 403       protocol_rev = 'A';
 404    else if (ntohl(info.data_len) == EATA_2_0B_SIZE)
 405       protocol_rev = 'B';
 406    else
 407       protocol_rev = 'C';
 408 
 409    if (protocol_rev != 'A' && info.max_chan > 0)
 410       printk("%s: warning, only scsi channel 0 is supported.\n", name);
 411 
 412    irq = info.irq;
 413 
 414    if (*port_base & EISA_RANGE) {
 415 
 416       if (!info.haaval || info.ata || info.drqvld) {
 417          printk("%s: unusable EISA board found (%d%d%d), detaching.\n", 
 418                 name, info.haaval, info.ata, info.drqvld);
 419          return FALSE;
 420          }
 421 
 422       subversion = ESA;
 423       dma_channel = NO_DMA;
 424       }
 425    else {
 426 
 427       if (!info.haaval || info.ata || !info.drqvld) {
 428          printk("%s: unusable ISA board found (%d%d%d), detaching.\n",
 429                 name, info.haaval, info.ata, info.drqvld);
 430          return FALSE;
 431          }
 432 
 433       subversion = ISA;
 434       dma_channel = dma_channel_table[3 - info.drqx];
 435       }
 436 
 437    if (!info.dmasup)
 438       printk("%s: warning, DMA protocol support not asserted.\n", name);
 439 
 440    if (subversion == ESA && !info.irq_tr)
 441       printk("%s: warning, LEVEL triggering is suggested for IRQ %u.\n",
 442              name, irq);
 443 
 444    if (info.second)
 445       board_status = "Sec.";
 446    else
 447       board_status = "Prim.";
 448 
 449    /* Board detected, allocate its IRQ if not already done */
 450    if ((irq >= MAX_IRQ) || ((irqlist[irq] == NO_IRQ) && request_irq
 451        (irq, eata2x_interrupt_handler, SA_INTERRUPT, driver_name, NULL))) {
 452       printk("%s: unable to allocate IRQ %u, detaching.\n", name, irq);
 453       return FALSE;
 454       }
 455 
 456    if (subversion == ISA && request_dma(dma_channel, driver_name)) {
 457       printk("%s: unable to allocate DMA channel %u, detaching.\n",
 458              name, dma_channel);
 459       free_irq(irq, NULL);
 460       return FALSE;
 461       }
 462 
 463 #if defined (FORCE_CONFIG)
 464    {
 465    struct eata_config config;
 466 
 467    /* Set board configuration */
 468    memset((char *)&config, 0, sizeof(struct eata_config));
 469    config.len = (ushort) htons((ushort)510);
 470    config.ocena = TRUE;
 471 
 472    if (do_dma(*port_base, (unsigned int)&config, SET_CONFIG_DMA)) {
 473       printk("%s: busy timeout sending configuration, detaching.\n", name);
 474       return FALSE;
 475       }
 476    }
 477 #endif
 478 
 479    sh[j] = scsi_register(tpnt, sizeof(struct hostdata));
 480 
 481    if (sh[j] == NULL) {
 482       printk("%s: unable to register host, detaching.\n", name);
 483 
 484       if (irqlist[irq] == NO_IRQ) free_irq(irq, NULL);
 485 
 486       if (subversion == ISA) free_dma(dma_channel);
 487 
 488       return FALSE;
 489       }
 490 
 491    sh[j]->io_port = *port_base;
 492    sh[j]->n_io_port = REGION_SIZE;
 493    sh[j]->dma_channel = dma_channel;
 494    sh[j]->irq = irq;
 495    sh[j]->sg_tablesize = (ushort) ntohs(info.scatt_size);
 496    sh[j]->this_id = (ushort) info.host_addr[3];
 497    sh[j]->can_queue = (ushort) ntohs(info.queue_size);
 498    sh[j]->cmd_per_lun = MAX_CMD_PER_LUN;
 499 
 500    /* Register the I/O space that we use */
 501    request_region(sh[j]->io_port, REGION_SIZE, driver_name);
 502 
 503    memset(HD(j), 0, sizeof(struct hostdata));
 504    HD(j)->subversion = subversion;
 505    HD(j)->protocol_rev = protocol_rev;
 506    HD(j)->board_number = j;
 507    irqlist[irq] = j;
 508 
 509    if (HD(j)->subversion == ESA)
 510       sh[j]->unchecked_isa_dma = FALSE;
 511    else {
 512       sh[j]->wish_block = TRUE;
 513       sh[j]->unchecked_isa_dma = TRUE;
 514       disable_dma(dma_channel);
 515       clear_dma_ff(dma_channel);
 516       set_dma_mode(dma_channel, DMA_MODE_CASCADE);
 517       enable_dma(dma_channel);
 518       }
 519 
 520    strcpy(BN(j), name);
 521 
 522    printk("%s: 2.0%c, %s, ID %d, PORT 0x%03x, IRQ %u, DMA %u, SG %d, "\
 523           "Mbox %d, CmdLun %d.\n", BN(j), HD(j)->protocol_rev, board_status, 
 524            sh[j]->this_id, sh[j]->io_port, sh[j]->irq, sh[j]->dma_channel,
 525            sh[j]->sg_tablesize, sh[j]->can_queue, sh[j]->cmd_per_lun);
 526 
 527    /* DPT PM2012 does not allow to detect sg_tablesize correctly */
 528    if (sh[j]->sg_tablesize > MAX_SGLIST || sh[j]->sg_tablesize < 2) {
 529       printk("%s: detect, forcing to use %d SG lists.\n", BN(j), MAX_SGLIST);
 530       sh[j]->sg_tablesize = MAX_SGLIST;
 531       }
 532 
 533    /* DPT PM2012 does not allow to detect can_queue correctly */
 534    if (sh[j]->can_queue > MAX_MAILBOXES || sh[j]->can_queue  < 2) {
 535       printk("%s: detect, forcing to use %d Mbox.\n", BN(j), MAX_MAILBOXES);
 536       sh[j]->can_queue = MAX_MAILBOXES;
 537       }
 538 
 539 #if defined (DEBUG_DETECT)
 540    if (protocol_rev != 'A')
 541       printk("%s: EATA 2.0%c, isaena %u, forcaddr %u, max_id %u,"\
 542              " max_chan %u.\n", name, protocol_rev, info.isaena, 
 543              info.forcaddr, info.max_id, info.max_chan);
 544 
 545    printk("%s: Version 0x%x, SYNC 0x%x, infol %ld, cpl %ld spl %ld.\n", 
 546           name, info.version, info.sync, ntohl(info.data_len), 
 547           ntohl(info.cp_len), ntohl(info.sp_len));
 548 #endif
 549 
 550    return TRUE;
 551 }
 552 
 553 int eata2x_detect (Scsi_Host_Template * tpnt) {
     /* [previous][next][first][last][top][bottom][index][help] */
 554    unsigned int j = 0, k, flags;
 555 
 556    ushort io_port[] = { 
 557       0x1c88, 0x2c88, 0x3c88, 0x4c88, 0x5c88, 0x6c88, 0x7c88, 0x8c88,
 558       0x9c88, 0xac88, 0xbc88, 0xcc88, 0xdc88, 0xec88, 0xfc88, 
 559       0x1f0,  0x170,  0x330,  0x230,  0x0
 560       };
 561 
 562    ushort *port_base = io_port;
 563 
 564    tpnt->proc_dir = &proc_scsi_eata2x;
 565 
 566    save_flags(flags);
 567    cli();
 568 
 569    for (k = 0; k < MAX_IRQ; k++) {
 570       irqlist[k] = NO_IRQ;
 571       calls[k] = 0;
 572       }
 573 
 574    for (k = 0; k < MAX_BOARDS + 1; k++) sh[k] = NULL;
 575 
 576    while (*port_base) {
 577 
 578       if (j < MAX_BOARDS && port_detect(port_base, j, tpnt)) j++;
 579 
 580       port_base++;
 581       }
 582 
 583    if (j > 0) 
 584       printk("EATA/DMA 2.0x: Copyright (C) 1994, 1995 Dario Ballabio.\n");
 585 
 586    restore_flags(flags);
 587    return j;
 588 }
 589 
 590 static inline void build_sg_list(struct mscp *cpp, Scsi_Cmnd *SCpnt) {
     /* [previous][next][first][last][top][bottom][index][help] */
 591    unsigned int k;
 592    struct scatterlist * sgpnt;
 593 
 594    sgpnt = (struct scatterlist *) SCpnt->request_buffer;
 595 
 596    for (k = 0; k < SCpnt->use_sg; k++) {
 597       cpp->sglist[k].address = htonl((unsigned int) sgpnt[k].address);
 598       cpp->sglist[k].num_bytes = htonl((unsigned int) sgpnt[k].length);
 599       }
 600 
 601    cpp->data_address = htonl((unsigned int) cpp->sglist);
 602    cpp->data_len = htonl((SCpnt->use_sg * sizeof(struct sg_list)));
 603 }
 604 
 605 int eata2x_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
     /* [previous][next][first][last][top][bottom][index][help] */
 606    unsigned int i, j, k, flags;
 607    struct mscp *cpp;
 608    struct mssp *spp;
 609 
 610    static const unsigned char data_out_cmds[] = {
 611       0x0a, 0x2a, 0x15, 0x55, 0x04, 0x07, 0x0b, 0x10, 0x16, 0x18, 0x1d, 
 612       0x24, 0x2b, 0x2e, 0x30, 0x31, 0x32, 0x38, 0x39, 0x3a, 0x3b, 0x3d, 
 613       0x3f, 0x40, 0x41, 0x4c, 0xaa, 0xae, 0xb0, 0xb1, 0xb2, 0xb6, 0xea
 614       };
 615 
 616    save_flags(flags);
 617    cli();
 618    /* j is the board number */
 619    j = ((struct hostdata *) SCpnt->host->hostdata)->board_number;
 620 
 621    if (!done) panic("%s: qcomm, pid %ld, null done.\n", BN(j), SCpnt->pid);
 622 
 623    /* i is the mailbox number, look for the first free mailbox 
 624       starting from last_cp_used */
 625    i = HD(j)->last_cp_used + 1;
 626 
 627    for (k = 0; k < sh[j]->can_queue; k++, i++) {
 628 
 629       if (i >= sh[j]->can_queue) i = 0;
 630 
 631       if (HD(j)->cp_stat[i] == FREE) {
 632          HD(j)->last_cp_used = i;
 633          break;
 634          }
 635       }
 636 
 637    if (k == sh[j]->can_queue) {
 638       printk("%s: qcomm, no free mailbox, resetting.\n", BN(j));
 639 
 640       if (HD(j)->in_reset) 
 641          printk("%s: qcomm, already in reset.\n", BN(j));
 642       else if (eata2x_reset(SCpnt) == SCSI_RESET_SUCCESS) 
 643          panic("%s: qcomm, SCSI_RESET_SUCCESS.\n", BN(j));
 644 
 645       SCpnt->result = DID_BUS_BUSY << 16; 
 646       SCpnt->host_scribble = NULL;
 647       printk("%s: qcomm, pid %ld, DID_BUS_BUSY, done.\n", BN(j), SCpnt->pid);
 648       restore_flags(flags);
 649       done(SCpnt);    
 650       return 0;
 651       }
 652 
 653    /* Set pointer to control packet structure */
 654    cpp = &HD(j)->cp[i];
 655 
 656    memset(cpp, 0, sizeof(struct mscp));
 657 
 658    /* Set pointer to status packet structure */
 659    spp = &HD(j)->sp[i];
 660 
 661    memset(spp, 0, sizeof(struct mssp));
 662 
 663    /* The EATA protocol uses Big Endian format, while Intel is Little Endian */
 664    cpp->sp_addr = htonl((unsigned int) spp);
 665 
 666    SCpnt->scsi_done = done;
 667    cpp->index = i;
 668    SCpnt->host_scribble = (unsigned char *) &cpp->index;
 669 
 670    if (do_trace) printk("%s: qcomm, mbox %d, target %d, pid %ld.\n",
 671                         BN(j), i, SCpnt->target, SCpnt->pid);
 672 
 673    for (k = 0; k < ARRAY_SIZE(data_out_cmds); k++)
 674      if (SCpnt->cmnd[0] == data_out_cmds[k]) {
 675         cpp->dout = TRUE;
 676         break;
 677         }
 678 
 679    cpp->din = !cpp->dout;
 680    cpp->reqsen = TRUE;
 681    cpp->dispri = TRUE;
 682    cpp->one = TRUE;
 683    cpp->target = SCpnt->target;
 684    cpp->lun = SCpnt->lun;  
 685    cpp->SCpnt = SCpnt;
 686    cpp->sense_addr = htonl((unsigned int) SCpnt->sense_buffer); 
 687    cpp->sense_len = sizeof SCpnt->sense_buffer;
 688 
 689    if (SCpnt->use_sg) {
 690       cpp->sg = TRUE;
 691       build_sg_list(cpp, SCpnt);
 692       }
 693    else {
 694       cpp->data_address = htonl((unsigned int) SCpnt->request_buffer);
 695       cpp->data_len = htonl(SCpnt->request_bufflen);
 696       }
 697 
 698    memcpy(cpp->cdb, SCpnt->cmnd, SCpnt->cmd_len);
 699 
 700    /* Send control packet to the board */
 701    if (do_dma(sh[j]->io_port, (unsigned int) cpp, SEND_CP_DMA)) {
 702       SCpnt->result = DID_ERROR << 16; 
 703       SCpnt->host_scribble = NULL;
 704       printk("%s: qcomm, target %d, pid %ld, adapter busy, DID_ERROR, done.\n", 
 705              BN(j), SCpnt->target, SCpnt->pid);
 706       restore_flags(flags);
 707       done(SCpnt);    
 708       return 0;
 709       }
 710 
 711    HD(j)->cp_stat[i] = IN_USE;
 712    restore_flags(flags);
 713    return 0;
 714 }
 715 
 716 int eata2x_abort (Scsi_Cmnd *SCarg) {
     /* [previous][next][first][last][top][bottom][index][help] */
 717    unsigned int i, j, flags;
 718 
 719    save_flags(flags);
 720    cli();
 721    j = ((struct hostdata *) SCarg->host->hostdata)->board_number;
 722 
 723    if (SCarg->host_scribble == NULL) {
 724       printk("%s: abort, target %d, pid %ld inactive.\n",
 725              BN(j), SCarg->target, SCarg->pid);
 726       restore_flags(flags);
 727       return SCSI_ABORT_NOT_RUNNING;
 728       }
 729 
 730    i = *(unsigned int *)SCarg->host_scribble;
 731    printk("%s: abort, mbox %d, target %d, pid %ld.\n", 
 732           BN(j), i, SCarg->target, SCarg->pid);
 733 
 734    if (i >= sh[j]->can_queue)
 735       panic("%s: abort, invalid SCarg->host_scribble.\n", BN(j));
 736 
 737    if (wait_on_busy(sh[j]->io_port)) {
 738       printk("%s: abort, timeout error.\n", BN(j));
 739       restore_flags(flags);
 740       return SCSI_ABORT_ERROR;
 741       }
 742 
 743    if (HD(j)->cp_stat[i] == FREE) {
 744       printk("%s: abort, mbox %d is free.\n", BN(j), i);
 745       restore_flags(flags);
 746       return SCSI_ABORT_NOT_RUNNING;
 747       }
 748 
 749    if (HD(j)->cp_stat[i] == IN_USE) {
 750       printk("%s: abort, mbox %d is in use.\n", BN(j), i);
 751 
 752       if (SCarg != HD(j)->cp[i].SCpnt)
 753          panic("%s: abort, mbox %d, SCarg %p, cp SCpnt %p.\n",
 754                BN(j), i, SCarg, HD(j)->cp[i].SCpnt);
 755 
 756       restore_flags(flags);
 757       return SCSI_ABORT_SNOOZE;
 758       }
 759 
 760    if (HD(j)->cp_stat[i] == IN_RESET) {
 761       printk("%s: abort, mbox %d is in reset.\n", BN(j), i);
 762       restore_flags(flags);
 763       return SCSI_ABORT_ERROR;
 764       }
 765 
 766    if (HD(j)->cp_stat[i] == LOCKED) {
 767       printk("%s: abort, mbox %d is locked.\n", BN(j), i);
 768       restore_flags(flags);
 769       return SCSI_ABORT_NOT_RUNNING;
 770       }
 771    restore_flags(flags);
 772    panic("%s: abort, mbox %d, invalid cp_stat.\n", BN(j), i);
 773 }
 774 
 775 int eata2x_reset (Scsi_Cmnd *SCarg) {
     /* [previous][next][first][last][top][bottom][index][help] */
 776    unsigned int i, j, flags, time, k, limit = 0;
 777    int arg_done = FALSE;
 778    Scsi_Cmnd *SCpnt;
 779 
 780    save_flags(flags);
 781    cli();
 782    j = ((struct hostdata *) SCarg->host->hostdata)->board_number;
 783    printk("%s: reset, enter, target %d, pid %ld.\n", 
 784           BN(j), SCarg->target, SCarg->pid);
 785 
 786    if (SCarg->host_scribble == NULL)
 787       printk("%s: reset, pid %ld inactive.\n", BN(j), SCarg->pid);
 788 
 789    if (HD(j)->in_reset) {
 790       printk("%s: reset, exit, already in reset.\n", BN(j));
 791       restore_flags(flags);
 792       return SCSI_RESET_ERROR;
 793       }
 794 
 795    if (wait_on_busy(sh[j]->io_port)) {
 796       printk("%s: reset, exit, timeout error.\n", BN(j));
 797       restore_flags(flags);
 798       return SCSI_RESET_ERROR;
 799       }
 800 
 801    for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE;
 802 
 803    for (k = 0; k < MAX_TARGET; k++) HD(j)->target_time_out[k] = 0;
 804 
 805    for (i = 0; i < sh[j]->can_queue; i++) {
 806 
 807       if (HD(j)->cp_stat[i] == FREE) continue;
 808 
 809       if (HD(j)->cp_stat[i] == LOCKED) {
 810          HD(j)->cp_stat[i] = FREE;
 811          printk("%s: reset, locked mbox %d forced free.\n", BN(j), i);
 812          continue;
 813          }
 814 
 815       SCpnt = HD(j)->cp[i].SCpnt;
 816       HD(j)->cp_stat[i] = IN_RESET;
 817       printk("%s: reset, mbox %d in reset, pid %ld.\n",
 818              BN(j), i, SCpnt->pid);
 819 
 820       if (SCpnt == NULL)
 821          panic("%s: reset, mbox %d, SCpnt == NULL.\n", BN(j), i);
 822 
 823       if (SCpnt->host_scribble == NULL)
 824          panic("%s: reset, mbox %d, garbled SCpnt.\n", BN(j), i);
 825 
 826       if (*(unsigned int *)SCpnt->host_scribble != i) 
 827          panic("%s: reset, mbox %d, index mismatch.\n", BN(j), i);
 828 
 829       if (SCpnt->scsi_done == NULL) 
 830          panic("%s: reset, mbox %d, SCpnt->scsi_done == NULL.\n", BN(j), i);
 831 
 832       if (SCpnt == SCarg) arg_done = TRUE;
 833       }
 834 
 835    if (do_dma(sh[j]->io_port, 0, RESET_PIO)) {
 836       printk("%s: reset, cannot reset, timeout error.\n", BN(j));
 837       restore_flags(flags);
 838       return SCSI_RESET_ERROR;
 839       }
 840 
 841    printk("%s: reset, board reset done, enabling interrupts.\n", BN(j));
 842 
 843 #if defined (DEBUG_RESET)
 844    do_trace = TRUE;
 845 #endif
 846 
 847    HD(j)->in_reset = TRUE;
 848    sti();
 849    time = jiffies;
 850    while (jiffies < (time + 100) && limit++ < 100000000);
 851    cli();
 852    printk("%s: reset, interrupts disabled, loops %d.\n", BN(j), limit);
 853 
 854    for (i = 0; i < sh[j]->can_queue; i++) {
 855 
 856       /* Skip mailboxes already set free by interrupt */
 857       if (HD(j)->cp_stat[i] != IN_RESET) continue;
 858 
 859       SCpnt = HD(j)->cp[i].SCpnt;
 860       SCpnt->result = DID_RESET << 16;
 861       SCpnt->host_scribble = NULL;
 862 
 863       /* This mailbox is still waiting for its interrupt */
 864       HD(j)->cp_stat[i] = LOCKED;
 865 
 866       printk("%s, reset, mbox %d locked, DID_RESET, pid %ld done.\n",
 867              BN(j), i, SCpnt->pid);
 868       restore_flags(flags);
 869       SCpnt->scsi_done(SCpnt);
 870       cli();
 871       }
 872 
 873    HD(j)->in_reset = FALSE;
 874    do_trace = FALSE;
 875    restore_flags(flags);
 876 
 877    if (arg_done) {
 878       printk("%s: reset, exit, success.\n", BN(j));
 879       return SCSI_RESET_SUCCESS;
 880       }
 881    else {
 882       printk("%s: reset, exit, wakeup.\n", BN(j));
 883       return SCSI_RESET_PUNT;
 884       }
 885 }
 886 
 887 static void eata2x_interrupt_handler(int irq, void *dev_id, struct pt_regs * regs) {
     /* [previous][next][first][last][top][bottom][index][help] */
 888    Scsi_Cmnd *SCpnt;
 889    unsigned int i, j, k, flags, status, tstatus, loops, total_loops = 0;
 890    struct mssp *spp;
 891    struct mscp *cpp;
 892 
 893    save_flags(flags);
 894    cli();
 895 
 896    if (irqlist[irq] == NO_IRQ) {
 897       printk("%s, ihdlr, irq %d, unexpected interrupt.\n", driver_name, irq);
 898       restore_flags(flags);
 899       return;
 900       }
 901 
 902    if (do_trace) printk("%s: ihdlr, enter, irq %d, calls %d.\n", 
 903                         driver_name, irq, calls[irq]);
 904 
 905    /* Service all the boards configured on this irq */
 906    for (j = 0; sh[j] != NULL; j++) {
 907 
 908       if (sh[j]->irq != irq) continue;
 909 
 910       loops = 0;
 911 
 912       /* Loop until all interrupts for a board are serviced */
 913       while (inb(sh[j]->io_port + REG_AUX_STATUS) & IRQ_ASSERTED) {
 914          total_loops++;
 915          loops++;
 916 
 917          if (do_trace) printk("%s: ihdlr, start service, count %d.\n",
 918                               BN(j), HD(j)->iocount);
 919    
 920          /* Read the status register to clear the interrupt indication */
 921          inb(sh[j]->io_port + REG_STATUS);
 922    
 923          /* Service all mailboxes of this board */
 924          for (i = 0; i < sh[j]->can_queue; i++) {
 925             spp = &HD(j)->sp[i];
 926    
 927             /* Check if this mailbox has completed the operation */
 928             if (spp->eoc == FALSE) continue;
 929    
 930             spp->eoc = FALSE;
 931    
 932             if (HD(j)->cp_stat[i] == IGNORE) {
 933                HD(j)->cp_stat[i] = FREE;
 934                continue;
 935                }
 936             else if (HD(j)->cp_stat[i] == LOCKED) {
 937                HD(j)->cp_stat[i] = FREE;
 938                printk("%s: ihdlr, mbox %d unlocked, count %d.\n",
 939                       BN(j), i, HD(j)->iocount);
 940                continue;
 941                }
 942             else if (HD(j)->cp_stat[i] == FREE) {
 943                printk("%s: ihdlr, mbox %d is free, count %d.\n", 
 944                       BN(j), i, HD(j)->iocount);
 945                continue;
 946                }
 947             else if (HD(j)->cp_stat[i] == IN_RESET)
 948                printk("%s: ihdlr, mbox %d is in reset.\n", BN(j), i);
 949             else if (HD(j)->cp_stat[i] != IN_USE) 
 950                panic("%s: ihdlr, mbox %d, invalid cp_stat.\n", BN(j), i);
 951    
 952             HD(j)->cp_stat[i] = FREE;
 953             cpp = &HD(j)->cp[i];
 954             SCpnt = spp->SCpnt;
 955    
 956             if (SCpnt == NULL)
 957                panic("%s: ihdlr, mbox %d, SCpnt == NULL.\n", BN(j), i);
 958    
 959             if (SCpnt != cpp->SCpnt)
 960                panic("%s: ihdlr, mbox %d, sp SCpnt %p, cp SCpnt %p.\n",
 961                      BN(j), i, SCpnt, cpp->SCpnt);
 962    
 963             if (SCpnt->host_scribble == NULL)
 964                panic("%s: ihdlr, mbox %d, pid %ld, SCpnt %p garbled.\n",
 965                      BN(j), i, SCpnt->pid, SCpnt);
 966    
 967             if (*(unsigned int *)SCpnt->host_scribble != i) 
 968                panic("%s: ihdlr, mbox %d, pid %ld, index mismatch %d,"\
 969                      " irq %d.\n", BN(j), i, SCpnt->pid, 
 970                      *(unsigned int *)SCpnt->host_scribble, irq);
 971    
 972             tstatus = status_byte(spp->target_status);
 973    
 974             switch (spp->adapter_status) {
 975                case ASOK:     /* status OK */
 976    
 977                   /* Forces a reset if a disk drive keeps returning BUSY */
 978                   if (tstatus == BUSY && SCpnt->device->type != TYPE_TAPE) 
 979                      status = DID_ERROR << 16;
 980    
 981                   /* If there was a bus reset, redo operation on each target */
 982                   else if (tstatus != GOOD
 983                            && SCpnt->device->type == TYPE_DISK
 984                            && HD(j)->target_reset[SCpnt->target])
 985                      status = DID_BUS_BUSY << 16;
 986    
 987                   /* Works around a flaw in scsi.c */
 988                   else if (tstatus == CHECK_CONDITION
 989                            && SCpnt->device->type == TYPE_DISK
 990                            && (SCpnt->sense_buffer[2] & 0xf) == RECOVERED_ERROR)
 991                      status = DID_BUS_BUSY << 16;
 992 
 993                   else
 994                      status = DID_OK << 16;
 995    
 996                   if (tstatus == GOOD)
 997                      HD(j)->target_reset[SCpnt->target] = FALSE;
 998    
 999                   if (spp->target_status && SCpnt->device->type == TYPE_DISK)
1000                      printk("%s: ihdlr, target %d:%d, pid %ld, target_status "\
1001                             "0x%x, sense key 0x%x.\n", BN(j), 
1002                             SCpnt->target, SCpnt->lun, SCpnt->pid,
1003                             spp->target_status, SCpnt->sense_buffer[2]);
1004    
1005                   HD(j)->target_time_out[SCpnt->target] = 0;
1006    
1007                   break;
1008                case ASST:     /* Selection Time Out */
1009                case 0x02:     /* Command Time Out   */
1010    
1011                   if (HD(j)->target_time_out[SCpnt->target] > 1)
1012                      status = DID_ERROR << 16;
1013                   else {
1014                      status = DID_TIME_OUT << 16;
1015                      HD(j)->target_time_out[SCpnt->target]++;
1016                      }
1017    
1018                   break;
1019                case 0x03:     /* SCSI Bus Reset Received */
1020                case 0x04:     /* Initial Controller Power-up */
1021    
1022                   if (SCpnt->device->type != TYPE_TAPE)
1023                      status = DID_BUS_BUSY << 16;
1024                   else
1025                      status = DID_ERROR << 16;
1026    
1027                   for (k = 0; k < MAX_TARGET; k++) 
1028                      HD(j)->target_reset[k] = TRUE;
1029    
1030                   break;
1031                case 0x07:     /* Bus Parity Error */
1032                case 0x0c:     /* Controller Ram Parity */
1033                case 0x05:     /* Unexpected Bus Phase */
1034                case 0x06:     /* Unexpected Bus Free */
1035                case 0x08:     /* SCSI Hung */
1036                case 0x09:     /* Unexpected Message Reject */
1037                case 0x0a:     /* SCSI Bus Reset Stuck */
1038                case 0x0b:     /* Auto Request-Sense Failed */
1039                default:
1040                   status = DID_ERROR << 16;
1041                   break;
1042                }
1043    
1044             SCpnt->result = status | spp->target_status;
1045             HD(j)->iocount++;
1046 
1047             if (loops > 1) HD(j)->multicount++;
1048 
1049 #if defined (DEBUG_INTERRUPT)
1050             if (SCpnt->result || do_trace)
1051 #else
1052             if ((spp->adapter_status != ASOK && HD(j)->iocount >  1000) ||
1053                 (spp->adapter_status != ASOK && 
1054                  spp->adapter_status != ASST && HD(j)->iocount <= 1000) ||
1055                 do_trace)
1056 #endif
1057                printk("%s: ihdlr, mbox %d, err 0x%x:%x,"\
1058                       " target %d:%d, pid %ld, count %d.\n",
1059                       BN(j), i, spp->adapter_status, spp->target_status,
1060                       SCpnt->target, SCpnt->lun, SCpnt->pid, HD(j)->iocount);
1061    
1062             /* Set the command state to inactive */
1063             SCpnt->host_scribble = NULL;
1064    
1065             restore_flags(flags);
1066             SCpnt->scsi_done(SCpnt);
1067             cli();
1068 
1069             }   /* Mailbox loop */
1070 
1071          }   /* Multiple command loop */
1072 
1073       }   /* Boards loop */
1074 
1075    calls[irq]++;
1076 
1077    if (total_loops == 0) 
1078      printk("%s: ihdlr, irq %d, no command completed, calls %d.\n",
1079             driver_name, irq, calls[irq]);
1080 
1081    if (do_trace) printk("%s: ihdlr, exit, irq %d, calls %d.\n", 
1082                         driver_name, irq, calls[irq]);
1083 
1084 #if defined (DEBUG_STATISTICS)
1085    if ((calls[irq] % 100000) == 10000)
1086       for (j = 0; sh[j] != NULL; j++)
1087          printk("%s: ihdlr, calls %d, count %d, multi %d.\n", BN(j),
1088                 calls[(sh[j]->irq)], HD(j)->iocount, HD(j)->multicount);
1089 #endif
1090 
1091    restore_flags(flags);
1092    return;
1093 }
1094 
1095 #if defined(MODULE)
1096 Scsi_Host_Template driver_template = EATA;
1097 
1098 #include "scsi_module.c"
1099 #endif

/* [previous][next][first][last][top][bottom][index][help] */