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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [scsi/] [53c700.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/* -*- mode: c; c-basic-offset: 8 -*- */
2
 
3
/* Driver for 53c700 and 53c700-66 chips from NCR and Symbios
4
 *
5
 * Copyright (C) 2001 by James.Bottomley@HansenPartnership.com
6
 */
7
 
8
#ifndef _53C700_H
9
#define _53C700_H
10
 
11
/* Turn on for general debugging---too verbose for normal use */
12
#undef NCR_700_DEBUG
13
/* Debug the tag queues, checking hash queue allocation and deallocation
14
 * and search for duplicate tags */
15
#undef NCR_700_TAG_DEBUG
16
 
17
#ifdef NCR_700_DEBUG
18
#define DEBUG(x)        printk x
19
#else
20
#define DEBUG(x)
21
#endif
22
 
23
/* The number of available command slots */
24
#define NCR_700_COMMAND_SLOTS_PER_HOST  64
25
/* The maximum number of Scatter Gathers we allow */
26
#define NCR_700_SG_SEGMENTS             32
27
/* The maximum number of luns (make this of the form 2^n) */
28
#define NCR_700_MAX_LUNS                32
29
#define NCR_700_LUN_MASK                (NCR_700_MAX_LUNS - 1)
30
/* Alter this with care: too many tags won't give the elevator a chance to
31
 * work; too few will cause the device to operate less efficiently */
32
#define NCR_700_MAX_TAGS                16
33
/* magic byte identifying an internally generated REQUEST_SENSE command */
34
#define NCR_700_INTERNAL_SENSE_MAGIC    0x42
35
 
36
/* WARNING: Leave this in for now: the dependency preprocessor doesn't
37
 * pick up file specific flags, so must define here if they are not
38
 * set */
39
#if !defined(CONFIG_53C700_IO_MAPPED) && !defined(CONFIG_53C700_MEM_MAPPED)
40
#error "Config.in must define either CONFIG_53C700_IO_MAPPED or CONFIG_53C700_MEM_MAPPED to use this scsi core."
41
#endif
42
 
43
/* macros for consistent memory allocation */
44
 
45
#ifdef CONFIG_53C700_USE_CONSISTENT
46
#define NCR_700_dma_cache_wback(mem, size) \
47
        if(!hostdata->consistent) \
48
                dma_cache_wback(mem, size)
49
#define NCR_700_dma_cache_inv(mem, size) \
50
        if(!hostdata->consistent) \
51
                dma_cache_inv(mem, size)
52
#define NCR_700_dma_cache_wback_inv(mem, size) \
53
        if(!hostdata->consistent) \
54
                dma_cache_wback_inv(mem, size)
55
#else
56
#define NCR_700_dma_cache_wback(mem, size) dma_cache_wback(mem,size)
57
#define NCR_700_dma_cache_inv(mem, size) dma_cache_inv(mem,size)
58
#define NCR_700_dma_cache_wback_inv(mem, size) dma_cache_wback_inv(mem,size)
59
#endif
60
 
61
 
62
struct NCR_700_Host_Parameters;
63
 
64
/* These are the externally used routines */
65
struct Scsi_Host *NCR_700_detect(Scsi_Host_Template *, struct NCR_700_Host_Parameters *);
66
int NCR_700_release(struct Scsi_Host *host);
67
void NCR_700_intr(int, void *, struct pt_regs *);
68
 
69
 
70
enum NCR_700_Host_State {
71
        NCR_700_HOST_BUSY,
72
        NCR_700_HOST_FREE,
73
};
74
 
75
struct NCR_700_SG_List {
76
        /* The following is a script fragment to move the buffer onto the
77
         * bus and then link the next fragment or return */
78
        #define SCRIPT_MOVE_DATA_IN             0x09000000
79
        #define SCRIPT_MOVE_DATA_OUT            0x08000000
80
        __u32   ins;
81
        __u32   pAddr;
82
        #define SCRIPT_NOP                      0x80000000
83
        #define SCRIPT_RETURN                   0x90080000
84
};
85
 
86
/* We use device->hostdata to store negotiated parameters.  This is
87
 * supposed to be a pointer to a device private area, but we cannot
88
 * really use it as such since it will never be freed, so just use the
89
 * 32 bits to cram the information.  The SYNC negotiation sequence looks
90
 * like:
91
 *
92
 * If DEV_NEGOTIATED_SYNC not set, tack and SDTR message on to the
93
 * initial identify for the device and set DEV_BEGIN_SYNC_NEGOTATION
94
 * If we get an SDTR reply, work out the SXFER parameters, squirrel
95
 * them away here, clear DEV_BEGIN_SYNC_NEGOTIATION and set
96
 * DEV_NEGOTIATED_SYNC.  If we get a REJECT msg, squirrel
97
 *
98
 *
99
 * 0:7  SXFER_REG negotiated value for this device
100
 * 8:15 Current queue depth
101
 * 16   negotiated SYNC flag
102
 * 17 begin SYNC negotiation flag
103
 * 18 device supports tag queueing */
104
#define NCR_700_DEV_NEGOTIATED_SYNC     (1<<16)
105
#define NCR_700_DEV_BEGIN_SYNC_NEGOTIATION      (1<<17)
106
#define NCR_700_DEV_BEGIN_TAG_QUEUEING  (1<<18)
107
#define NCR_700_DEV_TAG_STARVATION_WARNED (1<<19)
108
 
109
static inline void
110
NCR_700_set_SXFER(Scsi_Device *SDp, __u8 sxfer)
111
{
112
        ((unsigned long)SDp->hostdata) &= 0xffffff00;
113
        ((unsigned long)SDp->hostdata) |= sxfer & 0xff;
114
}
115
static inline __u8 NCR_700_get_SXFER(Scsi_Device *SDp)
116
{
117
        return (((unsigned long)SDp->hostdata) & 0xff);
118
}
119
static inline void
120
NCR_700_set_depth(Scsi_Device *SDp, __u8 depth)
121
{
122
        ((unsigned long)SDp->hostdata) &= 0xffff00ff;
123
        ((unsigned long)SDp->hostdata) |= (0xff00 & (depth << 8));
124
}
125
static inline __u8
126
NCR_700_get_depth(Scsi_Device *SDp)
127
{
128
        return ((((unsigned long)SDp->hostdata) & 0xff00)>>8);
129
}
130
static inline int
131
NCR_700_is_flag_set(Scsi_Device *SDp, __u32 flag)
132
{
133
        return (((unsigned long)SDp->hostdata) & flag) == flag;
134
}
135
static inline int
136
NCR_700_is_flag_clear(Scsi_Device *SDp, __u32 flag)
137
{
138
        return (((unsigned long)SDp->hostdata) & flag) == 0;
139
}
140
static inline void
141
NCR_700_set_flag(Scsi_Device *SDp, __u32 flag)
142
{
143
        ((unsigned long)SDp->hostdata) |= (flag & 0xffff0000);
144
}
145
static inline void
146
NCR_700_clear_flag(Scsi_Device *SDp, __u32 flag)
147
{
148
        ((unsigned long)SDp->hostdata) &= ~(flag & 0xffff0000);
149
}
150
 
151
/* These represent the Nexus hashing functions.  A Nexus in SCSI terms
152
 * just means the identification of an outstanding command, by ITL
153
 * (Initiator Target Lun) or ITLQ (Initiator Target Lun Tag).  I'm not
154
 * very keen on XOR based hashes, so these are based on number theory
155
 * instead.  All you need to do is to fix your hash bucket size and
156
 * then choose reasonable strides which are coprime with the chosen
157
 * bucket size
158
 *
159
 * Note: this mathematical hash can be made very efficient, if the
160
 * compiler is good at optimising: Choose the number of buckets to be
161
 * 2^n and the modulo becomes a logical and with (2^n-1).
162
 * Additionally, if you chose the coprimes of the form 2^n-2^n the
163
 * multiplication can be done by a shift and an addition. */
164
#define MAX_ITL_HASH_BUCKETS    16
165
#define ITL_HASH_PRIME          7
166
 
167
#define MAX_ITLQ_HASH_BUCKETS   64
168
#define ITLQ_PUN_PRIME          7
169
#define ITLQ_LUN_PRIME          3
170
 
171
static inline int
172
hash_ITL(__u8 pun, __u8 lun)
173
{
174
        return (pun*ITL_HASH_PRIME + lun) % MAX_ITL_HASH_BUCKETS;
175
}
176
 
177
static inline int
178
hash_ITLQ(__u8 pun, __u8 lun, __u8 tag)
179
{
180
        return (pun*ITLQ_PUN_PRIME + lun*ITLQ_LUN_PRIME + tag) % MAX_ITLQ_HASH_BUCKETS;
181
}
182
 
183
struct NCR_700_command_slot {
184
        struct NCR_700_SG_List  SG[NCR_700_SG_SEGMENTS+1];
185
        struct NCR_700_SG_List  *pSG;
186
        #define NCR_700_SLOT_MASK 0xFC
187
        #define NCR_700_SLOT_MAGIC 0xb8
188
        #define NCR_700_SLOT_FREE (0|NCR_700_SLOT_MAGIC) /* slot may be used */
189
        #define NCR_700_SLOT_BUSY (1|NCR_700_SLOT_MAGIC) /* slot has command active on HA */
190
        #define NCR_700_SLOT_QUEUED (2|NCR_700_SLOT_MAGIC) /* slot has command to be made active on HA */
191
        __u8    state;
192
        #define NCR_700_NO_TAG  0xdead
193
        __u16   tag;
194
        __u32   resume_offset;
195
        Scsi_Cmnd       *cmnd;
196
        /* The pci_mapped address of the actual command in cmnd */
197
        dma_addr_t      pCmd;
198
        __u32           temp;
199
        /* if this command is a pci_single mapping, holds the dma address
200
         * for later unmapping in the done routine */
201
        dma_addr_t      dma_handle;
202
        /* Doubly linked ITL/ITLQ list kept in strict time order
203
         * (latest at the back) */
204
        struct NCR_700_command_slot *ITL_forw;
205
        struct NCR_700_command_slot *ITL_back;
206
        struct NCR_700_command_slot *ITLQ_forw;
207
        struct NCR_700_command_slot *ITLQ_back;
208
};
209
 
210
struct NCR_700_Host_Parameters {
211
        /* These must be filled in by the calling driver */
212
        int     clock;                  /* board clock speed in MHz */
213
        unsigned long   base;           /* the base for the port (copied to host) */
214
        struct pci_dev  *pci_dev;
215
        __u32   dmode_extra;    /* adjustable bus settings */
216
        __u32   differential:1; /* if we are differential */
217
#ifdef CONFIG_53C700_LE_ON_BE
218
        /* This option is for HP only.  Set it if your chip is wired for
219
         * little endian on this platform (which is big endian) */
220
        __u32   force_le_on_be:1;
221
#endif
222
        __u32   chip710:1;      /* set if really a 710 not 700 */
223
        __u32   burst_disable:1;        /* set to 1 to disable 710 bursting */
224
 
225
        /* NOTHING BELOW HERE NEEDS ALTERING */
226
        __u32   fast:1;         /* if we can alter the SCSI bus clock
227
                                   speed (so can negiotiate sync) */
228
#ifdef CONFIG_53C700_USE_CONSISTENT
229
        __u32   consistent:1;
230
#endif
231
 
232
        int     sync_clock;     /* The speed of the SYNC core */
233
 
234
        __u32   *script;                /* pointer to script location */
235
        __u32   pScript;                /* physical mem addr of script */
236
 
237
        /* This will be the host lock.  Unfortunately, we can't use it
238
         * at the moment because of the necessity of holding the
239
         * io_request_lock */
240
        spinlock_t lock;
241
        enum NCR_700_Host_State state; /* protected by state lock */
242
        Scsi_Cmnd *cmd;
243
        /* Note: pScript contains the single consistent block of
244
         * memory.  All the msgin, msgout and status are allocated in
245
         * this memory too (at separate cache lines).  TOTAL_MEM_SIZE
246
         * represents the total size of this area */
247
#define MSG_ARRAY_SIZE  8
248
#define MSGOUT_OFFSET   (L1_CACHE_ALIGN(sizeof(SCRIPT)))
249
        __u8    *msgout;
250
#define MSGIN_OFFSET    (MSGOUT_OFFSET + L1_CACHE_ALIGN(MSG_ARRAY_SIZE))
251
        __u8    *msgin;
252
#define STATUS_OFFSET   (MSGIN_OFFSET + L1_CACHE_ALIGN(MSG_ARRAY_SIZE))
253
        __u8    *status;
254
#define SLOTS_OFFSET    (STATUS_OFFSET + L1_CACHE_ALIGN(MSG_ARRAY_SIZE))
255
        struct NCR_700_command_slot     *slots;
256
#define TOTAL_MEM_SIZE  (SLOTS_OFFSET + L1_CACHE_ALIGN(sizeof(struct NCR_700_command_slot) * NCR_700_COMMAND_SLOTS_PER_HOST))
257
        int     saved_slot_position;
258
        int     command_slot_count; /* protected by state lock */
259
        __u8    tag_negotiated;
260
        __u8    rev;
261
        __u8    reselection_id;
262
        /* flags for the host */
263
 
264
        /* ITL list.  ALL outstanding commands are hashed here in strict
265
         * order, latest at the back */
266
        struct NCR_700_command_slot *ITL_Hash_forw[MAX_ITL_HASH_BUCKETS];
267
        struct NCR_700_command_slot *ITL_Hash_back[MAX_ITL_HASH_BUCKETS];
268
 
269
        /* Only tagged outstanding commands are hashed here (also latest
270
         * at the back) */
271
        struct NCR_700_command_slot *ITLQ_Hash_forw[MAX_ITLQ_HASH_BUCKETS];
272
        struct NCR_700_command_slot *ITLQ_Hash_back[MAX_ITLQ_HASH_BUCKETS];
273
 
274
        /* Free list, singly linked by ITL_forw elements */
275
        struct NCR_700_command_slot *free_list;
276
};
277
 
278
/*
279
 *      53C700 Register Interface - the offset from the Selected base
280
 *      I/O address */
281
#ifdef CONFIG_53C700_LE_ON_BE
282
#define bE      (hostdata->force_le_on_be ? 0 : 3)
283
#define bSWAP   (hostdata->force_le_on_be)
284
#elif defined(__BIG_ENDIAN)
285
#define bE      3
286
#define bSWAP   0
287
#elif defined(__LITTLE_ENDIAN)
288
#define bE      0
289
#define bSWAP   0
290
#else
291
#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined, did you include byteorder.h?"
292
#endif
293
#define bS_to_cpu(x)    (bSWAP ? le32_to_cpu(x) : (x))
294
#define bS_to_host(x)   (bSWAP ? cpu_to_le32(x) : (x))
295
 
296
/* NOTE: These registers are in the LE register space only, the required byte
297
 * swapping is done by the NCR_700_{read|write}[b] functions */
298
#define SCNTL0_REG                      0x00
299
#define         FULL_ARBITRATION        0xc0
300
#define         PARITY                  0x08
301
#define         ENABLE_PARITY           0x04
302
#define         AUTO_ATN                0x02
303
#define SCNTL1_REG                      0x01
304
#define         SLOW_BUS                0x80
305
#define         ENABLE_SELECT           0x20
306
#define         ASSERT_RST              0x08
307
#define         ASSERT_EVEN_PARITY      0x04
308
#define SDID_REG                        0x02
309
#define SIEN_REG                        0x03
310
#define         PHASE_MM_INT            0x80
311
#define         FUNC_COMP_INT           0x40
312
#define         SEL_TIMEOUT_INT         0x20
313
#define         SELECT_INT              0x10
314
#define         GROSS_ERR_INT           0x08
315
#define         UX_DISC_INT             0x04
316
#define         RST_INT                 0x02
317
#define         PAR_ERR_INT             0x01
318
#define SCID_REG                        0x04
319
#define SXFER_REG                       0x05
320
#define         ASYNC_OPERATION         0x00
321
#define SODL_REG                        0x06
322
#define SOCL_REG                        0x07
323
#define SFBR_REG                        0x08
324
#define SIDL_REG                        0x09
325
#define SBDL_REG                        0x0A
326
#define SBCL_REG                        0x0B
327
/* read bits */
328
#define         SBCL_IO                 0x01
329
/*write bits */
330
#define         SYNC_DIV_AS_ASYNC       0x00
331
#define         SYNC_DIV_1_0            0x01
332
#define         SYNC_DIV_1_5            0x02
333
#define         SYNC_DIV_2_0            0x03
334
#define DSTAT_REG                       0x0C
335
#define         ILGL_INST_DETECTED      0x01
336
#define         WATCH_DOG_INTERRUPT     0x02
337
#define         SCRIPT_INT_RECEIVED     0x04
338
#define         ABORTED                 0x10
339
#define SSTAT0_REG                      0x0D
340
#define         PARITY_ERROR            0x01
341
#define         SCSI_RESET_DETECTED     0x02
342
#define         UNEXPECTED_DISCONNECT   0x04
343
#define         SCSI_GROSS_ERROR        0x08
344
#define         SELECTED                0x10
345
#define         SELECTION_TIMEOUT       0x20
346
#define         FUNCTION_COMPLETE       0x40
347
#define         PHASE_MISMATCH          0x80
348
#define SSTAT1_REG                      0x0E
349
#define         SIDL_REG_FULL           0x80
350
#define         SODR_REG_FULL           0x40
351
#define         SODL_REG_FULL           0x20
352
#define SSTAT2_REG                      0x0F
353
#define CTEST0_REG                      0x14
354
#define         BTB_TIMER_DISABLE       0x40
355
#define CTEST1_REG                      0x15
356
#define CTEST2_REG                      0x16
357
#define CTEST3_REG                      0x17
358
#define CTEST4_REG                      0x18
359
#define         DISABLE_FIFO            0x00
360
#define         SLBE                    0x10
361
#define         SFWR                    0x08
362
#define         BYTE_LANE0              0x04
363
#define         BYTE_LANE1              0x05
364
#define         BYTE_LANE2              0x06
365
#define         BYTE_LANE3              0x07
366
#define         SCSI_ZMODE              0x20
367
#define         ZMODE                   0x40
368
#define CTEST5_REG                      0x19
369
#define         MASTER_CONTROL          0x10
370
#define         DMA_DIRECTION           0x08
371
#define CTEST7_REG                      0x1B
372
#define         BURST_DISABLE           0x80 /* 710 only */
373
#define         SEL_TIMEOUT_DISABLE     0x10 /* 710 only */
374
#define         DFP                     0x08
375
#define         EVP                     0x04
376
#define         DIFF                    0x01
377
#define CTEST6_REG                      0x1A
378
#define TEMP_REG                        0x1C
379
#define DFIFO_REG                       0x20
380
#define         FLUSH_DMA_FIFO          0x80
381
#define         CLR_FIFO                0x40
382
#define ISTAT_REG                       0x21
383
#define         ABORT_OPERATION         0x80
384
#define         SOFTWARE_RESET_710      0x40
385
#define         DMA_INT_PENDING         0x01
386
#define         SCSI_INT_PENDING        0x02
387
#define         CONNECTED               0x08
388
#define CTEST8_REG                      0x22
389
#define         LAST_DIS_ENBL           0x01
390
#define         SHORTEN_FILTERING       0x04
391
#define         ENABLE_ACTIVE_NEGATION  0x10
392
#define         GENERATE_RECEIVE_PARITY 0x20
393
#define         CLR_FIFO_710            0x04
394
#define         FLUSH_DMA_FIFO_710      0x08
395
#define CTEST9_REG                      0x23
396
#define DBC_REG                         0x24
397
#define DCMD_REG                        0x27
398
#define DNAD_REG                        0x28
399
#define DIEN_REG                        0x39
400
#define         BUS_FAULT               0x20
401
#define         ABORT_INT               0x10
402
#define         INT_INST_INT            0x04
403
#define         WD_INT                  0x02
404
#define         ILGL_INST_INT           0x01
405
#define DCNTL_REG                       0x3B
406
#define         SOFTWARE_RESET          0x01
407
#define         COMPAT_700_MODE         0x01
408
#define         SCRPTS_16BITS           0x20
409
#define         ASYNC_DIV_2_0           0x00
410
#define         ASYNC_DIV_1_5           0x40
411
#define         ASYNC_DIV_1_0           0x80
412
#define         ASYNC_DIV_3_0           0xc0
413
#define DMODE_710_REG                   0x38
414
#define DMODE_700_REG                   0x34
415
#define         BURST_LENGTH_1          0x00
416
#define         BURST_LENGTH_2          0x40
417
#define         BURST_LENGTH_4          0x80
418
#define         BURST_LENGTH_8          0xC0
419
#define         DMODE_FC1               0x10
420
#define         DMODE_FC2               0x20
421
#define         BW16                    32 
422
#define         MODE_286                16
423
#define         IO_XFER                 8
424
#define         FIXED_ADDR              4
425
 
426
#define DSP_REG                         0x2C
427
#define DSPS_REG                        0x30
428
 
429
/* Parameters to begin SDTR negotiations.  Empirically, I find that
430
 * the 53c700-66 cannot handle an offset >8, so don't change this  */
431
#define NCR_700_MAX_OFFSET      8
432
/* Was hoping the max offset would be greater for the 710, but
433
 * empirically it seems to be 8 also */
434
#define NCR_710_MAX_OFFSET      8
435
#define NCR_700_MIN_XFERP       1
436
#define NCR_710_MIN_XFERP       0
437
#define NCR_700_MIN_PERIOD      25 /* for SDTR message, 100ns */
438
 
439
#define script_patch_32(script, symbol, value) \
440
{ \
441
        int i; \
442
        for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
443
                __u32 val = bS_to_cpu((script)[A_##symbol##_used[i]]) + value; \
444
                (script)[A_##symbol##_used[i]] = bS_to_host(val); \
445
                dma_cache_wback((unsigned long)&(script)[A_##symbol##_used[i]], 4); \
446
                DEBUG((" script, patching %s at %d to 0x%lx\n", \
447
                       #symbol, A_##symbol##_used[i], (value))); \
448
        } \
449
}
450
 
451
#define script_patch_32_abs(script, symbol, value) \
452
{ \
453
        int i; \
454
        for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
455
                (script)[A_##symbol##_used[i]] = bS_to_host(value); \
456
                dma_cache_wback((unsigned long)&(script)[A_##symbol##_used[i]], 4); \
457
                DEBUG((" script, patching %s at %d to 0x%lx\n", \
458
                       #symbol, A_##symbol##_used[i], (value))); \
459
        } \
460
}
461
 
462
/* Used for patching the SCSI ID in the SELECT instruction */
463
#define script_patch_ID(script, symbol, value) \
464
{ \
465
        int i; \
466
        for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
467
                __u32 val = bS_to_cpu((script)[A_##symbol##_used[i]]); \
468
                val &= 0xff00ffff; \
469
                val |= ((value) & 0xff) << 16; \
470
                (script)[A_##symbol##_used[i]] = bS_to_host(val); \
471
                dma_cache_wback((unsigned long)&(script)[A_##symbol##_used[i]], 4); \
472
                DEBUG((" script, patching ID field %s at %d to 0x%x\n", \
473
                       #symbol, A_##symbol##_used[i], val)); \
474
        } \
475
}
476
 
477
#define script_patch_16(script, symbol, value) \
478
{ \
479
        int i; \
480
        for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
481
                __u32 val = bS_to_cpu((script)[A_##symbol##_used[i]]); \
482
                val &= 0xffff0000; \
483
                val |= ((value) & 0xffff); \
484
                (script)[A_##symbol##_used[i]] = bS_to_host(val); \
485
                dma_cache_wback((unsigned long)&(script)[A_##symbol##_used[i]], 4); \
486
                DEBUG((" script, patching short field %s at %d to 0x%x\n", \
487
                       #symbol, A_##symbol##_used[i], val)); \
488
        } \
489
}
490
 
491
#endif
492
 
493
#ifdef CONFIG_53C700_MEM_MAPPED
494
static inline __u8
495
NCR_700_readb(struct Scsi_Host *host, __u32 reg)
496
{
497
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
498
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
499
 
500
        return readb(host->base + (reg^bE));
501
}
502
 
503
static inline __u32
504
NCR_700_readl(struct Scsi_Host *host, __u32 reg)
505
{
506
        __u32 value = __raw_readl(host->base + reg);
507
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
508
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
509
#if 1
510
        /* sanity check the register */
511
        if((reg & 0x3) != 0)
512
                BUG();
513
#endif
514
 
515
        return bS_to_cpu(value);
516
}
517
 
518
static inline void
519
NCR_700_writeb(__u8 value, struct Scsi_Host *host, __u32 reg)
520
{
521
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
522
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
523
 
524
        writeb(value, host->base + (reg^bE));
525
}
526
 
527
static inline void
528
NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
529
{
530
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
531
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
532
 
533
#if 1
534
        /* sanity check the register */
535
        if((reg & 0x3) != 0)
536
                BUG();
537
#endif
538
 
539
        __raw_writel(bS_to_host(value), host->base + reg);
540
}
541
#elif defined(CONFIG_53C700_IO_MAPPED)
542
static inline __u8
543
NCR_700_readb(struct Scsi_Host *host, __u32 reg)
544
{
545
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
546
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
547
 
548
        return inb(host->base + (reg^bE));
549
}
550
 
551
static inline __u32
552
NCR_700_readl(struct Scsi_Host *host, __u32 reg)
553
{
554
        __u32 value = inl(host->base + reg);
555
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
556
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
557
 
558
#if 1
559
        /* sanity check the register */
560
        if((reg & 0x3) != 0)
561
                BUG();
562
#endif
563
 
564
        return bS_to_cpu(value);
565
}
566
 
567
static inline void
568
NCR_700_writeb(__u8 value, struct Scsi_Host *host, __u32 reg)
569
{
570
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
571
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
572
 
573
        outb(value, host->base + (reg^bE));
574
}
575
 
576
static inline void
577
NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
578
{
579
        const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
580
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
581
 
582
#if 1
583
        /* sanity check the register */
584
        if((reg & 0x3) != 0)
585
                BUG();
586
#endif
587
 
588
        outl(bS_to_host(value), host->base + reg);
589
}
590
#endif

powered by: WebSVN 2.1.0

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