OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [scsi/] [pcmcia/] [nsp_cs.h] - Blame information for rev 1780

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*=======================================================/
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
/* $Id: nsp_cs.h,v 1.1.1.1 2004-04-15 02:15:14 phoenix Exp $ */
14
 
15
#ifndef  __nsp_cs__
16
#define  __nsp_cs__
17
 
18
/* for debugging */
19
//#define NSP_DEBUG 9
20
 
21
/*
22
#define static
23
#define inline
24
*/
25
 
26
/************************************
27
 * Some useful macros...
28
 */
29
#define NUMBER(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) /* from XtNumber() in /usr/X11R6/include/X11/Intrinsic.h */
30
#define BIT(x)      (1L << (x))
31
#define MIN(a,b)    ((a) > (b) ? (b) : (a))
32
 
33
/* SCSI initiator must be ID 7 */
34
#define NSP_INITIATOR_ID  7
35
 
36
#define NSP_SELTIMEOUT 200
37
 
38
/***************************************************************************
39
 * register definitions
40
 ***************************************************************************/
41
/*========================================================================
42
 * base register
43
 ========================================================================*/
44
#define IRQCONTROL      0x00  /* R */
45
#  define IRQCONTROL_RESELECT_CLEAR     BIT(0)
46
#  define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1)
47
#  define IRQCONTROL_TIMER_CLEAR        BIT(2)
48
#  define IRQCONTROL_FIFO_CLEAR         BIT(3)
49
#  define IRQCONTROL_SCSI_IRQ_MASK      BIT(4)
50
#  define IRQCONTROL_EXT_IRQ_MASK       BIT(5)
51
#  define IRQCONTROL_TIMER_IRQ_MASK     BIT(6)
52
#  define IRQCONTROL_FIFO_IRQ_MASK      BIT(7)
53
#  define IRQCONTROL_ALL_MASK           (IRQCONTROL_SCSI_IRQ_MASK  | \
54
                                         IRQCONTROL_EXT_IRQ_MASK   | \
55
                                         IRQCONTROL_TIMER_IRQ_MASK | \
56
                                         IRQCONTROL_FIFO_IRQ_MASK  )
57
#  define IRQCONTROL_ALL_CLEAR          (IRQCONTROL_RESELECT_CLEAR     | \
58
                                         IRQCONTROL_PHASE_CHANGE_CLEAR | \
59
                                         IRQCONTROL_TIMER_CLEAR        | \
60
                                         IRQCONTROL_FIFO_CLEAR         )
61
#  define IRQCONTROL_ALL_CLEAR_AND_MASK  (IRQCONTROL_ALL_MASK | \
62
                                          IRQCONTROL_ALL_CLEAR)
63
 
64
#define IRQSTATUS       0x00  /* W */
65
#  define IRQSTATUS_SCSI  BIT(0)
66
#  define IRQSTATUS_TIMER BIT(2)
67
#  define IRQSTATUS_FIFO  BIT(3)
68
#  define IRQSTATUS_MASK  0x0f
69
 
70
#define IFSELECT        0x01 /* W */
71
#  define IF_IFSEL    BIT(0)
72
#  define IF_REGSEL   BIT(2)
73
 
74
#define FIFOSTATUS      0x01 /* R */
75
#  define FIFOSTATUS_CHIP_REVISION_MASK 0x0f
76
#  define FIFOSTATUS_CHIP_ID_MASK       0x70
77
#  define FIFOSTATUS_FULL_EMPTY         BIT(7)
78
 
79
#define INDEXREG        0x02 /* R/W */
80
#define DATAREG         0x03 /* R/W */
81
#define FIFODATA        0x04 /* R/W */
82
#define FIFODATA1       0x05 /* R/W */
83
#define FIFODATA2       0x06 /* R/W */
84
#define FIFODATA3       0x07 /* R/W */
85
 
86
/*====================================================================
87
 * indexed register
88
 ====================================================================*/
89
#define EXTBUSCTRL      0x10 /* R/W,deleted */
90
 
91
#define CLOCKDIV        0x11 /* R/W */
92
#  define CLOCK_40M 0x02
93
#  define CLOCK_20M 0x01
94
#  define FAST_20   BIT(2)
95
 
96
#define TERMPWRCTRL     0x13 /* R/W */
97
#  define POWER_ON BIT(0)
98
 
