root/drivers/scsi/pcmcia/nsp_cs.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 
 224 typedef 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 */
 232 typedef 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 
 244 typedef 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 */
 288 static void        nsp_cs_detach (struct pcmcia_device *p_dev);
 289 static void        nsp_cs_release(struct pcmcia_device *link);
 290 static int        nsp_cs_config (struct pcmcia_device *link);
 291 
 292 /* Linux SCSI subsystem specific functions */
 293 static struct Scsi_Host *nsp_detect     (struct scsi_host_template *sht);
 294 static const  char      *nsp_info       (struct Scsi_Host *shpnt);
 295 static        int        nsp_show_info  (struct seq_file *m,
 296                                          struct Scsi_Host *host);
 297 static 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);*/
 302 static int nsp_eh_bus_reset    (struct scsi_cmnd *SCpnt);
 303 static int nsp_eh_host_reset   (struct scsi_cmnd *SCpnt);
 304 static int nsp_bus_reset       (nsp_hw_data *data);
 305 
 306 /* */
 307 static int  nsphw_init           (nsp_hw_data *data);
 308 static int  nsphw_start_selection(struct scsi_cmnd *SCpnt);
 309 static void nsp_start_timer      (struct scsi_cmnd *SCpnt, int time);
 310 static int  nsp_fifo_count       (struct scsi_cmnd *SCpnt);
 311 static void nsp_pio_read         (struct scsi_cmnd *SCpnt);
 312 static void nsp_pio_write        (struct scsi_cmnd *SCpnt);
 313 static int  nsp_nexus            (struct scsi_cmnd *SCpnt);
 314 static void nsp_scsi_done        (struct scsi_cmnd *SCpnt);
 315 static int  nsp_analyze_sdtr     (struct scsi_cmnd *SCpnt);
 316 static int  nsp_negate_signal    (struct scsi_cmnd *SCpnt,
 317                                   unsigned char mask, char *str);
 318 static int  nsp_expect_signal    (struct scsi_cmnd *SCpnt,
 319                                   unsigned char current_phase,
 320                                   unsigned char  mask);
 321 static int  nsp_xfer             (struct scsi_cmnd *SCpnt, int phase);
 322 static int  nsp_dataphase_bypass (struct scsi_cmnd *SCpnt);
 323 static int  nsp_reselected       (struct scsi_cmnd *SCpnt);
 324 static 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
 331 static void show_command (struct scsi_cmnd *SCpnt);
 332 static void show_phase   (struct scsi_cmnd *SCpnt);
 333 static void show_busphase(unsigned char stat);
 334 static 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  */
 345 enum _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 
 361 enum _data_in_out {
 362         IO_UNKNOWN,
 363         IO_IN,
 364         IO_OUT
 365 };
 366 
 367 enum _burst_mode {
 368         BURST_IO8   = 0,
 369         BURST_IO32  = 1,
 370         BURST_MEM32 = 2,
 371 };
 372 
 373 /**************************************************************************
 374  * SCSI messaage
 375  */
 376 #define MSG_COMMAND_COMPLETE 0x00
 377 #define MSG_EXTENDED         0x01
 378 #define MSG_ABORT            0x06
 379 #define MSG_NO_OPERATION     0x08
 380 #define MSG_BUS_DEVICE_RESET 0x0c
 381 
 382 #define MSG_EXT_SDTR         0x01
 383 
 384 /* scatter-gather table */
 385 #  define BUFFER_ADDR ((char *)((sg_virt(SCpnt->SCp.buffer))))
 386 
 387 #endif  /*__nsp_cs__*/
 388 /* end */

/* [<][>][^][v][top][bottom][index][help] */