cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

aic7xxx_osm.c (71679B)


      1
      2/*
      3 * Adaptec AIC7xxx device driver for Linux.
      4 *
      5 * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#235 $
      6 *
      7 * Copyright (c) 1994 John Aycock
      8 *   The University of Calgary Department of Computer Science.
      9 *
     10 * This program is free software; you can redistribute it and/or modify
     11 * it under the terms of the GNU General Public License as published by
     12 * the Free Software Foundation; either version 2, or (at your option)
     13 * any later version.
     14 *
     15 * This program is distributed in the hope that it will be useful,
     16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18 * GNU General Public License for more details.
     19 *
     20 * You should have received a copy of the GNU General Public License
     21 * along with this program; see the file COPYING.  If not, write to
     22 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
     23 *
     24 * Sources include the Adaptec 1740 driver (aha1740.c), the Ultrastor 24F
     25 * driver (ultrastor.c), various Linux kernel source, the Adaptec EISA
     26 * config file (!adp7771.cfg), the Adaptec AHA-2740A Series User's Guide,
     27 * the Linux Kernel Hacker's Guide, Writing a SCSI Device Driver for Linux,
     28 * the Adaptec 1542 driver (aha1542.c), the Adaptec EISA overlay file
     29 * (adp7770.ovl), the Adaptec AHA-2740 Series Technical Reference Manual,
     30 * the Adaptec AIC-7770 Data Book, the ANSI SCSI specification, the
     31 * ANSI SCSI-2 specification (draft 10c), ...
     32 *
     33 * --------------------------------------------------------------------------
     34 *
     35 *  Modifications by Daniel M. Eischen (deischen@iworks.InterWorks.org):
     36 *
     37 *  Substantially modified to include support for wide and twin bus
     38 *  adapters, DMAing of SCBs, tagged queueing, IRQ sharing, bug fixes,
     39 *  SCB paging, and other rework of the code.
     40 *
     41 * --------------------------------------------------------------------------
     42 * Copyright (c) 1994-2000 Justin T. Gibbs.
     43 * Copyright (c) 2000-2001 Adaptec Inc.
     44 * All rights reserved.
     45 *
     46 * Redistribution and use in source and binary forms, with or without
     47 * modification, are permitted provided that the following conditions
     48 * are met:
     49 * 1. Redistributions of source code must retain the above copyright
     50 *    notice, this list of conditions, and the following disclaimer,
     51 *    without modification.
     52 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     53 *    substantially similar to the "NO WARRANTY" disclaimer below
     54 *    ("Disclaimer") and any redistribution must be conditioned upon
     55 *    including a substantially similar Disclaimer requirement for further
     56 *    binary redistribution.
     57 * 3. Neither the names of the above-listed copyright holders nor the names
     58 *    of any contributors may be used to endorse or promote products derived
     59 *    from this software without specific prior written permission.
     60 *
     61 * Alternatively, this software may be distributed under the terms of the
     62 * GNU General Public License ("GPL") version 2 as published by the Free
     63 * Software Foundation.
     64 *
     65 * NO WARRANTY
     66 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     67 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     68 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     69 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     70 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     71 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     72 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     73 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     74 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     75 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     76 * POSSIBILITY OF SUCH DAMAGES.
     77 *
     78 *---------------------------------------------------------------------------
     79 *
     80 *  Thanks also go to (in alphabetical order) the following:
     81 *
     82 *    Rory Bolt     - Sequencer bug fixes
     83 *    Jay Estabrook - Initial DEC Alpha support
     84 *    Doug Ledford  - Much needed abort/reset bug fixes
     85 *    Kai Makisara  - DMAing of SCBs
     86 *
     87 *  A Boot time option was also added for not resetting the scsi bus.
     88 *
     89 *    Form:  aic7xxx=extended
     90 *           aic7xxx=no_reset
     91 *           aic7xxx=verbose
     92 *
     93 *  Daniel M. Eischen, deischen@iworks.InterWorks.org, 1/23/97
     94 *
     95 *  Id: aic7xxx.c,v 4.1 1997/06/12 08:23:42 deang Exp
     96 */
     97
     98/*
     99 * Further driver modifications made by Doug Ledford <dledford@redhat.com>
    100 *
    101 * Copyright (c) 1997-1999 Doug Ledford
    102 *
    103 * These changes are released under the same licensing terms as the FreeBSD
    104 * driver written by Justin Gibbs.  Please see his Copyright notice above
    105 * for the exact terms and conditions covering my changes as well as the
    106 * warranty statement.
    107 *
    108 * Modifications made to the aic7xxx.c,v 4.1 driver from Dan Eischen include
    109 * but are not limited to:
    110 *
    111 *  1: Import of the latest FreeBSD sequencer code for this driver
    112 *  2: Modification of kernel code to accommodate different sequencer semantics
    113 *  3: Extensive changes throughout kernel portion of driver to improve
    114 *     abort/reset processing and error hanndling
    115 *  4: Other work contributed by various people on the Internet
    116 *  5: Changes to printk information and verbosity selection code
    117 *  6: General reliability related changes, especially in IRQ management
    118 *  7: Modifications to the default probe/attach order for supported cards
    119 *  8: SMP friendliness has been improved
    120 *
    121 */
    122
    123#include "aic7xxx_osm.h"
    124#include "aic7xxx_inline.h"
    125#include <scsi/scsicam.h>
    126
    127static struct scsi_transport_template *ahc_linux_transport_template = NULL;
    128
    129#include <linux/init.h>		/* __setup */
    130#include <linux/mm.h>		/* For fetching system memory size */
    131#include <linux/blkdev.h>		/* For block_size() */
    132#include <linux/delay.h>	/* For ssleep/msleep */
    133#include <linux/slab.h>
    134
    135
    136/*
    137 * Set this to the delay in seconds after SCSI bus reset.
    138 * Note, we honor this only for the initial bus reset.
    139 * The scsi error recovery code performs its own bus settle
    140 * delay handling for error recovery actions.
    141 */
    142#ifdef CONFIG_AIC7XXX_RESET_DELAY_MS
    143#define AIC7XXX_RESET_DELAY CONFIG_AIC7XXX_RESET_DELAY_MS
    144#else
    145#define AIC7XXX_RESET_DELAY 5000
    146#endif
    147
    148/*
    149 * To change the default number of tagged transactions allowed per-device,
    150 * add a line to the lilo.conf file like:
    151 * append="aic7xxx=verbose,tag_info:{{32,32,32,32},{32,32,32,32}}"
    152 * which will result in the first four devices on the first two
    153 * controllers being set to a tagged queue depth of 32.
    154 *
    155 * The tag_commands is an array of 16 to allow for wide and twin adapters.
    156 * Twin adapters will use indexes 0-7 for channel 0, and indexes 8-15
    157 * for channel 1.
    158 */
    159typedef struct {
    160	uint8_t tag_commands[16];	/* Allow for wide/twin adapters. */
    161} adapter_tag_info_t;
    162
    163/*
    164 * Modify this as you see fit for your system.
    165 *
    166 * 0			tagged queuing disabled
    167 * 1 <= n <= 253	n == max tags ever dispatched.
    168 *
    169 * The driver will throttle the number of commands dispatched to a
    170 * device if it returns queue full.  For devices with a fixed maximum
    171 * queue depth, the driver will eventually determine this depth and
    172 * lock it in (a console message is printed to indicate that a lock
    173 * has occurred).  On some devices, queue full is returned for a temporary
    174 * resource shortage.  These devices will return queue full at varying
    175 * depths.  The driver will throttle back when the queue fulls occur and
    176 * attempt to slowly increase the depth over time as the device recovers
    177 * from the resource shortage.
    178 *
    179 * In this example, the first line will disable tagged queueing for all
    180 * the devices on the first probed aic7xxx adapter.
    181 *
    182 * The second line enables tagged queueing with 4 commands/LUN for IDs
    183 * (0, 2-11, 13-15), disables tagged queueing for ID 12, and tells the
    184 * driver to attempt to use up to 64 tags for ID 1.
    185 *
    186 * The third line is the same as the first line.
    187 *
    188 * The fourth line disables tagged queueing for devices 0 and 3.  It
    189 * enables tagged queueing for the other IDs, with 16 commands/LUN
    190 * for IDs 1 and 4, 127 commands/LUN for ID 8, and 4 commands/LUN for
    191 * IDs 2, 5-7, and 9-15.
    192 */
    193
    194/*
    195 * NOTE: The below structure is for reference only, the actual structure
    196 *       to modify in order to change things is just below this comment block.
    197adapter_tag_info_t aic7xxx_tag_info[] =
    198{
    199	{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
    200	{{4, 64, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4}},
    201	{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
    202	{{0, 16, 4, 0, 16, 4, 4, 4, 127, 4, 4, 4, 4, 4, 4, 4}}
    203};
    204*/
    205
    206#ifdef CONFIG_AIC7XXX_CMDS_PER_DEVICE
    207#define AIC7XXX_CMDS_PER_DEVICE CONFIG_AIC7XXX_CMDS_PER_DEVICE
    208#else
    209#define AIC7XXX_CMDS_PER_DEVICE AHC_MAX_QUEUE
    210#endif
    211
    212#define AIC7XXX_CONFIGED_TAG_COMMANDS {					\
    213	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,		\
    214	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,		\
    215	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,		\
    216	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,		\
    217	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,		\
    218	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,		\
    219	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,		\
    220	AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE		\
    221}
    222
    223/*
    224 * By default, use the number of commands specified by
    225 * the users kernel configuration.
    226 */
    227static adapter_tag_info_t aic7xxx_tag_info[] =
    228{
    229	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    230	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    231	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    232	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    233	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    234	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    235	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    236	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    237	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    238	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    239	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    240	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    241	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    242	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    243	{AIC7XXX_CONFIGED_TAG_COMMANDS},
    244	{AIC7XXX_CONFIGED_TAG_COMMANDS}
    245};
    246
    247/*
    248 * There should be a specific return value for this in scsi.h, but
    249 * it seems that most drivers ignore it.
    250 */
    251#define DID_UNDERFLOW   DID_ERROR
    252
    253void
    254ahc_print_path(struct ahc_softc *ahc, struct scb *scb)
    255{
    256	printk("(scsi%d:%c:%d:%d): ",
    257	       ahc->platform_data->host->host_no,
    258	       scb != NULL ? SCB_GET_CHANNEL(ahc, scb) : 'X',
    259	       scb != NULL ? SCB_GET_TARGET(ahc, scb) : -1,
    260	       scb != NULL ? SCB_GET_LUN(scb) : -1);
    261}
    262
    263/*
    264 * XXX - these options apply unilaterally to _all_ 274x/284x/294x
    265 *       cards in the system.  This should be fixed.  Exceptions to this
    266 *       rule are noted in the comments.
    267 */
    268
    269/*
    270 * Skip the scsi bus reset.  Non 0 make us skip the reset at startup.  This
    271 * has no effect on any later resets that might occur due to things like
    272 * SCSI bus timeouts.
    273 */
    274static uint32_t aic7xxx_no_reset;
    275
    276/*
    277 * Should we force EXTENDED translation on a controller.
    278 *     0 == Use whatever is in the SEEPROM or default to off
    279 *     1 == Use whatever is in the SEEPROM or default to on
    280 */
    281static uint32_t aic7xxx_extended;
    282
    283/*
    284 * PCI bus parity checking of the Adaptec controllers.  This is somewhat
    285 * dubious at best.  To my knowledge, this option has never actually
    286 * solved a PCI parity problem, but on certain machines with broken PCI
    287 * chipset configurations where stray PCI transactions with bad parity are
    288 * the norm rather than the exception, the error messages can be overwhelming.
    289 * It's included in the driver for completeness.
    290 *   0	   = Shut off PCI parity check
    291 *   non-0 = reverse polarity pci parity checking
    292 */
    293static uint32_t aic7xxx_pci_parity = ~0;
    294
    295/*
    296 * There are lots of broken chipsets in the world.  Some of them will
    297 * violate the PCI spec when we issue byte sized memory writes to our
    298 * controller.  I/O mapped register access, if allowed by the given
    299 * platform, will work in almost all cases.
    300 */
    301uint32_t aic7xxx_allow_memio = ~0;
    302
    303/*
    304 * So that we can set how long each device is given as a selection timeout.
    305 * The table of values goes like this:
    306 *   0 - 256ms
    307 *   1 - 128ms
    308 *   2 - 64ms
    309 *   3 - 32ms
    310 * We default to 256ms because some older devices need a longer time
    311 * to respond to initial selection.
    312 */
    313static uint32_t aic7xxx_seltime;
    314
    315/*
    316 * Certain devices do not perform any aging on commands.  Should the
    317 * device be saturated by commands in one portion of the disk, it is
    318 * possible for transactions on far away sectors to never be serviced.
    319 * To handle these devices, we can periodically send an ordered tag to
    320 * force all outstanding transactions to be serviced prior to a new
    321 * transaction.
    322 */
    323static uint32_t aic7xxx_periodic_otag;
    324
    325/*
    326 * Module information and settable options.
    327 */
    328static char *aic7xxx = NULL;
    329
    330MODULE_AUTHOR("Maintainer: Hannes Reinecke <hare@suse.de>");
    331MODULE_DESCRIPTION("Adaptec AIC77XX/78XX SCSI Host Bus Adapter driver");
    332MODULE_LICENSE("Dual BSD/GPL");
    333MODULE_VERSION(AIC7XXX_DRIVER_VERSION);
    334module_param(aic7xxx, charp, 0444);
    335MODULE_PARM_DESC(aic7xxx,
    336"period-delimited options string:\n"
    337"	verbose			Enable verbose/diagnostic logging\n"
    338"	allow_memio		Allow device registers to be memory mapped\n"
    339"	debug			Bitmask of debug values to enable\n"
    340"	no_probe		Toggle EISA/VLB controller probing\n"
    341"	probe_eisa_vl		Toggle EISA/VLB controller probing\n"
    342"	no_reset		Suppress initial bus resets\n"
    343"	extended		Enable extended geometry on all controllers\n"
    344"	periodic_otag		Send an ordered tagged transaction\n"
    345"				periodically to prevent tag starvation.\n"
    346"				This may be required by some older disk\n"
    347"				drives or RAID arrays.\n"
    348"	tag_info:<tag_str>	Set per-target tag depth\n"
    349"	global_tag_depth:<int>	Global tag depth for every target\n"
    350"				on every bus\n"
    351"	seltime:<int>		Selection Timeout\n"
    352"				(0/256ms,1/128ms,2/64ms,3/32ms)\n"
    353"\n"
    354"	Sample modprobe configuration file:\n"
    355"	#	Toggle EISA/VLB probing\n"
    356"	#	Set tag depth on Controller 1/Target 1 to 10 tags\n"
    357"	#	Shorten the selection timeout to 128ms\n"
    358"\n"
    359"	options aic7xxx 'aic7xxx=probe_eisa_vl.tag_info:{{}.{.10}}.seltime:1'\n"
    360);
    361
    362static void ahc_linux_handle_scsi_status(struct ahc_softc *,
    363					 struct scsi_device *,
    364					 struct scb *);
    365static void ahc_linux_queue_cmd_complete(struct ahc_softc *ahc,
    366					 struct scsi_cmnd *cmd);
    367static void ahc_linux_freeze_simq(struct ahc_softc *ahc);
    368static void ahc_linux_release_simq(struct ahc_softc *ahc);
    369static int  ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag);
    370static void ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc);
    371static u_int ahc_linux_user_tagdepth(struct ahc_softc *ahc,
    372				     struct ahc_devinfo *devinfo);
    373static void ahc_linux_device_queue_depth(struct scsi_device *);
    374static int ahc_linux_run_command(struct ahc_softc*,
    375				 struct ahc_linux_device *,
    376				 struct scsi_cmnd *);
    377static void ahc_linux_setup_tag_info_global(char *p);
    378static int  aic7xxx_setup(char *s);
    379
    380static int ahc_linux_unit;
    381
    382
    383/************************** OS Utility Wrappers *******************************/
    384void
    385ahc_delay(long usec)
    386{
    387	/*
    388	 * udelay on Linux can have problems for
    389	 * multi-millisecond waits.  Wait at most
    390	 * 1024us per call.
    391	 */
    392	while (usec > 0) {
    393		udelay(usec % 1024);
    394		usec -= 1024;
    395	}
    396}
    397
    398/***************************** Low Level I/O **********************************/
    399uint8_t
    400ahc_inb(struct ahc_softc * ahc, long port)
    401{
    402	uint8_t x;
    403
    404	if (ahc->tag == BUS_SPACE_MEMIO) {
    405		x = readb(ahc->bsh.maddr + port);
    406	} else {
    407		x = inb(ahc->bsh.ioport + port);
    408	}
    409	mb();
    410	return (x);
    411}
    412
    413void
    414ahc_outb(struct ahc_softc * ahc, long port, uint8_t val)
    415{
    416	if (ahc->tag == BUS_SPACE_MEMIO) {
    417		writeb(val, ahc->bsh.maddr + port);
    418	} else {
    419		outb(val, ahc->bsh.ioport + port);
    420	}
    421	mb();
    422}
    423
    424void
    425ahc_outsb(struct ahc_softc * ahc, long port, uint8_t *array, int count)
    426{
    427	int i;
    428
    429	/*
    430	 * There is probably a more efficient way to do this on Linux
    431	 * but we don't use this for anything speed critical and this
    432	 * should work.
    433	 */
    434	for (i = 0; i < count; i++)
    435		ahc_outb(ahc, port, *array++);
    436}
    437
    438void
    439ahc_insb(struct ahc_softc * ahc, long port, uint8_t *array, int count)
    440{
    441	int i;
    442
    443	/*
    444	 * There is probably a more efficient way to do this on Linux
    445	 * but we don't use this for anything speed critical and this
    446	 * should work.
    447	 */
    448	for (i = 0; i < count; i++)
    449		*array++ = ahc_inb(ahc, port);
    450}
    451
    452/********************************* Inlines ************************************/
    453static void ahc_linux_unmap_scb(struct ahc_softc*, struct scb*);
    454
    455static int ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
    456				      struct ahc_dma_seg *sg,
    457				      dma_addr_t addr, bus_size_t len);
    458
    459static void
    460ahc_linux_unmap_scb(struct ahc_softc *ahc, struct scb *scb)
    461{
    462	struct scsi_cmnd *cmd;
    463
    464	cmd = scb->io_ctx;
    465	ahc_sync_sglist(ahc, scb, BUS_DMASYNC_POSTWRITE);
    466
    467	scsi_dma_unmap(cmd);
    468}
    469
    470static int
    471ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
    472		  struct ahc_dma_seg *sg, dma_addr_t addr, bus_size_t len)
    473{
    474	int	 consumed;
    475
    476	if ((scb->sg_count + 1) > AHC_NSEG)
    477		panic("Too few segs for dma mapping.  "
    478		      "Increase AHC_NSEG\n");
    479
    480	consumed = 1;
    481	sg->addr = ahc_htole32(addr & 0xFFFFFFFF);
    482	scb->platform_data->xfer_len += len;
    483
    484	if (sizeof(dma_addr_t) > 4
    485	 && (ahc->flags & AHC_39BIT_ADDRESSING) != 0)
    486		len |= (addr >> 8) & AHC_SG_HIGH_ADDR_MASK;
    487
    488	sg->len = ahc_htole32(len);
    489	return (consumed);
    490}
    491
    492/*
    493 * Return a string describing the driver.
    494 */
    495static const char *
    496ahc_linux_info(struct Scsi_Host *host)
    497{
    498	static char buffer[512];
    499	char	ahc_info[256];
    500	char   *bp;
    501	struct ahc_softc *ahc;
    502
    503	bp = &buffer[0];
    504	ahc = *(struct ahc_softc **)host->hostdata;
    505	memset(bp, 0, sizeof(buffer));
    506	strcpy(bp, "Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER, Rev " AIC7XXX_DRIVER_VERSION "\n"
    507			"        <");
    508	strcat(bp, ahc->description);
    509	strcat(bp, ">\n"
    510			"        ");
    511	ahc_controller_info(ahc, ahc_info);
    512	strcat(bp, ahc_info);
    513	strcat(bp, "\n");
    514
    515	return (bp);
    516}
    517
    518/*
    519 * Queue an SCB to the controller.
    520 */
    521static int ahc_linux_queue_lck(struct scsi_cmnd *cmd)
    522{
    523	struct	 ahc_softc *ahc;
    524	struct	 ahc_linux_device *dev = scsi_transport_device_data(cmd->device);
    525	int rtn = SCSI_MLQUEUE_HOST_BUSY;
    526	unsigned long flags;
    527
    528	ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
    529
    530	ahc_lock(ahc, &flags);
    531	if (ahc->platform_data->qfrozen == 0) {
    532		cmd->result = CAM_REQ_INPROG << 16;
    533		rtn = ahc_linux_run_command(ahc, dev, cmd);
    534	}
    535	ahc_unlock(ahc, &flags);
    536
    537	return rtn;
    538}
    539
    540static DEF_SCSI_QCMD(ahc_linux_queue)
    541
    542static inline struct scsi_target **
    543ahc_linux_target_in_softc(struct scsi_target *starget)
    544{
    545	struct	ahc_softc *ahc =
    546		*((struct ahc_softc **)dev_to_shost(&starget->dev)->hostdata);
    547	unsigned int target_offset;
    548
    549	target_offset = starget->id;
    550	if (starget->channel != 0)
    551		target_offset += 8;
    552
    553	return &ahc->platform_data->starget[target_offset];
    554}
    555
    556static int
    557ahc_linux_target_alloc(struct scsi_target *starget)
    558{
    559	struct	ahc_softc *ahc =
    560		*((struct ahc_softc **)dev_to_shost(&starget->dev)->hostdata);
    561	struct seeprom_config *sc = ahc->seep_config;
    562	unsigned long flags;
    563	struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget);
    564	unsigned short scsirate;
    565	struct ahc_devinfo devinfo;
    566	char channel = starget->channel + 'A';
    567	unsigned int our_id = ahc->our_id;
    568	unsigned int target_offset;
    569
    570	target_offset = starget->id;
    571	if (starget->channel != 0)
    572		target_offset += 8;
    573
    574	if (starget->channel)
    575		our_id = ahc->our_id_b;
    576
    577	ahc_lock(ahc, &flags);
    578
    579	BUG_ON(*ahc_targp != NULL);
    580
    581	*ahc_targp = starget;
    582
    583	if (sc) {
    584		int maxsync = AHC_SYNCRATE_DT;
    585		int ultra = 0;
    586		int flags = sc->device_flags[target_offset];
    587
    588		if (ahc->flags & AHC_NEWEEPROM_FMT) {
    589		    if (flags & CFSYNCHISULTRA)
    590			ultra = 1;
    591		} else if (flags & CFULTRAEN)
    592			ultra = 1;
    593		/* AIC nutcase; 10MHz appears as ultra = 1, CFXFER = 0x04
    594		 * change it to ultra=0, CFXFER = 0 */
    595		if(ultra && (flags & CFXFER) == 0x04) {
    596			ultra = 0;
    597			flags &= ~CFXFER;
    598		}
    599
    600		if ((ahc->features & AHC_ULTRA2) != 0) {
    601			scsirate = (flags & CFXFER) | (ultra ? 0x8 : 0);
    602		} else {
    603			scsirate = (flags & CFXFER) << 4;
    604			maxsync = ultra ? AHC_SYNCRATE_ULTRA :
    605				AHC_SYNCRATE_FAST;
    606		}
    607		spi_max_width(starget) = (flags & CFWIDEB) ? 1 : 0;
    608		if (!(flags & CFSYNCH))
    609			spi_max_offset(starget) = 0;
    610		spi_min_period(starget) =
    611			ahc_find_period(ahc, scsirate, maxsync);
    612	}
    613	ahc_compile_devinfo(&devinfo, our_id, starget->id,
    614			    CAM_LUN_WILDCARD, channel,
    615			    ROLE_INITIATOR);
    616	ahc_set_syncrate(ahc, &devinfo, NULL, 0, 0, 0,
    617			 AHC_TRANS_GOAL, /*paused*/FALSE);
    618	ahc_set_width(ahc, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,
    619		      AHC_TRANS_GOAL, /*paused*/FALSE);
    620	ahc_unlock(ahc, &flags);
    621
    622	return 0;
    623}
    624
    625static void
    626ahc_linux_target_destroy(struct scsi_target *starget)
    627{
    628	struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget);
    629
    630	*ahc_targp = NULL;
    631}
    632
    633static int
    634ahc_linux_slave_alloc(struct scsi_device *sdev)
    635{
    636	struct	ahc_softc *ahc =
    637		*((struct ahc_softc **)sdev->host->hostdata);
    638	struct scsi_target *starget = sdev->sdev_target;
    639	struct ahc_linux_device *dev;
    640
    641	if (bootverbose)
    642		printk("%s: Slave Alloc %d\n", ahc_name(ahc), sdev->id);
    643
    644	dev = scsi_transport_device_data(sdev);
    645	memset(dev, 0, sizeof(*dev));
    646
    647	/*
    648	 * We start out life using untagged
    649	 * transactions of which we allow one.
    650	 */
    651	dev->openings = 1;
    652
    653	/*
    654	 * Set maxtags to 0.  This will be changed if we
    655	 * later determine that we are dealing with
    656	 * a tagged queuing capable device.
    657	 */
    658	dev->maxtags = 0;
    659
    660	spi_period(starget) = 0;
    661
    662	return 0;
    663}
    664
    665static int
    666ahc_linux_slave_configure(struct scsi_device *sdev)
    667{
    668	if (bootverbose)
    669		sdev_printk(KERN_INFO, sdev, "Slave Configure\n");
    670
    671	ahc_linux_device_queue_depth(sdev);
    672
    673	/* Initial Domain Validation */
    674	if (!spi_initial_dv(sdev->sdev_target))
    675		spi_dv_device(sdev);
    676
    677	return 0;
    678}
    679
    680#if defined(__i386__)
    681/*
    682 * Return the disk geometry for the given SCSI device.
    683 */
    684static int
    685ahc_linux_biosparam(struct scsi_device *sdev, struct block_device *bdev,
    686		    sector_t capacity, int geom[])
    687{
    688	int	 heads;
    689	int	 sectors;
    690	int	 cylinders;
    691	int	 extended;
    692	struct	 ahc_softc *ahc;
    693	u_int	 channel;
    694
    695	ahc = *((struct ahc_softc **)sdev->host->hostdata);
    696	channel = sdev_channel(sdev);
    697
    698	if (scsi_partsize(bdev, capacity, geom))
    699		return 0;
    700
    701	heads = 64;
    702	sectors = 32;
    703	cylinders = aic_sector_div(capacity, heads, sectors);
    704
    705	if (aic7xxx_extended != 0)
    706		extended = 1;
    707	else if (channel == 0)
    708		extended = (ahc->flags & AHC_EXTENDED_TRANS_A) != 0;
    709	else
    710		extended = (ahc->flags & AHC_EXTENDED_TRANS_B) != 0;
    711	if (extended && cylinders >= 1024) {
    712		heads = 255;
    713		sectors = 63;
    714		cylinders = aic_sector_div(capacity, heads, sectors);
    715	}
    716	geom[0] = heads;
    717	geom[1] = sectors;
    718	geom[2] = cylinders;
    719	return (0);
    720}
    721#endif
    722
    723/*
    724 * Abort the current SCSI command(s).
    725 */
    726static int
    727ahc_linux_abort(struct scsi_cmnd *cmd)
    728{
    729	int error;
    730
    731	error = ahc_linux_queue_recovery_cmd(cmd, SCB_ABORT);
    732	if (error != SUCCESS)
    733		printk("aic7xxx_abort returns 0x%x\n", error);
    734	return (error);
    735}
    736
    737/*
    738 * Attempt to send a target reset message to the device that timed out.
    739 */
    740static int
    741ahc_linux_dev_reset(struct scsi_cmnd *cmd)
    742{
    743	int error;
    744
    745	error = ahc_linux_queue_recovery_cmd(cmd, SCB_DEVICE_RESET);
    746	if (error != SUCCESS)
    747		printk("aic7xxx_dev_reset returns 0x%x\n", error);
    748	return (error);
    749}
    750
    751/*
    752 * Reset the SCSI bus.
    753 */
    754static int
    755ahc_linux_bus_reset(struct scsi_cmnd *cmd)
    756{
    757	struct ahc_softc *ahc;
    758	int    found;
    759	unsigned long flags;
    760
    761	ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
    762
    763	ahc_lock(ahc, &flags);
    764	found = ahc_reset_channel(ahc, scmd_channel(cmd) + 'A',
    765				  /*initiate reset*/TRUE);
    766	ahc_unlock(ahc, &flags);
    767
    768	if (bootverbose)
    769		printk("%s: SCSI bus reset delivered. "
    770		       "%d SCBs aborted.\n", ahc_name(ahc), found);
    771
    772	return SUCCESS;
    773}
    774
    775struct scsi_host_template aic7xxx_driver_template = {
    776	.module			= THIS_MODULE,
    777	.name			= "aic7xxx",
    778	.proc_name		= "aic7xxx",
    779	.show_info		= ahc_linux_show_info,
    780	.write_info		= ahc_proc_write_seeprom,
    781	.info			= ahc_linux_info,
    782	.queuecommand		= ahc_linux_queue,
    783	.eh_abort_handler	= ahc_linux_abort,
    784	.eh_device_reset_handler = ahc_linux_dev_reset,
    785	.eh_bus_reset_handler	= ahc_linux_bus_reset,
    786#if defined(__i386__)
    787	.bios_param		= ahc_linux_biosparam,
    788#endif
    789	.can_queue		= AHC_MAX_QUEUE,
    790	.this_id		= -1,
    791	.max_sectors		= 8192,
    792	.cmd_per_lun		= 2,
    793	.slave_alloc		= ahc_linux_slave_alloc,
    794	.slave_configure	= ahc_linux_slave_configure,
    795	.target_alloc		= ahc_linux_target_alloc,
    796	.target_destroy		= ahc_linux_target_destroy,
    797};
    798
    799/**************************** Tasklet Handler *********************************/
    800
    801/******************************** Macros **************************************/
    802#define BUILD_SCSIID(ahc, cmd)						    \
    803	((((cmd)->device->id << TID_SHIFT) & TID)			    \
    804	| (((cmd)->device->channel == 0) ? (ahc)->our_id : (ahc)->our_id_b) \
    805	| (((cmd)->device->channel == 0) ? 0 : TWIN_CHNLB))
    806
    807/******************************** Bus DMA *************************************/
    808int
    809ahc_dma_tag_create(struct ahc_softc *ahc, bus_dma_tag_t parent,
    810		   bus_size_t alignment, bus_size_t boundary,
    811		   dma_addr_t lowaddr, dma_addr_t highaddr,
    812		   bus_dma_filter_t *filter, void *filterarg,
    813		   bus_size_t maxsize, int nsegments,
    814		   bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
    815{
    816	bus_dma_tag_t dmat;
    817
    818	dmat = kmalloc(sizeof(*dmat), GFP_ATOMIC);
    819	if (dmat == NULL)
    820		return (ENOMEM);
    821
    822	/*
    823	 * Linux is very simplistic about DMA memory.  For now don't
    824	 * maintain all specification information.  Once Linux supplies
    825	 * better facilities for doing these operations, or the
    826	 * needs of this particular driver change, we might need to do
    827	 * more here.
    828	 */
    829	dmat->alignment = alignment;
    830	dmat->boundary = boundary;
    831	dmat->maxsize = maxsize;
    832	*ret_tag = dmat;
    833	return (0);
    834}
    835
    836void
    837ahc_dma_tag_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat)
    838{
    839	kfree(dmat);
    840}
    841
    842int
    843ahc_dmamem_alloc(struct ahc_softc *ahc, bus_dma_tag_t dmat, void** vaddr,
    844		 int flags, bus_dmamap_t *mapp)
    845{
    846	/* XXX: check if we really need the GFP_ATOMIC and unwind this mess! */
    847	*vaddr = dma_alloc_coherent(ahc->dev, dmat->maxsize, mapp, GFP_ATOMIC);
    848	if (*vaddr == NULL)
    849		return ENOMEM;
    850	return 0;
    851}
    852
    853void
    854ahc_dmamem_free(struct ahc_softc *ahc, bus_dma_tag_t dmat,
    855		void* vaddr, bus_dmamap_t map)
    856{
    857	dma_free_coherent(ahc->dev, dmat->maxsize, vaddr, map);
    858}
    859
    860int
    861ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map,
    862		void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
    863		void *cb_arg, int flags)
    864{
    865	/*
    866	 * Assume for now that this will only be used during
    867	 * initialization and not for per-transaction buffer mapping.
    868	 */
    869	bus_dma_segment_t stack_sg;
    870
    871	stack_sg.ds_addr = map;
    872	stack_sg.ds_len = dmat->maxsize;
    873	cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
    874	return (0);
    875}
    876
    877void
    878ahc_dmamap_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
    879{
    880}
    881
    882int
    883ahc_dmamap_unload(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
    884{
    885	/* Nothing to do */
    886	return (0);
    887}
    888
    889static void
    890ahc_linux_setup_tag_info_global(char *p)
    891{
    892	int tags, i, j;
    893
    894	tags = simple_strtoul(p + 1, NULL, 0) & 0xff;
    895	printk("Setting Global Tags= %d\n", tags);
    896
    897	for (i = 0; i < ARRAY_SIZE(aic7xxx_tag_info); i++) {
    898		for (j = 0; j < AHC_NUM_TARGETS; j++) {
    899			aic7xxx_tag_info[i].tag_commands[j] = tags;
    900		}
    901	}
    902}
    903
    904static void
    905ahc_linux_setup_tag_info(u_long arg, int instance, int targ, int32_t value)
    906{
    907
    908	if ((instance >= 0) && (targ >= 0)
    909	 && (instance < ARRAY_SIZE(aic7xxx_tag_info))
    910	 && (targ < AHC_NUM_TARGETS)) {
    911		aic7xxx_tag_info[instance].tag_commands[targ] = value & 0xff;
    912		if (bootverbose)
    913			printk("tag_info[%d:%d] = %d\n", instance, targ, value);
    914	}
    915}
    916
    917static char *
    918ahc_parse_brace_option(char *opt_name, char *opt_arg, char *end, int depth,
    919		       void (*callback)(u_long, int, int, int32_t),
    920		       u_long callback_arg)
    921{
    922	char	*tok_end;
    923	char	*tok_end2;
    924	int      i;
    925	int      instance;
    926	int	 targ;
    927	int	 done;
    928	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
    929
    930	/* All options use a ':' name/arg separator */
    931	if (*opt_arg != ':')
    932		return (opt_arg);
    933	opt_arg++;
    934	instance = -1;
    935	targ = -1;
    936	done = FALSE;
    937	/*
    938	 * Restore separator that may be in
    939	 * the middle of our option argument.
    940	 */
    941	tok_end = strchr(opt_arg, '\0');
    942	if (tok_end < end)
    943		*tok_end = ',';
    944	while (!done) {
    945		switch (*opt_arg) {
    946		case '{':
    947			if (instance == -1) {
    948				instance = 0;
    949			} else {
    950				if (depth > 1) {
    951					if (targ == -1)
    952						targ = 0;
    953				} else {
    954					printk("Malformed Option %s\n",
    955					       opt_name);
    956					done = TRUE;
    957				}
    958			}
    959			opt_arg++;
    960			break;
    961		case '}':
    962			if (targ != -1)
    963				targ = -1;
    964			else if (instance != -1)
    965				instance = -1;
    966			opt_arg++;
    967			break;
    968		case ',':
    969		case '.':
    970			if (instance == -1)
    971				done = TRUE;
    972			else if (targ >= 0)
    973				targ++;
    974			else if (instance >= 0)
    975				instance++;
    976			opt_arg++;
    977			break;
    978		case '\0':
    979			done = TRUE;
    980			break;
    981		default:
    982			tok_end = end;
    983			for (i = 0; tok_list[i]; i++) {
    984				tok_end2 = strchr(opt_arg, tok_list[i]);
    985				if ((tok_end2) && (tok_end2 < tok_end))
    986					tok_end = tok_end2;
    987			}
    988			callback(callback_arg, instance, targ,
    989				 simple_strtol(opt_arg, NULL, 0));
    990			opt_arg = tok_end;
    991			break;
    992		}
    993	}
    994	return (opt_arg);
    995}
    996
    997/*
    998 * Handle Linux boot parameters. This routine allows for assigning a value
    999 * to a parameter with a ':' between the parameter and the value.
   1000 * ie. aic7xxx=stpwlev:1,extended
   1001 */
   1002static int
   1003aic7xxx_setup(char *s)
   1004{
   1005	int	i, n;
   1006	char   *p;
   1007	char   *end;
   1008
   1009	static const struct {
   1010		const char *name;
   1011		uint32_t *flag;
   1012	} options[] = {
   1013		{ "extended", &aic7xxx_extended },
   1014		{ "no_reset", &aic7xxx_no_reset },
   1015		{ "verbose", &aic7xxx_verbose },
   1016		{ "allow_memio", &aic7xxx_allow_memio},
   1017#ifdef AHC_DEBUG
   1018		{ "debug", &ahc_debug },
   1019#endif
   1020		{ "periodic_otag", &aic7xxx_periodic_otag },
   1021		{ "pci_parity", &aic7xxx_pci_parity },
   1022		{ "seltime", &aic7xxx_seltime },
   1023		{ "tag_info", NULL },
   1024		{ "global_tag_depth", NULL },
   1025		{ "dv", NULL }
   1026	};
   1027
   1028	end = strchr(s, '\0');
   1029
   1030	/*
   1031	 * XXX ia64 gcc isn't smart enough to know that ARRAY_SIZE
   1032	 * will never be 0 in this case.
   1033	 */
   1034	n = 0;
   1035
   1036	while ((p = strsep(&s, ",.")) != NULL) {
   1037		if (*p == '\0')
   1038			continue;
   1039		for (i = 0; i < ARRAY_SIZE(options); i++) {
   1040
   1041			n = strlen(options[i].name);
   1042			if (strncmp(options[i].name, p, n) == 0)
   1043				break;
   1044		}
   1045		if (i == ARRAY_SIZE(options))
   1046			continue;
   1047
   1048		if (strncmp(p, "global_tag_depth", n) == 0) {
   1049			ahc_linux_setup_tag_info_global(p + n);
   1050		} else if (strncmp(p, "tag_info", n) == 0) {
   1051			s = ahc_parse_brace_option("tag_info", p + n, end,
   1052			    2, ahc_linux_setup_tag_info, 0);
   1053		} else if (p[n] == ':') {
   1054			*(options[i].flag) = simple_strtoul(p + n + 1, NULL, 0);
   1055		} else if (strncmp(p, "verbose", n) == 0) {
   1056			*(options[i].flag) = 1;
   1057		} else {
   1058			*(options[i].flag) ^= 0xFFFFFFFF;
   1059		}
   1060	}
   1061	return 1;
   1062}
   1063
   1064__setup("aic7xxx=", aic7xxx_setup);
   1065
   1066uint32_t aic7xxx_verbose;
   1067
   1068int
   1069ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *template)
   1070{
   1071	char	buf[80];
   1072	struct	Scsi_Host *host;
   1073	char	*new_name;
   1074	u_long	s;
   1075	int	retval;
   1076
   1077	template->name = ahc->description;
   1078	host = scsi_host_alloc(template, sizeof(struct ahc_softc *));
   1079	if (host == NULL)
   1080		return (ENOMEM);
   1081
   1082	*((struct ahc_softc **)host->hostdata) = ahc;
   1083	ahc->platform_data->host = host;
   1084	host->can_queue = AHC_MAX_QUEUE;
   1085	host->cmd_per_lun = 2;
   1086	/* XXX No way to communicate the ID for multiple channels */
   1087	host->this_id = ahc->our_id;
   1088	host->irq = ahc->platform_data->irq;
   1089	host->max_id = (ahc->features & AHC_WIDE) ? 16 : 8;
   1090	host->max_lun = AHC_NUM_LUNS;
   1091	host->max_channel = (ahc->features & AHC_TWIN) ? 1 : 0;
   1092	host->sg_tablesize = AHC_NSEG;
   1093	ahc_lock(ahc, &s);
   1094	ahc_set_unit(ahc, ahc_linux_unit++);
   1095	ahc_unlock(ahc, &s);
   1096	sprintf(buf, "scsi%d", host->host_no);
   1097	new_name = kmalloc(strlen(buf) + 1, GFP_ATOMIC);
   1098	if (new_name != NULL) {
   1099		strcpy(new_name, buf);
   1100		ahc_set_name(ahc, new_name);
   1101	}
   1102	host->unique_id = ahc->unit;
   1103	ahc_linux_initialize_scsi_bus(ahc);
   1104	ahc_intr_enable(ahc, TRUE);
   1105
   1106	host->transportt = ahc_linux_transport_template;
   1107
   1108	retval = scsi_add_host(host, ahc->dev);
   1109	if (retval) {
   1110		printk(KERN_WARNING "aic7xxx: scsi_add_host failed\n");
   1111		scsi_host_put(host);
   1112		return retval;
   1113	}
   1114
   1115	scsi_scan_host(host);
   1116	return 0;
   1117}
   1118
   1119/*
   1120 * Place the SCSI bus into a known state by either resetting it,
   1121 * or forcing transfer negotiations on the next command to any
   1122 * target.
   1123 */
   1124static void
   1125ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc)
   1126{
   1127	int i;
   1128	int numtarg;
   1129	unsigned long s;
   1130
   1131	i = 0;
   1132	numtarg = 0;
   1133
   1134	ahc_lock(ahc, &s);
   1135
   1136	if (aic7xxx_no_reset != 0)
   1137		ahc->flags &= ~(AHC_RESET_BUS_A|AHC_RESET_BUS_B);
   1138
   1139	if ((ahc->flags & AHC_RESET_BUS_A) != 0)
   1140		ahc_reset_channel(ahc, 'A', /*initiate_reset*/TRUE);
   1141	else
   1142		numtarg = (ahc->features & AHC_WIDE) ? 16 : 8;
   1143
   1144	if ((ahc->features & AHC_TWIN) != 0) {
   1145
   1146		if ((ahc->flags & AHC_RESET_BUS_B) != 0) {
   1147			ahc_reset_channel(ahc, 'B', /*initiate_reset*/TRUE);
   1148		} else {
   1149			if (numtarg == 0)
   1150				i = 8;
   1151			numtarg += 8;
   1152		}
   1153	}
   1154
   1155	/*
   1156	 * Force negotiation to async for all targets that
   1157	 * will not see an initial bus reset.
   1158	 */
   1159	for (; i < numtarg; i++) {
   1160		struct ahc_devinfo devinfo;
   1161		struct ahc_initiator_tinfo *tinfo;
   1162		struct ahc_tmode_tstate *tstate;
   1163		u_int our_id;
   1164		u_int target_id;
   1165		char channel;
   1166
   1167		channel = 'A';
   1168		our_id = ahc->our_id;
   1169		target_id = i;
   1170		if (i > 7 && (ahc->features & AHC_TWIN) != 0) {
   1171			channel = 'B';
   1172			our_id = ahc->our_id_b;
   1173			target_id = i % 8;
   1174		}
   1175		tinfo = ahc_fetch_transinfo(ahc, channel, our_id,
   1176					    target_id, &tstate);
   1177		ahc_compile_devinfo(&devinfo, our_id, target_id,
   1178				    CAM_LUN_WILDCARD, channel, ROLE_INITIATOR);
   1179		ahc_update_neg_request(ahc, &devinfo, tstate,
   1180				       tinfo, AHC_NEG_ALWAYS);
   1181	}
   1182	ahc_unlock(ahc, &s);
   1183	/* Give the bus some time to recover */
   1184	if ((ahc->flags & (AHC_RESET_BUS_A|AHC_RESET_BUS_B)) != 0) {
   1185		ahc_linux_freeze_simq(ahc);
   1186		msleep(AIC7XXX_RESET_DELAY);
   1187		ahc_linux_release_simq(ahc);
   1188	}
   1189}
   1190
   1191int
   1192ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg)
   1193{
   1194
   1195	ahc->platform_data =
   1196	    kzalloc(sizeof(struct ahc_platform_data), GFP_ATOMIC);
   1197	if (ahc->platform_data == NULL)
   1198		return (ENOMEM);
   1199	ahc->platform_data->irq = AHC_LINUX_NOIRQ;
   1200	ahc_lockinit(ahc);
   1201	ahc->seltime = (aic7xxx_seltime & 0x3) << 4;
   1202	ahc->seltime_b = (aic7xxx_seltime & 0x3) << 4;
   1203	if (aic7xxx_pci_parity == 0)
   1204		ahc->flags |= AHC_DISABLE_PCI_PERR;
   1205
   1206	return (0);
   1207}
   1208
   1209void
   1210ahc_platform_free(struct ahc_softc *ahc)
   1211{
   1212	struct scsi_target *starget;
   1213	int i;
   1214
   1215	if (ahc->platform_data != NULL) {
   1216		/* destroy all of the device and target objects */
   1217		for (i = 0; i < AHC_NUM_TARGETS; i++) {
   1218			starget = ahc->platform_data->starget[i];
   1219			if (starget != NULL) {
   1220				ahc->platform_data->starget[i] = NULL;
   1221			}
   1222		}
   1223
   1224		if (ahc->platform_data->irq != AHC_LINUX_NOIRQ)
   1225			free_irq(ahc->platform_data->irq, ahc);
   1226		if (ahc->tag == BUS_SPACE_PIO
   1227		 && ahc->bsh.ioport != 0)
   1228			release_region(ahc->bsh.ioport, 256);
   1229		if (ahc->tag == BUS_SPACE_MEMIO
   1230		 && ahc->bsh.maddr != NULL) {
   1231			iounmap(ahc->bsh.maddr);
   1232			release_mem_region(ahc->platform_data->mem_busaddr,
   1233					   0x1000);
   1234		}
   1235
   1236		if (ahc->platform_data->host)
   1237			scsi_host_put(ahc->platform_data->host);
   1238
   1239		kfree(ahc->platform_data);
   1240	}
   1241}
   1242
   1243void
   1244ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb)
   1245{
   1246	ahc_platform_abort_scbs(ahc, SCB_GET_TARGET(ahc, scb),
   1247				SCB_GET_CHANNEL(ahc, scb),
   1248				SCB_GET_LUN(scb), SCB_LIST_NULL,
   1249				ROLE_UNKNOWN, CAM_REQUEUE_REQ);
   1250}
   1251
   1252void
   1253ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev,
   1254		      struct ahc_devinfo *devinfo, ahc_queue_alg alg)
   1255{
   1256	struct ahc_linux_device *dev;
   1257	int was_queuing;
   1258	int now_queuing;
   1259
   1260	if (sdev == NULL)
   1261		return;
   1262	dev = scsi_transport_device_data(sdev);
   1263
   1264	was_queuing = dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED);
   1265	switch (alg) {
   1266	default:
   1267	case AHC_QUEUE_NONE:
   1268		now_queuing = 0;
   1269		break;
   1270	case AHC_QUEUE_BASIC:
   1271		now_queuing = AHC_DEV_Q_BASIC;
   1272		break;
   1273	case AHC_QUEUE_TAGGED:
   1274		now_queuing = AHC_DEV_Q_TAGGED;
   1275		break;
   1276	}
   1277	if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) == 0
   1278	 && (was_queuing != now_queuing)
   1279	 && (dev->active != 0)) {
   1280		dev->flags |= AHC_DEV_FREEZE_TIL_EMPTY;
   1281		dev->qfrozen++;
   1282	}
   1283
   1284	dev->flags &= ~(AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED|AHC_DEV_PERIODIC_OTAG);
   1285	if (now_queuing) {
   1286		u_int usertags;
   1287
   1288		usertags = ahc_linux_user_tagdepth(ahc, devinfo);
   1289		if (!was_queuing) {
   1290			/*
   1291			 * Start out aggressively and allow our
   1292			 * dynamic queue depth algorithm to take
   1293			 * care of the rest.
   1294			 */
   1295			dev->maxtags = usertags;
   1296			dev->openings = dev->maxtags - dev->active;
   1297		}
   1298		if (dev->maxtags == 0) {
   1299			/*
   1300			 * Queueing is disabled by the user.
   1301			 */
   1302			dev->openings = 1;
   1303		} else if (alg == AHC_QUEUE_TAGGED) {
   1304			dev->flags |= AHC_DEV_Q_TAGGED;
   1305			if (aic7xxx_periodic_otag != 0)
   1306				dev->flags |= AHC_DEV_PERIODIC_OTAG;
   1307		} else
   1308			dev->flags |= AHC_DEV_Q_BASIC;
   1309	} else {
   1310		/* We can only have one opening. */
   1311		dev->maxtags = 0;
   1312		dev->openings =  1 - dev->active;
   1313	}
   1314	switch ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED))) {
   1315	case AHC_DEV_Q_BASIC:
   1316	case AHC_DEV_Q_TAGGED:
   1317		scsi_change_queue_depth(sdev,
   1318				dev->openings + dev->active);
   1319		break;
   1320	default:
   1321		/*
   1322		 * We allow the OS to queue 2 untagged transactions to
   1323		 * us at any time even though we can only execute them
   1324		 * serially on the controller/device.  This should
   1325		 * remove some latency.
   1326		 */
   1327		scsi_change_queue_depth(sdev, 2);
   1328		break;
   1329	}
   1330}
   1331
   1332int
   1333ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, char channel,
   1334			int lun, u_int tag, role_t role, uint32_t status)
   1335{
   1336	return 0;
   1337}
   1338
   1339static u_int
   1340ahc_linux_user_tagdepth(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
   1341{
   1342	static int warned_user;
   1343	u_int tags;
   1344
   1345	tags = 0;
   1346	if ((ahc->user_discenable & devinfo->target_mask) != 0) {
   1347		if (ahc->unit >= ARRAY_SIZE(aic7xxx_tag_info)) {
   1348			if (warned_user == 0) {
   1349
   1350				printk(KERN_WARNING
   1351"aic7xxx: WARNING: Insufficient tag_info instances\n"
   1352"aic7xxx: for installed controllers. Using defaults\n"
   1353"aic7xxx: Please update the aic7xxx_tag_info array in\n"
   1354"aic7xxx: the aic7xxx_osm..c source file.\n");
   1355				warned_user++;
   1356			}
   1357			tags = AHC_MAX_QUEUE;
   1358		} else {
   1359			adapter_tag_info_t *tag_info;
   1360
   1361			tag_info = &aic7xxx_tag_info[ahc->unit];
   1362			tags = tag_info->tag_commands[devinfo->target_offset];
   1363			if (tags > AHC_MAX_QUEUE)
   1364				tags = AHC_MAX_QUEUE;
   1365		}
   1366	}
   1367	return (tags);
   1368}
   1369
   1370/*
   1371 * Determines the queue depth for a given device.
   1372 */
   1373static void
   1374ahc_linux_device_queue_depth(struct scsi_device *sdev)
   1375{
   1376	struct	ahc_devinfo devinfo;
   1377	u_int	tags;
   1378	struct ahc_softc *ahc = *((struct ahc_softc **)sdev->host->hostdata);
   1379
   1380	ahc_compile_devinfo(&devinfo,
   1381			    sdev->sdev_target->channel == 0
   1382			  ? ahc->our_id : ahc->our_id_b,
   1383			    sdev->sdev_target->id, sdev->lun,
   1384			    sdev->sdev_target->channel == 0 ? 'A' : 'B',
   1385			    ROLE_INITIATOR);
   1386	tags = ahc_linux_user_tagdepth(ahc, &devinfo);
   1387	if (tags != 0 && sdev->tagged_supported != 0) {
   1388
   1389		ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_TAGGED);
   1390		ahc_send_async(ahc, devinfo.channel, devinfo.target,
   1391			       devinfo.lun, AC_TRANSFER_NEG);
   1392		ahc_print_devinfo(ahc, &devinfo);
   1393		printk("Tagged Queuing enabled.  Depth %d\n", tags);
   1394	} else {
   1395		ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_NONE);
   1396		ahc_send_async(ahc, devinfo.channel, devinfo.target,
   1397			       devinfo.lun, AC_TRANSFER_NEG);
   1398	}
   1399}
   1400
   1401static int
   1402ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,
   1403		      struct scsi_cmnd *cmd)
   1404{
   1405	struct	 scb *scb;
   1406	struct	 hardware_scb *hscb;
   1407	struct	 ahc_initiator_tinfo *tinfo;
   1408	struct	 ahc_tmode_tstate *tstate;
   1409	uint16_t mask;
   1410	struct scb_tailq *untagged_q = NULL;
   1411	int nseg;
   1412
   1413	/*
   1414	 * Schedule us to run later.  The only reason we are not
   1415	 * running is because the whole controller Q is frozen.
   1416	 */
   1417	if (ahc->platform_data->qfrozen != 0)
   1418		return SCSI_MLQUEUE_HOST_BUSY;
   1419
   1420	/*
   1421	 * We only allow one untagged transaction
   1422	 * per target in the initiator role unless
   1423	 * we are storing a full busy target *lun*
   1424	 * table in SCB space.
   1425	 */
   1426	if (!(cmd->flags & SCMD_TAGGED)
   1427	    && (ahc->features & AHC_SCB_BTT) == 0) {
   1428		int target_offset;
   1429
   1430		target_offset = cmd->device->id + cmd->device->channel * 8;
   1431		untagged_q = &(ahc->untagged_queues[target_offset]);
   1432		if (!TAILQ_EMPTY(untagged_q))
   1433			/* if we're already executing an untagged command
   1434			 * we're busy to another */
   1435			return SCSI_MLQUEUE_DEVICE_BUSY;
   1436	}
   1437
   1438	nseg = scsi_dma_map(cmd);
   1439	if (nseg < 0)
   1440		return SCSI_MLQUEUE_HOST_BUSY;
   1441
   1442	/*
   1443	 * Get an scb to use.
   1444	 */
   1445	scb = ahc_get_scb(ahc);
   1446	if (!scb) {
   1447		scsi_dma_unmap(cmd);
   1448		return SCSI_MLQUEUE_HOST_BUSY;
   1449	}
   1450
   1451	scb->io_ctx = cmd;
   1452	scb->platform_data->dev = dev;
   1453	hscb = scb->hscb;
   1454	cmd->host_scribble = (char *)scb;
   1455
   1456	/*
   1457	 * Fill out basics of the HSCB.
   1458	 */
   1459	hscb->control = 0;
   1460	hscb->scsiid = BUILD_SCSIID(ahc, cmd);
   1461	hscb->lun = cmd->device->lun;
   1462	mask = SCB_GET_TARGET_MASK(ahc, scb);
   1463	tinfo = ahc_fetch_transinfo(ahc, SCB_GET_CHANNEL(ahc, scb),
   1464				    SCB_GET_OUR_ID(scb),
   1465				    SCB_GET_TARGET(ahc, scb), &tstate);
   1466	hscb->scsirate = tinfo->scsirate;
   1467	hscb->scsioffset = tinfo->curr.offset;
   1468	if ((tstate->ultraenb & mask) != 0)
   1469		hscb->control |= ULTRAENB;
   1470
   1471	if ((ahc->user_discenable & mask) != 0)
   1472		hscb->control |= DISCENB;
   1473
   1474	if ((tstate->auto_negotiate & mask) != 0) {
   1475		scb->flags |= SCB_AUTO_NEGOTIATE;
   1476		scb->hscb->control |= MK_MESSAGE;
   1477	}
   1478
   1479	if ((dev->flags & (AHC_DEV_Q_TAGGED|AHC_DEV_Q_BASIC)) != 0) {
   1480		if (dev->commands_since_idle_or_otag == AHC_OTAG_THRESH
   1481				&& (dev->flags & AHC_DEV_Q_TAGGED) != 0) {
   1482			hscb->control |= ORDERED_QUEUE_TAG;
   1483			dev->commands_since_idle_or_otag = 0;
   1484		} else {
   1485			hscb->control |= SIMPLE_QUEUE_TAG;
   1486		}
   1487	}
   1488
   1489	hscb->cdb_len = cmd->cmd_len;
   1490	if (hscb->cdb_len <= 12) {
   1491		memcpy(hscb->shared_data.cdb, cmd->cmnd, hscb->cdb_len);
   1492	} else {
   1493		memcpy(hscb->cdb32, cmd->cmnd, hscb->cdb_len);
   1494		scb->flags |= SCB_CDB32_PTR;
   1495	}
   1496
   1497	scb->platform_data->xfer_len = 0;
   1498	ahc_set_residual(scb, 0);
   1499	ahc_set_sense_residual(scb, 0);
   1500	scb->sg_count = 0;
   1501
   1502	if (nseg > 0) {
   1503		struct	ahc_dma_seg *sg;
   1504		struct	scatterlist *cur_seg;
   1505		int i;
   1506
   1507		/* Copy the segments into the SG list. */
   1508		sg = scb->sg_list;
   1509		/*
   1510		 * The sg_count may be larger than nseg if
   1511		 * a transfer crosses a 32bit page.
   1512		 */
   1513		scsi_for_each_sg(cmd, cur_seg, nseg, i) {
   1514			dma_addr_t addr;
   1515			bus_size_t len;
   1516			int consumed;
   1517
   1518			addr = sg_dma_address(cur_seg);
   1519			len = sg_dma_len(cur_seg);
   1520			consumed = ahc_linux_map_seg(ahc, scb,
   1521						     sg, addr, len);
   1522			sg += consumed;
   1523			scb->sg_count += consumed;
   1524		}
   1525		sg--;
   1526		sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
   1527
   1528		/*
   1529		 * Reset the sg list pointer.
   1530		 */
   1531		scb->hscb->sgptr =
   1532			ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
   1533
   1534		/*
   1535		 * Copy the first SG into the "current"
   1536		 * data pointer area.
   1537		 */
   1538		scb->hscb->dataptr = scb->sg_list->addr;
   1539		scb->hscb->datacnt = scb->sg_list->len;
   1540	} else {
   1541		scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
   1542		scb->hscb->dataptr = 0;
   1543		scb->hscb->datacnt = 0;
   1544		scb->sg_count = 0;
   1545	}
   1546
   1547	LIST_INSERT_HEAD(&ahc->pending_scbs, scb, pending_links);
   1548	dev->openings--;
   1549	dev->active++;
   1550	dev->commands_issued++;
   1551	if ((dev->flags & AHC_DEV_PERIODIC_OTAG) != 0)
   1552		dev->commands_since_idle_or_otag++;
   1553
   1554	scb->flags |= SCB_ACTIVE;
   1555	if (untagged_q) {
   1556		TAILQ_INSERT_TAIL(untagged_q, scb, links.tqe);
   1557		scb->flags |= SCB_UNTAGGEDQ;
   1558	}
   1559	ahc_queue_scb(ahc, scb);
   1560	return 0;
   1561}
   1562
   1563/*
   1564 * SCSI controller interrupt handler.
   1565 */
   1566irqreturn_t
   1567ahc_linux_isr(int irq, void *dev_id)
   1568{
   1569	struct	ahc_softc *ahc;
   1570	u_long	flags;
   1571	int	ours;
   1572
   1573	ahc = (struct ahc_softc *) dev_id;
   1574	ahc_lock(ahc, &flags);
   1575	ours = ahc_intr(ahc);
   1576	ahc_unlock(ahc, &flags);
   1577	return IRQ_RETVAL(ours);
   1578}
   1579
   1580void
   1581ahc_platform_flushwork(struct ahc_softc *ahc)
   1582{
   1583
   1584}
   1585
   1586void
   1587ahc_send_async(struct ahc_softc *ahc, char channel,
   1588	       u_int target, u_int lun, ac_code code)
   1589{
   1590	switch (code) {
   1591	case AC_TRANSFER_NEG:
   1592	{
   1593		struct	scsi_target *starget;
   1594		struct	ahc_initiator_tinfo *tinfo;
   1595		struct	ahc_tmode_tstate *tstate;
   1596		int	target_offset;
   1597		unsigned int target_ppr_options;
   1598
   1599		BUG_ON(target == CAM_TARGET_WILDCARD);
   1600
   1601		tinfo = ahc_fetch_transinfo(ahc, channel,
   1602						channel == 'A' ? ahc->our_id
   1603							       : ahc->our_id_b,
   1604						target, &tstate);
   1605
   1606		/*
   1607		 * Don't bother reporting results while
   1608		 * negotiations are still pending.
   1609		 */
   1610		if (tinfo->curr.period != tinfo->goal.period
   1611		 || tinfo->curr.width != tinfo->goal.width
   1612		 || tinfo->curr.offset != tinfo->goal.offset
   1613		 || tinfo->curr.ppr_options != tinfo->goal.ppr_options)
   1614			if (bootverbose == 0)
   1615				break;
   1616
   1617		/*
   1618		 * Don't bother reporting results that
   1619		 * are identical to those last reported.
   1620		 */
   1621		target_offset = target;
   1622		if (channel == 'B')
   1623			target_offset += 8;
   1624		starget = ahc->platform_data->starget[target_offset];
   1625		if (starget == NULL)
   1626			break;
   1627
   1628		target_ppr_options =
   1629			(spi_dt(starget) ? MSG_EXT_PPR_DT_REQ : 0)
   1630			+ (spi_qas(starget) ? MSG_EXT_PPR_QAS_REQ : 0)
   1631			+ (spi_iu(starget) ?  MSG_EXT_PPR_IU_REQ : 0);
   1632
   1633		if (tinfo->curr.period == spi_period(starget)
   1634		    && tinfo->curr.width == spi_width(starget)
   1635		    && tinfo->curr.offset == spi_offset(starget)
   1636		 && tinfo->curr.ppr_options == target_ppr_options)
   1637			if (bootverbose == 0)
   1638				break;
   1639
   1640		spi_period(starget) = tinfo->curr.period;
   1641		spi_width(starget) = tinfo->curr.width;
   1642		spi_offset(starget) = tinfo->curr.offset;
   1643		spi_dt(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_DT_REQ ? 1 : 0;
   1644		spi_qas(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_QAS_REQ ? 1 : 0;
   1645		spi_iu(starget) = tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ ? 1 : 0;
   1646		spi_display_xfer_agreement(starget);
   1647		break;
   1648	}
   1649	case AC_SENT_BDR:
   1650	{
   1651		WARN_ON(lun != CAM_LUN_WILDCARD);
   1652		scsi_report_device_reset(ahc->platform_data->host,
   1653					 channel - 'A', target);
   1654		break;
   1655	}
   1656	case AC_BUS_RESET:
   1657		if (ahc->platform_data->host != NULL) {
   1658			scsi_report_bus_reset(ahc->platform_data->host,
   1659					      channel - 'A');
   1660		}
   1661		break;
   1662	default:
   1663		panic("ahc_send_async: Unexpected async event");
   1664	}
   1665}
   1666
   1667/*
   1668 * Calls the higher level scsi done function and frees the scb.
   1669 */
   1670void
   1671ahc_done(struct ahc_softc *ahc, struct scb *scb)
   1672{
   1673	struct scsi_cmnd *cmd;
   1674	struct	   ahc_linux_device *dev;
   1675
   1676	LIST_REMOVE(scb, pending_links);
   1677	if ((scb->flags & SCB_UNTAGGEDQ) != 0) {
   1678		struct scb_tailq *untagged_q;
   1679		int target_offset;
   1680
   1681		target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
   1682		untagged_q = &(ahc->untagged_queues[target_offset]);
   1683		TAILQ_REMOVE(untagged_q, scb, links.tqe);
   1684		BUG_ON(!TAILQ_EMPTY(untagged_q));
   1685	} else if ((scb->flags & SCB_ACTIVE) == 0) {
   1686		/*
   1687		 * Transactions aborted from the untagged queue may
   1688		 * not have been dispatched to the controller, so
   1689		 * only check the SCB_ACTIVE flag for tagged transactions.
   1690		 */
   1691		printk("SCB %d done'd twice\n", scb->hscb->tag);
   1692		ahc_dump_card_state(ahc);
   1693		panic("Stopping for safety");
   1694	}
   1695	cmd = scb->io_ctx;
   1696	dev = scb->platform_data->dev;
   1697	dev->active--;
   1698	dev->openings++;
   1699	if ((cmd->result & (CAM_DEV_QFRZN << 16)) != 0) {
   1700		cmd->result &= ~(CAM_DEV_QFRZN << 16);
   1701		dev->qfrozen--;
   1702	}
   1703	ahc_linux_unmap_scb(ahc, scb);
   1704
   1705	/*
   1706	 * Guard against stale sense data.
   1707	 * The Linux mid-layer assumes that sense
   1708	 * was retrieved anytime the first byte of
   1709	 * the sense buffer looks "sane".
   1710	 */
   1711	cmd->sense_buffer[0] = 0;
   1712	if (ahc_get_transaction_status(scb) == CAM_REQ_INPROG) {
   1713#ifdef AHC_REPORT_UNDERFLOWS
   1714		uint32_t amount_xferred;
   1715
   1716		amount_xferred =
   1717		    ahc_get_transfer_length(scb) - ahc_get_residual(scb);
   1718#endif
   1719		if ((scb->flags & SCB_TRANSMISSION_ERROR) != 0) {
   1720#ifdef AHC_DEBUG
   1721			if ((ahc_debug & AHC_SHOW_MISC) != 0) {
   1722				ahc_print_path(ahc, scb);
   1723				printk("Set CAM_UNCOR_PARITY\n");
   1724			}
   1725#endif
   1726			ahc_set_transaction_status(scb, CAM_UNCOR_PARITY);
   1727#ifdef AHC_REPORT_UNDERFLOWS
   1728		/*
   1729		 * This code is disabled by default as some
   1730		 * clients of the SCSI system do not properly
   1731		 * initialize the underflow parameter.  This
   1732		 * results in spurious termination of commands
   1733		 * that complete as expected (e.g. underflow is
   1734		 * allowed as command can return variable amounts
   1735		 * of data.
   1736		 */
   1737		} else if (amount_xferred < scb->io_ctx->underflow) {
   1738			u_int i;
   1739
   1740			ahc_print_path(ahc, scb);
   1741			printk("CDB:");
   1742			for (i = 0; i < scb->io_ctx->cmd_len; i++)
   1743				printk(" 0x%x", scb->io_ctx->cmnd[i]);
   1744			printk("\n");
   1745			ahc_print_path(ahc, scb);
   1746			printk("Saw underflow (%ld of %ld bytes). "
   1747			       "Treated as error\n",
   1748				ahc_get_residual(scb),
   1749				ahc_get_transfer_length(scb));
   1750			ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
   1751#endif
   1752		} else {
   1753			ahc_set_transaction_status(scb, CAM_REQ_CMP);
   1754		}
   1755	} else if (ahc_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
   1756		ahc_linux_handle_scsi_status(ahc, cmd->device, scb);
   1757	}
   1758
   1759	if (dev->openings == 1
   1760	 && ahc_get_transaction_status(scb) == CAM_REQ_CMP
   1761	 && ahc_get_scsi_status(scb) != SAM_STAT_TASK_SET_FULL)
   1762		dev->tag_success_count++;
   1763	/*
   1764	 * Some devices deal with temporary internal resource
   1765	 * shortages by returning queue full.  When the queue
   1766	 * full occurrs, we throttle back.  Slowly try to get
   1767	 * back to our previous queue depth.
   1768	 */
   1769	if ((dev->openings + dev->active) < dev->maxtags
   1770	 && dev->tag_success_count > AHC_TAG_SUCCESS_INTERVAL) {
   1771		dev->tag_success_count = 0;
   1772		dev->openings++;
   1773	}
   1774
   1775	if (dev->active == 0)
   1776		dev->commands_since_idle_or_otag = 0;
   1777
   1778	if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
   1779		printk("Recovery SCB completes\n");
   1780		if (ahc_get_transaction_status(scb) == CAM_BDR_SENT
   1781		 || ahc_get_transaction_status(scb) == CAM_REQ_ABORTED)
   1782			ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT);
   1783
   1784		if (ahc->platform_data->eh_done)
   1785			complete(ahc->platform_data->eh_done);
   1786	}
   1787
   1788	ahc_free_scb(ahc, scb);
   1789	ahc_linux_queue_cmd_complete(ahc, cmd);
   1790}
   1791
   1792static void
   1793ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
   1794			     struct scsi_device *sdev, struct scb *scb)
   1795{
   1796	struct	ahc_devinfo devinfo;
   1797	struct ahc_linux_device *dev = scsi_transport_device_data(sdev);
   1798
   1799	ahc_compile_devinfo(&devinfo,
   1800			    ahc->our_id,
   1801			    sdev->sdev_target->id, sdev->lun,
   1802			    sdev->sdev_target->channel == 0 ? 'A' : 'B',
   1803			    ROLE_INITIATOR);
   1804
   1805	/*
   1806	 * We don't currently trust the mid-layer to
   1807	 * properly deal with queue full or busy.  So,
   1808	 * when one occurs, we tell the mid-layer to
   1809	 * unconditionally requeue the command to us
   1810	 * so that we can retry it ourselves.  We also
   1811	 * implement our own throttling mechanism so
   1812	 * we don't clobber the device with too many
   1813	 * commands.
   1814	 */
   1815	switch (ahc_get_scsi_status(scb)) {
   1816	default:
   1817		break;
   1818	case SAM_STAT_CHECK_CONDITION:
   1819	case SAM_STAT_COMMAND_TERMINATED:
   1820	{
   1821		struct scsi_cmnd *cmd;
   1822
   1823		/*
   1824		 * Copy sense information to the OS's cmd
   1825		 * structure if it is available.
   1826		 */
   1827		cmd = scb->io_ctx;
   1828		if (scb->flags & SCB_SENSE) {
   1829			u_int sense_size;
   1830
   1831			sense_size = min(sizeof(struct scsi_sense_data)
   1832				       - ahc_get_sense_residual(scb),
   1833					 (u_long)SCSI_SENSE_BUFFERSIZE);
   1834			memcpy(cmd->sense_buffer,
   1835			       ahc_get_sense_buf(ahc, scb), sense_size);
   1836			if (sense_size < SCSI_SENSE_BUFFERSIZE)
   1837				memset(&cmd->sense_buffer[sense_size], 0,
   1838				       SCSI_SENSE_BUFFERSIZE - sense_size);
   1839#ifdef AHC_DEBUG
   1840			if (ahc_debug & AHC_SHOW_SENSE) {
   1841				int i;
   1842
   1843				printk("Copied %d bytes of sense data:",
   1844				       sense_size);
   1845				for (i = 0; i < sense_size; i++) {
   1846					if ((i & 0xF) == 0)
   1847						printk("\n");
   1848					printk("0x%x ", cmd->sense_buffer[i]);
   1849				}
   1850				printk("\n");
   1851			}
   1852#endif
   1853		}
   1854		break;
   1855	}
   1856	case SAM_STAT_TASK_SET_FULL:
   1857	{
   1858		/*
   1859		 * By the time the core driver has returned this
   1860		 * command, all other commands that were queued
   1861		 * to us but not the device have been returned.
   1862		 * This ensures that dev->active is equal to
   1863		 * the number of commands actually queued to
   1864		 * the device.
   1865		 */
   1866		dev->tag_success_count = 0;
   1867		if (dev->active != 0) {
   1868			/*
   1869			 * Drop our opening count to the number
   1870			 * of commands currently outstanding.
   1871			 */
   1872			dev->openings = 0;
   1873/*
   1874			ahc_print_path(ahc, scb);
   1875			printk("Dropping tag count to %d\n", dev->active);
   1876 */
   1877			if (dev->active == dev->tags_on_last_queuefull) {
   1878
   1879				dev->last_queuefull_same_count++;
   1880				/*
   1881				 * If we repeatedly see a queue full
   1882				 * at the same queue depth, this
   1883				 * device has a fixed number of tag
   1884				 * slots.  Lock in this tag depth
   1885				 * so we stop seeing queue fulls from
   1886				 * this device.
   1887				 */
   1888				if (dev->last_queuefull_same_count
   1889				 == AHC_LOCK_TAGS_COUNT) {
   1890					dev->maxtags = dev->active;
   1891					ahc_print_path(ahc, scb);
   1892					printk("Locking max tag count at %d\n",
   1893					       dev->active);
   1894				}
   1895			} else {
   1896				dev->tags_on_last_queuefull = dev->active;
   1897				dev->last_queuefull_same_count = 0;
   1898			}
   1899			ahc_set_transaction_status(scb, CAM_REQUEUE_REQ);
   1900			ahc_set_scsi_status(scb, SAM_STAT_GOOD);
   1901			ahc_platform_set_tags(ahc, sdev, &devinfo,
   1902				     (dev->flags & AHC_DEV_Q_BASIC)
   1903				   ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
   1904			break;
   1905		}
   1906		/*
   1907		 * Drop down to a single opening, and treat this
   1908		 * as if the target returned BUSY SCSI status.
   1909		 */
   1910		dev->openings = 1;
   1911		ahc_set_scsi_status(scb, SAM_STAT_BUSY);
   1912		ahc_platform_set_tags(ahc, sdev, &devinfo,
   1913			     (dev->flags & AHC_DEV_Q_BASIC)
   1914			   ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
   1915		break;
   1916	}
   1917	}
   1918}
   1919
   1920static void
   1921ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, struct scsi_cmnd *cmd)
   1922{
   1923	/*
   1924	 * Map CAM error codes into Linux Error codes.  We
   1925	 * avoid the conversion so that the DV code has the
   1926	 * full error information available when making
   1927	 * state change decisions.
   1928	 */
   1929	{
   1930		u_int new_status;
   1931
   1932		switch (ahc_cmd_get_transaction_status(cmd)) {
   1933		case CAM_REQ_INPROG:
   1934		case CAM_REQ_CMP:
   1935		case CAM_SCSI_STATUS_ERROR:
   1936			new_status = DID_OK;
   1937			break;
   1938		case CAM_REQ_ABORTED:
   1939			new_status = DID_ABORT;
   1940			break;
   1941		case CAM_BUSY:
   1942			new_status = DID_BUS_BUSY;
   1943			break;
   1944		case CAM_REQ_INVALID:
   1945		case CAM_PATH_INVALID:
   1946			new_status = DID_BAD_TARGET;
   1947			break;
   1948		case CAM_SEL_TIMEOUT:
   1949			new_status = DID_NO_CONNECT;
   1950			break;
   1951		case CAM_SCSI_BUS_RESET:
   1952		case CAM_BDR_SENT:
   1953			new_status = DID_RESET;
   1954			break;
   1955		case CAM_UNCOR_PARITY:
   1956			new_status = DID_PARITY;
   1957			break;
   1958		case CAM_CMD_TIMEOUT:
   1959			new_status = DID_TIME_OUT;
   1960			break;
   1961		case CAM_UA_ABORT:
   1962		case CAM_REQ_CMP_ERR:
   1963		case CAM_AUTOSENSE_FAIL:
   1964		case CAM_NO_HBA:
   1965		case CAM_DATA_RUN_ERR:
   1966		case CAM_UNEXP_BUSFREE:
   1967		case CAM_SEQUENCE_FAIL:
   1968		case CAM_CCB_LEN_ERR:
   1969		case CAM_PROVIDE_FAIL:
   1970		case CAM_REQ_TERMIO:
   1971		case CAM_UNREC_HBA_ERROR:
   1972		case CAM_REQ_TOO_BIG:
   1973			new_status = DID_ERROR;
   1974			break;
   1975		case CAM_REQUEUE_REQ:
   1976			new_status = DID_REQUEUE;
   1977			break;
   1978		default:
   1979			/* We should never get here */
   1980			new_status = DID_ERROR;
   1981			break;
   1982		}
   1983
   1984		ahc_cmd_set_transaction_status(cmd, new_status);
   1985	}
   1986
   1987	scsi_done(cmd);
   1988}
   1989
   1990static void
   1991ahc_linux_freeze_simq(struct ahc_softc *ahc)
   1992{
   1993	unsigned long s;
   1994
   1995	ahc_lock(ahc, &s);
   1996	ahc->platform_data->qfrozen++;
   1997	if (ahc->platform_data->qfrozen == 1) {
   1998		scsi_block_requests(ahc->platform_data->host);
   1999
   2000		/* XXX What about Twin channels? */
   2001		ahc_platform_abort_scbs(ahc, CAM_TARGET_WILDCARD, ALL_CHANNELS,
   2002					CAM_LUN_WILDCARD, SCB_LIST_NULL,
   2003					ROLE_INITIATOR, CAM_REQUEUE_REQ);
   2004	}
   2005	ahc_unlock(ahc, &s);
   2006}
   2007
   2008static void
   2009ahc_linux_release_simq(struct ahc_softc *ahc)
   2010{
   2011	u_long s;
   2012	int    unblock_reqs;
   2013
   2014	unblock_reqs = 0;
   2015	ahc_lock(ahc, &s);
   2016	if (ahc->platform_data->qfrozen > 0)
   2017		ahc->platform_data->qfrozen--;
   2018	if (ahc->platform_data->qfrozen == 0)
   2019		unblock_reqs = 1;
   2020	ahc_unlock(ahc, &s);
   2021	/*
   2022	 * There is still a race here.  The mid-layer
   2023	 * should keep its own freeze count and use
   2024	 * a bottom half handler to run the queues
   2025	 * so we can unblock with our own lock held.
   2026	 */
   2027	if (unblock_reqs)
   2028		scsi_unblock_requests(ahc->platform_data->host);
   2029}
   2030
   2031static int
   2032ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
   2033{
   2034	struct ahc_softc *ahc;
   2035	struct ahc_linux_device *dev;
   2036	struct scb *pending_scb;
   2037	u_int  saved_scbptr;
   2038	u_int  active_scb_index;
   2039	u_int  last_phase;
   2040	u_int  saved_scsiid;
   2041	u_int  cdb_byte;
   2042	int    retval;
   2043	int    was_paused;
   2044	int    paused;
   2045	int    wait;
   2046	int    disconnected;
   2047	unsigned long flags;
   2048
   2049	pending_scb = NULL;
   2050	paused = FALSE;
   2051	wait = FALSE;
   2052	ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
   2053
   2054	scmd_printk(KERN_INFO, cmd, "Attempting to queue a%s message\n",
   2055	       flag == SCB_ABORT ? "n ABORT" : " TARGET RESET");
   2056
   2057	printk("CDB:");
   2058	for (cdb_byte = 0; cdb_byte < cmd->cmd_len; cdb_byte++)
   2059		printk(" 0x%x", cmd->cmnd[cdb_byte]);
   2060	printk("\n");
   2061
   2062	ahc_lock(ahc, &flags);
   2063
   2064	/*
   2065	 * First determine if we currently own this command.
   2066	 * Start by searching the device queue.  If not found
   2067	 * there, check the pending_scb list.  If not found
   2068	 * at all, and the system wanted us to just abort the
   2069	 * command, return success.
   2070	 */
   2071	dev = scsi_transport_device_data(cmd->device);
   2072
   2073	if (dev == NULL) {
   2074		/*
   2075		 * No target device for this command exists,
   2076		 * so we must not still own the command.
   2077		 */
   2078		printk("%s:%d:%d:%d: Is not an active device\n",
   2079		       ahc_name(ahc), cmd->device->channel, cmd->device->id,
   2080		       (u8)cmd->device->lun);
   2081		retval = SUCCESS;
   2082		goto no_cmd;
   2083	}
   2084
   2085	if ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED)) == 0
   2086	 && ahc_search_untagged_queues(ahc, cmd, cmd->device->id,
   2087				       cmd->device->channel + 'A',
   2088				       (u8)cmd->device->lun,
   2089				       CAM_REQ_ABORTED, SEARCH_COMPLETE) != 0) {
   2090		printk("%s:%d:%d:%d: Command found on untagged queue\n",
   2091		       ahc_name(ahc), cmd->device->channel, cmd->device->id,
   2092		       (u8)cmd->device->lun);
   2093		retval = SUCCESS;
   2094		goto done;
   2095	}
   2096
   2097	/*
   2098	 * See if we can find a matching cmd in the pending list.
   2099	 */
   2100	LIST_FOREACH(pending_scb, &ahc->pending_scbs, pending_links) {
   2101		if (pending_scb->io_ctx == cmd)
   2102			break;
   2103	}
   2104
   2105	if (pending_scb == NULL && flag == SCB_DEVICE_RESET) {
   2106
   2107		/* Any SCB for this device will do for a target reset */
   2108		LIST_FOREACH(pending_scb, &ahc->pending_scbs, pending_links) {
   2109			if (ahc_match_scb(ahc, pending_scb, scmd_id(cmd),
   2110					  scmd_channel(cmd) + 'A',
   2111					  CAM_LUN_WILDCARD,
   2112					  SCB_LIST_NULL, ROLE_INITIATOR))
   2113				break;
   2114		}
   2115	}
   2116
   2117	if (pending_scb == NULL) {
   2118		scmd_printk(KERN_INFO, cmd, "Command not found\n");
   2119		goto no_cmd;
   2120	}
   2121
   2122	if ((pending_scb->flags & SCB_RECOVERY_SCB) != 0) {
   2123		/*
   2124		 * We can't queue two recovery actions using the same SCB
   2125		 */
   2126		retval = FAILED;
   2127		goto  done;
   2128	}
   2129
   2130	/*
   2131	 * Ensure that the card doesn't do anything
   2132	 * behind our back and that we didn't "just" miss
   2133	 * an interrupt that would affect this cmd.
   2134	 */
   2135	was_paused = ahc_is_paused(ahc);
   2136	ahc_pause_and_flushwork(ahc);
   2137	paused = TRUE;
   2138
   2139	if ((pending_scb->flags & SCB_ACTIVE) == 0) {
   2140		scmd_printk(KERN_INFO, cmd, "Command already completed\n");
   2141		goto no_cmd;
   2142	}
   2143
   2144	printk("%s: At time of recovery, card was %spaused\n",
   2145	       ahc_name(ahc), was_paused ? "" : "not ");
   2146	ahc_dump_card_state(ahc);
   2147
   2148	disconnected = TRUE;
   2149	if (flag == SCB_ABORT) {
   2150		if (ahc_search_qinfifo(ahc, cmd->device->id,
   2151				       cmd->device->channel + 'A',
   2152				       cmd->device->lun,
   2153				       pending_scb->hscb->tag,
   2154				       ROLE_INITIATOR, CAM_REQ_ABORTED,
   2155				       SEARCH_COMPLETE) > 0) {
   2156			printk("%s:%d:%d:%d: Cmd aborted from QINFIFO\n",
   2157			       ahc_name(ahc), cmd->device->channel,
   2158			       cmd->device->id, (u8)cmd->device->lun);
   2159			retval = SUCCESS;
   2160			goto done;
   2161		}
   2162	} else if (ahc_search_qinfifo(ahc, cmd->device->id,
   2163				      cmd->device->channel + 'A',
   2164				      cmd->device->lun,
   2165				      pending_scb->hscb->tag,
   2166				      ROLE_INITIATOR, /*status*/0,
   2167				      SEARCH_COUNT) > 0) {
   2168		disconnected = FALSE;
   2169	}
   2170
   2171	if (disconnected && (ahc_inb(ahc, SEQ_FLAGS) & NOT_IDENTIFIED) == 0) {
   2172		struct scb *bus_scb;
   2173
   2174		bus_scb = ahc_lookup_scb(ahc, ahc_inb(ahc, SCB_TAG));
   2175		if (bus_scb == pending_scb)
   2176			disconnected = FALSE;
   2177		else if (flag != SCB_ABORT
   2178		      && ahc_inb(ahc, SAVED_SCSIID) == pending_scb->hscb->scsiid
   2179		      && ahc_inb(ahc, SAVED_LUN) == SCB_GET_LUN(pending_scb))
   2180			disconnected = FALSE;
   2181	}
   2182
   2183	/*
   2184	 * At this point, pending_scb is the scb associated with the
   2185	 * passed in command.  That command is currently active on the
   2186	 * bus, is in the disconnected state, or we're hoping to find
   2187	 * a command for the same target active on the bus to abuse to
   2188	 * send a BDR.  Queue the appropriate message based on which of
   2189	 * these states we are in.
   2190	 */
   2191	last_phase = ahc_inb(ahc, LASTPHASE);
   2192	saved_scbptr = ahc_inb(ahc, SCBPTR);
   2193	active_scb_index = ahc_inb(ahc, SCB_TAG);
   2194	saved_scsiid = ahc_inb(ahc, SAVED_SCSIID);
   2195	if (last_phase != P_BUSFREE
   2196	 && (pending_scb->hscb->tag == active_scb_index
   2197	  || (flag == SCB_DEVICE_RESET
   2198	   && SCSIID_TARGET(ahc, saved_scsiid) == scmd_id(cmd)))) {
   2199
   2200		/*
   2201		 * We're active on the bus, so assert ATN
   2202		 * and hope that the target responds.
   2203		 */
   2204		pending_scb = ahc_lookup_scb(ahc, active_scb_index);
   2205		pending_scb->flags |= SCB_RECOVERY_SCB|flag;
   2206		ahc_outb(ahc, MSG_OUT, HOST_MSG);
   2207		ahc_outb(ahc, SCSISIGO, last_phase|ATNO);
   2208		scmd_printk(KERN_INFO, cmd, "Device is active, asserting ATN\n");
   2209		wait = TRUE;
   2210	} else if (disconnected) {
   2211
   2212		/*
   2213		 * Actually re-queue this SCB in an attempt
   2214		 * to select the device before it reconnects.
   2215		 * In either case (selection or reselection),
   2216		 * we will now issue the approprate message
   2217		 * to the timed-out device.
   2218		 *
   2219		 * Set the MK_MESSAGE control bit indicating
   2220		 * that we desire to send a message.  We
   2221		 * also set the disconnected flag since
   2222		 * in the paging case there is no guarantee
   2223		 * that our SCB control byte matches the
   2224		 * version on the card.  We don't want the
   2225		 * sequencer to abort the command thinking
   2226		 * an unsolicited reselection occurred.
   2227		 */
   2228		pending_scb->hscb->control |= MK_MESSAGE|DISCONNECTED;
   2229		pending_scb->flags |= SCB_RECOVERY_SCB|flag;
   2230
   2231		/*
   2232		 * Remove any cached copy of this SCB in the
   2233		 * disconnected list in preparation for the
   2234		 * queuing of our abort SCB.  We use the
   2235		 * same element in the SCB, SCB_NEXT, for
   2236		 * both the qinfifo and the disconnected list.
   2237		 */
   2238		ahc_search_disc_list(ahc, cmd->device->id,
   2239				     cmd->device->channel + 'A',
   2240				     cmd->device->lun, pending_scb->hscb->tag,
   2241				     /*stop_on_first*/TRUE,
   2242				     /*remove*/TRUE,
   2243				     /*save_state*/FALSE);
   2244
   2245		/*
   2246		 * In the non-paging case, the sequencer will
   2247		 * never re-reference the in-core SCB.
   2248		 * To make sure we are notified during
   2249		 * reselection, set the MK_MESSAGE flag in
   2250		 * the card's copy of the SCB.
   2251		 */
   2252		if ((ahc->flags & AHC_PAGESCBS) == 0) {
   2253			ahc_outb(ahc, SCBPTR, pending_scb->hscb->tag);
   2254			ahc_outb(ahc, SCB_CONTROL,
   2255				 ahc_inb(ahc, SCB_CONTROL)|MK_MESSAGE);
   2256		}
   2257
   2258		/*
   2259		 * Clear out any entries in the QINFIFO first
   2260		 * so we are the next SCB for this target
   2261		 * to run.
   2262		 */
   2263		ahc_search_qinfifo(ahc, cmd->device->id,
   2264				   cmd->device->channel + 'A',
   2265				   cmd->device->lun, SCB_LIST_NULL,
   2266				   ROLE_INITIATOR, CAM_REQUEUE_REQ,
   2267				   SEARCH_COMPLETE);
   2268		ahc_qinfifo_requeue_tail(ahc, pending_scb);
   2269		ahc_outb(ahc, SCBPTR, saved_scbptr);
   2270		ahc_print_path(ahc, pending_scb);
   2271		printk("Device is disconnected, re-queuing SCB\n");
   2272		wait = TRUE;
   2273	} else {
   2274		scmd_printk(KERN_INFO, cmd, "Unable to deliver message\n");
   2275		retval = FAILED;
   2276		goto done;
   2277	}
   2278
   2279no_cmd:
   2280	/*
   2281	 * Our assumption is that if we don't have the command, no
   2282	 * recovery action was required, so we return success.  Again,
   2283	 * the semantics of the mid-layer recovery engine are not
   2284	 * well defined, so this may change in time.
   2285	 */
   2286	retval = SUCCESS;
   2287done:
   2288	if (paused)
   2289		ahc_unpause(ahc);
   2290	if (wait) {
   2291		DECLARE_COMPLETION_ONSTACK(done);
   2292
   2293		ahc->platform_data->eh_done = &done;
   2294		ahc_unlock(ahc, &flags);
   2295
   2296		printk("Recovery code sleeping\n");
   2297		if (!wait_for_completion_timeout(&done, 5 * HZ)) {
   2298			ahc_lock(ahc, &flags);
   2299			ahc->platform_data->eh_done = NULL;
   2300			ahc_unlock(ahc, &flags);
   2301
   2302			printk("Timer Expired\n");
   2303			retval = FAILED;
   2304		}
   2305		printk("Recovery code awake\n");
   2306	} else
   2307		ahc_unlock(ahc, &flags);
   2308	return (retval);
   2309}
   2310
   2311static void ahc_linux_set_width(struct scsi_target *starget, int width)
   2312{
   2313	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
   2314	struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
   2315	struct ahc_devinfo devinfo;
   2316	unsigned long flags;
   2317
   2318	ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
   2319			    starget->channel + 'A', ROLE_INITIATOR);
   2320	ahc_lock(ahc, &flags);
   2321	ahc_set_width(ahc, &devinfo, width, AHC_TRANS_GOAL, FALSE);
   2322	ahc_unlock(ahc, &flags);
   2323}
   2324
   2325static void ahc_linux_set_period(struct scsi_target *starget, int period)
   2326{
   2327	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
   2328	struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
   2329	struct ahc_tmode_tstate *tstate;
   2330	struct ahc_initiator_tinfo *tinfo
   2331		= ahc_fetch_transinfo(ahc,
   2332				      starget->channel + 'A',
   2333				      shost->this_id, starget->id, &tstate);
   2334	struct ahc_devinfo devinfo;
   2335	unsigned int ppr_options = tinfo->goal.ppr_options;
   2336	unsigned long flags;
   2337	unsigned long offset = tinfo->goal.offset;
   2338	const struct ahc_syncrate *syncrate;
   2339
   2340	if (offset == 0)
   2341		offset = MAX_OFFSET;
   2342
   2343	if (period < 9)
   2344		period = 9;	/* 12.5ns is our minimum */
   2345	if (period == 9) {
   2346		if (spi_max_width(starget))
   2347			ppr_options |= MSG_EXT_PPR_DT_REQ;
   2348		else
   2349			/* need wide for DT and need DT for 12.5 ns */
   2350			period = 10;
   2351	}
   2352
   2353	ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
   2354			    starget->channel + 'A', ROLE_INITIATOR);
   2355
   2356	/* all PPR requests apart from QAS require wide transfers */
   2357	if (ppr_options & ~MSG_EXT_PPR_QAS_REQ) {
   2358		if (spi_width(starget) == 0)
   2359			ppr_options &= MSG_EXT_PPR_QAS_REQ;
   2360	}
   2361
   2362	syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
   2363				     AHC_SYNCRATE_DT);
   2364	ahc_lock(ahc, &flags);
   2365	ahc_set_syncrate(ahc, &devinfo, syncrate, period, offset,
   2366			 ppr_options, AHC_TRANS_GOAL, FALSE);
   2367	ahc_unlock(ahc, &flags);
   2368}
   2369
   2370static void ahc_linux_set_offset(struct scsi_target *starget, int offset)
   2371{
   2372	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
   2373	struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
   2374	struct ahc_tmode_tstate *tstate;
   2375	struct ahc_initiator_tinfo *tinfo
   2376		= ahc_fetch_transinfo(ahc,
   2377				      starget->channel + 'A',
   2378				      shost->this_id, starget->id, &tstate);
   2379	struct ahc_devinfo devinfo;
   2380	unsigned int ppr_options = 0;
   2381	unsigned int period = 0;
   2382	unsigned long flags;
   2383	const struct ahc_syncrate *syncrate = NULL;
   2384
   2385	ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
   2386			    starget->channel + 'A', ROLE_INITIATOR);
   2387	if (offset != 0) {
   2388		syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
   2389					     AHC_SYNCRATE_DT);
   2390		period = tinfo->goal.period;
   2391		ppr_options = tinfo->goal.ppr_options;
   2392	}
   2393	ahc_lock(ahc, &flags);
   2394	ahc_set_syncrate(ahc, &devinfo, syncrate, period, offset,
   2395			 ppr_options, AHC_TRANS_GOAL, FALSE);
   2396	ahc_unlock(ahc, &flags);
   2397}
   2398
   2399static void ahc_linux_set_dt(struct scsi_target *starget, int dt)
   2400{
   2401	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
   2402	struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
   2403	struct ahc_tmode_tstate *tstate;
   2404	struct ahc_initiator_tinfo *tinfo
   2405		= ahc_fetch_transinfo(ahc,
   2406				      starget->channel + 'A',
   2407				      shost->this_id, starget->id, &tstate);
   2408	struct ahc_devinfo devinfo;
   2409	unsigned int ppr_options = tinfo->goal.ppr_options
   2410		& ~MSG_EXT_PPR_DT_REQ;
   2411	unsigned int period = tinfo->goal.period;
   2412	unsigned int width = tinfo->goal.width;
   2413	unsigned long flags;
   2414	const struct ahc_syncrate *syncrate;
   2415
   2416	if (dt && spi_max_width(starget)) {
   2417		ppr_options |= MSG_EXT_PPR_DT_REQ;
   2418		if (!width)
   2419			ahc_linux_set_width(starget, 1);
   2420	} else if (period == 9)
   2421		period = 10;	/* if resetting DT, period must be >= 25ns */
   2422
   2423	ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
   2424			    starget->channel + 'A', ROLE_INITIATOR);
   2425	syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
   2426				     AHC_SYNCRATE_DT);
   2427	ahc_lock(ahc, &flags);
   2428	ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->goal.offset,
   2429			 ppr_options, AHC_TRANS_GOAL, FALSE);
   2430	ahc_unlock(ahc, &flags);
   2431}
   2432
   2433#if 0
   2434/* FIXME: This code claims to support IU and QAS.  However, the actual
   2435 * sequencer code and aic7xxx_core have no support for these parameters and
   2436 * will get into a bad state if they're negotiated.  Do not enable this
   2437 * unless you know what you're doing */
   2438static void ahc_linux_set_qas(struct scsi_target *starget, int qas)
   2439{
   2440	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
   2441	struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
   2442	struct ahc_tmode_tstate *tstate;
   2443	struct ahc_initiator_tinfo *tinfo
   2444		= ahc_fetch_transinfo(ahc,
   2445				      starget->channel + 'A',
   2446				      shost->this_id, starget->id, &tstate);
   2447	struct ahc_devinfo devinfo;
   2448	unsigned int ppr_options = tinfo->goal.ppr_options
   2449		& ~MSG_EXT_PPR_QAS_REQ;
   2450	unsigned int period = tinfo->goal.period;
   2451	unsigned long flags;
   2452	struct ahc_syncrate *syncrate;
   2453
   2454	if (qas)
   2455		ppr_options |= MSG_EXT_PPR_QAS_REQ;
   2456
   2457	ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
   2458			    starget->channel + 'A', ROLE_INITIATOR);
   2459	syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
   2460				     AHC_SYNCRATE_DT);
   2461	ahc_lock(ahc, &flags);
   2462	ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->goal.offset,
   2463			 ppr_options, AHC_TRANS_GOAL, FALSE);
   2464	ahc_unlock(ahc, &flags);
   2465}
   2466
   2467static void ahc_linux_set_iu(struct scsi_target *starget, int iu)
   2468{
   2469	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
   2470	struct ahc_softc *ahc = *((struct ahc_softc **)shost->hostdata);
   2471	struct ahc_tmode_tstate *tstate;
   2472	struct ahc_initiator_tinfo *tinfo
   2473		= ahc_fetch_transinfo(ahc,
   2474				      starget->channel + 'A',
   2475				      shost->this_id, starget->id, &tstate);
   2476	struct ahc_devinfo devinfo;
   2477	unsigned int ppr_options = tinfo->goal.ppr_options
   2478		& ~MSG_EXT_PPR_IU_REQ;
   2479	unsigned int period = tinfo->goal.period;
   2480	unsigned long flags;
   2481	struct ahc_syncrate *syncrate;
   2482
   2483	if (iu)
   2484		ppr_options |= MSG_EXT_PPR_IU_REQ;
   2485
   2486	ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
   2487			    starget->channel + 'A', ROLE_INITIATOR);
   2488	syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
   2489				     AHC_SYNCRATE_DT);
   2490	ahc_lock(ahc, &flags);
   2491	ahc_set_syncrate(ahc, &devinfo, syncrate, period, tinfo->goal.offset,
   2492			 ppr_options, AHC_TRANS_GOAL, FALSE);
   2493	ahc_unlock(ahc, &flags);
   2494}
   2495#endif
   2496
   2497static void ahc_linux_get_signalling(struct Scsi_Host *shost)
   2498{
   2499	struct ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata;
   2500	unsigned long flags;
   2501	u8 mode;
   2502
   2503	if (!(ahc->features & AHC_ULTRA2)) {
   2504		/* non-LVD chipset, may not have SBLKCTL reg */
   2505		spi_signalling(shost) =
   2506			ahc->features & AHC_HVD ?
   2507			SPI_SIGNAL_HVD :
   2508			SPI_SIGNAL_SE;
   2509		return;
   2510	}
   2511
   2512	ahc_lock(ahc, &flags);
   2513	ahc_pause(ahc);
   2514	mode = ahc_inb(ahc, SBLKCTL);
   2515	ahc_unpause(ahc);
   2516	ahc_unlock(ahc, &flags);
   2517
   2518	if (mode & ENAB40)
   2519		spi_signalling(shost) = SPI_SIGNAL_LVD;
   2520	else if (mode & ENAB20)
   2521		spi_signalling(shost) = SPI_SIGNAL_SE;
   2522	else
   2523		spi_signalling(shost) = SPI_SIGNAL_UNKNOWN;
   2524}
   2525
   2526static struct spi_function_template ahc_linux_transport_functions = {
   2527	.set_offset	= ahc_linux_set_offset,
   2528	.show_offset	= 1,
   2529	.set_period	= ahc_linux_set_period,
   2530	.show_period	= 1,
   2531	.set_width	= ahc_linux_set_width,
   2532	.show_width	= 1,
   2533	.set_dt		= ahc_linux_set_dt,
   2534	.show_dt	= 1,
   2535#if 0
   2536	.set_iu		= ahc_linux_set_iu,
   2537	.show_iu	= 1,
   2538	.set_qas	= ahc_linux_set_qas,
   2539	.show_qas	= 1,
   2540#endif
   2541	.get_signalling	= ahc_linux_get_signalling,
   2542};
   2543
   2544
   2545
   2546static int __init
   2547ahc_linux_init(void)
   2548{
   2549	/*
   2550	 * If we've been passed any parameters, process them now.
   2551	 */
   2552	if (aic7xxx)
   2553		aic7xxx_setup(aic7xxx);
   2554
   2555	ahc_linux_transport_template =
   2556		spi_attach_transport(&ahc_linux_transport_functions);
   2557	if (!ahc_linux_transport_template)
   2558		return -ENODEV;
   2559
   2560	scsi_transport_reserve_device(ahc_linux_transport_template,
   2561				      sizeof(struct ahc_linux_device));
   2562
   2563	ahc_linux_pci_init();
   2564	ahc_linux_eisa_init();
   2565	return 0;
   2566}
   2567
   2568static void
   2569ahc_linux_exit(void)
   2570{
   2571	ahc_linux_pci_exit();
   2572	ahc_linux_eisa_exit();
   2573	spi_release_transport(ahc_linux_transport_template);
   2574}
   2575
   2576module_init(ahc_linux_init);
   2577module_exit(ahc_linux_exit);