linux/drivers/scsi/pcmcia/nsp_cs.c
<<
>>
Prefs
   1/*======================================================================
   2
   3    NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver
   4      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
   5
   6    Ver.2.8   Support 32bit MMIO mode
   7              Support Synchronous Data Transfer Request (SDTR) mode
   8    Ver.2.0   Support 32bit PIO mode
   9    Ver.1.1.2 Fix for scatter list buffer exceeds
  10    Ver.1.1   Support scatter list
  11    Ver.0.1   Initial version
  12
  13    This software may be used and distributed according to the terms of
  14    the GNU General Public License.
  15
  16======================================================================*/
  17
  18/***********************************************************************
  19    This driver is for these PCcards.
  20
  21        I-O DATA PCSC-F  (Workbit NinjaSCSI-3)
  22                        "WBT", "NinjaSCSI-3", "R1.0"
  23        I-O DATA CBSC-II (Workbit NinjaSCSI-32Bi in 16bit mode)
  24                        "IO DATA", "CBSC16       ", "1"
  25
  26***********************************************************************/
  27
  28#include <linux/module.h>
  29#include <linux/kernel.h>
  30#include <linux/init.h>
  31#include <linux/slab.h>
  32#include <linux/string.h>
  33#include <linux/timer.h>
  34#include <linux/ioport.h>
  35#include <linux/delay.h>
  36#include <linux/interrupt.h>
  37#include <linux/major.h>
  38#include <linux/blkdev.h>
  39#include <linux/stat.h>
  40
  41#include <asm/io.h>
  42#include <asm/irq.h>
  43
  44#include <../drivers/scsi/scsi.h>
  45#include <scsi/scsi_host.h>
  46
  47#include <scsi/scsi.h>
  48#include <scsi/scsi_ioctl.h>
  49
  50#include <pcmcia/cs_types.h>
  51#include <pcmcia/cs.h>
  52#include <pcmcia/cistpl.h>
  53#include <pcmcia/cisreg.h>
  54#include <pcmcia/ds.h>
  55
  56#include "nsp_cs.h"
  57
  58MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
  59MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
  60MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
  61#ifdef MODULE_LICENSE
  62MODULE_LICENSE("GPL");
  63#endif
  64
  65#include "nsp_io.h"
  66
  67/*====================================================================*/
  68/* Parameters that can be set with 'insmod' */
  69
  70static int       nsp_burst_mode = BURST_MEM32;
  71module_param(nsp_burst_mode, int, 0);
  72MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
  73
  74/* Release IO ports after configuration? */
  75static int       free_ports = 0;
  76module_param(free_ports, bool, 0);
  77MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
  78
  79static struct scsi_host_template nsp_driver_template = {
  80        .proc_name               = "nsp_cs",
  81        .proc_info               = nsp_proc_info,
  82        .name                    = "WorkBit NinjaSCSI-3/32Bi(16bit)",
  83        .info                    = nsp_info,
  84        .queuecommand            = nsp_queuecommand,
  85/*      .eh_abort_handler        = nsp_eh_abort,*/
  86        .eh_bus_reset_handler    = nsp_eh_bus_reset,
  87        .eh_host_reset_handler   = nsp_eh_host_reset,
  88        .can_queue               = 1,
  89        .this_id                 = NSP_INITIATOR_ID,
  90        .sg_tablesize            = SG_ALL,
  91        .cmd_per_lun             = 1,
  92        .use_clustering          = DISABLE_CLUSTERING,
  93};
  94
  95static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
  96
  97
  98
  99/*
 100 * debug, error print
 101 */
 102#ifndef NSP_DEBUG
 103# define NSP_DEBUG_MASK         0x000000
 104# define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
 105# define nsp_dbg(mask, args...) /* */
 106#else
 107# define NSP_DEBUG_MASK         0xffffff
 108# define nsp_msg(type, args...) \
 109        nsp_cs_message (__func__, __LINE__, (type), args)
 110# define nsp_dbg(mask, args...) \
 111        nsp_cs_dmessage(__func__, __LINE__, (mask), args)
 112#endif
 113
 114#define NSP_DEBUG_QUEUECOMMAND          BIT(0)
 115#define NSP_DEBUG_REGISTER              BIT(1)
 116#define NSP_DEBUG_AUTOSCSI              BIT(2)
 117#define NSP_DEBUG_INTR                  BIT(3)
 118#define NSP_DEBUG_SGLIST                BIT(4)
 119#define NSP_DEBUG_BUSFREE               BIT(5)
 120#define NSP_DEBUG_CDB_CONTENTS          BIT(6)
 121#define NSP_DEBUG_RESELECTION           BIT(7)
 122#define NSP_DEBUG_MSGINOCCUR            BIT(8)
 123#define NSP_DEBUG_EEPROM                BIT(9)
 124#define NSP_DEBUG_MSGOUTOCCUR           BIT(10)
 125#define NSP_DEBUG_BUSRESET              BIT(11)
 126#define NSP_DEBUG_RESTART               BIT(12)
 127#define NSP_DEBUG_SYNC                  BIT(13)
 128#define NSP_DEBUG_WAIT                  BIT(14)
 129#define NSP_DEBUG_TARGETFLAG            BIT(15)
 130#define NSP_DEBUG_PROC                  BIT(16)
 131#define NSP_DEBUG_INIT                  BIT(17)
 132#define NSP_DEBUG_DATA_IO               BIT(18)
 133#define NSP_SPECIAL_PRINT_REGISTER      BIT(20)
 134
 135#define NSP_DEBUG_BUF_LEN               150
 136
 137static inline void nsp_inc_resid(struct scsi_cmnd *SCpnt, int residInc)
 138{
 139        scsi_set_resid(SCpnt, scsi_get_resid(SCpnt) + residInc);
 140}
 141
 142static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
 143{
 144        va_list args;
 145        char buf[NSP_DEBUG_BUF_LEN];
 146
 147        va_start(args, fmt);
 148        vsnprintf(buf, sizeof(buf), fmt, args);
 149        va_end(args);
 150
 151#ifndef NSP_DEBUG
 152        printk("%snsp_cs: %s\n", type, buf);
 153#else
 154        printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
 155#endif
 156}
 157
 158#ifdef NSP_DEBUG
 159static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
 160{
 161        va_list args;
 162        char buf[NSP_DEBUG_BUF_LEN];
 163
 164        va_start(args, fmt);
 165        vsnprintf(buf, sizeof(buf), fmt, args);
 166        va_end(args);
 167
 168        if (mask & NSP_DEBUG_MASK) {
 169                printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
 170        }
 171}
 172#endif
 173
 174/***********************************************************/
 175
 176/*====================================================
 177 * Clenaup parameters and call done() functions.
 178 * You must be set SCpnt->result before call this function.
 179 */
 180static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
 181{
 182        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 183
 184        data->CurrentSC = NULL;
 185
 186        SCpnt->scsi_done(SCpnt);
 187}
 188
 189static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
 190                            void (*done)(struct scsi_cmnd *))
 191{
 192#ifdef NSP_DEBUG
 193        /*unsigned int host_id = SCpnt->device->host->this_id;*/
 194        /*unsigned int base    = SCpnt->device->host->io_port;*/
 195        unsigned char target = scmd_id(SCpnt);
 196#endif
 197        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 198
 199        nsp_dbg(NSP_DEBUG_QUEUECOMMAND,
 200                "SCpnt=0x%p target=%d lun=%d sglist=0x%p bufflen=%d sg_count=%d",
 201                SCpnt, target, SCpnt->device->lun, scsi_sglist(SCpnt),
 202                scsi_bufflen(SCpnt), scsi_sg_count(SCpnt));
 203        //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
 204
 205        SCpnt->scsi_done        = done;
 206
 207        if (data->CurrentSC != NULL) {
 208                nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
 209                SCpnt->result   = DID_BAD_TARGET << 16;
 210                nsp_scsi_done(SCpnt);
 211                return 0;
 212        }
 213
 214#if 0
 215        /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
 216                This makes kernel crash when suspending... */
 217        if (data->ScsiInfo->stop != 0) {
 218                nsp_msg(KERN_INFO, "suspending device. reject command.");
 219                SCpnt->result  = DID_BAD_TARGET << 16;
 220                nsp_scsi_done(SCpnt);
 221                return SCSI_MLQUEUE_HOST_BUSY;
 222        }
 223#endif
 224
 225        show_command(SCpnt);
 226
 227        data->CurrentSC         = SCpnt;
 228
 229        SCpnt->SCp.Status       = CHECK_CONDITION;
 230        SCpnt->SCp.Message      = 0;
 231        SCpnt->SCp.have_data_in = IO_UNKNOWN;
 232        SCpnt->SCp.sent_command = 0;
 233        SCpnt->SCp.phase        = PH_UNDETERMINED;
 234        scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
 235
 236        /* setup scratch area
 237           SCp.ptr              : buffer pointer
 238           SCp.this_residual    : buffer length
 239           SCp.buffer           : next buffer
 240           SCp.buffers_residual : left buffers in list
 241           SCp.phase            : current state of the command */
 242        if (scsi_bufflen(SCpnt)) {
 243                SCpnt->SCp.buffer           = scsi_sglist(SCpnt);
 244                SCpnt->SCp.ptr              = BUFFER_ADDR;
 245                SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
 246                SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
 247        } else {
 248                SCpnt->SCp.ptr              = NULL;
 249                SCpnt->SCp.this_residual    = 0;
 250                SCpnt->SCp.buffer           = NULL;
 251                SCpnt->SCp.buffers_residual = 0;
 252        }
 253
 254        if (nsphw_start_selection(SCpnt) == FALSE) {
 255                nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
 256                SCpnt->result   = DID_BUS_BUSY << 16;
 257                nsp_scsi_done(SCpnt);
 258                return 0;
 259        }
 260
 261
 262        //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
 263#ifdef NSP_DEBUG
 264        data->CmdId++;
 265#endif
 266        return 0;
 267}
 268
 269/*
 270 * setup PIO FIFO transfer mode and enable/disable to data out
 271 */
 272static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
 273{
 274        unsigned int  base = data->BaseAddress;
 275        unsigned char transfer_mode_reg;
 276
 277        //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
 278
 279        if (enabled != FALSE) {
 280                transfer_mode_reg = TRANSFER_GO | BRAIND;
 281        } else {
 282                transfer_mode_reg = 0;
 283        }
 284
 285        transfer_mode_reg |= data->TransferMode;
 286
 287        nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
 288}
 289
 290static void nsphw_init_sync(nsp_hw_data *data)
 291{
 292        sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
 293                               .SyncPeriod      = 0,
 294                               .SyncOffset      = 0
 295        };
 296        int i;
 297
 298        /* setup sync data */
 299        for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
 300                data->Sync[i] = tmp_sync;
 301        }
 302}
 303
 304/*
 305 * Initialize Ninja hardware
 306 */
 307static int nsphw_init(nsp_hw_data *data)
 308{
 309        unsigned int base     = data->BaseAddress;
 310
 311        nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
 312
 313        data->ScsiClockDiv = CLOCK_40M | FAST_20;
 314        data->CurrentSC    = NULL;
 315        data->FifoCount    = 0;
 316        data->TransferMode = MODE_IO8;
 317
 318        nsphw_init_sync(data);
 319
 320        /* block all interrupts */
 321        nsp_write(base,       IRQCONTROL,   IRQCONTROL_ALLMASK);
 322
 323        /* setup SCSI interface */
 324        nsp_write(base,       IFSELECT,     IF_IFSEL);
 325
 326        nsp_index_write(base, SCSIIRQMODE,  0);
 327
 328        nsp_index_write(base, TRANSFERMODE, MODE_IO8);
 329        nsp_index_write(base, CLOCKDIV,     data->ScsiClockDiv);
 330
 331        nsp_index_write(base, PARITYCTRL,   0);
 332        nsp_index_write(base, POINTERCLR,   POINTER_CLEAR     |
 333                                            ACK_COUNTER_CLEAR |
 334                                            REQ_COUNTER_CLEAR |
 335                                            HOST_COUNTER_CLEAR);
 336
 337        /* setup fifo asic */
 338        nsp_write(base,       IFSELECT,     IF_REGSEL);
 339        nsp_index_write(base, TERMPWRCTRL,  0);
 340        if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
 341                nsp_msg(KERN_INFO, "terminator power on");
 342                nsp_index_write(base, TERMPWRCTRL, POWER_ON);
 343        }
 344
 345        nsp_index_write(base, TIMERCOUNT,   0);
 346        nsp_index_write(base, TIMERCOUNT,   0); /* requires 2 times!! */
 347
 348        nsp_index_write(base, SYNCREG,      0);
 349        nsp_index_write(base, ACKWIDTH,     0);
 350
 351        /* enable interrupts and ack them */
 352        nsp_index_write(base, SCSIIRQMODE,  SCSI_PHASE_CHANGE_EI |
 353                                            RESELECT_EI          |
 354                                            SCSI_RESET_IRQ_EI    );
 355        nsp_write(base,       IRQCONTROL,   IRQCONTROL_ALLCLEAR);
 356
 357        nsp_setup_fifo(data, FALSE);
 358
 359        return TRUE;
 360}
 361
 362/*
 363 * Start selection phase
 364 */
 365static int nsphw_start_selection(struct scsi_cmnd *SCpnt)
 366{
 367        unsigned int  host_id    = SCpnt->device->host->this_id;
 368        unsigned int  base       = SCpnt->device->host->io_port;
 369        unsigned char target     = scmd_id(SCpnt);
 370        nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 371        int           time_out;
 372        unsigned char phase, arbit;
 373
 374        //nsp_dbg(NSP_DEBUG_RESELECTION, "in");
 375
 376        phase = nsp_index_read(base, SCSIBUSMON);
 377        if(phase != BUSMON_BUS_FREE) {
 378                //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
 379                return FALSE;
 380        }
 381
 382        /* start arbitration */
 383        //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
 384        SCpnt->SCp.phase = PH_ARBSTART;
 385        nsp_index_write(base, SETARBIT, ARBIT_GO);
 386
 387        time_out = 1000;
 388        do {
 389                /* XXX: what a stupid chip! */
 390                arbit = nsp_index_read(base, ARBITSTATUS);
 391                //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
 392                udelay(1); /* hold 1.2us */
 393        } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
 394                (time_out-- != 0));
 395
 396        if (!(arbit & ARBIT_WIN)) {
 397                //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
 398                nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
 399                return FALSE;
 400        }
 401
 402        /* assert select line */
 403        //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
 404        SCpnt->SCp.phase = PH_SELSTART;
 405        udelay(3); /* wait 2.4us */
 406        nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
 407        nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY                    | SCSI_ATN);
 408        udelay(2); /* wait >1.2us */
 409        nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
 410        nsp_index_write(base, SETARBIT,      ARBIT_FLAG_CLEAR);
 411        /*udelay(1);*/ /* wait >90ns */
 412        nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL            | SCSI_DATAOUT_ENB | SCSI_ATN);
 413
 414        /* check selection timeout */
 415        nsp_start_timer(SCpnt, 1000/51);
 416        data->SelectionTimeOut = 1;
 417
 418        return TRUE;
 419}
 420
 421struct nsp_sync_table {
 422        unsigned int min_period;
 423        unsigned int max_period;
 424        unsigned int chip_period;
 425        unsigned int ack_width;
 426};
 427
 428static struct nsp_sync_table nsp_sync_table_40M[] = {
 429        {0x0c, 0x0c, 0x1, 0},   /* 20MB   50ns*/
 430        {0x19, 0x19, 0x3, 1},   /* 10MB  100ns*/ 
 431        {0x1a, 0x25, 0x5, 2},   /* 7.5MB 150ns*/ 
 432        {0x26, 0x32, 0x7, 3},   /* 5MB   200ns*/
 433        {   0,    0,   0, 0},
 434};
 435
 436static struct nsp_sync_table nsp_sync_table_20M[] = {
 437        {0x19, 0x19, 0x1, 0},   /* 10MB  100ns*/ 
 438        {0x1a, 0x25, 0x2, 0},   /* 7.5MB 150ns*/ 
 439        {0x26, 0x32, 0x3, 1},   /* 5MB   200ns*/
 440        {   0,    0,   0, 0},
 441};
 442
 443/*
 444 * setup synchronous data transfer mode
 445 */
 446static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt)
 447{
 448        unsigned char          target = scmd_id(SCpnt);
 449//      unsigned char          lun    = SCpnt->device->lun;
 450        nsp_hw_data           *data   = (nsp_hw_data *)SCpnt->device->host->hostdata;
 451        sync_data             *sync   = &(data->Sync[target]);
 452        struct nsp_sync_table *sync_table;
 453        unsigned int           period, offset;
 454        int                    i;
 455
 456
 457        nsp_dbg(NSP_DEBUG_SYNC, "in");
 458
 459        period = sync->SyncPeriod;
 460        offset = sync->SyncOffset;
 461
 462        nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
 463
 464        if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
 465                sync_table = nsp_sync_table_20M;
 466        } else {
 467                sync_table = nsp_sync_table_40M;
 468        }
 469
 470        for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
 471                if ( period >= sync_table->min_period &&
 472                     period <= sync_table->max_period    ) {
 473                        break;
 474                }
 475        }
 476
 477        if (period != 0 && sync_table->max_period == 0) {
 478                /*
 479                 * No proper period/offset found
 480                 */
 481                nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
 482
 483                sync->SyncPeriod      = 0;
 484                sync->SyncOffset      = 0;
 485                sync->SyncRegister    = 0;
 486                sync->AckWidth        = 0;
 487
 488                return FALSE;
 489        }
 490
 491        sync->SyncRegister    = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
 492                                (offset & SYNCREG_OFFSET_MASK);
 493        sync->AckWidth        = sync_table->ack_width;
 494
 495        nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
 496
 497        return TRUE;
 498}
 499
 500
 501/*
 502 * start ninja hardware timer
 503 */
 504static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time)
 505{
 506        unsigned int base = SCpnt->device->host->io_port;
 507        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 508
 509        //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
 510        data->TimerCount = time;
 511        nsp_index_write(base, TIMERCOUNT, time);
 512}
 513
 514/*
 515 * wait for bus phase change
 516 */
 517static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask,
 518                             char *str)
 519{
 520        unsigned int  base = SCpnt->device->host->io_port;
 521        unsigned char reg;
 522        int           time_out;
 523
 524        //nsp_dbg(NSP_DEBUG_INTR, "in");
 525
 526        time_out = 100;
 527
 528        do {
 529                reg = nsp_index_read(base, SCSIBUSMON);
 530                if (reg == 0xff) {
 531                        break;
 532                }
 533        } while ((--time_out != 0) && (reg & mask) != 0);
 534
 535        if (time_out == 0) {
 536                nsp_msg(KERN_DEBUG, " %s signal off timeut", str);
 537        }
 538
 539        return 0;
 540}
 541
 542/*
 543 * expect Ninja Irq
 544 */
 545static int nsp_expect_signal(struct scsi_cmnd *SCpnt,
 546                             unsigned char current_phase,
 547                             unsigned char mask)
 548{
 549        unsigned int  base       = SCpnt->device->host->io_port;
 550        int           time_out;
 551        unsigned char phase, i_src;
 552
 553        //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
 554
 555        time_out = 100;
 556        do {
 557                phase = nsp_index_read(base, SCSIBUSMON);
 558                if (phase == 0xff) {
 559                        //nsp_dbg(NSP_DEBUG_INTR, "ret -1");
 560                        return -1;
 561                }
 562                i_src = nsp_read(base, IRQSTATUS);
 563                if (i_src & IRQSTATUS_SCSI) {
 564                        //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
 565                        return 0;
 566                }
 567                if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) {
 568                        //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
 569                        return 1;
 570                }
 571        } while(time_out-- != 0);
 572
 573        //nsp_dbg(NSP_DEBUG_INTR, "timeout");
 574        return -1;
 575}
 576
 577/*
 578 * transfer SCSI message
 579 */
 580static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
 581{
 582        unsigned int  base = SCpnt->device->host->io_port;
 583        nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 584        char         *buf  = data->MsgBuffer;
 585        int           len  = min(MSGBUF_SIZE, data->MsgLen);
 586        int           ptr;
 587        int           ret;
 588
 589        //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
 590        for (ptr = 0; len > 0; len--, ptr++) {
 591
 592                ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ);
 593                if (ret <= 0) {
 594                        nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit");
 595                        return 0;
 596                }
 597
 598                /* if last byte, negate ATN */
 599                if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
 600                        nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
 601                }
 602
 603                /* read & write message */
 604                if (phase & BUSMON_IO) {
 605                        nsp_dbg(NSP_DEBUG_DATA_IO, "read msg");
 606                        buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK);
 607                } else {
 608                        nsp_dbg(NSP_DEBUG_DATA_IO, "write msg");
 609                        nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]);
 610                }
 611                nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>");
 612
 613        }
 614        return len;
 615}
 616
 617/*
 618 * get extra SCSI data from fifo
 619 */
 620static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
 621{
 622        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 623        unsigned int count;
 624
 625        //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
 626
 627        if (SCpnt->SCp.have_data_in != IO_IN) {
 628                return 0;
 629        }
 630
 631        count = nsp_fifo_count(SCpnt);
 632        if (data->FifoCount == count) {
 633                //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
 634                return 0;
 635        }
 636
 637        /*
 638         * XXX: NSP_QUIRK
 639         * data phase skip only occures in case of SCSI_LOW_READ
 640         */
 641        nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
 642        SCpnt->SCp.phase = PH_DATA;
 643        nsp_pio_read(SCpnt);
 644        nsp_setup_fifo(data, FALSE);
 645
 646        return 0;
 647}
 648
 649/*
 650 * accept reselection
 651 */
 652static int nsp_reselected(struct scsi_cmnd *SCpnt)
 653{
 654        unsigned int  base    = SCpnt->device->host->io_port;
 655        unsigned int  host_id = SCpnt->device->host->this_id;
 656        //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 657        unsigned char bus_reg;
 658        unsigned char id_reg, tmp;
 659        int target;
 660
 661        nsp_dbg(NSP_DEBUG_RESELECTION, "in");
 662
 663        id_reg = nsp_index_read(base, RESELECTID);
 664        tmp    = id_reg & (~BIT(host_id));
 665        target = 0;
 666        while(tmp != 0) {
 667                if (tmp & BIT(0)) {
 668                        break;
 669                }
 670                tmp >>= 1;
 671                target++;
 672        }
 673
 674        if (scmd_id(SCpnt) != target) {
 675                nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target);
 676        }
 677
 678        nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>");
 679
 680        nsp_nexus(SCpnt);
 681        bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN);
 682        nsp_index_write(base, SCSIBUSCTRL, bus_reg);
 683        nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB);
 684
 685        return TRUE;
 686}
 687
 688/*
 689 * count how many data transferd
 690 */
 691static int nsp_fifo_count(struct scsi_cmnd *SCpnt)
 692{
 693        unsigned int base = SCpnt->device->host->io_port;
 694        unsigned int count;
 695        unsigned int l, m, h, dummy;
 696
 697        nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER);
 698
 699        l     = nsp_index_read(base, TRANSFERCOUNT);
 700        m     = nsp_index_read(base, TRANSFERCOUNT);
 701        h     = nsp_index_read(base, TRANSFERCOUNT);
 702        dummy = nsp_index_read(base, TRANSFERCOUNT); /* required this! */
 703
 704        count = (h << 16) | (m << 8) | (l << 0);
 705
 706        //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
 707
 708        return count;
 709}
 710
 711/* fifo size */
 712#define RFIFO_CRIT 64
 713#define WFIFO_CRIT 64
 714
 715/*
 716 * read data in DATA IN phase
 717 */
 718static void nsp_pio_read(struct scsi_cmnd *SCpnt)
 719{
 720        unsigned int  base      = SCpnt->device->host->io_port;
 721        unsigned long mmio_base = SCpnt->device->host->base;
 722        nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
 723        long          time_out;
 724        int           ocount, res;
 725        unsigned char stat, fifo_stat;
 726
 727        ocount = data->FifoCount;
 728
 729        nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d",
 730                SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr,
 731                SCpnt->SCp.this_residual, SCpnt->SCp.buffer,
 732                SCpnt->SCp.buffers_residual);
 733
 734        time_out = 1000;
 735
 736        while ((time_out-- != 0) &&
 737               (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
 738
 739                stat = nsp_index_read(base, SCSIBUSMON);
 740                stat &= BUSMON_PHASE_MASK;
 741
 742
 743                res = nsp_fifo_count(SCpnt) - ocount;
 744                //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res);
 745                if (res == 0) { /* if some data avilable ? */
 746                        if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
 747                                //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
 748                                continue;
 749                        } else {
 750                                nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
 751                                break;
 752                        }
 753                }
 754
 755                fifo_stat = nsp_read(base, FIFOSTATUS);
 756                if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 &&
 757                    stat                                == BUSPHASE_DATA_IN) {
 758                        continue;
 759                }
 760
 761                res = min(res, SCpnt->SCp.this_residual);
 762
 763                switch (data->TransferMode) {
 764                case MODE_IO32:
 765                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
 766                        nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
 767                        break;
 768                case MODE_IO8:
 769                        nsp_fifo8_read (base, SCpnt->SCp.ptr, res     );
 770                        break;
 771
 772                case MODE_MEM32:
 773                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
 774                        nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
 775                        break;
 776
 777                default:
 778                        nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode");
 779                        return;
 780                }
 781
 782                nsp_inc_resid(SCpnt, -res);
 783                SCpnt->SCp.ptr           += res;
 784                SCpnt->SCp.this_residual -= res;
 785                ocount                   += res;
 786                //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
 787
 788                /* go to next scatter list if available */
 789                if (SCpnt->SCp.this_residual    == 0 &&
 790                    SCpnt->SCp.buffers_residual != 0 ) {
 791                        //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
 792                        SCpnt->SCp.buffers_residual--;
 793                        SCpnt->SCp.buffer++;
 794                        SCpnt->SCp.ptr           = BUFFER_ADDR;
 795                        SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
 796                        time_out = 1000;
 797
 798                        //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
 799                }
 800        }
 801
 802        data->FifoCount = ocount;
 803
 804        if (time_out < 0) {
 805                nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
 806                        scsi_get_resid(SCpnt), SCpnt->SCp.this_residual,
 807                        SCpnt->SCp.buffers_residual);
 808        }
 809        nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
 810        nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
 811                                                        scsi_get_resid(SCpnt));
 812}
 813
 814/*
 815 * write data in DATA OUT phase
 816 */
 817static void nsp_pio_write(struct scsi_cmnd *SCpnt)
 818{
 819        unsigned int  base      = SCpnt->device->host->io_port;
 820        unsigned long mmio_base = SCpnt->device->host->base;
 821        nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
 822        int           time_out;
 823        int           ocount, res;
 824        unsigned char stat;
 825
 826        ocount   = data->FifoCount;
 827
 828        nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
 829                data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual,
 830                SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual,
 831                scsi_get_resid(SCpnt));
 832
 833        time_out = 1000;
 834
 835        while ((time_out-- != 0) &&
 836               (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
 837                stat = nsp_index_read(base, SCSIBUSMON);
 838                stat &= BUSMON_PHASE_MASK;
 839
 840                if (stat != BUSPHASE_DATA_OUT) {
 841                        res = ocount - nsp_fifo_count(SCpnt);
 842
 843                        nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
 844                        /* Put back pointer */
 845                        nsp_inc_resid(SCpnt, res);
 846                        SCpnt->SCp.ptr           -= res;
 847                        SCpnt->SCp.this_residual += res;
 848                        ocount                   -= res;
 849
 850                        break;
 851                }
 852
 853                res = ocount - nsp_fifo_count(SCpnt);
 854                if (res > 0) { /* write all data? */
 855                        nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res);
 856                        continue;
 857                }
 858
 859                res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
 860
 861                //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
 862                switch (data->TransferMode) {
 863                case MODE_IO32:
 864                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
 865                        nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
 866                        break;
 867                case MODE_IO8:
 868                        nsp_fifo8_write (base, SCpnt->SCp.ptr, res     );
 869                        break;
 870
 871                case MODE_MEM32:
 872                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
 873                        nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
 874                        break;
 875
 876                default:
 877                        nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode");
 878                        break;
 879                }
 880
 881                nsp_inc_resid(SCpnt, -res);
 882                SCpnt->SCp.ptr           += res;
 883                SCpnt->SCp.this_residual -= res;
 884                ocount                   += res;
 885
 886                /* go to next scatter list if available */
 887                if (SCpnt->SCp.this_residual    == 0 &&
 888                    SCpnt->SCp.buffers_residual != 0 ) {
 889                        //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
 890                        SCpnt->SCp.buffers_residual--;
 891                        SCpnt->SCp.buffer++;
 892                        SCpnt->SCp.ptr           = BUFFER_ADDR;
 893                        SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
 894                        time_out = 1000;
 895                }
 896        }
 897
 898        data->FifoCount = ocount;
 899
 900        if (time_out < 0) {
 901                nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x",
 902                                                        scsi_get_resid(SCpnt));
 903        }
 904        nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
 905        nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId,
 906                                                        scsi_get_resid(SCpnt));
 907}
 908#undef RFIFO_CRIT
 909#undef WFIFO_CRIT
 910
 911/*
 912 * setup synchronous/asynchronous data transfer mode
 913 */
 914static int nsp_nexus(struct scsi_cmnd *SCpnt)
 915{
 916        unsigned int   base   = SCpnt->device->host->io_port;
 917        unsigned char  target = scmd_id(SCpnt);
 918//      unsigned char  lun    = SCpnt->device->lun;
 919        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 920        sync_data     *sync   = &(data->Sync[target]);
 921
 922        //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
 923
 924        /* setup synch transfer registers */
 925        nsp_index_write(base, SYNCREG,  sync->SyncRegister);
 926        nsp_index_write(base, ACKWIDTH, sync->AckWidth);
 927
 928        if (scsi_get_resid(SCpnt) % 4 != 0 ||
 929            scsi_get_resid(SCpnt) <= PAGE_SIZE ) {
 930                data->TransferMode = MODE_IO8;
 931        } else if (nsp_burst_mode == BURST_MEM32) {
 932                data->TransferMode = MODE_MEM32;
 933        } else if (nsp_burst_mode == BURST_IO32) {
 934                data->TransferMode = MODE_IO32;
 935        } else {
 936                data->TransferMode = MODE_IO8;
 937        }
 938
 939        /* setup pdma fifo */
 940        nsp_setup_fifo(data, TRUE);
 941
 942        /* clear ack counter */
 943        data->FifoCount = 0;
 944        nsp_index_write(base, POINTERCLR, POINTER_CLEAR     |
 945                                          ACK_COUNTER_CLEAR |
 946                                          REQ_COUNTER_CLEAR |
 947                                          HOST_COUNTER_CLEAR);
 948
 949        return 0;
 950}
 951
 952#include "nsp_message.c"
 953/*
 954 * interrupt handler
 955 */
 956static irqreturn_t nspintr(int irq, void *dev_id)
 957{
 958        unsigned int   base;
 959        unsigned char  irq_status, irq_phase, phase;
 960        struct scsi_cmnd *tmpSC;
 961        unsigned char  target, lun;
 962        unsigned int  *sync_neg;
 963        int            i, tmp;
 964        nsp_hw_data   *data;
 965
 966
 967        //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
 968        //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
 969
 970        if (                dev_id        != NULL &&
 971            ((scsi_info_t *)dev_id)->host != NULL  ) {
 972                scsi_info_t *info = (scsi_info_t *)dev_id;
 973
 974                data = (nsp_hw_data *)info->host->hostdata;
 975        } else {
 976                nsp_dbg(NSP_DEBUG_INTR, "host data wrong");
 977                return IRQ_NONE;
 978        }
 979
 980        //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
 981
 982        base = data->BaseAddress;
 983        //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
 984
 985        /*
 986         * interrupt check
 987         */
 988        nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE);
 989        irq_status = nsp_read(base, IRQSTATUS);
 990        //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
 991        if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) {
 992                nsp_write(base, IRQCONTROL, 0);
 993                //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
 994                return IRQ_NONE;
 995        }
 996
 997        /* XXX: IMPORTANT
 998         * Do not read an irq_phase register if no scsi phase interrupt.
 999         * Unless, you should lose a scsi phase interrupt.
1000         */
1001        phase = nsp_index_read(base, SCSIBUSMON);
1002        if((irq_status & IRQSTATUS_SCSI) != 0) {
1003                irq_phase = nsp_index_read(base, IRQPHASESENCE);
1004        } else {
1005                irq_phase = 0;
1006        }
1007
1008        //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1009
1010        /*
1011         * timer interrupt handler (scsi vs timer interrupts)
1012         */
1013        //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1014        if (data->TimerCount != 0) {
1015                //nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1016                nsp_index_write(base, TIMERCOUNT, 0);
1017                nsp_index_write(base, TIMERCOUNT, 0);
1018                data->TimerCount = 0;
1019        }
1020
1021        if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER &&
1022            data->SelectionTimeOut == 0) {
1023                //nsp_dbg(NSP_DEBUG_INTR, "timer start");
1024                nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR);
1025                return IRQ_HANDLED;
1026        }
1027
1028        nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR);
1029
1030        if ((irq_status & IRQSTATUS_SCSI) &&
1031            (irq_phase  & SCSI_RESET_IRQ)) {
1032                nsp_msg(KERN_ERR, "bus reset (power off?)");
1033
1034                nsphw_init(data);
1035                nsp_bus_reset(data);
1036
1037                if(data->CurrentSC != NULL) {
1038                        tmpSC = data->CurrentSC;
1039                        tmpSC->result  = (DID_RESET                   << 16) |
1040                                         ((tmpSC->SCp.Message & 0xff) <<  8) |
1041                                         ((tmpSC->SCp.Status  & 0xff) <<  0);
1042                        nsp_scsi_done(tmpSC);
1043                }
1044                return IRQ_HANDLED;
1045        }
1046
1047        if (data->CurrentSC == NULL) {
1048                nsp_msg(KERN_ERR, "CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen. reset everything", irq_status, phase, irq_phase);
1049                nsphw_init(data);
1050                nsp_bus_reset(data);
1051                return IRQ_HANDLED;
1052        }
1053
1054        tmpSC    = data->CurrentSC;
1055        target   = tmpSC->device->id;
1056        lun      = tmpSC->device->lun;
1057        sync_neg = &(data->Sync[target].SyncNegotiation);
1058
1059        /*
1060         * parse hardware SCSI irq reasons register
1061         */
1062        if (irq_status & IRQSTATUS_SCSI) {
1063                if (irq_phase & RESELECT_IRQ) {
1064                        nsp_dbg(NSP_DEBUG_INTR, "reselect");
1065                        nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR);
1066                        if (nsp_reselected(tmpSC) != FALSE) {
1067                                return IRQ_HANDLED;
1068                        }
1069                }
1070
1071                if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) {
1072                        return IRQ_HANDLED;
1073                }
1074        }
1075
1076        //show_phase(tmpSC);
1077
1078        switch(tmpSC->SCp.phase) {
1079        case PH_SELSTART:
1080                // *sync_neg = SYNC_NOT_YET;
1081                if ((phase & BUSMON_BSY) == 0) {
1082                        //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1083                        if (data->SelectionTimeOut >= NSP_SELTIMEOUT) {
1084                                nsp_dbg(NSP_DEBUG_INTR, "selection time out");
1085                                data->SelectionTimeOut = 0;
1086                                nsp_index_write(base, SCSIBUSCTRL, 0);
1087
1088                                tmpSC->result   = DID_TIME_OUT << 16;
1089                                nsp_scsi_done(tmpSC);
1090
1091                                return IRQ_HANDLED;
1092                        }
1093                        data->SelectionTimeOut += 1;
1094                        nsp_start_timer(tmpSC, 1000/51);
1095                        return IRQ_HANDLED;
1096                }
1097
1098                /* attention assert */
1099                //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1100                data->SelectionTimeOut = 0;
1101                tmpSC->SCp.phase       = PH_SELECTED;
1102                nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
1103                udelay(1);
1104                nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
1105                return IRQ_HANDLED;
1106
1107                break;
1108
1109        case PH_RESELECT:
1110                //nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1111                // *sync_neg = SYNC_NOT_YET;
1112                if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) {
1113
1114                        tmpSC->result   = DID_ABORT << 16;
1115                        nsp_scsi_done(tmpSC);
1116                        return IRQ_HANDLED;
1117                }
1118                /* fall thru */
1119        default:
1120                if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) {
1121                        return IRQ_HANDLED;
1122                }
1123                break;
1124        }
1125
1126        /*
1127         * SCSI sequencer
1128         */
1129        //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1130
1131        /* normal disconnect */
1132        if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
1133            (irq_phase & LATCHED_BUS_FREE) != 0 ) {
1134                nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1135
1136                //*sync_neg       = SYNC_NOT_YET;
1137
1138                if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) {     /* all command complete and return status */
1139                        tmpSC->result = (DID_OK                      << 16) |
1140                                        ((tmpSC->SCp.Message & 0xff) <<  8) |
1141                                        ((tmpSC->SCp.Status  & 0xff) <<  0);
1142                        nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
1143                        nsp_scsi_done(tmpSC);
1144
1145                        return IRQ_HANDLED;
1146                }
1147
1148                return IRQ_HANDLED;
1149        }
1150
1151
1152        /* check unexpected bus free state */
1153        if (phase == 0) {
1154                nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1155
1156                *sync_neg       = SYNC_NG;
1157                tmpSC->result   = DID_ERROR << 16;
1158                nsp_scsi_done(tmpSC);
1159                return IRQ_HANDLED;
1160        }
1161
1162        switch (phase & BUSMON_PHASE_MASK) {
1163        case BUSPHASE_COMMAND:
1164                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND");
1165                if ((phase & BUSMON_REQ) == 0) {
1166                        nsp_dbg(NSP_DEBUG_INTR, "REQ == 0");
1167                        return IRQ_HANDLED;
1168                }
1169
1170                tmpSC->SCp.phase = PH_COMMAND;
1171
1172                nsp_nexus(tmpSC);
1173
1174                /* write scsi command */
1175                nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len);
1176                nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER);
1177                for (i = 0; i < tmpSC->cmd_len; i++) {
1178                        nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]);
1179                }
1180                nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO);
1181                break;
1182
1183        case BUSPHASE_DATA_OUT:
1184                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
1185
1186                tmpSC->SCp.phase        = PH_DATA;
1187                tmpSC->SCp.have_data_in = IO_OUT;
1188
1189                nsp_pio_write(tmpSC);
1190
1191                break;
1192
1193        case BUSPHASE_DATA_IN:
1194                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
1195
1196                tmpSC->SCp.phase        = PH_DATA;
1197                tmpSC->SCp.have_data_in = IO_IN;
1198
1199                nsp_pio_read(tmpSC);
1200
1201                break;
1202
1203        case BUSPHASE_STATUS:
1204                nsp_dataphase_bypass(tmpSC);
1205                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
1206
1207                tmpSC->SCp.phase = PH_STATUS;
1208
1209                tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
1210                nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
1211
1212                break;
1213
1214        case BUSPHASE_MESSAGE_OUT:
1215                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT");
1216                if ((phase & BUSMON_REQ) == 0) {
1217                        goto timer_out;
1218                }
1219
1220                tmpSC->SCp.phase = PH_MSG_OUT;
1221
1222                //*sync_neg = SYNC_NOT_YET;
1223
1224                data->MsgLen = i = 0;
1225                data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++;
1226
1227                if (*sync_neg == SYNC_NOT_YET) {
1228                        data->Sync[target].SyncPeriod = 0;
1229                        data->Sync[target].SyncOffset = 0;
1230
1231                        /**/
1232                        data->MsgBuffer[i] = MSG_EXTENDED; i++;
1233                        data->MsgBuffer[i] = 3;            i++;
1234                        data->MsgBuffer[i] = MSG_EXT_SDTR; i++;
1235                        data->MsgBuffer[i] = 0x0c;         i++;
1236                        data->MsgBuffer[i] = 15;           i++;
1237                        /**/
1238                }
1239                data->MsgLen = i;
1240
1241                nsp_analyze_sdtr(tmpSC);
1242                show_message(data);
1243                nsp_message_out(tmpSC);
1244                break;
1245
1246        case BUSPHASE_MESSAGE_IN:
1247                nsp_dataphase_bypass(tmpSC);
1248                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN");
1249                if ((phase & BUSMON_REQ) == 0) {
1250                        goto timer_out;
1251                }
1252
1253                tmpSC->SCp.phase = PH_MSG_IN;
1254                nsp_message_in(tmpSC);
1255
1256                /**/
1257                if (*sync_neg == SYNC_NOT_YET) {
1258                        //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1259
1260                        if (data->MsgLen       >= 5            &&
1261                            data->MsgBuffer[0] == MSG_EXTENDED &&
1262                            data->MsgBuffer[1] == 3            &&
1263                            data->MsgBuffer[2] == MSG_EXT_SDTR ) {
1264                                data->Sync[target].SyncPeriod = data->MsgBuffer[3];
1265                                data->Sync[target].SyncOffset = data->MsgBuffer[4];
1266                                //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1267                                *sync_neg = SYNC_OK;
1268                        } else {
1269                                data->Sync[target].SyncPeriod = 0;
1270                                data->Sync[target].SyncOffset = 0;
1271                                *sync_neg = SYNC_NG;
1272                        }
1273                        nsp_analyze_sdtr(tmpSC);
1274                }
1275                /**/
1276
1277                /* search last messeage byte */
1278                tmp = -1;
1279                for (i = 0; i < data->MsgLen; i++) {
1280                        tmp = data->MsgBuffer[i];
1281                        if (data->MsgBuffer[i] == MSG_EXTENDED) {
1282                                i += (1 + data->MsgBuffer[i+1]);
1283                        }
1284                }
1285                tmpSC->SCp.Message = tmp;
1286
1287                nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
1288                show_message(data);
1289
1290                break;
1291
1292        case BUSPHASE_SELECT:
1293        default:
1294                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other");
1295
1296                break;
1297        }
1298
1299        //nsp_dbg(NSP_DEBUG_INTR, "out");
1300        return IRQ_HANDLED;     
1301
1302timer_out:
1303        nsp_start_timer(tmpSC, 1000/102);
1304        return IRQ_HANDLED;
1305}
1306
1307#ifdef NSP_DEBUG
1308#include "nsp_debug.c"
1309#endif  /* NSP_DEBUG */
1310
1311/*----------------------------------------------------------------*/
1312/* look for ninja3 card and init if found                         */
1313/*----------------------------------------------------------------*/
1314static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
1315{
1316        struct Scsi_Host *host; /* registered host structure */
1317        nsp_hw_data *data_b = &nsp_data_base, *data;
1318
1319        nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
1320        host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
1321        if (host == NULL) {
1322                nsp_dbg(NSP_DEBUG_INIT, "host failed");
1323                return NULL;
1324        }
1325
1326        memcpy(host->hostdata, data_b, sizeof(nsp_hw_data));
1327        data = (nsp_hw_data *)host->hostdata;
1328        data->ScsiInfo->host = host;
1329#ifdef NSP_DEBUG
1330        data->CmdId = 0;
1331#endif
1332
1333        nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber);
1334
1335        host->unique_id   = data->BaseAddress;
1336        host->io_port     = data->BaseAddress;
1337        host->n_io_port   = data->NumAddress;
1338        host->irq         = data->IrqNumber;
1339        host->base        = data->MmioAddress;
1340
1341        spin_lock_init(&(data->Lock));
1342
1343        snprintf(data->nspinfo,
1344                 sizeof(data->nspinfo),
1345                 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1346                 host->io_port, host->io_port + host->n_io_port - 1,
1347                 host->base,
1348                 host->irq);
1349        sht->name         = data->nspinfo;
1350
1351        nsp_dbg(NSP_DEBUG_INIT, "end");
1352
1353
1354        return host; /* detect done. */
1355}
1356
1357/*----------------------------------------------------------------*/
1358/* return info string                                             */
1359/*----------------------------------------------------------------*/
1360static const char *nsp_info(struct Scsi_Host *shpnt)
1361{
1362        nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1363
1364        return data->nspinfo;
1365}
1366
1367#undef SPRINTF
1368#define SPRINTF(args...) \
1369        do { \
1370                if(length > (pos - buffer)) { \
1371                        pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1372                        nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length,  length - (pos - buffer));\
1373                } \
1374        } while(0)
1375
1376static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1377                         off_t offset, int length, int inout)
1378{
1379        int id;
1380        char *pos = buffer;
1381        int thislength;
1382        int speed;
1383        unsigned long flags;
1384        nsp_hw_data *data;
1385        int hostno;
1386
1387        if (inout) {
1388                return -EINVAL;
1389        }
1390
1391        hostno = host->host_no;
1392        data = (nsp_hw_data *)host->hostdata;
1393
1394
1395        SPRINTF("NinjaSCSI status\n\n");
1396        SPRINTF("Driver version:        $Revision: 1.23 $\n");
1397        SPRINTF("SCSI host No.:         %d\n",          hostno);
1398        SPRINTF("IRQ:                   %d\n",          host->irq);
1399        SPRINTF("IO:                    0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1);
1400        SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1);
1401        SPRINTF("sg_tablesize:          %d\n",          host->sg_tablesize);
1402
1403        SPRINTF("burst transfer mode:   ");
1404        switch (nsp_burst_mode) {
1405        case BURST_IO8:
1406                SPRINTF("io8");
1407                break;
1408        case BURST_IO32:
1409                SPRINTF("io32");
1410                break;
1411        case BURST_MEM32:
1412                SPRINTF("mem32");
1413                break;
1414        default:
1415                SPRINTF("???");
1416                break;
1417        }
1418        SPRINTF("\n");
1419
1420
1421        spin_lock_irqsave(&(data->Lock), flags);
1422        SPRINTF("CurrentSC:             0x%p\n\n",      data->CurrentSC);
1423        spin_unlock_irqrestore(&(data->Lock), flags);
1424
1425        SPRINTF("SDTR status\n");
1426        for(id = 0; id < ARRAY_SIZE(data->Sync); id++) {
1427
1428                SPRINTF("id %d: ", id);
1429
1430                if (id == host->this_id) {
1431                        SPRINTF("----- NinjaSCSI-3 host adapter\n");
1432                        continue;
1433                }
1434
1435                switch(data->Sync[id].SyncNegotiation) {
1436                case SYNC_OK:
1437                        SPRINTF(" sync");
1438                        break;
1439                case SYNC_NG:
1440                        SPRINTF("async");
1441                        break;
1442                case SYNC_NOT_YET:
1443                        SPRINTF(" none");
1444                        break;
1445                default:
1446                        SPRINTF("?????");
1447                        break;
1448                }
1449
1450                if (data->Sync[id].SyncPeriod != 0) {
1451                        speed = 1000000 / (data->Sync[id].SyncPeriod * 4);
1452
1453                        SPRINTF(" transfer %d.%dMB/s, offset %d",
1454                                speed / 1000,
1455                                speed % 1000,
1456                                data->Sync[id].SyncOffset
1457                                );
1458                }
1459                SPRINTF("\n");
1460        }
1461
1462        thislength = pos - (buffer + offset);
1463
1464        if(thislength < 0) {
1465                *start = NULL;
1466                return 0;
1467        }
1468
1469
1470        thislength = min(thislength, length);
1471        *start = buffer + offset;
1472
1473        return thislength;
1474}
1475#undef SPRINTF
1476
1477/*---------------------------------------------------------------*/
1478/* error handler                                                 */
1479/*---------------------------------------------------------------*/
1480
1481/*
1482static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1483{
1484        nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1485
1486        return nsp_eh_bus_reset(SCpnt);
1487}*/
1488
1489static int nsp_bus_reset(nsp_hw_data *data)
1490{
1491        unsigned int base = data->BaseAddress;
1492        int          i;
1493
1494        nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
1495
1496        nsp_index_write(base, SCSIBUSCTRL, SCSI_RST);
1497        mdelay(100); /* 100ms */
1498        nsp_index_write(base, SCSIBUSCTRL, 0);
1499        for(i = 0; i < 5; i++) {
1500                nsp_index_read(base, IRQPHASESENCE); /* dummy read */
1501        }
1502
1503        nsphw_init_sync(data);
1504
1505        nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
1506
1507        return SUCCESS;
1508}
1509
1510static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt)
1511{
1512        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1513
1514        nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1515
1516        return nsp_bus_reset(data);
1517}
1518
1519static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt)
1520{
1521        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1522
1523        nsp_dbg(NSP_DEBUG_BUSRESET, "in");
1524
1525        nsphw_init(data);
1526
1527        return SUCCESS;
1528}
1529
1530
1531/**********************************************************************
1532  PCMCIA functions
1533**********************************************************************/
1534
1535/*======================================================================
1536    nsp_cs_attach() creates an "instance" of the driver, allocating
1537    local data structures for one device.  The device is registered
1538    with Card Services.
1539
1540    The dev_link structure is initialized, but we don't actually
1541    configure the card at this point -- we wait until we receive a
1542    card insertion event.
1543======================================================================*/
1544static int nsp_cs_probe(struct pcmcia_device *link)
1545{
1546        scsi_info_t  *info;
1547        nsp_hw_data  *data = &nsp_data_base;
1548        int ret;
1549
1550        nsp_dbg(NSP_DEBUG_INIT, "in");
1551
1552        /* Create new SCSI device */
1553        info = kzalloc(sizeof(*info), GFP_KERNEL);
1554        if (info == NULL) { return -ENOMEM; }
1555        info->p_dev = link;
1556        link->priv = info;
1557        data->ScsiInfo = info;
1558
1559        nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1560
1561        /* The io structure describes IO port mapping */
1562        link->io.NumPorts1       = 0x10;
1563        link->io.Attributes1     = IO_DATA_PATH_WIDTH_AUTO;
1564        link->io.IOAddrLines     = 10;  /* not used */
1565
1566        /* Interrupt setup */
1567        link->irq.Attributes     = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
1568        link->irq.IRQInfo1       = IRQ_LEVEL_ID;
1569
1570        /* Interrupt handler */
1571        link->irq.Handler        = &nspintr;
1572        link->irq.Instance       = info;
1573        link->irq.Attributes     |= IRQF_SHARED;
1574
1575        /* General socket configuration */
1576        link->conf.Attributes    = CONF_ENABLE_IRQ;
1577        link->conf.IntType       = INT_MEMORY_AND_IO;
1578
1579        ret = nsp_cs_config(link);
1580
1581        nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1582        return ret;
1583} /* nsp_cs_attach */
1584
1585
1586/*======================================================================
1587    This deletes a driver "instance".  The device is de-registered
1588    with Card Services.  If it has been released, all local data
1589    structures are freed.  Otherwise, the structures will be freed
1590    when the device is released.
1591======================================================================*/
1592static void nsp_cs_detach(struct pcmcia_device *link)
1593{
1594        nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1595
1596        ((scsi_info_t *)link->priv)->stop = 1;
1597        nsp_cs_release(link);
1598
1599        kfree(link->priv);
1600        link->priv = NULL;
1601} /* nsp_cs_detach */
1602
1603
1604/*======================================================================
1605    nsp_cs_config() is scheduled to run after a CARD_INSERTION event
1606    is received, to configure the PCMCIA socket, and to make the
1607    ethernet device available to the system.
1608======================================================================*/
1609
1610struct nsp_cs_configdata {
1611        nsp_hw_data             *data;
1612        win_req_t               req;
1613};
1614
1615static int nsp_cs_config_check(struct pcmcia_device *p_dev,
1616                               cistpl_cftable_entry_t *cfg,
1617                               cistpl_cftable_entry_t *dflt,
1618                               unsigned int vcc,
1619                               void *priv_data)
1620{
1621        struct nsp_cs_configdata *cfg_mem = priv_data;
1622
1623        if (cfg->index == 0)
1624                return -ENODEV;
1625
1626        /* Does this card need audio output? */
1627        if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
1628                p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
1629                p_dev->conf.Status = CCSR_AUDIO_ENA;
1630        }
1631
1632        /* Use power settings for Vcc and Vpp if present */
1633        /*  Note that the CIS values need to be rescaled */
1634        if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
1635                if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000)
1636                        return -ENODEV;
1637                else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) {
1638                        if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM]/10000)
1639                                return -ENODEV;
1640                }
1641
1642                if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1643                        p_dev->conf.Vpp =
1644                                cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
1645                } else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1646                        p_dev->conf.Vpp =
1647                                dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
1648                }
1649
1650                /* Do we need to allocate an interrupt? */
1651                if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1)
1652                        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
1653
1654                /* IO window settings */
1655                p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
1656                if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
1657                        cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
1658                        p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1659                        if (!(io->flags & CISTPL_IO_8BIT))
1660                                p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
1661                        if (!(io->flags & CISTPL_IO_16BIT))
1662                                p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
1663                        p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
1664                        p_dev->io.BasePort1 = io->win[0].base;
1665                        p_dev->io.NumPorts1 = io->win[0].len;
1666                        if (io->nwin > 1) {
1667                                p_dev->io.Attributes2 = p_dev->io.Attributes1;
1668                                p_dev->io.BasePort2 = io->win[1].base;
1669                                p_dev->io.NumPorts2 = io->win[1].len;
1670                        }
1671                        /* This reserves IO space but doesn't actually enable it */
1672                        if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
1673                                goto next_entry;
1674                }
1675
1676                if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
1677                        memreq_t        map;
1678                        cistpl_mem_t    *mem =
1679                                (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
1680                        cfg_mem->req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
1681                        cfg_mem->req.Attributes |= WIN_ENABLE;
1682                        cfg_mem->req.Base = mem->win[0].host_addr;
1683                        cfg_mem->req.Size = mem->win[0].len;
1684                        if (cfg_mem->req.Size < 0x1000)
1685                                cfg_mem->req.Size = 0x1000;
1686                        cfg_mem->req.AccessSpeed = 0;
1687                        if (pcmcia_request_window(&p_dev, &cfg_mem->req, &p_dev->win) != 0)
1688                                goto next_entry;
1689                        map.Page = 0; map.CardOffset = mem->win[0].card_addr;
1690                        if (pcmcia_map_mem_page(p_dev->win, &map) != 0)
1691                                goto next_entry;
1692
1693                        cfg_mem->data->MmioAddress = (unsigned long) ioremap_nocache(cfg_mem->req.Base, cfg_mem->req.Size);
1694                        cfg_mem->data->MmioLength  = cfg_mem->req.Size;
1695                }
1696                /* If we got this far, we're cool! */
1697                return 0;
1698        }
1699
1700next_entry:
1701        nsp_dbg(NSP_DEBUG_INIT, "next");
1702        pcmcia_disable_device(p_dev);
1703        return -ENODEV;
1704}
1705
1706static int nsp_cs_config(struct pcmcia_device *link)
1707{
1708        int               ret;
1709        scsi_info_t      *info   = link->priv;
1710        struct nsp_cs_configdata *cfg_mem;
1711        struct Scsi_Host *host;
1712        nsp_hw_data      *data = &nsp_data_base;
1713
1714        nsp_dbg(NSP_DEBUG_INIT, "in");
1715
1716        cfg_mem = kzalloc(sizeof(*cfg_mem), GFP_KERNEL);
1717        if (!cfg_mem)
1718                return -ENOMEM;
1719        cfg_mem->data = data;
1720
1721        ret = pcmcia_loop_config(link, nsp_cs_config_check, cfg_mem);
1722                goto cs_failed;
1723
1724        if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1725                if (pcmcia_request_irq(link, &link->irq))
1726                        goto cs_failed;
1727        }
1728
1729        ret = pcmcia_request_configuration(link, &link->conf);
1730        if (ret)
1731                goto cs_failed;
1732
1733        if (free_ports) {
1734                if (link->io.BasePort1) {
1735                        release_region(link->io.BasePort1, link->io.NumPorts1);
1736                }
1737                if (link->io.BasePort2) {
1738                        release_region(link->io.BasePort2, link->io.NumPorts2);
1739                }
1740        }
1741
1742        /* Set port and IRQ */
1743        data->BaseAddress = link->io.BasePort1;
1744        data->NumAddress  = link->io.NumPorts1;
1745        data->IrqNumber   = link->irq.AssignedIRQ;
1746
1747        nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1748                data->BaseAddress, data->NumAddress, data->IrqNumber);
1749
1750        if(nsphw_init(data) == FALSE) {
1751                goto cs_failed;
1752        }
1753
1754        host = nsp_detect(&nsp_driver_template);
1755
1756        if (host == NULL) {
1757                nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1758                goto cs_failed;
1759        }
1760
1761
1762        ret = scsi_add_host (host, NULL);
1763        if (ret)
1764                goto cs_failed;
1765
1766        scsi_scan_host(host);
1767
1768        snprintf(info->node.dev_name, sizeof(info->node.dev_name), "scsi%d", host->host_no);
1769        link->dev_node  = &info->node;
1770        info->host = host;
1771
1772        /* Finally, report what we've done */
1773        printk(KERN_INFO "nsp_cs: index 0x%02x: ",
1774               link->conf.ConfigIndex);
1775        if (link->conf.Vpp) {
1776                printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
1777        }
1778        if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1779                printk(", irq %d", link->irq.AssignedIRQ);
1780        }
1781        if (link->io.NumPorts1) {
1782                printk(", io 0x%04x-0x%04x", link->io.BasePort1,
1783                       link->io.BasePort1+link->io.NumPorts1-1);
1784        }
1785        if (link->io.NumPorts2)
1786                printk(" & 0x%04x-0x%04x", link->io.BasePort2,
1787                       link->io.BasePort2+link->io.NumPorts2-1);
1788        if (link->win)
1789                printk(", mem 0x%06lx-0x%06lx", cfg_mem->req.Base,
1790                       cfg_mem->req.Base+cfg_mem->req.Size-1);
1791        printk("\n");
1792
1793        kfree(cfg_mem);
1794        return 0;
1795
1796 cs_failed:
1797        nsp_dbg(NSP_DEBUG_INIT, "config fail");
1798        nsp_cs_release(link);
1799        kfree(cfg_mem);
1800
1801        return -ENODEV;
1802} /* nsp_cs_config */
1803
1804
1805/*======================================================================
1806    After a card is removed, nsp_cs_release() will unregister the net
1807    device, and release the PCMCIA configuration.  If the device is
1808    still open, this will be postponed until it is closed.
1809======================================================================*/
1810static void nsp_cs_release(struct pcmcia_device *link)
1811{
1812        scsi_info_t *info = link->priv;
1813        nsp_hw_data *data = NULL;
1814
1815        if (info->host == NULL) {
1816                nsp_msg(KERN_DEBUG, "unexpected card release call.");
1817        } else {
1818                data = (nsp_hw_data *)info->host->hostdata;
1819        }
1820
1821        nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1822
1823        /* Unlink the device chain */
1824        if (info->host != NULL) {
1825                scsi_remove_host(info->host);
1826        }
1827        link->dev_node = NULL;
1828
1829        if (link->win) {
1830                if (data != NULL) {
1831                        iounmap((void *)(data->MmioAddress));
1832                }
1833        }
1834        pcmcia_disable_device(link);
1835
1836        if (info->host != NULL) {
1837                scsi_host_put(info->host);
1838        }
1839} /* nsp_cs_release */
1840
1841static int nsp_cs_suspend(struct pcmcia_device *link)
1842{
1843        scsi_info_t *info = link->priv;
1844        nsp_hw_data *data;
1845
1846        nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
1847
1848        if (info->host != NULL) {
1849                nsp_msg(KERN_INFO, "clear SDTR status");
1850
1851                data = (nsp_hw_data *)info->host->hostdata;
1852
1853                nsphw_init_sync(data);
1854        }
1855
1856        info->stop = 1;
1857
1858        return 0;
1859}
1860
1861static int nsp_cs_resume(struct pcmcia_device *link)
1862{
1863        scsi_info_t *info = link->priv;
1864        nsp_hw_data *data;
1865
1866        nsp_dbg(NSP_DEBUG_INIT, "event: resume");
1867
1868        info->stop = 0;
1869
1870        if (info->host != NULL) {
1871                nsp_msg(KERN_INFO, "reset host and bus");
1872
1873                data = (nsp_hw_data *)info->host->hostdata;
1874
1875                nsphw_init   (data);
1876                nsp_bus_reset(data);
1877        }
1878
1879        return 0;
1880}
1881
1882/*======================================================================*
1883 *      module entry point
1884 *====================================================================*/
1885static struct pcmcia_device_id nsp_cs_ids[] = {
1886        PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16       ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
1887        PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
1888        PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
1889        PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
1890        PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
1891        PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
1892        PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
1893        PCMCIA_DEVICE_NULL
1894};
1895MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids);
1896
1897static struct pcmcia_driver nsp_driver = {
1898        .owner          = THIS_MODULE,
1899        .drv            = {
1900                .name   = "nsp_cs",
1901        },
1902        .probe          = nsp_cs_probe,
1903        .remove         = nsp_cs_detach,
1904        .id_table       = nsp_cs_ids,
1905        .suspend        = nsp_cs_suspend,
1906        .resume         = nsp_cs_resume,
1907};
1908
1909static int __init nsp_cs_init(void)
1910{
1911        nsp_msg(KERN_INFO, "loading...");
1912
1913        return pcmcia_register_driver(&nsp_driver);
1914}
1915
1916static void __exit nsp_cs_exit(void)
1917{
1918        nsp_msg(KERN_INFO, "unloading...");
1919        pcmcia_unregister_driver(&nsp_driver);
1920}
1921
1922
1923module_init(nsp_cs_init)
1924module_exit(nsp_cs_exit)
1925
1926/* end */
1927