99
#define SCSIIRQMODE     0x15 /* R/W */
100
#  define SCSI_PHASE_CHANGE_EI BIT(0)
101
#  define RESELECT_EI          BIT(4)
102
#  define FIFO_IRQ_EI          BIT(5)
103
#  define SCSI_RESET_IRQ_EI    BIT(6)
104
 
105
#define IRQPHASESENCE   0x16 /* R */
106
#  define LATCHED_MSG      BIT(0)
107
#  define LATCHED_IO       BIT(1)
108
#  define LATCHED_CD       BIT(2)
109
#  define LATCHED_BUS_FREE BIT(3)
110
#  define PHASE_CHANGE_IRQ BIT(4)
111
#  define RESELECT_IRQ     BIT(5)
112
#  define FIFO_IRQ         BIT(6)
113
#  define SCSI_RESET_IRQ   BIT(7)
114
 
115
#define TIMERCOUNT      0x17 /* R/W */
116
 
117
#define SCSIBUSCTRL     0x18 /* R/W */
118
#  define SCSI_SEL         BIT(0)
119
#  define SCSI_RST         BIT(1)
120
#  define SCSI_DATAOUT_ENB BIT(2)
121
#  define SCSI_ATN         BIT(3)
122
#  define SCSI_ACK         BIT(4)
123
#  define SCSI_BSY         BIT(5)
124
#  define AUTODIRECTION    BIT(6)
125
#  define ACKENB           BIT(7)
126
 
127
#define SCSIBUSMON      0x19 /* R */
128
 
129
#define SETARBIT        0x1A /* W */
130
#  define ARBIT_GO         BIT(0)
131
#  define ARBIT_FLAG_CLEAR BIT(1)
132
 
133
#define ARBITSTATUS     0x1A /* R */
134
/*#  define ARBIT_GO        BIT(0)*/
135
#  define ARBIT_WIN        BIT(1)
136
#  define ARBIT_FAIL       BIT(2)
137
#  define RESELECT_FLAG    BIT(3)
138
 
139
#define PARITYCTRL      0x1B  /* W */
140
#define PARITYSTATUS    0x1B  /* R */
141
 
142
#define COMMANDCTRL     0x1C  /* W */
143
#  define CLEAR_COMMAND_POINTER BIT(0)
144
#  define AUTO_COMMAND_GO       BIT(1)
145
 
146
#define RESELECTID      0x1C  /* R   */
147
#define COMMANDDATA     0x1D  /* R/W */
148
 
149
#define POINTERCLR      0x1E  /*   W */
150
#  define POINTER_CLEAR      BIT(0)
151
#  define ACK_COUNTER_CLEAR  BIT(1)
152
#  define REQ_COUNTER_CLEAR  BIT(2)
153
#  define HOST_COUNTER_CLEAR BIT(3)
154
#  define READ_SOURCE        (BIT(4) | BIT(5))
155
#    define ACK_COUNTER        (0)
156
#    define REQ_COUNTER        (BIT(4))
157
#    define HOST_COUNTER       (BIT(5))
158
 
159
#define TRANSFERCOUNT   0x1E  /* R   */
160
 
161
#define TRANSFERMODE    0x20  /* R/W */
162
#  define MODE_MEM8   BIT(0)
163
#  define MODE_MEM32  BIT(1)
164
#  define MODE_ADR24  BIT(2)
165
#  define MODE_ADR32  BIT(3)
166
#  define MODE_IO8    BIT(4)
167
#  define MODE_IO32   BIT(5)
168
#  define TRANSFER_GO BIT(6)
169
#  define BRAIND      BIT(7)
170
 
171
#define SYNCREG         0x21 /* R/W */
172
#  define SYNCREG_OFFSET_MASK  0x0f
173
#  define SYNCREG_PERIOD_MASK  0xf0
174
#  define SYNCREG_PERIOD_SHIFT 4
175
 
176
#define SCSIDATALATCH   0x22 /*   W */
177
#define SCSIDATAIN      0x22 /* R   */
178
#define SCSIDATAWITHACK 0x23 /* R/W */
179
#define SCAMCONTROL     0x24 /*   W */
180
#define SCAMSTATUS      0x24 /* R   */
181
#define SCAMDATA        0x25 /* R/W */
182
 
