linux/drivers/scsi/pcmcia/nsp_cs.h
<<
>>
Prefs
   1/*=======================================================/
   2  Header file for nsp_cs.c
   3      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
   4
   5    Ver.1.0 : Cut unused lines.
   6    Ver 0.1 : Initial version.
   7
   8    This software may be used and distributed according to the terms of
   9    the GNU General Public License.
  10
  11=========================================================*/
  12
  13#ifndef  __nsp_cs__
  14#define  __nsp_cs__
  15
  16/* for debugging */
  17//#define NSP_DEBUG 9
  18
  19/*
  20#define static
  21#define inline
  22*/
  23
  24/************************************
  25 * Some useful macros...
  26 */
  27
  28/* SCSI initiator must be ID 7 */
  29#define NSP_INITIATOR_ID  7
  30
  31#define NSP_SELTIMEOUT 200
  32
  33/***************************************************************************
  34 * register definitions
  35 ***************************************************************************/
  36/*========================================================================
  37 * base register
  38 ========================================================================*/
  39#define IRQCONTROL      0x00  /* R */
  40#  define IRQCONTROL_RESELECT_CLEAR     BIT(0)
  41#  define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1)
  42#  define IRQCONTROL_TIMER_CLEAR        BIT(2)
  43#  define IRQCONTROL_FIFO_CLEAR         BIT(3)
  44#  define IRQCONTROL_ALLMASK            0xff
  45#  define IRQCONTROL_ALLCLEAR           (IRQCONTROL_RESELECT_CLEAR     | \
  46                                         IRQCONTROL_PHASE_CHANGE_CLEAR | \
  47                                         IRQCONTROL_TIMER_CLEAR        | \
  48                                         IRQCONTROL_FIFO_CLEAR          )
  49#  define IRQCONTROL_IRQDISABLE         0xf0
  50
  51#define IRQSTATUS       0x00  /* W */
  52#  define IRQSTATUS_SCSI  BIT(0)
  53#  define IRQSTATUS_TIMER BIT(2)
  54#  define IRQSTATUS_FIFO  BIT(3)
  55#  define IRQSTATUS_MASK  0x0f
  56
  57#define IFSELECT        0x01 /* W */
  58#  define IF_IFSEL    BIT(0)
  59#  define IF_REGSEL   BIT(2)
  60
  61#define FIFOSTATUS      0x01 /* R */
  62#  define FIFOSTATUS_CHIP_REVISION_MASK 0x0f
  63#  define FIFOSTATUS_CHIP_ID_MASK       0x70
  64#  define FIFOSTATUS_FULL_EMPTY         BIT(7)
  65
  66#define INDEXREG        0x02 /* R/W */
  67#define DATAREG         0x03 /* R/W */
  68#define FIFODATA        0x04 /* R/W */
  69#define FIFODATA1       0x05 /* R/W */
  70#define FIFODATA2       0x06 /* R/W */
  71#define FIFODATA3       0x07 /* R/W */
  72
  73/*====================================================================
  74 * indexed register
  75 ====================================================================*/
  76#define EXTBUSCTRL      0x10 /* R/W,deleted */
  77
  78#define CLOCKDIV        0x11 /* R/W */
  79#  define CLOCK_40M 0x02
  80#  define CLOCK_20M 0x01
  81#  define FAST_20   BIT(2)
  82
  83#define TERMPWRCTRL     0x13 /* R/W */
  84#  define POWER_ON BIT(0)
  85
  86#define SCSIIRQMODE     0x15 /* R/W */
  87#  define SCSI_PHASE_CHANGE_EI BIT(0)
  88#  define RESELECT_EI          BIT(4)
  89#  define FIFO_IRQ_EI          BIT(5)
  90#  define SCSI_RESET_IRQ_EI    BIT(6)
  91
  92#define IRQPHASESENCE   0x16 /* R */
  93#  define LATCHED_MSG      BIT(0)
  94#  define LATCHED_IO       BIT(1)
  95#  define LATCHED_CD       BIT(2)
  96#  define LATCHED_BUS_FREE BIT(3)
  97#  define PHASE_CHANGE_IRQ BIT(4)
  98#  define RESELECT_IRQ     BIT(5)
  99#  define FIFO_IRQ         BIT(6)
 100#  define SCSI_RESET_IRQ   BIT(7)
 101
 102#define TIMERCOUNT      0x17 /* R/W */
 103
 104#define SCSIBUSCTRL     0x18 /* R/W */
 105#  define SCSI_SEL         BIT(0)
 106#  define SCSI_RST         BIT(1)
 107#  define SCSI_DATAOUT_ENB BIT(2)
 108#  define SCSI_ATN         BIT(3)
 109#  define SCSI_ACK         BIT(4)
 110#  define SCSI_BSY         BIT(5)
 111#  define AUTODIRECTION    BIT(6)
 112#  define ACKENB           BIT(7)
 113
 114#define SCSIBUSMON      0x19 /* R */
 115
 116#define SETARBIT        0x1A /* W */
 117#  define ARBIT_GO         BIT(0)
 118#  define ARBIT_FLAG_CLEAR BIT(1)
 119
 120#define ARBITSTATUS     0x1A /* R */
 121/*#  define ARBIT_GO        BIT(0)*/
 122#  define ARBIT_WIN        BIT(1)
 123#  define ARBIT_FAIL       BIT(2)
 124#  define RESELECT_FLAG    BIT(3)
 125
 126#define PARITYCTRL      0x1B  /* W */
 127#define PARITYSTATUS    0x1B  /* R */
 128
 129#define COMMANDCTRL     0x1C  /* W */
 130#  define CLEAR_COMMAND_POINTER BIT(0)
 131#  define AUTO_COMMAND_GO       BIT(1)
 132
 133#define RESELECTID      0x1C  /* R   */
 134#define COMMANDDATA     0x1D  /* R/W */
 135
 136#define POINTERCLR      0x1E  /*   W */
 137#  define POINTER_CLEAR      BIT(0)
 138#  define ACK_COUNTER_CLEAR  BIT(1)
 139#  define REQ_COUNTER_CLEAR  BIT(2)
 140#  define HOST_COUNTER_CLEAR BIT(3)
 141#  define READ_SOURCE        (BIT(4) | BIT(5))
 142#    define ACK_COUNTER        (0)
 143#    define REQ_COUNTER        (BIT(4))
 144#    define HOST_COUNTER       (BIT(5))
 145
 146#define TRANSFERCOUNT   0x1E  /* R   */
 147
 148#define TRANSFERMODE    0x20  /* R/W */
 149#  define MODE_MEM8   BIT(0)
 150#  define MODE_MEM32  BIT(1)
 151#  define MODE_ADR24  BIT(2)
 152#  define MODE_ADR32  BIT(3)
 153#  define MODE_IO8    BIT(4)
 154#  define MODE_IO32   BIT(5)
 155#  define TRANSFER_GO BIT(6)
 156#  define BRAIND      BIT(7)
 157
 158#define SYNCREG         0x21 /* R/W */
 159#  define SYNCREG_OFFSET_MASK  0x0f
 160#  define SYNCREG_PERIOD_MASK  0xf0
 161#  define SYNCREG_PERIOD_SHIFT 4
 162
 163#define SCSIDATALATCH   0x22 /*   W */
 164#define SCSIDATAIN      0x22 /* R   */
 165#define SCSIDATAWITHACK 0x23 /* R/W */
 166#define SCAMCONTROL     0x24 /*   W */
 167#define SCAMSTATUS      0x24 /* R   */
 168#define SCAMDATA        0x25 /* R/W */
 169
 170#define OTHERCONTROL    0x26 /* R/W */
 171#  define TPL_ROM_WRITE_EN BIT(0)
 172#  define TPWR_OUT         BIT(1)
 173#  define TPWR_SENSE       BIT(2)
 174#  define RA8_CONTROL      BIT(3)
 175
 176#define ACKWIDTH        0x27 /* R/W */
 177#define CLRTESTPNT      0x28 /*   W */
 178#define ACKCNTLD        0x29 /*   W */
 179#define REQCNTLD        0x2A /*   W */
 180#define HSTCNTLD        0x2B /*   W */
 181#define CHECKSUM        0x2C /* R/W */
 182
 183/************************************************************************
 184 * Input status bit definitions.
 185 ************************************************************************/
 186#define S_MESSAGE       BIT(0)    /* Message line from SCSI bus      */
 187#define S_IO            BIT(1)    /* Input/Output line from SCSI bus */
 188#define S_CD            BIT(2)    /* Command/Data line from SCSI bus */
 189#define S_BUSY          BIT(3)    /* Busy line from SCSI bus         */
 190#define S_ACK           BIT(4)    /* Acknowledge line from SCSI bus  */
 191#define S_REQUEST       BIT(5)    /* Request line from SCSI bus      */
 192#define S_SELECT        BIT(6)    /*                                 */
 193#define S_ATN           BIT(7)    /*                                 */
 194
 195/***********************************************************************
 196 * Useful Bus Monitor status combinations.
 197 ***********************************************************************/
 198#define BUSMON_SEL         S_SELECT
 199#define BUSMON_BSY         S_BUSY
 200#define BUSMON_REQ         S_REQUEST
 201#define BUSMON_IO          S_IO
 202#define BUSMON_ACK         S_ACK
 203#define BUSMON_BUS_FREE    0
 204#define BUSMON_COMMAND     ( S_BUSY | S_CD |                    S_REQUEST )
 205#define BUSMON_MESSAGE_IN  ( S_BUSY | S_CD | S_IO | S_MESSAGE | S_REQUEST )
 206#define BUSMON_MESSAGE_OUT ( S_BUSY | S_CD |        S_MESSAGE | S_REQUEST )
 207#define BUSMON_DATA_IN     ( S_BUSY |        S_IO |             S_REQUEST )
 208#define BUSMON_DATA_OUT    ( S_BUSY |                           S_REQUEST )
 209#define BUSMON_STATUS      ( S_BUSY | S_CD | S_IO |             S_REQUEST )
 210#define BUSMON_SELECT      (                 S_IO |                        S_SELECT )
 211#define BUSMON_RESELECT    (                 S_IO |                        S_SELECT )
 212#define BUSMON_PHASE_MASK  (          S_CD | S_IO | S_MESSAGE |            S_SELECT )
 213
 214#define BUSPHASE_SELECT      ( BUSMON_SELECT      & BUSMON_PHASE_MASK )
 215#define BUSPHASE_COMMAND     ( BUSMON_COMMAND     & BUSMON_PHASE_MASK )
 216#define BUSPHASE_MESSAGE_IN  ( BUSMON_MESSAGE_IN  & BUSMON_PHASE_MASK )
 217#define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK )
 218#define BUSPHASE_DATA_IN     ( BUSMON_DATA_IN     & BUSMON_PHASE_MASK )
 219#define BUSPHASE_DATA_OUT    ( BUSMON_DATA_OUT    & BUSMON_PHASE_MASK )
 220#define BUSPHASE_STATUS      ( BUSMON_STATUS      & BUSMON_PHASE_MASK )
 221
 222/*====================================================================*/
 223
 224typedef struct scsi_info_t {
 225        struct pcmcia_device    *p_dev;
 226        struct Scsi_Host      *host;
 227        int                    stop;
 228} scsi_info_t;
 229
 230
 231/* synchronous transfer negotiation data */
 232typedef struct _sync_data {
 233        unsigned int SyncNegotiation;
 234#define SYNC_NOT_YET 0
 235#define SYNC_OK      1
 236#define SYNC_NG      2
 237
 238        unsigned int  SyncPeriod;
 239        unsigned int  SyncOffset;
 240        unsigned char SyncRegister;
 241        unsigned char AckWidth;
 242} sync_data;
 243
 244typedef struct _nsp_hw_data {
 245        unsigned int  BaseAddress;
 246        unsigned int  NumAddress;
 247        unsigned int  IrqNumber;
 248
 249        unsigned long MmioAddress;
 250#define NSP_MMIO_OFFSET 0x0800
 251        unsigned long MmioLength;
 252
 253        unsigned char ScsiClockDiv;
 254
 255        unsigned char TransferMode;
 256
 257        int           TimerCount;
 258        int           SelectionTimeOut;
 259        struct scsi_cmnd *CurrentSC;
 260        //int           CurrnetTarget;
 261
 262        int           FifoCount;
 263
 264#define MSGBUF_SIZE 20
 265        unsigned char MsgBuffer[MSGBUF_SIZE];
 266        int MsgLen;
 267
 268#define N_TARGET 8
 269        sync_data     Sync[N_TARGET];
 270
 271        char nspinfo[110];     /* description */
 272        spinlock_t Lock;
 273
 274        scsi_info_t   *ScsiInfo; /* attach <-> detect glue */
 275
 276
 277#ifdef NSP_DEBUG
 278        int CmdId; /* Accepted command serial number.
 279                      Used for debugging.             */
 280#endif
 281} nsp_hw_data;
 282
 283/****************************************************************************
 284 *
 285 */
 286
 287/* Card service functions */
 288static void        nsp_cs_detach (struct pcmcia_device *p_dev);
 289static void        nsp_cs_release(struct pcmcia_device *link);
 290static int        nsp_cs_config (struct pcmcia_device *link);
 291
 292/* Linux SCSI subsystem specific functions */
 293static struct Scsi_Host *nsp_detect     (struct scsi_host_template *sht);
 294static const  char      *nsp_info       (struct Scsi_Host *shpnt);
 295static        int        nsp_show_info  (struct seq_file *m,
 296                                         struct Scsi_Host *host);
 297static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt);
 298
 299/* Error handler */
 300/*static int nsp_eh_abort       (struct scsi_cmnd *SCpnt);*/
 301/*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/
 302static int nsp_eh_bus_reset    (struct scsi_cmnd *SCpnt);
 303static int nsp_eh_host_reset   (struct scsi_cmnd *SCpnt);
 304static int nsp_bus_reset       (nsp_hw_data *data);
 305
 306/* */
 307static int  nsphw_init           (nsp_hw_data *data);
 308static int  nsphw_start_selection(struct scsi_cmnd *SCpnt);
 309static void nsp_start_timer      (struct scsi_cmnd *SCpnt, int time);
 310static int  nsp_fifo_count       (struct scsi_cmnd *SCpnt);
 311static void nsp_pio_read         (struct scsi_cmnd *SCpnt);
 312static void nsp_pio_write        (struct scsi_cmnd *SCpnt);
 313static int  nsp_nexus            (struct scsi_cmnd *SCpnt);
 314static void nsp_scsi_done        (struct scsi_cmnd *SCpnt);
 315static int  nsp_analyze_sdtr     (struct scsi_cmnd *SCpnt);
 316static int  nsp_negate_signal    (struct scsi_cmnd *SCpnt,
 317                                  unsigned char mask, char *str);
 318static int  nsp_expect_signal    (struct scsi_cmnd *SCpnt,
 319                                  unsigned char current_phase,
 320                                  unsigned char  mask);
 321static int  nsp_xfer             (struct scsi_cmnd *SCpnt, int phase);
 322static int  nsp_dataphase_bypass (struct scsi_cmnd *SCpnt);
 323static int  nsp_reselected       (struct scsi_cmnd *SCpnt);
 324static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);
 325
 326/* Interrupt handler */
 327//static irqreturn_t nspintr(int irq, void *dev_id);
 328
 329/* Debug */
 330#ifdef NSP_DEBUG
 331static void show_command (struct scsi_cmnd *SCpnt);
 332static void show_phase   (struct scsi_cmnd *SCpnt);
 333static void show_busphase(unsigned char stat);
 334static void show_message (nsp_hw_data *data);
 335#else
 336# define show_command(ptr)   /* */
 337# define show_phase(SCpnt)   /* */
 338# define show_busphase(stat) /* */
 339# define show_message(data)  /* */
 340#endif
 341
 342/*
 343 * SCSI phase
 344 */
 345enum _scsi_phase {
 346        PH_UNDETERMINED ,
 347        PH_ARBSTART     ,
 348        PH_SELSTART     ,
 349        PH_SELECTED     ,
 350        PH_COMMAND      ,
 351        PH_DATA         ,
 352        PH_STATUS       ,
 353        PH_MSG_IN       ,
 354        PH_MSG_OUT      ,
 355        PH_DISCONNECT   ,
 356        PH_RESELECT     ,
 357        PH_ABORT        ,
 358        PH_RESET
 359};
 360
 361enum _data_in_out {
 362        IO_UNKNOWN,
 363        IO_IN,
 364        IO_OUT
 365};
 366
 367enum _burst_mode {
 368        BURST_IO8   = 0,
 369        BURST_IO32  = 1,
 370        BURST_MEM32 = 2,
 371};
 372
 373/* scatter-gather table */
 374#  define BUFFER_ADDR ((char *)((sg_virt(SCpnt->SCp.buffer))))
 375
 376#endif  /*__nsp_cs__*/
 377/* end */
 378