Linux Audio

Check our new training course

Loading...
v3.15
   1/*
   2 *	ultrastor.c	Copyright (C) 1992 David B. Gentzel
   3 *	Low-level SCSI driver for UltraStor 14F, 24F, and 34F
   4 *	by David B. Gentzel, Whitfield Software Services, Carnegie, PA
   5 *	    (gentzel@nova.enet.dec.com)
   6 *  scatter/gather added by Scott Taylor (n217cg@tamuts.tamu.edu)
   7 *  24F and multiple command support by John F. Carr (jfc@athena.mit.edu)
   8 *    John's work modified by Caleb Epstein (cae@jpmorgan.com) and 
   9 *    Eric Youngdale (ericy@cais.com).
  10 *	Thanks to UltraStor for providing the necessary documentation
  11 *
  12 *  This is an old driver, for the 14F and 34F you should be using the
  13 *  u14-34f driver instead.
  14 */
  15
  16/*
  17 * TODO:
  18 *	1. Find out why scatter/gather is limited to 16 requests per command.
  19 *         This is fixed, at least on the 24F, as of version 1.12 - CAE.
  20 *	2. Look at command linking (mscp.command_link and
  21 *	   mscp.command_link_id).  (Does not work with many disks, 
  22 *				and no performance increase.  ERY).
  23 *	3. Allow multiple adapters.
  24 */
  25
  26/*
  27 * NOTES:
  28 *    The UltraStor 14F, 24F, and 34F are a family of intelligent, high
  29 *    performance SCSI-2 host adapters.  They all support command queueing
  30 *    and scatter/gather I/O.  Some of them can also emulate the standard
  31 *    WD1003 interface for use with OS's which don't support SCSI.  Here
  32 *    is the scoop on the various models:
  33 *	14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
  34 *	14N - ISA HA with floppy support.  I think that this is a non-DMA
  35 *	      HA.  Nothing further known.
  36 *	24F - EISA Bus Master HA with floppy support and WD1003 emulation.
  37 *	34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).
  38 *
  39 *    The 14F, 24F, and 34F are supported by this driver.
  40 *
  41 *    Places flagged with a triple question-mark are things which are either
  42 *    unfinished, questionable, or wrong.
  43 */
  44
  45/* Changes from version 1.11 alpha to 1.12
  46 *
  47 * Increased the size of the scatter-gather list to 33 entries for
  48 * the 24F adapter (it was 16).  I don't have the specs for the 14F
  49 * or the 34F, so they may support larger s-g lists as well.
  50 *
  51 * Caleb Epstein <cae@jpmorgan.com>
  52 */
  53
  54/* Changes from version 1.9 to 1.11
  55 *
  56 * Patches to bring this driver up to speed with the default kernel
  57 * driver which supports only the 14F and 34F adapters.  This version
  58 * should compile cleanly into 0.99.13, 0.99.12 and probably 0.99.11.
  59 *
  60 * Fixes from Eric Youngdale to fix a few possible race conditions and
  61 * several problems with bit testing operations (insufficient
  62 * parentheses).
  63 *
  64 * Removed the ultrastor_abort() and ultrastor_reset() functions
  65 * (enclosed them in #if 0 / #endif).  These functions, at least on
  66 * the 24F, cause the SCSI bus to do odd things and generally lead to
  67 * kernel panics and machine hangs.  This is like the Adaptec code.
  68 *
  69 * Use check/snarf_region for 14f, 34f to avoid I/O space address conflicts.
  70 */
  71
  72/* Changes from version 1.8 to version 1.9
  73 *
  74 *  0.99.11 patches (cae@jpmorgan.com) */
  75
  76/* Changes from version 1.7 to version 1.8
  77 *
  78 * Better error reporting.
  79 */
  80
  81/* Changes from version 1.6 to version 1.7
  82 *
  83 * Removed CSIR command code.
  84 *
  85 * Better race condition avoidance (xchgb function added).
  86 *
  87 * Set ICM and OGM status to zero at probe (24F)
  88 *
  89 * reset sends soft reset to UltraStor adapter
  90 *
  91 * reset adapter if adapter interrupts with an invalid MSCP address
  92 *
  93 * handle aborted command interrupt (24F)
  94 *
  95 */
  96
  97/* Changes from version 1.5 to version 1.6:
  98 *
  99 * Read MSCP address from ICM _before_ clearing the interrupt flag.
 100 * This fixes a race condition.
 101 */
 102
 103/* Changes from version 1.4 to version 1.5:
 104 *
 105 * Abort now calls done when multiple commands are enabled.
 106 *
 107 * Clear busy when aborted command finishes, not when abort is called.
 108 *
 109 * More debugging messages for aborts.
 110 */
 111
 112/* Changes from version 1.3 to version 1.4:
 113 *
 114 * Enable automatic request of sense data on error (requires newer version
 115 * of scsi.c to be useful).
 116 *
 117 * Fix PORT_OVERRIDE for 14F.
 118 *
 119 * Fix abort and reset to work properly (config.aborted wasn't cleared
 120 * after it was tested, so after a command abort no further commands would
 121 * work).
 122 *
 123 * Boot time test to enable SCSI bus reset (defaults to not allowing reset).
 124 *
 125 * Fix test for OGM busy -- the busy bit is in different places on the 24F.
 126 *
 127 * Release ICM slot by clearing first byte on 24F.
 128 */
 129
 130#include <linux/module.h>
 131#include <linux/blkdev.h>
 132#include <linux/interrupt.h>
 133#include <linux/stddef.h>
 134#include <linux/string.h>
 135#include <linux/kernel.h>
 136#include <linux/ioport.h>
 137#include <linux/proc_fs.h>
 138#include <linux/spinlock.h>
 139#include <linux/stat.h>
 140#include <linux/bitops.h>
 141#include <linux/delay.h>
 142
 143#include <asm/io.h>
 144#include <asm/dma.h>
 145
 146#define ULTRASTOR_PRIVATE	/* Get the private stuff from ultrastor.h */
 147#include "scsi.h"
 148#include <scsi/scsi_host.h>
 149#include "ultrastor.h"
 150
 151#define FALSE 0
 152#define TRUE 1
 153
 154#ifndef ULTRASTOR_DEBUG
 155#define ULTRASTOR_DEBUG (UD_ABORT|UD_CSIR|UD_RESET)
 156#endif
 157
 158#define VERSION "1.12"
 159
 160#define PACKED		__attribute__((packed))
 161#define ALIGNED(x)	__attribute__((aligned(x)))
 162
 163
 164/* The 14F uses an array of 4-byte ints for its scatter/gather list.
 165   The data can be unaligned, but need not be.  It's easier to give
 166   the list normal alignment since it doesn't need to fit into a
 167   packed structure.  */
 168
 169typedef struct {
 170  u32 address;
 171  u32 num_bytes;
 172} ultrastor_sg_list;
 173
 174
 175/* MailBox SCSI Command Packet.  Basic command structure for communicating
 176   with controller. */
 177struct mscp {
 178  unsigned char opcode: 3;		/* type of command */
 179  unsigned char xdir: 2;		/* data transfer direction */
 180  unsigned char dcn: 1;		/* disable disconnect */
 181  unsigned char ca: 1;		/* use cache (if available) */
 182  unsigned char sg: 1;		/* scatter/gather operation */
 183  unsigned char target_id: 3;		/* target SCSI id */
 184  unsigned char ch_no: 2;		/* SCSI channel (always 0 for 14f) */
 185  unsigned char lun: 3;		/* logical unit number */
 186  unsigned int transfer_data PACKED;	/* transfer data pointer */
 187  unsigned int transfer_data_length PACKED;	/* length in bytes */
 188  unsigned int command_link PACKED;	/* for linking command chains */
 189  unsigned char scsi_command_link_id;	/* identifies command in chain */
 190  unsigned char number_of_sg_list;	/* (if sg is set) 8 bytes per list */
 191  unsigned char length_of_sense_byte;
 192  unsigned char length_of_scsi_cdbs;	/* 6, 10, or 12 */
 193  unsigned char scsi_cdbs[12];	/* SCSI commands */
 194  unsigned char adapter_status;	/* non-zero indicates HA error */
 195  unsigned char target_status;	/* non-zero indicates target error */
 196  u32 sense_data PACKED;
 197  /* The following fields are for software only.  They are included in
 198     the MSCP structure because they are associated with SCSI requests.  */
 199  void (*done) (struct scsi_cmnd *);
 200  struct scsi_cmnd *SCint;
 201  ultrastor_sg_list sglist[ULTRASTOR_24F_MAX_SG]; /* use larger size for 24F */
 202};
 203
 204
 205/* Port addresses (relative to the base address) */
 206#define U14F_PRODUCT_ID(port) ((port) + 0x4)
 207#define CONFIG(port) ((port) + 0x6)
 208
 209/* Port addresses relative to the doorbell base address.  */
 210#define LCL_DOORBELL_MASK(port) ((port) + 0x0)
 211#define LCL_DOORBELL_INTR(port) ((port) + 0x1)
 212#define SYS_DOORBELL_MASK(port) ((port) + 0x2)
 213#define SYS_DOORBELL_INTR(port) ((port) + 0x3)
 214
 215
 216/* Used to store configuration info read from config i/o registers.  Most of
 217   this is not used yet, but might as well save it.
 218   
 219   This structure also holds port addresses that are not at the same offset
 220   on the 14F and 24F.
 221   
 222   This structure holds all data that must be duplicated to support multiple
 223   adapters.  */
 224
 225static struct ultrastor_config
 226{
 227  unsigned short port_address;		/* base address of card */
 228  unsigned short doorbell_address;	/* base address of doorbell CSRs */
 229  unsigned short ogm_address;		/* base address of OGM */
 230  unsigned short icm_address;		/* base address of ICM */
 231  const void *bios_segment;
 232  unsigned char interrupt: 4;
 233  unsigned char dma_channel: 3;
 234  unsigned char bios_drive_number: 1;
 235  unsigned char heads;
 236  unsigned char sectors;
 237  unsigned char ha_scsi_id: 3;
 238  unsigned char subversion: 4;
 239  unsigned char revision;
 240  /* The slot number is used to distinguish the 24F (slot != 0) from
 241     the 14F and 34F (slot == 0). */
 242  unsigned char slot;
 243
 244#ifdef PRINT_U24F_VERSION
 245  volatile int csir_done;
 246#endif
 247
 248  /* A pool of MSCP structures for this adapter, and a bitmask of
 249     busy structures.  (If ULTRASTOR_14F_MAX_CMDS == 1, a 1 byte
 250     busy flag is used instead.)  */
 251
 252#if ULTRASTOR_MAX_CMDS == 1
 253  unsigned char mscp_busy;
 254#else
 255  unsigned long mscp_free;
 256#endif
 257  volatile unsigned char aborted[ULTRASTOR_MAX_CMDS];
 258  struct mscp mscp[ULTRASTOR_MAX_CMDS];
 259} config = {0};
 260
 261/* Set this to 1 to reset the SCSI bus on error.  */
 262static int ultrastor_bus_reset;
 263
 264
 265/* Allowed BIOS base addresses (NULL indicates reserved) */
 266static const void *const bios_segment_table[8] = {
 267  NULL,	     (void *)0xC4000, (void *)0xC8000, (void *)0xCC000,
 268  (void *)0xD0000, (void *)0xD4000, (void *)0xD8000, (void *)0xDC000,
 269};
 270
 271/* Allowed IRQs for 14f */
 272static const unsigned char interrupt_table_14f[4] = { 15, 14, 11, 10 };
 273
 274/* Allowed DMA channels for 14f (0 indicates reserved) */
 275static const unsigned char dma_channel_table_14f[4] = { 5, 6, 7, 0 };
 276
 277/* Head/sector mappings allowed by 14f */
 278static const struct {
 279  unsigned char heads;
 280  unsigned char sectors;
 281} mapping_table[4] = { { 16, 63 }, { 64, 32 }, { 64, 63 }, { 64, 32 } };
 282
 283#ifndef PORT_OVERRIDE
 284/* ??? A probe of address 0x310 screws up NE2000 cards */
 285static const unsigned short ultrastor_ports_14f[] = {
 286  0x330, 0x340, /*0x310,*/ 0x230, 0x240, 0x210, 0x130, 0x140,
 287};
 288#endif
 289
 290static void ultrastor_interrupt(void *);
 291static irqreturn_t do_ultrastor_interrupt(int, void *);
 292static inline void build_sg_list(struct mscp *, struct scsi_cmnd *SCpnt);
 293
 294
 295/* Always called with host lock held */
 296
 297static inline int find_and_clear_bit_16(unsigned long *field)
 298{
 299  int rv;
 300
 301  if (*field == 0)
 302    panic("No free mscp");
 303
 304  asm volatile (
 305	"xorl %0,%0\n\t"
 306	"0: bsfw %1,%w0\n\t"
 307	"btr %0,%1\n\t"
 308	"jnc 0b"
 309	: "=&r" (rv), "+m" (*field) :);
 310
 311  return rv;
 312}
 313
 314/* This has been re-implemented with the help of Richard Earnshaw,
 315   <rwe@pegasus.esprit.ec.org> and works with gcc-2.5.8 and gcc-2.6.0.
 316   The instability noted by jfc below appears to be a bug in
 317   gcc-2.5.x when compiling w/o optimization.  --Caleb
 318
 319   This asm is fragile: it doesn't work without the casts and it may
 320   not work without optimization.  Maybe I should add a swap builtin
 321   to gcc.  --jfc  */
 322static inline unsigned char xchgb(unsigned char reg,
 323				  volatile unsigned char *mem)
 324{
 325  __asm__ ("xchgb %0,%1" : "=q" (reg), "=m" (*mem) : "0" (reg));
 326  return reg;
 327}
 328
 329#if ULTRASTOR_DEBUG & (UD_COMMAND | UD_ABORT)
 330
 331/* Always called with the host lock held */
 332static void log_ultrastor_abort(struct ultrastor_config *config,
 333				int command)
 334{
 335  static char fmt[80] = "abort %d (%x); MSCP free pool: %x;";
 336  int i;
 337
 338  for (i = 0; i < ULTRASTOR_MAX_CMDS; i++)
 339    {
 340      fmt[20 + i*2] = ' ';
 341      if (! (config->mscp_free & (1 << i)))
 342	fmt[21 + i*2] = '0' + config->mscp[i].target_id;
 343      else
 344	fmt[21 + i*2] = '-';
 345    }
 346  fmt[20 + ULTRASTOR_MAX_CMDS * 2] = '\n';
 347  fmt[21 + ULTRASTOR_MAX_CMDS * 2] = 0;
 348  printk(fmt, command, &config->mscp[command], config->mscp_free);
 349
 350}
 351#endif
 352
 353static int ultrastor_14f_detect(struct scsi_host_template * tpnt)
 354{
 355    size_t i;
 356    unsigned char in_byte, version_byte = 0;
 357    struct config_1 {
 358      unsigned char bios_segment: 3;
 359      unsigned char removable_disks_as_fixed: 1;
 360      unsigned char interrupt: 2;
 361    unsigned char dma_channel: 2;
 362    } config_1;
 363    struct config_2 {
 364      unsigned char ha_scsi_id: 3;
 365      unsigned char mapping_mode: 2;
 366      unsigned char bios_drive_number: 1;
 367      unsigned char tfr_port: 2;
 368    } config_2;
 369
 370#if (ULTRASTOR_DEBUG & UD_DETECT)
 371    printk("US14F: detect: called\n");
 372#endif
 373
 374    /* If a 24F has already been configured, don't look for a 14F.  */
 375    if (config.bios_segment)
 376	return FALSE;
 377
 378#ifdef PORT_OVERRIDE
 379    if(!request_region(PORT_OVERRIDE, 0xc, "ultrastor")) {
 380      printk("Ultrastor I/O space already in use\n");
 381      return FALSE;
 382    };
 383    config.port_address = PORT_OVERRIDE;
 384#else
 385    for (i = 0; i < ARRAY_SIZE(ultrastor_ports_14f); i++) {
 386      if(!request_region(ultrastor_ports_14f[i], 0x0c, "ultrastor")) continue;
 387      config.port_address = ultrastor_ports_14f[i];
 388#endif
 389
 390#if (ULTRASTOR_DEBUG & UD_DETECT)
 391	printk("US14F: detect: testing port address %03X\n", config.port_address);
 392#endif
 393
 394	in_byte = inb(U14F_PRODUCT_ID(config.port_address));
 395	if (in_byte != US14F_PRODUCT_ID_0) {
 396#if (ULTRASTOR_DEBUG & UD_DETECT)
 397# ifdef PORT_OVERRIDE
 398	    printk("US14F: detect: wrong product ID 0 - %02X\n", in_byte);
 399# else
 400	    printk("US14F: detect: no adapter at port %03X\n", config.port_address);
 401# endif
 402#endif
 403#ifdef PORT_OVERRIDE
 404	    goto out_release_port;
 405#else
 406	    release_region(config.port_address, 0x0c);
 407	    continue;
 408#endif
 409	}
 410	in_byte = inb(U14F_PRODUCT_ID(config.port_address) + 1);
 411	/* Only upper nibble is significant for Product ID 1 */
 412	if ((in_byte & 0xF0) != US14F_PRODUCT_ID_1) {
 413#if (ULTRASTOR_DEBUG & UD_DETECT)
 414# ifdef PORT_OVERRIDE
 415	    printk("US14F: detect: wrong product ID 1 - %02X\n", in_byte);
 416# else
 417	    printk("US14F: detect: no adapter at port %03X\n", config.port_address);
 418# endif
 419#endif
 420#ifdef PORT_OVERRIDE
 421	    goto out_release_port;
 422#else
 423	    release_region(config.port_address, 0x0c);
 424	    continue;
 425#endif
 426	}
 427	version_byte = in_byte;
 428#ifndef PORT_OVERRIDE
 429	break;
 430    }
 431    if (i == ARRAY_SIZE(ultrastor_ports_14f)) {
 432# if (ULTRASTOR_DEBUG & UD_DETECT)
 433	printk("US14F: detect: no port address found!\n");
 434# endif
 435	/* all ports probed already released - we can just go straight out */
 436	return FALSE;
 437    }
 438#endif
 439
 440#if (ULTRASTOR_DEBUG & UD_DETECT)
 441    printk("US14F: detect: adapter found at port address %03X\n",
 442	   config.port_address);
 443#endif
 444
 445    /* Set local doorbell mask to disallow bus reset unless
 446       ultrastor_bus_reset is true.  */
 447    outb(ultrastor_bus_reset ? 0xc2 : 0x82, LCL_DOORBELL_MASK(config.port_address));
 448
 449    /* All above tests passed, must be the right thing.  Get some useful
 450       info. */
 451
 452    /* Register the I/O space that we use */
 453
 454    *(char *)&config_1 = inb(CONFIG(config.port_address + 0));
 455    *(char *)&config_2 = inb(CONFIG(config.port_address + 1));
 456    config.bios_segment = bios_segment_table[config_1.bios_segment];
 457    config.doorbell_address = config.port_address;
 458    config.ogm_address = config.port_address + 0x8;
 459    config.icm_address = config.port_address + 0xC;
 460    config.interrupt = interrupt_table_14f[config_1.interrupt];
 461    config.ha_scsi_id = config_2.ha_scsi_id;
 462    config.heads = mapping_table[config_2.mapping_mode].heads;
 463    config.sectors = mapping_table[config_2.mapping_mode].sectors;
 464    config.bios_drive_number = config_2.bios_drive_number;
 465    config.subversion = (version_byte & 0x0F);
 466    if (config.subversion == U34F)
 467	config.dma_channel = 0;
 468    else
 469	config.dma_channel = dma_channel_table_14f[config_1.dma_channel];
 470
 471    if (!config.bios_segment) {
 472#if (ULTRASTOR_DEBUG & UD_DETECT)
 473	printk("US14F: detect: not detected.\n");
 474#endif
 475	goto out_release_port;
 476    }
 477
 478    /* Final consistency check, verify previous info. */
 479    if (config.subversion != U34F)
 480	if (!config.dma_channel || !(config_2.tfr_port & 0x2)) {
 481#if (ULTRASTOR_DEBUG & UD_DETECT)
 482	    printk("US14F: detect: consistency check failed\n");
 483#endif
 484           goto out_release_port;
 485	}
 486
 487    /* If we were TRULY paranoid, we could issue a host adapter inquiry
 488       command here and verify the data returned.  But frankly, I'm
 489       exhausted! */
 490
 491    /* Finally!  Now I'm satisfied... */
 492#if (ULTRASTOR_DEBUG & UD_DETECT)
 493    printk("US14F: detect: detect succeeded\n"
 494	   "  Port address: %03X\n"
 495	   "  BIOS segment: %05X\n"
 496	   "  Interrupt: %u\n"
 497	   "  DMA channel: %u\n"
 498	   "  H/A SCSI ID: %u\n"
 499	   "  Subversion: %u\n",
 500	   config.port_address, config.bios_segment, config.interrupt,
 501	   config.dma_channel, config.ha_scsi_id, config.subversion);
 502#endif
 503    tpnt->this_id = config.ha_scsi_id;
 504    tpnt->unchecked_isa_dma = (config.subversion != U34F);
 505
 506#if ULTRASTOR_MAX_CMDS > 1
 507    config.mscp_free = ~0;
 508#endif
 509
 510    /*
 511     * Brrr, &config.mscp[0].SCint->host) it is something magical....
 512     * XXX and FIXME
 513     */
 514    if (request_irq(config.interrupt, do_ultrastor_interrupt, 0, "Ultrastor", &config.mscp[0].SCint->device->host)) {
 515	printk("Unable to allocate IRQ%u for UltraStor controller.\n",
 516	       config.interrupt);
 517	goto out_release_port;
 518    }
 519    if (config.dma_channel && request_dma(config.dma_channel,"Ultrastor")) {
 520	printk("Unable to allocate DMA channel %u for UltraStor controller.\n",
 521	       config.dma_channel);
 522	free_irq(config.interrupt, NULL);
 523	goto out_release_port;
 524    }
 525    tpnt->sg_tablesize = ULTRASTOR_14F_MAX_SG;
 526    printk("UltraStor driver version" VERSION ".  Using %d SG lists.\n",
 527	   ULTRASTOR_14F_MAX_SG);
 528
 529    return TRUE;
 530out_release_port:
 531    release_region(config.port_address, 0x0c);
 532    return FALSE;
 533}
 534
 535static int ultrastor_24f_detect(struct scsi_host_template * tpnt)
 536{
 537  int i;
 538  struct Scsi_Host * shpnt = NULL;
 539
 540#if (ULTRASTOR_DEBUG & UD_DETECT)
 541  printk("US24F: detect");
 542#endif
 543
 544  /* probe each EISA slot at slot address C80 */
 545  for (i = 1; i < 15; i++)
 546    {
 547      unsigned char config_1, config_2;
 548      unsigned short addr = (i << 12) | ULTRASTOR_24F_PORT;
 549
 550      if (inb(addr) != US24F_PRODUCT_ID_0 &&
 551	  inb(addr+1) != US24F_PRODUCT_ID_1 &&
 552	  inb(addr+2) != US24F_PRODUCT_ID_2)
 553	continue;
 554
 555      config.revision = inb(addr+3);
 556      config.slot = i;
 557      if (! (inb(addr+4) & 1))
 558	{
 559#if (ULTRASTOR_DEBUG & UD_DETECT)
 560	  printk("U24F: found disabled card in slot %u\n", i);
 561#endif
 562	  continue;
 563	}
 564#if (ULTRASTOR_DEBUG & UD_DETECT)
 565      printk("U24F: found card in slot %u\n", i);
 566#endif
 567      config_1 = inb(addr + 5);
 568      config.bios_segment = bios_segment_table[config_1 & 7];
 569      switch(config_1 >> 4)
 570	{
 571	case 1:
 572	  config.interrupt = 15;
 573	  break;
 574	case 2:
 575	  config.interrupt = 14;
 576	  break;
 577	case 4:
 578	  config.interrupt = 11;
 579	  break;
 580	case 8:
 581	  config.interrupt = 10;
 582	  break;
 583	default:
 584	  printk("U24F: invalid IRQ\n");
 585	  return FALSE;
 586	}
 587
 588      /* BIOS addr set */
 589      /* base port set */
 590      config.port_address = addr;
 591      config.doorbell_address = addr + 12;
 592      config.ogm_address = addr + 0x17;
 593      config.icm_address = addr + 0x1C;
 594      config_2 = inb(addr + 7);
 595      config.ha_scsi_id = config_2 & 7;
 596      config.heads = mapping_table[(config_2 >> 3) & 3].heads;
 597      config.sectors = mapping_table[(config_2 >> 3) & 3].sectors;
 598#if (ULTRASTOR_DEBUG & UD_DETECT)
 599      printk("US24F: detect: detect succeeded\n"
 600	     "  Port address: %03X\n"
 601	     "  BIOS segment: %05X\n"
 602	     "  Interrupt: %u\n"
 603	     "  H/A SCSI ID: %u\n",
 604	     config.port_address, config.bios_segment,
 605	     config.interrupt, config.ha_scsi_id);
 606#endif
 607      tpnt->this_id = config.ha_scsi_id;
 608      tpnt->unchecked_isa_dma = 0;
 609      tpnt->sg_tablesize = ULTRASTOR_24F_MAX_SG;
 610
 611      shpnt = scsi_register(tpnt, 0);
 612      if (!shpnt) {
 613             printk(KERN_WARNING "(ultrastor:) Could not register scsi device. Aborting registration.\n");
 614             free_irq(config.interrupt, do_ultrastor_interrupt);
 615             return FALSE;
 616      }
 617      
 618      if (request_irq(config.interrupt, do_ultrastor_interrupt, 0, "Ultrastor", shpnt))
 619	{
 620	  printk("Unable to allocate IRQ%u for UltraStor controller.\n",
 621		 config.interrupt);
 622	  return FALSE;
 623	}
 624
 625      shpnt->irq = config.interrupt;
 626      shpnt->dma_channel = config.dma_channel;
 627      shpnt->io_port = config.port_address;
 628
 629#if ULTRASTOR_MAX_CMDS > 1
 630      config.mscp_free = ~0;
 631#endif
 632      /* Mark ICM and OGM free */
 633      outb(0, addr + 0x16);
 634      outb(0, addr + 0x1B);
 635
 636      /* Set local doorbell mask to disallow bus reset unless
 637	 ultrastor_bus_reset is true.  */
 638      outb(ultrastor_bus_reset ? 0xc2 : 0x82, LCL_DOORBELL_MASK(addr+12));
 639      outb(0x02, SYS_DOORBELL_MASK(addr+12));
 640      printk("UltraStor driver version " VERSION ".  Using %d SG lists.\n",
 641	     tpnt->sg_tablesize);
 642      return TRUE;
 643    }
 644  return FALSE;
 645}
 646
 647static int ultrastor_detect(struct scsi_host_template * tpnt)
 648{
 649	tpnt->proc_name = "ultrastor";
 650	return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
 651}
 652
 653static int ultrastor_release(struct Scsi_Host *shost)
 654{
 655	if (shost->irq)
 656		free_irq(shost->irq, NULL);
 657	if (shost->dma_channel != 0xff)
 658		free_dma(shost->dma_channel);
 659	if (shost->io_port && shost->n_io_port)
 660		release_region(shost->io_port, shost->n_io_port);
 661	scsi_unregister(shost);
 662	return 0;
 663}
 664
 665static const char *ultrastor_info(struct Scsi_Host * shpnt)
 666{
 667    static char buf[64];
 668
 669    if (config.slot)
 670      sprintf(buf, "UltraStor 24F SCSI @ Slot %u IRQ%u",
 671	      config.slot, config.interrupt);
 672    else if (config.subversion)
 673      sprintf(buf, "UltraStor 34F SCSI @ Port %03X BIOS %05X IRQ%u",
 674	      config.port_address, (int)config.bios_segment,
 675	      config.interrupt);
 676    else
 677      sprintf(buf, "UltraStor 14F SCSI @ Port %03X BIOS %05X IRQ%u DMA%u",
 678	      config.port_address, (int)config.bios_segment,
 679	      config.interrupt, config.dma_channel);
 680    return buf;
 681}
 682
 683static inline void build_sg_list(struct mscp *mscp, struct scsi_cmnd *SCpnt)
 684{
 685	struct scatterlist *sg;
 686	long transfer_length = 0;
 687	int i, max;
 688
 689	max = scsi_sg_count(SCpnt);
 690	scsi_for_each_sg(SCpnt, sg, max, i) {
 691		mscp->sglist[i].address = isa_page_to_bus(sg_page(sg)) + sg->offset;
 692		mscp->sglist[i].num_bytes = sg->length;
 693		transfer_length += sg->length;
 694	}
 695	mscp->number_of_sg_list = max;
 696	mscp->transfer_data = isa_virt_to_bus(mscp->sglist);
 697	/* ??? May not be necessary.  Docs are unclear as to whether transfer
 698	   length field is ignored or whether it should be set to the total
 699	   number of bytes of the transfer.  */
 700	mscp->transfer_data_length = transfer_length;
 701}
 702
 703static int ultrastor_queuecommand_lck(struct scsi_cmnd *SCpnt,
 704				void (*done) (struct scsi_cmnd *))
 705{
 706    struct mscp *my_mscp;
 707#if ULTRASTOR_MAX_CMDS > 1
 708    int mscp_index;
 709#endif
 710    unsigned int status;
 711
 712    /* Next test is for debugging; "can't happen" */
 713    if ((config.mscp_free & ((1U << ULTRASTOR_MAX_CMDS) - 1)) == 0)
 714	panic("ultrastor_queuecommand: no free MSCP\n");
 715    mscp_index = find_and_clear_bit_16(&config.mscp_free);
 716
 717    /* Has the command been aborted?  */
 718    if (xchgb(0xff, &config.aborted[mscp_index]) != 0)
 719      {
 720	status = DID_ABORT << 16;
 721	goto aborted;
 722      }
 723
 724    my_mscp = &config.mscp[mscp_index];
 725
 726    *(unsigned char *)my_mscp = OP_SCSI | (DTD_SCSI << 3);
 727
 728    /* Tape drives don't work properly if the cache is used.  The SCSI
 729       READ command for a tape doesn't have a block offset, and the adapter
 730       incorrectly assumes that all reads from the tape read the same
 731       blocks.  Results will depend on read buffer size and other disk
 732       activity. 
 733
 734       ???  Which other device types should never use the cache?   */
 735    my_mscp->ca = SCpnt->device->type != TYPE_TAPE;
 736    my_mscp->target_id = SCpnt->device->id;
 737    my_mscp->ch_no = 0;
 738    my_mscp->lun = SCpnt->device->lun;
 739    if (scsi_sg_count(SCpnt)) {
 740	/* Set scatter/gather flag in SCSI command packet */
 741	my_mscp->sg = TRUE;
 742	build_sg_list(my_mscp, SCpnt);
 743    } else {
 744	/* Unset scatter/gather flag in SCSI command packet */
 745	my_mscp->sg = FALSE;
 746	my_mscp->transfer_data = isa_virt_to_bus(scsi_sglist(SCpnt));
 747	my_mscp->transfer_data_length = scsi_bufflen(SCpnt);
 748    }
 749    my_mscp->command_link = 0;		/*???*/
 750    my_mscp->scsi_command_link_id = 0;	/*???*/
 751    my_mscp->length_of_sense_byte = SCSI_SENSE_BUFFERSIZE;
 752    my_mscp->length_of_scsi_cdbs = SCpnt->cmd_len;
 753    memcpy(my_mscp->scsi_cdbs, SCpnt->cmnd, my_mscp->length_of_scsi_cdbs);
 754    my_mscp->adapter_status = 0;
 755    my_mscp->target_status = 0;
 756    my_mscp->sense_data = isa_virt_to_bus(&SCpnt->sense_buffer);
 757    my_mscp->done = done;
 758    my_mscp->SCint = SCpnt;
 759    SCpnt->host_scribble = (unsigned char *)my_mscp;
 760
 761    /* Find free OGM slot.  On 24F, look for OGM status byte == 0.
 762       On 14F and 34F, wait for local interrupt pending flag to clear. 
 763       
 764       FIXME: now we are using new_eh we should punt here and let the
 765       midlayer sort it out */
 766
 767retry:
 768    if (config.slot)
 769	while (inb(config.ogm_address - 1) != 0 && config.aborted[mscp_index] == 0xff)
 770		barrier();
 771
 772    /* else??? */
 773
 774    while ((inb(LCL_DOORBELL_INTR(config.doorbell_address)) & (config.slot ? 2 : 1))  && config.aborted[mscp_index] == 0xff)
 775    	barrier();
 776
 777    /* To avoid race conditions, keep the code to write to the adapter
 778       atomic.  This simplifies the abort code.  Right now the
 779       scsi mid layer has the host_lock already held
 780     */
 781
 782    if (inb(LCL_DOORBELL_INTR(config.doorbell_address)) & (config.slot ? 2 : 1))
 783      goto retry;
 784
 785    status = xchgb(0, &config.aborted[mscp_index]);
 786    if (status != 0xff) {
 787
 788#if ULTRASTOR_DEBUG & (UD_COMMAND | UD_ABORT)
 789	printk("USx4F: queuecommand: aborted\n");
 790#if ULTRASTOR_MAX_CMDS > 1
 791	log_ultrastor_abort(&config, mscp_index);
 792#endif
 793#endif
 794	status <<= 16;
 795
 796      aborted:
 797	set_bit(mscp_index, &config.mscp_free);
 798	/* If the driver queues commands, call the done proc here.  Otherwise
 799	   return an error.  */
 800#if ULTRASTOR_MAX_CMDS > 1
 801	SCpnt->result = status;
 802	done(SCpnt);
 803	return 0;
 804#else
 805	return status;
 806#endif
 807    }
 808
 809    /* Store pointer in OGM address bytes */
 810    outl(isa_virt_to_bus(my_mscp), config.ogm_address);
 811
 812    /* Issue OGM interrupt */
 813    if (config.slot) {
 814	/* Write OGM command register on 24F */
 815	outb(1, config.ogm_address - 1);
 816	outb(0x2, LCL_DOORBELL_INTR(config.doorbell_address));
 817    } else {
 818	outb(0x1, LCL_DOORBELL_INTR(config.doorbell_address));
 819    }
 820
 821#if (ULTRASTOR_DEBUG & UD_COMMAND)
 822    printk("USx4F: queuecommand: returning\n");
 823#endif
 824
 825    return 0;
 826}
 827
 828static DEF_SCSI_QCMD(ultrastor_queuecommand)
 829
 830/* This code must deal with 2 cases:
 831
 832   1. The command has not been written to the OGM.  In this case, set
 833   the abort flag and return.
 834
 835   2. The command has been written to the OGM and is stuck somewhere in
 836   the adapter.
 837
 838   2a.  On a 24F, ask the adapter to abort the command.  It will interrupt
 839   when it does.
 840
 841   2b.  Call the command's done procedure.
 842
 843 */
 844
 845static int ultrastor_abort(struct scsi_cmnd *SCpnt)
 846{
 847#if ULTRASTOR_DEBUG & UD_ABORT
 848    char out[108];
 849    unsigned char icm_status = 0, ogm_status = 0;
 850    unsigned int icm_addr = 0, ogm_addr = 0;
 851#endif
 852    unsigned int mscp_index;
 853    unsigned char old_aborted;
 854    unsigned long flags;
 855    void (*done)(struct scsi_cmnd *);
 856    struct Scsi_Host *host = SCpnt->device->host;
 857
 858    if(config.slot) 
 859      return FAILED;  /* Do not attempt an abort for the 24f */
 860      
 861    /* Simple consistency checking */
 862    if(!SCpnt->host_scribble)
 863      return FAILED;
 864
 865    mscp_index = ((struct mscp *)SCpnt->host_scribble) - config.mscp;
 866    if (mscp_index >= ULTRASTOR_MAX_CMDS)
 867	panic("Ux4F aborting invalid MSCP");
 868
 869#if ULTRASTOR_DEBUG & UD_ABORT
 870    if (config.slot)
 871      {
 872	int port0 = (config.slot << 12) | 0xc80;
 873	int i;
 874	unsigned long flags;
 875	
 876	spin_lock_irqsave(host->host_lock, flags);
 877	strcpy(out, "OGM %d:%x ICM %d:%x ports:  ");
 878	for (i = 0; i < 16; i++)
 879	  {
 880	    unsigned char p = inb(port0 + i);
 881	    out[28 + i * 3] = "0123456789abcdef"[p >> 4];
 882	    out[29 + i * 3] = "0123456789abcdef"[p & 15];
 883	    out[30 + i * 3] = ' ';
 884	  }
 885	out[28 + i * 3] = '\n';
 886	out[29 + i * 3] = 0;
 887	ogm_status = inb(port0 + 22);
 888	ogm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 23));
 889	icm_status = inb(port0 + 27);
 890	icm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 28));
 891	spin_unlock_irqrestore(host->host_lock, flags);
 892      }
 893
 894    /* First check to see if an interrupt is pending.  I suspect the SiS
 895       chipset loses interrupts.  (I also suspect is mangles data, but
 896       one bug at a time... */
 897    if (config.slot ? inb(config.icm_address - 1) == 2 :
 898	(inb(SYS_DOORBELL_INTR(config.doorbell_address)) & 1))
 899      {
 900	printk("Ux4F: abort while completed command pending\n");
 901	
 902	spin_lock_irqsave(host->host_lock, flags);
 903	/* FIXME: Ewww... need to think about passing host around properly */
 904	ultrastor_interrupt(NULL);
 905	spin_unlock_irqrestore(host->host_lock, flags);
 906	return SUCCESS;
 907      }
 908#endif
 909
 910    old_aborted = xchgb(DID_ABORT, &config.aborted[mscp_index]);
 911
 912    /* aborted == 0xff is the signal that queuecommand has not yet sent
 913       the command.  It will notice the new abort flag and fail.  */
 914    if (old_aborted == 0xff)
 915	return SUCCESS;
 916
 917    /* On 24F, send an abort MSCP request.  The adapter will interrupt
 918       and the interrupt handler will call done.  */
 919    if (config.slot && inb(config.ogm_address - 1) == 0)
 920      {
 921	unsigned long flags;
 922
 923	spin_lock_irqsave(host->host_lock, flags);
 924	outl(isa_virt_to_bus(&config.mscp[mscp_index]), config.ogm_address);
 925	udelay(8);
 926	outb(0x80, config.ogm_address - 1);
 927	outb(0x2, LCL_DOORBELL_INTR(config.doorbell_address));
 928#if ULTRASTOR_DEBUG & UD_ABORT
 929	log_ultrastor_abort(&config, mscp_index);
 930	printk(out, ogm_status, ogm_addr, icm_status, icm_addr);
 931#endif
 932	spin_unlock_irqrestore(host->host_lock, flags);
 933	/* FIXME: add a wait for the abort to complete */
 934	return SUCCESS;
 935      }
 936
 937#if ULTRASTOR_DEBUG & UD_ABORT
 938    log_ultrastor_abort(&config, mscp_index);
 939#endif
 940
 941    /* Can't request a graceful abort.  Either this is not a 24F or
 942       the OGM is busy.  Don't free the command -- the adapter might
 943       still be using it.  Setting SCint = 0 causes the interrupt
 944       handler to ignore the command.  */
 945
 946    /* FIXME - devices that implement soft resets will still be running
 947       the command after a bus reset.  We would probably rather leave
 948       the command in the queue.  The upper level code will automatically
 949       leave the command in the active state instead of requeueing it. ERY */
 950
 951#if ULTRASTOR_DEBUG & UD_ABORT
 952    if (config.mscp[mscp_index].SCint != SCpnt)
 953	printk("abort: command mismatch, %p != %p\n",
 954	       config.mscp[mscp_index].SCint, SCpnt);
 955#endif
 956    if (config.mscp[mscp_index].SCint == NULL)
 957	return FAILED;
 958
 959    if (config.mscp[mscp_index].SCint != SCpnt) panic("Bad abort");
 960    config.mscp[mscp_index].SCint = NULL;
 961    done = config.mscp[mscp_index].done;
 962    config.mscp[mscp_index].done = NULL;
 963    SCpnt->result = DID_ABORT << 16;
 964    
 965    /* Take the host lock to guard against scsi layer re-entry */
 966    done(SCpnt);
 967
 968    /* Need to set a timeout here in case command never completes.  */
 969    return SUCCESS;
 970}
 971
 972static int ultrastor_host_reset(struct scsi_cmnd * SCpnt)
 973{
 974    unsigned long flags;
 975    int i;
 976    struct Scsi_Host *host = SCpnt->device->host;
 977    
 978#if (ULTRASTOR_DEBUG & UD_RESET)
 979    printk("US14F: reset: called\n");
 980#endif
 981
 982    if(config.slot)
 983    	return FAILED;
 984
 985    spin_lock_irqsave(host->host_lock, flags);
 986    /* Reset the adapter and SCSI bus.  The SCSI bus reset can be
 987       inhibited by clearing ultrastor_bus_reset before probe.  */
 988    outb(0xc0, LCL_DOORBELL_INTR(config.doorbell_address));
 989    if (config.slot)
 990      {
 991	outb(0, config.ogm_address - 1);
 992	outb(0, config.icm_address - 1);
 993      }
 994
 995#if ULTRASTOR_MAX_CMDS == 1
 996    if (config.mscp_busy && config.mscp->done && config.mscp->SCint)
 997      {
 998	config.mscp->SCint->result = DID_RESET << 16;
 999	config.mscp->done(config.mscp->SCint);
1000      }
1001    config.mscp->SCint = 0;
1002#else
1003    for (i = 0; i < ULTRASTOR_MAX_CMDS; i++)
1004      {
1005	if (! (config.mscp_free & (1 << i)) &&
1006	    config.mscp[i].done && config.mscp[i].SCint)
1007	  {
1008	    config.mscp[i].SCint->result = DID_RESET << 16;
1009	    config.mscp[i].done(config.mscp[i].SCint);
1010	    config.mscp[i].done = NULL;
1011	  }
1012	config.mscp[i].SCint = NULL;
1013      }
1014#endif
1015
1016    /* FIXME - if the device implements soft resets, then the command
1017       will still be running.  ERY  
1018       
1019       Even bigger deal with new_eh! 
1020     */
1021
1022    memset((unsigned char *)config.aborted, 0, sizeof config.aborted);
1023#if ULTRASTOR_MAX_CMDS == 1
1024    config.mscp_busy = 0;
1025#else
1026    config.mscp_free = ~0;
1027#endif
1028
1029    spin_unlock_irqrestore(host->host_lock, flags);
1030    return SUCCESS;
1031
1032}
1033
1034int ultrastor_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1035		sector_t capacity, int * dkinfo)
1036{
1037    int size = capacity;
1038    unsigned int s = config.heads * config.sectors;
1039
1040    dkinfo[0] = config.heads;
1041    dkinfo[1] = config.sectors;
1042    dkinfo[2] = size / s;	/* Ignore partial cylinders */
1043#if 0
1044    if (dkinfo[2] > 1024)
1045	dkinfo[2] = 1024;
1046#endif
1047    return 0;
1048}
1049
1050static void ultrastor_interrupt(void *dev_id)
1051{
1052    unsigned int status;
1053#if ULTRASTOR_MAX_CMDS > 1
1054    unsigned int mscp_index;
1055#endif
1056    struct mscp *mscp;
1057    void (*done) (struct scsi_cmnd *);
1058    struct scsi_cmnd *SCtmp;
1059
1060#if ULTRASTOR_MAX_CMDS == 1
1061    mscp = &config.mscp[0];
1062#else
1063    mscp = (struct mscp *)isa_bus_to_virt(inl(config.icm_address));
1064    mscp_index = mscp - config.mscp;
1065    if (mscp_index >= ULTRASTOR_MAX_CMDS) {
1066	printk("Ux4F interrupt: bad MSCP address %x\n", (unsigned int) mscp);
1067	/* A command has been lost.  Reset and report an error
1068	   for all commands.  */
1069	ultrastor_host_reset(dev_id);
1070	return;
1071    }
1072#endif
1073
1074    /* Clean ICM slot (set ICMINT bit to 0) */
1075    if (config.slot) {
1076	unsigned char icm_status = inb(config.icm_address - 1);
1077#if ULTRASTOR_DEBUG & (UD_INTERRUPT|UD_ERROR|UD_ABORT)
1078	if (icm_status != 1 && icm_status != 2)
1079	    printk("US24F: ICM status %x for MSCP %d (%x)\n", icm_status,
1080		   mscp_index, (unsigned int) mscp);
1081#endif
1082	/* The manual says clear interrupt then write 0 to ICM status.
1083	   This seems backwards, but I'll do it anyway.  --jfc */
1084	outb(2, SYS_DOORBELL_INTR(config.doorbell_address));
1085	outb(0, config.icm_address - 1);
1086	if (icm_status == 4) {
1087	    printk("UltraStor abort command failed\n");
1088	    return;
1089	}
1090	if (icm_status == 3) {
1091	    void (*done)(struct scsi_cmnd *) = mscp->done;
1092	    if (done) {
1093		mscp->done = NULL;
1094		mscp->SCint->result = DID_ABORT << 16;
1095		done(mscp->SCint);
1096	    }
1097	    return;
1098	}
1099    } else {
1100	outb(1, SYS_DOORBELL_INTR(config.doorbell_address));
1101    }
1102
1103    SCtmp = mscp->SCint;
1104    mscp->SCint = NULL;
1105
1106    if (!SCtmp)
1107      {
1108#if ULTRASTOR_DEBUG & (UD_ABORT|UD_INTERRUPT)
1109	printk("MSCP %d (%x): no command\n", mscp_index, (unsigned int) mscp);
1110#endif	
1111#if ULTRASTOR_MAX_CMDS == 1
1112	config.mscp_busy = FALSE;
1113#else
1114	set_bit(mscp_index, &config.mscp_free);
1115#endif
1116	config.aborted[mscp_index] = 0;
1117	return;
1118      }
1119
1120    /* Save done locally and zero before calling.  This is needed as
1121       once we call done, we may get another command queued before this
1122       interrupt service routine can return. */
1123    done = mscp->done;
1124    mscp->done = NULL;
1125
1126    /* Let the higher levels know that we're done */
1127    switch (mscp->adapter_status)
1128      {
1129      case 0:
1130	status = DID_OK << 16;
1131	break;
1132      case 0x01:	/* invalid command */
1133      case 0x02:	/* invalid parameters */
1134      case 0x03:	/* invalid data list */
1135      default:
1136	status = DID_ERROR << 16;
1137	break;
1138      case 0x84:	/* SCSI bus abort */
1139	status = DID_ABORT << 16;
1140	break;
1141      case 0x91:
1142	status = DID_TIME_OUT << 16;
1143	break;
1144      }
1145
1146    SCtmp->result = status | mscp->target_status;
1147
1148    SCtmp->host_scribble = NULL;
1149
1150    /* Free up mscp block for next command */
1151#if ULTRASTOR_MAX_CMDS == 1
1152    config.mscp_busy = FALSE;
1153#else
1154    set_bit(mscp_index, &config.mscp_free);
1155#endif
1156
1157#if ULTRASTOR_DEBUG & (UD_ABORT|UD_INTERRUPT)
1158    if (config.aborted[mscp_index])
1159	printk("Ux4 interrupt: MSCP %d (%x) aborted = %d\n",
1160	       mscp_index, (unsigned int) mscp, config.aborted[mscp_index]);
1161#endif
1162    config.aborted[mscp_index] = 0;
1163
1164    if (done)
1165	done(SCtmp);
1166    else
1167	printk("US14F: interrupt: unexpected interrupt\n");
1168
1169    if (config.slot ? inb(config.icm_address - 1) :
1170       (inb(SYS_DOORBELL_INTR(config.doorbell_address)) & 1))
1171#if (ULTRASTOR_DEBUG & UD_MULTI_CMD)
1172      printk("Ux4F: multiple commands completed\n");
1173#else
1174      ;
1175#endif
1176
1177#if (ULTRASTOR_DEBUG & UD_INTERRUPT)
1178    printk("USx4F: interrupt: returning\n");
1179#endif
1180}
1181
1182static irqreturn_t do_ultrastor_interrupt(int irq, void *dev_id)
1183{
1184    unsigned long flags;
1185    struct Scsi_Host *dev = dev_id;
1186    
1187    spin_lock_irqsave(dev->host_lock, flags);
1188    ultrastor_interrupt(dev_id);
1189    spin_unlock_irqrestore(dev->host_lock, flags);
1190    return IRQ_HANDLED;
1191}
1192
1193MODULE_LICENSE("GPL");
1194
1195static struct scsi_host_template driver_template = {
1196	.name              = "UltraStor 14F/24F/34F",
1197	.detect            = ultrastor_detect,
1198	.release	   = ultrastor_release,
1199	.info              = ultrastor_info,
1200	.queuecommand      = ultrastor_queuecommand,
1201	.eh_abort_handler  = ultrastor_abort,
1202	.eh_host_reset_handler  = ultrastor_host_reset,	
1203	.bios_param        = ultrastor_biosparam,
1204	.can_queue         = ULTRASTOR_MAX_CMDS,
1205	.sg_tablesize      = ULTRASTOR_14F_MAX_SG,
1206	.cmd_per_lun       = ULTRASTOR_MAX_CMDS_PER_LUN,
1207	.unchecked_isa_dma = 1,
1208	.use_clustering    = ENABLE_CLUSTERING,
1209};
1210#include "scsi_module.c"
v3.5.6
   1/*
   2 *	ultrastor.c	Copyright (C) 1992 David B. Gentzel
   3 *	Low-level SCSI driver for UltraStor 14F, 24F, and 34F
   4 *	by David B. Gentzel, Whitfield Software Services, Carnegie, PA
   5 *	    (gentzel@nova.enet.dec.com)
   6 *  scatter/gather added by Scott Taylor (n217cg@tamuts.tamu.edu)
   7 *  24F and multiple command support by John F. Carr (jfc@athena.mit.edu)
   8 *    John's work modified by Caleb Epstein (cae@jpmorgan.com) and 
   9 *    Eric Youngdale (ericy@cais.com).
  10 *	Thanks to UltraStor for providing the necessary documentation
  11 *
  12 *  This is an old driver, for the 14F and 34F you should be using the
  13 *  u14-34f driver instead.
  14 */
  15
  16/*
  17 * TODO:
  18 *	1. Find out why scatter/gather is limited to 16 requests per command.
  19 *         This is fixed, at least on the 24F, as of version 1.12 - CAE.
  20 *	2. Look at command linking (mscp.command_link and
  21 *	   mscp.command_link_id).  (Does not work with many disks, 
  22 *				and no performance increase.  ERY).
  23 *	3. Allow multiple adapters.
  24 */
  25
  26/*
  27 * NOTES:
  28 *    The UltraStor 14F, 24F, and 34F are a family of intelligent, high
  29 *    performance SCSI-2 host adapters.  They all support command queueing
  30 *    and scatter/gather I/O.  Some of them can also emulate the standard
  31 *    WD1003 interface for use with OS's which don't support SCSI.  Here
  32 *    is the scoop on the various models:
  33 *	14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
  34 *	14N - ISA HA with floppy support.  I think that this is a non-DMA
  35 *	      HA.  Nothing further known.
  36 *	24F - EISA Bus Master HA with floppy support and WD1003 emulation.
  37 *	34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).
  38 *
  39 *    The 14F, 24F, and 34F are supported by this driver.
  40 *
  41 *    Places flagged with a triple question-mark are things which are either
  42 *    unfinished, questionable, or wrong.
  43 */
  44
  45/* Changes from version 1.11 alpha to 1.12
  46 *
  47 * Increased the size of the scatter-gather list to 33 entries for
  48 * the 24F adapter (it was 16).  I don't have the specs for the 14F
  49 * or the 34F, so they may support larger s-g lists as well.
  50 *
  51 * Caleb Epstein <cae@jpmorgan.com>
  52 */
  53
  54/* Changes from version 1.9 to 1.11
  55 *
  56 * Patches to bring this driver up to speed with the default kernel
  57 * driver which supports only the 14F and 34F adapters.  This version
  58 * should compile cleanly into 0.99.13, 0.99.12 and probably 0.99.11.
  59 *
  60 * Fixes from Eric Youngdale to fix a few possible race conditions and
  61 * several problems with bit testing operations (insufficient
  62 * parentheses).
  63 *
  64 * Removed the ultrastor_abort() and ultrastor_reset() functions
  65 * (enclosed them in #if 0 / #endif).  These functions, at least on
  66 * the 24F, cause the SCSI bus to do odd things and generally lead to
  67 * kernel panics and machine hangs.  This is like the Adaptec code.
  68 *
  69 * Use check/snarf_region for 14f, 34f to avoid I/O space address conflicts.
  70 */
  71
  72/* Changes from version 1.8 to version 1.9
  73 *
  74 *  0.99.11 patches (cae@jpmorgan.com) */
  75
  76/* Changes from version 1.7 to version 1.8
  77 *
  78 * Better error reporting.
  79 */
  80
  81/* Changes from version 1.6 to version 1.7
  82 *
  83 * Removed CSIR command code.
  84 *
  85 * Better race condition avoidance (xchgb function added).
  86 *
  87 * Set ICM and OGM status to zero at probe (24F)
  88 *
  89 * reset sends soft reset to UltraStor adapter
  90 *
  91 * reset adapter if adapter interrupts with an invalid MSCP address
  92 *
  93 * handle aborted command interrupt (24F)
  94 *
  95 */
  96
  97/* Changes from version 1.5 to version 1.6:
  98 *
  99 * Read MSCP address from ICM _before_ clearing the interrupt flag.
 100 * This fixes a race condition.
 101 */
 102
 103/* Changes from version 1.4 to version 1.5:
 104 *
 105 * Abort now calls done when multiple commands are enabled.
 106 *
 107 * Clear busy when aborted command finishes, not when abort is called.
 108 *
 109 * More debugging messages for aborts.
 110 */
 111
 112/* Changes from version 1.3 to version 1.4:
 113 *
 114 * Enable automatic request of sense data on error (requires newer version
 115 * of scsi.c to be useful).
 116 *
 117 * Fix PORT_OVERRIDE for 14F.
 118 *
 119 * Fix abort and reset to work properly (config.aborted wasn't cleared
 120 * after it was tested, so after a command abort no further commands would
 121 * work).
 122 *
 123 * Boot time test to enable SCSI bus reset (defaults to not allowing reset).
 124 *
 125 * Fix test for OGM busy -- the busy bit is in different places on the 24F.
 126 *
 127 * Release ICM slot by clearing first byte on 24F.
 128 */
 129
 130#include <linux/module.h>
 131#include <linux/blkdev.h>
 132#include <linux/interrupt.h>
 133#include <linux/stddef.h>
 134#include <linux/string.h>
 135#include <linux/kernel.h>
 136#include <linux/ioport.h>
 137#include <linux/proc_fs.h>
 138#include <linux/spinlock.h>
 139#include <linux/stat.h>
 140#include <linux/bitops.h>
 141#include <linux/delay.h>
 142
 143#include <asm/io.h>
 144#include <asm/dma.h>
 145
 146#define ULTRASTOR_PRIVATE	/* Get the private stuff from ultrastor.h */
 147#include "scsi.h"
 148#include <scsi/scsi_host.h>
 149#include "ultrastor.h"
 150
 151#define FALSE 0
 152#define TRUE 1
 153
 154#ifndef ULTRASTOR_DEBUG
 155#define ULTRASTOR_DEBUG (UD_ABORT|UD_CSIR|UD_RESET)
 156#endif
 157
 158#define VERSION "1.12"
 159
 160#define PACKED		__attribute__((packed))
 161#define ALIGNED(x)	__attribute__((aligned(x)))
 162
 163
 164/* The 14F uses an array of 4-byte ints for its scatter/gather list.
 165   The data can be unaligned, but need not be.  It's easier to give
 166   the list normal alignment since it doesn't need to fit into a
 167   packed structure.  */
 168
 169typedef struct {
 170  u32 address;
 171  u32 num_bytes;
 172} ultrastor_sg_list;
 173
 174
 175/* MailBox SCSI Command Packet.  Basic command structure for communicating
 176   with controller. */
 177struct mscp {
 178  unsigned char opcode: 3;		/* type of command */
 179  unsigned char xdir: 2;		/* data transfer direction */
 180  unsigned char dcn: 1;		/* disable disconnect */
 181  unsigned char ca: 1;		/* use cache (if available) */
 182  unsigned char sg: 1;		/* scatter/gather operation */
 183  unsigned char target_id: 3;		/* target SCSI id */
 184  unsigned char ch_no: 2;		/* SCSI channel (always 0 for 14f) */
 185  unsigned char lun: 3;		/* logical unit number */
 186  unsigned int transfer_data PACKED;	/* transfer data pointer */
 187  unsigned int transfer_data_length PACKED;	/* length in bytes */
 188  unsigned int command_link PACKED;	/* for linking command chains */
 189  unsigned char scsi_command_link_id;	/* identifies command in chain */
 190  unsigned char number_of_sg_list;	/* (if sg is set) 8 bytes per list */
 191  unsigned char length_of_sense_byte;
 192  unsigned char length_of_scsi_cdbs;	/* 6, 10, or 12 */
 193  unsigned char scsi_cdbs[12];	/* SCSI commands */
 194  unsigned char adapter_status;	/* non-zero indicates HA error */
 195  unsigned char target_status;	/* non-zero indicates target error */
 196  u32 sense_data PACKED;
 197  /* The following fields are for software only.  They are included in
 198     the MSCP structure because they are associated with SCSI requests.  */
 199  void (*done) (struct scsi_cmnd *);
 200  struct scsi_cmnd *SCint;
 201  ultrastor_sg_list sglist[ULTRASTOR_24F_MAX_SG]; /* use larger size for 24F */
 202};
 203
 204
 205/* Port addresses (relative to the base address) */
 206#define U14F_PRODUCT_ID(port) ((port) + 0x4)
 207#define CONFIG(port) ((port) + 0x6)
 208
 209/* Port addresses relative to the doorbell base address.  */
 210#define LCL_DOORBELL_MASK(port) ((port) + 0x0)
 211#define LCL_DOORBELL_INTR(port) ((port) + 0x1)
 212#define SYS_DOORBELL_MASK(port) ((port) + 0x2)
 213#define SYS_DOORBELL_INTR(port) ((port) + 0x3)
 214
 215
 216/* Used to store configuration info read from config i/o registers.  Most of
 217   this is not used yet, but might as well save it.
 218   
 219   This structure also holds port addresses that are not at the same offset
 220   on the 14F and 24F.
 221   
 222   This structure holds all data that must be duplicated to support multiple
 223   adapters.  */
 224
 225static struct ultrastor_config
 226{
 227  unsigned short port_address;		/* base address of card */
 228  unsigned short doorbell_address;	/* base address of doorbell CSRs */
 229  unsigned short ogm_address;		/* base address of OGM */
 230  unsigned short icm_address;		/* base address of ICM */
 231  const void *bios_segment;
 232  unsigned char interrupt: 4;
 233  unsigned char dma_channel: 3;
 234  unsigned char bios_drive_number: 1;
 235  unsigned char heads;
 236  unsigned char sectors;
 237  unsigned char ha_scsi_id: 3;
 238  unsigned char subversion: 4;
 239  unsigned char revision;
 240  /* The slot number is used to distinguish the 24F (slot != 0) from
 241     the 14F and 34F (slot == 0). */
 242  unsigned char slot;
 243
 244#ifdef PRINT_U24F_VERSION
 245  volatile int csir_done;
 246#endif
 247
 248  /* A pool of MSCP structures for this adapter, and a bitmask of
 249     busy structures.  (If ULTRASTOR_14F_MAX_CMDS == 1, a 1 byte
 250     busy flag is used instead.)  */
 251
 252#if ULTRASTOR_MAX_CMDS == 1
 253  unsigned char mscp_busy;
 254#else
 255  unsigned long mscp_free;
 256#endif
 257  volatile unsigned char aborted[ULTRASTOR_MAX_CMDS];
 258  struct mscp mscp[ULTRASTOR_MAX_CMDS];
 259} config = {0};
 260
 261/* Set this to 1 to reset the SCSI bus on error.  */
 262static int ultrastor_bus_reset;
 263
 264
 265/* Allowed BIOS base addresses (NULL indicates reserved) */
 266static const void *const bios_segment_table[8] = {
 267  NULL,	     (void *)0xC4000, (void *)0xC8000, (void *)0xCC000,
 268  (void *)0xD0000, (void *)0xD4000, (void *)0xD8000, (void *)0xDC000,
 269};
 270
 271/* Allowed IRQs for 14f */
 272static const unsigned char interrupt_table_14f[4] = { 15, 14, 11, 10 };
 273
 274/* Allowed DMA channels for 14f (0 indicates reserved) */
 275static const unsigned char dma_channel_table_14f[4] = { 5, 6, 7, 0 };
 276
 277/* Head/sector mappings allowed by 14f */
 278static const struct {
 279  unsigned char heads;
 280  unsigned char sectors;
 281} mapping_table[4] = { { 16, 63 }, { 64, 32 }, { 64, 63 }, { 64, 32 } };
 282
 283#ifndef PORT_OVERRIDE
 284/* ??? A probe of address 0x310 screws up NE2000 cards */
 285static const unsigned short ultrastor_ports_14f[] = {
 286  0x330, 0x340, /*0x310,*/ 0x230, 0x240, 0x210, 0x130, 0x140,
 287};
 288#endif
 289
 290static void ultrastor_interrupt(void *);
 291static irqreturn_t do_ultrastor_interrupt(int, void *);
 292static inline void build_sg_list(struct mscp *, struct scsi_cmnd *SCpnt);
 293
 294
 295/* Always called with host lock held */
 296
 297static inline int find_and_clear_bit_16(unsigned long *field)
 298{
 299  int rv;
 300
 301  if (*field == 0)
 302    panic("No free mscp");
 303
 304  asm volatile (
 305	"xorl %0,%0\n\t"
 306	"0: bsfw %1,%w0\n\t"
 307	"btr %0,%1\n\t"
 308	"jnc 0b"
 309	: "=&r" (rv), "+m" (*field) :);
 310
 311  return rv;
 312}
 313
 314/* This has been re-implemented with the help of Richard Earnshaw,
 315   <rwe@pegasus.esprit.ec.org> and works with gcc-2.5.8 and gcc-2.6.0.
 316   The instability noted by jfc below appears to be a bug in
 317   gcc-2.5.x when compiling w/o optimization.  --Caleb
 318
 319   This asm is fragile: it doesn't work without the casts and it may
 320   not work without optimization.  Maybe I should add a swap builtin
 321   to gcc.  --jfc  */
 322static inline unsigned char xchgb(unsigned char reg,
 323				  volatile unsigned char *mem)
 324{
 325  __asm__ ("xchgb %0,%1" : "=q" (reg), "=m" (*mem) : "0" (reg));
 326  return reg;
 327}
 328
 329#if ULTRASTOR_DEBUG & (UD_COMMAND | UD_ABORT)
 330
 331/* Always called with the host lock held */
 332static void log_ultrastor_abort(struct ultrastor_config *config,
 333				int command)
 334{
 335  static char fmt[80] = "abort %d (%x); MSCP free pool: %x;";
 336  int i;
 337
 338  for (i = 0; i < ULTRASTOR_MAX_CMDS; i++)
 339    {
 340      fmt[20 + i*2] = ' ';
 341      if (! (config->mscp_free & (1 << i)))
 342	fmt[21 + i*2] = '0' + config->mscp[i].target_id;
 343      else
 344	fmt[21 + i*2] = '-';
 345    }
 346  fmt[20 + ULTRASTOR_MAX_CMDS * 2] = '\n';
 347  fmt[21 + ULTRASTOR_MAX_CMDS * 2] = 0;
 348  printk(fmt, command, &config->mscp[command], config->mscp_free);
 349
 350}
 351#endif
 352
 353static int ultrastor_14f_detect(struct scsi_host_template * tpnt)
 354{
 355    size_t i;
 356    unsigned char in_byte, version_byte = 0;
 357    struct config_1 {
 358      unsigned char bios_segment: 3;
 359      unsigned char removable_disks_as_fixed: 1;
 360      unsigned char interrupt: 2;
 361    unsigned char dma_channel: 2;
 362    } config_1;
 363    struct config_2 {
 364      unsigned char ha_scsi_id: 3;
 365      unsigned char mapping_mode: 2;
 366      unsigned char bios_drive_number: 1;
 367      unsigned char tfr_port: 2;
 368    } config_2;
 369
 370#if (ULTRASTOR_DEBUG & UD_DETECT)
 371    printk("US14F: detect: called\n");
 372#endif
 373
 374    /* If a 24F has already been configured, don't look for a 14F.  */
 375    if (config.bios_segment)
 376	return FALSE;
 377
 378#ifdef PORT_OVERRIDE
 379    if(!request_region(PORT_OVERRIDE, 0xc, "ultrastor")) {
 380      printk("Ultrastor I/O space already in use\n");
 381      return FALSE;
 382    };
 383    config.port_address = PORT_OVERRIDE;
 384#else
 385    for (i = 0; i < ARRAY_SIZE(ultrastor_ports_14f); i++) {
 386      if(!request_region(ultrastor_ports_14f[i], 0x0c, "ultrastor")) continue;
 387      config.port_address = ultrastor_ports_14f[i];
 388#endif
 389
 390#if (ULTRASTOR_DEBUG & UD_DETECT)
 391	printk("US14F: detect: testing port address %03X\n", config.port_address);
 392#endif
 393
 394	in_byte = inb(U14F_PRODUCT_ID(config.port_address));
 395	if (in_byte != US14F_PRODUCT_ID_0) {
 396#if (ULTRASTOR_DEBUG & UD_DETECT)
 397# ifdef PORT_OVERRIDE
 398	    printk("US14F: detect: wrong product ID 0 - %02X\n", in_byte);
 399# else
 400	    printk("US14F: detect: no adapter at port %03X\n", config.port_address);
 401# endif
 402#endif
 403#ifdef PORT_OVERRIDE
 404	    goto out_release_port;
 405#else
 406	    release_region(config.port_address, 0x0c);
 407	    continue;
 408#endif
 409	}
 410	in_byte = inb(U14F_PRODUCT_ID(config.port_address) + 1);
 411	/* Only upper nibble is significant for Product ID 1 */
 412	if ((in_byte & 0xF0) != US14F_PRODUCT_ID_1) {
 413#if (ULTRASTOR_DEBUG & UD_DETECT)
 414# ifdef PORT_OVERRIDE
 415	    printk("US14F: detect: wrong product ID 1 - %02X\n", in_byte);
 416# else
 417	    printk("US14F: detect: no adapter at port %03X\n", config.port_address);
 418# endif
 419#endif
 420#ifdef PORT_OVERRIDE
 421	    goto out_release_port;
 422#else
 423	    release_region(config.port_address, 0x0c);
 424	    continue;
 425#endif
 426	}
 427	version_byte = in_byte;
 428#ifndef PORT_OVERRIDE
 429	break;
 430    }
 431    if (i == ARRAY_SIZE(ultrastor_ports_14f)) {
 432# if (ULTRASTOR_DEBUG & UD_DETECT)
 433	printk("US14F: detect: no port address found!\n");
 434# endif
 435	/* all ports probed already released - we can just go straight out */
 436	return FALSE;
 437    }
 438#endif
 439
 440#if (ULTRASTOR_DEBUG & UD_DETECT)
 441    printk("US14F: detect: adapter found at port address %03X\n",
 442	   config.port_address);
 443#endif
 444
 445    /* Set local doorbell mask to disallow bus reset unless
 446       ultrastor_bus_reset is true.  */
 447    outb(ultrastor_bus_reset ? 0xc2 : 0x82, LCL_DOORBELL_MASK(config.port_address));
 448
 449    /* All above tests passed, must be the right thing.  Get some useful
 450       info. */
 451
 452    /* Register the I/O space that we use */
 453
 454    *(char *)&config_1 = inb(CONFIG(config.port_address + 0));
 455    *(char *)&config_2 = inb(CONFIG(config.port_address + 1));
 456    config.bios_segment = bios_segment_table[config_1.bios_segment];
 457    config.doorbell_address = config.port_address;
 458    config.ogm_address = config.port_address + 0x8;
 459    config.icm_address = config.port_address + 0xC;
 460    config.interrupt = interrupt_table_14f[config_1.interrupt];
 461    config.ha_scsi_id = config_2.ha_scsi_id;
 462    config.heads = mapping_table[config_2.mapping_mode].heads;
 463    config.sectors = mapping_table[config_2.mapping_mode].sectors;
 464    config.bios_drive_number = config_2.bios_drive_number;
 465    config.subversion = (version_byte & 0x0F);
 466    if (config.subversion == U34F)
 467	config.dma_channel = 0;
 468    else
 469	config.dma_channel = dma_channel_table_14f[config_1.dma_channel];
 470
 471    if (!config.bios_segment) {
 472#if (ULTRASTOR_DEBUG & UD_DETECT)
 473	printk("US14F: detect: not detected.\n");
 474#endif
 475	goto out_release_port;
 476    }
 477
 478    /* Final consistency check, verify previous info. */
 479    if (config.subversion != U34F)
 480	if (!config.dma_channel || !(config_2.tfr_port & 0x2)) {
 481#if (ULTRASTOR_DEBUG & UD_DETECT)
 482	    printk("US14F: detect: consistency check failed\n");
 483#endif
 484           goto out_release_port;
 485	}
 486
 487    /* If we were TRULY paranoid, we could issue a host adapter inquiry
 488       command here and verify the data returned.  But frankly, I'm
 489       exhausted! */
 490
 491    /* Finally!  Now I'm satisfied... */
 492#if (ULTRASTOR_DEBUG & UD_DETECT)
 493    printk("US14F: detect: detect succeeded\n"
 494	   "  Port address: %03X\n"
 495	   "  BIOS segment: %05X\n"
 496	   "  Interrupt: %u\n"
 497	   "  DMA channel: %u\n"
 498	   "  H/A SCSI ID: %u\n"
 499	   "  Subversion: %u\n",
 500	   config.port_address, config.bios_segment, config.interrupt,
 501	   config.dma_channel, config.ha_scsi_id, config.subversion);
 502#endif
 503    tpnt->this_id = config.ha_scsi_id;
 504    tpnt->unchecked_isa_dma = (config.subversion != U34F);
 505
 506#if ULTRASTOR_MAX_CMDS > 1
 507    config.mscp_free = ~0;
 508#endif
 509
 510    /*
 511     * Brrr, &config.mscp[0].SCint->host) it is something magical....
 512     * XXX and FIXME
 513     */
 514    if (request_irq(config.interrupt, do_ultrastor_interrupt, 0, "Ultrastor", &config.mscp[0].SCint->device->host)) {
 515	printk("Unable to allocate IRQ%u for UltraStor controller.\n",
 516	       config.interrupt);
 517	goto out_release_port;
 518    }
 519    if (config.dma_channel && request_dma(config.dma_channel,"Ultrastor")) {
 520	printk("Unable to allocate DMA channel %u for UltraStor controller.\n",
 521	       config.dma_channel);
 522	free_irq(config.interrupt, NULL);
 523	goto out_release_port;
 524    }
 525    tpnt->sg_tablesize = ULTRASTOR_14F_MAX_SG;
 526    printk("UltraStor driver version" VERSION ".  Using %d SG lists.\n",
 527	   ULTRASTOR_14F_MAX_SG);
 528
 529    return TRUE;
 530out_release_port:
 531    release_region(config.port_address, 0x0c);
 532    return FALSE;
 533}
 534
 535static int ultrastor_24f_detect(struct scsi_host_template * tpnt)
 536{
 537  int i;
 538  struct Scsi_Host * shpnt = NULL;
 539
 540#if (ULTRASTOR_DEBUG & UD_DETECT)
 541  printk("US24F: detect");
 542#endif
 543
 544  /* probe each EISA slot at slot address C80 */
 545  for (i = 1; i < 15; i++)
 546    {
 547      unsigned char config_1, config_2;
 548      unsigned short addr = (i << 12) | ULTRASTOR_24F_PORT;
 549
 550      if (inb(addr) != US24F_PRODUCT_ID_0 &&
 551	  inb(addr+1) != US24F_PRODUCT_ID_1 &&
 552	  inb(addr+2) != US24F_PRODUCT_ID_2)
 553	continue;
 554
 555      config.revision = inb(addr+3);
 556      config.slot = i;
 557      if (! (inb(addr+4) & 1))
 558	{
 559#if (ULTRASTOR_DEBUG & UD_DETECT)
 560	  printk("U24F: found disabled card in slot %u\n", i);
 561#endif
 562	  continue;
 563	}
 564#if (ULTRASTOR_DEBUG & UD_DETECT)
 565      printk("U24F: found card in slot %u\n", i);
 566#endif
 567      config_1 = inb(addr + 5);
 568      config.bios_segment = bios_segment_table[config_1 & 7];
 569      switch(config_1 >> 4)
 570	{
 571	case 1:
 572	  config.interrupt = 15;
 573	  break;
 574	case 2:
 575	  config.interrupt = 14;
 576	  break;
 577	case 4:
 578	  config.interrupt = 11;
 579	  break;
 580	case 8:
 581	  config.interrupt = 10;
 582	  break;
 583	default:
 584	  printk("U24F: invalid IRQ\n");
 585	  return FALSE;
 586	}
 587
 588      /* BIOS addr set */
 589      /* base port set */
 590      config.port_address = addr;
 591      config.doorbell_address = addr + 12;
 592      config.ogm_address = addr + 0x17;
 593      config.icm_address = addr + 0x1C;
 594      config_2 = inb(addr + 7);
 595      config.ha_scsi_id = config_2 & 7;
 596      config.heads = mapping_table[(config_2 >> 3) & 3].heads;
 597      config.sectors = mapping_table[(config_2 >> 3) & 3].sectors;
 598#if (ULTRASTOR_DEBUG & UD_DETECT)
 599      printk("US24F: detect: detect succeeded\n"
 600	     "  Port address: %03X\n"
 601	     "  BIOS segment: %05X\n"
 602	     "  Interrupt: %u\n"
 603	     "  H/A SCSI ID: %u\n",
 604	     config.port_address, config.bios_segment,
 605	     config.interrupt, config.ha_scsi_id);
 606#endif
 607      tpnt->this_id = config.ha_scsi_id;
 608      tpnt->unchecked_isa_dma = 0;
 609      tpnt->sg_tablesize = ULTRASTOR_24F_MAX_SG;
 610
 611      shpnt = scsi_register(tpnt, 0);
 612      if (!shpnt) {
 613             printk(KERN_WARNING "(ultrastor:) Could not register scsi device. Aborting registration.\n");
 614             free_irq(config.interrupt, do_ultrastor_interrupt);
 615             return FALSE;
 616      }
 617      
 618      if (request_irq(config.interrupt, do_ultrastor_interrupt, 0, "Ultrastor", shpnt))
 619	{
 620	  printk("Unable to allocate IRQ%u for UltraStor controller.\n",
 621		 config.interrupt);
 622	  return FALSE;
 623	}
 624
 625      shpnt->irq = config.interrupt;
 626      shpnt->dma_channel = config.dma_channel;
 627      shpnt->io_port = config.port_address;
 628
 629#if ULTRASTOR_MAX_CMDS > 1
 630      config.mscp_free = ~0;
 631#endif
 632      /* Mark ICM and OGM free */
 633      outb(0, addr + 0x16);
 634      outb(0, addr + 0x1B);
 635
 636      /* Set local doorbell mask to disallow bus reset unless
 637	 ultrastor_bus_reset is true.  */
 638      outb(ultrastor_bus_reset ? 0xc2 : 0x82, LCL_DOORBELL_MASK(addr+12));
 639      outb(0x02, SYS_DOORBELL_MASK(addr+12));
 640      printk("UltraStor driver version " VERSION ".  Using %d SG lists.\n",
 641	     tpnt->sg_tablesize);
 642      return TRUE;
 643    }
 644  return FALSE;
 645}
 646
 647static int ultrastor_detect(struct scsi_host_template * tpnt)
 648{
 649	tpnt->proc_name = "ultrastor";
 650	return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
 651}
 652
 653static int ultrastor_release(struct Scsi_Host *shost)
 654{
 655	if (shost->irq)
 656		free_irq(shost->irq, NULL);
 657	if (shost->dma_channel != 0xff)
 658		free_dma(shost->dma_channel);
 659	if (shost->io_port && shost->n_io_port)
 660		release_region(shost->io_port, shost->n_io_port);
 661	scsi_unregister(shost);
 662	return 0;
 663}
 664
 665static const char *ultrastor_info(struct Scsi_Host * shpnt)
 666{
 667    static char buf[64];
 668
 669    if (config.slot)
 670      sprintf(buf, "UltraStor 24F SCSI @ Slot %u IRQ%u",
 671	      config.slot, config.interrupt);
 672    else if (config.subversion)
 673      sprintf(buf, "UltraStor 34F SCSI @ Port %03X BIOS %05X IRQ%u",
 674	      config.port_address, (int)config.bios_segment,
 675	      config.interrupt);
 676    else
 677      sprintf(buf, "UltraStor 14F SCSI @ Port %03X BIOS %05X IRQ%u DMA%u",
 678	      config.port_address, (int)config.bios_segment,
 679	      config.interrupt, config.dma_channel);
 680    return buf;
 681}
 682
 683static inline void build_sg_list(struct mscp *mscp, struct scsi_cmnd *SCpnt)
 684{
 685	struct scatterlist *sg;
 686	long transfer_length = 0;
 687	int i, max;
 688
 689	max = scsi_sg_count(SCpnt);
 690	scsi_for_each_sg(SCpnt, sg, max, i) {
 691		mscp->sglist[i].address = isa_page_to_bus(sg_page(sg)) + sg->offset;
 692		mscp->sglist[i].num_bytes = sg->length;
 693		transfer_length += sg->length;
 694	}
 695	mscp->number_of_sg_list = max;
 696	mscp->transfer_data = isa_virt_to_bus(mscp->sglist);
 697	/* ??? May not be necessary.  Docs are unclear as to whether transfer
 698	   length field is ignored or whether it should be set to the total
 699	   number of bytes of the transfer.  */
 700	mscp->transfer_data_length = transfer_length;
 701}
 702
 703static int ultrastor_queuecommand_lck(struct scsi_cmnd *SCpnt,
 704				void (*done) (struct scsi_cmnd *))
 705{
 706    struct mscp *my_mscp;
 707#if ULTRASTOR_MAX_CMDS > 1
 708    int mscp_index;
 709#endif
 710    unsigned int status;
 711
 712    /* Next test is for debugging; "can't happen" */
 713    if ((config.mscp_free & ((1U << ULTRASTOR_MAX_CMDS) - 1)) == 0)
 714	panic("ultrastor_queuecommand: no free MSCP\n");
 715    mscp_index = find_and_clear_bit_16(&config.mscp_free);
 716
 717    /* Has the command been aborted?  */
 718    if (xchgb(0xff, &config.aborted[mscp_index]) != 0)
 719      {
 720	status = DID_ABORT << 16;
 721	goto aborted;
 722      }
 723
 724    my_mscp = &config.mscp[mscp_index];
 725
 726    *(unsigned char *)my_mscp = OP_SCSI | (DTD_SCSI << 3);
 727
 728    /* Tape drives don't work properly if the cache is used.  The SCSI
 729       READ command for a tape doesn't have a block offset, and the adapter
 730       incorrectly assumes that all reads from the tape read the same
 731       blocks.  Results will depend on read buffer size and other disk
 732       activity. 
 733
 734       ???  Which other device types should never use the cache?   */
 735    my_mscp->ca = SCpnt->device->type != TYPE_TAPE;
 736    my_mscp->target_id = SCpnt->device->id;
 737    my_mscp->ch_no = 0;
 738    my_mscp->lun = SCpnt->device->lun;
 739    if (scsi_sg_count(SCpnt)) {
 740	/* Set scatter/gather flag in SCSI command packet */
 741	my_mscp->sg = TRUE;
 742	build_sg_list(my_mscp, SCpnt);
 743    } else {
 744	/* Unset scatter/gather flag in SCSI command packet */
 745	my_mscp->sg = FALSE;
 746	my_mscp->transfer_data = isa_virt_to_bus(scsi_sglist(SCpnt));
 747	my_mscp->transfer_data_length = scsi_bufflen(SCpnt);
 748    }
 749    my_mscp->command_link = 0;		/*???*/
 750    my_mscp->scsi_command_link_id = 0;	/*???*/
 751    my_mscp->length_of_sense_byte = SCSI_SENSE_BUFFERSIZE;
 752    my_mscp->length_of_scsi_cdbs = SCpnt->cmd_len;
 753    memcpy(my_mscp->scsi_cdbs, SCpnt->cmnd, my_mscp->length_of_scsi_cdbs);
 754    my_mscp->adapter_status = 0;
 755    my_mscp->target_status = 0;
 756    my_mscp->sense_data = isa_virt_to_bus(&SCpnt->sense_buffer);
 757    my_mscp->done = done;
 758    my_mscp->SCint = SCpnt;
 759    SCpnt->host_scribble = (unsigned char *)my_mscp;
 760
 761    /* Find free OGM slot.  On 24F, look for OGM status byte == 0.
 762       On 14F and 34F, wait for local interrupt pending flag to clear. 
 763       
 764       FIXME: now we are using new_eh we should punt here and let the
 765       midlayer sort it out */
 766
 767retry:
 768    if (config.slot)
 769	while (inb(config.ogm_address - 1) != 0 && config.aborted[mscp_index] == 0xff)
 770		barrier();
 771
 772    /* else??? */
 773
 774    while ((inb(LCL_DOORBELL_INTR(config.doorbell_address)) & (config.slot ? 2 : 1))  && config.aborted[mscp_index] == 0xff)
 775    	barrier();
 776
 777    /* To avoid race conditions, keep the code to write to the adapter
 778       atomic.  This simplifies the abort code.  Right now the
 779       scsi mid layer has the host_lock already held
 780     */
 781
 782    if (inb(LCL_DOORBELL_INTR(config.doorbell_address)) & (config.slot ? 2 : 1))
 783      goto retry;
 784
 785    status = xchgb(0, &config.aborted[mscp_index]);
 786    if (status != 0xff) {
 787
 788#if ULTRASTOR_DEBUG & (UD_COMMAND | UD_ABORT)
 789	printk("USx4F: queuecommand: aborted\n");
 790#if ULTRASTOR_MAX_CMDS > 1
 791	log_ultrastor_abort(&config, mscp_index);
 792#endif
 793#endif
 794	status <<= 16;
 795
 796      aborted:
 797	set_bit(mscp_index, &config.mscp_free);
 798	/* If the driver queues commands, call the done proc here.  Otherwise
 799	   return an error.  */
 800#if ULTRASTOR_MAX_CMDS > 1
 801	SCpnt->result = status;
 802	done(SCpnt);
 803	return 0;
 804#else
 805	return status;
 806#endif
 807    }
 808
 809    /* Store pointer in OGM address bytes */
 810    outl(isa_virt_to_bus(my_mscp), config.ogm_address);
 811
 812    /* Issue OGM interrupt */
 813    if (config.slot) {
 814	/* Write OGM command register on 24F */
 815	outb(1, config.ogm_address - 1);
 816	outb(0x2, LCL_DOORBELL_INTR(config.doorbell_address));
 817    } else {
 818	outb(0x1, LCL_DOORBELL_INTR(config.doorbell_address));
 819    }
 820
 821#if (ULTRASTOR_DEBUG & UD_COMMAND)
 822    printk("USx4F: queuecommand: returning\n");
 823#endif
 824
 825    return 0;
 826}
 827
 828static DEF_SCSI_QCMD(ultrastor_queuecommand)
 829
 830/* This code must deal with 2 cases:
 831
 832   1. The command has not been written to the OGM.  In this case, set
 833   the abort flag and return.
 834
 835   2. The command has been written to the OGM and is stuck somewhere in
 836   the adapter.
 837
 838   2a.  On a 24F, ask the adapter to abort the command.  It will interrupt
 839   when it does.
 840
 841   2b.  Call the command's done procedure.
 842
 843 */
 844
 845static int ultrastor_abort(struct scsi_cmnd *SCpnt)
 846{
 847#if ULTRASTOR_DEBUG & UD_ABORT
 848    char out[108];
 849    unsigned char icm_status = 0, ogm_status = 0;
 850    unsigned int icm_addr = 0, ogm_addr = 0;
 851#endif
 852    unsigned int mscp_index;
 853    unsigned char old_aborted;
 854    unsigned long flags;
 855    void (*done)(struct scsi_cmnd *);
 856    struct Scsi_Host *host = SCpnt->device->host;
 857
 858    if(config.slot) 
 859      return FAILED;  /* Do not attempt an abort for the 24f */
 860      
 861    /* Simple consistency checking */
 862    if(!SCpnt->host_scribble)
 863      return FAILED;
 864
 865    mscp_index = ((struct mscp *)SCpnt->host_scribble) - config.mscp;
 866    if (mscp_index >= ULTRASTOR_MAX_CMDS)
 867	panic("Ux4F aborting invalid MSCP");
 868
 869#if ULTRASTOR_DEBUG & UD_ABORT
 870    if (config.slot)
 871      {
 872	int port0 = (config.slot << 12) | 0xc80;
 873	int i;
 874	unsigned long flags;
 875	
 876	spin_lock_irqsave(host->host_lock, flags);
 877	strcpy(out, "OGM %d:%x ICM %d:%x ports:  ");
 878	for (i = 0; i < 16; i++)
 879	  {
 880	    unsigned char p = inb(port0 + i);
 881	    out[28 + i * 3] = "0123456789abcdef"[p >> 4];
 882	    out[29 + i * 3] = "0123456789abcdef"[p & 15];
 883	    out[30 + i * 3] = ' ';
 884	  }
 885	out[28 + i * 3] = '\n';
 886	out[29 + i * 3] = 0;
 887	ogm_status = inb(port0 + 22);
 888	ogm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 23));
 889	icm_status = inb(port0 + 27);
 890	icm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 28));
 891	spin_unlock_irqrestore(host->host_lock, flags);
 892      }
 893
 894    /* First check to see if an interrupt is pending.  I suspect the SiS
 895       chipset loses interrupts.  (I also suspect is mangles data, but
 896       one bug at a time... */
 897    if (config.slot ? inb(config.icm_address - 1) == 2 :
 898	(inb(SYS_DOORBELL_INTR(config.doorbell_address)) & 1))
 899      {
 900	printk("Ux4F: abort while completed command pending\n");
 901	
 902	spin_lock_irqsave(host->host_lock, flags);
 903	/* FIXME: Ewww... need to think about passing host around properly */
 904	ultrastor_interrupt(NULL);
 905	spin_unlock_irqrestore(host->host_lock, flags);
 906	return SUCCESS;
 907      }
 908#endif
 909
 910    old_aborted = xchgb(DID_ABORT, &config.aborted[mscp_index]);
 911
 912    /* aborted == 0xff is the signal that queuecommand has not yet sent
 913       the command.  It will notice the new abort flag and fail.  */
 914    if (old_aborted == 0xff)
 915	return SUCCESS;
 916
 917    /* On 24F, send an abort MSCP request.  The adapter will interrupt
 918       and the interrupt handler will call done.  */
 919    if (config.slot && inb(config.ogm_address - 1) == 0)
 920      {
 921	unsigned long flags;
 922
 923	spin_lock_irqsave(host->host_lock, flags);
 924	outl(isa_virt_to_bus(&config.mscp[mscp_index]), config.ogm_address);
 925	udelay(8);
 926	outb(0x80, config.ogm_address - 1);
 927	outb(0x2, LCL_DOORBELL_INTR(config.doorbell_address));
 928#if ULTRASTOR_DEBUG & UD_ABORT
 929	log_ultrastor_abort(&config, mscp_index);
 930	printk(out, ogm_status, ogm_addr, icm_status, icm_addr);
 931#endif
 932	spin_unlock_irqrestore(host->host_lock, flags);
 933	/* FIXME: add a wait for the abort to complete */
 934	return SUCCESS;
 935      }
 936
 937#if ULTRASTOR_DEBUG & UD_ABORT
 938    log_ultrastor_abort(&config, mscp_index);
 939#endif
 940
 941    /* Can't request a graceful abort.  Either this is not a 24F or
 942       the OGM is busy.  Don't free the command -- the adapter might
 943       still be using it.  Setting SCint = 0 causes the interrupt
 944       handler to ignore the command.  */
 945
 946    /* FIXME - devices that implement soft resets will still be running
 947       the command after a bus reset.  We would probably rather leave
 948       the command in the queue.  The upper level code will automatically
 949       leave the command in the active state instead of requeueing it. ERY */
 950
 951#if ULTRASTOR_DEBUG & UD_ABORT
 952    if (config.mscp[mscp_index].SCint != SCpnt)
 953	printk("abort: command mismatch, %p != %p\n",
 954	       config.mscp[mscp_index].SCint, SCpnt);
 955#endif
 956    if (config.mscp[mscp_index].SCint == NULL)
 957	return FAILED;
 958
 959    if (config.mscp[mscp_index].SCint != SCpnt) panic("Bad abort");
 960    config.mscp[mscp_index].SCint = NULL;
 961    done = config.mscp[mscp_index].done;
 962    config.mscp[mscp_index].done = NULL;
 963    SCpnt->result = DID_ABORT << 16;
 964    
 965    /* Take the host lock to guard against scsi layer re-entry */
 966    done(SCpnt);
 967
 968    /* Need to set a timeout here in case command never completes.  */
 969    return SUCCESS;
 970}
 971
 972static int ultrastor_host_reset(struct scsi_cmnd * SCpnt)
 973{
 974    unsigned long flags;
 975    int i;
 976    struct Scsi_Host *host = SCpnt->device->host;
 977    
 978#if (ULTRASTOR_DEBUG & UD_RESET)
 979    printk("US14F: reset: called\n");
 980#endif
 981
 982    if(config.slot)
 983    	return FAILED;
 984
 985    spin_lock_irqsave(host->host_lock, flags);
 986    /* Reset the adapter and SCSI bus.  The SCSI bus reset can be
 987       inhibited by clearing ultrastor_bus_reset before probe.  */
 988    outb(0xc0, LCL_DOORBELL_INTR(config.doorbell_address));
 989    if (config.slot)
 990      {
 991	outb(0, config.ogm_address - 1);
 992	outb(0, config.icm_address - 1);
 993      }
 994
 995#if ULTRASTOR_MAX_CMDS == 1
 996    if (config.mscp_busy && config.mscp->done && config.mscp->SCint)
 997      {
 998	config.mscp->SCint->result = DID_RESET << 16;
 999	config.mscp->done(config.mscp->SCint);
1000      }
1001    config.mscp->SCint = 0;
1002#else
1003    for (i = 0; i < ULTRASTOR_MAX_CMDS; i++)
1004      {
1005	if (! (config.mscp_free & (1 << i)) &&
1006	    config.mscp[i].done && config.mscp[i].SCint)
1007	  {
1008	    config.mscp[i].SCint->result = DID_RESET << 16;
1009	    config.mscp[i].done(config.mscp[i].SCint);
1010	    config.mscp[i].done = NULL;
1011	  }
1012	config.mscp[i].SCint = NULL;
1013      }
1014#endif
1015
1016    /* FIXME - if the device implements soft resets, then the command
1017       will still be running.  ERY  
1018       
1019       Even bigger deal with new_eh! 
1020     */
1021
1022    memset((unsigned char *)config.aborted, 0, sizeof config.aborted);
1023#if ULTRASTOR_MAX_CMDS == 1
1024    config.mscp_busy = 0;
1025#else
1026    config.mscp_free = ~0;
1027#endif
1028
1029    spin_unlock_irqrestore(host->host_lock, flags);
1030    return SUCCESS;
1031
1032}
1033
1034int ultrastor_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1035		sector_t capacity, int * dkinfo)
1036{
1037    int size = capacity;
1038    unsigned int s = config.heads * config.sectors;
1039
1040    dkinfo[0] = config.heads;
1041    dkinfo[1] = config.sectors;
1042    dkinfo[2] = size / s;	/* Ignore partial cylinders */
1043#if 0
1044    if (dkinfo[2] > 1024)
1045	dkinfo[2] = 1024;
1046#endif
1047    return 0;
1048}
1049
1050static void ultrastor_interrupt(void *dev_id)
1051{
1052    unsigned int status;
1053#if ULTRASTOR_MAX_CMDS > 1
1054    unsigned int mscp_index;
1055#endif
1056    struct mscp *mscp;
1057    void (*done) (struct scsi_cmnd *);
1058    struct scsi_cmnd *SCtmp;
1059
1060#if ULTRASTOR_MAX_CMDS == 1
1061    mscp = &config.mscp[0];
1062#else
1063    mscp = (struct mscp *)isa_bus_to_virt(inl(config.icm_address));
1064    mscp_index = mscp - config.mscp;
1065    if (mscp_index >= ULTRASTOR_MAX_CMDS) {
1066	printk("Ux4F interrupt: bad MSCP address %x\n", (unsigned int) mscp);
1067	/* A command has been lost.  Reset and report an error
1068	   for all commands.  */
1069	ultrastor_host_reset(dev_id);
1070	return;
1071    }
1072#endif
1073
1074    /* Clean ICM slot (set ICMINT bit to 0) */
1075    if (config.slot) {
1076	unsigned char icm_status = inb(config.icm_address - 1);
1077#if ULTRASTOR_DEBUG & (UD_INTERRUPT|UD_ERROR|UD_ABORT)
1078	if (icm_status != 1 && icm_status != 2)
1079	    printk("US24F: ICM status %x for MSCP %d (%x)\n", icm_status,
1080		   mscp_index, (unsigned int) mscp);
1081#endif
1082	/* The manual says clear interrupt then write 0 to ICM status.
1083	   This seems backwards, but I'll do it anyway.  --jfc */
1084	outb(2, SYS_DOORBELL_INTR(config.doorbell_address));
1085	outb(0, config.icm_address - 1);
1086	if (icm_status == 4) {
1087	    printk("UltraStor abort command failed\n");
1088	    return;
1089	}
1090	if (icm_status == 3) {
1091	    void (*done)(struct scsi_cmnd *) = mscp->done;
1092	    if (done) {
1093		mscp->done = NULL;
1094		mscp->SCint->result = DID_ABORT << 16;
1095		done(mscp->SCint);
1096	    }
1097	    return;
1098	}
1099    } else {
1100	outb(1, SYS_DOORBELL_INTR(config.doorbell_address));
1101    }
1102
1103    SCtmp = mscp->SCint;
1104    mscp->SCint = NULL;
1105
1106    if (!SCtmp)
1107      {
1108#if ULTRASTOR_DEBUG & (UD_ABORT|UD_INTERRUPT)
1109	printk("MSCP %d (%x): no command\n", mscp_index, (unsigned int) mscp);
1110#endif	
1111#if ULTRASTOR_MAX_CMDS == 1
1112	config.mscp_busy = FALSE;
1113#else
1114	set_bit(mscp_index, &config.mscp_free);
1115#endif
1116	config.aborted[mscp_index] = 0;
1117	return;
1118      }
1119
1120    /* Save done locally and zero before calling.  This is needed as
1121       once we call done, we may get another command queued before this
1122       interrupt service routine can return. */
1123    done = mscp->done;
1124    mscp->done = NULL;
1125
1126    /* Let the higher levels know that we're done */
1127    switch (mscp->adapter_status)
1128      {
1129      case 0:
1130	status = DID_OK << 16;
1131	break;
1132      case 0x01:	/* invalid command */
1133      case 0x02:	/* invalid parameters */
1134      case 0x03:	/* invalid data list */
1135      default:
1136	status = DID_ERROR << 16;
1137	break;
1138      case 0x84:	/* SCSI bus abort */
1139	status = DID_ABORT << 16;
1140	break;
1141      case 0x91:
1142	status = DID_TIME_OUT << 16;
1143	break;
1144      }
1145
1146    SCtmp->result = status | mscp->target_status;
1147
1148    SCtmp->host_scribble = NULL;
1149
1150    /* Free up mscp block for next command */
1151#if ULTRASTOR_MAX_CMDS == 1
1152    config.mscp_busy = FALSE;
1153#else
1154    set_bit(mscp_index, &config.mscp_free);
1155#endif
1156
1157#if ULTRASTOR_DEBUG & (UD_ABORT|UD_INTERRUPT)
1158    if (config.aborted[mscp_index])
1159	printk("Ux4 interrupt: MSCP %d (%x) aborted = %d\n",
1160	       mscp_index, (unsigned int) mscp, config.aborted[mscp_index]);
1161#endif
1162    config.aborted[mscp_index] = 0;
1163
1164    if (done)
1165	done(SCtmp);
1166    else
1167	printk("US14F: interrupt: unexpected interrupt\n");
1168
1169    if (config.slot ? inb(config.icm_address - 1) :
1170       (inb(SYS_DOORBELL_INTR(config.doorbell_address)) & 1))
1171#if (ULTRASTOR_DEBUG & UD_MULTI_CMD)
1172      printk("Ux4F: multiple commands completed\n");
1173#else
1174      ;
1175#endif
1176
1177#if (ULTRASTOR_DEBUG & UD_INTERRUPT)
1178    printk("USx4F: interrupt: returning\n");
1179#endif
1180}
1181
1182static irqreturn_t do_ultrastor_interrupt(int irq, void *dev_id)
1183{
1184    unsigned long flags;
1185    struct Scsi_Host *dev = dev_id;
1186    
1187    spin_lock_irqsave(dev->host_lock, flags);
1188    ultrastor_interrupt(dev_id);
1189    spin_unlock_irqrestore(dev->host_lock, flags);
1190    return IRQ_HANDLED;
1191}
1192
1193MODULE_LICENSE("GPL");
1194
1195static struct scsi_host_template driver_template = {
1196	.name              = "UltraStor 14F/24F/34F",
1197	.detect            = ultrastor_detect,
1198	.release	   = ultrastor_release,
1199	.info              = ultrastor_info,
1200	.queuecommand      = ultrastor_queuecommand,
1201	.eh_abort_handler  = ultrastor_abort,
1202	.eh_host_reset_handler  = ultrastor_host_reset,	
1203	.bios_param        = ultrastor_biosparam,
1204	.can_queue         = ULTRASTOR_MAX_CMDS,
1205	.sg_tablesize      = ULTRASTOR_14F_MAX_SG,
1206	.cmd_per_lun       = ULTRASTOR_MAX_CMDS_PER_LUN,
1207	.unchecked_isa_dma = 1,
1208	.use_clustering    = ENABLE_CLUSTERING,
1209};
1210#include "scsi_module.c"