183
#define OTHERCONTROL    0x26 /* R/W */
184
#  define TPL_ROM_WRITE_EN BIT(0)
185
#  define TPWR_OUT         BIT(1)
186
#  define TPWR_SENSE       BIT(2)
187
#  define RA8_CONTROL      BIT(3)
188
 
189
#define ACKWIDTH        0x27 /* R/W */
190
#define CLRTESTPNT      0x28 /*   W */
191
#define ACKCNTLD        0x29 /*   W */
192
#define REQCNTLD        0x2A /*   W */
193
#define HSTCNTLD        0x2B /*   W */
194
#define CHECKSUM        0x2C /* R/W */
195
 
196
/************************************************************************
197
 * Input status bit definitions.
198
 ************************************************************************/
199
#define S_MESSAGE       BIT(0)    /* Message line from SCSI bus      */
200
#define S_IO            BIT(1)    /* Input/Output line from SCSI bus */
201
#define S_CD            BIT(2)    /* Command/Data line from SCSI bus */
202
#define S_BUSY          BIT(3)    /* Busy line from SCSI bus         */
203
#define S_ACK           BIT(4)    /* Acknowlege line from SCSI bus   */
204
#define S_REQUEST       BIT(5)    /* Request line from SCSI bus      */
205
#define S_SELECT        BIT(6)    /*                                 */
206
#define S_ATN           BIT(7)    /*                                 */
207
 
208
/***********************************************************************
209
 * Useful Bus Monitor status combinations.
210
 ***********************************************************************/
211
#define BUSMON_SEL         S_SELECT
212
#define BUSMON_BSY         S_BUSY
213
#define BUSMON_REQ         S_REQUEST
214
#define BUSMON_IO          S_IO
215
#define BUSMON_ACK         S_ACK
216
#define BUSMON_BUS_FREE    0
217
#define BUSMON_COMMAND     ( S_BUSY | S_CD |                    S_REQUEST )
218
#define BUSMON_MESSAGE_IN  ( S_BUSY | S_CD | S_IO | S_MESSAGE | S_REQUEST )
219
#define BUSMON_MESSAGE_OUT ( S_BUSY | S_CD |        S_MESSAGE | S_REQUEST )
220
#define BUSMON_DATA_IN     ( S_BUSY |        S_IO |             S_REQUEST )
221
#define BUSMON_DATA_OUT    ( S_BUSY |                           S_REQUEST )
222
#define BUSMON_STATUS      ( S_BUSY | S_CD | S_IO |             S_REQUEST )
223
#define BUSMON_SELECT      (                 S_IO |                        S_SELECT )
224
#define BUSMON_RESELECT    (                 S_IO |                        S_SELECT )
225
#define BUSMON_PHASE_MASK  (          S_CD | S_IO | S_MESSAGE |            S_SELECT )
226
 
227
#define BUSPHASE_SELECT      ( BUSMON_SELECT      & BUSMON_PHASE_MASK )
228
#define BUSPHASE_COMMAND     ( BUSMON_COMMAND     & BUSMON_PHASE_MASK )
229
#define BUSPHASE_MESSAGE_IN  ( BUSMON_MESSAGE_IN  & BUSMON_PHASE_MASK )
230
#define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK )
231
#define BUSPHASE_DATA_IN     ( BUSMON_DATA_IN     & BUSMON_PHASE_MASK )
232
#define BUSPHASE_DATA_OUT    ( BUSMON_DATA_OUT    & BUSMON_PHASE_MASK )
233
#define BUSPHASE_STATUS      ( BUSMON_STATUS      & BUSMON_PHASE_MASK )
234
 
235
/*====================================================================*/
236
 
237
typedef struct scsi_info_t {
238
        dev_link_t             link;
239
        struct Scsi_Host      *host;
240
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
241
        dev_node_t             node;
242
#else
243
        int                    ndev;
244
        dev_node_t             node[8];
245
        struct bus_operations *bus;
246
#endif
247
        int                    stop;
248
} scsi_info_t;
249
 
250
 
251
/* synchronous transfer negotiation data */
252
typedef struct _sync_data {
253
        unsigned int SyncNegotiation;
254
#define SYNC_NOT_YET 0
255
#define SYNC_OK      1
256
#define SYNC_NG      2
257
 
258
        unsigned int  SyncPeriod;
259
        unsigned int  SyncOffset;
260
        unsigned char SyncRegister;
261
        unsigned char AckWidth;
262
} sync_data;
263
 
