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