linux/drivers/scsi/dc395x.c
<<
>>
Prefs
   1/*
   2 * dc395x.c
   3 *
   4 * Device Driver for Tekram DC395(U/UW/F), DC315(U)
   5 * PCI SCSI Bus Master Host Adapter
   6 * (SCSI chip set used Tekram ASIC TRM-S1040)
   7 *
   8 * Authors:
   9 *  C.L. Huang <ching@tekram.com.tw>
  10 *  Erich Chen <erich@tekram.com.tw>
  11 *  (C) Copyright 1995-1999 Tekram Technology Co., Ltd.
  12 *
  13 *  Kurt Garloff <garloff@suse.de>
  14 *  (C) 1999-2000 Kurt Garloff
  15 *
  16 *  Oliver Neukum <oliver@neukum.name>
  17 *  Ali Akcaagac <aliakc@web.de>
  18 *  Jamie Lenehan <lenehan@twibble.org>
  19 *  (C) 2003
  20 *
  21 * License: GNU GPL
  22 *
  23 *************************************************************************
  24 *
  25 * Redistribution and use in source and binary forms, with or without
  26 * modification, are permitted provided that the following conditions
  27 * are met:
  28 * 1. Redistributions of source code must retain the above copyright
  29 *    notice, this list of conditions and the following disclaimer.
  30 * 2. Redistributions in binary form must reproduce the above copyright
  31 *    notice, this list of conditions and the following disclaimer in the
  32 *    documentation and/or other materials provided with the distribution.
  33 * 3. The name of the author may not be used to endorse or promote products
  34 *    derived from this software without specific prior written permission.
  35 *
  36 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  37 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  38 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  39 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  40 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  41 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  42 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  43 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  44 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  45 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  46 *
  47 ************************************************************************
  48 */
  49#include <linux/module.h>
  50#include <linux/moduleparam.h>
  51#include <linux/delay.h>
  52#include <linux/ctype.h>
  53#include <linux/blkdev.h>
  54#include <linux/interrupt.h>
  55#include <linux/init.h>
  56#include <linux/spinlock.h>
  57#include <linux/pci.h>
  58#include <linux/list.h>
  59#include <linux/vmalloc.h>
  60#include <linux/slab.h>
  61#include <asm/io.h>
  62
  63#include <scsi/scsi.h>
  64#include <scsi/scsi_cmnd.h>
  65#include <scsi/scsi_device.h>
  66#include <scsi/scsi_host.h>
  67
  68#include "dc395x.h"
  69
  70#define DC395X_NAME     "dc395x"
  71#define DC395X_BANNER   "Tekram DC395(U/UW/F), DC315(U) - ASIC TRM-S1040"
  72#define DC395X_VERSION  "v2.05, 2004/03/08"
  73
  74/*---------------------------------------------------------------------------
  75                                  Features
  76 ---------------------------------------------------------------------------*/
  77/*
  78 * Set to disable parts of the driver
  79 */
  80/*#define DC395x_NO_DISCONNECT*/
  81/*#define DC395x_NO_TAGQ*/
  82/*#define DC395x_NO_SYNC*/
  83/*#define DC395x_NO_WIDE*/
  84
  85/*---------------------------------------------------------------------------
  86                                  Debugging
  87 ---------------------------------------------------------------------------*/
  88/*
  89 * Types of debugging that can be enabled and disabled
  90 */
  91#define DBG_KG          0x0001
  92#define DBG_0           0x0002
  93#define DBG_1           0x0004
  94#define DBG_SG          0x0020
  95#define DBG_FIFO        0x0040
  96#define DBG_PIO         0x0080
  97
  98
  99/*
 100 * Set set of things to output debugging for.
 101 * Undefine to remove all debugging
 102 */
 103/*#define DEBUG_MASK (DBG_0|DBG_1|DBG_SG|DBG_FIFO|DBG_PIO)*/
 104/*#define  DEBUG_MASK   DBG_0*/
 105
 106
 107/*
 108 * Output a kernel mesage at the specified level and append the
 109 * driver name and a ": " to the start of the message
 110 */
 111#define dprintkl(level, format, arg...)  \
 112    printk(level DC395X_NAME ": " format , ## arg)
 113
 114
 115#ifdef DEBUG_MASK
 116/*
 117 * print a debug message - this is formated with KERN_DEBUG, then the
 118 * driver name followed by a ": " and then the message is output. 
 119 * This also checks that the specified debug level is enabled before
 120 * outputing the message
 121 */
 122#define dprintkdbg(type, format, arg...) \
 123        do { \
 124                if ((type) & (DEBUG_MASK)) \
 125                        dprintkl(KERN_DEBUG , format , ## arg); \
 126        } while (0)
 127
 128/*
 129 * Check if the specified type of debugging is enabled
 130 */
 131#define debug_enabled(type)     ((DEBUG_MASK) & (type))
 132
 133#else
 134/*
 135 * No debugging. Do nothing
 136 */
 137#define dprintkdbg(type, format, arg...) \
 138        do {} while (0)
 139#define debug_enabled(type)     (0)
 140
 141#endif
 142
 143
 144#ifndef PCI_VENDOR_ID_TEKRAM
 145#define PCI_VENDOR_ID_TEKRAM                    0x1DE1  /* Vendor ID    */
 146#endif
 147#ifndef PCI_DEVICE_ID_TEKRAM_TRMS1040
 148#define PCI_DEVICE_ID_TEKRAM_TRMS1040           0x0391  /* Device ID    */
 149#endif
 150
 151
 152#define DC395x_LOCK_IO(dev,flags)               spin_lock_irqsave(((struct Scsi_Host *)dev)->host_lock, flags)
 153#define DC395x_UNLOCK_IO(dev,flags)             spin_unlock_irqrestore(((struct Scsi_Host *)dev)->host_lock, flags)
 154
 155#define DC395x_read8(acb,address)               (u8)(inb(acb->io_port_base + (address)))
 156#define DC395x_read16(acb,address)              (u16)(inw(acb->io_port_base + (address)))
 157#define DC395x_read32(acb,address)              (u32)(inl(acb->io_port_base + (address)))
 158#define DC395x_write8(acb,address,value)        outb((value), acb->io_port_base + (address))
 159#define DC395x_write16(acb,address,value)       outw((value), acb->io_port_base + (address))
 160#define DC395x_write32(acb,address,value)       outl((value), acb->io_port_base + (address))
 161
 162/* cmd->result */
 163#define RES_TARGET              0x000000FF      /* Target State */
 164#define RES_TARGET_LNX  STATUS_MASK     /* Only official ... */
 165#define RES_ENDMSG              0x0000FF00      /* End Message */
 166#define RES_DID                 0x00FF0000      /* DID_ codes */
 167#define RES_DRV                 0xFF000000      /* DRIVER_ codes */
 168
 169#define MK_RES(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt))
 170#define MK_RES_LNX(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt)<<1)
 171
 172#define SET_RES_TARGET(who,tgt) { who &= ~RES_TARGET; who |= (int)(tgt); }
 173#define SET_RES_TARGET_LNX(who,tgt) { who &= ~RES_TARGET_LNX; who |= (int)(tgt) << 1; }
 174#define SET_RES_MSG(who,msg) { who &= ~RES_ENDMSG; who |= (int)(msg) << 8; }
 175#define SET_RES_DID(who,did) { who &= ~RES_DID; who |= (int)(did) << 16; }
 176#define SET_RES_DRV(who,drv) { who &= ~RES_DRV; who |= (int)(drv) << 24; }
 177
 178#define TAG_NONE 255
 179
 180/*
 181 * srb->segement_x is the hw sg list. It is always allocated as a
 182 * DC395x_MAX_SG_LISTENTRY entries in a linear block which does not
 183 * cross a page boundy.
 184 */
 185#define SEGMENTX_LEN    (sizeof(struct SGentry)*DC395x_MAX_SG_LISTENTRY)
 186
 187
 188struct SGentry {
 189        u32 address;            /* bus! address */
 190        u32 length;
 191};
 192
 193/* The SEEPROM structure for TRM_S1040 */
 194struct NVRamTarget {
 195        u8 cfg0;                /* Target configuration byte 0  */
 196        u8 period;              /* Target period                */
 197        u8 cfg2;                /* Target configuration byte 2  */
 198        u8 cfg3;                /* Target configuration byte 3  */
 199};
 200
 201struct NvRamType {
 202        u8 sub_vendor_id[2];    /* 0,1  Sub Vendor ID   */
 203        u8 sub_sys_id[2];       /* 2,3  Sub System ID   */
 204        u8 sub_class;           /* 4    Sub Class       */
 205        u8 vendor_id[2];        /* 5,6  Vendor ID       */
 206        u8 device_id[2];        /* 7,8  Device ID       */
 207        u8 reserved;            /* 9    Reserved        */
 208        struct NVRamTarget target[DC395x_MAX_SCSI_ID];
 209                                                /** 10,11,12,13
 210                                                 ** 14,15,16,17
 211                                                 ** ....
 212                                                 ** ....
 213                                                 ** 70,71,72,73
 214                                                 */
 215        u8 scsi_id;             /* 74 Host Adapter SCSI ID      */
 216        u8 channel_cfg;         /* 75 Channel configuration     */
 217        u8 delay_time;          /* 76 Power on delay time       */
 218        u8 max_tag;             /* 77 Maximum tags              */
 219        u8 reserved0;           /* 78  */
 220        u8 boot_target;         /* 79  */
 221        u8 boot_lun;            /* 80  */
 222        u8 reserved1;           /* 81  */
 223        u16 reserved2[22];      /* 82,..125 */
 224        u16 cksum;              /* 126,127 */
 225};
 226
 227struct ScsiReqBlk {
 228        struct list_head list;          /* next/prev ptrs for srb lists */
 229        struct DeviceCtlBlk *dcb;
 230        struct scsi_cmnd *cmd;
 231
 232        struct SGentry *segment_x;      /* Linear array of hw sg entries (up to 64 entries) */
 233        dma_addr_t sg_bus_addr;         /* Bus address of sg list (ie, of segment_x) */
 234
 235        u8 sg_count;                    /* No of HW sg entries for this request */
 236        u8 sg_index;                    /* Index of HW sg entry for this request */
 237        size_t total_xfer_length;       /* Total number of bytes remaining to be transferred */
 238        size_t request_length;          /* Total number of bytes in this request */
 239        /*
 240         * The sense buffer handling function, request_sense, uses
 241         * the first hw sg entry (segment_x[0]) and the transfer
 242         * length (total_xfer_length). While doing this it stores the
 243         * original values into the last sg hw list
 244         * (srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1] and the
 245         * total_xfer_length in xferred. These values are restored in
 246         * pci_unmap_srb_sense. This is the only place xferred is used.
 247         */
 248        size_t xferred;                 /* Saved copy of total_xfer_length */
 249
 250        u16 state;
 251
 252        u8 msgin_buf[6];
 253        u8 msgout_buf[6];
 254
 255        u8 adapter_status;
 256        u8 target_status;
 257        u8 msg_count;
 258        u8 end_message;
 259
 260        u8 tag_number;
 261        u8 status;
 262        u8 retry_count;
 263        u8 flag;
 264
 265        u8 scsi_phase;
 266};
 267
 268struct DeviceCtlBlk {
 269        struct list_head list;          /* next/prev ptrs for the dcb list */
 270        struct AdapterCtlBlk *acb;
 271        struct list_head srb_going_list;        /* head of going srb list */
 272        struct list_head srb_waiting_list;      /* head of waiting srb list */
 273
 274        struct ScsiReqBlk *active_srb;
 275        u32 tag_mask;
 276
 277        u16 max_command;
 278
 279        u8 target_id;           /* SCSI Target ID  (SCSI Only) */
 280        u8 target_lun;          /* SCSI Log.  Unit (SCSI Only) */
 281        u8 identify_msg;
 282        u8 dev_mode;
 283
 284        u8 inquiry7;            /* To store Inquiry flags */
 285        u8 sync_mode;           /* 0:async mode */
 286        u8 min_nego_period;     /* for nego. */
 287        u8 sync_period;         /* for reg.  */
 288
 289        u8 sync_offset;         /* for reg. and nego.(low nibble) */
 290        u8 flag;
 291        u8 dev_type;
 292        u8 init_tcq_flag;
 293};
 294
 295struct AdapterCtlBlk {
 296        struct Scsi_Host *scsi_host;
 297
 298        unsigned long io_port_base;
 299        unsigned long io_port_len;
 300
 301        struct list_head dcb_list;              /* head of going dcb list */
 302        struct DeviceCtlBlk *dcb_run_robin;
 303        struct DeviceCtlBlk *active_dcb;
 304
 305        struct list_head srb_free_list;         /* head of free srb list */
 306        struct ScsiReqBlk *tmp_srb;
 307        struct timer_list waiting_timer;
 308        struct timer_list selto_timer;
 309
 310        unsigned long last_reset;
 311
 312        u16 srb_count;
 313
 314        u8 sel_timeout;
 315
 316        unsigned int irq_level;
 317        u8 tag_max_num;
 318        u8 acb_flag;
 319        u8 gmode2;
 320
 321        u8 config;
 322        u8 lun_chk;
 323        u8 scan_devices;
 324        u8 hostid_bit;
 325
 326        u8 dcb_map[DC395x_MAX_SCSI_ID];
 327        struct DeviceCtlBlk *children[DC395x_MAX_SCSI_ID][32];
 328
 329        struct pci_dev *dev;
 330
 331        u8 msg_len;
 332
 333        struct ScsiReqBlk srb_array[DC395x_MAX_SRB_CNT];
 334        struct ScsiReqBlk srb;
 335
 336        struct NvRamType eeprom;        /* eeprom settings for this adapter */
 337};
 338
 339
 340/*---------------------------------------------------------------------------
 341                            Forward declarations
 342 ---------------------------------------------------------------------------*/
 343static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 344                u16 *pscsi_status);
 345static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 346                u16 *pscsi_status);
 347static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 348                u16 *pscsi_status);
 349static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 350                u16 *pscsi_status);
 351static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 352                u16 *pscsi_status);
 353static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 354                u16 *pscsi_status);
 355static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 356                u16 *pscsi_status);
 357static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 358                u16 *pscsi_status);
 359static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 360                u16 *pscsi_status);
 361static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 362                u16 *pscsi_status);
 363static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 364                u16 *pscsi_status);
 365static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 366                u16 *pscsi_status);
 367static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 368                u16 *pscsi_status);
 369static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, 
 370                u16 *pscsi_status);
 371static void set_basic_config(struct AdapterCtlBlk *acb);
 372static void cleanup_after_transfer(struct AdapterCtlBlk *acb,
 373                struct ScsiReqBlk *srb);
 374static void reset_scsi_bus(struct AdapterCtlBlk *acb);
 375static void data_io_transfer(struct AdapterCtlBlk *acb,
 376                struct ScsiReqBlk *srb, u16 io_dir);
 377static void disconnect(struct AdapterCtlBlk *acb);
 378static void reselect(struct AdapterCtlBlk *acb);
 379static u8 start_scsi(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
 380                struct ScsiReqBlk *srb);
 381static inline void enable_msgout_abort(struct AdapterCtlBlk *acb,
 382                struct ScsiReqBlk *srb);
 383static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb,
 384                struct ScsiReqBlk *srb);
 385static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_code,
 386                struct scsi_cmnd *cmd, u8 force);
 387static void scsi_reset_detect(struct AdapterCtlBlk *acb);
 388static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb);
 389static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb,
 390                struct ScsiReqBlk *srb);
 391static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
 392                struct ScsiReqBlk *srb);
 393static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
 394                struct ScsiReqBlk *srb);
 395static void set_xfer_rate(struct AdapterCtlBlk *acb,
 396                struct DeviceCtlBlk *dcb);
 397static void waiting_timeout(struct timer_list *t);
 398
 399
 400/*---------------------------------------------------------------------------
 401                                 Static Data
 402 ---------------------------------------------------------------------------*/
 403static u16 current_sync_offset = 0;
 404
 405static void *dc395x_scsi_phase0[] = {
 406        data_out_phase0,/* phase:0 */
 407        data_in_phase0, /* phase:1 */
 408        command_phase0, /* phase:2 */
 409        status_phase0,  /* phase:3 */
 410        nop0,           /* phase:4 PH_BUS_FREE .. initial phase */
 411        nop0,           /* phase:5 PH_BUS_FREE .. initial phase */
 412        msgout_phase0,  /* phase:6 */
 413        msgin_phase0,   /* phase:7 */
 414};
 415
 416static void *dc395x_scsi_phase1[] = {
 417        data_out_phase1,/* phase:0 */
 418        data_in_phase1, /* phase:1 */
 419        command_phase1, /* phase:2 */
 420        status_phase1,  /* phase:3 */
 421        nop1,           /* phase:4 PH_BUS_FREE .. initial phase */
 422        nop1,           /* phase:5 PH_BUS_FREE .. initial phase */
 423        msgout_phase1,  /* phase:6 */
 424        msgin_phase1,   /* phase:7 */
 425};
 426
 427/*
 428 *Fast20:       000      50ns, 20.0 MHz
 429 *              001      75ns, 13.3 MHz
 430 *              010     100ns, 10.0 MHz
 431 *              011     125ns,  8.0 MHz
 432 *              100     150ns,  6.6 MHz
 433 *              101     175ns,  5.7 MHz
 434 *              110     200ns,  5.0 MHz
 435 *              111     250ns,  4.0 MHz
 436 *
 437 *Fast40(LVDS): 000      25ns, 40.0 MHz
 438 *              001      50ns, 20.0 MHz
 439 *              010      75ns, 13.3 MHz
 440 *              011     100ns, 10.0 MHz
 441 *              100     125ns,  8.0 MHz
 442 *              101     150ns,  6.6 MHz
 443 *              110     175ns,  5.7 MHz
 444 *              111     200ns,  5.0 MHz
 445 */
 446/*static u8     clock_period[] = {12,19,25,31,37,44,50,62};*/
 447
 448/* real period:48ns,76ns,100ns,124ns,148ns,176ns,200ns,248ns */
 449static u8 clock_period[] = { 12, 18, 25, 31, 37, 43, 50, 62 };
 450static u16 clock_speed[] = { 200, 133, 100, 80, 67, 58, 50, 40 };
 451
 452
 453/*---------------------------------------------------------------------------
 454                                Configuration
 455  ---------------------------------------------------------------------------*/
 456/*
 457 * Module/boot parameters currently effect *all* instances of the
 458 * card in the system.
 459 */
 460
 461/*
 462 * Command line parameters are stored in a structure below.
 463 * These are the index's into the structure for the various
 464 * command line options.
 465 */
 466#define CFG_ADAPTER_ID          0
 467#define CFG_MAX_SPEED           1
 468#define CFG_DEV_MODE            2
 469#define CFG_ADAPTER_MODE        3
 470#define CFG_TAGS                4
 471#define CFG_RESET_DELAY         5
 472
 473#define CFG_NUM                 6       /* number of configuration items */
 474
 475
 476/*
 477 * Value used to indicate that a command line override
 478 * hasn't been used to modify the value.
 479 */
 480#define CFG_PARAM_UNSET -1
 481
 482
 483/*
 484 * Hold command line parameters.
 485 */
 486struct ParameterData {
 487        int value;              /* value of this setting */
 488        int min;                /* minimum value */
 489        int max;                /* maximum value */
 490        int def;                /* default value */
 491        int safe;               /* safe value */
 492};
 493static struct ParameterData cfg_data[] = {
 494        { /* adapter id */
 495                CFG_PARAM_UNSET,
 496                0,
 497                15,
 498                7,
 499                7
 500        },
 501        { /* max speed */
 502                CFG_PARAM_UNSET,
 503                  0,
 504                  7,
 505                  1,    /* 13.3Mhz */
 506                  4,    /*  6.7Hmz */
 507        },
 508        { /* dev mode */
 509                CFG_PARAM_UNSET,
 510                0,
 511                0x3f,
 512                NTC_DO_PARITY_CHK | NTC_DO_DISCONNECT | NTC_DO_SYNC_NEGO |
 513                        NTC_DO_WIDE_NEGO | NTC_DO_TAG_QUEUEING |
 514                        NTC_DO_SEND_START,
 515                NTC_DO_PARITY_CHK | NTC_DO_SEND_START
 516        },
 517        { /* adapter mode */
 518                CFG_PARAM_UNSET,
 519                0,
 520                0x2f,
 521                NAC_SCANLUN |
 522                NAC_GT2DRIVES | NAC_GREATER_1G | NAC_POWERON_SCSI_RESET
 523                        /*| NAC_ACTIVE_NEG*/,
 524                NAC_GT2DRIVES | NAC_GREATER_1G | NAC_POWERON_SCSI_RESET | 0x08
 525        },
 526        { /* tags */
 527                CFG_PARAM_UNSET,
 528                0,
 529                5,
 530                3,      /* 16 tags (??) */
 531                2,
 532        },
 533        { /* reset delay */
 534                CFG_PARAM_UNSET,
 535                0,
 536                180,
 537                1,      /* 1 second */
 538                10,     /* 10 seconds */
 539        }
 540};
 541
 542
 543/*
 544 * Safe settings. If set to zero the BIOS/default values with
 545 * command line overrides will be used. If set to 1 then safe and
 546 * slow settings will be used.
 547 */
 548static bool use_safe_settings = 0;
 549module_param_named(safe, use_safe_settings, bool, 0);
 550MODULE_PARM_DESC(safe, "Use safe and slow settings only. Default: false");
 551
 552
 553module_param_named(adapter_id, cfg_data[CFG_ADAPTER_ID].value, int, 0);
 554MODULE_PARM_DESC(adapter_id, "Adapter SCSI ID. Default 7 (0-15)");
 555
 556module_param_named(max_speed, cfg_data[CFG_MAX_SPEED].value, int, 0);
 557MODULE_PARM_DESC(max_speed, "Maximum bus speed. Default 1 (0-7) Speeds: 0=20, 1=13.3, 2=10, 3=8, 4=6.7, 5=5.8, 6=5, 7=4 Mhz");
 558
 559module_param_named(dev_mode, cfg_data[CFG_DEV_MODE].value, int, 0);
 560MODULE_PARM_DESC(dev_mode, "Device mode.");
 561
 562module_param_named(adapter_mode, cfg_data[CFG_ADAPTER_MODE].value, int, 0);
 563MODULE_PARM_DESC(adapter_mode, "Adapter mode.");
 564
 565module_param_named(tags, cfg_data[CFG_TAGS].value, int, 0);
 566MODULE_PARM_DESC(tags, "Number of tags (1<<x). Default 3 (0-5)");
 567
 568module_param_named(reset_delay, cfg_data[CFG_RESET_DELAY].value, int, 0);
 569MODULE_PARM_DESC(reset_delay, "Reset delay in seconds. Default 1 (0-180)");
 570
 571
 572/**
 573 * set_safe_settings - if the use_safe_settings option is set then
 574 * set all values to the safe and slow values.
 575 **/
 576static void set_safe_settings(void)
 577{
 578        if (use_safe_settings)
 579        {
 580                int i;
 581
 582                dprintkl(KERN_INFO, "Using safe settings.\n");
 583                for (i = 0; i < CFG_NUM; i++)
 584                {
 585                        cfg_data[i].value = cfg_data[i].safe;
 586                }
 587        }
 588}
 589
 590
 591/**
 592 * fix_settings - reset any boot parameters which are out of range
 593 * back to the default values.
 594 **/
 595static void fix_settings(void)
 596{
 597        int i;
 598
 599        dprintkdbg(DBG_1,
 600                "setup: AdapterId=%08x MaxSpeed=%08x DevMode=%08x "
 601                "AdapterMode=%08x Tags=%08x ResetDelay=%08x\n",
 602                cfg_data[CFG_ADAPTER_ID].value,
 603                cfg_data[CFG_MAX_SPEED].value,
 604                cfg_data[CFG_DEV_MODE].value,
 605                cfg_data[CFG_ADAPTER_MODE].value,
 606                cfg_data[CFG_TAGS].value,
 607                cfg_data[CFG_RESET_DELAY].value);
 608        for (i = 0; i < CFG_NUM; i++)
 609        {
 610                if (cfg_data[i].value < cfg_data[i].min
 611                    || cfg_data[i].value > cfg_data[i].max)
 612                        cfg_data[i].value = cfg_data[i].def;
 613        }
 614}
 615
 616
 617
 618/*
 619 * Mapping from the eeprom delay index value (index into this array)
 620 * to the number of actual seconds that the delay should be for.
 621 */
 622static char eeprom_index_to_delay_map[] =
 623        { 1, 3, 5, 10, 16, 30, 60, 120 };
 624
 625
 626/**
 627 * eeprom_index_to_delay - Take the eeprom delay setting and convert it
 628 * into a number of seconds.
 629 *
 630 * @eeprom: The eeprom structure in which we find the delay index to map.
 631 **/
 632static void eeprom_index_to_delay(struct NvRamType *eeprom)
 633{
 634        eeprom->delay_time = eeprom_index_to_delay_map[eeprom->delay_time];
 635}
 636
 637
 638/**
 639 * delay_to_eeprom_index - Take a delay in seconds and return the
 640 * closest eeprom index which will delay for at least that amount of
 641 * seconds.
 642 *
 643 * @delay: The delay, in seconds, to find the eeprom index for.
 644 **/
 645static int delay_to_eeprom_index(int delay)
 646{
 647        u8 idx = 0;
 648        while (idx < 7 && eeprom_index_to_delay_map[idx] < delay)
 649                idx++;
 650        return idx;
 651}
 652
 653
 654/**
 655 * eeprom_override - Override the eeprom settings, in the provided
 656 * eeprom structure, with values that have been set on the command
 657 * line.
 658 *
 659 * @eeprom: The eeprom data to override with command line options.
 660 **/
 661static void eeprom_override(struct NvRamType *eeprom)
 662{
 663        u8 id;
 664
 665        /* Adapter Settings */
 666        if (cfg_data[CFG_ADAPTER_ID].value != CFG_PARAM_UNSET)
 667                eeprom->scsi_id = (u8)cfg_data[CFG_ADAPTER_ID].value;
 668
 669        if (cfg_data[CFG_ADAPTER_MODE].value != CFG_PARAM_UNSET)
 670                eeprom->channel_cfg = (u8)cfg_data[CFG_ADAPTER_MODE].value;
 671
 672        if (cfg_data[CFG_RESET_DELAY].value != CFG_PARAM_UNSET)
 673                eeprom->delay_time = delay_to_eeprom_index(
 674                                        cfg_data[CFG_RESET_DELAY].value);
 675
 676        if (cfg_data[CFG_TAGS].value != CFG_PARAM_UNSET)
 677                eeprom->max_tag = (u8)cfg_data[CFG_TAGS].value;
 678
 679        /* Device Settings */
 680        for (id = 0; id < DC395x_MAX_SCSI_ID; id++) {
 681                if (cfg_data[CFG_DEV_MODE].value != CFG_PARAM_UNSET)
 682                        eeprom->target[id].cfg0 =
 683                                (u8)cfg_data[CFG_DEV_MODE].value;
 684
 685                if (cfg_data[CFG_MAX_SPEED].value != CFG_PARAM_UNSET)
 686                        eeprom->target[id].period =
 687                                (u8)cfg_data[CFG_MAX_SPEED].value;
 688
 689        }
 690}
 691
 692
 693/*---------------------------------------------------------------------------
 694 ---------------------------------------------------------------------------*/
 695
 696static unsigned int list_size(struct list_head *head)
 697{
 698        unsigned int count = 0;
 699        struct list_head *pos;
 700        list_for_each(pos, head)
 701                count++;
 702        return count;
 703}
 704
 705
 706static struct DeviceCtlBlk *dcb_get_next(struct list_head *head,
 707                struct DeviceCtlBlk *pos)
 708{
 709        int use_next = 0;
 710        struct DeviceCtlBlk* next = NULL;
 711        struct DeviceCtlBlk* i;
 712
 713        if (list_empty(head))
 714                return NULL;
 715
 716        /* find supplied dcb and then select the next one */
 717        list_for_each_entry(i, head, list)
 718                if (use_next) {
 719                        next = i;
 720                        break;
 721                } else if (i == pos) {
 722                        use_next = 1;
 723                }
 724        /* if no next one take the head one (ie, wraparound) */
 725        if (!next)
 726                list_for_each_entry(i, head, list) {
 727                        next = i;
 728                        break;
 729                }
 730
 731        return next;
 732}
 733
 734
 735static void free_tag(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb)
 736{
 737        if (srb->tag_number < 255) {
 738                dcb->tag_mask &= ~(1 << srb->tag_number);       /* free tag mask */
 739                srb->tag_number = 255;
 740        }
 741}
 742
 743
 744/* Find cmd in SRB list */
 745static inline struct ScsiReqBlk *find_cmd(struct scsi_cmnd *cmd,
 746                struct list_head *head)
 747{
 748        struct ScsiReqBlk *i;
 749        list_for_each_entry(i, head, list)
 750                if (i->cmd == cmd)
 751                        return i;
 752        return NULL;
 753}
 754
 755/* Sets the timer to wake us up */
 756static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to)
 757{
 758        if (timer_pending(&acb->waiting_timer))
 759                return;
 760        if (time_before(jiffies + to, acb->last_reset - HZ / 2))
 761                acb->waiting_timer.expires =
 762                    acb->last_reset - HZ / 2 + 1;
 763        else
 764                acb->waiting_timer.expires = jiffies + to + 1;
 765        add_timer(&acb->waiting_timer);
 766}
 767
 768
 769/* Send the next command from the waiting list to the bus */
 770static void waiting_process_next(struct AdapterCtlBlk *acb)
 771{
 772        struct DeviceCtlBlk *start = NULL;
 773        struct DeviceCtlBlk *pos;
 774        struct DeviceCtlBlk *dcb;
 775        struct ScsiReqBlk *srb;
 776        struct list_head *dcb_list_head = &acb->dcb_list;
 777
 778        if (acb->active_dcb
 779            || (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV)))
 780                return;
 781
 782        if (timer_pending(&acb->waiting_timer))
 783                del_timer(&acb->waiting_timer);
 784
 785        if (list_empty(dcb_list_head))
 786                return;
 787
 788        /*
 789         * Find the starting dcb. Need to find it again in the list
 790         * since the list may have changed since we set the ptr to it
 791         */
 792        list_for_each_entry(dcb, dcb_list_head, list)
 793                if (dcb == acb->dcb_run_robin) {
 794                        start = dcb;
 795                        break;
 796                }
 797        if (!start) {
 798                /* This can happen! */
 799                start = list_entry(dcb_list_head->next, typeof(*start), list);
 800                acb->dcb_run_robin = start;
 801        }
 802
 803
 804        /*
 805         * Loop over the dcb, but we start somewhere (potentially) in
 806         * the middle of the loop so we need to manully do this.
 807         */
 808        pos = start;
 809        do {
 810                struct list_head *waiting_list_head = &pos->srb_waiting_list;
 811
 812                /* Make sure, the next another device gets scheduled ... */
 813                acb->dcb_run_robin = dcb_get_next(dcb_list_head,
 814                                                  acb->dcb_run_robin);
 815
 816                if (list_empty(waiting_list_head) ||
 817                    pos->max_command <= list_size(&pos->srb_going_list)) {
 818                        /* move to next dcb */
 819                        pos = dcb_get_next(dcb_list_head, pos);
 820                } else {
 821                        srb = list_entry(waiting_list_head->next,
 822                                         struct ScsiReqBlk, list);
 823
 824                        /* Try to send to the bus */
 825                        if (!start_scsi(acb, pos, srb))
 826                                list_move(&srb->list, &pos->srb_going_list);
 827                        else
 828                                waiting_set_timer(acb, HZ/50);
 829                        break;
 830                }
 831        } while (pos != start);
 832}
 833
 834
 835/* Wake up waiting queue */
 836static void waiting_timeout(struct timer_list *t)
 837{
 838        unsigned long flags;
 839        struct AdapterCtlBlk *acb = from_timer(acb, t, waiting_timer);
 840        dprintkdbg(DBG_1,
 841                "waiting_timeout: Queue woken up by timer. acb=%p\n", acb);
 842        DC395x_LOCK_IO(acb->scsi_host, flags);
 843        waiting_process_next(acb);
 844        DC395x_UNLOCK_IO(acb->scsi_host, flags);
 845}
 846
 847
 848/* Get the DCB for a given ID/LUN combination */
 849static struct DeviceCtlBlk *find_dcb(struct AdapterCtlBlk *acb, u8 id, u8 lun)
 850{
 851        return acb->children[id][lun];
 852}
 853
 854
 855/* Send SCSI Request Block (srb) to adapter (acb) */
 856static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
 857{
 858        struct DeviceCtlBlk *dcb = srb->dcb;
 859
 860        if (dcb->max_command <= list_size(&dcb->srb_going_list) ||
 861            acb->active_dcb ||
 862            (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) {
 863                list_add_tail(&srb->list, &dcb->srb_waiting_list);
 864                waiting_process_next(acb);
 865                return;
 866        }
 867
 868        if (!start_scsi(acb, dcb, srb)) {
 869                list_add_tail(&srb->list, &dcb->srb_going_list);
 870        } else {
 871                list_add(&srb->list, &dcb->srb_waiting_list);
 872                waiting_set_timer(acb, HZ / 50);
 873        }
 874}
 875
 876/* Prepare SRB for being sent to Device DCB w/ command *cmd */
 877static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb,
 878                struct ScsiReqBlk *srb)
 879{
 880        int nseg;
 881        enum dma_data_direction dir = cmd->sc_data_direction;
 882        dprintkdbg(DBG_0, "build_srb: (0x%p) <%02i-%i>\n",
 883                cmd, dcb->target_id, dcb->target_lun);
 884
 885        srb->dcb = dcb;
 886        srb->cmd = cmd;
 887        srb->sg_count = 0;
 888        srb->total_xfer_length = 0;
 889        srb->sg_bus_addr = 0;
 890        srb->sg_index = 0;
 891        srb->adapter_status = 0;
 892        srb->target_status = 0;
 893        srb->msg_count = 0;
 894        srb->status = 0;
 895        srb->flag = 0;
 896        srb->state = 0;
 897        srb->retry_count = 0;
 898        srb->tag_number = TAG_NONE;
 899        srb->scsi_phase = PH_BUS_FREE;  /* initial phase */
 900        srb->end_message = 0;
 901
 902        nseg = scsi_dma_map(cmd);
 903        BUG_ON(nseg < 0);
 904
 905        if (dir == PCI_DMA_NONE || !nseg) {
 906                dprintkdbg(DBG_0,
 907                        "build_srb: [0] len=%d buf=%p use_sg=%d !MAP=%08x\n",
 908                           cmd->bufflen, scsi_sglist(cmd), scsi_sg_count(cmd),
 909                           srb->segment_x[0].address);
 910        } else {
 911                int i;
 912                u32 reqlen = scsi_bufflen(cmd);
 913                struct scatterlist *sg;
 914                struct SGentry *sgp = srb->segment_x;
 915
 916                srb->sg_count = nseg;
 917
 918                dprintkdbg(DBG_0,
 919                           "build_srb: [n] len=%d buf=%p use_sg=%d segs=%d\n",
 920                           reqlen, scsi_sglist(cmd), scsi_sg_count(cmd),
 921                           srb->sg_count);
 922
 923                scsi_for_each_sg(cmd, sg, srb->sg_count, i) {
 924                        u32 busaddr = (u32)sg_dma_address(sg);
 925                        u32 seglen = (u32)sg->length;
 926                        sgp[i].address = busaddr;
 927                        sgp[i].length = seglen;
 928                        srb->total_xfer_length += seglen;
 929                }
 930                sgp += srb->sg_count - 1;
 931
 932                /*
 933                 * adjust last page if too big as it is allocated
 934                 * on even page boundaries
 935                 */
 936                if (srb->total_xfer_length > reqlen) {
 937                        sgp->length -= (srb->total_xfer_length - reqlen);
 938                        srb->total_xfer_length = reqlen;
 939                }
 940
 941                /* Fixup for WIDE padding - make sure length is even */
 942                if (dcb->sync_period & WIDE_SYNC &&
 943                    srb->total_xfer_length % 2) {
 944                        srb->total_xfer_length++;
 945                        sgp->length++;
 946                }
 947
 948                srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev,
 949                                srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE);
 950
 951                dprintkdbg(DBG_SG, "build_srb: [n] map sg %p->%08x(%05x)\n",
 952                        srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN);
 953        }
 954
 955        srb->request_length = srb->total_xfer_length;
 956}
 957
 958
 959/**
 960 * dc395x_queue_command - queue scsi command passed from the mid
 961 * layer, invoke 'done' on completion
 962 *
 963 * @cmd: pointer to scsi command object
 964 * @done: function pointer to be invoked on completion
 965 *
 966 * Returns 1 if the adapter (host) is busy, else returns 0. One
 967 * reason for an adapter to be busy is that the number
 968 * of outstanding queued commands is already equal to
 969 * struct Scsi_Host::can_queue .
 970 *
 971 * Required: if struct Scsi_Host::can_queue is ever non-zero
 972 *           then this function is required.
 973 *
 974 * Locks: struct Scsi_Host::host_lock held on entry (with "irqsave")
 975 *        and is expected to be held on return.
 976 *
 977 **/
 978static int dc395x_queue_command_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 979{
 980        struct DeviceCtlBlk *dcb;
 981        struct ScsiReqBlk *srb;
 982        struct AdapterCtlBlk *acb =
 983            (struct AdapterCtlBlk *)cmd->device->host->hostdata;
 984        dprintkdbg(DBG_0, "queue_command: (0x%p) <%02i-%i> cmnd=0x%02x\n",
 985                cmd, cmd->device->id, (u8)cmd->device->lun, cmd->cmnd[0]);
 986
 987        /* Assume BAD_TARGET; will be cleared later */
 988        cmd->result = DID_BAD_TARGET << 16;
 989
 990        /* ignore invalid targets */
 991        if (cmd->device->id >= acb->scsi_host->max_id ||
 992            cmd->device->lun >= acb->scsi_host->max_lun ||
 993            cmd->device->lun >31) {
 994                goto complete;
 995        }
 996
 997        /* does the specified lun on the specified device exist */
 998        if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) {
 999                dprintkl(KERN_INFO, "queue_command: Ignore target <%02i-%i>\n",
1000                        cmd->device->id, (u8)cmd->device->lun);
1001                goto complete;
1002        }
1003
1004        /* do we have a DCB for the device */
1005        dcb = find_dcb(acb, cmd->device->id, cmd->device->lun);
1006        if (!dcb) {
1007                /* should never happen */
1008                dprintkl(KERN_ERR, "queue_command: No such device <%02i-%i>",
1009                        cmd->device->id, (u8)cmd->device->lun);
1010                goto complete;
1011        }
1012
1013        /* set callback and clear result in the command */
1014        cmd->scsi_done = done;
1015        cmd->result = 0;
1016
1017        srb = list_first_entry_or_null(&acb->srb_free_list,
1018                        struct ScsiReqBlk, list);
1019        if (!srb) {
1020                /*
1021                 * Return 1 since we are unable to queue this command at this
1022                 * point in time.
1023                 */
1024                dprintkdbg(DBG_0, "queue_command: No free srb's\n");
1025                return 1;
1026        }
1027        list_del(&srb->list);
1028
1029        build_srb(cmd, dcb, srb);
1030
1031        if (!list_empty(&dcb->srb_waiting_list)) {
1032                /* append to waiting queue */
1033                list_add_tail(&srb->list, &dcb->srb_waiting_list);
1034                waiting_process_next(acb);
1035        } else {
1036                /* process immediately */
1037                send_srb(acb, srb);
1038        }
1039        dprintkdbg(DBG_1, "queue_command: (0x%p) done\n", cmd);
1040        return 0;
1041
1042complete:
1043        /*
1044         * Complete the command immediatey, and then return 0 to
1045         * indicate that we have handled the command. This is usually
1046         * done when the commad is for things like non existent
1047         * devices.
1048         */
1049        done(cmd);
1050        return 0;
1051}
1052
1053static DEF_SCSI_QCMD(dc395x_queue_command)
1054
1055static void dump_register_info(struct AdapterCtlBlk *acb,
1056                struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb)
1057{
1058        u16 pstat;
1059        struct pci_dev *dev = acb->dev;
1060        pci_read_config_word(dev, PCI_STATUS, &pstat);
1061        if (!dcb)
1062                dcb = acb->active_dcb;
1063        if (!srb && dcb)
1064                srb = dcb->active_srb;
1065        if (srb) {
1066                if (!srb->cmd)
1067                        dprintkl(KERN_INFO, "dump: srb=%p cmd=%p OOOPS!\n",
1068                                srb, srb->cmd);
1069                else
1070                        dprintkl(KERN_INFO, "dump: srb=%p cmd=%p "
1071                                 "cmnd=0x%02x <%02i-%i>\n",
1072                                srb, srb->cmd,
1073                                srb->cmd->cmnd[0], srb->cmd->device->id,
1074                                (u8)srb->cmd->device->lun);
1075                printk("  sglist=%p cnt=%i idx=%i len=%zu\n",
1076                       srb->segment_x, srb->sg_count, srb->sg_index,
1077                       srb->total_xfer_length);
1078                printk("  state=0x%04x status=0x%02x phase=0x%02x (%sconn.)\n",
1079                       srb->state, srb->status, srb->scsi_phase,
1080                       (acb->active_dcb) ? "" : "not");
1081        }
1082        dprintkl(KERN_INFO, "dump: SCSI{status=0x%04x fifocnt=0x%02x "
1083                "signals=0x%02x irqstat=0x%02x sync=0x%02x target=0x%02x "
1084                "rselid=0x%02x ctr=0x%08x irqen=0x%02x config=0x%04x "
1085                "config2=0x%02x cmd=0x%02x selto=0x%02x}\n",
1086                DC395x_read16(acb, TRM_S1040_SCSI_STATUS),
1087                DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT),
1088                DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL),
1089                DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS),
1090                DC395x_read8(acb, TRM_S1040_SCSI_SYNC),
1091                DC395x_read8(acb, TRM_S1040_SCSI_TARGETID),
1092                DC395x_read8(acb, TRM_S1040_SCSI_IDMSG),
1093                DC395x_read32(acb, TRM_S1040_SCSI_COUNTER),
1094                DC395x_read8(acb, TRM_S1040_SCSI_INTEN),
1095                DC395x_read16(acb, TRM_S1040_SCSI_CONFIG0),
1096                DC395x_read8(acb, TRM_S1040_SCSI_CONFIG2),
1097                DC395x_read8(acb, TRM_S1040_SCSI_COMMAND),
1098                DC395x_read8(acb, TRM_S1040_SCSI_TIMEOUT));
1099        dprintkl(KERN_INFO, "dump: DMA{cmd=0x%04x fifocnt=0x%02x fstat=0x%02x "
1100                "irqstat=0x%02x irqen=0x%02x cfg=0x%04x tctr=0x%08x "
1101                "ctctr=0x%08x addr=0x%08x:0x%08x}\n",
1102                DC395x_read16(acb, TRM_S1040_DMA_COMMAND),
1103                DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT),
1104                DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT),
1105                DC395x_read8(acb, TRM_S1040_DMA_STATUS),
1106                DC395x_read8(acb, TRM_S1040_DMA_INTEN),
1107                DC395x_read16(acb, TRM_S1040_DMA_CONFIG),
1108                DC395x_read32(acb, TRM_S1040_DMA_XCNT),
1109                DC395x_read32(acb, TRM_S1040_DMA_CXCNT),
1110                DC395x_read32(acb, TRM_S1040_DMA_XHIGHADDR),
1111                DC395x_read32(acb, TRM_S1040_DMA_XLOWADDR));
1112        dprintkl(KERN_INFO, "dump: gen{gctrl=0x%02x gstat=0x%02x gtmr=0x%02x} "
1113                "pci{status=0x%04x}\n",
1114                DC395x_read8(acb, TRM_S1040_GEN_CONTROL),
1115                DC395x_read8(acb, TRM_S1040_GEN_STATUS),
1116                DC395x_read8(acb, TRM_S1040_GEN_TIMER),
1117                pstat);
1118}
1119
1120
1121static inline void clear_fifo(struct AdapterCtlBlk *acb, char *txt)
1122{
1123#if debug_enabled(DBG_FIFO)
1124        u8 lines = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL);
1125        u8 fifocnt = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT);
1126        if (!(fifocnt & 0x40))
1127                dprintkdbg(DBG_FIFO,
1128                        "clear_fifo: (%i bytes) on phase %02x in %s\n",
1129                        fifocnt & 0x3f, lines, txt);
1130#endif
1131        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO);
1132}
1133
1134
1135static void reset_dev_param(struct AdapterCtlBlk *acb)
1136{
1137        struct DeviceCtlBlk *dcb;
1138        struct NvRamType *eeprom = &acb->eeprom;
1139        dprintkdbg(DBG_0, "reset_dev_param: acb=%p\n", acb);
1140
1141        list_for_each_entry(dcb, &acb->dcb_list, list) {
1142                u8 period_index;
1143
1144                dcb->sync_mode &= ~(SYNC_NEGO_DONE + WIDE_NEGO_DONE);
1145                dcb->sync_period = 0;
1146                dcb->sync_offset = 0;
1147
1148                dcb->dev_mode = eeprom->target[dcb->target_id].cfg0;
1149                period_index = eeprom->target[dcb->target_id].period & 0x07;
1150                dcb->min_nego_period = clock_period[period_index];
1151                if (!(dcb->dev_mode & NTC_DO_WIDE_NEGO)
1152                    || !(acb->config & HCC_WIDE_CARD))
1153                        dcb->sync_mode &= ~WIDE_NEGO_ENABLE;
1154        }
1155}
1156
1157
1158/*
1159 * perform a hard reset on the SCSI bus
1160 * @cmd - some command for this host (for fetching hooks)
1161 * Returns: SUCCESS (0x2002) on success, else FAILED (0x2003).
1162 */
1163static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
1164{
1165        struct AdapterCtlBlk *acb =
1166                (struct AdapterCtlBlk *)cmd->device->host->hostdata;
1167        dprintkl(KERN_INFO,
1168                "eh_bus_reset: (0%p) target=<%02i-%i> cmd=%p\n",
1169                cmd, cmd->device->id, (u8)cmd->device->lun, cmd);
1170
1171        if (timer_pending(&acb->waiting_timer))
1172                del_timer(&acb->waiting_timer);
1173
1174        /*
1175         * disable interrupt    
1176         */
1177        DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00);
1178        DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00);
1179        DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE);
1180        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE);
1181
1182        reset_scsi_bus(acb);
1183        udelay(500);
1184
1185        /* We may be in serious trouble. Wait some seconds */
1186        acb->last_reset =
1187            jiffies + 3 * HZ / 2 +
1188            HZ * acb->eeprom.delay_time;
1189
1190        /*
1191         * re-enable interrupt      
1192         */
1193        /* Clear SCSI FIFO          */
1194        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO);
1195        clear_fifo(acb, "eh_bus_reset");
1196        /* Delete pending IRQ */
1197        DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS);
1198        set_basic_config(acb);
1199
1200        reset_dev_param(acb);
1201        doing_srb_done(acb, DID_RESET, cmd, 0);
1202        acb->active_dcb = NULL;
1203        acb->acb_flag = 0;      /* RESET_DETECT, RESET_DONE ,RESET_DEV */
1204        waiting_process_next(acb);
1205
1206        return SUCCESS;
1207}
1208
1209static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
1210{
1211        int rc;
1212
1213        spin_lock_irq(cmd->device->host->host_lock);
1214        rc = __dc395x_eh_bus_reset(cmd);
1215        spin_unlock_irq(cmd->device->host->host_lock);
1216
1217        return rc;
1218}
1219
1220/*
1221 * abort an errant SCSI command
1222 * @cmd - command to be aborted
1223 * Returns: SUCCESS (0x2002) on success, else FAILED (0x2003).
1224 */
1225static int dc395x_eh_abort(struct scsi_cmnd *cmd)
1226{
1227        /*
1228         * Look into our command queues: If it has not been sent already,
1229         * we remove it and return success. Otherwise fail.
1230         */
1231        struct AdapterCtlBlk *acb =
1232            (struct AdapterCtlBlk *)cmd->device->host->hostdata;
1233        struct DeviceCtlBlk *dcb;
1234        struct ScsiReqBlk *srb;
1235        dprintkl(KERN_INFO, "eh_abort: (0x%p) target=<%02i-%i> cmd=%p\n",
1236                cmd, cmd->device->id, (u8)cmd->device->lun, cmd);
1237
1238        dcb = find_dcb(acb, cmd->device->id, cmd->device->lun);
1239        if (!dcb) {
1240                dprintkl(KERN_DEBUG, "eh_abort: No such device\n");
1241                return FAILED;
1242        }
1243
1244        srb = find_cmd(cmd, &dcb->srb_waiting_list);
1245        if (srb) {
1246                list_del(&srb->list);
1247                pci_unmap_srb_sense(acb, srb);
1248                pci_unmap_srb(acb, srb);
1249                free_tag(dcb, srb);
1250                list_add_tail(&srb->list, &acb->srb_free_list);
1251                dprintkl(KERN_DEBUG, "eh_abort: Command was waiting\n");
1252                cmd->result = DID_ABORT << 16;
1253                return SUCCESS;
1254        }
1255        srb = find_cmd(cmd, &dcb->srb_going_list);
1256        if (srb) {
1257                dprintkl(KERN_DEBUG, "eh_abort: Command in progress\n");
1258                /* XXX: Should abort the command here */
1259        } else {
1260                dprintkl(KERN_DEBUG, "eh_abort: Command not found\n");
1261        }
1262        return FAILED;
1263}
1264
1265
1266/* SDTR */
1267static void build_sdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
1268                struct ScsiReqBlk *srb)
1269{
1270        u8 *ptr = srb->msgout_buf + srb->msg_count;
1271        if (srb->msg_count > 1) {
1272                dprintkl(KERN_INFO,
1273                        "build_sdtr: msgout_buf BUSY (%i: %02x %02x)\n",
1274                        srb->msg_count, srb->msgout_buf[0],
1275                        srb->msgout_buf[1]);
1276                return;
1277        }
1278        if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) {
1279                dcb->sync_offset = 0;
1280                dcb->min_nego_period = 200 >> 2;
1281        } else if (dcb->sync_offset == 0)
1282                dcb->sync_offset = SYNC_NEGO_OFFSET;
1283
1284        *ptr++ = MSG_EXTENDED;  /* (01h) */
1285        *ptr++ = 3;             /* length */
1286        *ptr++ = EXTENDED_SDTR; /* (01h) */
1287        *ptr++ = dcb->min_nego_period;  /* Transfer period (in 4ns) */
1288        *ptr++ = dcb->sync_offset;      /* Transfer period (max. REQ/ACK dist) */
1289        srb->msg_count += 5;
1290        srb->state |= SRB_DO_SYNC_NEGO;
1291}
1292
1293
1294/* WDTR */
1295static void build_wdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
1296                struct ScsiReqBlk *srb)
1297{
1298        u8 wide = ((dcb->dev_mode & NTC_DO_WIDE_NEGO) &
1299                   (acb->config & HCC_WIDE_CARD)) ? 1 : 0;
1300        u8 *ptr = srb->msgout_buf + srb->msg_count;
1301        if (srb->msg_count > 1) {
1302                dprintkl(KERN_INFO,
1303                        "build_wdtr: msgout_buf BUSY (%i: %02x %02x)\n",
1304                        srb->msg_count, srb->msgout_buf[0],
1305                        srb->msgout_buf[1]);
1306                return;
1307        }
1308        *ptr++ = MSG_EXTENDED;  /* (01h) */
1309        *ptr++ = 2;             /* length */
1310        *ptr++ = EXTENDED_WDTR; /* (03h) */
1311        *ptr++ = wide;
1312        srb->msg_count += 4;
1313        srb->state |= SRB_DO_WIDE_NEGO;
1314}
1315
1316
1317#if 0
1318/* Timer to work around chip flaw: When selecting and the bus is 
1319 * busy, we sometimes miss a Selection timeout IRQ */
1320void selection_timeout_missed(unsigned long ptr);
1321/* Sets the timer to wake us up */
1322static void selto_timer(struct AdapterCtlBlk *acb)
1323{
1324        if (timer_pending(&acb->selto_timer))
1325                return;
1326        acb->selto_timer.function = selection_timeout_missed;
1327        acb->selto_timer.data = (unsigned long) acb;
1328        if (time_before
1329            (jiffies + HZ, acb->last_reset + HZ / 2))
1330                acb->selto_timer.expires =
1331                    acb->last_reset + HZ / 2 + 1;
1332        else
1333                acb->selto_timer.expires = jiffies + HZ + 1;
1334        add_timer(&acb->selto_timer);
1335}
1336
1337
1338void selection_timeout_missed(unsigned long ptr)
1339{
1340        unsigned long flags;
1341        struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)ptr;
1342        struct ScsiReqBlk *srb;
1343        dprintkl(KERN_DEBUG, "Chip forgot to produce SelTO IRQ!\n");
1344        if (!acb->active_dcb || !acb->active_dcb->active_srb) {
1345                dprintkl(KERN_DEBUG, "... but no cmd pending? Oops!\n");
1346                return;
1347        }
1348        DC395x_LOCK_IO(acb->scsi_host, flags);
1349        srb = acb->active_dcb->active_srb;
1350        disconnect(acb);
1351        DC395x_UNLOCK_IO(acb->scsi_host, flags);
1352}
1353#endif
1354
1355
1356static u8 start_scsi(struct AdapterCtlBlk* acb, struct DeviceCtlBlk* dcb,
1357                struct ScsiReqBlk* srb)
1358{
1359        u16 s_stat2, return_code;
1360        u8 s_stat, scsicommand, i, identify_message;
1361        u8 *ptr;
1362        dprintkdbg(DBG_0, "start_scsi: (0x%p) <%02i-%i> srb=%p\n",
1363                dcb->target_id, dcb->target_lun, srb);
1364
1365        srb->tag_number = TAG_NONE;     /* acb->tag_max_num: had error read in eeprom */
1366
1367        s_stat = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL);
1368        s_stat2 = 0;
1369        s_stat2 = DC395x_read16(acb, TRM_S1040_SCSI_STATUS);
1370#if 1
1371        if (s_stat & 0x20 /* s_stat2 & 0x02000 */ ) {
1372                dprintkdbg(DBG_KG, "start_scsi: (0x%p) BUSY %02x %04x\n",
1373                        s_stat, s_stat2);
1374                /*
1375                 * Try anyway?
1376                 *
1377                 * We could, BUT: Sometimes the TRM_S1040 misses to produce a Selection
1378                 * Timeout, a Disconnect or a Reselection IRQ, so we would be screwed!
1379                 * (This is likely to be a bug in the hardware. Obviously, most people
1380                 *  only have one initiator per SCSI bus.)
1381                 * Instead let this fail and have the timer make sure the command is 
1382                 * tried again after a short time
1383                 */
1384                /*selto_timer (acb); */
1385                return 1;
1386        }
1387#endif
1388        if (acb->active_dcb) {
1389                dprintkl(KERN_DEBUG, "start_scsi: (0x%p) Attempt to start a"
1390                        "command while another command (0x%p) is active.",
1391                        srb->cmd,
1392                        acb->active_dcb->active_srb ?
1393                            acb->active_dcb->active_srb->cmd : 0);
1394                return 1;
1395        }
1396        if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) {
1397                dprintkdbg(DBG_KG, "start_scsi: (0x%p) Failed (busy)\n", srb->cmd);
1398                return 1;
1399        }
1400        /* Allow starting of SCSI commands half a second before we allow the mid-level
1401         * to queue them again after a reset */
1402        if (time_before(jiffies, acb->last_reset - HZ / 2)) {
1403                dprintkdbg(DBG_KG, "start_scsi: Refuse cmds (reset wait)\n");
1404                return 1;
1405        }
1406
1407        /* Flush FIFO */
1408        clear_fifo(acb, "start_scsi");
1409        DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id);
1410        DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id);
1411        DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period);
1412        DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset);
1413        srb->scsi_phase = PH_BUS_FREE;  /* initial phase */
1414
1415        identify_message = dcb->identify_msg;
1416        /*DC395x_TRM_write8(TRM_S1040_SCSI_IDMSG, identify_message); */
1417        /* Don't allow disconnection for AUTO_REQSENSE: Cont.All.Cond.! */
1418        if (srb->flag & AUTO_REQSENSE)
1419                identify_message &= 0xBF;
1420
1421        if (((srb->cmd->cmnd[0] == INQUIRY)
1422             || (srb->cmd->cmnd[0] == REQUEST_SENSE)
1423             || (srb->flag & AUTO_REQSENSE))
1424            && (((dcb->sync_mode & WIDE_NEGO_ENABLE)
1425                 && !(dcb->sync_mode & WIDE_NEGO_DONE))
1426                || ((dcb->sync_mode & SYNC_NEGO_ENABLE)
1427                    && !(dcb->sync_mode & SYNC_NEGO_DONE)))
1428            && (dcb->target_lun == 0)) {
1429                srb->msgout_buf[0] = identify_message;
1430                srb->msg_count = 1;
1431                scsicommand = SCMD_SEL_ATNSTOP;
1432                srb->state = SRB_MSGOUT;
1433#ifndef SYNC_FIRST
1434                if (dcb->sync_mode & WIDE_NEGO_ENABLE
1435                    && dcb->inquiry7 & SCSI_INQ_WBUS16) {
1436                        build_wdtr(acb, dcb, srb);
1437                        goto no_cmd;
1438                }
1439#endif
1440                if (dcb->sync_mode & SYNC_NEGO_ENABLE
1441                    && dcb->inquiry7 & SCSI_INQ_SYNC) {
1442                        build_sdtr(acb, dcb, srb);
1443                        goto no_cmd;
1444                }
1445                if (dcb->sync_mode & WIDE_NEGO_ENABLE
1446                    && dcb->inquiry7 & SCSI_INQ_WBUS16) {
1447                        build_wdtr(acb, dcb, srb);
1448                        goto no_cmd;
1449                }
1450                srb->msg_count = 0;
1451        }
1452        /* Send identify message */
1453        DC395x_write8(acb, TRM_S1040_SCSI_FIFO, identify_message);
1454
1455        scsicommand = SCMD_SEL_ATN;
1456        srb->state = SRB_START_;
1457#ifndef DC395x_NO_TAGQ
1458        if ((dcb->sync_mode & EN_TAG_QUEUEING)
1459            && (identify_message & 0xC0)) {
1460                /* Send Tag message */
1461                u32 tag_mask = 1;
1462                u8 tag_number = 0;
1463                while (tag_mask & dcb->tag_mask
1464                       && tag_number < dcb->max_command) {
1465                        tag_mask = tag_mask << 1;
1466                        tag_number++;
1467                }
1468                if (tag_number >= dcb->max_command) {
1469                        dprintkl(KERN_WARNING, "start_scsi: (0x%p) "
1470                                "Out of tags target=<%02i-%i>)\n",
1471                                srb->cmd, srb->cmd->device->id,
1472                                (u8)srb->cmd->device->lun);
1473                        srb->state = SRB_READY;
1474                        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL,
1475                                       DO_HWRESELECT);
1476                        return 1;
1477                }
1478                /* Send Tag id */
1479                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, MSG_SIMPLE_QTAG);
1480                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, tag_number);
1481                dcb->tag_mask |= tag_mask;
1482                srb->tag_number = tag_number;
1483                scsicommand = SCMD_SEL_ATN3;
1484                srb->state = SRB_START_;
1485        }
1486#endif
1487/*polling:*/
1488        /* Send CDB ..command block ......... */
1489        dprintkdbg(DBG_KG, "start_scsi: (0x%p) <%02i-%i> cmnd=0x%02x tag=%i\n",
1490                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun,
1491                srb->cmd->cmnd[0], srb->tag_number);
1492        if (srb->flag & AUTO_REQSENSE) {
1493                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE);
1494                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5));
1495                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
1496                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
1497                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE);
1498                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
1499        } else {
1500                ptr = (u8 *)srb->cmd->cmnd;
1501                for (i = 0; i < srb->cmd->cmd_len; i++)
1502                        DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++);
1503        }
1504      no_cmd:
1505        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL,
1506                       DO_HWRESELECT | DO_DATALATCH);
1507        if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) {
1508                /* 
1509                 * If start_scsi return 1:
1510                 * we caught an interrupt (must be reset or reselection ... )
1511                 * : Let's process it first!
1512                 */
1513                dprintkdbg(DBG_0, "start_scsi: (0x%p) <%02i-%i> Failed - busy\n",
1514                        srb->cmd, dcb->target_id, dcb->target_lun);
1515                srb->state = SRB_READY;
1516                free_tag(dcb, srb);
1517                srb->msg_count = 0;
1518                return_code = 1;
1519                /* This IRQ should NOT get lost, as we did not acknowledge it */
1520        } else {
1521                /* 
1522                 * If start_scsi returns 0:
1523                 * we know that the SCSI processor is free
1524                 */
1525                srb->scsi_phase = PH_BUS_FREE;  /* initial phase */
1526                dcb->active_srb = srb;
1527                acb->active_dcb = dcb;
1528                return_code = 0;
1529                /* it's important for atn stop */
1530                DC395x_write16(acb, TRM_S1040_SCSI_CONTROL,
1531                               DO_DATALATCH | DO_HWRESELECT);
1532                /* SCSI command */
1533                DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, scsicommand);
1534        }
1535        return return_code;
1536}
1537
1538
1539#define DC395x_ENABLE_MSGOUT \
1540 DC395x_write16 (acb, TRM_S1040_SCSI_CONTROL, DO_SETATN); \
1541 srb->state |= SRB_MSGOUT
1542
1543
1544/* abort command */
1545static inline void enable_msgout_abort(struct AdapterCtlBlk *acb,
1546                struct ScsiReqBlk *srb)
1547{
1548        srb->msgout_buf[0] = ABORT;
1549        srb->msg_count = 1;
1550        DC395x_ENABLE_MSGOUT;
1551        srb->state &= ~SRB_MSGIN;
1552        srb->state |= SRB_MSGOUT;
1553}
1554
1555
1556/**
1557 * dc395x_handle_interrupt - Handle an interrupt that has been confirmed to
1558 *                           have been triggered for this card.
1559 *
1560 * @acb:         a pointer to the adpter control block
1561 * @scsi_status: the status return when we checked the card
1562 **/
1563static void dc395x_handle_interrupt(struct AdapterCtlBlk *acb,
1564                u16 scsi_status)
1565{
1566        struct DeviceCtlBlk *dcb;
1567        struct ScsiReqBlk *srb;
1568        u16 phase;
1569        u8 scsi_intstatus;
1570        unsigned long flags;
1571        void (*dc395x_statev)(struct AdapterCtlBlk *, struct ScsiReqBlk *, 
1572                              u16 *);
1573
1574        DC395x_LOCK_IO(acb->scsi_host, flags);
1575
1576        /* This acknowledges the IRQ */
1577        scsi_intstatus = DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS);
1578        if ((scsi_status & 0x2007) == 0x2002)
1579                dprintkl(KERN_DEBUG,
1580                        "COP after COP completed? %04x\n", scsi_status);
1581        if (debug_enabled(DBG_KG)) {
1582                if (scsi_intstatus & INT_SELTIMEOUT)
1583                        dprintkdbg(DBG_KG, "handle_interrupt: Selection timeout\n");
1584        }
1585        /*dprintkl(KERN_DEBUG, "handle_interrupt: intstatus = 0x%02x ", scsi_intstatus); */
1586
1587        if (timer_pending(&acb->selto_timer))
1588                del_timer(&acb->selto_timer);
1589
1590        if (scsi_intstatus & (INT_SELTIMEOUT | INT_DISCONNECT)) {
1591                disconnect(acb);        /* bus free interrupt  */
1592                goto out_unlock;
1593        }
1594        if (scsi_intstatus & INT_RESELECTED) {
1595                reselect(acb);
1596                goto out_unlock;
1597        }
1598        if (scsi_intstatus & INT_SELECT) {
1599                dprintkl(KERN_INFO, "Host does not support target mode!\n");
1600                goto out_unlock;
1601        }
1602        if (scsi_intstatus & INT_SCSIRESET) {
1603                scsi_reset_detect(acb);
1604                goto out_unlock;
1605        }
1606        if (scsi_intstatus & (INT_BUSSERVICE | INT_CMDDONE)) {
1607                dcb = acb->active_dcb;
1608                if (!dcb) {
1609                        dprintkl(KERN_DEBUG,
1610                                "Oops: BusService (%04x %02x) w/o ActiveDCB!\n",
1611                                scsi_status, scsi_intstatus);
1612                        goto out_unlock;
1613                }
1614                srb = dcb->active_srb;
1615                if (dcb->flag & ABORT_DEV_) {
1616                        dprintkdbg(DBG_0, "MsgOut Abort Device.....\n");
1617                        enable_msgout_abort(acb, srb);
1618                }
1619
1620                /* software sequential machine */
1621                phase = (u16)srb->scsi_phase;
1622
1623                /* 
1624                 * 62037 or 62137
1625                 * call  dc395x_scsi_phase0[]... "phase entry"
1626                 * handle every phase before start transfer
1627                 */
1628                /* data_out_phase0,     phase:0 */
1629                /* data_in_phase0,      phase:1 */
1630                /* command_phase0,      phase:2 */
1631                /* status_phase0,       phase:3 */
1632                /* nop0,                phase:4 PH_BUS_FREE .. initial phase */
1633                /* nop0,                phase:5 PH_BUS_FREE .. initial phase */
1634                /* msgout_phase0,       phase:6 */
1635                /* msgin_phase0,        phase:7 */
1636                dc395x_statev = dc395x_scsi_phase0[phase];
1637                dc395x_statev(acb, srb, &scsi_status);
1638
1639                /* 
1640                 * if there were any exception occurred scsi_status
1641                 * will be modify to bus free phase new scsi_status
1642                 * transfer out from ... previous dc395x_statev
1643                 */
1644                srb->scsi_phase = scsi_status & PHASEMASK;
1645                phase = (u16)scsi_status & PHASEMASK;
1646
1647                /* 
1648                 * call  dc395x_scsi_phase1[]... "phase entry" handle
1649                 * every phase to do transfer
1650                 */
1651                /* data_out_phase1,     phase:0 */
1652                /* data_in_phase1,      phase:1 */
1653                /* command_phase1,      phase:2 */
1654                /* status_phase1,       phase:3 */
1655                /* nop1,                phase:4 PH_BUS_FREE .. initial phase */
1656                /* nop1,                phase:5 PH_BUS_FREE .. initial phase */
1657                /* msgout_phase1,       phase:6 */
1658                /* msgin_phase1,        phase:7 */
1659                dc395x_statev = dc395x_scsi_phase1[phase];
1660                dc395x_statev(acb, srb, &scsi_status);
1661        }
1662      out_unlock:
1663        DC395x_UNLOCK_IO(acb->scsi_host, flags);
1664}
1665
1666
1667static irqreturn_t dc395x_interrupt(int irq, void *dev_id)
1668{
1669        struct AdapterCtlBlk *acb = dev_id;
1670        u16 scsi_status;
1671        u8 dma_status;
1672        irqreturn_t handled = IRQ_NONE;
1673
1674        /*
1675         * Check for pending interrupt
1676         */
1677        scsi_status = DC395x_read16(acb, TRM_S1040_SCSI_STATUS);
1678        dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS);
1679        if (scsi_status & SCSIINTERRUPT) {
1680                /* interrupt pending - let's process it! */
1681                dc395x_handle_interrupt(acb, scsi_status);
1682                handled = IRQ_HANDLED;
1683        }
1684        else if (dma_status & 0x20) {
1685                /* Error from the DMA engine */
1686                dprintkl(KERN_INFO, "Interrupt from DMA engine: 0x%02x!\n", dma_status);
1687#if 0
1688                dprintkl(KERN_INFO, "This means DMA error! Try to handle ...\n");
1689                if (acb->active_dcb) {
1690                        acb->active_dcb-> flag |= ABORT_DEV_;
1691                        if (acb->active_dcb->active_srb)
1692                                enable_msgout_abort(acb, acb->active_dcb->active_srb);
1693                }
1694                DC395x_write8(acb, TRM_S1040_DMA_CONTROL, ABORTXFER | CLRXFIFO);
1695#else
1696                dprintkl(KERN_INFO, "Ignoring DMA error (probably a bad thing) ...\n");
1697                acb = NULL;
1698#endif
1699                handled = IRQ_HANDLED;
1700        }
1701
1702        return handled;
1703}
1704
1705
1706static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1707                u16 *pscsi_status)
1708{
1709        dprintkdbg(DBG_0, "msgout_phase0: (0x%p)\n", srb->cmd);
1710        if (srb->state & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT))
1711                *pscsi_status = PH_BUS_FREE;    /*.. initial phase */
1712
1713        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
1714        srb->state &= ~SRB_MSGOUT;
1715}
1716
1717
1718static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1719                u16 *pscsi_status)
1720{
1721        u16 i;
1722        u8 *ptr;
1723        dprintkdbg(DBG_0, "msgout_phase1: (0x%p)\n", srb->cmd);
1724
1725        clear_fifo(acb, "msgout_phase1");
1726        if (!(srb->state & SRB_MSGOUT)) {
1727                srb->state |= SRB_MSGOUT;
1728                dprintkl(KERN_DEBUG,
1729                        "msgout_phase1: (0x%p) Phase unexpected\n",
1730                        srb->cmd);      /* So what ? */
1731        }
1732        if (!srb->msg_count) {
1733                dprintkdbg(DBG_0, "msgout_phase1: (0x%p) NOP msg\n",
1734                        srb->cmd);
1735                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, MSG_NOP);
1736                DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
1737                DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT);
1738                return;
1739        }
1740        ptr = (u8 *)srb->msgout_buf;
1741        for (i = 0; i < srb->msg_count; i++)
1742                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++);
1743        srb->msg_count = 0;
1744        if (srb->msgout_buf[0] == MSG_ABORT)
1745                srb->state = SRB_ABORT_SENT;
1746
1747        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT);
1748}
1749
1750
1751static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1752                u16 *pscsi_status)
1753{
1754        dprintkdbg(DBG_0, "command_phase0: (0x%p)\n", srb->cmd);
1755        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1756}
1757
1758
1759static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1760                u16 *pscsi_status)
1761{
1762        struct DeviceCtlBlk *dcb;
1763        u8 *ptr;
1764        u16 i;
1765        dprintkdbg(DBG_0, "command_phase1: (0x%p)\n", srb->cmd);
1766
1767        clear_fifo(acb, "command_phase1");
1768        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRATN);
1769        if (!(srb->flag & AUTO_REQSENSE)) {
1770                ptr = (u8 *)srb->cmd->cmnd;
1771                for (i = 0; i < srb->cmd->cmd_len; i++) {
1772                        DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr);
1773                        ptr++;
1774                }
1775        } else {
1776                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE);
1777                dcb = acb->active_dcb;
1778                /* target id */
1779                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5));
1780                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
1781                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
1782                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE);
1783                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
1784        }
1785        srb->state |= SRB_COMMAND;
1786        /* it's important for atn stop */
1787        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1788        /* SCSI command */
1789        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT);
1790}
1791
1792
1793/*
1794 * Verify that the remaining space in the hw sg lists is the same as
1795 * the count of remaining bytes in srb->total_xfer_length
1796 */
1797static void sg_verify_length(struct ScsiReqBlk *srb)
1798{
1799        if (debug_enabled(DBG_SG)) {
1800                unsigned len = 0;
1801                unsigned idx = srb->sg_index;
1802                struct SGentry *psge = srb->segment_x + idx;
1803                for (; idx < srb->sg_count; psge++, idx++)
1804                        len += psge->length;
1805                if (len != srb->total_xfer_length)
1806                        dprintkdbg(DBG_SG,
1807                               "Inconsistent SRB S/G lengths (Tot=%i, Count=%i) !!\n",
1808                               srb->total_xfer_length, len);
1809        }                              
1810}
1811
1812
1813/*
1814 * Compute the next Scatter Gather list index and adjust its length
1815 * and address if necessary
1816 */
1817static void sg_update_list(struct ScsiReqBlk *srb, u32 left)
1818{
1819        u8 idx;
1820        u32 xferred = srb->total_xfer_length - left; /* bytes transferred */
1821        struct SGentry *psge = srb->segment_x + srb->sg_index;
1822
1823        dprintkdbg(DBG_0,
1824                "sg_update_list: Transferred %i of %i bytes, %i remain\n",
1825                xferred, srb->total_xfer_length, left);
1826        if (xferred == 0) {
1827                /* nothing to update since we did not transfer any data */
1828                return;
1829        }
1830
1831        sg_verify_length(srb);
1832        srb->total_xfer_length = left;  /* update remaining count */
1833        for (idx = srb->sg_index; idx < srb->sg_count; idx++) {
1834                if (xferred >= psge->length) {
1835                        /* Complete SG entries done */
1836                        xferred -= psge->length;
1837                } else {
1838                        /* Partial SG entry done */
1839                        dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev,
1840                                        srb->sg_bus_addr, SEGMENTX_LEN,
1841                                        DMA_TO_DEVICE);
1842                        psge->length -= xferred;
1843                        psge->address += xferred;
1844                        srb->sg_index = idx;
1845                        dma_sync_single_for_device(&srb->dcb->acb->dev->dev,
1846                                        srb->sg_bus_addr, SEGMENTX_LEN,
1847                                        DMA_TO_DEVICE);
1848                        break;
1849                }
1850                psge++;
1851        }
1852        sg_verify_length(srb);
1853}
1854
1855
1856/*
1857 * We have transferred a single byte (PIO mode?) and need to update
1858 * the count of bytes remaining (total_xfer_length) and update the sg
1859 * entry to either point to next byte in the current sg entry, or of
1860 * already at the end to point to the start of the next sg entry
1861 */
1862static void sg_subtract_one(struct ScsiReqBlk *srb)
1863{
1864        sg_update_list(srb, srb->total_xfer_length - 1);
1865}
1866
1867
1868/* 
1869 * cleanup_after_transfer
1870 * 
1871 * Makes sure, DMA and SCSI engine are empty, after the transfer has finished
1872 * KG: Currently called from  StatusPhase1 ()
1873 * Should probably also be called from other places
1874 * Best might be to call it in DataXXPhase0, if new phase will differ 
1875 */
1876static void cleanup_after_transfer(struct AdapterCtlBlk *acb,
1877                struct ScsiReqBlk *srb)
1878{
1879        /*DC395x_write8 (TRM_S1040_DMA_STATUS, FORCEDMACOMP); */
1880        if (DC395x_read16(acb, TRM_S1040_DMA_COMMAND) & 0x0001) {       /* read */
1881                if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40))
1882                        clear_fifo(acb, "cleanup/in");
1883                if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80))
1884                        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO);
1885        } else {                /* write */
1886                if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80))
1887                        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO);
1888                if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40))
1889                        clear_fifo(acb, "cleanup/out");
1890        }
1891        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1892}
1893
1894
1895/*
1896 * Those no of bytes will be transferred w/ PIO through the SCSI FIFO
1897 * Seems to be needed for unknown reasons; could be a hardware bug :-(
1898 */
1899#define DC395x_LASTPIO 4
1900
1901
1902static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1903                u16 *pscsi_status)
1904{
1905        struct DeviceCtlBlk *dcb = srb->dcb;
1906        u16 scsi_status = *pscsi_status;
1907        u32 d_left_counter = 0;
1908        dprintkdbg(DBG_0, "data_out_phase0: (0x%p) <%02i-%i>\n",
1909                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
1910
1911        /*
1912         * KG: We need to drain the buffers before we draw any conclusions!
1913         * This means telling the DMA to push the rest into SCSI, telling
1914         * SCSI to push the rest to the bus.
1915         * However, the device might have been the one to stop us (phase
1916         * change), and the data in transit just needs to be accounted so
1917         * it can be retransmitted.)
1918         */
1919        /* 
1920         * KG: Stop DMA engine pushing more data into the SCSI FIFO
1921         * If we need more data, the DMA SG list will be freshly set up, anyway
1922         */
1923        dprintkdbg(DBG_PIO, "data_out_phase0: "
1924                "DMA{fifocnt=0x%02x fifostat=0x%02x} "
1925                "SCSI{fifocnt=0x%02x cnt=0x%06x status=0x%04x} total=0x%06x\n",
1926                DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT),
1927                DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT),
1928                DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT),
1929                DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), scsi_status,
1930                srb->total_xfer_length);
1931        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, STOPDMAXFER | CLRXFIFO);
1932
1933        if (!(srb->state & SRB_XFERPAD)) {
1934                if (scsi_status & PARITYERROR)
1935                        srb->status |= PARITY_ERROR;
1936
1937                /*
1938                 * KG: Right, we can't just rely on the SCSI_COUNTER, because this
1939                 * is the no of bytes it got from the DMA engine not the no it 
1940                 * transferred successfully to the device. (And the difference could
1941                 * be as much as the FIFO size, I guess ...)
1942                 */
1943                if (!(scsi_status & SCSIXFERDONE)) {
1944                        /*
1945                         * when data transfer from DMA FIFO to SCSI FIFO
1946                         * if there was some data left in SCSI FIFO
1947                         */
1948                        d_left_counter =
1949                            (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) &
1950                                  0x1F);
1951                        if (dcb->sync_period & WIDE_SYNC)
1952                                d_left_counter <<= 1;
1953
1954                        dprintkdbg(DBG_KG, "data_out_phase0: FIFO contains %i %s\n"
1955                                "SCSI{fifocnt=0x%02x cnt=0x%08x} "
1956                                "DMA{fifocnt=0x%04x cnt=0x%02x ctr=0x%08x}\n",
1957                                DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT),
1958                                (dcb->sync_period & WIDE_SYNC) ? "words" : "bytes",
1959                                DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT),
1960                                DC395x_read32(acb, TRM_S1040_SCSI_COUNTER),
1961                                DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT),
1962                                DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT),
1963                                DC395x_read32(acb, TRM_S1040_DMA_CXCNT));
1964                }
1965                /*
1966                 * calculate all the residue data that not yet tranfered
1967                 * SCSI transfer counter + left in SCSI FIFO data
1968                 *
1969                 * .....TRM_S1040_SCSI_COUNTER (24bits)
1970                 * The counter always decrement by one for every SCSI byte transfer.
1971                 * .....TRM_S1040_SCSI_FIFOCNT ( 5bits)
1972                 * The counter is SCSI FIFO offset counter (in units of bytes or! words)
1973                 */
1974                if (srb->total_xfer_length > DC395x_LASTPIO)
1975                        d_left_counter +=
1976                            DC395x_read32(acb, TRM_S1040_SCSI_COUNTER);
1977
1978                /* Is this a good idea? */
1979                /*clear_fifo(acb, "DOP1"); */
1980                /* KG: What is this supposed to be useful for? WIDE padding stuff? */
1981                if (d_left_counter == 1 && dcb->sync_period & WIDE_SYNC
1982                    && scsi_bufflen(srb->cmd) % 2) {
1983                        d_left_counter = 0;
1984                        dprintkl(KERN_INFO,
1985                                "data_out_phase0: Discard 1 byte (0x%02x)\n",
1986                                scsi_status);
1987                }
1988                /*
1989                 * KG: Oops again. Same thinko as above: The SCSI might have been
1990                 * faster than the DMA engine, so that it ran out of data.
1991                 * In that case, we have to do just nothing! 
1992                 * But: Why the interrupt: No phase change. No XFERCNT_2_ZERO. Or?
1993                 */
1994                /*
1995                 * KG: This is nonsense: We have been WRITING data to the bus
1996                 * If the SCSI engine has no bytes left, how should the DMA engine?
1997                 */
1998                if (d_left_counter == 0) {
1999                        srb->total_xfer_length = 0;
2000                } else {
2001                        /*
2002                         * if transfer not yet complete
2003                         * there were some data residue in SCSI FIFO or
2004                         * SCSI transfer counter not empty
2005                         */
2006                        long oldxferred =
2007                            srb->total_xfer_length - d_left_counter;
2008                        const int diff =
2009                            (dcb->sync_period & WIDE_SYNC) ? 2 : 1;
2010                        sg_update_list(srb, d_left_counter);
2011                        /* KG: Most ugly hack! Apparently, this works around a chip bug */
2012                        if ((srb->segment_x[srb->sg_index].length ==
2013                             diff && scsi_sg_count(srb->cmd))
2014                            || ((oldxferred & ~PAGE_MASK) ==
2015                                (PAGE_SIZE - diff))
2016                            ) {
2017                                dprintkl(KERN_INFO, "data_out_phase0: "
2018                                        "Work around chip bug (%i)?\n", diff);
2019                                d_left_counter =
2020                                    srb->total_xfer_length - diff;
2021                                sg_update_list(srb, d_left_counter);
2022                                /*srb->total_xfer_length -= diff; */
2023                                /*srb->virt_addr += diff; */
2024                                /*if (srb->cmd->use_sg) */
2025                                /*      srb->sg_index++; */
2026                        }
2027                }
2028        }
2029        if ((*pscsi_status & PHASEMASK) != PH_DATA_OUT) {
2030                cleanup_after_transfer(acb, srb);
2031        }
2032}
2033
2034
2035static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2036                u16 *pscsi_status)
2037{
2038        dprintkdbg(DBG_0, "data_out_phase1: (0x%p) <%02i-%i>\n",
2039                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2040        clear_fifo(acb, "data_out_phase1");
2041        /* do prepare before transfer when data out phase */
2042        data_io_transfer(acb, srb, XFERDATAOUT);
2043}
2044
2045static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2046                u16 *pscsi_status)
2047{
2048        u16 scsi_status = *pscsi_status;
2049
2050        dprintkdbg(DBG_0, "data_in_phase0: (0x%p) <%02i-%i>\n",
2051                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2052
2053        /*
2054         * KG: DataIn is much more tricky than DataOut. When the device is finished
2055         * and switches to another phase, the SCSI engine should be finished too.
2056         * But: There might still be bytes left in its FIFO to be fetched by the DMA
2057         * engine and transferred to memory.
2058         * We should wait for the FIFOs to be emptied by that (is there any way to 
2059         * enforce this?) and then stop the DMA engine, because it might think, that
2060         * there are more bytes to follow. Yes, the device might disconnect prior to
2061         * having all bytes transferred! 
2062         * Also we should make sure that all data from the DMA engine buffer's really
2063         * made its way to the system memory! Some documentation on this would not
2064         * seem to be a bad idea, actually.
2065         */
2066        if (!(srb->state & SRB_XFERPAD)) {
2067                u32 d_left_counter;
2068                unsigned int sc, fc;
2069
2070                if (scsi_status & PARITYERROR) {
2071                        dprintkl(KERN_INFO, "data_in_phase0: (0x%p) "
2072                                "Parity Error\n", srb->cmd);
2073                        srb->status |= PARITY_ERROR;
2074                }
2075                /*
2076                 * KG: We should wait for the DMA FIFO to be empty ...
2077                 * but: it would be better to wait first for the SCSI FIFO and then the
2078                 * the DMA FIFO to become empty? How do we know, that the device not already
2079                 * sent data to the FIFO in a MsgIn phase, eg.?
2080                 */
2081                if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) {
2082#if 0
2083                        int ctr = 6000000;
2084                        dprintkl(KERN_DEBUG,
2085                                "DIP0: Wait for DMA FIFO to flush ...\n");
2086                        /*DC395x_write8  (TRM_S1040_DMA_CONTROL, STOPDMAXFER); */
2087                        /*DC395x_write32 (TRM_S1040_SCSI_COUNTER, 7); */
2088                        /*DC395x_write8  (TRM_S1040_SCSI_COMMAND, SCMD_DMA_IN); */
2089                        while (!
2090                               (DC395x_read16(acb, TRM_S1040_DMA_FIFOSTAT) &
2091                                0x80) && --ctr);
2092                        if (ctr < 6000000 - 1)
2093                                dprintkl(KERN_DEBUG
2094                                       "DIP0: Had to wait for DMA ...\n");
2095                        if (!ctr)
2096                                dprintkl(KERN_ERR,
2097                                       "Deadlock in DIP0 waiting for DMA FIFO empty!!\n");
2098                        /*DC395x_write32 (TRM_S1040_SCSI_COUNTER, 0); */
2099#endif
2100                        dprintkdbg(DBG_KG, "data_in_phase0: "
2101                                "DMA{fifocnt=0x%02x fifostat=0x%02x}\n",
2102                                DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT),
2103                                DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT));
2104                }
2105                /* Now: Check remainig data: The SCSI counters should tell us ... */
2106                sc = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER);
2107                fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT);
2108                d_left_counter = sc + ((fc & 0x1f)
2109                       << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 :
2110                           0));
2111                dprintkdbg(DBG_KG, "data_in_phase0: "
2112                        "SCSI{fifocnt=0x%02x%s ctr=0x%08x} "
2113                        "DMA{fifocnt=0x%02x fifostat=0x%02x ctr=0x%08x} "
2114                        "Remain{totxfer=%i scsi_fifo+ctr=%i}\n",
2115                        fc,
2116                        (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes",
2117                        sc,
2118                        fc,
2119                        DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT),
2120                        DC395x_read32(acb, TRM_S1040_DMA_CXCNT),
2121                        srb->total_xfer_length, d_left_counter);
2122#if DC395x_LASTPIO
2123                /* KG: Less than or equal to 4 bytes can not be transferred via DMA, it seems. */
2124                if (d_left_counter
2125                    && srb->total_xfer_length <= DC395x_LASTPIO) {
2126                        size_t left_io = srb->total_xfer_length;
2127
2128                        /*u32 addr = (srb->segment_x[srb->sg_index].address); */
2129                        /*sg_update_list (srb, d_left_counter); */
2130                        dprintkdbg(DBG_PIO, "data_in_phase0: PIO (%i %s) "
2131                                   "for remaining %i bytes:",
2132                                fc & 0x1f,
2133                                (srb->dcb->sync_period & WIDE_SYNC) ?
2134                                    "words" : "bytes",
2135                                srb->total_xfer_length);
2136                        if (srb->dcb->sync_period & WIDE_SYNC)
2137                                DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2,
2138                                              CFG2_WIDEFIFO);
2139                        while (left_io) {
2140                                unsigned char *virt, *base = NULL;
2141                                unsigned long flags = 0;
2142                                size_t len = left_io;
2143                                size_t offset = srb->request_length - left_io;
2144
2145                                local_irq_save(flags);
2146                                /* Assumption: it's inside one page as it's at most 4 bytes and
2147                                   I just assume it's on a 4-byte boundary */
2148                                base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd),
2149                                                           srb->sg_count, &offset, &len);
2150                                virt = base + offset;
2151
2152                                left_io -= len;
2153
2154                                while (len) {
2155                                        u8 byte;
2156                                        byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2157                                        *virt++ = byte;
2158
2159                                        if (debug_enabled(DBG_PIO))
2160                                                printk(" %02x", byte);
2161
2162                                        d_left_counter--;
2163                                        sg_subtract_one(srb);
2164
2165                                        len--;
2166
2167                                        fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT);
2168
2169                                        if (fc == 0x40) {
2170                                                left_io = 0;
2171                                                break;
2172                                        }
2173                                }
2174
2175                                WARN_ON((fc != 0x40) == !d_left_counter);
2176
2177                                if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) {
2178                                        /* Read the last byte ... */
2179                                        if (srb->total_xfer_length > 0) {
2180                                                u8 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2181
2182                                                *virt++ = byte;
2183                                                srb->total_xfer_length--;
2184                                                if (debug_enabled(DBG_PIO))
2185                                                        printk(" %02x", byte);
2186                                        }
2187
2188                                        DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0);
2189                                }
2190
2191                                scsi_kunmap_atomic_sg(base);
2192                                local_irq_restore(flags);
2193                        }
2194                        /*printk(" %08x", *(u32*)(bus_to_virt (addr))); */
2195                        /*srb->total_xfer_length = 0; */
2196                        if (debug_enabled(DBG_PIO))
2197                                printk("\n");
2198                }
2199#endif                          /* DC395x_LASTPIO */
2200
2201#if 0
2202                /*
2203                 * KG: This was in DATAOUT. Does it also belong here?
2204                 * Nobody seems to know what counter and fifo_cnt count exactly ...
2205                 */
2206                if (!(scsi_status & SCSIXFERDONE)) {
2207                        /*
2208                         * when data transfer from DMA FIFO to SCSI FIFO
2209                         * if there was some data left in SCSI FIFO
2210                         */
2211                        d_left_counter =
2212                            (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) &
2213                                  0x1F);
2214                        if (srb->dcb->sync_period & WIDE_SYNC)
2215                                d_left_counter <<= 1;
2216                        /*
2217                         * if WIDE scsi SCSI FIFOCNT unit is word !!!
2218                         * so need to *= 2
2219                         * KG: Seems to be correct ...
2220                         */
2221                }
2222#endif
2223                /* KG: This should not be needed any more! */
2224                if (d_left_counter == 0
2225                    || (scsi_status & SCSIXFERCNT_2_ZERO)) {
2226#if 0
2227                        int ctr = 6000000;
2228                        u8 TempDMAstatus;
2229                        do {
2230                                TempDMAstatus =
2231                                    DC395x_read8(acb, TRM_S1040_DMA_STATUS);
2232                        } while (!(TempDMAstatus & DMAXFERCOMP) && --ctr);
2233                        if (!ctr)
2234                                dprintkl(KERN_ERR,
2235                                       "Deadlock in DataInPhase0 waiting for DMA!!\n");
2236                        srb->total_xfer_length = 0;
2237#endif
2238                        srb->total_xfer_length = d_left_counter;
2239                } else {        /* phase changed */
2240                        /*
2241                         * parsing the case:
2242                         * when a transfer not yet complete 
2243                         * but be disconnected by target
2244                         * if transfer not yet complete
2245                         * there were some data residue in SCSI FIFO or
2246                         * SCSI transfer counter not empty
2247                         */
2248                        sg_update_list(srb, d_left_counter);
2249                }
2250        }
2251        /* KG: The target may decide to disconnect: Empty FIFO before! */
2252        if ((*pscsi_status & PHASEMASK) != PH_DATA_IN) {
2253                cleanup_after_transfer(acb, srb);
2254        }
2255}
2256
2257
2258static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2259                u16 *pscsi_status)
2260{
2261        dprintkdbg(DBG_0, "data_in_phase1: (0x%p) <%02i-%i>\n",
2262                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2263        data_io_transfer(acb, srb, XFERDATAIN);
2264}
2265
2266
2267static void data_io_transfer(struct AdapterCtlBlk *acb, 
2268                struct ScsiReqBlk *srb, u16 io_dir)
2269{
2270        struct DeviceCtlBlk *dcb = srb->dcb;
2271        u8 bval;
2272        dprintkdbg(DBG_0,
2273                "data_io_transfer: (0x%p) <%02i-%i> %c len=%i, sg=(%i/%i)\n",
2274                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun,
2275                ((io_dir & DMACMD_DIR) ? 'r' : 'w'),
2276                srb->total_xfer_length, srb->sg_index, srb->sg_count);
2277        if (srb == acb->tmp_srb)
2278                dprintkl(KERN_ERR, "data_io_transfer: Using tmp_srb!\n");
2279        if (srb->sg_index >= srb->sg_count) {
2280                /* can't happen? out of bounds error */
2281                return;
2282        }
2283
2284        if (srb->total_xfer_length > DC395x_LASTPIO) {
2285                u8 dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS);
2286                /*
2287                 * KG: What should we do: Use SCSI Cmd 0x90/0x92?
2288                 * Maybe, even ABORTXFER would be appropriate
2289                 */
2290                if (dma_status & XFERPENDING) {
2291                        dprintkl(KERN_DEBUG, "data_io_transfer: Xfer pending! "
2292                                "Expect trouble!\n");
2293                        dump_register_info(acb, dcb, srb);
2294                        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO);
2295                }
2296                /* clear_fifo(acb, "IO"); */
2297                /* 
2298                 * load what physical address of Scatter/Gather list table
2299                 * want to be transfer
2300                 */
2301                srb->state |= SRB_DATA_XFER;
2302                DC395x_write32(acb, TRM_S1040_DMA_XHIGHADDR, 0);
2303                if (scsi_sg_count(srb->cmd)) {  /* with S/G */
2304                        io_dir |= DMACMD_SG;
2305                        DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR,
2306                                       srb->sg_bus_addr +
2307                                       sizeof(struct SGentry) *
2308                                       srb->sg_index);
2309                        /* load how many bytes in the sg list table */
2310                        DC395x_write32(acb, TRM_S1040_DMA_XCNT,
2311                                       ((u32)(srb->sg_count -
2312                                              srb->sg_index) << 3));
2313                } else {        /* without S/G */
2314                        io_dir &= ~DMACMD_SG;
2315                        DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR,
2316                                       srb->segment_x[0].address);
2317                        DC395x_write32(acb, TRM_S1040_DMA_XCNT,
2318                                       srb->segment_x[0].length);
2319                }
2320                /* load total transfer length (24bits) max value 16Mbyte */
2321                DC395x_write32(acb, TRM_S1040_SCSI_COUNTER,
2322                               srb->total_xfer_length);
2323                DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
2324                if (io_dir & DMACMD_DIR) {      /* read */
2325                        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND,
2326                                      SCMD_DMA_IN);
2327                        DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir);
2328                } else {
2329                        DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir);
2330                        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND,
2331                                      SCMD_DMA_OUT);
2332                }
2333
2334        }
2335#if DC395x_LASTPIO
2336        else if (srb->total_xfer_length > 0) {  /* The last four bytes: Do PIO */
2337                /* 
2338                 * load what physical address of Scatter/Gather list table
2339                 * want to be transfer
2340                 */
2341                srb->state |= SRB_DATA_XFER;
2342                /* load total transfer length (24bits) max value 16Mbyte */
2343                DC395x_write32(acb, TRM_S1040_SCSI_COUNTER,
2344                               srb->total_xfer_length);
2345                DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
2346                if (io_dir & DMACMD_DIR) {      /* read */
2347                        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND,
2348                                      SCMD_FIFO_IN);
2349                } else {        /* write */
2350                        int ln = srb->total_xfer_length;
2351                        size_t left_io = srb->total_xfer_length;
2352
2353                        if (srb->dcb->sync_period & WIDE_SYNC)
2354                                DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2,
2355                                     CFG2_WIDEFIFO);
2356
2357                        while (left_io) {
2358                                unsigned char *virt, *base = NULL;
2359                                unsigned long flags = 0;
2360                                size_t len = left_io;
2361                                size_t offset = srb->request_length - left_io;
2362
2363                                local_irq_save(flags);
2364                                /* Again, max 4 bytes */
2365                                base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd),
2366                                                           srb->sg_count, &offset, &len);
2367                                virt = base + offset;
2368
2369                                left_io -= len;
2370
2371                                while (len--) {
2372                                        if (debug_enabled(DBG_PIO))
2373                                                printk(" %02x", *virt);
2374
2375                                        DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *virt++);
2376
2377                                        sg_subtract_one(srb);
2378                                }
2379
2380                                scsi_kunmap_atomic_sg(base);
2381                                local_irq_restore(flags);
2382                        }
2383                        if (srb->dcb->sync_period & WIDE_SYNC) {
2384                                if (ln % 2) {
2385                                        DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
2386                                        if (debug_enabled(DBG_PIO))
2387                                                printk(" |00");
2388                                }
2389                                DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0);
2390                        }
2391                        /*DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, ln); */
2392                        if (debug_enabled(DBG_PIO))
2393                                printk("\n");
2394                        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND,
2395                                          SCMD_FIFO_OUT);
2396                }
2397        }
2398#endif                          /* DC395x_LASTPIO */
2399        else {          /* xfer pad */
2400                u8 data = 0, data2 = 0;
2401                if (srb->sg_count) {
2402                        srb->adapter_status = H_OVER_UNDER_RUN;
2403                        srb->status |= OVER_RUN;
2404                }
2405                /*
2406                 * KG: despite the fact that we are using 16 bits I/O ops
2407                 * the SCSI FIFO is only 8 bits according to the docs
2408                 * (we can set bit 1 in 0x8f to serialize FIFO access ...)
2409                 */
2410                if (dcb->sync_period & WIDE_SYNC) {
2411                        DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 2);
2412                        DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2,
2413                                      CFG2_WIDEFIFO);
2414                        if (io_dir & DMACMD_DIR) {
2415                                data = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2416                                data2 = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2417                        } else {
2418                                /* Danger, Robinson: If you find KGs
2419                                 * scattered over the wide disk, the driver
2420                                 * or chip is to blame :-( */
2421                                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K');
2422                                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'G');
2423                        }
2424                        DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0);
2425                } else {
2426                        DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1);
2427                        /* Danger, Robinson: If you find a collection of Ks on your disk
2428                         * something broke :-( */
2429                        if (io_dir & DMACMD_DIR)
2430                                data = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2431                        else
2432                                DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K');
2433                }
2434                srb->state |= SRB_XFERPAD;
2435                DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
2436                /* SCSI command */
2437                bval = (io_dir & DMACMD_DIR) ? SCMD_FIFO_IN : SCMD_FIFO_OUT;
2438                DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, bval);
2439        }
2440}
2441
2442
2443static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2444                u16 *pscsi_status)
2445{
2446        dprintkdbg(DBG_0, "status_phase0: (0x%p) <%02i-%i>\n",
2447                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2448        srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2449        srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);      /* get message */
2450        srb->state = SRB_COMPLETED;
2451        *pscsi_status = PH_BUS_FREE;    /*.. initial phase */
2452        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
2453        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT);
2454}
2455
2456
2457static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2458                u16 *pscsi_status)
2459{
2460        dprintkdbg(DBG_0, "status_phase1: (0x%p) <%02i-%i>\n",
2461                srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2462        srb->state = SRB_STATUS;
2463        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
2464        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_COMP);
2465}
2466
2467
2468/* Check if the message is complete */
2469static inline u8 msgin_completed(u8 * msgbuf, u32 len)
2470{
2471        if (*msgbuf == EXTENDED_MESSAGE) {
2472                if (len < 2)
2473                        return 0;
2474                if (len < msgbuf[1] + 2)
2475                        return 0;
2476        } else if (*msgbuf >= 0x20 && *msgbuf <= 0x2f)  /* two byte messages */
2477                if (len < 2)
2478                        return 0;
2479        return 1;
2480}
2481
2482/* reject_msg */
2483static inline void msgin_reject(struct AdapterCtlBlk *acb,
2484                struct ScsiReqBlk *srb)
2485{
2486        srb->msgout_buf[0] = MESSAGE_REJECT;
2487        srb->msg_count = 1;
2488        DC395x_ENABLE_MSGOUT;
2489        srb->state &= ~SRB_MSGIN;
2490        srb->state |= SRB_MSGOUT;
2491        dprintkl(KERN_INFO, "msgin_reject: 0x%02x <%02i-%i>\n",
2492                srb->msgin_buf[0],
2493                srb->dcb->target_id, srb->dcb->target_lun);
2494}
2495
2496
2497static struct ScsiReqBlk *msgin_qtag(struct AdapterCtlBlk *acb,
2498                struct DeviceCtlBlk *dcb, u8 tag)
2499{
2500        struct ScsiReqBlk *srb = NULL;
2501        struct ScsiReqBlk *i;
2502        dprintkdbg(DBG_0, "msgin_qtag: (0x%p) tag=%i srb=%p\n",
2503                   srb->cmd, tag, srb);
2504
2505        if (!(dcb->tag_mask & (1 << tag)))
2506                dprintkl(KERN_DEBUG,
2507                        "msgin_qtag: tag_mask=0x%08x does not reserve tag %i!\n",
2508                        dcb->tag_mask, tag);
2509
2510        if (list_empty(&dcb->srb_going_list))
2511                goto mingx0;
2512        list_for_each_entry(i, &dcb->srb_going_list, list) {
2513                if (i->tag_number == tag) {
2514                        srb = i;
2515                        break;
2516                }
2517        }
2518        if (!srb)
2519                goto mingx0;
2520
2521        dprintkdbg(DBG_0, "msgin_qtag: (0x%p) <%02i-%i>\n",
2522                srb->cmd, srb->dcb->target_id, srb->dcb->target_lun);
2523        if (dcb->flag & ABORT_DEV_) {
2524                /*srb->state = SRB_ABORT_SENT; */
2525                enable_msgout_abort(acb, srb);
2526        }
2527
2528        if (!(srb->state & SRB_DISCONNECT))
2529                goto mingx0;
2530
2531        memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len);
2532        srb->state |= dcb->active_srb->state;
2533        srb->state |= SRB_DATA_XFER;
2534        dcb->active_srb = srb;
2535        /* How can we make the DORS happy? */
2536        return srb;
2537
2538      mingx0:
2539        srb = acb->tmp_srb;
2540        srb->state = SRB_UNEXPECT_RESEL;
2541        dcb->active_srb = srb;
2542        srb->msgout_buf[0] = MSG_ABORT_TAG;
2543        srb->msg_count = 1;
2544        DC395x_ENABLE_MSGOUT;
2545        dprintkl(KERN_DEBUG, "msgin_qtag: Unknown tag %i - abort\n", tag);
2546        return srb;
2547}
2548
2549
2550static inline void reprogram_regs(struct AdapterCtlBlk *acb,
2551                struct DeviceCtlBlk *dcb)
2552{
2553        DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id);
2554        DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period);
2555        DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset);
2556        set_xfer_rate(acb, dcb);
2557}
2558
2559
2560/* set async transfer mode */
2561static void msgin_set_async(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
2562{
2563        struct DeviceCtlBlk *dcb = srb->dcb;
2564        dprintkl(KERN_DEBUG, "msgin_set_async: No sync transfers <%02i-%i>\n",
2565                dcb->target_id, dcb->target_lun);
2566
2567        dcb->sync_mode &= ~(SYNC_NEGO_ENABLE);
2568        dcb->sync_mode |= SYNC_NEGO_DONE;
2569        /*dcb->sync_period &= 0; */
2570        dcb->sync_offset = 0;
2571        dcb->min_nego_period = 200 >> 2;        /* 200ns <=> 5 MHz */
2572        srb->state &= ~SRB_DO_SYNC_NEGO;
2573        reprogram_regs(acb, dcb);
2574        if ((dcb->sync_mode & WIDE_NEGO_ENABLE)
2575            && !(dcb->sync_mode & WIDE_NEGO_DONE)) {
2576                build_wdtr(acb, dcb, srb);
2577                DC395x_ENABLE_MSGOUT;
2578                dprintkdbg(DBG_0, "msgin_set_async(rej): Try WDTR anyway\n");
2579        }
2580}
2581
2582
2583/* set sync transfer mode */
2584static void msgin_set_sync(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
2585{
2586        struct DeviceCtlBlk *dcb = srb->dcb;
2587        u8 bval;
2588        int fact;
2589        dprintkdbg(DBG_1, "msgin_set_sync: <%02i> Sync: %ins "
2590                "(%02i.%01i MHz) Offset %i\n",
2591                dcb->target_id, srb->msgin_buf[3] << 2,
2592                (250 / srb->msgin_buf[3]),
2593                ((250 % srb->msgin_buf[3]) * 10) / srb->msgin_buf[3],
2594                srb->msgin_buf[4]);
2595
2596        if (srb->msgin_buf[4] > 15)
2597                srb->msgin_buf[4] = 15;
2598        if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO))
2599                dcb->sync_offset = 0;
2600        else if (dcb->sync_offset == 0)
2601                dcb->sync_offset = srb->msgin_buf[4];
2602        if (srb->msgin_buf[4] > dcb->sync_offset)
2603                srb->msgin_buf[4] = dcb->sync_offset;
2604        else
2605                dcb->sync_offset = srb->msgin_buf[4];
2606        bval = 0;
2607        while (bval < 7 && (srb->msgin_buf[3] > clock_period[bval]
2608                            || dcb->min_nego_period >
2609                            clock_period[bval]))
2610                bval++;
2611        if (srb->msgin_buf[3] < clock_period[bval])
2612                dprintkl(KERN_INFO,
2613                        "msgin_set_sync: Increase sync nego period to %ins\n",
2614                        clock_period[bval] << 2);
2615        srb->msgin_buf[3] = clock_period[bval];
2616        dcb->sync_period &= 0xf0;
2617        dcb->sync_period |= ALT_SYNC | bval;
2618        dcb->min_nego_period = srb->msgin_buf[3];
2619
2620        if (dcb->sync_period & WIDE_SYNC)
2621                fact = 500;
2622        else
2623                fact = 250;
2624
2625        dprintkl(KERN_INFO,
2626                "Target %02i: %s Sync: %ins Offset %i (%02i.%01i MB/s)\n",
2627                dcb->target_id, (fact == 500) ? "Wide16" : "",
2628                dcb->min_nego_period << 2, dcb->sync_offset,
2629                (fact / dcb->min_nego_period),
2630                ((fact % dcb->min_nego_period) * 10 +
2631                dcb->min_nego_period / 2) / dcb->min_nego_period);
2632
2633        if (!(srb->state & SRB_DO_SYNC_NEGO)) {
2634                /* Reply with corrected SDTR Message */
2635                dprintkl(KERN_DEBUG, "msgin_set_sync: answer w/%ins %i\n",
2636                        srb->msgin_buf[3] << 2, srb->msgin_buf[4]);
2637
2638                memcpy(srb->msgout_buf, srb->msgin_buf, 5);
2639                srb->msg_count = 5;
2640                DC395x_ENABLE_MSGOUT;
2641                dcb->sync_mode |= SYNC_NEGO_DONE;
2642        } else {
2643                if ((dcb->sync_mode & WIDE_NEGO_ENABLE)
2644                    && !(dcb->sync_mode & WIDE_NEGO_DONE)) {
2645                        build_wdtr(acb, dcb, srb);
2646                        DC395x_ENABLE_MSGOUT;
2647                        dprintkdbg(DBG_0, "msgin_set_sync: Also try WDTR\n");
2648                }
2649        }
2650        srb->state &= ~SRB_DO_SYNC_NEGO;
2651        dcb->sync_mode |= SYNC_NEGO_DONE | SYNC_NEGO_ENABLE;
2652
2653        reprogram_regs(acb, dcb);
2654}
2655
2656
2657static inline void msgin_set_nowide(struct AdapterCtlBlk *acb,
2658                struct ScsiReqBlk *srb)
2659{
2660        struct DeviceCtlBlk *dcb = srb->dcb;
2661        dprintkdbg(DBG_1, "msgin_set_nowide: <%02i>\n", dcb->target_id);
2662
2663        dcb->sync_period &= ~WIDE_SYNC;
2664        dcb->sync_mode &= ~(WIDE_NEGO_ENABLE);
2665        dcb->sync_mode |= WIDE_NEGO_DONE;
2666        srb->state &= ~SRB_DO_WIDE_NEGO;
2667        reprogram_regs(acb, dcb);
2668        if ((dcb->sync_mode & SYNC_NEGO_ENABLE)
2669            && !(dcb->sync_mode & SYNC_NEGO_DONE)) {
2670                build_sdtr(acb, dcb, srb);
2671                DC395x_ENABLE_MSGOUT;
2672                dprintkdbg(DBG_0, "msgin_set_nowide: Rejected. Try SDTR anyway\n");
2673        }
2674}
2675
2676static void msgin_set_wide(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
2677{
2678        struct DeviceCtlBlk *dcb = srb->dcb;
2679        u8 wide = (dcb->dev_mode & NTC_DO_WIDE_NEGO
2680                   && acb->config & HCC_WIDE_CARD) ? 1 : 0;
2681        dprintkdbg(DBG_1, "msgin_set_wide: <%02i>\n", dcb->target_id);
2682
2683        if (srb->msgin_buf[3] > wide)
2684                srb->msgin_buf[3] = wide;
2685        /* Completed */
2686        if (!(srb->state & SRB_DO_WIDE_NEGO)) {
2687                dprintkl(KERN_DEBUG,
2688                        "msgin_set_wide: Wide nego initiated <%02i>\n",
2689                        dcb->target_id);
2690                memcpy(srb->msgout_buf, srb->msgin_buf, 4);
2691                srb->msg_count = 4;
2692                srb->state |= SRB_DO_WIDE_NEGO;
2693                DC395x_ENABLE_MSGOUT;
2694        }
2695
2696        dcb->sync_mode |= (WIDE_NEGO_ENABLE | WIDE_NEGO_DONE);
2697        if (srb->msgin_buf[3] > 0)
2698                dcb->sync_period |= WIDE_SYNC;
2699        else
2700                dcb->sync_period &= ~WIDE_SYNC;
2701        srb->state &= ~SRB_DO_WIDE_NEGO;
2702        /*dcb->sync_mode &= ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); */
2703        dprintkdbg(DBG_1,
2704                "msgin_set_wide: Wide (%i bit) negotiated <%02i>\n",
2705                (8 << srb->msgin_buf[3]), dcb->target_id);
2706        reprogram_regs(acb, dcb);
2707        if ((dcb->sync_mode & SYNC_NEGO_ENABLE)
2708            && !(dcb->sync_mode & SYNC_NEGO_DONE)) {
2709                build_sdtr(acb, dcb, srb);
2710                DC395x_ENABLE_MSGOUT;
2711                dprintkdbg(DBG_0, "msgin_set_wide: Also try SDTR.\n");
2712        }
2713}
2714
2715
2716/*
2717 * extended message codes:
2718 *
2719 *      code    description
2720 *
2721 *      02h     Reserved
2722 *      00h     MODIFY DATA  POINTER
2723 *      01h     SYNCHRONOUS DATA TRANSFER REQUEST
2724 *      03h     WIDE DATA TRANSFER REQUEST
2725 *   04h - 7Fh  Reserved
2726 *   80h - FFh  Vendor specific
2727 */
2728static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2729                u16 *pscsi_status)
2730{
2731        struct DeviceCtlBlk *dcb = acb->active_dcb;
2732        dprintkdbg(DBG_0, "msgin_phase0: (0x%p)\n", srb->cmd);
2733
2734        srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2735        if (msgin_completed(srb->msgin_buf, acb->msg_len)) {
2736                /* Now eval the msg */
2737                switch (srb->msgin_buf[0]) {
2738                case DISCONNECT:
2739                        srb->state = SRB_DISCONNECT;
2740                        break;
2741
2742                case SIMPLE_QUEUE_TAG:
2743                case HEAD_OF_QUEUE_TAG:
2744                case ORDERED_QUEUE_TAG:
2745                        srb =
2746                            msgin_qtag(acb, dcb,
2747                                              srb->msgin_buf[1]);
2748                        break;
2749
2750                case MESSAGE_REJECT:
2751                        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL,
2752                                       DO_CLRATN | DO_DATALATCH);
2753                        /* A sync nego message was rejected ! */
2754                        if (srb->state & SRB_DO_SYNC_NEGO) {
2755                                msgin_set_async(acb, srb);
2756                                break;
2757                        }
2758                        /* A wide nego message was rejected ! */
2759                        if (srb->state & SRB_DO_WIDE_NEGO) {
2760                                msgin_set_nowide(acb, srb);
2761                                break;
2762                        }
2763                        enable_msgout_abort(acb, srb);
2764                        /*srb->state |= SRB_ABORT_SENT */
2765                        break;
2766
2767                case EXTENDED_MESSAGE:
2768                        /* SDTR */
2769                        if (srb->msgin_buf[1] == 3
2770                            && srb->msgin_buf[2] == EXTENDED_SDTR) {
2771                                msgin_set_sync(acb, srb);
2772                                break;
2773                        }
2774                        /* WDTR */
2775                        if (srb->msgin_buf[1] == 2
2776                            && srb->msgin_buf[2] == EXTENDED_WDTR
2777                            && srb->msgin_buf[3] <= 2) { /* sanity check ... */
2778                                msgin_set_wide(acb, srb);
2779                                break;
2780                        }
2781                        msgin_reject(acb, srb);
2782                        break;
2783
2784                case MSG_IGNOREWIDE:
2785                        /* Discard  wide residual */
2786                        dprintkdbg(DBG_0, "msgin_phase0: Ignore Wide Residual!\n");
2787                        break;
2788
2789                case COMMAND_COMPLETE:
2790                        /* nothing has to be done */
2791                        break;
2792
2793                case SAVE_POINTERS:
2794                        /*
2795                         * SAVE POINTER may be ignored as we have the struct
2796                         * ScsiReqBlk* associated with the scsi command.
2797                         */
2798                        dprintkdbg(DBG_0, "msgin_phase0: (0x%p) "
2799                                "SAVE POINTER rem=%i Ignore\n",
2800                                srb->cmd, srb->total_xfer_length);
2801                        break;
2802
2803                case RESTORE_POINTERS:
2804                        dprintkdbg(DBG_0, "msgin_phase0: RESTORE POINTER. Ignore\n");
2805                        break;
2806
2807                case ABORT:
2808                        dprintkdbg(DBG_0, "msgin_phase0: (0x%p) "
2809                                "<%02i-%i> ABORT msg\n",
2810                                srb->cmd, dcb->target_id,
2811                                dcb->target_lun);
2812                        dcb->flag |= ABORT_DEV_;
2813                        enable_msgout_abort(acb, srb);
2814                        break;
2815
2816                default:
2817                        /* reject unknown messages */
2818                        if (srb->msgin_buf[0] & IDENTIFY_BASE) {
2819                                dprintkdbg(DBG_0, "msgin_phase0: Identify msg\n");
2820                                srb->msg_count = 1;
2821                                srb->msgout_buf[0] = dcb->identify_msg;
2822                                DC395x_ENABLE_MSGOUT;
2823                                srb->state |= SRB_MSGOUT;
2824                                /*break; */
2825                        }
2826                        msgin_reject(acb, srb);
2827                }
2828
2829                /* Clear counter and MsgIn state */
2830                srb->state &= ~SRB_MSGIN;
2831                acb->msg_len = 0;
2832        }
2833        *pscsi_status = PH_BUS_FREE;
2834        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important ... you know! */
2835        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT);
2836}
2837
2838
2839static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2840                u16 *pscsi_status)
2841{
2842        dprintkdbg(DBG_0, "msgin_phase1: (0x%p)\n", srb->cmd);
2843        clear_fifo(acb, "msgin_phase1");
2844        DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1);
2845        if (!(srb->state & SRB_MSGIN)) {
2846                srb->state &= ~SRB_DISCONNECT;
2847                srb->state |= SRB_MSGIN;
2848        }
2849        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
2850        /* SCSI command */
2851        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_IN);
2852}
2853
2854
2855static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2856                u16 *pscsi_status)
2857{
2858}
2859
2860
2861static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2862                u16 *pscsi_status)
2863{
2864}
2865
2866
2867static void set_xfer_rate(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb)
2868{
2869        struct DeviceCtlBlk *i;
2870
2871        /* set all lun device's  period, offset */
2872        if (dcb->identify_msg & 0x07)
2873                return;
2874
2875        if (acb->scan_devices) {
2876                current_sync_offset = dcb->sync_offset;
2877                return;
2878        }
2879
2880        list_for_each_entry(i, &acb->dcb_list, list)
2881                if (i->target_id == dcb->target_id) {
2882                        i->sync_period = dcb->sync_period;
2883                        i->sync_offset = dcb->sync_offset;
2884                        i->sync_mode = dcb->sync_mode;
2885                        i->min_nego_period = dcb->min_nego_period;
2886                }
2887}
2888
2889
2890static void disconnect(struct AdapterCtlBlk *acb)
2891{
2892        struct DeviceCtlBlk *dcb = acb->active_dcb;
2893        struct ScsiReqBlk *srb;
2894
2895        if (!dcb) {
2896                dprintkl(KERN_ERR, "disconnect: No such device\n");
2897                udelay(500);
2898                /* Suspend queue for a while */
2899                acb->last_reset =
2900                    jiffies + HZ / 2 +
2901                    HZ * acb->eeprom.delay_time;
2902                clear_fifo(acb, "disconnectEx");
2903                DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT);
2904                return;
2905        }
2906        srb = dcb->active_srb;
2907        acb->active_dcb = NULL;
2908        dprintkdbg(DBG_0, "disconnect: (0x%p)\n", srb->cmd);
2909
2910        srb->scsi_phase = PH_BUS_FREE;  /* initial phase */
2911        clear_fifo(acb, "disconnect");
2912        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT);
2913        if (srb->state & SRB_UNEXPECT_RESEL) {
2914                dprintkl(KERN_ERR,
2915                        "disconnect: Unexpected reselection <%02i-%i>\n",
2916                        dcb->target_id, dcb->target_lun);
2917                srb->state = 0;
2918                waiting_process_next(acb);
2919        } else if (srb->state & SRB_ABORT_SENT) {
2920                dcb->flag &= ~ABORT_DEV_;
2921                acb->last_reset = jiffies + HZ / 2 + 1;
2922                dprintkl(KERN_ERR, "disconnect: SRB_ABORT_SENT\n");
2923                doing_srb_done(acb, DID_ABORT, srb->cmd, 1);
2924                waiting_process_next(acb);
2925        } else {
2926                if ((srb->state & (SRB_START_ + SRB_MSGOUT))
2927                    || !(srb->
2928                         state & (SRB_DISCONNECT + SRB_COMPLETED))) {
2929                        /*
2930                         * Selection time out 
2931                         * SRB_START_ || SRB_MSGOUT || (!SRB_DISCONNECT && !SRB_COMPLETED)
2932                         */
2933                        /* Unexp. Disc / Sel Timeout */
2934                        if (srb->state != SRB_START_
2935                            && srb->state != SRB_MSGOUT) {
2936                                srb->state = SRB_READY;
2937                                dprintkl(KERN_DEBUG,
2938                                        "disconnect: (0x%p) Unexpected\n",
2939                                        srb->cmd);
2940                                srb->target_status = SCSI_STAT_SEL_TIMEOUT;
2941                                goto disc1;
2942                        } else {
2943                                /* Normal selection timeout */
2944                                dprintkdbg(DBG_KG, "disconnect: (0x%p) "
2945                                        "<%02i-%i> SelTO\n", srb->cmd,
2946                                        dcb->target_id, dcb->target_lun);
2947                                if (srb->retry_count++ > DC395x_MAX_RETRIES
2948                                    || acb->scan_devices) {
2949                                        srb->target_status =
2950                                            SCSI_STAT_SEL_TIMEOUT;
2951                                        goto disc1;
2952                                }
2953                                free_tag(dcb, srb);
2954                                list_move(&srb->list, &dcb->srb_waiting_list);
2955                                dprintkdbg(DBG_KG,
2956                                        "disconnect: (0x%p) Retry\n",
2957                                        srb->cmd);
2958                                waiting_set_timer(acb, HZ / 20);
2959                        }
2960                } else if (srb->state & SRB_DISCONNECT) {
2961                        u8 bval = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL);
2962                        /*
2963                         * SRB_DISCONNECT (This is what we expect!)
2964                         */
2965                        if (bval & 0x40) {
2966                                dprintkdbg(DBG_0, "disconnect: SCSI bus stat "
2967                                        " 0x%02x: ACK set! Other controllers?\n",
2968                                        bval);
2969                                /* It could come from another initiator, therefore don't do much ! */
2970                        } else
2971                                waiting_process_next(acb);
2972                } else if (srb->state & SRB_COMPLETED) {
2973                      disc1:
2974                        /*
2975                         ** SRB_COMPLETED
2976                         */
2977                        free_tag(dcb, srb);
2978                        dcb->active_srb = NULL;
2979                        srb->state = SRB_FREE;
2980                        srb_done(acb, dcb, srb);
2981                }
2982        }
2983}
2984
2985
2986static void reselect(struct AdapterCtlBlk *acb)
2987{
2988        struct DeviceCtlBlk *dcb = acb->active_dcb;
2989        struct ScsiReqBlk *srb = NULL;
2990        u16 rsel_tar_lun_id;
2991        u8 id, lun;
2992        u8 arblostflag = 0;
2993        dprintkdbg(DBG_0, "reselect: acb=%p\n", acb);
2994
2995        clear_fifo(acb, "reselect");
2996        /*DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT | DO_DATALATCH); */
2997        /* Read Reselected Target ID and LUN */
2998        rsel_tar_lun_id = DC395x_read16(acb, TRM_S1040_SCSI_TARGETID);
2999        if (dcb) {              /* Arbitration lost but Reselection win */
3000                srb = dcb->active_srb;
3001                if (!srb) {
3002                        dprintkl(KERN_DEBUG, "reselect: Arb lost Resel won, "
3003                                "but active_srb == NULL\n");
3004                        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
3005                        return;
3006                }
3007                /* Why the if ? */
3008                if (!acb->scan_devices) {
3009                        dprintkdbg(DBG_KG, "reselect: (0x%p) <%02i-%i> "
3010                                "Arb lost but Resel win rsel=%i stat=0x%04x\n",
3011                                srb->cmd, dcb->target_id,
3012                                dcb->target_lun, rsel_tar_lun_id,
3013                                DC395x_read16(acb, TRM_S1040_SCSI_STATUS));
3014                        arblostflag = 1;
3015                        /*srb->state |= SRB_DISCONNECT; */
3016
3017                        srb->state = SRB_READY;
3018                        free_tag(dcb, srb);
3019                        list_move(&srb->list, &dcb->srb_waiting_list);
3020                        waiting_set_timer(acb, HZ / 20);
3021
3022                        /* return; */
3023                }
3024        }
3025        /* Read Reselected Target Id and LUN */
3026        if (!(rsel_tar_lun_id & (IDENTIFY_BASE << 8)))
3027                dprintkl(KERN_DEBUG, "reselect: Expects identify msg. "
3028                        "Got %i!\n", rsel_tar_lun_id);
3029        id = rsel_tar_lun_id & 0xff;
3030        lun = (rsel_tar_lun_id >> 8) & 7;
3031        dcb = find_dcb(acb, id, lun);
3032        if (!dcb) {
3033                dprintkl(KERN_ERR, "reselect: From non existent device "
3034                        "<%02i-%i>\n", id, lun);
3035                DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);      /* it's important for atn stop */
3036                return;
3037        }
3038        acb->active_dcb = dcb;
3039
3040        if (!(dcb->dev_mode & NTC_DO_DISCONNECT))
3041                dprintkl(KERN_DEBUG, "reselect: in spite of forbidden "
3042                        "disconnection? <%02i-%i>\n",
3043                        dcb->target_id, dcb->target_lun);
3044
3045        if (dcb->sync_mode & EN_TAG_QUEUEING /*&& !arblostflag */) {
3046                srb = acb->tmp_srb;
3047                dcb->active_srb = srb;
3048        } else {
3049                /* There can be only one! */
3050                srb = dcb->active_srb;
3051                if (!srb || !(srb->state & SRB_DISCONNECT)) {
3052                        /*
3053                         * abort command
3054                         */
3055                        dprintkl(KERN_DEBUG,
3056                                "reselect: w/o disconnected cmds <%02i-%i>\n",
3057                                dcb->target_id, dcb->target_lun);
3058                        srb = acb->tmp_srb;
3059                        srb->state = SRB_UNEXPECT_RESEL;
3060                        dcb->active_srb = srb;
3061                        enable_msgout_abort(acb, srb);
3062                } else {
3063                        if (dcb->flag & ABORT_DEV_) {
3064                                /*srb->state = SRB_ABORT_SENT; */
3065                                enable_msgout_abort(acb, srb);
3066                        } else
3067                                srb->state = SRB_DATA_XFER;
3068
3069                }
3070        }
3071        srb->scsi_phase = PH_BUS_FREE;  /* initial phase */
3072
3073        /* Program HA ID, target ID, period and offset */
3074        dprintkdbg(DBG_0, "reselect: select <%i>\n", dcb->target_id);
3075        DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id);     /* host   ID */
3076        DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id);            /* target ID */
3077        DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset);            /* offset    */
3078        DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period);              /* sync period, wide */
3079        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);              /* it's important for atn stop */
3080        /* SCSI command */
3081        DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT);
3082}
3083
3084
3085static inline u8 tagq_blacklist(char *name)
3086{
3087#ifndef DC395x_NO_TAGQ
3088#if 0
3089        u8 i;
3090        for (i = 0; i < BADDEVCNT; i++)
3091                if (memcmp(name, DC395x_baddevname1[i], 28) == 0)
3092                        return 1;
3093#endif
3094        return 0;
3095#else
3096        return 1;
3097#endif
3098}
3099
3100
3101static void disc_tagq_set(struct DeviceCtlBlk *dcb, struct ScsiInqData *ptr)
3102{
3103        /* Check for SCSI format (ANSI and Response data format) */
3104        if ((ptr->Vers & 0x07) >= 2 || (ptr->RDF & 0x0F) == 2) {
3105                if ((ptr->Flags & SCSI_INQ_CMDQUEUE)
3106                    && (dcb->dev_mode & NTC_DO_TAG_QUEUEING) &&
3107                    /*(dcb->dev_mode & NTC_DO_DISCONNECT) */
3108                    /* ((dcb->dev_type == TYPE_DISK) 
3109                       || (dcb->dev_type == TYPE_MOD)) && */
3110                    !tagq_blacklist(((char *)ptr) + 8)) {
3111                        if (dcb->max_command == 1)
3112                                dcb->max_command =
3113                                    dcb->acb->tag_max_num;
3114                        dcb->sync_mode |= EN_TAG_QUEUEING;
3115                        /*dcb->tag_mask = 0; */
3116                } else
3117                        dcb->max_command = 1;
3118        }
3119}
3120
3121
3122static void add_dev(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
3123                struct ScsiInqData *ptr)
3124{
3125        u8 bval1 = ptr->DevType & SCSI_DEVTYPE;
3126        dcb->dev_type = bval1;
3127        /* if (bval1 == TYPE_DISK || bval1 == TYPE_MOD) */
3128        disc_tagq_set(dcb, ptr);
3129}
3130
3131
3132/* unmap mapped pci regions from SRB */
3133static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
3134{
3135        struct scsi_cmnd *cmd = srb->cmd;
3136        enum dma_data_direction dir = cmd->sc_data_direction;
3137
3138        if (scsi_sg_count(cmd) && dir != PCI_DMA_NONE) {
3139                /* unmap DC395x SG list */
3140                dprintkdbg(DBG_SG, "pci_unmap_srb: list=%08x(%05x)\n",
3141                        srb->sg_bus_addr, SEGMENTX_LEN);
3142                dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN,
3143                                DMA_TO_DEVICE);
3144                dprintkdbg(DBG_SG, "pci_unmap_srb: segs=%i buffer=%p\n",
3145                           scsi_sg_count(cmd), scsi_bufflen(cmd));
3146                /* unmap the sg segments */
3147                scsi_dma_unmap(cmd);
3148        }
3149}
3150
3151
3152/* unmap mapped pci sense buffer from SRB */
3153static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb,
3154                struct ScsiReqBlk *srb)
3155{
3156        if (!(srb->flag & AUTO_REQSENSE))
3157                return;
3158        /* Unmap sense buffer */
3159        dprintkdbg(DBG_SG, "pci_unmap_srb_sense: buffer=%08x\n",
3160               srb->segment_x[0].address);
3161        dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address,
3162                         srb->segment_x[0].length, DMA_FROM_DEVICE);
3163        /* Restore SG stuff */
3164        srb->total_xfer_length = srb->xferred;
3165        srb->segment_x[0].address =
3166            srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address;
3167        srb->segment_x[0].length =
3168            srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length;
3169}
3170
3171
3172/*
3173 * Complete execution of a SCSI command
3174 * Signal completion to the generic SCSI driver  
3175 */
3176static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
3177                struct ScsiReqBlk *srb)
3178{
3179        u8 tempcnt, status;
3180        struct scsi_cmnd *cmd = srb->cmd;
3181        enum dma_data_direction dir = cmd->sc_data_direction;
3182        int ckc_only = 1;
3183
3184        dprintkdbg(DBG_1, "srb_done: (0x%p) <%02i-%i>\n", srb->cmd,
3185                srb->cmd->device->id, (u8)srb->cmd->device->lun);
3186        dprintkdbg(DBG_SG, "srb_done: srb=%p sg=%i(%i/%i) buf=%p\n",
3187                   srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count,
3188                   scsi_sgtalbe(cmd));
3189        status = srb->target_status;
3190        if (srb->flag & AUTO_REQSENSE) {
3191                dprintkdbg(DBG_0, "srb_done: AUTO_REQSENSE1\n");
3192                pci_unmap_srb_sense(acb, srb);
3193                /*
3194                 ** target status..........................
3195                 */
3196                srb->flag &= ~AUTO_REQSENSE;
3197                srb->adapter_status = 0;
3198                srb->target_status = CHECK_CONDITION << 1;
3199                if (debug_enabled(DBG_1)) {
3200                        switch (cmd->sense_buffer[2] & 0x0f) {
3201                        case NOT_READY:
3202                                dprintkl(KERN_DEBUG,
3203                                     "ReqSense: NOT_READY cmnd=0x%02x <%02i-%i> stat=%i scan=%i ",
3204                                     cmd->cmnd[0], dcb->target_id,
3205                                     dcb->target_lun, status, acb->scan_devices);
3206                                break;
3207                        case UNIT_ATTENTION:
3208                                dprintkl(KERN_DEBUG,
3209                                     "ReqSense: UNIT_ATTENTION cmnd=0x%02x <%02i-%i> stat=%i scan=%i ",
3210                                     cmd->cmnd[0], dcb->target_id,
3211                                     dcb->target_lun, status, acb->scan_devices);
3212                                break;
3213                        case ILLEGAL_REQUEST:
3214                                dprintkl(KERN_DEBUG,
3215                                     "ReqSense: ILLEGAL_REQUEST cmnd=0x%02x <%02i-%i> stat=%i scan=%i ",
3216                                     cmd->cmnd[0], dcb->target_id,
3217                                     dcb->target_lun, status, acb->scan_devices);
3218                                break;
3219                        case MEDIUM_ERROR:
3220                                dprintkl(KERN_DEBUG,
3221                                     "ReqSense: MEDIUM_ERROR cmnd=0x%02x <%02i-%i> stat=%i scan=%i ",
3222                                     cmd->cmnd[0], dcb->target_id,
3223                                     dcb->target_lun, status, acb->scan_devices);
3224                                break;
3225                        case HARDWARE_ERROR:
3226                                dprintkl(KERN_DEBUG,
3227                                     "ReqSense: HARDWARE_ERROR cmnd=0x%02x <%02i-%i> stat=%i scan=%i ",
3228                                     cmd->cmnd[0], dcb->target_id,
3229                                     dcb->target_lun, status, acb->scan_devices);
3230                                break;
3231                        }
3232                        if (cmd->sense_buffer[7] >= 6)
3233                                printk("sense=0x%02x ASC=0x%02x ASCQ=0x%02x "
3234                                        "(0x%08x 0x%08x)\n",
3235                                        cmd->sense_buffer[2], cmd->sense_buffer[12],
3236                                        cmd->sense_buffer[13],
3237                                        *((unsigned int *)(cmd->sense_buffer + 3)),
3238                                        *((unsigned int *)(cmd->sense_buffer + 8)));
3239                        else
3240                                printk("sense=0x%02x No ASC/ASCQ (0x%08x)\n",
3241                                        cmd->sense_buffer[2],
3242                                        *((unsigned int *)(cmd->sense_buffer + 3)));
3243                }
3244
3245                if (status == (CHECK_CONDITION << 1)) {
3246                        cmd->result = DID_BAD_TARGET << 16;
3247                        goto ckc_e;
3248                }
3249                dprintkdbg(DBG_0, "srb_done: AUTO_REQSENSE2\n");
3250
3251                if (srb->total_xfer_length
3252                    && srb->total_xfer_length >= cmd->underflow)
3253                        cmd->result =
3254                            MK_RES_LNX(DRIVER_SENSE, DID_OK,
3255                                       srb->end_message, CHECK_CONDITION);
3256                /*SET_RES_DID(cmd->result,DID_OK) */
3257                else
3258                        cmd->result =
3259                            MK_RES_LNX(DRIVER_SENSE, DID_OK,
3260                                       srb->end_message, CHECK_CONDITION);
3261
3262                goto ckc_e;
3263        }
3264
3265/*************************************************************/
3266        if (status) {
3267                /*
3268                 * target status..........................
3269                 */
3270                if (status_byte(status) == CHECK_CONDITION) {
3271                        request_sense(acb, dcb, srb);
3272                        return;
3273                } else if (status_byte(status) == QUEUE_FULL) {
3274                        tempcnt = (u8)list_size(&dcb->srb_going_list);
3275                        dprintkl(KERN_INFO, "QUEUE_FULL for dev <%02i-%i> with %i cmnds\n",
3276                             dcb->target_id, dcb->target_lun, tempcnt);
3277                        if (tempcnt > 1)
3278                                tempcnt--;
3279                        dcb->max_command = tempcnt;
3280                        free_tag(dcb, srb);
3281                        list_move(&srb->list, &dcb->srb_waiting_list);
3282                        waiting_set_timer(acb, HZ / 20);
3283                        srb->adapter_status = 0;
3284                        srb->target_status = 0;
3285                        return;
3286                } else if (status == SCSI_STAT_SEL_TIMEOUT) {
3287                        srb->adapter_status = H_SEL_TIMEOUT;
3288                        srb->target_status = 0;
3289                        cmd->result = DID_NO_CONNECT << 16;
3290                } else {
3291                        srb->adapter_status = 0;
3292                        SET_RES_DID(cmd->result, DID_ERROR);
3293                        SET_RES_MSG(cmd->result, srb->end_message);
3294                        SET_RES_TARGET(cmd->result, status);
3295
3296                }
3297        } else {
3298                /*
3299                 ** process initiator status..........................
3300                 */
3301                status = srb->adapter_status;
3302                if (status & H_OVER_UNDER_RUN) {
3303                        srb->target_status = 0;
3304                        SET_RES_DID(cmd->result, DID_OK);
3305                        SET_RES_MSG(cmd->result, srb->end_message);
3306                } else if (srb->status & PARITY_ERROR) {
3307                        SET_RES_DID(cmd->result, DID_PARITY);
3308                        SET_RES_MSG(cmd->result, srb->end_message);
3309                } else {        /* No error */
3310
3311                        srb->adapter_status = 0;
3312                        srb->target_status = 0;
3313                        SET_RES_DID(cmd->result, DID_OK);
3314                }
3315        }
3316
3317        ckc_only = 0;
3318/* Check Error Conditions */
3319      ckc_e:
3320
3321        pci_unmap_srb(acb, srb);
3322
3323        if (cmd->cmnd[0] == INQUIRY) {
3324                unsigned char *base = NULL;
3325                struct ScsiInqData *ptr;
3326                unsigned long flags = 0;
3327                struct scatterlist* sg = scsi_sglist(cmd);
3328                size_t offset = 0, len = sizeof(struct ScsiInqData);
3329
3330                local_irq_save(flags);
3331                base = scsi_kmap_atomic_sg(sg, scsi_sg_count(cmd), &offset, &len);
3332                ptr = (struct ScsiInqData *)(base + offset);
3333
3334                if (!ckc_only && (cmd->result & RES_DID) == 0
3335                    && cmd->cmnd[2] == 0 && scsi_bufflen(cmd) >= 8
3336                    && dir != PCI_DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2)
3337                        dcb->inquiry7 = ptr->Flags;
3338
3339        /*if( srb->cmd->cmnd[0] == INQUIRY && */
3340        /*  (host_byte(cmd->result) == DID_OK || status_byte(cmd->result) & CHECK_CONDITION) ) */
3341                if ((cmd->result == (DID_OK << 16) ||
3342                     status_byte(cmd->result) == CHECK_CONDITION)) {
3343                        if (!dcb->init_tcq_flag) {
3344                                add_dev(acb, dcb, ptr);
3345                                dcb->init_tcq_flag = 1;
3346                        }
3347                }
3348
3349                scsi_kunmap_atomic_sg(base);
3350                local_irq_restore(flags);
3351        }
3352
3353        /* Here is the info for Doug Gilbert's sg3 ... */
3354        scsi_set_resid(cmd, srb->total_xfer_length);
3355        /* This may be interpreted by sb. or not ... */
3356        cmd->SCp.this_residual = srb->total_xfer_length;
3357        cmd->SCp.buffers_residual = 0;
3358        if (debug_enabled(DBG_KG)) {
3359                if (srb->total_xfer_length)
3360                        dprintkdbg(DBG_KG, "srb_done: (0x%p) <%02i-%i> "
3361                                "cmnd=0x%02x Missed %i bytes\n",
3362                                cmd, cmd->device->id, (u8)cmd->device->lun,
3363                                cmd->cmnd[0], srb->total_xfer_length);
3364        }
3365
3366        if (srb != acb->tmp_srb) {
3367                /* Add to free list */
3368                dprintkdbg(DBG_0, "srb_done: (0x%p) done result=0x%08x\n",
3369                        cmd, cmd->result);
3370                list_move_tail(&srb->list, &acb->srb_free_list);
3371        } else {
3372                dprintkl(KERN_ERR, "srb_done: ERROR! Completed cmd with tmp_srb\n");
3373        }
3374
3375        cmd->scsi_done(cmd);
3376        waiting_process_next(acb);
3377}
3378
3379
3380/* abort all cmds in our queues */
3381static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag,
3382                struct scsi_cmnd *cmd, u8 force)
3383{
3384        struct DeviceCtlBlk *dcb;
3385        dprintkl(KERN_INFO, "doing_srb_done: pids ");
3386
3387        list_for_each_entry(dcb, &acb->dcb_list, list) {
3388                struct ScsiReqBlk *srb;
3389                struct ScsiReqBlk *tmp;
3390                struct scsi_cmnd *p;
3391
3392                list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) {
3393                        enum dma_data_direction dir;
3394                        int result;
3395
3396                        p = srb->cmd;
3397                        dir = p->sc_data_direction;
3398                        result = MK_RES(0, did_flag, 0, 0);
3399                        printk("G:%p(%02i-%i) ", p,
3400                               p->device->id, (u8)p->device->lun);
3401                        list_del(&srb->list);
3402                        free_tag(dcb, srb);
3403                        list_add_tail(&srb->list, &acb->srb_free_list);
3404                        p->result = result;
3405                        pci_unmap_srb_sense(acb, srb);
3406                        pci_unmap_srb(acb, srb);
3407                        if (force) {
3408                                /* For new EH, we normally don't need to give commands back,
3409                                 * as they all complete or all time out */
3410                                p->scsi_done(p);
3411                        }
3412                }
3413                if (!list_empty(&dcb->srb_going_list))
3414                        dprintkl(KERN_DEBUG, 
3415                               "How could the ML send cmnds to the Going queue? <%02i-%i>\n",
3416                               dcb->target_id, dcb->target_lun);
3417                if (dcb->tag_mask)
3418                        dprintkl(KERN_DEBUG,
3419                               "tag_mask for <%02i-%i> should be empty, is %08x!\n",
3420                               dcb->target_id, dcb->target_lun,
3421                               dcb->tag_mask);
3422
3423                /* Waiting queue */
3424                list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) {
3425                        int result;
3426                        p = srb->cmd;
3427
3428                        result = MK_RES(0, did_flag, 0, 0);
3429                        printk("W:%p<%02i-%i>", p, p->device->id,
3430                               (u8)p->device->lun);
3431                        list_move_tail(&srb->list, &acb->srb_free_list);
3432                        p->result = result;
3433                        pci_unmap_srb_sense(acb, srb);
3434                        pci_unmap_srb(acb, srb);
3435                        if (force) {
3436                                /* For new EH, we normally don't need to give commands back,
3437                                 * as they all complete or all time out */
3438                                cmd->scsi_done(cmd);
3439                        }
3440                }
3441                if (!list_empty(&dcb->srb_waiting_list))
3442                        dprintkl(KERN_DEBUG, "ML queued %i cmnds again to <%02i-%i>\n",
3443                             list_size(&dcb->srb_waiting_list), dcb->target_id,
3444                             dcb->target_lun);
3445                dcb->flag &= ~ABORT_DEV_;
3446        }
3447        printk("\n");
3448}
3449
3450
3451static void reset_scsi_bus(struct AdapterCtlBlk *acb)
3452{
3453        dprintkdbg(DBG_0, "reset_scsi_bus: acb=%p\n", acb);
3454        acb->acb_flag |= RESET_DEV;     /* RESET_DETECT, RESET_DONE, RESET_DEV */
3455        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI);
3456
3457        while (!(DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET))
3458                /* nothing */;
3459}
3460
3461
3462static void set_basic_config(struct AdapterCtlBlk *acb)
3463{
3464        u8 bval;
3465        u16 wval;
3466        DC395x_write8(acb, TRM_S1040_SCSI_TIMEOUT, acb->sel_timeout);
3467        if (acb->config & HCC_PARITY)
3468                bval = PHASELATCH | INITIATOR | BLOCKRST | PARITYCHECK;
3469        else
3470                bval = PHASELATCH | INITIATOR | BLOCKRST;
3471
3472        DC395x_write8(acb, TRM_S1040_SCSI_CONFIG0, bval);
3473
3474        /* program configuration 1: Act_Neg (+ Act_Neg_Enh? + Fast_Filter? + DataDis?) */
3475        DC395x_write8(acb, TRM_S1040_SCSI_CONFIG1, 0x03);       /* was 0x13: default */
3476        /* program Host ID                  */
3477        DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id);
3478        /* set ansynchronous transfer       */
3479        DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, 0x00);
3480        /* Turn LED control off */
3481        wval = DC395x_read16(acb, TRM_S1040_GEN_CONTROL) & 0x7F;
3482        DC395x_write16(acb, TRM_S1040_GEN_CONTROL, wval);
3483        /* DMA config          */
3484        wval = DC395x_read16(acb, TRM_S1040_DMA_CONFIG) & ~DMA_FIFO_CTRL;
3485        wval |=
3486            DMA_FIFO_HALF_HALF | DMA_ENHANCE /*| DMA_MEM_MULTI_READ */ ;
3487        DC395x_write16(acb, TRM_S1040_DMA_CONFIG, wval);
3488        /* Clear pending interrupt status */
3489        DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS);
3490        /* Enable SCSI interrupt    */
3491        DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x7F);
3492        DC395x_write8(acb, TRM_S1040_DMA_INTEN, EN_SCSIINTR | EN_DMAXFERERROR
3493                      /*| EN_DMAXFERABORT | EN_DMAXFERCOMP | EN_FORCEDMACOMP */
3494                      );
3495}
3496
3497
3498static void scsi_reset_detect(struct AdapterCtlBlk *acb)
3499{
3500        dprintkl(KERN_INFO, "scsi_reset_detect: acb=%p\n", acb);
3501        /* delay half a second */
3502        if (timer_pending(&acb->waiting_timer))
3503                del_timer(&acb->waiting_timer);
3504
3505        DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE);
3506        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE);
3507        /*DC395x_write8(acb, TRM_S1040_DMA_CONTROL,STOPDMAXFER); */
3508        udelay(500);
3509        /* Maybe we locked up the bus? Then lets wait even longer ... */
3510        acb->last_reset =
3511            jiffies + 5 * HZ / 2 +
3512            HZ * acb->eeprom.delay_time;
3513
3514        clear_fifo(acb, "scsi_reset_detect");
3515        set_basic_config(acb);
3516        /*1.25 */
3517        /*DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); */
3518
3519        if (acb->acb_flag & RESET_DEV) {        /* RESET_DETECT, RESET_DONE, RESET_DEV */
3520                acb->acb_flag |= RESET_DONE;
3521        } else {
3522                acb->acb_flag |= RESET_DETECT;
3523                reset_dev_param(acb);
3524                doing_srb_done(acb, DID_RESET, NULL, 1);
3525                /*DC395x_RecoverSRB( acb ); */
3526                acb->active_dcb = NULL;
3527                acb->acb_flag = 0;
3528                waiting_process_next(acb);
3529        }
3530}
3531
3532
3533static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
3534                struct ScsiReqBlk *srb)
3535{
3536        struct scsi_cmnd *cmd = srb->cmd;
3537        dprintkdbg(DBG_1, "request_sense: (0x%p) <%02i-%i>\n",
3538                cmd, cmd->device->id, (u8)cmd->device->lun);
3539
3540        srb->flag |= AUTO_REQSENSE;
3541        srb->adapter_status = 0;
3542        srb->target_status = 0;
3543
3544        /* KG: Can this prevent crap sense data ? */
3545        memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
3546
3547        /* Save some data */
3548        srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address =
3549            srb->segment_x[0].address;
3550        srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length =
3551            srb->segment_x[0].length;
3552        srb->xferred = srb->total_xfer_length;
3553        /* srb->segment_x : a one entry of S/G list table */
3554        srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE;
3555        srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE;
3556        /* Map sense buffer */
3557        srb->segment_x[0].address = dma_map_single(&acb->dev->dev,
3558                        cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE,
3559                        DMA_FROM_DEVICE);
3560        dprintkdbg(DBG_SG, "request_sense: map buffer %p->%08x(%05x)\n",
3561               cmd->sense_buffer, srb->segment_x[0].address,
3562               SCSI_SENSE_BUFFERSIZE);
3563        srb->sg_count = 1;
3564        srb->sg_index = 0;
3565
3566        if (start_scsi(acb, dcb, srb)) {        /* Should only happen, if sb. else grabs the bus */
3567                dprintkl(KERN_DEBUG,
3568                        "request_sense: (0x%p) failed <%02i-%i>\n",
3569                        srb->cmd, dcb->target_id, dcb->target_lun);
3570                list_move(&srb->list, &dcb->srb_waiting_list);
3571                waiting_set_timer(acb, HZ / 100);
3572        }
3573}
3574
3575
3576/**
3577 * device_alloc - Allocate a new device instance. This create the
3578 * devices instance and sets up all the data items. The adapter
3579 * instance is required to obtain confiuration information for this
3580 * device. This does *not* add this device to the adapters device
3581 * list.
3582 *
3583 * @acb: The adapter to obtain configuration information from.
3584 * @target: The target for the new device.
3585 * @lun: The lun for the new device.
3586 *
3587 * Return the new device if successful or NULL on failure.
3588 **/
3589static struct DeviceCtlBlk *device_alloc(struct AdapterCtlBlk *acb,
3590                u8 target, u8 lun)
3591{
3592        struct NvRamType *eeprom = &acb->eeprom;
3593        u8 period_index = eeprom->target[target].period & 0x07;
3594        struct DeviceCtlBlk *dcb;
3595
3596        dcb = kmalloc(sizeof(struct DeviceCtlBlk), GFP_ATOMIC);
3597        dprintkdbg(DBG_0, "device_alloc: <%02i-%i>\n", target, lun);
3598        if (!dcb)
3599                return NULL;
3600        dcb->acb = NULL;
3601        INIT_LIST_HEAD(&dcb->srb_going_list);
3602        INIT_LIST_HEAD(&dcb->srb_waiting_list);
3603        dcb->active_srb = NULL;
3604        dcb->tag_mask = 0;
3605        dcb->max_command = 1;
3606        dcb->target_id = target;
3607        dcb->target_lun = lun;
3608        dcb->dev_mode = eeprom->target[target].cfg0;
3609#ifndef DC395x_NO_DISCONNECT
3610        dcb->identify_msg =
3611            IDENTIFY(dcb->dev_mode & NTC_DO_DISCONNECT, lun);
3612#else
3613        dcb->identify_msg = IDENTIFY(0, lun);
3614#endif
3615        dcb->inquiry7 = 0;
3616        dcb->sync_mode = 0;
3617        dcb->min_nego_period = clock_period[period_index];
3618        dcb->sync_period = 0;
3619        dcb->sync_offset = 0;
3620        dcb->flag = 0;
3621
3622#ifndef DC395x_NO_WIDE
3623        if ((dcb->dev_mode & NTC_DO_WIDE_NEGO)
3624            && (acb->config & HCC_WIDE_CARD))
3625                dcb->sync_mode |= WIDE_NEGO_ENABLE;
3626#endif
3627#ifndef DC395x_NO_SYNC
3628        if (dcb->dev_mode & NTC_DO_SYNC_NEGO)
3629                if (!(lun) || current_sync_offset)
3630                        dcb->sync_mode |= SYNC_NEGO_ENABLE;
3631#endif
3632        if (dcb->target_lun != 0) {
3633                /* Copy settings */
3634                struct DeviceCtlBlk *p;
3635                list_for_each_entry(p, &acb->dcb_list, list)
3636                        if (p->target_id == dcb->target_id)
3637                                break;
3638                dprintkdbg(DBG_1, 
3639                       "device_alloc: <%02i-%i> copy from <%02i-%i>\n",
3640                       dcb->target_id, dcb->target_lun,
3641                       p->target_id, p->target_lun);
3642                dcb->sync_mode = p->sync_mode;
3643                dcb->sync_period = p->sync_period;
3644                dcb->min_nego_period = p->min_nego_period;
3645                dcb->sync_offset = p->sync_offset;
3646                dcb->inquiry7 = p->inquiry7;
3647        }
3648        return dcb;
3649}
3650
3651
3652/**
3653 * adapter_add_device - Adds the device instance to the adaptor instance.
3654 *
3655 * @acb: The adapter device to be updated
3656 * @dcb: A newly created and initialised device instance to add.
3657 **/
3658static void adapter_add_device(struct AdapterCtlBlk *acb,
3659                struct DeviceCtlBlk *dcb)
3660{
3661        /* backpointer to adapter */
3662        dcb->acb = acb;
3663        
3664        /* set run_robin to this device if it is currently empty */
3665        if (list_empty(&acb->dcb_list))
3666                acb->dcb_run_robin = dcb;
3667
3668        /* add device to list */
3669        list_add_tail(&dcb->list, &acb->dcb_list);
3670
3671        /* update device maps */
3672        acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun);
3673        acb->children[dcb->target_id][dcb->target_lun] = dcb;
3674}
3675
3676
3677/**
3678 * adapter_remove_device - Removes the device instance from the adaptor
3679 * instance. The device instance is not check in any way or freed by this. 
3680 * The caller is expected to take care of that. This will simply remove the
3681 * device from the adapters data strcutures.
3682 *
3683 * @acb: The adapter device to be updated
3684 * @dcb: A device that has previously been added to the adapter.
3685 **/
3686static void adapter_remove_device(struct AdapterCtlBlk *acb,
3687                struct DeviceCtlBlk *dcb)
3688{
3689        struct DeviceCtlBlk *i;
3690        struct DeviceCtlBlk *tmp;
3691        dprintkdbg(DBG_0, "adapter_remove_device: <%02i-%i>\n",
3692                dcb->target_id, dcb->target_lun);
3693
3694        /* fix up any pointers to this device that we have in the adapter */
3695        if (acb->active_dcb == dcb)
3696                acb->active_dcb = NULL;
3697        if (acb->dcb_run_robin == dcb)
3698                acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb);
3699
3700        /* unlink from list */
3701        list_for_each_entry_safe(i, tmp, &acb->dcb_list, list)
3702                if (dcb == i) {
3703                        list_del(&i->list);
3704                        break;
3705                }
3706
3707        /* clear map and children */    
3708        acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun);
3709        acb->children[dcb->target_id][dcb->target_lun] = NULL;
3710        dcb->acb = NULL;
3711}
3712
3713
3714/**
3715 * adapter_remove_and_free_device - Removes a single device from the adapter
3716 * and then frees the device information.
3717 *
3718 * @acb: The adapter device to be updated
3719 * @dcb: A device that has previously been added to the adapter.
3720 */
3721static void adapter_remove_and_free_device(struct AdapterCtlBlk *acb,
3722                struct DeviceCtlBlk *dcb)
3723{
3724        if (list_size(&dcb->srb_going_list) > 1) {
3725                dprintkdbg(DBG_1, "adapter_remove_and_free_device: <%02i-%i> "
3726                           "Won't remove because of %i active requests.\n",
3727                           dcb->target_id, dcb->target_lun,
3728                           list_size(&dcb->srb_going_list));
3729                return;
3730        }
3731        adapter_remove_device(acb, dcb);
3732        kfree(dcb);
3733}
3734
3735
3736/**
3737 * adapter_remove_and_free_all_devices - Removes and frees all of the
3738 * devices associated with the specified adapter.
3739 *
3740 * @acb: The adapter from which all devices should be removed.
3741 **/
3742static void adapter_remove_and_free_all_devices(struct AdapterCtlBlk* acb)
3743{
3744        struct DeviceCtlBlk *dcb;
3745        struct DeviceCtlBlk *tmp;
3746        dprintkdbg(DBG_1, "adapter_remove_and_free_all_devices: num=%i\n",
3747                   list_size(&acb->dcb_list));
3748
3749        list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list)
3750                adapter_remove_and_free_device(acb, dcb);
3751}
3752
3753
3754/**
3755 * dc395x_slave_alloc - Called by the scsi mid layer to tell us about a new
3756 * scsi device that we need to deal with. We allocate a new device and then
3757 * insert that device into the adapters device list.
3758 *
3759 * @scsi_device: The new scsi device that we need to handle.
3760 **/
3761static int dc395x_slave_alloc(struct scsi_device *scsi_device)
3762{
3763        struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata;
3764        struct DeviceCtlBlk *dcb;
3765
3766        dcb = device_alloc(acb, scsi_device->id, scsi_device->lun);
3767        if (!dcb)
3768                return -ENOMEM;
3769        adapter_add_device(acb, dcb);
3770
3771        return 0;
3772}
3773
3774
3775/**
3776 * dc395x_slave_destroy - Called by the scsi mid layer to tell us about a
3777 * device that is going away.
3778 *
3779 * @scsi_device: The new scsi device that we need to handle.
3780 **/
3781static void dc395x_slave_destroy(struct scsi_device *scsi_device)
3782{
3783        struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata;
3784        struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun);
3785        if (dcb)
3786                adapter_remove_and_free_device(acb, dcb);
3787}
3788
3789
3790
3791
3792/**
3793 * trms1040_wait_30us: wait for 30 us
3794 *
3795 * Waits for 30us (using the chip by the looks of it..)
3796 *
3797 * @io_port: base I/O address
3798 **/
3799static void trms1040_wait_30us(unsigned long io_port)
3800{
3801        /* ScsiPortStallExecution(30); wait 30 us */
3802        outb(5, io_port + TRM_S1040_GEN_TIMER);
3803        while (!(inb(io_port + TRM_S1040_GEN_STATUS) & GTIMEOUT))
3804                /* nothing */ ;
3805}
3806
3807
3808/**
3809 * trms1040_write_cmd - write the secified command and address to
3810 * chip
3811 *
3812 * @io_port:    base I/O address
3813 * @cmd:        SB + op code (command) to send
3814 * @addr:       address to send
3815 **/
3816static void trms1040_write_cmd(unsigned long io_port, u8 cmd, u8 addr)
3817{
3818        int i;
3819        u8 send_data;
3820
3821        /* program SB + OP code */
3822        for (i = 0; i < 3; i++, cmd <<= 1) {
3823                send_data = NVR_SELECT;
3824                if (cmd & 0x04) /* Start from bit 2 */
3825                        send_data |= NVR_BITOUT;
3826
3827                outb(send_data, io_port + TRM_S1040_GEN_NVRAM);
3828                trms1040_wait_30us(io_port);
3829                outb((send_data | NVR_CLOCK),
3830                     io_port + TRM_S1040_GEN_NVRAM);
3831                trms1040_wait_30us(io_port);
3832        }
3833
3834        /* send address */
3835        for (i = 0; i < 7; i++, addr <<= 1) {
3836                send_data = NVR_SELECT;
3837                if (addr & 0x40)        /* Start from bit 6 */
3838                        send_data |= NVR_BITOUT;
3839
3840                outb(send_data, io_port + TRM_S1040_GEN_NVRAM);
3841                trms1040_wait_30us(io_port);
3842                outb((send_data | NVR_CLOCK),
3843                     io_port + TRM_S1040_GEN_NVRAM);
3844                trms1040_wait_30us(io_port);
3845        }
3846        outb(NVR_SELECT, io_port + TRM_S1040_GEN_NVRAM);
3847        trms1040_wait_30us(io_port);
3848}
3849
3850
3851/**
3852 * trms1040_set_data - store a single byte in the eeprom
3853 *
3854 * Called from write all to write a single byte into the SSEEPROM
3855 * Which is done one bit at a time.
3856 *
3857 * @io_port:    base I/O address
3858 * @addr:       offset into EEPROM
3859 * @byte:       bytes to write
3860 **/
3861static void trms1040_set_data(unsigned long io_port, u8 addr, u8 byte)
3862{
3863        int i;
3864        u8 send_data;
3865
3866        /* Send write command & address */
3867        trms1040_write_cmd(io_port, 0x05, addr);
3868
3869        /* Write data */
3870        for (i = 0; i < 8; i++, byte <<= 1) {
3871                send_data = NVR_SELECT;
3872                if (byte & 0x80)        /* Start from bit 7 */
3873                        send_data |= NVR_BITOUT;
3874
3875                outb(send_data, io_port + TRM_S1040_GEN_NVRAM);
3876                trms1040_wait_30us(io_port);
3877                outb((send_data | NVR_CLOCK), io_port + TRM_S1040_GEN_NVRAM);
3878                trms1040_wait_30us(io_port);
3879        }
3880        outb(NVR_SELECT, io_port + TRM_S1040_GEN_NVRAM);
3881        trms1040_wait_30us(io_port);
3882
3883        /* Disable chip select */
3884        outb(0, io_port + TRM_S1040_GEN_NVRAM);
3885        trms1040_wait_30us(io_port);
3886
3887        outb(NVR_SELECT, io_port + TRM_S1040_GEN_NVRAM);
3888        trms1040_wait_30us(io_port);
3889
3890        /* Wait for write ready */
3891        while (1) {
3892                outb((NVR_SELECT | NVR_CLOCK), io_port + TRM_S1040_GEN_NVRAM);
3893                trms1040_wait_30us(io_port);
3894
3895                outb(NVR_SELECT, io_port + TRM_S1040_GEN_NVRAM);
3896                trms1040_wait_30us(io_port);
3897
3898                if (inb(io_port + TRM_S1040_GEN_NVRAM) & NVR_BITIN)
3899                        break;
3900        }
3901
3902        /*  Disable chip select */
3903        outb(0, io_port + TRM_S1040_GEN_NVRAM);
3904}
3905
3906
3907/**
3908 * trms1040_write_all - write 128 bytes to the eeprom
3909 *
3910 * Write the supplied 128 bytes to the chips SEEPROM
3911 *
3912 * @eeprom:     the data to write
3913 * @io_port:    the base io port
3914 **/
3915static void trms1040_write_all(struct NvRamType *eeprom, unsigned long io_port)
3916{
3917        u8 *b_eeprom = (u8 *)eeprom;
3918        u8 addr;
3919
3920        /* Enable SEEPROM */
3921        outb((inb(io_port + TRM_S1040_GEN_CONTROL) | EN_EEPROM),
3922             io_port + TRM_S1040_GEN_CONTROL);
3923
3924        /* write enable */
3925        trms1040_write_cmd(io_port, 0x04, 0xFF);
3926        outb(0, io_port + TRM_S1040_GEN_NVRAM);
3927        trms1040_wait_30us(io_port);
3928
3929        /* write */
3930        for (addr = 0; addr < 128; addr++, b_eeprom++)
3931                trms1040_set_data(io_port, addr, *b_eeprom);
3932
3933        /* write disable */
3934        trms1040_write_cmd(io_port, 0x04, 0x00);
3935        outb(0, io_port + TRM_S1040_GEN_NVRAM);
3936        trms1040_wait_30us(io_port);
3937
3938        /* Disable SEEPROM */
3939        outb((inb(io_port + TRM_S1040_GEN_CONTROL) & ~EN_EEPROM),
3940             io_port + TRM_S1040_GEN_CONTROL);
3941}
3942
3943
3944/**
3945 * trms1040_get_data - get a single byte from the eeprom
3946 *
3947 * Called from read all to read a single byte into the SSEEPROM
3948 * Which is done one bit at a time.
3949 *
3950 * @io_port:    base I/O address
3951 * @addr:       offset into SEEPROM
3952 *
3953 * Returns the byte read.
3954 **/
3955static u8 trms1040_get_data(unsigned long io_port, u8 addr)
3956{
3957        int i;
3958        u8 read_byte;
3959        u8 result = 0;
3960
3961        /* Send read command & address */
3962        trms1040_write_cmd(io_port, 0x06, addr);
3963
3964        /* read data */
3965        for (i = 0; i < 8; i++) {
3966                outb((NVR_SELECT | NVR_CLOCK), io_port + TRM_S1040_GEN_NVRAM);
3967                trms1040_wait_30us(io_port);
3968                outb(NVR_SELECT, io_port + TRM_S1040_GEN_NVRAM);
3969
3970                /* Get data bit while falling edge */
3971                read_byte = inb(io_port + TRM_S1040_GEN_NVRAM);
3972                result <<= 1;
3973                if (read_byte & NVR_BITIN)
3974                        result |= 1;
3975
3976                trms1040_wait_30us(io_port);
3977        }
3978
3979        /* Disable chip select */
3980        outb(0, io_port + TRM_S1040_GEN_NVRAM);
3981        return result;
3982}
3983
3984
3985/**
3986 * trms1040_read_all - read all bytes from the eeprom
3987 *
3988 * Read the 128 bytes from the SEEPROM.
3989 *
3990 * @eeprom:     where to store the data
3991 * @io_port:    the base io port
3992 **/
3993static void trms1040_read_all(struct NvRamType *eeprom, unsigned long io_port)
3994{
3995        u8 *b_eeprom = (u8 *)eeprom;
3996        u8 addr;
3997
3998        /* Enable SEEPROM */
3999        outb((inb(io_port + TRM_S1040_GEN_CONTROL) | EN_EEPROM),
4000             io_port + TRM_S1040_GEN_CONTROL);
4001
4002        /* read details */
4003        for (addr = 0; addr < 128; addr++, b_eeprom++)
4004                *b_eeprom = trms1040_get_data(io_port, addr);
4005
4006        /* Disable SEEPROM */
4007        outb((inb(io_port + TRM_S1040_GEN_CONTROL) & ~EN_EEPROM),
4008             io_port + TRM_S1040_GEN_CONTROL);
4009}
4010
4011
4012
4013/**
4014 * check_eeprom - get and check contents of the eeprom
4015 *
4016 * Read seeprom 128 bytes into the memory provider in eeprom.
4017 * Checks the checksum and if it's not correct it uses a set of default
4018 * values.
4019 *
4020 * @eeprom:     caller allocated strcuture to read the eeprom data into
4021 * @io_port:    io port to read from
4022 **/
4023static void check_eeprom(struct NvRamType *eeprom, unsigned long io_port)
4024{
4025        u16 *w_eeprom = (u16 *)eeprom;
4026        u16 w_addr;
4027        u16 cksum;
4028        u32 d_addr;
4029        u32 *d_eeprom;
4030
4031        trms1040_read_all(eeprom, io_port);     /* read eeprom */
4032
4033        cksum = 0;
4034        for (w_addr = 0, w_eeprom = (u16 *)eeprom; w_addr < 64;
4035             w_addr++, w_eeprom++)
4036                cksum += *w_eeprom;
4037        if (cksum != 0x1234) {
4038                /*
4039                 * Checksum is wrong.
4040                 * Load a set of defaults into the eeprom buffer
4041                 */
4042                dprintkl(KERN_WARNING,
4043                        "EEProm checksum error: using default values and options.\n");
4044                eeprom->sub_vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM;
4045                eeprom->sub_vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8);
4046                eeprom->sub_sys_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040;
4047                eeprom->sub_sys_id[1] =
4048                    (u8)(PCI_DEVICE_ID_TEKRAM_TRMS1040 >> 8);
4049                eeprom->sub_class = 0x00;
4050                eeprom->vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM;
4051                eeprom->vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8);
4052                eeprom->device_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040;
4053                eeprom->device_id[1] =
4054                    (u8)(PCI_DEVICE_ID_TEKRAM_TRMS1040 >> 8);
4055                eeprom->reserved = 0x00;
4056
4057                for (d_addr = 0, d_eeprom = (u32 *)eeprom->target;
4058                     d_addr < 16; d_addr++, d_eeprom++)
4059                        *d_eeprom = 0x00000077; /* cfg3,cfg2,period,cfg0 */
4060
4061                *d_eeprom++ = 0x04000F07;       /* max_tag,delay_time,channel_cfg,scsi_id */
4062                *d_eeprom++ = 0x00000015;       /* reserved1,boot_lun,boot_target,reserved0 */
4063                for (d_addr = 0; d_addr < 12; d_addr++, d_eeprom++)
4064                        *d_eeprom = 0x00;
4065
4066                /* Now load defaults (maybe set by boot/module params) */
4067                set_safe_settings();
4068                fix_settings();
4069                eeprom_override(eeprom);
4070
4071                eeprom->cksum = 0x00;
4072                for (w_addr = 0, cksum = 0, w_eeprom = (u16 *)eeprom;
4073                     w_addr < 63; w_addr++, w_eeprom++)
4074                        cksum += *w_eeprom;
4075
4076                *w_eeprom = 0x1234 - cksum;
4077                trms1040_write_all(eeprom, io_port);
4078                eeprom->delay_time = cfg_data[CFG_RESET_DELAY].value;
4079        } else {
4080                set_safe_settings();
4081                eeprom_index_to_delay(eeprom);
4082                eeprom_override(eeprom);
4083        }
4084}
4085
4086
4087/**
4088 * print_eeprom_settings - output the eeprom settings
4089 * to the kernel log so people can see what they were.
4090 *
4091 * @eeprom: The eeprom data strucutre to show details for.
4092 **/
4093static void print_eeprom_settings(struct NvRamType *eeprom)
4094{
4095        dprintkl(KERN_INFO, "Used settings: AdapterID=%02i, Speed=%i(%02i.%01iMHz), dev_mode=0x%02x\n",
4096                eeprom->scsi_id,
4097                eeprom->target[0].period,
4098                clock_speed[eeprom->target[0].period] / 10,
4099                clock_speed[eeprom->target[0].period] % 10,
4100                eeprom->target[0].cfg0);
4101        dprintkl(KERN_INFO, "               AdaptMode=0x%02x, Tags=%i(%02i), DelayReset=%is\n",
4102                eeprom->channel_cfg, eeprom->max_tag,
4103                1 << eeprom->max_tag, eeprom->delay_time);
4104}
4105
4106
4107/* Free SG tables */
4108static void adapter_sg_tables_free(struct AdapterCtlBlk *acb)
4109{
4110        int i;
4111        const unsigned srbs_per_page = PAGE_SIZE/SEGMENTX_LEN;
4112
4113        for (i = 0; i < DC395x_MAX_SRB_CNT; i += srbs_per_page)
4114                kfree(acb->srb_array[i].segment_x);
4115}
4116
4117
4118/*
4119 * Allocate SG tables; as we have to pci_map them, an SG list (struct SGentry*)
4120 * should never cross a page boundary */
4121static int adapter_sg_tables_alloc(struct AdapterCtlBlk *acb)
4122{
4123        const unsigned mem_needed = (DC395x_MAX_SRB_CNT+1)
4124                                    *SEGMENTX_LEN;
4125        int pages = (mem_needed+(PAGE_SIZE-1))/PAGE_SIZE;
4126        const unsigned srbs_per_page = PAGE_SIZE/SEGMENTX_LEN;
4127        int srb_idx = 0;
4128        unsigned i = 0;
4129        struct SGentry *ptr;
4130
4131        for (i = 0; i < DC395x_MAX_SRB_CNT; i++)
4132                acb->srb_array[i].segment_x = NULL;
4133
4134        dprintkdbg(DBG_1, "Allocate %i pages for SG tables\n", pages);
4135        while (pages--) {
4136                ptr = kmalloc(PAGE_SIZE, GFP_KERNEL);
4137                if (!ptr) {
4138                        adapter_sg_tables_free(acb);
4139                        return 1;
4140                }
4141                dprintkdbg(DBG_1, "Allocate %li bytes at %p for SG segments %i\n",
4142                        PAGE_SIZE, ptr, srb_idx);
4143                i = 0;
4144                while (i < srbs_per_page && srb_idx < DC395x_MAX_SRB_CNT)
4145                        acb->srb_array[srb_idx++].segment_x =
4146                            ptr + (i++ * DC395x_MAX_SG_LISTENTRY);
4147        }
4148        if (i < srbs_per_page)
4149                acb->srb.segment_x =
4150                    ptr + (i * DC395x_MAX_SG_LISTENTRY);
4151        else
4152                dprintkl(KERN_DEBUG, "No space for tmsrb SG table reserved?!\n");
4153        return 0;
4154}
4155
4156
4157
4158/**
4159 * adapter_print_config - print adapter connection and termination
4160 * config
4161 *
4162 * The io port in the adapter needs to have been set before calling
4163 * this function.
4164 *
4165 * @acb: The adapter to print the information for.
4166 **/
4167static void adapter_print_config(struct AdapterCtlBlk *acb)
4168{
4169        u8 bval;
4170
4171        bval = DC395x_read8(acb, TRM_S1040_GEN_STATUS);
4172        dprintkl(KERN_INFO, "%sConnectors: ",
4173                ((bval & WIDESCSI) ? "(Wide) " : ""));
4174        if (!(bval & CON5068))
4175                printk("ext%s ", !(bval & EXT68HIGH) ? "68" : "50");
4176        if (!(bval & CON68))
4177                printk("int68%s ", !(bval & INT68HIGH) ? "" : "(50)");
4178        if (!(bval & CON50))
4179                printk("int50 ");
4180        if ((bval & (CON5068 | CON50 | CON68)) ==
4181            0 /*(CON5068 | CON50 | CON68) */ )
4182                printk(" Oops! (All 3?) ");
4183        bval = DC395x_read8(acb, TRM_S1040_GEN_CONTROL);
4184        printk(" Termination: ");
4185        if (bval & DIS_TERM)
4186                printk("Disabled\n");
4187        else {
4188                if (bval & AUTOTERM)
4189                        printk("Auto ");
4190                if (bval & LOW8TERM)
4191                        printk("Low ");
4192                if (bval & UP8TERM)
4193                        printk("High ");
4194                printk("\n");
4195        }
4196}
4197
4198
4199/**
4200 * adapter_init_params - Initialize the various parameters in the
4201 * adapter structure. Note that the pointer to the scsi_host is set
4202 * early (when this instance is created) and the io_port and irq
4203 * values are set later after they have been reserved. This just gets
4204 * everything set to a good starting position.
4205 *
4206 * The eeprom structure in the adapter needs to have been set before
4207 * calling this function.
4208 *
4209 * @acb: The adapter to initialize.
4210 **/
4211static void adapter_init_params(struct AdapterCtlBlk *acb)
4212{
4213        struct NvRamType *eeprom = &acb->eeprom;
4214        int i;
4215
4216        /* NOTE: acb->scsi_host is set at scsi_host/acb creation time */
4217        /* NOTE: acb->io_port_base is set at port registration time */
4218        /* NOTE: acb->io_port_len is set at port registration time */
4219
4220        INIT_LIST_HEAD(&acb->dcb_list);
4221        acb->dcb_run_robin = NULL;
4222        acb->active_dcb = NULL;
4223
4224        INIT_LIST_HEAD(&acb->srb_free_list);
4225        /*  temp SRB for Q tag used or abort command used  */
4226        acb->tmp_srb = &acb->srb;
4227        timer_setup(&acb->waiting_timer, waiting_timeout, 0);
4228        timer_setup(&acb->selto_timer, NULL, 0);
4229
4230        acb->srb_count = DC395x_MAX_SRB_CNT;
4231
4232        acb->sel_timeout = DC395x_SEL_TIMEOUT;  /* timeout=250ms */
4233        /* NOTE: acb->irq_level is set at IRQ registration time */
4234
4235        acb->tag_max_num = 1 << eeprom->max_tag;
4236        if (acb->tag_max_num > 30)
4237                acb->tag_max_num = 30;
4238
4239        acb->acb_flag = 0;      /* RESET_DETECT, RESET_DONE, RESET_DEV */
4240        acb->gmode2 = eeprom->channel_cfg;
4241        acb->config = 0;        /* NOTE: actually set in adapter_init_chip */
4242
4243        if (eeprom->channel_cfg & NAC_SCANLUN)
4244                acb->lun_chk = 1;
4245        acb->scan_devices = 1;
4246
4247        acb->scsi_host->this_id = eeprom->scsi_id;
4248        acb->hostid_bit = (1 << acb->scsi_host->this_id);
4249
4250        for (i = 0; i < DC395x_MAX_SCSI_ID; i++)
4251                acb->dcb_map[i] = 0;
4252
4253        acb->msg_len = 0;
4254        
4255        /* link static array of srbs into the srb free list */
4256        for (i = 0; i < acb->srb_count - 1; i++)
4257                list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list);
4258}
4259
4260
4261/**
4262 * adapter_init_host - Initialize the scsi host instance based on
4263 * values that we have already stored in the adapter instance. There's
4264 * some mention that a lot of these are deprecated, so we won't use
4265 * them (we'll use the ones in the adapter instance) but we'll fill
4266 * them in in case something else needs them.
4267 *
4268 * The eeprom structure, irq and io ports in the adapter need to have
4269 * been set before calling this function.
4270 *
4271 * @host: The scsi host instance to fill in the values for.
4272 **/
4273static void adapter_init_scsi_host(struct Scsi_Host *host)
4274{
4275        struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata;
4276        struct NvRamType *eeprom = &acb->eeprom;
4277        
4278        host->max_cmd_len = 24;
4279        host->can_queue = DC395x_MAX_CMD_QUEUE;
4280        host->cmd_per_lun = DC395x_MAX_CMD_PER_LUN;
4281        host->this_id = (int)eeprom->scsi_id;
4282        host->io_port = acb->io_port_base;
4283        host->n_io_port = acb->io_port_len;
4284        host->dma_channel = -1;
4285        host->unique_id = acb->io_port_base;
4286        host->irq = acb->irq_level;
4287        acb->last_reset = jiffies;
4288
4289        host->max_id = 16;
4290        if (host->max_id - 1 == eeprom->scsi_id)
4291                host->max_id--;
4292
4293        if (eeprom->channel_cfg & NAC_SCANLUN)
4294                host->max_lun = 8;
4295        else
4296                host->max_lun = 1;
4297}
4298
4299
4300/**
4301 * adapter_init_chip - Get the chip into a know state and figure out
4302 * some of the settings that apply to this adapter.
4303 *
4304 * The io port in the adapter needs to have been set before calling
4305 * this function. The config will be configured correctly on return.
4306 *
4307 * @acb: The adapter which we are to init.
4308 **/
4309static void adapter_init_chip(struct AdapterCtlBlk *acb)
4310{
4311        struct NvRamType *eeprom = &acb->eeprom;
4312        
4313        /* Mask all the interrupt */
4314        DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00);
4315        DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00);
4316
4317        /* Reset SCSI module */
4318        DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE);
4319
4320        /* Reset PCI/DMA module */
4321        DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE);
4322        udelay(20);
4323
4324        /* program configuration 0 */
4325        acb->config = HCC_AUTOTERM | HCC_PARITY;
4326        if (DC395x_read8(acb, TRM_S1040_GEN_STATUS) & WIDESCSI)
4327                acb->config |= HCC_WIDE_CARD;
4328
4329        if (eeprom->channel_cfg & NAC_POWERON_SCSI_RESET)
4330                acb->config |= HCC_SCSI_RESET;
4331
4332        if (acb->config & HCC_SCSI_RESET) {
4333                dprintkl(KERN_INFO, "Performing initial SCSI bus reset\n");
4334                DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI);
4335
4336                /*while (!( DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET )); */
4337                /*spin_unlock_irq (&io_request_lock); */
4338                udelay(500);
4339
4340                acb->last_reset =
4341                    jiffies + HZ / 2 +
4342                    HZ * acb->eeprom.delay_time;
4343
4344                /*spin_lock_irq (&io_request_lock); */
4345        }
4346}
4347
4348
4349/**
4350 * init_adapter - Grab the resource for the card, setup the adapter
4351 * information, set the card into a known state, create the various
4352 * tables etc etc. This basically gets all adapter information all up
4353 * to date, initialised and gets the chip in sync with it.
4354 *
4355 * @host:       This hosts adapter structure
4356 * @io_port:    The base I/O port
4357 * @irq:        IRQ
4358 *
4359 * Returns 0 if the initialization succeeds, any other value on
4360 * failure.
4361 **/
4362static int adapter_init(struct AdapterCtlBlk *acb, unsigned long io_port,
4363                        u32 io_port_len, unsigned int irq)
4364{
4365        if (!request_region(io_port, io_port_len, DC395X_NAME)) {
4366                dprintkl(KERN_ERR, "Failed to reserve IO region 0x%lx\n", io_port);
4367                goto failed;
4368        }
4369        /* store port base to indicate we have registered it */
4370        acb->io_port_base = io_port;
4371        acb->io_port_len = io_port_len;
4372        
4373        if (request_irq(irq, dc395x_interrupt, IRQF_SHARED, DC395X_NAME, acb)) {
4374                /* release the region we just claimed */
4375                dprintkl(KERN_INFO, "Failed to register IRQ\n");
4376                goto failed;
4377        }
4378        /* store irq to indicate we have registered it */
4379        acb->irq_level = irq;
4380
4381        /* get eeprom configuration information and command line settings etc */
4382        check_eeprom(&acb->eeprom, io_port);
4383        print_eeprom_settings(&acb->eeprom);
4384
4385        /* setup adapter control block */       
4386        adapter_init_params(acb);
4387        
4388        /* display card connectors/termination settings */
4389        adapter_print_config(acb);
4390
4391        if (adapter_sg_tables_alloc(acb)) {
4392                dprintkl(KERN_DEBUG, "Memory allocation for SG tables failed\n");
4393                goto failed;
4394        }
4395        adapter_init_scsi_host(acb->scsi_host);
4396        adapter_init_chip(acb);
4397        set_basic_config(acb);
4398
4399        dprintkdbg(DBG_0,
4400                "adapter_init: acb=%p, pdcb_map=%p psrb_array=%p "
4401                "size{acb=0x%04x dcb=0x%04x srb=0x%04x}\n",
4402                acb, acb->dcb_map, acb->srb_array, sizeof(struct AdapterCtlBlk),
4403                sizeof(struct DeviceCtlBlk), sizeof(struct ScsiReqBlk));
4404        return 0;
4405
4406failed:
4407        if (acb->irq_level)
4408                free_irq(acb->irq_level, acb);
4409        if (acb->io_port_base)
4410                release_region(acb->io_port_base, acb->io_port_len);
4411        adapter_sg_tables_free(acb);
4412
4413        return 1;
4414}
4415
4416
4417/**
4418 * adapter_uninit_chip - cleanly shut down the scsi controller chip,
4419 * stopping all operations and disabling interrupt generation on the
4420 * card.
4421 *
4422 * @acb: The adapter which we are to shutdown.
4423 **/
4424static void adapter_uninit_chip(struct AdapterCtlBlk *acb)
4425{
4426        /* disable interrupts */
4427        DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0);
4428        DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0);
4429
4430        /* reset the scsi bus */
4431        if (acb->config & HCC_SCSI_RESET)
4432                reset_scsi_bus(acb);
4433
4434        /* clear any pending interrupt state */
4435        DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS);
4436}
4437
4438
4439
4440/**
4441 * adapter_uninit - Shut down the chip and release any resources that
4442 * we had allocated. Once this returns the adapter should not be used
4443 * anymore.
4444 *
4445 * @acb: The adapter which we are to un-initialize.
4446 **/
4447static void adapter_uninit(struct AdapterCtlBlk *acb)
4448{
4449        unsigned long flags;
4450        DC395x_LOCK_IO(acb->scsi_host, flags);
4451
4452        /* remove timers */
4453        if (timer_pending(&acb->waiting_timer))
4454                del_timer(&acb->waiting_timer);
4455        if (timer_pending(&acb->selto_timer))
4456                del_timer(&acb->selto_timer);
4457
4458        adapter_uninit_chip(acb);
4459        adapter_remove_and_free_all_devices(acb);
4460        DC395x_UNLOCK_IO(acb->scsi_host, flags);
4461
4462        if (acb->irq_level)
4463                free_irq(acb->irq_level, acb);
4464        if (acb->io_port_base)
4465                release_region(acb->io_port_base, acb->io_port_len);
4466
4467        adapter_sg_tables_free(acb);
4468}
4469
4470
4471#undef YESNO
4472#define YESNO(YN) \
4473 if (YN) seq_printf(m, " Yes ");\
4474 else seq_printf(m, " No  ")
4475
4476static int dc395x_show_info(struct seq_file *m, struct Scsi_Host *host)
4477{
4478        struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata;
4479        int spd, spd1;
4480        struct DeviceCtlBlk *dcb;
4481        unsigned long flags;
4482        int dev;
4483
4484        seq_puts(m, DC395X_BANNER " PCI SCSI Host Adapter\n"
4485                " Driver Version " DC395X_VERSION "\n");
4486
4487        DC395x_LOCK_IO(acb->scsi_host, flags);
4488
4489        seq_printf(m, "SCSI Host Nr %i, ", host->host_no);
4490        seq_printf(m, "DC395U/UW/F DC315/U %s\n",
4491                (acb->config & HCC_WIDE_CARD) ? "Wide" : "");
4492        seq_printf(m, "io_port_base 0x%04lx, ", acb->io_port_base);
4493        seq_printf(m, "irq_level 0x%04x, ", acb->irq_level);
4494        seq_printf(m, " SelTimeout %ims\n", (1638 * acb->sel_timeout) / 1000);
4495
4496        seq_printf(m, "MaxID %i, MaxLUN %llu, ", host->max_id, host->max_lun);
4497        seq_printf(m, "AdapterID %i\n", host->this_id);
4498
4499        seq_printf(m, "tag_max_num %i", acb->tag_max_num);
4500        /*seq_printf(m, ", DMA_Status %i\n", DC395x_read8(acb, TRM_S1040_DMA_STATUS)); */
4501        seq_printf(m, ", FilterCfg 0x%02x",
4502                DC395x_read8(acb, TRM_S1040_SCSI_CONFIG1));
4503        seq_printf(m, ", DelayReset %is\n", acb->eeprom.delay_time);
4504        /*seq_printf(m, "\n"); */
4505
4506        seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list));
4507        seq_printf(m, "Map of attached LUNs: %02x %02x %02x %02x %02x %02x %02x %02x\n",
4508             acb->dcb_map[0], acb->dcb_map[1], acb->dcb_map[2],
4509             acb->dcb_map[3], acb->dcb_map[4], acb->dcb_map[5],
4510             acb->dcb_map[6], acb->dcb_map[7]);
4511        seq_printf(m, "                      %02x %02x %02x %02x %02x %02x %02x %02x\n",
4512             acb->dcb_map[8], acb->dcb_map[9], acb->dcb_map[10],
4513             acb->dcb_map[11], acb->dcb_map[12], acb->dcb_map[13],
4514             acb->dcb_map[14], acb->dcb_map[15]);
4515
4516        seq_puts(m,
4517                 "Un ID LUN Prty Sync Wide DsCn SndS TagQ nego_period SyncFreq SyncOffs MaxCmd\n");
4518
4519        dev = 0;
4520        list_for_each_entry(dcb, &acb->dcb_list, list) {
4521                int nego_period;
4522                seq_printf(m, "%02i %02i  %02i ", dev, dcb->target_id,
4523                        dcb->target_lun);
4524                YESNO(dcb->dev_mode & NTC_DO_PARITY_CHK);
4525                YESNO(dcb->sync_offset);
4526                YESNO(dcb->sync_period & WIDE_SYNC);
4527                YESNO(dcb->dev_mode & NTC_DO_DISCONNECT);
4528                YESNO(dcb->dev_mode & NTC_DO_SEND_START);
4529                YESNO(dcb->sync_mode & EN_TAG_QUEUEING);
4530                nego_period = clock_period[dcb->sync_period & 0x07] << 2;
4531                if (dcb->sync_offset)
4532                        seq_printf(m, "  %03i ns ", nego_period);
4533                else
4534                        seq_printf(m, " (%03i ns)", (dcb->min_nego_period << 2));
4535
4536                if (dcb->sync_offset & 0x0f) {
4537                        spd = 1000 / (nego_period);
4538                        spd1 = 1000 % (nego_period);
4539                        spd1 = (spd1 * 10 + nego_period / 2) / (nego_period);
4540                        seq_printf(m, "   %2i.%1i M     %02i ", spd, spd1,
4541                                (dcb->sync_offset & 0x0f));
4542                } else
4543                        seq_puts(m, "                 ");
4544
4545                /* Add more info ... */
4546                seq_printf(m, "     %02i\n", dcb->max_command);
4547                dev++;
4548        }
4549
4550        if (timer_pending(&acb->waiting_timer))
4551                seq_puts(m, "Waiting queue timer running\n");
4552        else
4553                seq_putc(m, '\n');
4554
4555        list_for_each_entry(dcb, &acb->dcb_list, list) {
4556                struct ScsiReqBlk *srb;
4557                if (!list_empty(&dcb->srb_waiting_list))
4558                        seq_printf(m, "DCB (%02i-%i): Waiting: %i:",
4559                                dcb->target_id, dcb->target_lun,
4560                                list_size(&dcb->srb_waiting_list));
4561                list_for_each_entry(srb, &dcb->srb_waiting_list, list)
4562                        seq_printf(m, " %p", srb->cmd);
4563                if (!list_empty(&dcb->srb_going_list))
4564                        seq_printf(m, "\nDCB (%02i-%i): Going  : %i:",
4565                                dcb->target_id, dcb->target_lun,
4566                                list_size(&dcb->srb_going_list));
4567                list_for_each_entry(srb, &dcb->srb_going_list, list)
4568                        seq_printf(m, " %p", srb->cmd);
4569                if (!list_empty(&dcb->srb_waiting_list) || !list_empty(&dcb->srb_going_list))
4570                        seq_putc(m, '\n');
4571        }
4572
4573        if (debug_enabled(DBG_1)) {
4574                seq_printf(m, "DCB list for ACB %p:\n", acb);
4575                list_for_each_entry(dcb, &acb->dcb_list, list) {
4576                        seq_printf(m, "%p -> ", dcb);
4577                }
4578                seq_puts(m, "END\n");
4579        }
4580
4581        DC395x_UNLOCK_IO(acb->scsi_host, flags);
4582        return 0;
4583}
4584
4585
4586static struct scsi_host_template dc395x_driver_template = {
4587        .module                 = THIS_MODULE,
4588        .proc_name              = DC395X_NAME,
4589        .show_info              = dc395x_show_info,
4590        .name                   = DC395X_BANNER " " DC395X_VERSION,
4591        .queuecommand           = dc395x_queue_command,
4592        .slave_alloc            = dc395x_slave_alloc,
4593        .slave_destroy          = dc395x_slave_destroy,
4594        .can_queue              = DC395x_MAX_CAN_QUEUE,
4595        .this_id                = 7,
4596        .sg_tablesize           = DC395x_MAX_SG_TABLESIZE,
4597        .cmd_per_lun            = DC395x_MAX_CMD_PER_LUN,
4598        .eh_abort_handler       = dc395x_eh_abort,
4599        .eh_bus_reset_handler   = dc395x_eh_bus_reset,
4600        .dma_boundary           = PAGE_SIZE - 1,
4601};
4602
4603
4604/**
4605 * banner_display - Display banner on first instance of driver
4606 * initialized.
4607 **/
4608static void banner_display(void)
4609{
4610        static int banner_done = 0;
4611        if (!banner_done)
4612        {
4613                dprintkl(KERN_INFO, "%s %s\n", DC395X_BANNER, DC395X_VERSION);
4614                banner_done = 1;
4615        }
4616}
4617
4618
4619/**
4620 * dc395x_init_one - Initialise a single instance of the adapter.
4621 *
4622 * The PCI layer will call this once for each instance of the adapter
4623 * that it finds in the system. The pci_dev strcuture indicates which
4624 * instance we are being called from.
4625 * 
4626 * @dev: The PCI device to initialize.
4627 * @id: Looks like a pointer to the entry in our pci device table
4628 * that was actually matched by the PCI subsystem.
4629 *
4630 * Returns 0 on success, or an error code (-ve) on failure.
4631 **/
4632static int dc395x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
4633{
4634        struct Scsi_Host *scsi_host = NULL;
4635        struct AdapterCtlBlk *acb = NULL;
4636        unsigned long io_port_base;
4637        unsigned int io_port_len;
4638        unsigned int irq;
4639        
4640        dprintkdbg(DBG_0, "Init one instance (%s)\n", pci_name(dev));
4641        banner_display();
4642
4643        if (pci_enable_device(dev))
4644        {
4645                dprintkl(KERN_INFO, "PCI Enable device failed.\n");
4646                return -ENODEV;
4647        }
4648        io_port_base = pci_resource_start(dev, 0) & PCI_BASE_ADDRESS_IO_MASK;
4649        io_port_len = pci_resource_len(dev, 0);
4650        irq = dev->irq;
4651        dprintkdbg(DBG_0, "IO_PORT=0x%04lx, IRQ=0x%x\n", io_port_base, dev->irq);
4652
4653        /* allocate scsi host information (includes out adapter) */
4654        scsi_host = scsi_host_alloc(&dc395x_driver_template,
4655                                    sizeof(struct AdapterCtlBlk));
4656        if (!scsi_host) {
4657                dprintkl(KERN_INFO, "scsi_host_alloc failed\n");
4658                goto fail;
4659        }
4660        acb = (struct AdapterCtlBlk*)scsi_host->hostdata;
4661        acb->scsi_host = scsi_host;
4662        acb->dev = dev;
4663
4664        /* initialise the adapter and everything we need */
4665        if (adapter_init(acb, io_port_base, io_port_len, irq)) {
4666                dprintkl(KERN_INFO, "adapter init failed\n");
4667                goto fail;
4668        }
4669
4670        pci_set_master(dev);
4671
4672        /* get the scsi mid level to scan for new devices on the bus */
4673        if (scsi_add_host(scsi_host, &dev->dev)) {
4674                dprintkl(KERN_ERR, "scsi_add_host failed\n");
4675                goto fail;
4676        }
4677        pci_set_drvdata(dev, scsi_host);
4678        scsi_scan_host(scsi_host);
4679                
4680        return 0;
4681
4682fail:
4683        if (acb != NULL)
4684                adapter_uninit(acb);
4685        if (scsi_host != NULL)
4686                scsi_host_put(scsi_host);
4687        pci_disable_device(dev);
4688        return -ENODEV;
4689}
4690
4691
4692/**
4693 * dc395x_remove_one - Called to remove a single instance of the
4694 * adapter.
4695 *
4696 * @dev: The PCI device to initialize.
4697 **/
4698static void dc395x_remove_one(struct pci_dev *dev)
4699{
4700        struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
4701        struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata);
4702
4703        dprintkdbg(DBG_0, "dc395x_remove_one: acb=%p\n", acb);
4704
4705        scsi_remove_host(scsi_host);
4706        adapter_uninit(acb);
4707        pci_disable_device(dev);
4708        scsi_host_put(scsi_host);
4709}
4710
4711
4712static struct pci_device_id dc395x_pci_table[] = {
4713        {
4714                .vendor         = PCI_VENDOR_ID_TEKRAM,
4715                .device         = PCI_DEVICE_ID_TEKRAM_TRMS1040,
4716                .subvendor      = PCI_ANY_ID,
4717                .subdevice      = PCI_ANY_ID,
4718         },
4719        {}                      /* Terminating entry */
4720};
4721MODULE_DEVICE_TABLE(pci, dc395x_pci_table);
4722
4723
4724static struct pci_driver dc395x_driver = {
4725        .name           = DC395X_NAME,
4726        .id_table       = dc395x_pci_table,
4727        .probe          = dc395x_init_one,
4728        .remove         = dc395x_remove_one,
4729};
4730
4731
4732/**
4733 * dc395x_module_init - Module initialization function
4734 *
4735 * Used by both module and built-in driver to initialise this driver.
4736 **/
4737static int __init dc395x_module_init(void)
4738{
4739        return pci_register_driver(&dc395x_driver);
4740}
4741
4742
4743/**
4744 * dc395x_module_exit - Module cleanup function.
4745 **/
4746static void __exit dc395x_module_exit(void)
4747{
4748        pci_unregister_driver(&dc395x_driver);
4749}
4750
4751
4752module_init(dc395x_module_init);
4753module_exit(dc395x_module_exit);
4754
4755MODULE_AUTHOR("C.L. Huang / Erich Chen / Kurt Garloff");
4756MODULE_DESCRIPTION("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and DC315 series");
4757MODULE_LICENSE("GPL");
4758