264
typedef struct _nsp_hw_data {
265
        unsigned int  BaseAddress;
266
        unsigned int  NumAddress;
267
        unsigned int  IrqNumber;
268
 
269
        unsigned long MmioAddress;
270
#define NSP_MMIO_OFFSET 0x0800
271
        unsigned long MmioLength;
272
 
273
        unsigned char ScsiClockDiv;
274
        unsigned char TransferMode;
275
        unsigned char ChipRev;
276
 
277
        int           TimerCount;
278
        int           SelectionTimeOut;
279
        Scsi_Cmnd    *CurrentSC;
280
        //int           CurrnetTarget;
281
 
282
        int           FifoCount;
283
 
284
#define MSGBUF_SIZE 20
285
        unsigned char MsgBuffer[MSGBUF_SIZE];
286
        int MsgLen;
287
 
288
#define N_TARGET 8
289
        sync_data     Sync[N_TARGET];
290
 
291
        char nspinfo[110];     /* description */
292
        spinlock_t Lock;
293
 
294
        scsi_info_t   *ScsiInfo; /* attach <-> detect glue */
295
 
296
 
297
#ifdef NSP_DEBUG
298
        int CmdId; /* Accepted command serial number.
299
                      Used for debugging.             */
300
#endif
301
} nsp_hw_data;
302
 
303
 
304
/****************************************************************************
305
 *
306
 */
307
 
308
/* Card service functions */
309
static dev_link_t *nsp_cs_attach (void);
310
static void        nsp_cs_detach (dev_link_t *link);
311
static void        nsp_cs_release(dev_link_t *link);
312
static void        nsp_cs_config (dev_link_t *link);
313
static int         nsp_cs_event  (event_t event, int priority, event_callback_args_t *args);
314
 
315
/* Linux SCSI subsystem specific functions */
316
static struct Scsi_Host *nsp_detect     (Scsi_Host_Template *sht);
317
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
318
static        int        nsp_detect_old (Scsi_Host_Template *sht);
319
static        int        nsp_release_old(struct Scsi_Host *shpnt);
320
#endif
321
static const  char      *nsp_info       (struct Scsi_Host *shpnt);
322
static        int        nsp_proc_info  (
323
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
324
                                         struct Scsi_Host *host,
325
#endif
326
                                         char   *buffer,
327
                                         char  **start,
328
                                         off_t   offset,
329
                                         int     length,
330
#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
331
                                         int     hostno,
332
#endif
333
                                         int     inout);
334
static        int        nsp_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *SCpnt));
335
 
336
/* Error handler */
337
/*static int nsp_eh_abort       (Scsi_Cmnd *SCpnt);*/
338
/*static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);*/
339
static int nsp_eh_bus_reset    (Scsi_Cmnd *SCpnt);
340
static int nsp_eh_host_reset   (Scsi_Cmnd *SCpnt);
341
static int nsp_bus_reset       (nsp_hw_data *data);
342
 
343
/* */
344
static int  nsphw_init           (nsp_hw_data *data);
345
static int  nsphw_start_selection(Scsi_Cmnd *SCpnt);
346
static void nsp_start_timer      (Scsi_Cmnd *SCpnt, int time);
347
static int  nsp_fifo_count       (Scsi_Cmnd *SCpnt);
348
static void nsp_pio_read         (Scsi_Cmnd *SCpnt);
349
static void nsp_pio_write        (Scsi_Cmnd *SCpnt);
350
static int  nsp_nexus            (Scsi_Cmnd *SCpnt);
351
static void nsp_scsi_done        (Scsi_Cmnd *SCpnt);
352
static int  nsp_analyze_sdtr     (Scsi_Cmnd *SCpnt);
353
static int  nsp_negate_signal    (Scsi_Cmnd *SCpnt, unsigned char mask, char *str);
354
static int  nsp_expect_signal    (Scsi_Cmnd *SCpnt, unsigned char current_phase, unsigned char  mask);
355
static int  nsp_xfer             (Scsi_Cmnd *SCpnt, int phase);
356
static int  nsp_dataphase_bypass (Scsi_Cmnd *SCpnt);
357
static int  nsp_reselected       (Scsi_Cmnd *SCpnt);
358
static struct Scsi_Host *nsp_detect(Scsi_Host_Template *sht);
359
 
