linux/drivers/scsi/arm/acornscsi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 *  linux/drivers/acorn/scsi/acornscsi.h
   4 *
   5 *  Copyright (C) 1997 Russell King
   6 *
   7 *  Acorn SCSI driver
   8 */
   9#ifndef ACORNSCSI_H
  10#define ACORNSCSI_H
  11
  12/* SBIC registers */
  13#define SBIC_OWNID              0
  14#define OWNID_FS1               (1<<7)
  15#define OWNID_FS2               (1<<6)
  16#define OWNID_EHP               (1<<4)
  17#define OWNID_EAF               (1<<3)
  18
  19#define SBIC_CTRL               1
  20#define CTRL_DMAMODE            (1<<7)
  21#define CTRL_DMADBAMODE         (1<<6)
  22#define CTRL_DMABURST           (1<<5)
  23#define CTRL_DMAPOLLED          0
  24#define CTRL_HHP                (1<<4)
  25#define CTRL_EDI                (1<<3)
  26#define CTRL_IDI                (1<<2)
  27#define CTRL_HA                 (1<<1)
  28#define CTRL_HSP                (1<<0)
  29
  30#define SBIC_TIMEOUT            2
  31#define SBIC_TOTSECTS           3
  32#define SBIC_TOTHEADS           4
  33#define SBIC_TOTCYLH            5
  34#define SBIC_TOTCYLL            6
  35#define SBIC_LOGADDRH           7
  36#define SBIC_LOGADDRM2          8
  37#define SBIC_LOGADDRM1          9
  38#define SBIC_LOGADDRL           10
  39#define SBIC_SECTORNUM          11
  40#define SBIC_HEADNUM            12
  41#define SBIC_CYLH               13
  42#define SBIC_CYLL               14
  43#define SBIC_TARGETLUN          15
  44#define TARGETLUN_TLV           (1<<7)
  45#define TARGETLUN_DOK           (1<<6)
  46
  47#define SBIC_CMNDPHASE          16
  48#define SBIC_SYNCHTRANSFER      17
  49#define SYNCHTRANSFER_OF0       0x00
  50#define SYNCHTRANSFER_OF1       0x01
  51#define SYNCHTRANSFER_OF2       0x02
  52#define SYNCHTRANSFER_OF3       0x03
  53#define SYNCHTRANSFER_OF4       0x04
  54#define SYNCHTRANSFER_OF5       0x05
  55#define SYNCHTRANSFER_OF6       0x06
  56#define SYNCHTRANSFER_OF7       0x07
  57#define SYNCHTRANSFER_OF8       0x08
  58#define SYNCHTRANSFER_OF9       0x09
  59#define SYNCHTRANSFER_OF10      0x0A
  60#define SYNCHTRANSFER_OF11      0x0B
  61#define SYNCHTRANSFER_OF12      0x0C
  62#define SYNCHTRANSFER_8DBA      0x00
  63#define SYNCHTRANSFER_2DBA      0x20
  64#define SYNCHTRANSFER_3DBA      0x30
  65#define SYNCHTRANSFER_4DBA      0x40
  66#define SYNCHTRANSFER_5DBA      0x50
  67#define SYNCHTRANSFER_6DBA      0x60
  68#define SYNCHTRANSFER_7DBA      0x70
  69
  70#define SBIC_TRANSCNTH          18
  71#define SBIC_TRANSCNTM          19
  72#define SBIC_TRANSCNTL          20
  73#define SBIC_DESTID             21
  74#define DESTID_SCC              (1<<7)
  75#define DESTID_DPD              (1<<6)
  76
  77#define SBIC_SOURCEID           22
  78#define SOURCEID_ER             (1<<7)
  79#define SOURCEID_ES             (1<<6)
  80#define SOURCEID_DSP            (1<<5)
  81#define SOURCEID_SIV            (1<<4)
  82
  83#define SBIC_SSR                23
  84#define SBIC_CMND               24
  85#define CMND_RESET              0x00
  86#define CMND_ABORT              0x01
  87#define CMND_ASSERTATN          0x02
  88#define CMND_NEGATEACK          0x03
  89#define CMND_DISCONNECT         0x04
  90#define CMND_RESELECT           0x05
  91#define CMND_SELWITHATN         0x06
  92#define CMND_SELECT             0x07
  93#define CMND_SELECTATNTRANSFER  0x08
  94#define CMND_SELECTTRANSFER     0x09
  95#define CMND_RESELECTRXDATA     0x0A
  96#define CMND_RESELECTTXDATA     0x0B
  97#define CMND_WAITFORSELRECV     0x0C
  98#define CMND_SENDSTATCMD        0x0D
  99#define CMND_SENDDISCONNECT     0x0E
 100#define CMND_SETIDI             0x0F
 101#define CMND_RECEIVECMD         0x10
 102#define CMND_RECEIVEDTA         0x11
 103#define CMND_RECEIVEMSG         0x12
 104#define CMND_RECEIVEUSP         0x13
 105#define CMND_SENDCMD            0x14
 106#define CMND_SENDDATA           0x15
 107#define CMND_SENDMSG            0x16
 108#define CMND_SENDUSP            0x17
 109#define CMND_TRANSLATEADDR      0x18
 110#define CMND_XFERINFO           0x20
 111#define CMND_SBT                (1<<7)
 112
 113#define SBIC_DATA               25
 114#define SBIC_ASR                26
 115#define ASR_INT                 (1<<7)
 116#define ASR_LCI                 (1<<6)
 117#define ASR_BSY                 (1<<5)
 118#define ASR_CIP                 (1<<4)
 119#define ASR_PE                  (1<<1)
 120#define ASR_DBR                 (1<<0)
 121
 122/* DMAC registers */
 123#define DMAC_INIT               0x00
 124#define INIT_8BIT               (1)
 125
 126#define DMAC_CHANNEL            0x80
 127#define CHANNEL_0               0x00
 128#define CHANNEL_1               0x01
 129#define CHANNEL_2               0x02
 130#define CHANNEL_3               0x03
 131
 132#define DMAC_TXCNTLO            0x01
 133#define DMAC_TXCNTHI            0x81
 134#define DMAC_TXADRLO            0x02
 135#define DMAC_TXADRMD            0x82
 136#define DMAC_TXADRHI            0x03
 137
 138#define DMAC_DEVCON0            0x04
 139#define DEVCON0_AKL             (1<<7)
 140#define DEVCON0_RQL             (1<<6)
 141#define DEVCON0_EXW             (1<<5)
 142#define DEVCON0_ROT             (1<<4)
 143#define DEVCON0_CMP             (1<<3)
 144#define DEVCON0_DDMA            (1<<2)
 145#define DEVCON0_AHLD            (1<<1)
 146#define DEVCON0_MTM             (1<<0)
 147
 148#define DMAC_DEVCON1            0x84
 149#define DEVCON1_WEV             (1<<1)
 150#define DEVCON1_BHLD            (1<<0)
 151
 152#define DMAC_MODECON            0x05
 153#define MODECON_WOED            0x01
 154#define MODECON_VERIFY          0x00
 155#define MODECON_READ            0x04
 156#define MODECON_WRITE           0x08
 157#define MODECON_AUTOINIT        0x10
 158#define MODECON_ADDRDIR         0x20
 159#define MODECON_DEMAND          0x00
 160#define MODECON_SINGLE          0x40
 161#define MODECON_BLOCK           0x80
 162#define MODECON_CASCADE         0xC0
 163
 164#define DMAC_STATUS             0x85
 165#define STATUS_TC0              (1<<0)
 166#define STATUS_RQ0              (1<<4)
 167
 168#define DMAC_TEMPLO             0x06
 169#define DMAC_TEMPHI             0x86
 170#define DMAC_REQREG             0x07
 171#define DMAC_MASKREG            0x87
 172#define MASKREG_M0              0x01
 173#define MASKREG_M1              0x02
 174#define MASKREG_M2              0x04
 175#define MASKREG_M3              0x08
 176
 177/* miscellaneous internal variables */
 178
 179#define MASK_ON         (MASKREG_M3|MASKREG_M2|MASKREG_M1|MASKREG_M0)
 180#define MASK_OFF        (MASKREG_M3|MASKREG_M2|MASKREG_M1)
 181
 182/*
 183 * SCSI driver phases
 184 */
 185typedef enum {
 186    PHASE_IDLE,                                 /* we're not planning on doing anything  */
 187    PHASE_CONNECTING,                           /* connecting to a target                */
 188    PHASE_CONNECTED,                            /* connected to a target                 */
 189    PHASE_MSGOUT,                               /* message out to device                 */
 190    PHASE_RECONNECTED,                          /* reconnected                           */
 191    PHASE_COMMANDPAUSED,                        /* command partly sent                   */
 192    PHASE_COMMAND,                              /* command all sent                      */
 193    PHASE_DATAOUT,                              /* data out to device                    */
 194    PHASE_DATAIN,                               /* data in from device                   */
 195    PHASE_STATUSIN,                             /* status in from device                 */
 196    PHASE_MSGIN,                                /* message in from device                */
 197    PHASE_DONE,                                 /* finished                              */
 198    PHASE_ABORTED,                              /* aborted                               */
 199    PHASE_DISCONNECT,                           /* disconnecting                         */
 200} phase_t;
 201
 202/*
 203 * After interrupt, what to do now
 204 */
 205typedef enum {
 206    INTR_IDLE,                                  /* not expecting another IRQ             */
 207    INTR_NEXT_COMMAND,                          /* start next command                    */
 208    INTR_PROCESSING,                            /* interrupt routine still processing    */
 209} intr_ret_t;
 210
 211/*
 212 * DMA direction
 213 */
 214typedef enum {
 215    DMA_OUT,                                    /* DMA from memory to chip              */
 216    DMA_IN                                      /* DMA from chip to memory              */
 217} dmadir_t;
 218
 219/*
 220 * Synchronous transfer state
 221 */
 222typedef enum {                                  /* Synchronous transfer state           */
 223    SYNC_ASYNCHRONOUS,                          /* don't negotiate synchronous transfers*/
 224    SYNC_NEGOCIATE,                             /* start negotiation                    */
 225    SYNC_SENT_REQUEST,                          /* sent SDTR message                    */
 226    SYNC_COMPLETED,                             /* received SDTR reply                  */
 227} syncxfer_t;
 228
 229/*
 230 * Command type
 231 */
 232typedef enum {                                  /* command type                         */
 233    CMD_READ,                                   /* READ_6, READ_10, READ_12             */
 234    CMD_WRITE,                                  /* WRITE_6, WRITE_10, WRITE_12          */
 235    CMD_MISC,                                   /* Others                               */
 236} cmdtype_t;
 237
 238/*
 239 * Data phase direction
 240 */
 241typedef enum {                                  /* Data direction                       */
 242    DATADIR_IN,                                 /* Data in phase expected               */
 243    DATADIR_OUT                                 /* Data out phase expected              */
 244} datadir_t;
 245
 246#include "queue.h"
 247#include "msgqueue.h"
 248
 249#define STATUS_BUFFER_SIZE      32
 250/*
 251 * This is used to dump the previous states of the SBIC
 252 */
 253struct status_entry {
 254        unsigned long   when;
 255        unsigned char   ssr;
 256        unsigned char   ph;
 257        unsigned char   irq;
 258        unsigned char   unused;
 259};
 260
 261#define ADD_STATUS(_q,_ssr,_ph,_irq) \
 262({                                                                      \
 263        host->status[(_q)][host->status_ptr[(_q)]].when = jiffies;      \
 264        host->status[(_q)][host->status_ptr[(_q)]].ssr  = (_ssr);       \
 265        host->status[(_q)][host->status_ptr[(_q)]].ph   = (_ph);        \
 266        host->status[(_q)][host->status_ptr[(_q)]].irq  = (_irq);       \
 267        host->status_ptr[(_q)] = (host->status_ptr[(_q)] + 1) & (STATUS_BUFFER_SIZE - 1); \
 268})
 269
 270/*
 271 * AcornSCSI host specific data
 272 */
 273typedef struct acornscsi_hostdata {
 274    /* miscellaneous */
 275    struct Scsi_Host    *host;                  /* host                                 */
 276    struct scsi_cmnd    *SCpnt;                 /* currently processing command         */
 277    struct scsi_cmnd    *origSCpnt;             /* original connecting command          */
 278    void __iomem        *base;                  /* memc base address                    */
 279    void __iomem        *fast;                  /* fast ioc base address                */
 280
 281    /* driver information */
 282    struct {
 283        unsigned int    irq;                    /* interrupt                            */
 284        phase_t         phase;                  /* current phase                        */
 285
 286        struct {
 287            unsigned char       target;         /* reconnected target                   */
 288            unsigned char       lun;            /* reconnected lun                      */
 289            unsigned char       tag;            /* reconnected tag                      */
 290        } reconnected;
 291
 292        struct scsi_pointer     SCp;                    /* current commands data pointer        */
 293
 294        MsgQueue_t      msgs;
 295
 296        unsigned short  last_message;           /* last message to be sent              */
 297        unsigned char   disconnectable:1;       /* this command can be disconnected     */
 298    } scsi;
 299
 300    /* statistics information */
 301    struct {
 302        unsigned int    queues;
 303        unsigned int    removes;
 304        unsigned int    fins;
 305        unsigned int    reads;
 306        unsigned int    writes;
 307        unsigned int    miscs;
 308        unsigned int    disconnects;
 309        unsigned int    aborts;
 310        unsigned int    resets;
 311    } stats;
 312
 313    /* queue handling */
 314    struct {
 315        Queue_t         issue;                  /* issue queue                          */
 316        Queue_t         disconnected;           /* disconnected command queue           */
 317    } queues;
 318
 319    /* per-device info */
 320    struct {
 321        unsigned char   sync_xfer;              /* synchronous transfer (SBIC value)    */
 322        syncxfer_t      sync_state;             /* sync xfer negotiation state          */
 323        unsigned char   disconnect_ok:1;        /* device can disconnect                */
 324    } device[8];
 325    unsigned long       busyluns[64 / sizeof(unsigned long)];/* array of bits indicating LUNs busy      */
 326
 327    /* DMA info */
 328    struct {
 329        unsigned int    free_addr;              /* next free address                    */
 330        unsigned int    start_addr;             /* start address of current transfer    */
 331        dmadir_t        direction;              /* dma direction                        */
 332        unsigned int    transferred;            /* number of bytes transferred          */
 333        unsigned int    xfer_start;             /* scheduled DMA transfer start         */
 334        unsigned int    xfer_length;            /* scheduled DMA transfer length        */
 335        char            *xfer_ptr;              /* pointer to area                      */
 336        unsigned char   xfer_required:1;        /* set if we need to transfer something */
 337        unsigned char   xfer_setup:1;           /* set if DMA is setup                  */
 338        unsigned char   xfer_done:1;            /* set if DMA reached end of BH list    */
 339    } dma;
 340
 341    /* card info */
 342    struct {
 343        unsigned char   page_reg;               /* current setting of page reg          */
 344    } card;
 345
 346    unsigned char status_ptr[9];
 347    struct status_entry status[9][STATUS_BUFFER_SIZE];
 348} AS_Host;
 349
 350#endif /* ACORNSCSI_H */
 351