360
/* Interrupt handler */
361
//static irqreturn_t nspintr(int irq, void *dev_id, struct pt_regs *regs);
362
 
363
/* Module entry point*/
364
static int  __init nsp_cs_init(void);
365
static void __exit nsp_cs_exit(void);
366
 
367
 
368
/* Debug */
369
#ifdef NSP_DEBUG
370
static void show_command (Scsi_Cmnd *SCpnt);
371
static void show_phase   (Scsi_Cmnd *SCpnt);
372
static void show_busphase(unsigned char stat);
373
static void show_message (nsp_hw_data *data);
374
#else
375
# define show_command(ptr)   /* */
376
# define show_phase(SCpnt)   /* */
377
# define show_busphase(stat) /* */
378
# define show_message(data)  /* */
379
#endif
380
 
381
/*
382
 * SCSI phase
383
 */
384
enum _scsi_phase {
385
        PH_UNDETERMINED ,
386
        PH_ARBSTART     ,
387
        PH_SELSTART     ,
388
        PH_SELECTED     ,
389
        PH_COMMAND      ,
390
        PH_DATA         ,
391
        PH_STATUS       ,
392
        PH_MSG_IN       ,
393
        PH_MSG_OUT      ,
394
        PH_DISCONNECT   ,
395
        PH_RESELECT     ,
396
        PH_ABORT        ,
397
        PH_RESET
398
};
399
 
400
enum _data_in_out {
401
        IO_UNKNOWN,
402
        IO_IN,
403
        IO_OUT
404
};
405
 
406
enum _burst_mode {
407
        BURST_IO8   = 0,
408
        BURST_IO32  = 1,
409
        BURST_MEM32 = 2,
410
};
411
 
412
 
413
/**************************************************************************
414
 * SCSI messaage
415
 */
416
#define MSG_COMMAND_COMPLETE 0x00
417
#define MSG_EXTENDED         0x01
418
#define MSG_ABORT            0x06
419
#define MSG_NO_OPERATION     0x08
420
#define MSG_BUS_DEVICE_RESET 0x0c
421
 
422
#define MSG_EXT_SDTR         0x01
423
 
424
 
425
/**************************************************************************
426
 * Compatibility functions
427
 */
428
 
429
/* for Kernel 2.4 */
430
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))
431
# define scsi_register_host(template)   scsi_register_module(MODULE_SCSI_HA, template)
432
# define scsi_unregister_host(template) scsi_unregister_module(MODULE_SCSI_HA, template)
433
# define scsi_host_put(host)            scsi_unregister(host)
434
 
435
# define IRQ_NONE      /* */
436
# define IRQ_HANDLED   /* */
437
# define IRQ_RETVAL(x) /* */
438
 
439
/* This is ad-hoc version of scsi_host_get_next() */
440
static inline struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *host)
441
{
442
        if (host == NULL) {
443
                return scsi_hostlist;
444
        } else {
445
                return host->next;
446
        }
447
}
448
 
449
/* This is ad-hoc version of scsi_host_hn_get() */
450
static inline struct Scsi_Host *scsi_host_hn_get(unsigned short hostno)
451
{
452
        struct Scsi_Host *host;
453
 
454
        for (host = scsi_host_get_next(NULL); host != NULL;
455
             host = scsi_host_get_next(host)) {
456
                if (host->host_no == hostno) {
457
                        break;
458
                }
459
        }
460
 
461
        return host;
462
}
463
 
464
static void cs_error(client_handle_t handle, int func, int ret)
465
{
466
        error_info_t err = { func, ret };
467
        CardServices(ReportError, handle, &err);
468
}
469
 
470
/* scatter-gather table */
471
# define SG_ADDRESS(buffer) ((buffer)->address)
472
 
473
/* host spin lock */
474
# define HOST_LOCK          (&io_request_lock)
475
#endif
476
 
477
/* for Kernel 2.6 */
478
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
479
/* scatter-gather table */
480
# define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset))
481
 
482
/* host spin lock */
483
# define HOST_LOCK          (((scsi_info_t *)dev_id)->host->host_lock)
484
#endif
485
 
486
#endif  /*__nsp_cs__*/
487
/* end */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.