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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [drivers/] [scsi/] [FlashPoint.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1626 jcastillo
/*
2
 
3
  FlashPoint.c -- FlashPoint SCCB Manager for Linux
4
 
5
  This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
6
  Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
7
  Linux compatibility.  It was provided by BusLogic in the form of 16 separate
8
  source files, which would have unnecessarily cluttered the scsi directory, so
9
  the individual files have been combined into this single file.
10
 
11
  Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
12
 
13
  This file is available under both the GNU General Public License
14
  and a BSD-style copyright; see LICENSE.FlashPoint for details.
15
 
16
*/
17
 
18
 
19
#include <linux/config.h>
20
 
21
 
22
#ifndef CONFIG_SCSI_OMIT_FLASHPOINT
23
 
24
 
25
#define UNIX
26
#define FW_TYPE         _SCCB_MGR_
27
#define MAX_CARDS       8
28
#undef BUSTYPE_PCI
29
 
30
 
31
#define OS_InPortByte(port)             inb(port)
32
#define OS_InPortWord(port)             inw(port)
33
#define OS_InPortLong(port)             inl(port)
34
#define OS_OutPortByte(port, value)     outb(value, port)
35
#define OS_OutPortWord(port, value)     outw(value, port)
36
#define OS_OutPortLong(port, value)     outl(value, port)
37
#define OS_Lock(x)
38
#define OS_UnLock(x)
39
 
40
 
41
/*
42
  Define name replacements for compatibility with the Linux BusLogic Driver.
43
*/
44
 
45
#define SccbMgr_sense_adapter           FlashPoint_ProbeHostAdapter
46
#define SccbMgr_config_adapter          FlashPoint_HardwareResetHostAdapter
47
#define SccbMgr_unload_card             FlashPoint_ReleaseHostAdapter
48
#define SccbMgr_start_sccb              FlashPoint_StartCCB
49
#define SccbMgr_abort_sccb              FlashPoint_AbortCCB
50
#define SccbMgr_my_int                  FlashPoint_InterruptPending
51
#define SccbMgr_isr                     FlashPoint_HandleInterrupt
52
 
53
 
54
/*
55
  Define name replacements to avoid kernel namespace pollution.
56
*/
57
 
58
#define BL_Card                         FPT_BL_Card
59
#define BusMasterInit                   FPT_BusMasterInit
60
#define CalcCrc16                       FPT_CalcCrc16
61
#define CalcLrc                         FPT_CalcLrc
62
#define ChkIfChipInitialized            FPT_ChkIfChipInitialized
63
#define DiagBusMaster                   FPT_DiagBusMaster
64
#define DiagEEPROM                      FPT_DiagEEPROM
65
#define DiagXbow                        FPT_DiagXbow
66
#define GetTarLun                       FPT_GetTarLun
67
#define RNVRamData                      FPT_RNVRamData
68
#define RdStack                         FPT_RdStack
69
#define SccbMgrTableInitAll             FPT_SccbMgrTableInitAll
70
#define SccbMgrTableInitCard            FPT_SccbMgrTableInitCard
71
#define SccbMgrTableInitTarget          FPT_SccbMgrTableInitTarget
72
#define SccbMgr_bad_isr                 FPT_SccbMgr_bad_isr
73
#define SccbMgr_scsi_reset              FPT_SccbMgr_scsi_reset
74
#define SccbMgr_timer_expired           FPT_SccbMgr_timer_expired
75
#define SendMsg                         FPT_SendMsg
76
#define Wait                            FPT_Wait
77
#define Wait1Second                     FPT_Wait1Second
78
#define WrStack                         FPT_WrStack
79
#define XbowInit                        FPT_XbowInit
80
#define autoCmdCmplt                    FPT_autoCmdCmplt
81
#define autoLoadDefaultMap              FPT_autoLoadDefaultMap
82
#define busMstrDataXferStart            FPT_busMstrDataXferStart
83
#define busMstrSGDataXferStart          FPT_busMstrSGDataXferStart
84
#define busMstrTimeOut                  FPT_busMstrTimeOut
85
#define dataXferProcessor               FPT_dataXferProcessor
86
#define default_intena                  FPT_default_intena
87
#define hostDataXferAbort               FPT_hostDataXferAbort
88
#define hostDataXferRestart             FPT_hostDataXferRestart
89
#define inisci                          FPT_inisci
90
#define mbCards                         FPT_mbCards
91
#define nvRamInfo                       FPT_nvRamInfo
92
#define phaseBusFree                    FPT_phaseBusFree
93
#define phaseChkFifo                    FPT_phaseChkFifo
94
#define phaseCommand                    FPT_phaseCommand
95
#define phaseDataIn                     FPT_phaseDataIn
96
#define phaseDataOut                    FPT_phaseDataOut
97
#define phaseDecode                     FPT_phaseDecode
98
#define phaseIllegal                    FPT_phaseIllegal
99
#define phaseMsgIn                      FPT_phaseMsgIn
100
#define phaseMsgOut                     FPT_phaseMsgOut
101
#define phaseStatus                     FPT_phaseStatus
102
#define queueAddSccb                    FPT_queueAddSccb
103
#define queueCmdComplete                FPT_queueCmdComplete
104
#define queueDisconnect                 FPT_queueDisconnect
105
#define queueFindSccb                   FPT_queueFindSccb
106
#define queueFlushSccb                  FPT_queueFlushSccb
107
#define queueFlushTargSccb              FPT_queueFlushTargSccb
108
#define queueSearchSelect               FPT_queueSearchSelect
109
#define queueSelectFail                 FPT_queueSelectFail
110
#define s_PhaseTbl                      FPT_s_PhaseTbl
111
#define scamHAString                    FPT_scamHAString
112
#define scamInfo                        FPT_scamInfo
113
#define scarb                           FPT_scarb
114
#define scasid                          FPT_scasid
115
#define scbusf                          FPT_scbusf
116
#define sccbMgrTbl                      FPT_sccbMgrTbl
117
#define schkdd                          FPT_schkdd
118
#define scini                           FPT_scini
119
#define sciso                           FPT_sciso
120
#define scmachid                        FPT_scmachid
121
#define scsavdi                         FPT_scsavdi
122
#define scsel                           FPT_scsel
123
#define scsell                          FPT_scsell
124
#define scsendi                         FPT_scsendi
125
#define scvalq                          FPT_scvalq
126
#define scwirod                         FPT_scwirod
127
#define scwiros                         FPT_scwiros
128
#define scwtsel                         FPT_scwtsel
129
#define scxferc                         FPT_scxferc
130
#define sdecm                           FPT_sdecm
131
#define sfm                             FPT_sfm
132
#define shandem                         FPT_shandem
133
#define sinits                          FPT_sinits
134
#define sisyncn                         FPT_sisyncn
135
#define sisyncr                         FPT_sisyncr
136
#define siwidn                          FPT_siwidn
137
#define siwidr                          FPT_siwidr
138
#define sres                            FPT_sres
139
#define sresb                           FPT_sresb
140
#define ssel                            FPT_ssel
141
#define ssenss                          FPT_ssenss
142
#define sssyncv                         FPT_sssyncv
143
#define stsyncn                         FPT_stsyncn
144
#define stwidn                          FPT_stwidn
145
#define sxfrp                           FPT_sxfrp
146
#define utilEERead                      FPT_utilEERead
147
#define utilEEReadOrg                   FPT_utilEEReadOrg
148
#define utilEESendCmdAddr               FPT_utilEESendCmdAddr
149
#define utilEEWrite                     FPT_utilEEWrite
150
#define utilEEWriteOnOff                FPT_utilEEWriteOnOff
151
#define utilUpdateResidual              FPT_utilUpdateResidual
152
 
153
 
154
/*----------------------------------------------------------------------
155
 *
156
 *
157
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
158
 *
159
 *   This file is available under both the GNU General Public License
160
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
161
 *
162
 *   $Workfile:   globals.h  $
163
 *
164
 *   Description:  Common shared global defines.
165
 *
166
 *   $Date: 2005-12-20 10:17:45 $
167
 *
168
 *   $Revision: 1.1 $
169
 *
170
 *----------------------------------------------------------------------*/
171
#ifndef __GLOBALS_H__
172
#define __GLOBALS_H__
173
 
174
#define _UCB_MGR_  1
175
#define _SCCB_MGR_ 2
176
 
177
/*#include <osflags.h>*/
178
 
179
#define MAX_CDBLEN  12
180
 
181
#define SCAM_LEV_2      1
182
 
183
#define CRCMASK 0xA001
184
 
185
/*  In your osflags.h file, please ENSURE that only ONE OS FLAG
186
    is on at a time !!! Also, please make sure you turn set the
187
         variable FW_TYPE to either _UCB_MGR_ or _SCCB_MGR_  !!! */
188
 
189
#if defined(DOS) || defined(WIN95_16) || defined(OS2) || defined(OTHER_16)
190
   #define       COMPILER_16_BIT 1
191
#elif defined(NETWARE) || defined(NT) || defined(WIN95_32) || defined(UNIX) || defined(OTHER_32) || defined(SOLARIS_REAL_MODE)
192
   #define       COMPILER_32_BIT 1
193
#endif
194
 
195
 
196
#define     BL_VENDOR_ID      0x104B
197
#define     FP_DEVICE_ID      0x8130
198
#define     MM_DEVICE_ID      0x1040
199
 
200
 
201
#ifndef FALSE
202
#define FALSE           0
203
#endif
204
#ifndef TRUE
205
#define TRUE            (!(FALSE))
206
#endif
207
 
208
#ifndef NULL
209
#define NULL            0
210
#endif
211
 
212
#define FAILURE         0xFFFFFFFFL
213
 
214
 
215
typedef unsigned char   UCHAR;
216
typedef unsigned short  USHORT;
217
typedef unsigned int    UINT;
218
typedef unsigned long   ULONG;
219
typedef unsigned char * PUCHAR;
220
typedef unsigned short* PUSHORT;
221
typedef unsigned long * PULONG;
222
typedef void *          PVOID;
223
 
224
 
225
#if defined(COMPILER_16_BIT)
226
typedef unsigned char far       * uchar_ptr;
227
typedef unsigned short far      * ushort_ptr;
228
typedef unsigned long far       * ulong_ptr;
229
#endif  /* 16_BIT_COMPILER */
230
 
231
#if defined(COMPILER_32_BIT)
232
typedef unsigned char           * uchar_ptr;
233
typedef unsigned short          * ushort_ptr;
234
typedef unsigned long           * ulong_ptr;
235
#endif  /* 32_BIT_COMPILER */
236
 
237
 
238
/*                              NEW TYPE DEFINITIONS (shared with Mylex North)
239
 
240
**  Use following type defines to avoid confusion in 16 and 32-bit
241
**  environments.  Avoid using 'int' as it denotes 16 bits in 16-bit
242
**  environment and 32 in 32-bit environments.
243
 
244
*/
245
 
246
#define s08bits char
247
#define s16bits         short
248
#define s32bits long
249
 
250
#define u08bits unsigned s08bits
251
#define u16bits unsigned s16bits
252
#define u32bits unsigned s32bits
253
 
254
#if defined(COMPILER_16_BIT)
255
 
256
typedef u08bits far     * pu08bits;
257
typedef u16bits far     * pu16bits;
258
typedef u32bits far     * pu32bits;
259
 
260
#endif  /* COMPILER_16_BIT */
261
 
262
#if defined(COMPILER_32_BIT)
263
 
264
typedef u08bits         * pu08bits;
265
typedef u16bits         * pu16bits;
266
typedef u32bits         * pu32bits;
267
 
268
#endif  /* COMPILER_32_BIT */
269
 
270
 
271
#define BIT(x)          ((UCHAR)(1<<(x)))    /* single-bit mask in bit position x */
272
#define BITW(x)          ((USHORT)(1<<(x)))  /* single-bit mask in bit position x */
273
 
274
 
275
 
276
#if defined(DOS)
277
/*#include <dos.h>*/
278
        #undef inportb          /* undefine for Borland Lib */
279
        #undef inport           /* they may have define I/O function in LIB */
280
        #undef outportb
281
        #undef outport
282
 
283
        #define OS_InPortByte(ioport)           inportb(ioport)
284
        #define OS_InPortWord(ioport)           inport(ioport)
285
        #define OS_InPortLong(ioport)                   inportq(ioport, val)
286
        #define OS_OutPortByte(ioport, val) outportb(ioport, val)
287
        #define OS_OutPortWord(ioport, val)     outport(ioport, val)
288
        #define OS_OutPortLong(ioport)          outportq(ioport, val)
289
#endif  /* DOS */
290
 
291
#if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
292
        extern u08bits  OS_InPortByte(u32bits ioport);
293
        extern u16bits  OS_InPortWord(u32bits ioport);
294
        extern u32bits  OS_InPortLong(u32bits ioport);
295
 
296
        extern OS_InPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
297
        extern OS_InPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
298
        extern OS_OutPortByte(u32bits ioport, u08bits val);
299
        extern OS_OutPortWord(u32bits ioport, u16bits val);
300
        extern OS_OutPortLong(u32bits ioport, u32bits val);
301
        extern OS_OutPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
302
        extern OS_OutPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
303
#endif  /* NETWARE || OTHER_32 || OTHER_16 */
304
 
305
#if defined (NT) || defined(WIN95_32) || defined(WIN95_16)
306
        #if defined(NT)
307
 
308
                extern __declspec(dllimport) u08bits ScsiPortReadPortUchar(pu08bits ioport);
309
                extern __declspec(dllimport) u16bits ScsiPortReadPortUshort(pu16bits ioport);
310
                extern __declspec(dllimport) u32bits ScsiPortReadPortUlong(pu32bits ioport);
311
                extern __declspec(dllimport) void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
312
                extern __declspec(dllimport) void ScsiPortWritePortUshort(pu16bits port, u16bits val);
313
                extern __declspec(dllimport) void ScsiPortWritePortUlong(pu32bits port, u32bits val);
314
 
315
        #else
316
 
317
                extern u08bits ScsiPortReadPortUchar(pu08bits ioport);
318
                extern u16bits ScsiPortReadPortUshort(pu16bits ioport);
319
                extern u32bits ScsiPortReadPortUlong(pu32bits ioport);
320
                extern void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
321
                extern void ScsiPortWritePortUshort(pu16bits port, u16bits val);
322
                extern void ScsiPortWritePortUlong(pu32bits port, u32bits val);
323
        #endif
324
 
325
 
326
        #define OS_InPortByte(ioport) ScsiPortReadPortUchar((pu08bits) ioport)
327
        #define OS_InPortWord(ioport) ScsiPortReadPortUshort((pu16bits) ioport)
328
        #define OS_InPortLong(ioport) ScsiPortReadPortUlong((pu32bits) ioport)
329
 
330
        #define OS_OutPortByte(ioport, val) ScsiPortWritePortUchar((pu08bits) ioport, (u08bits) val)
331
        #define OS_OutPortWord(ioport, val) ScsiPortWritePortUshort((pu16bits) ioport, (u16bits) val)
332
        #define OS_OutPortLong(ioport, val) ScsiPortWritePortUlong((pu32bits) ioport, (u32bits) val)
333
        #define OS_OutPortByteBuffer(ioport, buffer, count) \
334
                ScsiPortWritePortBufferUchar((pu08bits)&port, (pu08bits) buffer, (u32bits) count)
335
        #define OS_OutPortWordBuffer(ioport, buffer, count) \
336
                ScsiPortWritePortBufferUshort((pu16bits)&port, (pu16bits) buffer, (u32bits) count)
337
 
338
        #define OS_Lock(x)
339
        #define OS_UnLock(x)
340
#endif /* NT || WIN95_32 || WIN95_16 */
341
 
342
#if defined (UNIX) && !defined(OS_InPortByte)
343
        #define OS_InPortByte(ioport)    inb((u16bits)ioport)
344
        #define OS_InPortWord(ioport)    inw((u16bits)ioport)
345
        #define OS_InPortLong(ioport)    inl((u16bits)ioport)
346
        #define OS_OutPortByte(ioport,val)  outb((u16bits)ioport, (u08bits)val)
347
        #define OS_OutPortWord(ioport,val)  outw((u16bits)ioport, (u16bits)val)
348
        #define OS_OutPortLong(ioport,val)  outl((u16bits)ioport, (u32bits)val)
349
 
350
        #define OS_Lock(x)
351
        #define OS_UnLock(x)
352
#endif /* UNIX */
353
 
354
 
355
#if defined(OS2)
356
        extern u08bits  inb(u32bits ioport);
357
        extern u16bits  inw(u32bits ioport);
358
        extern void     outb(u32bits ioport, u08bits val);
359
        extern void     outw(u32bits ioport, u16bits val);
360
 
361
        #define OS_InPortByte(ioport)                   inb(ioport)
362
        #define OS_InPortWord(ioport)                   inw(ioport)
363
        #define OS_OutPortByte(ioport, val)     outb(ioport, val)
364
        #define OS_OutPortWord(ioport, val)     outw(ioport, val)
365
        extern u32bits  OS_InPortLong(u32bits ioport);
366
        extern void     OS_OutPortLong(u32bits ioport, u32bits val);
367
 
368
        #define OS_Lock(x)
369
        #define OS_UnLock(x)
370
#endif /* OS2 */
371
 
372
#if defined(SOLARIS_REAL_MODE)
373
 
374
extern unsigned char    inb(unsigned long ioport);
375
extern unsigned short   inw(unsigned long ioport);
376
 
377
#define OS_InPortByte(ioport)    inb(ioport)
378
#define OS_InPortWord(ioport)    inw(ioport)
379
 
380
extern void OS_OutPortByte(unsigned long ioport, unsigned char val);
381
extern void OS_OutPortWord(unsigned long ioport, unsigned short val);
382
extern unsigned long  OS_InPortLong(unsigned long ioport);
383
extern void     OS_OutPortLong(unsigned long ioport, unsigned long val);
384
 
385
#define OS_Lock(x)
386
#define OS_UnLock(x)
387
 
388
#endif  /* SOLARIS_REAL_MODE */
389
 
390
#endif  /* __GLOBALS_H__ */
391
 
392
/*----------------------------------------------------------------------
393
 *
394
 *
395
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
396
 *
397
 *   This file is available under both the GNU General Public License
398
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
399
 *
400
 *   $Workfile:   sccbmgr.h  $
401
 *
402
 *   Description:  Common shared SCCB Interface defines and SCCB
403
 *                                               Manager specifics defines.
404
 *
405
 *   $Date: 2005-12-20 10:17:45 $
406
 *
407
 *   $Revision: 1.1 $
408
 *
409
 *----------------------------------------------------------------------*/
410
 
411
#ifndef __SCCB_H__
412
#define __SCCB_H__
413
 
414
/*#include <osflags.h>*/
415
/*#include <globals.h>*/
416
 
417
#if defined(BUGBUG)
418
#define debug_size 32
419
#endif
420
 
421
#if defined(DOS)
422
 
423
   typedef struct _SCCB near *PSCCB;
424
        #if (FW_TYPE == _SCCB_MGR_)
425
        typedef void (*CALL_BK_FN)(PSCCB);
426
        #endif
427
 
428
#elif defined(OS2)
429
 
430
   typedef struct _SCCB far *PSCCB;
431
        #if (FW_TYPE == _SCCB_MGR_)
432
        typedef void (far *CALL_BK_FN)(PSCCB);
433
        #endif
434
 
435
#else
436
 
437
   typedef struct _SCCB *PSCCB;
438
        #if (FW_TYPE == _SCCB_MGR_)
439
        typedef void (*CALL_BK_FN)(PSCCB);
440
        #endif
441
 
442
#endif
443
 
444
 
445
typedef struct SCCBMgr_info {
446
   ULONG    si_baseaddr;
447
   UCHAR    si_present;
448
   UCHAR    si_intvect;
449
   UCHAR    si_id;
450
   UCHAR    si_lun;
451
   USHORT   si_fw_revision;
452
   USHORT   si_per_targ_init_sync;
453
   USHORT   si_per_targ_fast_nego;
454
   USHORT   si_per_targ_ultra_nego;
455
   USHORT   si_per_targ_no_disc;
456
   USHORT   si_per_targ_wide_nego;
457
   USHORT   si_flags;
458
   UCHAR    si_card_family;
459
   UCHAR    si_bustype;
460
   UCHAR    si_card_model[3];
461
   UCHAR    si_relative_cardnum;
462
   UCHAR    si_reserved[4];
463
   ULONG    si_OS_reserved;
464
   UCHAR    si_XlatInfo[4];
465
   ULONG    si_reserved2[5];
466
   ULONG    si_secondary_range;
467
} SCCBMGR_INFO;
468
 
469
#if defined(DOS)
470
   typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
471
#else
472
   #if defined (COMPILER_16_BIT)
473
   typedef SCCBMGR_INFO far *  PSCCBMGR_INFO;
474
   #else
475
   typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
476
   #endif
477
#endif // defined(DOS)
478
 
479
 
480
 
481
 
482
#if (FW_TYPE==_SCCB_MGR_)
483
        #define SCSI_PARITY_ENA           0x0001
484
        #define LOW_BYTE_TERM             0x0010
485
        #define HIGH_BYTE_TERM            0x0020
486
        #define BUSTYPE_PCI       0x3
487
#endif
488
 
489
#define SUPPORT_16TAR_32LUN       0x0002
490
#define SOFT_RESET                0x0004
491
#define EXTENDED_TRANSLATION      0x0008
492
#define POST_ALL_UNDERRRUNS       0x0040
493
#define FLAG_SCAM_ENABLED         0x0080
494
#define FLAG_SCAM_LEVEL2          0x0100
495
 
496
 
497
 
498
 
499
#define HARPOON_FAMILY        0x02
500
 
501
 
502
#define ISA_BUS_CARD          0x01
503
#define EISA_BUS_CARD         0x02
504
#define PCI_BUS_CARD          0x03
505
#define VESA_BUS_CARD         0x04
506
 
507
/* SCCB struc used for both SCCB and UCB manager compiles!
508
 * The UCB Manager treats the SCCB as it's 'native hardware structure'
509
 */
510
 
511
 
512
#pragma pack(1)
513
typedef struct _SCCB {
514
   UCHAR OperationCode;
515
   UCHAR ControlByte;
516
   UCHAR CdbLength;
517
   UCHAR RequestSenseLength;
518
   ULONG DataLength;
519
   ULONG DataPointer;
520
   UCHAR CcbRes[2];
521
   UCHAR HostStatus;
522
   UCHAR TargetStatus;
523
   UCHAR TargID;
524
   UCHAR Lun;
525
   UCHAR Cdb[12];
526
   UCHAR CcbRes1;
527
   UCHAR Reserved1;
528
   ULONG Reserved2;
529
   ULONG SensePointer;
530
 
531
 
532
   CALL_BK_FN SccbCallback;                  /* VOID (*SccbCallback)(); */
533
   ULONG  SccbIOPort;                        /* Identifies board base port */
534
   UCHAR  SccbStatus;
535
   UCHAR  SCCBRes2;
536
   USHORT SccbOSFlags;
537
 
538
 
539
   ULONG   Sccb_XferCnt;            /* actual transfer count */
540
   ULONG   Sccb_ATC;
541
   ULONG   SccbVirtDataPtr;         /* virtual addr for OS/2 */
542
   ULONG   Sccb_res1;
543
   USHORT  Sccb_MGRFlags;
544
   USHORT  Sccb_sgseg;
545
   UCHAR   Sccb_scsimsg;            /* identify msg for selection */
546
   UCHAR   Sccb_tag;
547
   UCHAR   Sccb_scsistat;
548
   UCHAR   Sccb_idmsg;              /* image of last msg in */
549
   PSCCB   Sccb_forwardlink;
550
   PSCCB   Sccb_backlink;
551
   ULONG   Sccb_savedATC;
552
   UCHAR   Save_Cdb[6];
553
   UCHAR   Save_CdbLen;
554
   UCHAR   Sccb_XferState;
555
   ULONG   Sccb_SGoffset;
556
#if (FW_TYPE == _UCB_MGR_)
557
   PUCB    Sccb_ucb_ptr;
558
#endif
559
   } SCCB;
560
 
561
#define SCCB_SIZE sizeof(SCCB)
562
 
563
#pragma pack()
564
 
565
 
566
 
567
#define SCSI_INITIATOR_COMMAND    0x00
568
#define TARGET_MODE_COMMAND       0x01
569
#define SCATTER_GATHER_COMMAND    0x02
570
#define RESIDUAL_COMMAND          0x03
571
#define RESIDUAL_SG_COMMAND       0x04
572
#define RESET_COMMAND             0x81
573
 
574
 
575
#define F_USE_CMD_Q              0x20     /*Inidcates TAGGED command. */
576
#define TAG_TYPE_MASK            0xC0     /*Type of tag msg to send. */
577
#define TAG_Q_MASK               0xE0
578
#define SCCB_DATA_XFER_OUT       0x10     /* Write */
579
#define SCCB_DATA_XFER_IN        0x08     /* Read */
580
 
581
 
582
#define FOURTEEN_BYTES           0x00     /* Request Sense Buffer size */
583
#define NO_AUTO_REQUEST_SENSE    0x01     /* No Request Sense Buffer */
584
 
585
 
586
#define BUS_FREE_ST     0       
587
#define SELECT_ST       1
588
#define SELECT_BDR_ST   2     /* Select w\ Bus Device Reset */
589
#define SELECT_SN_ST    3     /* Select w\ Sync Nego */
590
#define SELECT_WN_ST    4     /* Select w\ Wide Data Nego */
591
#define SELECT_Q_ST     5     /* Select w\ Tagged Q'ing */
592
#define COMMAND_ST      6
593
#define DATA_OUT_ST     7
594
#define DATA_IN_ST      8
595
#define DISCONNECT_ST   9
596
#define STATUS_ST       10
597
#define ABORT_ST        11
598
#define MESSAGE_ST      12
599
 
600
 
601
#define F_HOST_XFER_DIR                0x01
602
#define F_ALL_XFERRED                  0x02
603
#define F_SG_XFER                      0x04
604
#define F_AUTO_SENSE                   0x08
605
#define F_ODD_BALL_CNT                 0x10
606
#define F_NO_DATA_YET                  0x80
607
 
608
 
609
#define F_STATUSLOADED                 0x01
610
#define F_MSGLOADED                    0x02
611
#define F_DEV_SELECTED                 0x04
612
 
613
 
614
#define SCCB_COMPLETE               0x00  /* SCCB completed without error */
615
#define SCCB_DATA_UNDER_RUN         0x0C
616
#define SCCB_SELECTION_TIMEOUT      0x11  /* Set SCSI selection timed out */
617
#define SCCB_DATA_OVER_RUN          0x12
618
#define SCCB_UNEXPECTED_BUS_FREE    0x13  /* Target dropped SCSI BSY */
619
#define SCCB_PHASE_SEQUENCE_FAIL    0x14  /* Target bus phase sequence failure */
620
 
621
#define SCCB_INVALID_OP_CODE        0x16  /* SCCB invalid operation code */
622
#define SCCB_INVALID_SCCB           0x1A  /* Invalid SCCB - bad parameter */
623
#define SCCB_GROSS_FW_ERR           0x27  /* Major problem! */
624
#define SCCB_BM_ERR                 0x30  /* BusMaster error. */
625
#define SCCB_PARITY_ERR             0x34  /* SCSI parity error */
626
 
627
 
628
 
629
#if (FW_TYPE==_UCB_MGR_)  
630
   #define  HBA_AUTO_SENSE_FAIL        0x1B  
631
   #define  HBA_TQ_REJECTED            0x1C  
632
   #define  HBA_UNSUPORTED_MSG         0x1D  
633
   #define  HBA_HW_ERROR               0x20  
634
   #define  HBA_ATN_NOT_RESPONDED      0x21  
635
   #define  HBA_SCSI_RESET_BY_ADAPTER  0x22
636
   #define  HBA_SCSI_RESET_BY_TARGET   0x23
637
   #define  HBA_WRONG_CONNECTION       0x24
638
   #define  HBA_BUS_DEVICE_RESET       0x25
639
   #define  HBA_ABORT_QUEUE            0x26
640
 
641
#else // these are not defined in BUDI/UCB
642
 
643
   #define SCCB_INVALID_DIRECTION      0x18  /* Invalid target direction */
644
   #define SCCB_DUPLICATE_SCCB         0x19  /* Duplicate SCCB */
645
   #define SCCB_SCSI_RST               0x35  /* SCSI RESET detected. */
646
 
647
#endif // (FW_TYPE==_UCB_MGR_)  
648
 
649
 
650
#define SCCB_IN_PROCESS            0x00
651
#define SCCB_SUCCESS               0x01
652
#define SCCB_ABORT                 0x02
653
#define SCCB_NOT_FOUND             0x03
654
#define SCCB_ERROR                 0x04
655
#define SCCB_INVALID               0x05
656
 
657
#define SCCB_SIZE sizeof(SCCB)
658
 
659
 
660
 
661
 
662
#if (FW_TYPE == _UCB_MGR_)
663
        void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
664
        s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
665
        u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard);
666
        s32bits SccbMgr_isr(CARD_HANDLE pCurrCard);
667
        void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard);
668
        void SccbMgr_timer_expired(CARD_HANDLE pCurrCard);
669
        void SccbMgr_unload_card(CARD_HANDLE pCurrCard);
670
        void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard);
671
        void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard);
672
        void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo);
673
 
674
#endif
675
 
676
 
677
#if (FW_TYPE == _SCCB_MGR_)
678
 
679
 #if defined (DOS)
680
        int    SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
681
        USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
682
        void  SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_SCCB);
683
        int   SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_SCCB);
684
        UCHAR SccbMgr_my_int(USHORT pCurrCard);
685
        int   SccbMgr_isr(USHORT pCurrCard);
686
        void  SccbMgr_scsi_reset(USHORT pCurrCard);
687
        void  SccbMgr_timer_expired(USHORT pCurrCard);
688
        USHORT SccbMgr_status(USHORT pCurrCard);
689
        void SccbMgr_unload_card(USHORT pCurrCard);
690
 
691
 #else    //non-DOS
692
 
693
        int   SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
694
        ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
695
        void  SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_SCCB);
696
        int   SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_SCCB);
697
        UCHAR SccbMgr_my_int(ULONG pCurrCard);
698
        int   SccbMgr_isr(ULONG pCurrCard);
699
        void  SccbMgr_scsi_reset(ULONG pCurrCard);
700
        void  SccbMgr_enable_int(ULONG pCurrCard);
701
        void  SccbMgr_disable_int(ULONG pCurrCard);
702
        void  SccbMgr_timer_expired(ULONG pCurrCard);
703
        void SccbMgr_unload_card(ULONG pCurrCard);
704
 
705
  #endif
706
#endif  // (FW_TYPE == _SCCB_MGR_)
707
 
708
#endif  /* __SCCB_H__ */
709
 
710
/*----------------------------------------------------------------------
711
 *
712
 *
713
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
714
 *
715
 *   This file is available under both the GNU General Public License
716
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
717
 *
718
 *   $Workfile:   blx30.h  $
719
 *
720
 *   Description: This module contains SCCB/UCB Manager implementation
721
 *                specific stuff.
722
 *
723
 *   $Date: 2005-12-20 10:17:45 $
724
 *
725
 *   $Revision: 1.1 $
726
 *
727
 *----------------------------------------------------------------------*/
728
 
729
 
730
#ifndef __blx30_H__
731
#define __blx30_H__
732
 
733
/*#include <globals.h>*/
734
 
735
#define  ORION_FW_REV      3110
736
 
737
 
738
 
739
 
740
#define HARP_REVD    1
741
 
742
 
743
#if defined(DOS)
744
#define QUEUE_DEPTH     8+1            /*1 for Normal disconnect 0 for Q'ing. */
745
#else
746
#define QUEUE_DEPTH     254+1            /*1 for Normal disconnect 32 for Q'ing. */
747
#endif   // defined(DOS)
748
 
749
#define MAX_MB_CARDS    4                                       /* Max. no of cards suppoerted on Mother Board */
750
 
751
#define WIDE_SCSI       1
752
 
753
#if defined(WIDE_SCSI)
754
   #if defined(DOS)
755
      #define MAX_SCSI_TAR    16
756
      #define MAX_LUN         8
757
                #define LUN_MASK                        0x07
758
   #else
759
      #define MAX_SCSI_TAR    16
760
      #define MAX_LUN         32
761
                #define LUN_MASK                        0x1f
762
 
763
   #endif
764
#else
765
   #define MAX_SCSI_TAR    8
766
   #define MAX_LUN         8
767
        #define LUN_MASK                        0x07
768
#endif 
769
 
770
#if defined(HARP_REVA)
771
#define SG_BUF_CNT      15             /*Number of prefetched elements. */
772
#else
773
#define SG_BUF_CNT      16             /*Number of prefetched elements. */
774
#endif
775
 
776
#define SG_ELEMENT_SIZE 8              /*Eight byte per element. */
777
#define SG_LOCAL_MASK   0x00000000L
778
#define SG_ELEMENT_MASK 0xFFFFFFFFL
779
 
780
 
781
#if (FW_TYPE == _UCB_MGR_)
782
        #define OPC_DECODE_NORMAL       0x0f7f
783
#endif   // _UCB_MGR_
784
 
785
 
786
 
787
#if defined(DOS)
788
 
789
/*#include <dos.h>*/
790
        #define RD_HARPOON(ioport)          (OS_InPortByte(ioport))
791
        #define RDW_HARPOON(ioport)         (OS_InPortWord(ioport))
792
        #define WR_HARPOON(ioport,val)      (OS_OutPortByte(ioport,val))
793
        #define WRW_HARPOON(ioport,val)     (OS_OutPortWord(ioport,val))
794
 
795
        #define RD_HARP32(port,offset,data)  asm{db 66h;         \
796
                                       push ax;             \
797
                                       mov dx,port;         \
798
                                       add dx, offset;      \
799
                                       db 66h;              \
800
                                       in ax,dx;            \
801
                                       db 66h;              \
802
                                       mov word ptr data,ax;\
803
                                       db 66h;              \
804
                                       pop ax}
805
 
806
        #define WR_HARP32(port,offset,data) asm{db 66h;          \
807
                                       push ax;             \
808
                                       mov dx,port;         \
809
                                       add dx, offset;      \
810
                                       db 66h;              \
811
                                       mov ax,word ptr data;\
812
                                       db 66h;              \
813
                                       out dx,ax;           \
814
                                       db 66h;              \
815
                                       pop ax}
816
#endif  /* DOS */
817
 
818
#if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
819
        #define RD_HARPOON(ioport)     OS_InPortByte((unsigned long)ioport)
820
        #define RDW_HARPOON(ioport)    OS_InPortWord((unsigned long)ioport)
821
        #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong(ioport + offset))
822
        #define WR_HARPOON(ioport,val) OS_OutPortByte((ULONG)ioport,(UCHAR) val)
823
        #define WRW_HARPOON(ioport,val)  OS_OutPortWord((ULONG)ioport,(USHORT)val)
824
        #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ioport + offset), data)
825
#endif  /* NETWARE || OTHER_32 || OTHER_16 */
826
 
827
#if defined(NT) || defined(WIN95_32) || defined(WIN95_16)
828
        #define RD_HARPOON(ioport)          OS_InPortByte((ULONG)ioport)
829
        #define RDW_HARPOON(ioport)         OS_InPortWord((ULONG)ioport)
830
        #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
831
        #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
832
        #define WRW_HARPOON(ioport,val)     OS_OutPortWord((ULONG)ioport,(USHORT)val)
833
        #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), data)
834
#endif /* NT || WIN95_32 || WIN95_16 */
835
 
836
#if defined (UNIX)
837
        #define RD_HARPOON(ioport)          OS_InPortByte((u32bits)ioport)
838
        #define RDW_HARPOON(ioport)         OS_InPortWord((u32bits)ioport)
839
        #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((u32bits)(ioport + offset)))
840
        #define WR_HARPOON(ioport,val)      OS_OutPortByte((u32bits)ioport,(u08bits) val)
841
        #define WRW_HARPOON(ioport,val)       OS_OutPortWord((u32bits)ioport,(u16bits)val)
842
        #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((u32bits)(ioport + offset), data)
843
#endif /* UNIX */
844
 
845
#if defined(OS2)
846
        #define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
847
        #define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
848
        #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
849
        #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
850
        #define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
851
        #define WR_HARP32(ioport,offset,data)  OS_OutPortLong(((ULONG)(ioport + offset)), data)
852
#endif /* OS2 */
853
 
854
#if defined(SOLARIS_REAL_MODE)
855
 
856
        #define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
857
        #define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
858
        #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
859
        #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
860
        #define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
861
        #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), (ULONG)data)
862
 
863
#endif  /* SOLARIS_REAL_MODE */
864
 
865
#endif  /* __BLX30_H__ */
866
 
867
 
868
/*----------------------------------------------------------------------
869
 *
870
 *
871
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
872
 *
873
 *   This file is available under both the GNU General Public License
874
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
875
 *
876
 *   $Workfile:   target.h  $
877
 *
878
 *   Description:  Definitions for Target related structures
879
 *
880
 *   $Date: 2005-12-20 10:17:45 $
881
 *
882
 *   $Revision: 1.1 $
883
 *
884
 *----------------------------------------------------------------------*/
885
 
886
#ifndef __TARGET__
887
#define __TARGET__
888
 
889
/*#include <globals.h>*/
890
/*#include <blx30.h>*/
891
 
892
 
893
#define  TAR_SYNC_MASK     (BIT(7)+BIT(6))
894
#define  SYNC_UNKNOWN      0x00
895
#define  SYNC_TRYING               BIT(6)
896
#define  SYNC_SUPPORTED    (BIT(7)+BIT(6))
897
 
898
#define  TAR_WIDE_MASK     (BIT(5)+BIT(4))
899
#define  WIDE_DISABLED     0x00
900
#define  WIDE_ENABLED              BIT(4)
901
#define  WIDE_NEGOCIATED   BIT(5)
902
 
903
#define  TAR_TAG_Q_MASK    (BIT(3)+BIT(2))
904
#define  TAG_Q_UNKNOWN     0x00
905
#define  TAG_Q_TRYING              BIT(2)
906
#define  TAG_Q_REJECT      BIT(3)
907
#define  TAG_Q_SUPPORTED   (BIT(3)+BIT(2))
908
 
909
#define  TAR_ALLOW_DISC    BIT(0)
910
 
911
 
912
#define  EE_SYNC_MASK      (BIT(0)+BIT(1))
913
#define  EE_SYNC_ASYNC     0x00
914
#define  EE_SYNC_5MB       BIT(0)
915
#define  EE_SYNC_10MB      BIT(1)
916
#define  EE_SYNC_20MB      (BIT(0)+BIT(1))
917
 
918
#define  EE_ALLOW_DISC     BIT(6)
919
#define  EE_WIDE_SCSI      BIT(7)
920
 
921
 
922
#if defined(DOS)
923
   typedef struct SCCBMgr_tar_info near *PSCCBMgr_tar_info;
924
 
925
#elif defined(OS2)
926
   typedef struct SCCBMgr_tar_info far *PSCCBMgr_tar_info;
927
 
928
#else
929
   typedef struct SCCBMgr_tar_info *PSCCBMgr_tar_info;
930
 
931
#endif
932
 
933
 
934
typedef struct SCCBMgr_tar_info {
935
 
936
   PSCCB    TarSelQ_Head;
937
   PSCCB    TarSelQ_Tail;
938
   UCHAR    TarLUN_CA;        /*Contingent Allgiance */
939
   UCHAR    TarTagQ_Cnt;
940
   UCHAR    TarSelQ_Cnt;
941
   UCHAR    TarStatus;
942
   UCHAR    TarEEValue;
943
   UCHAR        TarSyncCtrl;
944
   UCHAR        TarReserved[2];                 /* for alignment */
945
   UCHAR        LunDiscQ_Idx[MAX_LUN];
946
   UCHAR    TarLUNBusy[MAX_LUN];
947
} SCCBMGR_TAR_INFO;
948
 
949
typedef struct NVRAMInfo {
950
        UCHAR           niModel;                                                                /* Model No. of card */
951
        UCHAR           niCardNo;                                                       /* Card no. */
952
#if defined(DOS)
953
        USHORT  niBaseAddr;                                                     /* Port Address of card */
954
#else
955
        ULONG           niBaseAddr;                                                     /* Port Address of card */
956
#endif
957
        UCHAR           niSysConf;                                                      /* Adapter Configuration byte - Byte 16 of eeprom map */
958
        UCHAR           niScsiConf;                                                     /* SCSI Configuration byte - Byte 17 of eeprom map */
959
        UCHAR           niScamConf;                                                     /* SCAM Configuration byte - Byte 20 of eeprom map */
960
        UCHAR           niAdapId;                                                       /* Host Adapter ID - Byte 24 of eerpom map */
961
        UCHAR           niSyncTbl[MAX_SCSI_TAR / 2];    /* Sync/Wide byte of targets */
962
        UCHAR           niScamTbl[MAX_SCSI_TAR][4];     /* Compressed Scam name string of Targets */
963
}NVRAMINFO;
964
 
965
#if defined(DOS)
966
typedef NVRAMINFO near *PNVRamInfo;
967
#elif defined (OS2)
968
typedef NVRAMINFO far *PNVRamInfo;
969
#else
970
typedef NVRAMINFO *PNVRamInfo;
971
#endif
972
 
973
#define MODEL_LT                1
974
#define MODEL_DL                2
975
#define MODEL_LW                3
976
#define MODEL_DW                4
977
 
978
 
979
typedef struct SCCBcard {
980
   PSCCB currentSCCB;
981
#if (FW_TYPE==_SCCB_MGR_)
982
   PSCCBMGR_INFO cardInfo;
983
#else
984
   PADAPTER_INFO cardInfo;
985
#endif
986
 
987
#if defined(DOS)
988
   USHORT ioPort;
989
#else
990
   ULONG ioPort;
991
#endif
992
 
993
   USHORT cmdCounter;
994
   UCHAR  discQCount;
995
   UCHAR  tagQ_Lst;
996
   UCHAR cardIndex;
997
   UCHAR scanIndex;
998
   UCHAR globalFlags;
999
   UCHAR ourId;
1000
   PNVRamInfo pNvRamInfo;
1001
   PSCCB discQ_Tbl[QUEUE_DEPTH];
1002
 
1003
}SCCBCARD;
1004
 
1005
#if defined(DOS)
1006
typedef struct SCCBcard near *PSCCBcard;
1007
#elif defined (OS2)
1008
typedef struct SCCBcard far *PSCCBcard;
1009
#else
1010
typedef struct SCCBcard *PSCCBcard;
1011
#endif
1012
 
1013
 
1014
#define F_TAG_STARTED           0x01
1015
#define F_CONLUN_IO                     0x02
1016
#define F_DO_RENEGO                     0x04
1017
#define F_NO_FILTER                     0x08
1018
#define F_GREEN_PC                      0x10
1019
#define F_HOST_XFER_ACT         0x20
1020
#define F_NEW_SCCB_CMD          0x40
1021
#define F_UPDATE_EEPROM         0x80
1022
 
1023
 
1024
#define  ID_STRING_LENGTH  32
1025
#define  TYPE_CODE0        0x63           /*Level2 Mstr (bits 7-6),  */
1026
 
1027
#define  TYPE_CODE1        00             /*No ID yet */
1028
 
1029
#define  SLV_TYPE_CODE0    0xA3           /*Priority Bit set (bits 7-6),  */
1030
 
1031
#define  ASSIGN_ID   0x00
1032
#define  SET_P_FLAG  0x01
1033
#define  CFG_CMPLT   0x03
1034
#define  DOM_MSTR    0x0F
1035
#define  SYNC_PTRN   0x1F
1036
 
1037
#define  ID_0_7      0x18
1038
#define  ID_8_F      0x11
1039
#define  ID_10_17    0x12
1040
#define  ID_18_1F    0x0B
1041
#define  MISC_CODE   0x14
1042
#define  CLR_P_FLAG  0x18
1043
#define  LOCATE_ON   0x12
1044
#define  LOCATE_OFF  0x0B
1045
 
1046
#define  LVL_1_MST   0x00
1047
#define  LVL_2_MST   0x40
1048
#define  DOM_LVL_2   0xC0
1049
 
1050
 
1051
#define  INIT_SELTD  0x01
1052
#define  LEVEL2_TAR  0x02
1053
 
1054
 
1055
enum scam_id_st { ID0,ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10,ID11,ID12,
1056
                  ID13,ID14,ID15,ID_UNUSED,ID_UNASSIGNED,ID_ASSIGNED,LEGACY,
1057
                  CLR_PRIORITY,NO_ID_AVAIL };
1058
 
1059
typedef struct SCCBscam_info {
1060
 
1061
   UCHAR    id_string[ID_STRING_LENGTH];
1062
   enum scam_id_st state;
1063
 
1064
} SCCBSCAM_INFO, *PSCCBSCAM_INFO;
1065
 
1066
#endif
1067
/*----------------------------------------------------------------------
1068
 *
1069
 *
1070
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
1071
 *
1072
 *   This file is available under both the GNU General Public License
1073
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
1074
 *
1075
 *   $Workfile:   scsi2.h  $
1076
 *
1077
 *   Description:  Register definitions for HARPOON ASIC.
1078
 *
1079
 *   $Date: 2005-12-20 10:17:45 $
1080
 *
1081
 *   $Revision: 1.1 $
1082
 *
1083
 *----------------------------------------------------------------------*/
1084
 
1085
#ifndef __SCSI_H__
1086
#define __SCSI_H__
1087
 
1088
 
1089
 
1090
#define  SCSI_TEST_UNIT_READY    0x00
1091
#define  SCSI_REZERO_UNIT        0x01
1092
#define  SCSI_REQUEST_SENSE      0x03
1093
#define  SCSI_FORMAT_UNIT        0x04
1094
#define  SCSI_REASSIGN           0x07
1095
#define  SCSI_READ               0x08
1096
#define  SCSI_WRITE              0x0A
1097
#define  SCSI_SEEK               0x0B
1098
#define  SCSI_INQUIRY            0x12
1099
#define  SCSI_MODE_SELECT        0x15
1100
#define  SCSI_RESERVE_UNIT       0x16
1101
#define  SCSI_RELEASE_UNIT       0x17
1102
#define  SCSI_MODE_SENSE         0x1A
1103
#define  SCSI_START_STOP_UNIT    0x1B
1104
#define  SCSI_SEND_DIAGNOSTIC    0x1D
1105
#define  SCSI_READ_CAPACITY      0x25
1106
#define  SCSI_READ_EXTENDED      0x28
1107
#define  SCSI_WRITE_EXTENDED     0x2A
1108
#define  SCSI_SEEK_EXTENDED      0x2B
1109
#define  SCSI_WRITE_AND_VERIFY   0x2E
1110
#define  SCSI_VERIFY             0x2F
1111
#define  SCSI_READ_DEFECT_DATA   0x37
1112
#define  SCSI_WRITE_BUFFER       0x3B
1113
#define  SCSI_READ_BUFFER        0x3C
1114
#define  SCSI_RECV_DIAGNOSTIC    0x1C
1115
#define  SCSI_READ_LONG          0x3E
1116
#define  SCSI_WRITE_LONG         0x3F
1117
#define  SCSI_LAST_SCSI_CMND     SCSI_WRITE_LONG
1118
#define  SCSI_INVALID_CMND       0xFF
1119
 
1120
 
1121
 
1122
#define  SSGOOD                  0x00
1123
#define  SSCHECK                 0x02
1124
#define  SSCOND_MET              0x04
1125
#define  SSBUSY                  0x08
1126
#define  SSRESERVATION_CONFLICT  0x18
1127
#define  SSCMD_TERM              0x22
1128
#define  SSQ_FULL                0x28
1129
 
1130
 
1131
#define  SKNO_SEN                0x00
1132
#define  SKRECOV_ERR             0x01
1133
#define  SKNOT_RDY               0x02
1134
#define  SKMED_ERR               0x03
1135
#define  SKHW_ERR                0x04
1136
#define  SKILL_REQ               0x05
1137
#define  SKUNIT_ATTN             0x06
1138
#define  SKDATA_PROTECT          0x07
1139
#define  SKBLNK_CHK              0x08
1140
#define  SKCPY_ABORT             0x0A
1141
#define  SKABORT_CMD             0x0B
1142
#define  SKEQUAL                 0x0C
1143
#define  SKVOL_OVF               0x0D
1144
#define  SKMIS_CMP               0x0E
1145
 
1146
 
1147
#define  SMCMD_COMP              0x00
1148
#define  SMEXT                   0x01
1149
#define  SMSAVE_DATA_PTR         0x02
1150
#define  SMREST_DATA_PTR         0x03
1151
#define  SMDISC                  0x04
1152
#define  SMINIT_DETEC_ERR        0x05
1153
#define  SMABORT                 0x06
1154
#define  SMREJECT                0x07
1155
#define  SMNO_OP                 0x08
1156
#define  SMPARITY                0x09
1157
#define  SMDEV_RESET             0x0C
1158
#define SMABORT_TAG                                     0x0D
1159
#define SMINIT_RECOVERY                 0x0F
1160
#define SMREL_RECOVERY                          0x10
1161
 
1162
#define  SMIDENT                 0x80
1163
#define  DISC_PRIV               0x40
1164
 
1165
 
1166
#define  SMSYNC                  0x01
1167
#define  SM10MBS                 0x19     /* 100ns           */
1168
#define  SM5MBS                  0x32     /* 200ns           */
1169
#define  SMOFFSET                0x0F     /* Maxoffset value */
1170
#define  SMWDTR                  0x03
1171
#define  SM8BIT                  0x00
1172
#define  SM16BIT                 0x01
1173
#define  SM32BIT                 0x02
1174
#define  SMIGNORWR               0x23     /* Ignore Wide Residue */
1175
 
1176
 
1177
#define  ARBITRATION_DELAY       0x01     /* 2.4us using a 40Mhz clock */
1178
#define  BUS_SETTLE_DELAY        0x01     /* 400ns */
1179
#define  BUS_CLEAR_DELAY         0x01     /* 800ns */
1180
 
1181
 
1182
 
1183
#define  SPHASE_TO               0x0A  /* 10 second timeout waiting for */
1184
#define  SCMD_TO                 0x0F  /* Overall command timeout */
1185
 
1186
 
1187
 
1188
#define  SIX_BYTE_CMD            0x06
1189
#define  TEN_BYTE_CMD            0x0A
1190
#define  TWELVE_BYTE_CMD         0x0C
1191
 
1192
#define  ASYNC                   0x00
1193
#define  PERI25NS                0x06  /* 25/4ns to next clock for xbow. */
1194
#define  SYNC10MBS               0x19
1195
#define  SYNC5MBS                0x32
1196
#define  MAX_OFFSET              0x0F  /* Maxbyteoffset for Sync Xfers */
1197
 
1198
#endif
1199
/*----------------------------------------------------------------------
1200
 *
1201
 *
1202
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
1203
 *
1204
 *   This file is available under both the GNU General Public License
1205
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
1206
 *
1207
 *   $Workfile:   eeprom.h  $
1208
 *
1209
 *   Description:  Definitions for EEPROM related structures
1210
 *
1211
 *   $Date: 2005-12-20 10:17:45 $
1212
 *
1213
 *   $Revision: 1.1 $
1214
 *
1215
 *----------------------------------------------------------------------*/
1216
 
1217
#ifndef __EEPROM__
1218
#define __EEPROM__
1219
 
1220
/*#include <globals.h>*/
1221
 
1222
#define  EEPROM_WD_CNT     256
1223
 
1224
#define  EEPROM_CHECK_SUM  0
1225
#define  FW_SIGNATURE      2
1226
#define  MODEL_NUMB_0      4
1227
#define  MODEL_NUMB_1      5
1228
#define  MODEL_NUMB_2      6
1229
#define  MODEL_NUMB_3      7
1230
#define  MODEL_NUMB_4      8
1231
#define  MODEL_NUMB_5      9
1232
#define  IO_BASE_ADDR      10
1233
#define  IRQ_NUMBER        12
1234
#define  PCI_INT_PIN       13
1235
#define  BUS_DELAY         14       /*On time in byte 14 off delay in 15 */
1236
#define  SYSTEM_CONFIG     16
1237
#define  SCSI_CONFIG       17
1238
#define  BIOS_CONFIG       18
1239
#define  SPIN_UP_DELAY     19
1240
#define  SCAM_CONFIG       20
1241
#define  ADAPTER_SCSI_ID   24
1242
 
1243
 
1244
#define  IGNORE_B_SCAN     32
1245
#define  SEND_START_ENA    34
1246
#define  DEVICE_ENABLE     36
1247
 
1248
#define  SYNC_RATE_TBL     38
1249
#define  SYNC_RATE_TBL01   38
1250
#define  SYNC_RATE_TBL23   40
1251
#define  SYNC_RATE_TBL45   42
1252
#define  SYNC_RATE_TBL67   44
1253
#define  SYNC_RATE_TBL89   46
1254
#define  SYNC_RATE_TBLab   48
1255
#define  SYNC_RATE_TBLcd   50
1256
#define  SYNC_RATE_TBLef   52
1257
 
1258
 
1259
 
1260
#define  EE_SCAMBASE      256 
1261
 
1262
 
1263
 
1264
   #define  DOM_MASTER     (BIT(0) + BIT(1))
1265
   #define  SCAM_ENABLED   BIT(2)
1266
   #define  SCAM_LEVEL2    BIT(3)
1267
 
1268
 
1269
        #define RENEGO_ENA              BITW(10)
1270
        #define CONNIO_ENA              BITW(11)
1271
   #define  GREEN_PC_ENA   BITW(12)
1272
 
1273
 
1274
   #define  AUTO_RATE_00   00
1275
   #define  AUTO_RATE_05   01
1276
   #define  AUTO_RATE_10   02
1277
   #define  AUTO_RATE_20   03
1278
 
1279
   #define  WIDE_NEGO_BIT     BIT(7)
1280
   #define  DISC_ENABLE_BIT   BIT(6)
1281
 
1282
 
1283
#endif
1284
/*----------------------------------------------------------------------
1285
 *
1286
 *
1287
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
1288
 *
1289
 *   This file is available under both the GNU General Public License
1290
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
1291
 *
1292
 *   $Workfile:   harpoon.h  $
1293
 *
1294
 *   Description:  Register definitions for HARPOON ASIC.
1295
 *
1296
 *   $Date: 2005-12-20 10:17:45 $
1297
 *
1298
 *   $Revision: 1.1 $
1299
 *
1300
 *----------------------------------------------------------------------*/
1301
 
1302
 
1303
/*#include <globals.h>*/
1304
 
1305
#ifndef __HARPOON__
1306
#define __HARPOON__
1307
 
1308
 
1309
   #define  hp_vendor_id_0       0x00           /* LSB */
1310
      #define  ORION_VEND_0   0x4B
1311
 
1312
   #define  hp_vendor_id_1       0x01           /* MSB */
1313
      #define  ORION_VEND_1   0x10
1314
 
1315
   #define  hp_device_id_0       0x02           /* LSB */
1316
      #define  ORION_DEV_0    0x30 
1317
 
1318
   #define  hp_device_id_1       0x03           /* MSB */
1319
      #define  ORION_DEV_1    0x81 
1320
 
1321
        /* Sub Vendor ID and Sub Device ID only available in
1322
                Harpoon Version 2 and higher */
1323
 
1324
   #define  hp_sub_vendor_id_0   0x04           /* LSB */
1325
   #define  hp_sub_vendor_id_1   0x05           /* MSB */
1326
   #define  hp_sub_device_id_0   0x06           /* LSB */
1327
   #define  hp_sub_device_id_1   0x07           /* MSB */
1328
 
1329
 
1330
   #define  hp_dual_addr_lo      0x08
1331
   #define  hp_dual_addr_lmi     0x09
1332
   #define  hp_dual_addr_hmi     0x0A
1333
   #define  hp_dual_addr_hi      0x0B
1334
 
1335
   #define  hp_semaphore         0x0C
1336
      #define SCCB_MGR_ACTIVE    BIT(0)
1337
      #define TICKLE_ME          BIT(1)
1338
      #define SCCB_MGR_PRESENT   BIT(3)
1339
      #define BIOS_IN_USE        BIT(4)
1340
 
1341
   #define  hp_user_defined_D    0x0D
1342
 
1343
   #define  hp_reserved_E        0x0E
1344
 
1345
   #define  hp_sys_ctrl          0x0F
1346
 
1347
      #define  STOP_CLK          BIT(0)      /*Turn off BusMaster Clock */
1348
      #define  DRVR_RST          BIT(1)      /*Firmware Reset to 80C15 chip */
1349
      #define  HALT_MACH         BIT(3)      /*Halt State Machine      */
1350
      #define  HARD_ABORT        BIT(4)      /*Hard Abort              */
1351
      #define  DIAG_MODE         BIT(5)      /*Diagnostic Mode         */
1352
 
1353
      #define  BM_ABORT_TMOUT    0x50        /*Halt State machine time out */
1354
 
1355
   #define  hp_sys_cfg           0x10
1356
 
1357
      #define  DONT_RST_FIFO     BIT(7)      /*Don't reset FIFO      */
1358
 
1359
 
1360
   #define  hp_host_ctrl0        0x11
1361
 
1362
      #define  DUAL_ADDR_MODE    BIT(0)   /*Enable 64-bit addresses */
1363
      #define  IO_MEM_SPACE      BIT(1)   /*I/O Memory Space    */
1364
      #define  RESOURCE_LOCK     BIT(2)   /*Enable Resource Lock */
1365
      #define  IGNOR_ACCESS_ERR  BIT(3)   /*Ignore Access Error */
1366
      #define  HOST_INT_EDGE     BIT(4)   /*Host interrupt level/edge mode sel */
1367
      #define  SIX_CLOCKS        BIT(5)   /*6 Clocks between Strobe   */
1368
      #define  DMA_EVEN_PARITY   BIT(6)   /*Enable DMA Enen Parity */
1369
 
1370
/*
1371
      #define  BURST_MODE        BIT(0)
1372
*/
1373
 
1374
   #define  hp_reserved_12       0x12
1375
 
1376
   #define  hp_host_blk_cnt      0x13
1377
 
1378
      #define  XFER_BLK1         0x00     /*     0 0 0  1 byte per block*/
1379
      #define  XFER_BLK2         0x01     /*     0 0 1  2 byte per block*/
1380
      #define  XFER_BLK4         0x02     /*     0 1 0  4 byte per block*/
1381
      #define  XFER_BLK8         0x03     /*     0 1 1  8 byte per block*/
1382
      #define  XFER_BLK16        0x04     /*     1 0 0 16 byte per block*/
1383
      #define  XFER_BLK32        0x05     /*     1 0 1 32 byte per block*/
1384
      #define  XFER_BLK64        0x06     /*     1 1 0 64 byte per block*/
1385
 
1386
      #define  BM_THRESHOLD      0x40     /* PCI mode can only xfer 16 bytes*/
1387
 
1388
 
1389
   #define  hp_reserved_14       0x14
1390
   #define  hp_reserved_15       0x15
1391
   #define  hp_reserved_16       0x16
1392
 
1393
   #define  hp_int_mask          0x17
1394
 
1395
      #define  INT_CMD_COMPL     BIT(0)   /* DMA command complete   */
1396
      #define  INT_EXT_STATUS    BIT(1)   /* Extended Status Set    */
1397
      #define  INT_SCSI          BIT(2)   /* Scsi block interrupt   */
1398
      #define  INT_FIFO_RDY      BIT(4)   /* FIFO data ready        */
1399
 
1400
 
1401
   #define  hp_xfer_cnt_lo       0x18
1402
   #define  hp_xfer_cnt_mi       0x19
1403
   #define  hp_xfer_cnt_hi       0x1A
1404
   #define  hp_xfer_cmd          0x1B
1405
 
1406
      #define  XFER_HOST_DMA     0x00     /*     0 0 0 Transfer Host -> DMA */
1407
      #define  XFER_DMA_HOST     0x01     /*     0 0 1 Transfer DMA  -> Host */
1408
      #define  XFER_HOST_MPU     0x02     /*     0 1 0 Transfer Host -> MPU  */
1409
      #define  XFER_MPU_HOST     0x03     /*     0 1 1 Transfer MPU  -> Host */
1410
      #define  XFER_DMA_MPU      0x04     /*     1 0 0 Transfer DMA  -> MPU  */
1411
      #define  XFER_MPU_DMA      0x05     /*     1 0 1 Transfer MPU  -> DMA  */
1412
      #define  SET_SEMAPHORE     0x06     /*     1 1 0 Set Semaphore         */
1413
      #define  XFER_NOP          0x07     /*     1 1 1 Transfer NOP          */
1414
      #define  XFER_MB_MPU       0x06     /*     1 1 0 Transfer MB -> MPU */
1415
      #define  XFER_MB_DMA       0x07     /*     1 1 1 Transfer MB -> DMA */
1416
 
1417
 
1418
      #define  XFER_HOST_AUTO    0x00     /*     0 0 Auto Transfer Size   */
1419
      #define  XFER_HOST_8BIT    0x08     /*     0 1 8 BIT Transfer Size  */
1420
      #define  XFER_HOST_16BIT   0x10     /*     1 0 16 BIT Transfer Size */
1421
      #define  XFER_HOST_32BIT   0x18     /*     1 1 32 BIT Transfer Size */
1422
 
1423
      #define  XFER_DMA_8BIT     0x20     /*     0 1 8 BIT  Transfer Size */
1424
      #define  XFER_DMA_16BIT    0x40     /*     1 0 16 BIT Transfer Size */
1425
 
1426
      #define  DISABLE_INT       BIT(7)   /*Do not interrupt at end of cmd. */
1427
 
1428
      #define  HOST_WRT_CMD      ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
1429
      #define  HOST_RD_CMD       ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
1430
      #define  WIDE_HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_16BIT))
1431
      #define  WIDE_HOST_RD_CMD  ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_16BIT))
1432
 
1433
   #define  hp_host_addr_lo      0x1C
1434
   #define  hp_host_addr_lmi     0x1D
1435
   #define  hp_host_addr_hmi     0x1E
1436
   #define  hp_host_addr_hi      0x1F
1437
 
1438
   #define  hp_pio_data          0x20
1439
   #define  hp_reserved_21       0x21
1440
   #define  hp_ee_ctrl           0x22
1441
 
1442
      #define  EXT_ARB_ACK       BIT(7)
1443
      #define  SCSI_TERM_ENA_H   BIT(6)   /* SCSI high byte terminator */
1444
      #define  SEE_MS            BIT(5)
1445
      #define  SEE_CS            BIT(3)
1446
      #define  SEE_CLK           BIT(2)
1447
      #define  SEE_DO            BIT(1)
1448
      #define  SEE_DI            BIT(0)
1449
 
1450
      #define  EE_READ           0x06
1451
      #define  EE_WRITE          0x05
1452
      #define  EWEN              0x04
1453
      #define  EWEN_ADDR         0x03C0
1454
      #define  EWDS              0x04
1455
      #define  EWDS_ADDR         0x0000
1456
 
1457
   #define  hp_brdctl            0x23
1458
 
1459
      #define  DAT_7             BIT(7)
1460
      #define  DAT_6             BIT(6)
1461
      #define  DAT_5             BIT(5)
1462
      #define  BRD_STB           BIT(4)
1463
      #define  BRD_CS            BIT(3)
1464
      #define  BRD_WR            BIT(2)
1465
 
1466
   #define  hp_reserved_24       0x24
1467
   #define  hp_reserved_25       0x25
1468
 
1469
 
1470
 
1471
 
1472
   #define  hp_bm_ctrl           0x26
1473
 
1474
      #define  SCSI_TERM_ENA_L   BIT(0)   /*Enable/Disable external terminators */
1475
      #define  FLUSH_XFER_CNTR   BIT(1)   /*Flush transfer counter */
1476
      #define  BM_XFER_MIN_8     BIT(2)   /*Enable bus master transfer of 9 */
1477
      #define  BIOS_ENA          BIT(3)   /*Enable BIOS/FLASH Enable */
1478
      #define  FORCE1_XFER       BIT(5)   /*Always xfer one byte in byte mode */
1479
      #define  FAST_SINGLE       BIT(6)   /*?? */
1480
 
1481
      #define  BMCTRL_DEFAULT    (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
1482
 
1483
   #define  hp_reserved_27       0x27
1484
 
1485
   #define  hp_sg_addr           0x28
1486
   #define  hp_page_ctrl         0x29
1487
 
1488
      #define  SCATTER_EN        BIT(0)   
1489
      #define  SGRAM_ARAM        BIT(1)   
1490
      #define  BIOS_SHADOW       BIT(2)   
1491
      #define  G_INT_DISABLE     BIT(3)   /* Enable/Disable all Interrupts */
1492
      #define  NARROW_SCSI_CARD  BIT(4)   /* NARROW/WIDE SCSI config pin */
1493
 
1494
   #define  hp_reserved_2A       0x2A
1495
   #define  hp_pci_cmd_cfg       0x2B
1496
 
1497
      #define  IO_SPACE_ENA      BIT(0)   /*enable I/O space */
1498
      #define  MEM_SPACE_ENA     BIT(1)   /*enable memory space */
1499
      #define  BUS_MSTR_ENA      BIT(2)   /*enable bus master operation */
1500
      #define  MEM_WI_ENA        BIT(4)   /*enable Write and Invalidate */
1501
      #define  PAR_ERR_RESP      BIT(6)   /*enable parity error responce. */
1502
 
1503
   #define  hp_reserved_2C       0x2C
1504
 
1505
   #define  hp_pci_stat_cfg      0x2D
1506
 
1507
      #define  DATA_PARITY_ERR   BIT(0)   
1508
      #define  REC_TARGET_ABORT  BIT(4)   /*received Target abort */
1509
      #define  REC_MASTER_ABORT  BIT(5)   /*received Master abort */
1510
      #define  SIG_SYSTEM_ERR    BIT(6)   
1511
      #define  DETECTED_PAR_ERR  BIT(7)   
1512
 
1513
   #define  hp_reserved_2E       0x2E
1514
 
1515
   #define  hp_sys_status        0x2F
1516
 
1517
      #define  SLV_DATA_RDY      BIT(0)   /*Slave data ready */
1518
      #define  XFER_CNT_ZERO     BIT(1)   /*Transfer counter = 0 */
1519
      #define  BM_FIFO_EMPTY     BIT(2)   /*FIFO empty */
1520
      #define  BM_FIFO_FULL      BIT(3)   /*FIFO full */
1521
      #define  HOST_OP_DONE      BIT(4)   /*host operation done */
1522
      #define  DMA_OP_DONE       BIT(5)   /*DMA operation done */
1523
      #define  SLV_OP_DONE       BIT(6)   /*Slave operation done */
1524
      #define  PWR_ON_FLAG       BIT(7)   /*Power on flag */
1525
 
1526
   #define  hp_reserved_30       0x30
1527
 
1528
   #define  hp_host_status0      0x31
1529
 
1530
      #define  HOST_TERM         BIT(5)   /*Host Terminal Count */
1531
      #define  HOST_TRSHLD       BIT(6)   /*Host Threshold      */
1532
      #define  CONNECTED_2_HOST  BIT(7)   /*Connected to Host   */
1533
 
1534
   #define  hp_reserved_32       0x32
1535
 
1536
   #define  hp_rev_num           0x33
1537
 
1538
      #define  REV_A_CONST       0x0E
1539
      #define  REV_B_CONST       0x0E
1540
 
1541
   #define  hp_stack_data        0x34
1542
   #define  hp_stack_addr        0x35
1543
 
1544
   #define  hp_ext_status        0x36
1545
 
1546
      #define  BM_FORCE_OFF      BIT(0)   /*Bus Master is forced to get off */
1547
      #define  PCI_TGT_ABORT     BIT(0)   /*PCI bus master transaction aborted */
1548
      #define  PCI_DEV_TMOUT     BIT(1)   /*PCI Device Time out */
1549
      #define  FIFO_TC_NOT_ZERO  BIT(2)   /*FIFO or transfer counter not zero */
1550
      #define  CHIP_RST_OCCUR    BIT(3)   /*Chip reset occurs */
1551
      #define  CMD_ABORTED       BIT(4)   /*Command aborted */
1552
      #define  BM_PARITY_ERR     BIT(5)   /*parity error on data received   */
1553
      #define  PIO_OVERRUN       BIT(6)   /*Slave data overrun */
1554
      #define  BM_CMD_BUSY       BIT(7)   /*Bus master transfer command busy */
1555
      #define  BAD_EXT_STATUS    (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \
1556
                                  BM_PARITY_ERR | PIO_OVERRUN)
1557
 
1558
   #define  hp_int_status        0x37
1559
 
1560
      #define  BM_CMD_CMPL       BIT(0)   /*Bus Master command complete */
1561
      #define  EXT_STATUS_ON     BIT(1)   /*Extended status is valid */
1562
      #define  SCSI_INTERRUPT    BIT(2)   /*Global indication of a SCSI int. */
1563
      #define  BM_FIFO_RDY       BIT(4)   
1564
      #define  INT_ASSERTED      BIT(5)   /* */
1565
      #define  SRAM_BUSY         BIT(6)   /*Scatter/Gather RAM busy */
1566
      #define  CMD_REG_BUSY      BIT(7)                                       
1567
 
1568
 
1569
   #define  hp_fifo_cnt          0x38
1570
   #define  hp_curr_host_cnt     0x39
1571
   #define  hp_reserved_3A       0x3A
1572
   #define  hp_fifo_in_addr      0x3B
1573
 
1574
   #define  hp_fifo_out_addr     0x3C
1575
   #define  hp_reserved_3D       0x3D
1576
   #define  hp_reserved_3E       0x3E
1577
   #define  hp_reserved_3F       0x3F
1578
 
1579
 
1580
 
1581
   extern USHORT default_intena;
1582
 
1583
   #define  hp_intena            0x40
1584
 
1585
      #define  RESET             BITW(7)
1586
      #define  PROG_HLT          BITW(6)  
1587
      #define  PARITY            BITW(5)
1588
      #define  FIFO              BITW(4)
1589
      #define  SEL               BITW(3)
1590
      #define  SCAM_SEL          BITW(2) 
1591
      #define  RSEL              BITW(1)
1592
      #define  TIMEOUT           BITW(0)
1593
      #define  BUS_FREE          BITW(15)
1594
      #define  XFER_CNT_0        BITW(14)
1595
      #define  PHASE             BITW(13)
1596
      #define  IUNKWN            BITW(12)
1597
      #define  ICMD_COMP         BITW(11)
1598
      #define  ITICKLE           BITW(10)
1599
      #define  IDO_STRT          BITW(9)
1600
      #define  ITAR_DISC         BITW(8)
1601
      #define  AUTO_INT          (BITW(12)+BITW(11)+BITW(10)+BITW(9)+BITW(8))
1602
      #define  CLR_ALL_INT       0xFFFF
1603
      #define  CLR_ALL_INT_1     0xFF00
1604
 
1605
   #define  hp_intstat           0x42
1606
 
1607
   #define  hp_scsisig           0x44
1608
 
1609
      #define  SCSI_SEL          BIT(7)
1610
      #define  SCSI_BSY          BIT(6)
1611
      #define  SCSI_REQ          BIT(5)
1612
      #define  SCSI_ACK          BIT(4)
1613
      #define  SCSI_ATN          BIT(3)
1614
      #define  SCSI_CD           BIT(2)
1615
      #define  SCSI_MSG          BIT(1)
1616
      #define  SCSI_IOBIT        BIT(0)
1617
 
1618
      #define  S_SCSI_PHZ        (BIT(2)+BIT(1)+BIT(0))
1619
      #define  S_CMD_PH          (BIT(2)              )
1620
      #define  S_MSGO_PH         (BIT(2)+BIT(1)       )
1621
      #define  S_STAT_PH         (BIT(2)       +BIT(0))
1622
      #define  S_MSGI_PH         (BIT(2)+BIT(1)+BIT(0))
1623
      #define  S_DATAI_PH        (              BIT(0))
1624
      #define  S_DATAO_PH        0x00
1625
      #define  S_ILL_PH          (       BIT(1)       )
1626
 
1627
   #define  hp_scsictrl_0        0x45
1628
 
1629
      #define  NO_ARB            BIT(7)
1630
      #define  SEL_TAR           BIT(6)
1631
      #define  ENA_ATN           BIT(4)
1632
      #define  ENA_RESEL         BIT(2)
1633
      #define  SCSI_RST          BIT(1)
1634
      #define  ENA_SCAM_SEL      BIT(0)
1635
 
1636
 
1637
 
1638
   #define  hp_portctrl_0        0x46
1639
 
1640
      #define  SCSI_PORT         BIT(7)
1641
      #define  SCSI_INBIT        BIT(6)
1642
      #define  DMA_PORT          BIT(5)
1643
      #define  DMA_RD            BIT(4)
1644
      #define  HOST_PORT         BIT(3)
1645
      #define  HOST_WRT          BIT(2)
1646
      #define  SCSI_BUS_EN       BIT(1)
1647
      #define  START_TO          BIT(0)
1648
 
1649
   #define  hp_scsireset         0x47
1650
 
1651
      #define  SCSI_TAR          BIT(7)
1652
      #define  SCSI_INI          BIT(6)
1653
      #define  SCAM_EN           BIT(5)
1654
      #define  ACK_HOLD          BIT(4)
1655
      #define  DMA_RESET         BIT(3)
1656
      #define  HPSCSI_RESET      BIT(2)
1657
      #define  PROG_RESET        BIT(1)
1658
      #define  FIFO_CLR          BIT(0)
1659
 
1660
   #define  hp_xfercnt_0         0x48
1661
   #define  hp_xfercnt_1         0x49
1662
   #define  hp_xfercnt_2         0x4A
1663
   #define  hp_xfercnt_3         0x4B
1664
 
1665
   #define  hp_fifodata_0        0x4C
1666
   #define  hp_fifodata_1        0x4D
1667
   #define  hp_addstat           0x4E
1668
 
1669
      #define  SCAM_TIMER        BIT(7)
1670
      #define  AUTO_RUNNING      BIT(6)
1671
      #define  FAST_SYNC         BIT(5)
1672
      #define  SCSI_MODE8        BIT(3)
1673
      #define  SCSI_PAR_ERR      BIT(0)
1674
 
1675
   #define  hp_prgmcnt_0         0x4F
1676
 
1677
      #define  AUTO_PC_MASK      0x3F
1678
 
1679
   #define  hp_selfid_0          0x50
1680
   #define  hp_selfid_1          0x51
1681
   #define  hp_arb_id            0x52
1682
 
1683
      #define  ARB_ID            (BIT(3) + BIT(2) + BIT(1) + BIT(0))
1684
 
1685
   #define  hp_select_id         0x53
1686
 
1687
      #define  RESEL_ID          (BIT(7) + BIT(6) + BIT(5) + BIT(4))
1688
      #define  SELECT_ID         (BIT(3) + BIT(2) + BIT(1) + BIT(0))
1689
 
1690
   #define  hp_synctarg_base     0x54
1691
   #define  hp_synctarg_12       0x54
1692
   #define  hp_synctarg_13       0x55
1693
   #define  hp_synctarg_14       0x56
1694
   #define  hp_synctarg_15       0x57
1695
 
1696
   #define  hp_synctarg_8        0x58
1697
   #define  hp_synctarg_9        0x59
1698
   #define  hp_synctarg_10       0x5A
1699
   #define  hp_synctarg_11       0x5B
1700
 
1701
   #define  hp_synctarg_4        0x5C
1702
   #define  hp_synctarg_5        0x5D
1703
   #define  hp_synctarg_6        0x5E
1704
   #define  hp_synctarg_7        0x5F
1705
 
1706
   #define  hp_synctarg_0        0x60
1707
   #define  hp_synctarg_1        0x61
1708
   #define  hp_synctarg_2        0x62
1709
   #define  hp_synctarg_3        0x63
1710
 
1711
      #define  RATE_20MB         0x00
1712
      #define  RATE_10MB         (              BIT(5))
1713
      #define  RATE_6_6MB        (       BIT(6)       )   
1714
      #define  RATE_5MB          (       BIT(6)+BIT(5))
1715
      #define  RATE_4MB          (BIT(7)              )
1716
      #define  RATE_3_33MB       (BIT(7)       +BIT(5))
1717
      #define  RATE_2_85MB       (BIT(7)+BIT(6)       )
1718
      #define  RATE_2_5MB        (BIT(7)+BIT(5)+BIT(6))
1719
      #define  NEXT_CLK          BIT(5)
1720
      #define  SLOWEST_SYNC      (BIT(7)+BIT(6)+BIT(5))
1721
      #define  NARROW_SCSI       BIT(4)
1722
      #define  SYNC_OFFSET       (BIT(3) + BIT(2) + BIT(1) + BIT(0))
1723
      #define  DEFAULT_ASYNC     0x00
1724
      #define  DEFAULT_OFFSET    0x0F
1725
 
1726
   #define  hp_autostart_0       0x64
1727
   #define  hp_autostart_1       0x65
1728
   #define  hp_autostart_2       0x66
1729
   #define  hp_autostart_3       0x67
1730
 
1731
 
1732
 
1733
      #define  DISABLE  0x00
1734
      #define  AUTO_IMMED    BIT(5)
1735
      #define  SELECT   BIT(6)
1736
      #define  RESELECT (BIT(6)+BIT(5))
1737
      #define  BUSFREE  BIT(7)
1738
      #define  XFER_0   (BIT(7)+BIT(5))
1739
      #define  END_DATA (BIT(7)+BIT(6))
1740
      #define  MSG_PHZ  (BIT(7)+BIT(6)+BIT(5))
1741
 
1742
   #define  hp_gp_reg_0          0x68
1743
   #define  hp_gp_reg_1          0x69
1744
   #define  hp_gp_reg_2          0x6A
1745
   #define  hp_gp_reg_3          0x6B
1746
 
1747
   #define  hp_seltimeout        0x6C
1748
 
1749
 
1750
      #define  TO_2ms            0x54      /* 2.0503ms */
1751
      #define  TO_4ms            0x67      /* 3.9959ms */
1752
 
1753
      #define  TO_5ms            0x03      /* 4.9152ms */
1754
      #define  TO_10ms           0x07      /* 11.xxxms */
1755
      #define  TO_250ms          0x99      /* 250.68ms */
1756
      #define  TO_290ms          0xB1      /* 289.99ms */
1757
      #define  TO_350ms          0xD6      /* 350.62ms */
1758
      #define  TO_417ms          0xFF      /* 417.79ms */
1759
 
1760
   #define  hp_clkctrl_0         0x6D
1761
 
1762
      #define  PWR_DWN           BIT(6)
1763
      #define  ACTdeassert       BIT(4)
1764
      #define  ATNonErr          BIT(3)
1765
      #define  CLK_30MHZ         BIT(1)
1766
      #define  CLK_40MHZ         (BIT(1) + BIT(0))
1767
      #define  CLK_50MHZ         BIT(2)
1768
 
1769
      #define  CLKCTRL_DEFAULT   (ACTdeassert | CLK_40MHZ)
1770
 
1771
   #define  hp_fiforead          0x6E
1772
   #define  hp_fifowrite         0x6F
1773
 
1774
   #define  hp_offsetctr         0x70
1775
   #define  hp_xferstat          0x71
1776
 
1777
      #define  FIFO_FULL         BIT(7)
1778
      #define  FIFO_EMPTY        BIT(6)
1779
      #define  FIFO_MASK         0x3F   /* Mask for the FIFO count value. */
1780
      #define  FIFO_LEN          0x20
1781
 
1782
   #define  hp_portctrl_1        0x72
1783
 
1784
      #define  EVEN_HOST_P       BIT(5)
1785
      #define  INVT_SCSI         BIT(4)
1786
      #define  CHK_SCSI_P        BIT(3)
1787
      #define  HOST_MODE8        BIT(0)
1788
      #define  HOST_MODE16       0x00
1789
 
1790
   #define  hp_xfer_pad          0x73
1791
 
1792
      #define  ID_UNLOCK         BIT(3)
1793
      #define  XFER_PAD          BIT(2)
1794
 
1795
   #define  hp_scsidata_0        0x74
1796
   #define  hp_scsidata_1        0x75
1797
   #define  hp_timer_0           0x76
1798
   #define  hp_timer_1           0x77
1799
 
1800
   #define  hp_reserved_78       0x78
1801
   #define  hp_reserved_79       0x79
1802
   #define  hp_reserved_7A       0x7A
1803
   #define  hp_reserved_7B       0x7B
1804
 
1805
   #define  hp_reserved_7C       0x7C
1806
   #define  hp_reserved_7D       0x7D
1807
   #define  hp_reserved_7E       0x7E
1808
   #define  hp_reserved_7F       0x7F
1809
 
1810
   #define  hp_aramBase          0x80
1811
   #define  BIOS_DATA_OFFSET     0x60
1812
   #define  BIOS_RELATIVE_CARD   0x64
1813
 
1814
 
1815
 
1816
 
1817
      #define  AUTO_LEN 0x80
1818
      #define  AR0      0x00
1819
      #define  AR1      BITW(8)
1820
      #define  AR2      BITW(9)
1821
      #define  AR3      (BITW(9) + BITW(8))
1822
      #define  SDATA    BITW(10)
1823
 
1824
      #define  NOP_OP   0x00        /* Nop command */
1825
 
1826
      #define  CRD_OP   BITW(11)     /* Cmp Reg. w/ Data */
1827
 
1828
      #define  CRR_OP   BITW(12)     /* Cmp Reg. w. Reg. */
1829
 
1830
      #define  CBE_OP   (BITW(14)+BITW(12)+BITW(11)) /* Cmp SCSI cmd class & Branch EQ */
1831
 
1832
      #define  CBN_OP   (BITW(14)+BITW(13))  /* Cmp SCSI cmd class & Branch NOT EQ */
1833
 
1834
      #define  CPE_OP   (BITW(14)+BITW(11))  /* Cmp SCSI phs & Branch EQ */
1835
 
1836
      #define  CPN_OP   (BITW(14)+BITW(12))  /* Cmp SCSI phs & Branch NOT EQ */
1837
 
1838
 
1839
      #define  ADATA_OUT   0x00     
1840
      #define  ADATA_IN    BITW(8)
1841
      #define  ACOMMAND    BITW(10)
1842
      #define  ASTATUS     (BITW(10)+BITW(8))
1843
      #define  AMSG_OUT    (BITW(10)+BITW(9))
1844
      #define  AMSG_IN     (BITW(10)+BITW(9)+BITW(8))
1845
      #define  AILLEGAL    (BITW(9)+BITW(8))
1846
 
1847
 
1848
      #define  BRH_OP   BITW(13)   /* Branch */
1849
 
1850
 
1851
      #define  ALWAYS   0x00
1852
      #define  EQUAL    BITW(8)
1853
      #define  NOT_EQ   BITW(9)
1854
 
1855
      #define  TCB_OP   (BITW(13)+BITW(11))    /* Test condition & branch */
1856
 
1857
 
1858
      #define  ATN_SET     BITW(8)
1859
      #define  ATN_RESET   BITW(9)
1860
      #define  XFER_CNT    (BITW(9)+BITW(8))
1861
      #define  FIFO_0      BITW(10)
1862
      #define  FIFO_NOT0   (BITW(10)+BITW(8))
1863
      #define  T_USE_SYNC0 (BITW(10)+BITW(9))
1864
 
1865
 
1866
      #define  MPM_OP   BITW(15)        /* Match phase and move data */
1867
 
1868
      #define  MDR_OP   (BITW(12)+BITW(11)) /* Move data to Reg. */
1869
 
1870
      #define  MRR_OP   BITW(14)        /* Move DReg. to Reg. */
1871
 
1872
 
1873
      #define  S_IDREG  (BIT(2)+BIT(1)+BIT(0))
1874
 
1875
 
1876
      #define  D_AR0    0x00
1877
      #define  D_AR1    BIT(0)
1878
      #define  D_AR2    BIT(1)
1879
      #define  D_AR3    (BIT(1) + BIT(0))
1880
      #define  D_SDATA  BIT(2)
1881
      #define  D_BUCKET (BIT(2) + BIT(1) + BIT(0))
1882
 
1883
 
1884
      #define  ADR_OP   (BITW(13)+BITW(12)) /* Logical AND Reg. w. Data */
1885
 
1886
      #define  ADS_OP   (BITW(14)+BITW(13)+BITW(12)) 
1887
 
1888
      #define  ODR_OP   (BITW(13)+BITW(12)+BITW(11))  
1889
 
1890
      #define  ODS_OP   (BITW(14)+BITW(13)+BITW(12)+BITW(11))  
1891
 
1892
      #define  STR_OP   (BITW(15)+BITW(14)) /* Store to A_Reg. */
1893
 
1894
      #define  AINT_ENA1   0x00
1895
      #define  AINT_STAT1  BITW(8)
1896
      #define  ASCSI_SIG   BITW(9)
1897
      #define  ASCSI_CNTL  (BITW(9)+BITW(8))
1898
      #define  APORT_CNTL  BITW(10)
1899
      #define  ARST_CNTL   (BITW(10)+BITW(8))
1900
      #define  AXFERCNT0   (BITW(10)+BITW(9))
1901
      #define  AXFERCNT1   (BITW(10)+BITW(9)+BITW(8))
1902
      #define  AXFERCNT2   BITW(11)
1903
      #define  AFIFO_DATA  (BITW(11)+BITW(8))
1904
      #define  ASCSISELID  (BITW(11)+BITW(9))
1905
      #define  ASCSISYNC0  (BITW(11)+BITW(9)+BITW(8))
1906
 
1907
 
1908
      #define  RAT_OP      (BITW(14)+BITW(13)+BITW(11))
1909
 
1910
      #define  SSI_OP      (BITW(15)+BITW(11))
1911
 
1912
 
1913
      #define  SSI_ITAR_DISC    (ITAR_DISC >> 8)
1914
      #define  SSI_IDO_STRT     (IDO_STRT >> 8)
1915
      #define  SSI_IDI_STRT     (IDO_STRT >> 8)
1916
 
1917
      #define  SSI_ICMD_COMP    (ICMD_COMP >> 8)
1918
      #define  SSI_ITICKLE      (ITICKLE >> 8)
1919
 
1920
      #define  SSI_IUNKWN       (IUNKWN >> 8)
1921
      #define  SSI_INO_CC       (IUNKWN >> 8)
1922
      #define  SSI_IRFAIL       (IUNKWN >> 8)
1923
 
1924
 
1925
      #define  NP    0x10     /*Next Phase */
1926
      #define  NTCMD 0x02     /*Non- Tagged Command start */
1927
      #define  CMDPZ 0x04     /*Command phase */
1928
      #define  DINT  0x12     /*Data Out/In interrupt */
1929
      #define  DI    0x13     /*Data Out */
1930
      #define  MI    0x14     /*Message In */
1931
      #define  DC    0x19     /*Disconnect Message */
1932
      #define  ST    0x1D     /*Status Phase */
1933
      #define  UNKNWN 0x24    /*Unknown bus action */
1934
      #define  CC    0x25     /*Command Completion failure */
1935
      #define  TICK  0x26     /*New target reselected us. */
1936
      #define  RFAIL 0x27     /*Reselection failed */
1937
      #define  SELCHK 0x28     /*Select & Check SCSI ID latch reg */
1938
 
1939
 
1940
      #define  ID_MSG_STRT    hp_aramBase + 0x00
1941
      #define  NON_TAG_ID_MSG hp_aramBase + 0x06
1942
      #define  CMD_STRT       hp_aramBase + 0x08
1943
      #define  SYNC_MSGS      hp_aramBase + 0x08
1944
 
1945
 
1946
 
1947
 
1948
 
1949
      #define  TAG_STRT          0x00
1950
      #define  SELECTION_START   0x00
1951
      #define  DISCONNECT_START  0x10/2
1952
      #define  END_DATA_START    0x14/2
1953
      #define  NONTAG_STRT       0x02/2
1954
      #define  CMD_ONLY_STRT     CMDPZ/2
1955
      #define  TICKLE_STRT     TICK/2
1956
      #define  SELCHK_STRT     SELCHK/2
1957
 
1958
 
1959
 
1960
 
1961
#define mEEPROM_CLK_DELAY(port) (RD_HARPOON(port+hp_intstat_1))
1962
 
1963
#define mWAIT_10MS(port) (RD_HARPOON(port+hp_intstat_1))
1964
 
1965
 
1966
#define CLR_XFER_CNT(port) (WR_HARPOON(port+hp_xfercnt_0, 0x00))
1967
 
1968
#define SET_XFER_CNT(port, data) (WR_HARP32(port,hp_xfercnt_0,data))
1969
 
1970
#define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
1971
/* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \
1972
                                 xfercnt <<= 16,\
1973
                                 xfercnt |= RDW_HARPOON((USHORT)(port+hp_xfercnt_0)))
1974
 */
1975
#if defined(DOS)
1976
#define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((USHORT)(port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\
1977
         addr >>= 16,\
1978
         WRW_HARPOON((USHORT)(port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\
1979
         WR_HARP32(port,hp_xfercnt_0,count),\
1980
         WRW_HARPOON((USHORT)(port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\
1981
         count >>= 16,\
1982
         WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
1983
#else
1984
#define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\
1985
         addr >>= 16,\
1986
         WRW_HARPOON((port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\
1987
         WR_HARP32(port,hp_xfercnt_0,count),\
1988
         WRW_HARPOON((port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\
1989
         count >>= 16,\
1990
         WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
1991
#endif
1992
 
1993
#define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
1994
                          WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
1995
 
1996
 
1997
#define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
1998
                          WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
1999
 
2000
#define ACCEPT_STAT(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
2001
                          WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
2002
 
2003
#define ACCEPT_STAT_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
2004
                          WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
2005
 
2006
#define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\
2007
                        WR_HARPOON(port+hp_scsireset, 0x00))
2008
 
2009
#define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2010
                             (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
2011
 
2012
#define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2013
                             (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
2014
 
2015
#define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2016
                             (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
2017
 
2018
#define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2019
                             (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
2020
 
2021
 
2022
 
2023
#endif
2024
 
2025
 
2026
#if (FW_TYPE==_UCB_MGR_)
2027
void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
2028
void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
2029
void UpdateCheckSum(u32bits baseport);
2030
#endif // (FW_TYPE==_UCB_MGR_)
2031
 
2032
#if defined(DOS)
2033
UCHAR sfm(USHORT port, PSCCB pcurrSCCB);
2034
void  scsiStartAuto(USHORT port);
2035
UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag);
2036
void  ssel(USHORT port, UCHAR p_card);
2037
void  sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard);
2038
void  sdecm(UCHAR message, USHORT port, UCHAR p_card);
2039
void  shandem(USHORT port, UCHAR p_card,PSCCB pCurrSCCB);
2040
void  stsyncn(USHORT port, UCHAR p_card);
2041
void  sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset);
2042
void  sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
2043
void  sresb(USHORT port, UCHAR p_card);
2044
void  sxfrp(USHORT p_port, UCHAR p_card);
2045
void  schkdd(USHORT port, UCHAR p_card);
2046
UCHAR RdStack(USHORT port, UCHAR index);
2047
void  WrStack(USHORT portBase, UCHAR index, UCHAR data);
2048
UCHAR ChkIfChipInitialized(USHORT ioPort);
2049
 
2050
#if defined(V302)
2051
UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun);
2052
#endif
2053
 
2054
void SendMsg(USHORT port, UCHAR message);
2055
void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
2056
UCHAR scsellDOS(USHORT p_port, UCHAR targ_id);
2057
#else
2058
UCHAR sfm(ULONG port, PSCCB pcurrSCCB);
2059
void  scsiStartAuto(ULONG port);
2060
UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag);
2061
void  ssel(ULONG port, UCHAR p_card);
2062
void  sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard);
2063
void  sdecm(UCHAR message, ULONG port, UCHAR p_card);
2064
void  shandem(ULONG port, UCHAR p_card,PSCCB pCurrSCCB);
2065
void  stsyncn(ULONG port, UCHAR p_card);
2066
void  sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset);
2067
void  sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
2068
void  sresb(ULONG port, UCHAR p_card);
2069
void  sxfrp(ULONG p_port, UCHAR p_card);
2070
void  schkdd(ULONG port, UCHAR p_card);
2071
UCHAR RdStack(ULONG port, UCHAR index);
2072
void  WrStack(ULONG portBase, UCHAR index, UCHAR data);
2073
UCHAR ChkIfChipInitialized(ULONG ioPort);
2074
 
2075
#if defined(V302)
2076
UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tar, PUCHAR lun);
2077
#endif
2078
 
2079
void SendMsg(ULONG port, UCHAR message);
2080
void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
2081
#endif
2082
 
2083
void  ssenss(PSCCBcard pCurrCard);
2084
void  sinits(PSCCB p_sccb, UCHAR p_card);
2085
void  RNVRamData(PNVRamInfo pNvRamInfo);
2086
 
2087
#if defined(WIDE_SCSI)
2088
   #if defined(DOS)
2089
   UCHAR siwidn(USHORT port, UCHAR p_card);
2090
   void  stwidn(USHORT port, UCHAR p_card);
2091
   void  siwidr(USHORT port, UCHAR width);
2092
   #else
2093
   UCHAR siwidn(ULONG port, UCHAR p_card);
2094
   void  stwidn(ULONG port, UCHAR p_card);
2095
   void  siwidr(ULONG port, UCHAR width);
2096
   #endif
2097
#endif
2098
 
2099
 
2100
void  queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card);
2101
void  queueDisconnect(PSCCB p_SCCB, UCHAR p_card);
2102
void  queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_SCCB, UCHAR p_card);
2103
void  queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card);
2104
void  queueFlushSccb(UCHAR p_card, UCHAR error_code);
2105
void  queueAddSccb(PSCCB p_SCCB, UCHAR card);
2106
UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card);
2107
void  utilUpdateResidual(PSCCB p_SCCB);
2108
USHORT CalcCrc16(UCHAR buffer[]);
2109
UCHAR  CalcLrc(UCHAR buffer[]);
2110
 
2111
 
2112
#if defined(DOS)
2113
void  Wait1Second(USHORT p_port);
2114
void  Wait(USHORT p_port, UCHAR p_delay);
2115
void  utilEEWriteOnOff(USHORT p_port,UCHAR p_mode);
2116
void  utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr);
2117
USHORT utilEERead(USHORT p_port, USHORT ee_addr);
2118
USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr);
2119
void  utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr);
2120
#else
2121
void  Wait1Second(ULONG p_port);
2122
void  Wait(ULONG p_port, UCHAR p_delay);
2123
void  utilEEWriteOnOff(ULONG p_port,UCHAR p_mode);
2124
void  utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr);
2125
USHORT utilEERead(ULONG p_port, USHORT ee_addr);
2126
USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr);
2127
void  utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr);
2128
#endif
2129
 
2130
 
2131
 
2132
#if defined(OS2)
2133
   void  far phaseDataOut(ULONG port, UCHAR p_card);
2134
   void  far phaseDataIn(ULONG port, UCHAR p_card);
2135
   void  far phaseCommand(ULONG port, UCHAR p_card);
2136
   void  far phaseStatus(ULONG port, UCHAR p_card);
2137
   void  far phaseMsgOut(ULONG port, UCHAR p_card);
2138
   void  far phaseMsgIn(ULONG port, UCHAR p_card);
2139
   void  far phaseIllegal(ULONG port, UCHAR p_card);
2140
#else
2141
   #if defined(DOS)
2142
      void  phaseDataOut(USHORT port, UCHAR p_card);
2143
      void  phaseDataIn(USHORT port, UCHAR p_card);
2144
      void  phaseCommand(USHORT port, UCHAR p_card);
2145
      void  phaseStatus(USHORT port, UCHAR p_card);
2146
      void  phaseMsgOut(USHORT port, UCHAR p_card);
2147
      void  phaseMsgIn(USHORT port, UCHAR p_card);
2148
      void  phaseIllegal(USHORT port, UCHAR p_card);
2149
   #else
2150
      void  phaseDataOut(ULONG port, UCHAR p_card);
2151
      void  phaseDataIn(ULONG port, UCHAR p_card);
2152
      void  phaseCommand(ULONG port, UCHAR p_card);
2153
      void  phaseStatus(ULONG port, UCHAR p_card);
2154
      void  phaseMsgOut(ULONG port, UCHAR p_card);
2155
      void  phaseMsgIn(ULONG port, UCHAR p_card);
2156
      void  phaseIllegal(ULONG port, UCHAR p_card);
2157
   #endif
2158
#endif
2159
 
2160
#if defined(DOS)
2161
void  phaseDecode(USHORT port, UCHAR p_card);
2162
void  phaseChkFifo(USHORT port, UCHAR p_card);
2163
void  phaseBusFree(USHORT p_port, UCHAR p_card);
2164
#else
2165
void  phaseDecode(ULONG port, UCHAR p_card);
2166
void  phaseChkFifo(ULONG port, UCHAR p_card);
2167
void  phaseBusFree(ULONG p_port, UCHAR p_card);
2168
#endif
2169
 
2170
 
2171
 
2172
 
2173
#if defined(DOS)
2174
void  XbowInit(USHORT port, UCHAR scamFlg);
2175
void  BusMasterInit(USHORT p_port);
2176
int   DiagXbow(USHORT port);
2177
int   DiagBusMaster(USHORT port);
2178
void  DiagEEPROM(USHORT p_port);
2179
#else
2180
void  XbowInit(ULONG port, UCHAR scamFlg);
2181
void  BusMasterInit(ULONG p_port);
2182
int   DiagXbow(ULONG port);
2183
int   DiagBusMaster(ULONG port);
2184
void  DiagEEPROM(ULONG p_port);
2185
#endif
2186
 
2187
 
2188
 
2189
 
2190
#if defined(DOS)
2191
void  busMstrAbort(USHORT port);
2192
UCHAR busMstrTimeOut(USHORT port);
2193
void  dataXferProcessor(USHORT port, PSCCBcard pCurrCard);
2194
void  busMstrSGDataXferStart(USHORT port, PSCCB pCurrSCCB);
2195
void  busMstrDataXferStart(USHORT port, PSCCB pCurrSCCB);
2196
void  hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB);
2197
#else
2198
void  busMstrAbort(ULONG port);
2199
UCHAR busMstrTimeOut(ULONG port);
2200
void  dataXferProcessor(ULONG port, PSCCBcard pCurrCard);
2201
void  busMstrSGDataXferStart(ULONG port, PSCCB pCurrSCCB);
2202
void  busMstrDataXferStart(ULONG port, PSCCB pCurrSCCB);
2203
void  hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB);
2204
#endif
2205
void  hostDataXferRestart(PSCCB currSCCB);
2206
 
2207
 
2208
#if defined (DOS)
2209
UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
2210
#else
2211
UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
2212
 
2213
#endif
2214
 
2215
void  SccbMgrTableInitAll(void);
2216
void  SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card);
2217
void  SccbMgrTableInitTarget(UCHAR p_card, UCHAR target);
2218
 
2219
 
2220
 
2221
void  scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up);
2222
 
2223
#if defined(DOS)
2224
int   scarb(USHORT p_port, UCHAR p_sel_type);
2225
void  scbusf(USHORT p_port);
2226
void  scsel(USHORT p_port);
2227
void  scasid(UCHAR p_card, USHORT p_port);
2228
UCHAR scxferc(USHORT p_port, UCHAR p_data);
2229
UCHAR scsendi(USHORT p_port, UCHAR p_id_string[]);
2230
UCHAR sciso(USHORT p_port, UCHAR p_id_string[]);
2231
void  scwirod(USHORT p_port, UCHAR p_data_bit);
2232
void  scwiros(USHORT p_port, UCHAR p_data_bit);
2233
UCHAR scvalq(UCHAR p_quintet);
2234
UCHAR scsell(USHORT p_port, UCHAR targ_id);
2235
void  scwtsel(USHORT p_port);
2236
void  inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id);
2237
void  scsavdi(UCHAR p_card, USHORT p_port);
2238
#else
2239
int   scarb(ULONG p_port, UCHAR p_sel_type);
2240
void  scbusf(ULONG p_port);
2241
void  scsel(ULONG p_port);
2242
void  scasid(UCHAR p_card, ULONG p_port);
2243
UCHAR scxferc(ULONG p_port, UCHAR p_data);
2244
UCHAR scsendi(ULONG p_port, UCHAR p_id_string[]);
2245
UCHAR sciso(ULONG p_port, UCHAR p_id_string[]);
2246
void  scwirod(ULONG p_port, UCHAR p_data_bit);
2247
void  scwiros(ULONG p_port, UCHAR p_data_bit);
2248
UCHAR scvalq(UCHAR p_quintet);
2249
UCHAR scsell(ULONG p_port, UCHAR targ_id);
2250
void  scwtsel(ULONG p_port);
2251
void  inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id);
2252
void  scsavdi(UCHAR p_card, ULONG p_port);
2253
#endif
2254
UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[]);
2255
 
2256
 
2257
#if defined(DOS)
2258
void  autoCmdCmplt(USHORT p_port, UCHAR p_card);
2259
void  autoLoadDefaultMap(USHORT p_port);
2260
#else
2261
void  autoCmdCmplt(ULONG p_port, UCHAR p_card);
2262
void  autoLoadDefaultMap(ULONG p_port);
2263
#endif
2264
 
2265
 
2266
 
2267
#if (FW_TYPE==_SCCB_MGR_)
2268
        void  OS_start_timer(unsigned long ioport, unsigned long timeout);
2269
        void  OS_stop_timer(unsigned long ioport, unsigned long timeout);
2270
        void  OS_disable_int(unsigned char intvec);
2271
        void  OS_enable_int(unsigned char intvec);
2272
        void  OS_delay(unsigned long count);
2273
        int   OS_VirtToPhys(u32bits CardHandle, u32bits *physaddr, u32bits *virtaddr);
2274
        #if !(defined(UNIX) || defined(OS2) || defined(SOLARIS_REAL_MODE)) 
2275
        void  OS_Lock(PSCCBMGR_INFO pCardInfo);
2276
        void  OS_UnLock(PSCCBMGR_INFO pCardInfo);
2277
#endif // if FW_TYPE == ...
2278
 
2279
#endif
2280
 
2281
extern SCCBCARD BL_Card[MAX_CARDS];
2282
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
2283
 
2284
 
2285
#if defined(OS2)
2286
   extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
2287
#else
2288
   #if defined(DOS)
2289
      extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
2290
   #else
2291
      extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
2292
   #endif
2293
#endif
2294
 
2295
extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
2296
extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
2297
#if defined(DOS) || defined(OS2)
2298
extern UCHAR temp_id_string[ID_STRING_LENGTH];
2299
#endif
2300
extern UCHAR scamHAString[];
2301
 
2302
 
2303
extern UCHAR mbCards;
2304
#if defined(BUGBUG)
2305
extern UCHAR debug_int[MAX_CARDS][debug_size];
2306
extern UCHAR debug_index[MAX_CARDS];
2307
void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
2308
#endif
2309
 
2310
#if (FW_TYPE==_SCCB_MGR_)
2311
#if defined(DOS)
2312
   extern UCHAR first_time;
2313
#endif
2314
#endif /* (FW_TYPE==_SCCB_MGR_) */
2315
 
2316
#if (FW_TYPE==_UCB_MGR_)
2317
#if defined(DOS)
2318
   extern u08bits first_time;
2319
#endif
2320
#endif /* (FW_TYPE==_UCB_MGR_) */
2321
 
2322
#if defined(BUGBUG)
2323
void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
2324
#endif
2325
 
2326
extern unsigned int SccbGlobalFlags;
2327
 
2328
 
2329
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
2330
/*----------------------------------------------------------------------
2331
 *
2332
 *
2333
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
2334
 *
2335
 *   This file is available under both the GNU General Public License
2336
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
2337
 *
2338
 *   $Workfile:   sccb.c  $
2339
 *
2340
 *   Description:  Functions relating to handling of the SCCB interface
2341
 *                 between the device driver and the HARPOON.
2342
 *
2343
 *   $Date: 2005-12-20 10:17:45 $
2344
 *
2345
 *   $Revision: 1.1 $
2346
 *
2347
 *----------------------------------------------------------------------*/
2348
 
2349
/*#include <globals.h>*/
2350
 
2351
#if (FW_TYPE==_UCB_MGR_)
2352
        /*#include <budi.h>*/
2353
        /*#include <budioctl.h>*/
2354
#endif
2355
 
2356
/*#include <sccbmgr.h>*/
2357
/*#include <blx30.h>*/
2358
/*#include <target.h>*/
2359
/*#include <eeprom.h>*/
2360
/*#include <scsi2.h>*/
2361
/*#include <harpoon.h>*/
2362
 
2363
 
2364
 
2365
#if (FW_TYPE==_SCCB_MGR_)
2366
#define mOS_Lock(card)    OS_Lock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
2367
#define mOS_UnLock(card)  OS_UnLock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
2368
#else /* FW_TYPE==_UCB_MGR_ */
2369
#define mOS_Lock(card)    OS_Lock((u32bits)(((PSCCBcard)card)->ioPort))
2370
#define mOS_UnLock(card)  OS_UnLock((u32bits)(((PSCCBcard)card)->ioPort))
2371
#endif
2372
 
2373
 
2374
/*
2375
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
2376
extern SCCBCARD BL_Card[MAX_CARDS];
2377
 
2378
extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
2379
extern UCHAR mbCards;
2380
 
2381
#if defined (OS2)
2382
   extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
2383
#else
2384
   #if defined(DOS)
2385
      extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
2386
   #else
2387
      extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
2388
   #endif
2389
#endif
2390
 
2391
 
2392
#if defined(BUGBUG)
2393
extern UCHAR debug_int[MAX_CARDS][debug_size];
2394
extern UCHAR debug_index[MAX_CARDS];
2395
void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
2396
#endif
2397
*/
2398
 
2399
#if (FW_TYPE==_SCCB_MGR_)
2400
 
2401
/*---------------------------------------------------------------------
2402
 *
2403
 * Function: SccbMgr_sense_adapter
2404
 *
2405
 * Description: Setup and/or Search for cards and return info to caller.
2406
 *
2407
 *---------------------------------------------------------------------*/
2408
 
2409
int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
2410
{
2411
#if defined(DOS)
2412
#else
2413
   static UCHAR first_time = 1;
2414
#endif
2415
 
2416
   UCHAR i,j,id,ScamFlg;
2417
   USHORT temp,temp2,temp3,temp4,temp5,temp6;
2418
#if defined(DOS)
2419
   USHORT ioport;
2420
#else
2421
   ULONG ioport;
2422
#endif
2423
        PNVRamInfo pCurrNvRam;
2424
 
2425
#if defined(DOS)
2426
   ioport = (USHORT)pCardInfo->si_baseaddr;
2427
#else
2428
   ioport = pCardInfo->si_baseaddr;
2429
#endif
2430
 
2431
 
2432
   if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
2433
      return((int)FAILURE);
2434
 
2435
   if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
2436
      return((int)FAILURE);
2437
 
2438
   if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
2439
      return((int)FAILURE);
2440
 
2441
   if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
2442
      return((int)FAILURE);
2443
 
2444
 
2445
   if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
2446
 
2447
/* For new Harpoon then check for sub_device ID LSB
2448
   the bits(0-3) must be all ZERO for compatible with
2449
   current version of SCCBMgr, else skip this Harpoon
2450
        device. */
2451
 
2452
           if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
2453
              return((int)FAILURE);
2454
        }
2455
 
2456
   if (first_time)
2457
      {
2458
      SccbMgrTableInitAll();
2459
      first_time = 0;
2460
                mbCards = 0;
2461
      }
2462
 
2463
        if(RdStack(ioport, 0) != 0x00) {
2464
                if(ChkIfChipInitialized(ioport) == FALSE)
2465
                {
2466
                        pCurrNvRam = NULL;
2467
                   WR_HARPOON(ioport+hp_semaphore, 0x00);
2468
                        XbowInit(ioport, 0);             /*Must Init the SCSI before attempting */
2469
                        DiagEEPROM(ioport);
2470
                }
2471
                else
2472
                {
2473
                        if(mbCards < MAX_MB_CARDS) {
2474
                                pCurrNvRam = &nvRamInfo[mbCards];
2475
                                mbCards++;
2476
                                pCurrNvRam->niBaseAddr = ioport;
2477
                                RNVRamData(pCurrNvRam);
2478
                        }else
2479
                                return((int) FAILURE);
2480
                }
2481
        }else
2482
                pCurrNvRam = NULL;
2483
#if defined (NO_BIOS_OPTION)
2484
        pCurrNvRam = NULL;
2485
   XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
2486
   DiagEEPROM(ioport);
2487
#endif  /* No BIOS Option */
2488
 
2489
   WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
2490
   WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
2491
 
2492
        if(pCurrNvRam)
2493
                pCardInfo->si_id = pCurrNvRam->niAdapId;
2494
        else
2495
           pCardInfo->si_id = (UCHAR)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
2496
           (UCHAR)0x0FF);
2497
 
2498
   pCardInfo->si_lun = 0x00;
2499
   pCardInfo->si_fw_revision = ORION_FW_REV;
2500
   temp2 = 0x0000;
2501
   temp3 = 0x0000;
2502
   temp4 = 0x0000;
2503
   temp5 = 0x0000;
2504
   temp6 = 0x0000;
2505
 
2506
   for (id = 0; id < (16/2); id++) {
2507
 
2508
                if(pCurrNvRam){
2509
                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
2510
                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
2511
                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
2512
                }else
2513
              temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
2514
 
2515
      for (i = 0; i < 2; temp >>=8,i++) {
2516
 
2517
         temp2 >>= 1;
2518
         temp3 >>= 1;
2519
         temp4 >>= 1;
2520
         temp5 >>= 1;
2521
         temp6 >>= 1;
2522
         switch (temp & 0x3)
2523
           {
2524
           case AUTO_RATE_20:   /* Synchronous, 20 mega-transfers/second */
2525
             temp6 |= 0x8000;   /* Fall through */
2526
           case AUTO_RATE_10:   /* Synchronous, 10 mega-transfers/second */
2527
             temp5 |= 0x8000;   /* Fall through */
2528
           case AUTO_RATE_05:   /* Synchronous, 5 mega-transfers/second */
2529
             temp2 |= 0x8000;   /* Fall through */
2530
           case AUTO_RATE_00:   /* Asynchronous */
2531
             break;
2532
           }
2533
 
2534
         if (temp & DISC_ENABLE_BIT)
2535
           temp3 |= 0x8000;
2536
 
2537
         if (temp & WIDE_NEGO_BIT)
2538
           temp4 |= 0x8000;
2539
 
2540
         }
2541
      }
2542
 
2543
   pCardInfo->si_per_targ_init_sync = temp2;
2544
   pCardInfo->si_per_targ_no_disc = temp3;
2545
   pCardInfo->si_per_targ_wide_nego = temp4;
2546
   pCardInfo->si_per_targ_fast_nego = temp5;
2547
   pCardInfo->si_per_targ_ultra_nego = temp6;
2548
 
2549
        if(pCurrNvRam)
2550
                i = pCurrNvRam->niSysConf;
2551
        else
2552
           i = (UCHAR)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
2553
 
2554
        if(pCurrNvRam)
2555
                ScamFlg = pCurrNvRam->niScamConf;
2556
        else
2557
           ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
2558
 
2559
   pCardInfo->si_flags = 0x0000;
2560
 
2561
   if (i & 0x01)
2562
      pCardInfo->si_flags |= SCSI_PARITY_ENA;
2563
 
2564
   if (!(i & 0x02))
2565
      pCardInfo->si_flags |= SOFT_RESET;
2566
 
2567
   if (i & 0x10)
2568
      pCardInfo->si_flags |= EXTENDED_TRANSLATION;
2569
 
2570
   if (ScamFlg & SCAM_ENABLED)
2571
     pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
2572
 
2573
   if (ScamFlg & SCAM_LEVEL2)
2574
     pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
2575
 
2576
   j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
2577
   if (i & 0x04) {
2578
      j |= SCSI_TERM_ENA_L;
2579
      }
2580
   WR_HARPOON(ioport+hp_bm_ctrl, j );
2581
 
2582
   j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
2583
   if (i & 0x08) {
2584
      j |= SCSI_TERM_ENA_H;
2585
      }
2586
   WR_HARPOON(ioport+hp_ee_ctrl, j );
2587
 
2588
   if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
2589
 
2590
      pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
2591
 
2592
   pCardInfo->si_card_family = HARPOON_FAMILY;
2593
   pCardInfo->si_bustype = BUSTYPE_PCI;
2594
 
2595
        if(pCurrNvRam){
2596
        pCardInfo->si_card_model[0] = '9';
2597
                switch(pCurrNvRam->niModel & 0x0f){
2598
                        case MODEL_LT:
2599
                        pCardInfo->si_card_model[1] = '3';
2600
                        pCardInfo->si_card_model[2] = '0';
2601
                                break;
2602
                        case MODEL_LW:
2603
                        pCardInfo->si_card_model[1] = '5';
2604
                        pCardInfo->si_card_model[2] = '0';
2605
                                break;
2606
                        case MODEL_DL:
2607
                        pCardInfo->si_card_model[1] = '3';
2608
                        pCardInfo->si_card_model[2] = '2';
2609
                                break;
2610
                        case MODEL_DW:
2611
                        pCardInfo->si_card_model[1] = '5';
2612
                        pCardInfo->si_card_model[2] = '2';
2613
                                break;
2614
                }
2615
        }else{
2616
           temp = utilEERead(ioport, (MODEL_NUMB_0/2));
2617
        pCardInfo->si_card_model[0] = (UCHAR)(temp >> 8);
2618
           temp = utilEERead(ioport, (MODEL_NUMB_2/2));
2619
 
2620
        pCardInfo->si_card_model[1] = (UCHAR)(temp & 0x00FF);
2621
           pCardInfo->si_card_model[2] = (UCHAR)(temp >> 8);
2622
        }
2623
 
2624
   if (pCardInfo->si_card_model[1] == '3')
2625
     {
2626
       if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
2627
         pCardInfo->si_flags |= LOW_BYTE_TERM;
2628
     }
2629
   else if (pCardInfo->si_card_model[2] == '0')
2630
     {
2631
       temp = RD_HARPOON(ioport+hp_xfer_pad);
2632
       WR_HARPOON(ioport+hp_xfer_pad, (temp & ~BIT(4)));
2633
       if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
2634
         pCardInfo->si_flags |= LOW_BYTE_TERM;
2635
       WR_HARPOON(ioport+hp_xfer_pad, (temp | BIT(4)));
2636
       if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
2637
         pCardInfo->si_flags |= HIGH_BYTE_TERM;
2638
       WR_HARPOON(ioport+hp_xfer_pad, temp);
2639
     }
2640
   else
2641
     {
2642
       temp = RD_HARPOON(ioport+hp_ee_ctrl);
2643
       temp2 = RD_HARPOON(ioport+hp_xfer_pad);
2644
       WR_HARPOON(ioport+hp_ee_ctrl, (temp | SEE_CS));
2645
       WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
2646
       temp3 = 0;
2647
       for (i = 0; i < 8; i++)
2648
         {
2649
           temp3 <<= 1;
2650
           if (!(RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)))
2651
             temp3 |= 1;
2652
           WR_HARPOON(ioport+hp_xfer_pad, (temp2 & ~BIT(4)));
2653
           WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
2654
         }
2655
       WR_HARPOON(ioport+hp_ee_ctrl, temp);
2656
       WR_HARPOON(ioport+hp_xfer_pad, temp2);
2657
       if (!(temp3 & BIT(7)))
2658
         pCardInfo->si_flags |= LOW_BYTE_TERM;
2659
       if (!(temp3 & BIT(6)))
2660
         pCardInfo->si_flags |= HIGH_BYTE_TERM;
2661
     }
2662
 
2663
 
2664
   ARAM_ACCESS(ioport);
2665
 
2666
   for ( i = 0; i < 4; i++ ) {
2667
 
2668
      pCardInfo->si_XlatInfo[i] =
2669
         RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
2670
      }
2671
 
2672
        /* return with -1 if no sort, else return with
2673
           logical card number sorted by BIOS (zero-based) */
2674
 
2675
        pCardInfo->si_relative_cardnum =
2676
        (UCHAR)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1);
2677
 
2678
   SGRAM_ACCESS(ioport);
2679
 
2680
   s_PhaseTbl[0] = phaseDataOut;
2681
   s_PhaseTbl[1] = phaseDataIn;
2682
   s_PhaseTbl[2] = phaseIllegal;
2683
   s_PhaseTbl[3] = phaseIllegal;
2684
   s_PhaseTbl[4] = phaseCommand;
2685
   s_PhaseTbl[5] = phaseStatus;
2686
   s_PhaseTbl[6] = phaseMsgOut;
2687
   s_PhaseTbl[7] = phaseMsgIn;
2688
 
2689
   pCardInfo->si_present = 0x01;
2690
 
2691
#if defined(BUGBUG)
2692
 
2693
 
2694
   for (i = 0; i < MAX_CARDS; i++) {
2695
 
2696
      for (id=0; id<debug_size; id++)
2697
         debug_int[i][id] =  (UCHAR)0x00;
2698
      debug_index[i] = 0;
2699
      }
2700
 
2701
#endif
2702
 
2703
   return(0);
2704
}
2705
 
2706
 
2707
/*---------------------------------------------------------------------
2708
 *
2709
 * Function: SccbMgr_config_adapter
2710
 *
2711
 * Description: Setup adapter for normal operation (hard reset).
2712
 *
2713
 *---------------------------------------------------------------------*/
2714
 
2715
#if defined(DOS)
2716
USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
2717
#else
2718
ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
2719
#endif
2720
{
2721
   PSCCBcard CurrCard = NULL;
2722
        PNVRamInfo pCurrNvRam;
2723
   UCHAR i,j,thisCard, ScamFlg;
2724
   USHORT temp,sync_bit_map,id;
2725
#if defined(DOS)
2726
   USHORT ioport;
2727
#else
2728
   ULONG ioport;
2729
#endif
2730
 
2731
#if defined(DOS)
2732
   ioport = (USHORT)pCardInfo->si_baseaddr;
2733
#else
2734
   ioport = pCardInfo->si_baseaddr;
2735
#endif
2736
 
2737
   for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
2738
 
2739
      if (thisCard == MAX_CARDS) {
2740
 
2741
         return(FAILURE);
2742
         }
2743
 
2744
      if (BL_Card[thisCard].ioPort == ioport) {
2745
 
2746
         CurrCard = &BL_Card[thisCard];
2747
         SccbMgrTableInitCard(CurrCard,thisCard);
2748
         break;
2749
         }
2750
 
2751
      else if (BL_Card[thisCard].ioPort == 0x00) {
2752
 
2753
         BL_Card[thisCard].ioPort = ioport;
2754
         CurrCard = &BL_Card[thisCard];
2755
 
2756
                        if(mbCards)
2757
                                for(i = 0; i < mbCards; i++){
2758
                                        if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
2759
                                                CurrCard->pNvRamInfo = &nvRamInfo[i];
2760
                                }
2761
         SccbMgrTableInitCard(CurrCard,thisCard);
2762
         CurrCard->cardIndex = thisCard;
2763
         CurrCard->cardInfo = pCardInfo;
2764
 
2765
         break;
2766
         }
2767
      }
2768
 
2769
        pCurrNvRam = CurrCard->pNvRamInfo;
2770
 
2771
        if(pCurrNvRam){
2772
                ScamFlg = pCurrNvRam->niScamConf;
2773
        }
2774
        else{
2775
           ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
2776
        }
2777
 
2778
 
2779
   BusMasterInit(ioport);
2780
   XbowInit(ioport, ScamFlg);
2781
 
2782
#if defined (NO_BIOS_OPTION)
2783
 
2784
 
2785
   if (DiagXbow(ioport)) return(FAILURE);
2786
   if (DiagBusMaster(ioport)) return(FAILURE);
2787
 
2788
#endif  /* No BIOS Option */
2789
 
2790
   autoLoadDefaultMap(ioport);
2791
 
2792
 
2793
   for (i = 0,id = 0x01; i != pCardInfo->si_id; i++,id <<= 1){}
2794
 
2795
   WR_HARPOON(ioport+hp_selfid_0, id);
2796
   WR_HARPOON(ioport+hp_selfid_1, 0x00);
2797
   WR_HARPOON(ioport+hp_arb_id, pCardInfo->si_id);
2798
   CurrCard->ourId = pCardInfo->si_id;
2799
 
2800
   i = (UCHAR) pCardInfo->si_flags;
2801
   if (i & SCSI_PARITY_ENA)
2802
       WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
2803
 
2804
   j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
2805
   if (i & LOW_BYTE_TERM)
2806
      j |= SCSI_TERM_ENA_L;
2807
   WR_HARPOON(ioport+hp_bm_ctrl, j);
2808
 
2809
   j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
2810
   if (i & HIGH_BYTE_TERM)
2811
      j |= SCSI_TERM_ENA_H;
2812
   WR_HARPOON(ioport+hp_ee_ctrl, j );
2813
 
2814
 
2815
   if (!(pCardInfo->si_flags & SOFT_RESET)) {
2816
 
2817
      sresb(ioport,thisCard);
2818
 
2819
         scini(thisCard, pCardInfo->si_id, 0);
2820
      }
2821
 
2822
 
2823
 
2824
   if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
2825
      CurrCard->globalFlags |= F_NO_FILTER;
2826
 
2827
        if(pCurrNvRam){
2828
                if(pCurrNvRam->niSysConf & 0x10)
2829
                        CurrCard->globalFlags |= F_GREEN_PC;
2830
        }
2831
        else{
2832
           if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
2833
           CurrCard->globalFlags |= F_GREEN_PC;
2834
        }
2835
 
2836
        /* Set global flag to indicate Re-Negotiation to be done on all
2837
                ckeck condition */
2838
        if(pCurrNvRam){
2839
                if(pCurrNvRam->niScsiConf & 0x04)
2840
                        CurrCard->globalFlags |= F_DO_RENEGO;
2841
        }
2842
        else{
2843
           if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
2844
           CurrCard->globalFlags |= F_DO_RENEGO;
2845
        }
2846
 
2847
        if(pCurrNvRam){
2848
                if(pCurrNvRam->niScsiConf & 0x08)
2849
                        CurrCard->globalFlags |= F_CONLUN_IO;
2850
        }
2851
        else{
2852
           if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
2853
           CurrCard->globalFlags |= F_CONLUN_IO;
2854
        }
2855
 
2856
 
2857
   temp = pCardInfo->si_per_targ_no_disc;
2858
 
2859
   for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
2860
 
2861
      if (temp & id)
2862
         sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
2863
      }
2864
 
2865
   sync_bit_map = 0x0001;
2866
 
2867
   for (id = 0; id < (MAX_SCSI_TAR/2); id++) {
2868
 
2869
                if(pCurrNvRam){
2870
                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
2871
                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
2872
                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
2873
                }else
2874
              temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
2875
 
2876
      for (i = 0; i < 2; temp >>=8,i++) {
2877
 
2878
         if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
2879
 
2880
            sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp;
2881
            }
2882
 
2883
         else {
2884
            sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
2885
            sccbMgrTbl[thisCard][id*2+i].TarEEValue =
2886
               (UCHAR)(temp & ~EE_SYNC_MASK);
2887
            }
2888
 
2889
#if defined(WIDE_SCSI)
2890
/*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
2891
            (id*2+i >= 8)){
2892
*/
2893
         if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){
2894
 
2895
            sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
2896
 
2897
            }
2898
 
2899
         else { /* NARROW SCSI */
2900
            sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
2901
            }
2902
 
2903
#else
2904
         sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
2905
#endif
2906
 
2907
 
2908
         sync_bit_map <<= 1;
2909
 
2910
 
2911
 
2912
         }
2913
      }
2914
 
2915
   WR_HARPOON((ioport+hp_semaphore),
2916
      (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
2917
 
2918
#if defined(DOS)
2919
   return((USHORT)CurrCard);
2920
#else
2921
   return((ULONG)CurrCard);
2922
#endif
2923
}
2924
 
2925
#else                   /* end (FW_TYPE==_SCCB_MGR_)  */
2926
 
2927
 
2928
 
2929
STATIC s16bits FP_PresenceCheck(PMGR_INFO pMgrInfo)
2930
{
2931
        PMGR_ENTRYPNTS  pMgr_EntryPnts = &pMgrInfo->mi_Functions;
2932
 
2933
      pMgr_EntryPnts->UCBMgr_probe_adapter = probe_adapter;
2934
      pMgr_EntryPnts->UCBMgr_init_adapter = init_adapter;
2935
      pMgr_EntryPnts->UCBMgr_start_UCB = SccbMgr_start_sccb;
2936
      pMgr_EntryPnts->UCBMgr_build_UCB = build_UCB;
2937
      pMgr_EntryPnts->UCBMgr_abort_UCB = SccbMgr_abort_sccb;
2938
      pMgr_EntryPnts->UCBMgr_my_int = SccbMgr_my_int;
2939
      pMgr_EntryPnts->UCBMgr_isr = SccbMgr_isr;
2940
      pMgr_EntryPnts->UCBMgr_scsi_reset = SccbMgr_scsi_reset;
2941
      pMgr_EntryPnts->UCBMgr_timer_expired = SccbMgr_timer_expired;
2942
#ifndef NO_IOCTLS
2943
          pMgr_EntryPnts->UCBMgr_unload_card = SccbMgr_unload_card;
2944
          pMgr_EntryPnts->UCBMgr_save_foreign_state =
2945
                                                                                SccbMgr_save_foreign_state;
2946
          pMgr_EntryPnts->UCBMgr_restore_foreign_state =
2947
                                                                                SccbMgr_restore_foreign_state;
2948
          pMgr_EntryPnts->UCBMgr_restore_native_state =
2949
                                                                                SccbMgr_restore_native_state;
2950
#endif /*NO_IOCTLS*/
2951
 
2952
      pMgrInfo->mi_SGListFormat=0x01;
2953
      pMgrInfo->mi_DataPtrFormat=0x01;
2954
      pMgrInfo->mi_MaxSGElements= (u16bits) 0xffffffff;
2955
      pMgrInfo->mi_MgrPrivateLen=sizeof(SCCB);
2956
      pMgrInfo->mi_PCIVendorID=BL_VENDOR_ID;
2957
      pMgrInfo->mi_PCIDeviceID=FP_DEVICE_ID;
2958
      pMgrInfo->mi_MgrAttributes= ATTR_IO_MAPPED +
2959
                                                                                         ATTR_PHYSICAL_ADDRESS +
2960
                                                                                         ATTR_VIRTUAL_ADDRESS +
2961
                                                                                         ATTR_OVERLAPPED_IO_IOCTLS_OK;
2962
      pMgrInfo->mi_IoRangeLen = 256;
2963
      return(0);
2964
}
2965
 
2966
 
2967
 
2968
/*---------------------------------------------------------------------
2969
 *
2970
 * Function: probe_adapter
2971
 *
2972
 * Description: Setup and/or Search for cards and return info to caller.
2973
 *
2974
 *---------------------------------------------------------------------*/
2975
STATIC s32bits probe_adapter(PADAPTER_INFO pAdapterInfo)
2976
{
2977
   u16bits temp,temp2,temp3,temp4;
2978
   u08bits i,j,id;
2979
 
2980
#if defined(DOS)
2981
#else
2982
   static u08bits first_time = 1;
2983
#endif
2984
   BASE_PORT ioport;
2985
        PNVRamInfo pCurrNvRam;
2986
 
2987
   ioport = (BASE_PORT)pAdapterInfo->ai_baseaddr;
2988
 
2989
 
2990
 
2991
   if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
2992
      return(1);
2993
 
2994
   if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
2995
      return(2);
2996
 
2997
   if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
2998
      return(3);
2999
 
3000
   if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
3001
      return(4);
3002
 
3003
 
3004
   if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
3005
 
3006
 
3007
/* For new Harpoon then check for sub_device ID LSB
3008
   the bits(0-3) must be all ZERO for compatible with
3009
   current version of SCCBMgr, else skip this Harpoon
3010
        device. */
3011
 
3012
           if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
3013
              return(5);
3014
        }
3015
 
3016
   if (first_time) {
3017
 
3018
      SccbMgrTableInitAll();
3019
      first_time = 0;
3020
                mbCards = 0;
3021
      }
3022
 
3023
        if(RdStack(ioport, 0) != 0x00) {
3024
                if(ChkIfChipInitialized(ioport) == FALSE)
3025
                {
3026
                        pCurrNvRam = NULL;
3027
                   WR_HARPOON(ioport+hp_semaphore, 0x00);
3028
                        XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
3029
                        DiagEEPROM(ioport);
3030
                }
3031
                else
3032
                {
3033
                        if(mbCards < MAX_MB_CARDS) {
3034
                                pCurrNvRam = &nvRamInfo[mbCards];
3035
                                mbCards++;
3036
                                pCurrNvRam->niBaseAddr = ioport;
3037
                                RNVRamData(pCurrNvRam);
3038
                        }else
3039
                                return((int) FAILURE);
3040
                }
3041
        }else
3042
                pCurrNvRam = NULL;
3043
 
3044
#if defined (NO_BIOS_OPTION)
3045
        pCurrNvRam = NULL;
3046
   XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
3047
   DiagEEPROM(ioport);
3048
#endif  /* No BIOS Option */
3049
 
3050
   WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
3051
   WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
3052
 
3053
        if(pCurrNvRam)
3054
                pAdapterInfo->ai_id = pCurrNvRam->niAdapId;
3055
        else
3056
        pAdapterInfo->ai_id = (u08bits)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
3057
        (u08bits)0x0FF);
3058
 
3059
   pAdapterInfo->ai_lun = 0x00;
3060
   pAdapterInfo->ai_fw_revision[0] = '3';
3061
   pAdapterInfo->ai_fw_revision[1] = '1';
3062
   pAdapterInfo->ai_fw_revision[2] = '1';
3063
   pAdapterInfo->ai_fw_revision[3] = ' ';
3064
   pAdapterInfo->ai_NumChannels = 1;
3065
 
3066
   temp2 = 0x0000;
3067
   temp3 = 0x0000;
3068
   temp4 = 0x0000;
3069
 
3070
   for (id = 0; id < (16/2); id++) {
3071
 
3072
                if(pCurrNvRam){
3073
                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
3074
                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
3075
                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
3076
                }else
3077
              temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
3078
 
3079
      for (i = 0; i < 2; temp >>=8,i++) {
3080
 
3081
         if ((temp & 0x03) != AUTO_RATE_00) {
3082
 
3083
            temp2 >>= 0x01;
3084
            temp2 |= 0x8000;
3085
            }
3086
 
3087
         else {
3088
            temp2 >>= 0x01;
3089
            }
3090
 
3091
         if (temp & DISC_ENABLE_BIT) {
3092
 
3093
            temp3 >>= 0x01;
3094
            temp3 |= 0x8000;
3095
            }
3096
 
3097
         else {
3098
            temp3 >>= 0x01;
3099
            }
3100
 
3101
         if (temp & WIDE_NEGO_BIT) {
3102
 
3103
            temp4 >>= 0x01;
3104
            temp4 |= 0x8000;
3105
            }
3106
 
3107
         else {
3108
            temp4 >>= 0x01;
3109
            }
3110
 
3111
         }
3112
      }
3113
 
3114
   pAdapterInfo->ai_per_targ_init_sync = temp2;
3115
   pAdapterInfo->ai_per_targ_no_disc = temp3;
3116
   pAdapterInfo->ai_per_targ_wide_nego = temp4;
3117
        if(pCurrNvRam)
3118
                i = pCurrNvRam->niSysConf;
3119
        else
3120
        i = (u08bits)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
3121
 
3122
   /*
3123
   ** interrupts always level-triggered for FlashPoint
3124
   */
3125
   pAdapterInfo->ai_stateinfo |= LEVEL_TRIG;
3126
 
3127
   if (i & 0x01)
3128
      pAdapterInfo->ai_stateinfo |= SCSI_PARITY_ENA;
3129
 
3130
        if (i & 0x02)   /* SCSI Bus reset in AutoSCSI Set ? */
3131
        {
3132
                if(pCurrNvRam)
3133
                {
3134
                        j = pCurrNvRam->niScamConf;
3135
                }
3136
                else
3137
                {
3138
                j = (u08bits) utilEERead(ioport, SCAM_CONFIG/2);
3139
                }
3140
                if(j & SCAM_ENABLED)
3141
                {
3142
                        if(j & SCAM_LEVEL2)
3143
                        {
3144
                                pAdapterInfo->ai_stateinfo |= SCAM2_ENA;
3145
                        }
3146
                        else
3147
                        {
3148
                                pAdapterInfo->ai_stateinfo |= SCAM1_ENA;
3149
                        }
3150
                }
3151
        }
3152
   j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
3153
   if (i & 0x04) {
3154
      j |= SCSI_TERM_ENA_L;
3155
      pAdapterInfo->ai_stateinfo |= LOW_BYTE_TERM_ENA;
3156
      }
3157
   WR_HARPOON(ioport+hp_bm_ctrl, j );
3158
 
3159
   j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
3160
   if (i & 0x08) {
3161
      j |= SCSI_TERM_ENA_H;
3162
      pAdapterInfo->ai_stateinfo |= HIGH_BYTE_TERM_ENA;
3163
      }
3164
   WR_HARPOON(ioport+hp_ee_ctrl, j );
3165
 
3166
        if(RD_HARPOON(ioport + hp_page_ctrl) & BIOS_SHADOW)
3167
        {
3168
                pAdapterInfo->ai_FlashRomSize = 64 * 1024;      /* 64k ROM */
3169
        }
3170
        else
3171
        {
3172
                pAdapterInfo->ai_FlashRomSize = 32 * 1024;      /* 32k ROM */
3173
        }
3174
 
3175
   pAdapterInfo->ai_stateinfo |= (FAST20_ENA | TAG_QUEUE_ENA);
3176
   if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
3177
        {
3178
      pAdapterInfo->ai_attributes |= (WIDE_CAPABLE | FAST20_CAPABLE
3179
                                                                                                        | SCAM2_CAPABLE
3180
                                                                                                        | TAG_QUEUE_CAPABLE
3181
                                                                                                        | SUPRESS_UNDERRRUNS_CAPABLE
3182
                                                                                                        | SCSI_PARITY_CAPABLE);
3183
                pAdapterInfo->ai_MaxTarg = 16;
3184
                pAdapterInfo->ai_MaxLun  = 32;
3185
        }
3186
        else
3187
        {
3188
      pAdapterInfo->ai_attributes |= (FAST20_CAPABLE | SCAM2_CAPABLE
3189
                                                                                                        | TAG_QUEUE_CAPABLE
3190
                                                                                                        | SUPRESS_UNDERRRUNS_CAPABLE
3191
                                                                                                        | SCSI_PARITY_CAPABLE);
3192
                pAdapterInfo->ai_MaxTarg = 8;
3193
                pAdapterInfo->ai_MaxLun  = 8;
3194
        }
3195
 
3196
   pAdapterInfo->ai_product_family = HARPOON_FAMILY;
3197
   pAdapterInfo->ai_HBAbustype = BUSTYPE_PCI;
3198
 
3199
   for (i=0;i<CARD_MODEL_NAMELEN;i++)
3200
   {
3201
      pAdapterInfo->ai_card_model[i]=' '; /* initialize the ai_card_model */
3202
   }
3203
 
3204
        if(pCurrNvRam){
3205
        pAdapterInfo->ai_card_model[0] = '9';
3206
                switch(pCurrNvRam->niModel & 0x0f){
3207
                        case MODEL_LT:
3208
                        pAdapterInfo->ai_card_model[1] = '3';
3209
                        pAdapterInfo->ai_card_model[2] = '0';
3210
                                break;
3211
                        case MODEL_LW:
3212
                        pAdapterInfo->ai_card_model[1] = '5';
3213
                        pAdapterInfo->ai_card_model[2] = '0';
3214
                                break;
3215
                        case MODEL_DL:
3216
                        pAdapterInfo->ai_card_model[1] = '3';
3217
                        pAdapterInfo->ai_card_model[2] = '2';
3218
                                break;
3219
                        case MODEL_DW:
3220
                        pAdapterInfo->ai_card_model[1] = '5';
3221
                        pAdapterInfo->ai_card_model[2] = '2';
3222
                                break;
3223
                }
3224
        }else{
3225
           temp = utilEERead(ioport, (MODEL_NUMB_0/2));
3226
                pAdapterInfo->ai_card_model[0] = (u08bits)(temp >> 8);
3227
           temp = utilEERead(ioport, (MODEL_NUMB_2/2));
3228
 
3229
                pAdapterInfo->ai_card_model[1] = (u08bits)(temp & 0x00FF);
3230
           pAdapterInfo->ai_card_model[2] = (u08bits)(temp >> 8);
3231
        }
3232
 
3233
 
3234
 
3235
   pAdapterInfo->ai_FiberProductType = 0;
3236
 
3237
   pAdapterInfo->ai_secondary_range = 0;
3238
 
3239
   for (i=0;i<WORLD_WIDE_NAMELEN;i++)
3240
   {
3241
      pAdapterInfo->ai_worldwidename[i]='\0';
3242
   }
3243
 
3244
   for (i=0;i<VENDOR_NAMELEN;i++)
3245
   {
3246
      pAdapterInfo->ai_vendorstring[i]='\0';
3247
   }
3248
        pAdapterInfo->ai_vendorstring[0]='B';
3249
        pAdapterInfo->ai_vendorstring[1]='U';
3250
        pAdapterInfo->ai_vendorstring[2]='S';
3251
        pAdapterInfo->ai_vendorstring[3]='L';
3252
        pAdapterInfo->ai_vendorstring[4]='O';
3253
        pAdapterInfo->ai_vendorstring[5]='G';
3254
        pAdapterInfo->ai_vendorstring[6]='I';
3255
        pAdapterInfo->ai_vendorstring[7]='C';
3256
 
3257
        for (i=0;i<FAMILY_NAMELEN;i++)
3258
        {
3259
           pAdapterInfo->ai_AdapterFamilyString[i]='\0';
3260
        }
3261
        pAdapterInfo->ai_AdapterFamilyString[0]='F';
3262
        pAdapterInfo->ai_AdapterFamilyString[1]='L';
3263
        pAdapterInfo->ai_AdapterFamilyString[2]='A';
3264
        pAdapterInfo->ai_AdapterFamilyString[3]='S';
3265
        pAdapterInfo->ai_AdapterFamilyString[4]='H';
3266
        pAdapterInfo->ai_AdapterFamilyString[5]='P';
3267
        pAdapterInfo->ai_AdapterFamilyString[6]='O';
3268
        pAdapterInfo->ai_AdapterFamilyString[7]='I';
3269
        pAdapterInfo->ai_AdapterFamilyString[8]='N';
3270
        pAdapterInfo->ai_AdapterFamilyString[9]='T';
3271
 
3272
   ARAM_ACCESS(ioport);
3273
 
3274
   for ( i = 0; i < 4; i++ ) {
3275
 
3276
      pAdapterInfo->ai_XlatInfo[i] =
3277
         RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
3278
      }
3279
 
3280
        /* return with -1 if no sort, else return with
3281
           logical card number sorted by BIOS (zero-based) */
3282
 
3283
 
3284
        pAdapterInfo->ai_relative_cardnum =
3285
      (u08bits)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1);
3286
 
3287
   SGRAM_ACCESS(ioport);
3288
 
3289
   s_PhaseTbl[0] = phaseDataOut;
3290
   s_PhaseTbl[1] = phaseDataIn;
3291
   s_PhaseTbl[2] = phaseIllegal;
3292
   s_PhaseTbl[3] = phaseIllegal;
3293
   s_PhaseTbl[4] = phaseCommand;
3294
   s_PhaseTbl[5] = phaseStatus;
3295
   s_PhaseTbl[6] = phaseMsgOut;
3296
   s_PhaseTbl[7] = phaseMsgIn;
3297
 
3298
   pAdapterInfo->ai_present = 0x01;
3299
 
3300
#if defined(BUGBUG)
3301
 
3302
 
3303
   for (i = 0; i < MAX_CARDS; i++) {
3304
 
3305
      for (id=0; id<debug_size; id++)
3306
         debug_int[i][id] =  (u08bits)0x00;
3307
      debug_index[i] = 0;
3308
      }
3309
 
3310
#endif
3311
 
3312
   return(0);
3313
}
3314
 
3315
 
3316
 
3317
 
3318
 
3319
/*---------------------------------------------------------------------
3320
 *
3321
 * Function: init_adapter, exported to BUDI via UCBMgr_init_adapter entry
3322
 *
3323
 *
3324
 * Description: Setup adapter for normal operation (hard reset).
3325
 *
3326
 *---------------------------------------------------------------------*/
3327
STATIC CARD_HANDLE init_adapter(PADAPTER_INFO pCardInfo)
3328
{
3329
   PSCCBcard CurrCard;
3330
        PNVRamInfo pCurrNvRam;
3331
   u08bits i,j,thisCard, ScamFlg;
3332
   u16bits temp,sync_bit_map,id;
3333
   BASE_PORT ioport;
3334
 
3335
   ioport = (BASE_PORT)pCardInfo->ai_baseaddr;
3336
 
3337
   for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
3338
 
3339
      if (thisCard == MAX_CARDS) {
3340
 
3341
         return(FAILURE);
3342
         }
3343
 
3344
      if (BL_Card[thisCard].ioPort == ioport) {
3345
 
3346
         CurrCard = &BL_Card[thisCard];
3347
         SccbMgrTableInitCard(CurrCard,thisCard);
3348
         break;
3349
         }
3350
 
3351
      else if (BL_Card[thisCard].ioPort == 0x00) {
3352
 
3353
         BL_Card[thisCard].ioPort = ioport;
3354
         CurrCard = &BL_Card[thisCard];
3355
 
3356
                        if(mbCards)
3357
                                for(i = 0; i < mbCards; i++){
3358
                                        if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
3359
                                                CurrCard->pNvRamInfo = &nvRamInfo[i];
3360
                                }
3361
         SccbMgrTableInitCard(CurrCard,thisCard);
3362
         CurrCard->cardIndex = thisCard;
3363
         CurrCard->cardInfo = pCardInfo;
3364
 
3365
         break;
3366
         }
3367
      }
3368
 
3369
        pCurrNvRam = CurrCard->pNvRamInfo;
3370
 
3371
 
3372
        if(pCurrNvRam){
3373
                ScamFlg = pCurrNvRam->niScamConf;
3374
        }
3375
        else{
3376
           ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
3377
        }
3378
 
3379
 
3380
   BusMasterInit(ioport);
3381
   XbowInit(ioport, ScamFlg);
3382
 
3383
#if defined (NO_BIOS_OPTION)
3384
 
3385
 
3386
   if (DiagXbow(ioport)) return(FAILURE);
3387
   if (DiagBusMaster(ioport)) return(FAILURE);
3388
 
3389
#endif  /* No BIOS Option */
3390
 
3391
   autoLoadDefaultMap(ioport);
3392
 
3393
 
3394
   for (i = 0,id = 0x01; i != pCardInfo->ai_id; i++,id <<= 1){}
3395
 
3396
   WR_HARPOON(ioport+hp_selfid_0, id);
3397
   WR_HARPOON(ioport+hp_selfid_1, 0x00);
3398
   WR_HARPOON(ioport+hp_arb_id, pCardInfo->ai_id);
3399
   CurrCard->ourId = (unsigned char) pCardInfo->ai_id;
3400
 
3401
   i = (u08bits) pCardInfo->ai_stateinfo;
3402
   if (i & SCSI_PARITY_ENA)
3403
       WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
3404
 
3405
   j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
3406
   if (i & LOW_BYTE_TERM_ENA)
3407
      j |= SCSI_TERM_ENA_L;
3408
   WR_HARPOON(ioport+hp_bm_ctrl, j);
3409
 
3410
   j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
3411
   if (i & HIGH_BYTE_TERM_ENA)
3412
      j |= SCSI_TERM_ENA_H;
3413
   WR_HARPOON(ioport+hp_ee_ctrl, j );
3414
 
3415
 
3416
   if (!(pCardInfo->ai_stateinfo & NO_RESET_IN_INIT)) {
3417
 
3418
      sresb(ioport,thisCard);
3419
 
3420
         scini(thisCard, (u08bits) pCardInfo->ai_id, 0);
3421
      }
3422
 
3423
 
3424
 
3425
   if (pCardInfo->ai_stateinfo & SUPRESS_UNDERRRUNS_ENA)
3426
      CurrCard->globalFlags |= F_NO_FILTER;
3427
 
3428
        if(pCurrNvRam){
3429
                if(pCurrNvRam->niSysConf & 0x10)
3430
                        CurrCard->globalFlags |= F_GREEN_PC;
3431
        }
3432
        else{
3433
           if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
3434
           CurrCard->globalFlags |= F_GREEN_PC;
3435
        }
3436
 
3437
        /* Set global flag to indicate Re-Negotiation to be done on all
3438
                ckeck condition */
3439
        if(pCurrNvRam){
3440
                if(pCurrNvRam->niScsiConf & 0x04)
3441
                        CurrCard->globalFlags |= F_DO_RENEGO;
3442
        }
3443
        else{
3444
           if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
3445
           CurrCard->globalFlags |= F_DO_RENEGO;
3446
        }
3447
 
3448
        if(pCurrNvRam){
3449
                if(pCurrNvRam->niScsiConf & 0x08)
3450
                        CurrCard->globalFlags |= F_CONLUN_IO;
3451
        }
3452
        else{
3453
           if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
3454
           CurrCard->globalFlags |= F_CONLUN_IO;
3455
        }
3456
 
3457
   temp = pCardInfo->ai_per_targ_no_disc;
3458
 
3459
   for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
3460
 
3461
      if (temp & id)
3462
         sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
3463
      }
3464
 
3465
   sync_bit_map = 0x0001;
3466
 
3467
   for (id = 0; id < (MAX_SCSI_TAR/2); id++){
3468
 
3469
                if(pCurrNvRam){
3470
                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
3471
                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
3472
                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
3473
                }else
3474
              temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
3475
 
3476
      for (i = 0; i < 2; temp >>=8,i++){
3477
 
3478
         if (pCardInfo->ai_per_targ_init_sync & sync_bit_map){
3479
 
3480
            sccbMgrTbl[thisCard][id*2+i].TarEEValue = (u08bits)temp;
3481
            }
3482
 
3483
         else {
3484
            sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
3485
            sccbMgrTbl[thisCard][id*2+i].TarEEValue =
3486
               (u08bits)(temp & ~EE_SYNC_MASK);
3487
            }
3488
 
3489
#if defined(WIDE_SCSI)
3490
/*         if ((pCardInfo->ai_per_targ_wide_nego & sync_bit_map) ||
3491
            (id*2+i >= 8)){
3492
*/
3493
         if (pCardInfo->ai_per_targ_wide_nego & sync_bit_map){
3494
 
3495
            sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
3496
 
3497
            }
3498
 
3499
         else { /* NARROW SCSI */
3500
            sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
3501
            }
3502
 
3503
#else
3504
         sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
3505
#endif
3506
 
3507
 
3508
         sync_bit_map <<= 1;
3509
         }
3510
      }
3511
 
3512
 
3513
   pCardInfo->ai_SGListFormat=0x01;
3514
   pCardInfo->ai_DataPtrFormat=0x01;
3515
   pCardInfo->ai_AEN_mask &= SCSI_RESET_COMPLETE;
3516
 
3517
   WR_HARPOON((ioport+hp_semaphore),
3518
      (u08bits)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
3519
 
3520
   return((u32bits)CurrCard);
3521
 
3522
}
3523
 
3524
 
3525
/*---------------------------------------------------------------------
3526
 *
3527
 * Function: build_ucb, exported to BUDI via UCBMgr_build_ucb entry
3528
 *
3529
 * Description: prepare fw portion of ucb. do not start, resource not guaranteed
3530
 *             so don't manipulate anything that's derived from states which
3531
 *             may change
3532
 *
3533
 *---------------------------------------------------------------------*/
3534
void build_UCB(CARD_HANDLE pCurrCard, PUCB p_ucb)
3535
{
3536
 
3537
   u08bits thisCard;
3538
   u08bits i,j;
3539
 
3540
   PSCCB p_sccb;
3541
 
3542
 
3543
   thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
3544
 
3545
 
3546
   p_sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
3547
 
3548
 
3549
   p_sccb->Sccb_ucb_ptr=p_ucb;
3550
 
3551
   switch (p_ucb->UCB_opcode & (OPC_DEVICE_RESET+OPC_XFER_SG+OPC_CHK_RESIDUAL))
3552
   {
3553
      case OPC_DEVICE_RESET:
3554
         p_sccb->OperationCode=RESET_COMMAND;
3555
         break;
3556
      case OPC_XFER_SG:
3557
         p_sccb->OperationCode=SCATTER_GATHER_COMMAND;
3558
         break;
3559
      case OPC_XFER_SG+OPC_CHK_RESIDUAL:
3560
         p_sccb->OperationCode=RESIDUAL_SG_COMMAND;
3561
         break;
3562
      case OPC_CHK_RESIDUAL:
3563
 
3564
              p_sccb->OperationCode=RESIDUAL_COMMAND;
3565
              break;
3566
      default:
3567
              p_sccb->OperationCode=SCSI_INITIATOR_COMMAND;
3568
              break;
3569
   }
3570
 
3571
   if (p_ucb->UCB_opcode & OPC_TQ_ENABLE)
3572
   {
3573
      p_sccb->ControlByte = (u08bits)((p_ucb->UCB_opcode & OPC_TQ_MASK)>>2) | F_USE_CMD_Q;
3574
   }
3575
   else
3576
   {
3577
      p_sccb->ControlByte = 0;
3578
   }
3579
 
3580
 
3581
   p_sccb->CdbLength = (u08bits)p_ucb->UCB_cdblen;
3582
 
3583
   if (p_ucb->UCB_opcode & OPC_NO_AUTO_SENSE)
3584
   {
3585
      p_sccb->RequestSenseLength = 0;
3586
   }
3587
   else
3588
   {
3589
      p_sccb->RequestSenseLength = (unsigned char) p_ucb->UCB_senselen;
3590
   }
3591
 
3592
 
3593
   if (p_ucb->UCB_opcode & OPC_XFER_SG)
3594
   {
3595
      p_sccb->DataPointer=p_ucb->UCB_virt_dataptr;
3596
      p_sccb->DataLength = (((u32bits)p_ucb->UCB_NumSgElements)<<3);
3597
   }
3598
   else
3599
   {
3600
      p_sccb->DataPointer=p_ucb->UCB_phys_dataptr;
3601
      p_sccb->DataLength=p_ucb->UCB_datalen;
3602
   };
3603
 
3604
   p_sccb->HostStatus=0;
3605
   p_sccb->TargetStatus=0;
3606
   p_sccb->TargID=(unsigned char)p_ucb->UCB_targid;
3607
   p_sccb->Lun=(unsigned char) p_ucb->UCB_lun;
3608
   p_sccb->SccbIOPort=((PSCCBcard)pCurrCard)->ioPort;
3609
 
3610
   j=p_ucb->UCB_cdblen;
3611
   for (i=0;i<j;i++)
3612
   {
3613
      p_sccb->Cdb[i] = p_ucb->UCB_cdb[i];
3614
   }
3615
 
3616
   p_sccb->SensePointer=p_ucb->UCB_phys_senseptr;
3617
 
3618
   sinits(p_sccb,thisCard);
3619
 
3620
}
3621
#ifndef NO_IOCTLS
3622
 
3623
/*---------------------------------------------------------------------
3624
 *
3625
 * Function: GetDevSyncRate
3626
 *
3627
 *---------------------------------------------------------------------*/
3628
STATIC  int GetDevSyncRate(PSCCBcard pCurrCard,PUCB p_ucb)
3629
{
3630
        struct _SYNC_RATE_INFO * pSyncStr;
3631
   PSCCBMgr_tar_info currTar_Info;
3632
        BASE_PORT ioport;
3633
        u08bits scsiID, j;
3634
 
3635
#if (FW_TYPE != _SCCB_MGR_)
3636
        if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
3637
        {
3638
                return(1);
3639
        }
3640
#endif
3641
 
3642
        ioport  = pCurrCard->ioPort;
3643
        pSyncStr        = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
3644
        scsiID = (u08bits) p_ucb->UCB_targid;
3645
   currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
3646
        j = currTar_Info->TarSyncCtrl;
3647
 
3648
        switch (currTar_Info->TarEEValue & EE_SYNC_MASK)
3649
        {
3650
                case EE_SYNC_ASYNC:
3651
                        pSyncStr->RequestMegaXferRate = 0x00;
3652
                        break;
3653
                case EE_SYNC_5MB:
3654
                        pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
3655
                        break;
3656
                case EE_SYNC_10MB:
3657
                        pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
3658
                        break;
3659
                case EE_SYNC_20MB:
3660
                        pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
3661
                        break;
3662
        }
3663
 
3664
        switch ((j >> 5) & 0x07)
3665
        {
3666
                case 0x00:
3667
                        if((j & 0x07) == 0x00)
3668
                        {
3669
                                pSyncStr->ActualMegaXferRate = 0x00;    /* Async Mode */
3670
                        }
3671
                        else
3672
                        {
3673
                                pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
3674
                        }
3675
                        break;
3676
                case 0x01:
3677
                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
3678
                        break;
3679
                case 0x02:
3680
                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 66 : 122;
3681
                        break;
3682
                case 0x03:
3683
                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
3684
                        break;
3685
                case 0x04:
3686
                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 40 : 80;
3687
                        break;
3688
                case 0x05:
3689
                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 33 : 66;
3690
                        break;
3691
                case 0x06:
3692
                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 28 : 56;
3693
                        break;
3694
                case 0x07:
3695
                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 25 : 50;
3696
                        break;
3697
        }
3698
        pSyncStr->NegotiatedOffset = j & 0x0f;
3699
 
3700
        return(0);
3701
}
3702
 
3703
/*---------------------------------------------------------------------
3704
 *
3705
 * Function: SetDevSyncRate
3706
 *
3707
 *---------------------------------------------------------------------*/
3708
STATIC int SetDevSyncRate(PSCCBcard pCurrCard, PUCB p_ucb)
3709
{
3710
        struct _SYNC_RATE_INFO * pSyncStr;
3711
   PSCCBMgr_tar_info currTar_Info;
3712
        BASE_PORT ioPort;
3713
        u08bits scsiID, i, j, syncVal;
3714
        u16bits syncOffset, actualXferRate;
3715
        union {
3716
                u08bits tempb[2];
3717
                u16bits tempw;
3718
        }temp2;
3719
 
3720
#if (FW_TYPE != _SCCB_MGR_)
3721
        if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
3722
        {
3723
                return(1);
3724
        }
3725
#endif
3726
 
3727
        ioPort  = pCurrCard->ioPort;
3728
        pSyncStr        = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
3729
        scsiID = (u08bits) p_ucb->UCB_targid;
3730
   currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
3731
        i = RD_HARPOON(ioPort+hp_xfer_pad);             /* Save current value */
3732
        WR_HARPOON(ioPort+hp_xfer_pad, (i | ID_UNLOCK));
3733
        WR_HARPOON(ioPort+hp_select_id, ((scsiID << 4) | scsiID));
3734
        j = RD_HARPOON(ioPort+hp_synctarg_0);
3735
        WR_HARPOON(ioPort+hp_xfer_pad, i);              /* restore value */
3736
 
3737
        actualXferRate = pSyncStr->ActualMegaXferRate;
3738
        if(!(j & NARROW_SCSI))
3739
        {
3740
                actualXferRate <<= 1;
3741
        }
3742
        if(actualXferRate == 0x00)
3743
        {
3744
                syncVal = EE_SYNC_ASYNC;                        /* Async Mode */
3745
        }
3746
        if(actualXferRate == 0x0200)
3747
        {
3748
                syncVal = EE_SYNC_20MB;                         /* 20/40 MB Mode */
3749
        }
3750
        if(actualXferRate > 0x0050 && actualXferRate < 0x0200 )
3751
        {
3752
                syncVal = EE_SYNC_10MB;                         /* 10/20 MB Mode */
3753
        }
3754
        else
3755
        {
3756
                syncVal = EE_SYNC_5MB;                          /* 5/10 MB Mode */
3757
        }
3758
        if(currTar_Info->TarEEValue && EE_SYNC_MASK == syncVal)
3759
                return(0);
3760
        currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_SYNC_MASK)
3761
                                                                                        | syncVal;
3762
        syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
3763
        temp2.tempw = utilEERead(ioPort, syncOffset);
3764
        if(scsiID & 0x01)
3765
        {
3766
                temp2.tempb[0] = (temp2.tempb[0] & !EE_SYNC_MASK) | syncVal;
3767
        }
3768
        else
3769
        {
3770
                temp2.tempb[1] = (temp2.tempb[1] & !EE_SYNC_MASK) | syncVal;
3771
        }
3772
        utilEEWriteOnOff(ioPort, 1);
3773
        utilEEWrite(ioPort, temp2.tempw, syncOffset);
3774
        utilEEWriteOnOff(ioPort, 0);
3775
        UpdateCheckSum(ioPort);
3776
 
3777
        return(0);
3778
}
3779
/*---------------------------------------------------------------------
3780
 *
3781
 * Function: GetDevWideMode
3782
 *
3783
 *---------------------------------------------------------------------*/
3784
int GetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
3785
{
3786
        u08bits *pData;
3787
 
3788
        pData = (u08bits *)p_ucb->UCB_virt_dataptr;
3789
        if(sccbMgrTbl[pCurrCard->cardIndex][p_ucb->UCB_targid].TarEEValue
3790
                                & EE_WIDE_SCSI)
3791
        {
3792
                *pData = 1;
3793
        }
3794
        else
3795
        {
3796
                *pData = 0;
3797
        }
3798
 
3799
        return(0);
3800
}
3801
 
3802
/*---------------------------------------------------------------------
3803
 *
3804
 * Function: SetDevWideMode
3805
 *
3806
 *---------------------------------------------------------------------*/
3807
int SetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
3808
{
3809
        u08bits *pData;
3810
   PSCCBMgr_tar_info currTar_Info;
3811
        BASE_PORT ioPort;
3812
        u08bits scsiID, scsiWideMode;
3813
        u16bits syncOffset;
3814
        union {
3815
                u08bits tempb[2];
3816
                u16bits tempw;
3817
        }temp2;
3818
 
3819
#if (FW_TYPE != _SCCB_MGR_)
3820
        if( !(pCurrCard->cardInfo->ai_attributes & WIDE_CAPABLE) )
3821
        {
3822
                return(1);
3823
        }
3824
 
3825
        if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
3826
        {
3827
                return(1);
3828
        }
3829
#endif
3830
 
3831
        ioPort  = pCurrCard->ioPort;
3832
        pData = (u08bits *)p_ucb->UCB_virt_dataptr;
3833
        scsiID = (u08bits) p_ucb->UCB_targid;
3834
        currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
3835
 
3836
        if(*pData)
3837
        {
3838
                if(currTar_Info->TarEEValue & EE_WIDE_SCSI)
3839
                {
3840
                        return(0);
3841
                }
3842
                else
3843
                {
3844
                        scsiWideMode = EE_WIDE_SCSI;
3845
                }
3846
        }
3847
        else
3848
        {
3849
                if(!currTar_Info->TarEEValue & EE_WIDE_SCSI)
3850
                {
3851
                        return(0);
3852
                }
3853
                else
3854
                {
3855
                        scsiWideMode = 0;
3856
                }
3857
        }
3858
        currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_WIDE_SCSI)
3859
                                                                                        | scsiWideMode;
3860
 
3861
        syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
3862
        temp2.tempw = utilEERead(ioPort, syncOffset);
3863
        if(scsiID & 0x01)
3864
        {
3865
                temp2.tempb[0] = (temp2.tempb[0] & !EE_WIDE_SCSI) | scsiWideMode;
3866
        }
3867
        else
3868
        {
3869
                temp2.tempb[1] = (temp2.tempb[1] & !EE_WIDE_SCSI) | scsiWideMode;
3870
        }
3871
        utilEEWriteOnOff(ioPort, 1);
3872
        utilEEWrite(ioPort, temp2.tempw, syncOffset);
3873
        utilEEWriteOnOff(ioPort, 0);
3874
        UpdateCheckSum(ioPort);
3875
 
3876
        return(0);
3877
}
3878
 
3879
/*---------------------------------------------------------------------
3880
 *
3881
 * Function: ReadNVRam
3882
 *
3883
 *---------------------------------------------------------------------*/
3884
void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
3885
{
3886
        u08bits *pdata;
3887
        u16bits i,numwrds,numbytes,offset,temp;
3888
        u08bits OneMore = FALSE;
3889
#if defined(DOS)
3890
        u16bits ioport;
3891
#else
3892
        u32bits ioport;
3893
#endif
3894
 
3895
        numbytes = (u16bits) p_ucb->UCB_datalen;
3896
        ioport  = pCurrCard->ioPort;
3897
   pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
3898
        offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
3899
 
3900
 
3901
 
3902
   if (offset & 0x1)
3903
        {
3904
            *((u16bits*) pdata) = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
3905
                 *pdata = *(pdata + 1);
3906
                 ++offset;
3907
         ++pdata;
3908
                 --numbytes;
3909
        }
3910
 
3911
        numwrds = numbytes / 2;
3912
        if (numbytes & 1)
3913
                OneMore = TRUE;
3914
 
3915
        for (i = 0; i < numwrds; i++)
3916
        {
3917
        *((u16bits*) pdata) = utilEERead(ioport,(u16bits)(offset / 2));
3918
                pdata += 2;
3919
                offset += 2;
3920
   }
3921
        if (OneMore)
3922
        {
3923
                --pdata;
3924
                -- offset;
3925
        temp = utilEERead(ioport,(u16bits)(offset / 2));
3926
                *pdata = (u08bits) (temp);
3927
        }
3928
 
3929
} /* end proc ReadNVRam */
3930
 
3931
 
3932
/*---------------------------------------------------------------------
3933
 *
3934
 * Function: WriteNVRam
3935
 *
3936
 *---------------------------------------------------------------------*/
3937
void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
3938
{
3939
        u08bits *pdata;
3940
        u16bits i,numwrds,numbytes,offset, eeprom_end;
3941
        u08bits OneMore = FALSE;
3942
        union {
3943
                u08bits  tempb[2];
3944
                u16bits  tempw;
3945
        } temp2;
3946
 
3947
#if defined(DOS)
3948
        u16bits ioport;
3949
#else
3950
        u32bits ioport;
3951
#endif
3952
 
3953
        numbytes = (u16bits) p_ucb->UCB_datalen;
3954
        ioport  = pCurrCard->ioPort;
3955
   pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
3956
        offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
3957
 
3958
   if (RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD)
3959
      eeprom_end = 512;
3960
   else
3961
      eeprom_end = 768;
3962
 
3963
        if(offset > eeprom_end)
3964
                return;
3965
 
3966
        if((offset + numbytes) > eeprom_end)
3967
                numbytes = eeprom_end - offset;
3968
 
3969
    utilEEWriteOnOff(ioport,1);   /* Enable write access to the EEPROM */
3970
 
3971
 
3972
 
3973
   if (offset & 0x1)
3974
        {
3975
            temp2.tempw = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
3976
                 temp2.tempb[1] = *pdata;
3977
            utilEEWrite(ioport, temp2.tempw, (u16bits)((offset -1) / 2));
3978
                 *pdata = *(pdata + 1);
3979
                 ++offset;
3980
         ++pdata;
3981
                 --numbytes;
3982
        }
3983
 
3984
        numwrds = numbytes / 2;
3985
        if (numbytes & 1)
3986
                OneMore = TRUE;
3987
 
3988
        for (i = 0; i < numwrds; i++)
3989
        {
3990
        utilEEWrite(ioport, *((pu16bits)pdata),(u16bits)(offset / 2));
3991
                pdata += 2;
3992
                offset += 2;
3993
   }
3994
        if (OneMore)
3995
        {
3996
 
3997
        temp2.tempw = utilEERead(ioport,(u16bits)(offset / 2));
3998
                temp2.tempb[0] = *pdata;
3999
        utilEEWrite(ioport, temp2.tempw, (u16bits)(offset / 2));
4000
        }
4001
   utilEEWriteOnOff(ioport,0);   /* Turn off write access */
4002
   UpdateCheckSum((u32bits)ioport);
4003
 
4004
} /* end proc WriteNVRam */
4005
 
4006
 
4007
 
4008
/*---------------------------------------------------------------------
4009
 *
4010
 * Function: UpdateCheckSum
4011
 *
4012
 * Description: Update Check Sum in EEPROM
4013
 *
4014
 *---------------------------------------------------------------------*/
4015
 
4016
 
4017
void UpdateCheckSum(u32bits baseport)
4018
{
4019
        USHORT i,sum_data, eeprom_end;
4020
 
4021
        sum_data = 0x0000;
4022
 
4023
 
4024
   if (RD_HARPOON(baseport+hp_page_ctrl) & NARROW_SCSI_CARD)
4025
      eeprom_end = 512;
4026
   else
4027
      eeprom_end = 768;
4028
 
4029
        for (i = 1; i < eeprom_end/2; i++)
4030
        {
4031
                sum_data += utilEERead(baseport, i);
4032
        }
4033
 
4034
   utilEEWriteOnOff(baseport,1);   /* Enable write access to the EEPROM */
4035
 
4036
   utilEEWrite(baseport, sum_data, EEPROM_CHECK_SUM/2);
4037
   utilEEWriteOnOff(baseport,0);   /* Turn off write access */
4038
}
4039
 
4040
void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo)
4041
{
4042
}
4043
 
4044
 
4045
void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard)
4046
{
4047
}
4048
 
4049
void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard)
4050
{
4051
}
4052
 
4053
#endif /* NO_IOCTLS */
4054
 
4055
#endif /* (FW_TYPE==_UCB_MGR_)   */
4056
 
4057
#ifndef NO_IOCTLS
4058
#if (FW_TYPE==_UCB_MGR_)
4059
void SccbMgr_unload_card(CARD_HANDLE pCurrCard)
4060
#else
4061
#if defined(DOS)
4062
void SccbMgr_unload_card(USHORT pCurrCard)
4063
#else
4064
void SccbMgr_unload_card(ULONG pCurrCard)
4065
#endif
4066
#endif
4067
{
4068
        UCHAR i;
4069
#if defined(DOS)
4070
        USHORT portBase;
4071
        USHORT regOffset;
4072
#else
4073
        ULONG portBase;
4074
        ULONG regOffset;
4075
#endif
4076
        ULONG scamData;
4077
#if defined(OS2)
4078
        ULONG far *pScamTbl;
4079
#else
4080
        ULONG *pScamTbl;
4081
#endif
4082
        PNVRamInfo pCurrNvRam;
4083
 
4084
        pCurrNvRam = ((PSCCBcard)pCurrCard)->pNvRamInfo;
4085
 
4086
        if(pCurrNvRam){
4087
                WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
4088
                WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
4089
                WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
4090
                WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
4091
                WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
4092
 
4093
                for(i = 0; i < MAX_SCSI_TAR / 2; i++)
4094
                        WrStack(pCurrNvRam->niBaseAddr, (UCHAR)(i+5), pCurrNvRam->niSyncTbl[i]);
4095
 
4096
                portBase = pCurrNvRam->niBaseAddr;
4097
 
4098
                for(i = 0; i < MAX_SCSI_TAR; i++){
4099
                        regOffset = hp_aramBase + 64 + i*4;
4100
#if defined(OS2)
4101
                        pScamTbl = (ULONG far *) &pCurrNvRam->niScamTbl[i];
4102
#else
4103
                        pScamTbl = (ULONG *) &pCurrNvRam->niScamTbl[i];
4104
#endif
4105
                        scamData = *pScamTbl;
4106
                        WR_HARP32(portBase, regOffset, scamData);
4107
                }
4108
 
4109
        }else{
4110
                WrStack(((PSCCBcard)pCurrCard)->ioPort, 0, 0);
4111
        }
4112
}
4113
#endif /* NO_IOCTLS */
4114
 
4115
 
4116
void RNVRamData(PNVRamInfo pNvRamInfo)
4117
{
4118
        UCHAR i;
4119
#if defined(DOS)
4120
        USHORT portBase;
4121
        USHORT regOffset;
4122
#else
4123
        ULONG portBase;
4124
        ULONG regOffset;
4125
#endif
4126
        ULONG scamData;
4127
#if defined (OS2)
4128
        ULONG far *pScamTbl;
4129
#else
4130
        ULONG *pScamTbl;
4131
#endif
4132
 
4133
        pNvRamInfo->niModel    = RdStack(pNvRamInfo->niBaseAddr, 0);
4134
        pNvRamInfo->niSysConf  = RdStack(pNvRamInfo->niBaseAddr, 1);
4135
        pNvRamInfo->niScsiConf = RdStack(pNvRamInfo->niBaseAddr, 2);
4136
        pNvRamInfo->niScamConf = RdStack(pNvRamInfo->niBaseAddr, 3);
4137
        pNvRamInfo->niAdapId   = RdStack(pNvRamInfo->niBaseAddr, 4);
4138
 
4139
        for(i = 0; i < MAX_SCSI_TAR / 2; i++)
4140
                pNvRamInfo->niSyncTbl[i] = RdStack(pNvRamInfo->niBaseAddr, (UCHAR)(i+5));
4141
 
4142
        portBase = pNvRamInfo->niBaseAddr;
4143
 
4144
        for(i = 0; i < MAX_SCSI_TAR; i++){
4145
                regOffset = hp_aramBase + 64 + i*4;
4146
                RD_HARP32(portBase, regOffset, scamData);
4147
#if defined(OS2)
4148
                pScamTbl = (ULONG far *) &pNvRamInfo->niScamTbl[i];
4149
#else
4150
                pScamTbl = (ULONG *) &pNvRamInfo->niScamTbl[i];
4151
#endif
4152
                *pScamTbl = scamData;
4153
        }
4154
 
4155
}
4156
 
4157
#if defined(DOS)
4158
UCHAR RdStack(USHORT portBase, UCHAR index)
4159
#else
4160
UCHAR RdStack(ULONG portBase, UCHAR index)
4161
#endif
4162
{
4163
        WR_HARPOON(portBase + hp_stack_addr, index);
4164
        return(RD_HARPOON(portBase + hp_stack_data));
4165
}
4166
 
4167
#if defined(DOS)
4168
void WrStack(USHORT portBase, UCHAR index, UCHAR data)
4169
#else
4170
void WrStack(ULONG portBase, UCHAR index, UCHAR data)
4171
#endif
4172
{
4173
        WR_HARPOON(portBase + hp_stack_addr, index);
4174
        WR_HARPOON(portBase + hp_stack_data, data);
4175
}
4176
 
4177
 
4178
#if (FW_TYPE==_UCB_MGR_)
4179
u08bits ChkIfChipInitialized(BASE_PORT ioPort)
4180
#else
4181
#if defined(DOS)
4182
UCHAR ChkIfChipInitialized(USHORT ioPort)
4183
#else
4184
UCHAR ChkIfChipInitialized(ULONG ioPort)
4185
#endif
4186
#endif
4187
{
4188
        if((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != RdStack(ioPort, 4))
4189
                return(FALSE);
4190
        if((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
4191
                                                                != CLKCTRL_DEFAULT)
4192
                return(FALSE);
4193
        if((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
4194
                (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
4195
                return(TRUE);
4196
        return(FALSE);
4197
 
4198
}
4199
/*---------------------------------------------------------------------
4200
 *
4201
 * Function: SccbMgr_start_sccb
4202
 *
4203
 * Description: Start a command pointed to by p_Sccb. When the
4204
 *              command is completed it will be returned via the
4205
 *              callback function.
4206
 *
4207
 *---------------------------------------------------------------------*/
4208
#if (FW_TYPE==_UCB_MGR_)
4209
void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
4210
#else
4211
#if defined(DOS)
4212
void SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_Sccb)
4213
#else
4214
void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
4215
#endif
4216
#endif
4217
{
4218
#if defined(DOS)
4219
   USHORT ioport;
4220
#else
4221
   ULONG ioport;
4222
#endif
4223
   UCHAR thisCard, lun;
4224
        PSCCB pSaveSccb;
4225
   CALL_BK_FN callback;
4226
 
4227
#if (FW_TYPE==_UCB_MGR_)
4228
   PSCCB p_Sccb;
4229
#endif
4230
 
4231
   mOS_Lock((PSCCBcard)pCurrCard);
4232
   thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
4233
   ioport = ((PSCCBcard) pCurrCard)->ioPort;
4234
 
4235
#if (FW_TYPE==_UCB_MGR_)
4236
   p_Sccb = (PSCCB)p_ucb->UCB_MgrPrivatePtr;
4237
#endif
4238
 
4239
        if((p_Sccb->TargID > MAX_SCSI_TAR) || (p_Sccb->Lun > MAX_LUN))
4240
        {
4241
 
4242
#if (FW_TYPE==_UCB_MGR_)
4243
                p_ucb->UCB_hbastat = SCCB_COMPLETE;
4244
                p_ucb->UCB_status=SCCB_ERROR;
4245
                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4246
                if (callback)
4247
                        callback(p_ucb);
4248
#endif
4249
 
4250
#if (FW_TYPE==_SCCB_MGR_)
4251
                p_Sccb->HostStatus = SCCB_COMPLETE;
4252
                p_Sccb->SccbStatus = SCCB_ERROR;
4253
                callback = (CALL_BK_FN)p_Sccb->SccbCallback;
4254
                if (callback)
4255
                        callback(p_Sccb);
4256
#endif
4257
 
4258
                mOS_UnLock((PSCCBcard)pCurrCard);
4259
                return;
4260
        }
4261
 
4262
#if (FW_TYPE==_SCCB_MGR_)
4263
   sinits(p_Sccb,thisCard);
4264
#endif
4265
 
4266
 
4267
#if (FW_TYPE==_UCB_MGR_)
4268
#ifndef NO_IOCTLS
4269
 
4270
   if (p_ucb->UCB_opcode & OPC_IOCTL)
4271
        {
4272
 
4273
                switch (p_ucb->UCB_IOCTLCommand)
4274
                {
4275
                        case READ_NVRAM:
4276
                                ReadNVRam((PSCCBcard)pCurrCard,p_ucb);
4277
                                p_ucb->UCB_status=UCB_SUCCESS;
4278
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4279
                                if (callback)
4280
                                        callback(p_ucb);
4281
                                mOS_UnLock((PSCCBcard)pCurrCard);
4282
                                return;
4283
 
4284
                        case WRITE_NVRAM:
4285
                                WriteNVRam((PSCCBcard)pCurrCard,p_ucb);
4286
                                p_ucb->UCB_status=UCB_SUCCESS;
4287
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4288
                                if (callback)
4289
                                        callback(p_ucb);
4290
                                mOS_UnLock((PSCCBcard)pCurrCard);
4291
                                return;
4292
 
4293
                        case SEND_SCSI_PASSTHRU:
4294
#if (FW_TYPE != _SCCB_MGR_)
4295
                                if( p_ucb->UCB_targid >=
4296
                                    ((PSCCBcard)pCurrCard)->cardInfo->ai_MaxTarg )
4297
                                {
4298
                                        p_ucb->UCB_status = UCB_ERROR;
4299
                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4300
                                        callback = (CALL_BK_FN)p_ucb->UCB_callback;
4301
                                        if (callback)
4302
                                                callback(p_ucb);
4303
                                        mOS_UnLock((PSCCBcard)pCurrCard);
4304
                                        return;
4305
                                }
4306
#endif
4307
                                break;
4308
 
4309
                        case HARD_RESET:
4310
                                p_ucb->UCB_status = UCB_INVALID;
4311
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4312
                                if (callback)
4313
                                        callback(p_ucb);
4314
                                mOS_UnLock((PSCCBcard)pCurrCard);
4315
                                return;
4316
                        case GET_DEVICE_SYNCRATE:
4317
                                if( !GetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
4318
                                {
4319
                                        p_ucb->UCB_status = UCB_SUCCESS;
4320
                                }
4321
                                else
4322
                                {
4323
                                        p_ucb->UCB_status = UCB_ERROR;
4324
                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4325
                                }
4326
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4327
                                if (callback)
4328
                                        callback(p_ucb);
4329
                                mOS_UnLock((PSCCBcard)pCurrCard);
4330
                                return;
4331
                        case SET_DEVICE_SYNCRATE:
4332
                                if( !SetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
4333
                                {
4334
                                        p_ucb->UCB_status = UCB_SUCCESS;
4335
                                }
4336
                                else
4337
                                {
4338
                                        p_ucb->UCB_status = UCB_ERROR;
4339
                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4340
                                }
4341
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4342
                                if (callback)
4343
                                        callback(p_ucb);
4344
                                mOS_UnLock((PSCCBcard)pCurrCard);
4345
                                return;
4346
                        case GET_WIDE_MODE:
4347
                                if( !GetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
4348
                                {
4349
                                        p_ucb->UCB_status = UCB_SUCCESS;
4350
                                }
4351
                                else
4352
                                {
4353
                                        p_ucb->UCB_status = UCB_ERROR;
4354
                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4355
                                }
4356
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4357
                                if (callback)
4358
                                        callback(p_ucb);
4359
                                mOS_UnLock((PSCCBcard)pCurrCard);
4360
                                return;
4361
                        case SET_WIDE_MODE:
4362
                                if( !SetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
4363
                                {
4364
                                        p_ucb->UCB_status = UCB_SUCCESS;
4365
                                }
4366
                                else
4367
                                {
4368
                                        p_ucb->UCB_status = UCB_ERROR;
4369
                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4370
                                }
4371
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4372
                                if (callback)
4373
                                        callback(p_ucb);
4374
                                mOS_UnLock((PSCCBcard)pCurrCard);
4375
                                return;
4376
                        default:
4377
                                p_ucb->UCB_status=UCB_INVALID;
4378
                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
4379
                                if (callback)
4380
                                        callback(p_ucb);
4381
                                mOS_UnLock((PSCCBcard)pCurrCard);
4382
                                return;
4383
                }
4384
        }
4385
#endif /* NO_IOCTLS */
4386
#endif /* (FW_TYPE==_UCB_MGR_) */
4387
 
4388
 
4389
   if (!((PSCCBcard) pCurrCard)->cmdCounter)
4390
      {
4391
      WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
4392
         | SCCB_MGR_ACTIVE));
4393
 
4394
      if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
4395
         {
4396
                 WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
4397
                 WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
4398
         }
4399
      }
4400
 
4401
   ((PSCCBcard)pCurrCard)->cmdCounter++;
4402
 
4403
   if (RD_HARPOON(ioport+hp_semaphore) & BIOS_IN_USE) {
4404
 
4405
      WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
4406
         | TICKLE_ME));
4407
                if(p_Sccb->OperationCode == RESET_COMMAND)
4408
                        {
4409
                                pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
4410
                                ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4411
                                queueSelectFail(&BL_Card[thisCard], thisCard);
4412
                                ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
4413
                        }
4414
                else
4415
                        {
4416
              queueAddSccb(p_Sccb,thisCard);
4417
                        }
4418
      }
4419
 
4420
   else if ((RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)) {
4421
 
4422
                        if(p_Sccb->OperationCode == RESET_COMMAND)
4423
                                {
4424
                                        pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
4425
                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4426
                                        queueSelectFail(&BL_Card[thisCard], thisCard);
4427
                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
4428
                                }
4429
                        else
4430
                                {
4431
                      queueAddSccb(p_Sccb,thisCard);
4432
                                }
4433
      }
4434
 
4435
   else {
4436
 
4437
      MDISABLE_INT(ioport);
4438
 
4439
                if((((PSCCBcard) pCurrCard)->globalFlags & F_CONLUN_IO) &&
4440
                        ((sccbMgrTbl[thisCard][p_Sccb->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
4441
                        lun = p_Sccb->Lun;
4442
                else
4443
                        lun = 0;
4444
      if ((((PSCCBcard) pCurrCard)->currentSCCB == NULL) &&
4445
         (sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) &&
4446
         (sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
4447
         == FALSE)) {
4448
 
4449
            ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4450
                           mOS_UnLock((PSCCBcard)pCurrCard);
4451
#if defined(DOS)
4452
            ssel((USHORT)p_Sccb->SccbIOPort,thisCard);
4453
#else
4454
            ssel(p_Sccb->SccbIOPort,thisCard);
4455
#endif
4456
                           mOS_Lock((PSCCBcard)pCurrCard);
4457
         }
4458
 
4459
      else {
4460
 
4461
                        if(p_Sccb->OperationCode == RESET_COMMAND)
4462
                                {
4463
                                        pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
4464
                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4465
                                        queueSelectFail(&BL_Card[thisCard], thisCard);
4466
                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
4467
                                }
4468
                        else
4469
                                {
4470
                        queueAddSccb(p_Sccb,thisCard);
4471
                                }
4472
         }
4473
 
4474
 
4475
      MENABLE_INT(ioport);
4476
      }
4477
 
4478
   mOS_UnLock((PSCCBcard)pCurrCard);
4479
}
4480
 
4481
 
4482
/*---------------------------------------------------------------------
4483
 *
4484
 * Function: SccbMgr_abort_sccb
4485
 *
4486
 * Description: Abort the command pointed to by p_Sccb.  When the
4487
 *              command is completed it will be returned via the
4488
 *              callback function.
4489
 *
4490
 *---------------------------------------------------------------------*/
4491
#if (FW_TYPE==_UCB_MGR_)
4492
s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
4493
#else
4494
#if defined(DOS)
4495
int SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_Sccb)
4496
#else
4497
int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
4498
#endif
4499
#endif
4500
 
4501
{
4502
#if defined(DOS)
4503
        USHORT ioport;
4504
#else
4505
        ULONG ioport;
4506
#endif
4507
 
4508
        UCHAR thisCard;
4509
        CALL_BK_FN callback;
4510
        UCHAR TID;
4511
        PSCCB pSaveSCCB;
4512
        PSCCBMgr_tar_info currTar_Info;
4513
 
4514
 
4515
#if (FW_TYPE==_UCB_MGR_)
4516
        PSCCB    p_Sccb;
4517
        p_Sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
4518
#endif
4519
 
4520
        ioport = ((PSCCBcard) pCurrCard)->ioPort;
4521
 
4522
        thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
4523
 
4524
        mOS_Lock((PSCCBcard)pCurrCard);
4525
 
4526
        if (RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)
4527
        {
4528
                mOS_UnLock((PSCCBcard)pCurrCard);
4529
        }
4530
 
4531
        else
4532
        {
4533
 
4534
                if (queueFindSccb(p_Sccb,thisCard))
4535
                {
4536
 
4537
                        mOS_UnLock((PSCCBcard)pCurrCard);
4538
 
4539
                        ((PSCCBcard)pCurrCard)->cmdCounter--;
4540
 
4541
                        if (!((PSCCBcard)pCurrCard)->cmdCounter)
4542
                                WR_HARPOON(ioport+hp_semaphore,(RD_HARPOON(ioport+hp_semaphore)
4543
                                        & (UCHAR)(~(SCCB_MGR_ACTIVE | TICKLE_ME)) ));
4544
 
4545
#if (FW_TYPE==_SCCB_MGR_)
4546
                        p_Sccb->SccbStatus = SCCB_ABORT;
4547
                        callback = p_Sccb->SccbCallback;
4548
                        callback(p_Sccb);
4549
#else
4550
                        p_ucb->UCB_status=SCCB_ABORT;
4551
                        callback = (CALL_BK_FN)p_ucb->UCB_callback;
4552
                        callback(p_ucb);
4553
#endif
4554
 
4555
                        return(0);
4556
                }
4557
 
4558
                else
4559
                {
4560
                        mOS_UnLock((PSCCBcard)pCurrCard);
4561
 
4562
                        if (((PSCCBcard)pCurrCard)->currentSCCB == p_Sccb)
4563
                        {
4564
                                p_Sccb->SccbStatus = SCCB_ABORT;
4565
                                return(0);
4566
 
4567
                        }
4568
 
4569
                        else
4570
                        {
4571
 
4572
                                TID = p_Sccb->TargID;
4573
 
4574
 
4575
                                if(p_Sccb->Sccb_tag)
4576
                                {
4577
                                        MDISABLE_INT(ioport);
4578
                                        if (((PSCCBcard) pCurrCard)->discQ_Tbl[p_Sccb->Sccb_tag]==p_Sccb)
4579
                                        {
4580
                                                p_Sccb->SccbStatus = SCCB_ABORT;
4581
                                                p_Sccb->Sccb_scsistat = ABORT_ST;
4582
#if (FW_TYPE==_UCB_MGR_)
4583
                                                p_ucb->UCB_status=SCCB_ABORT;
4584
#endif
4585
                                                p_Sccb->Sccb_scsimsg = SMABORT_TAG;
4586
 
4587
                                                if(((PSCCBcard) pCurrCard)->currentSCCB == NULL)
4588
                                                {
4589
                                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4590
                                                        ssel(ioport, thisCard);
4591
                                                }
4592
                                                else
4593
                                                {
4594
                                                        pSaveSCCB = ((PSCCBcard) pCurrCard)->currentSCCB;
4595
                                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4596
                                                        queueSelectFail((PSCCBcard) pCurrCard, thisCard);
4597
                                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSCCB;
4598
                                                }
4599
                                        }
4600
                                        MENABLE_INT(ioport);
4601
                                        return(0);
4602
                                }
4603
                                else
4604
                                {
4605
                                        currTar_Info = &sccbMgrTbl[thisCard][p_Sccb->TargID];
4606
 
4607
                                        if(BL_Card[thisCard].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_Sccb->Lun]]
4608
                                                        == p_Sccb)
4609
                                        {
4610
                                                p_Sccb->SccbStatus = SCCB_ABORT;
4611
                                                return(0);
4612
                                        }
4613
                                }
4614
                        }
4615
                }
4616
        }
4617
        return(-1);
4618
}
4619
 
4620
 
4621
/*---------------------------------------------------------------------
4622
 *
4623
 * Function: SccbMgr_my_int
4624
 *
4625
 * Description: Do a quick check to determine if there is a pending
4626
 *              interrupt for this card and disable the IRQ Pin if so.
4627
 *
4628
 *---------------------------------------------------------------------*/
4629
#if (FW_TYPE==_UCB_MGR_)
4630
u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard)
4631
#else
4632
#if defined(DOS)
4633
UCHAR SccbMgr_my_int(USHORT pCurrCard)
4634
#else
4635
UCHAR SccbMgr_my_int(ULONG pCurrCard)
4636
#endif
4637
#endif
4638
{
4639
#if defined(DOS)
4640
   USHORT ioport;
4641
#else
4642
   ULONG ioport;
4643
#endif
4644
 
4645
   ioport = ((PSCCBcard)pCurrCard)->ioPort;
4646
 
4647
   if (RD_HARPOON(ioport+hp_int_status) & INT_ASSERTED)
4648
   {
4649
 
4650
#if defined(DOS)
4651
      MDISABLE_INT(ioport);
4652
#endif
4653
 
4654
      return(TRUE);
4655
   }
4656
 
4657
   else
4658
 
4659
      return(FALSE);
4660
}
4661
 
4662
 
4663
 
4664
/*---------------------------------------------------------------------
4665
 *
4666
 * Function: SccbMgr_isr
4667
 *
4668
 * Description: This is our entry point when an interrupt is generated
4669
 *              by the card and the upper level driver passes it on to
4670
 *              us.
4671
 *
4672
 *---------------------------------------------------------------------*/
4673
#if (FW_TYPE==_UCB_MGR_)
4674
s32bits SccbMgr_isr(CARD_HANDLE pCurrCard)
4675
#else
4676
#if defined(DOS)
4677
int SccbMgr_isr(USHORT pCurrCard)
4678
#else
4679
int SccbMgr_isr(ULONG pCurrCard)
4680
#endif
4681
#endif
4682
{
4683
   PSCCB currSCCB;
4684
   UCHAR thisCard,result,bm_status, bm_int_st;
4685
   USHORT hp_int;
4686
   UCHAR i, target;
4687
#if defined(DOS)
4688
   USHORT ioport;
4689
#else
4690
   ULONG ioport;
4691
#endif
4692
 
4693
   mOS_Lock((PSCCBcard)pCurrCard);
4694
 
4695
   thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
4696
   ioport = ((PSCCBcard)pCurrCard)->ioPort;
4697
 
4698
   MDISABLE_INT(ioport);
4699
 
4700
#if defined(BUGBUG)
4701
   WR_HARPOON(ioport+hp_user_defined_D, RD_HARPOON(ioport+hp_int_status));
4702
#endif
4703
 
4704
   if ((bm_int_st=RD_HARPOON(ioport+hp_int_status)) & EXT_STATUS_ON)
4705
                bm_status = RD_HARPOON(ioport+hp_ext_status) & (UCHAR)BAD_EXT_STATUS;
4706
   else
4707
      bm_status = 0;
4708
 
4709
   WR_HARPOON(ioport+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
4710
 
4711
   mOS_UnLock((PSCCBcard)pCurrCard);
4712
 
4713
   while ((hp_int = RDW_HARPOON((ioport+hp_intstat)) & default_intena) |
4714
          bm_status)
4715
     {
4716
 
4717
       currSCCB = ((PSCCBcard)pCurrCard)->currentSCCB;
4718
 
4719
#if defined(BUGBUG)
4720
   Debug_Load(thisCard,(UCHAR) 0XFF);
4721
   Debug_Load(thisCard,bm_int_st);
4722
 
4723
   Debug_Load(thisCard,hp_int_0);
4724
   Debug_Load(thisCard,hp_int_1);
4725
#endif
4726
 
4727
 
4728
      if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
4729
         result = SccbMgr_bad_isr(ioport,thisCard,((PSCCBcard)pCurrCard),hp_int);
4730
         WRW_HARPOON((ioport+hp_intstat), (FIFO | TIMEOUT | RESET | SCAM_SEL));
4731
         bm_status = 0;
4732
 
4733
         if (result) {
4734
 
4735
                           mOS_Lock((PSCCBcard)pCurrCard);
4736
            MENABLE_INT(ioport);
4737
                           mOS_UnLock((PSCCBcard)pCurrCard);
4738
            return(result);
4739
            }
4740
         }
4741
 
4742
 
4743
      else if (hp_int & ICMD_COMP) {
4744
 
4745
         if ( !(hp_int & BUS_FREE) ) {
4746
            /* Wait for the BusFree before starting a new command.  We
4747
               must also check for being reselected since the BusFree
4748
               may not show up if another device reselects us in 1.5us or
4749
               less.  SRR Wednesday, 3/8/1995.
4750
                 */
4751
           while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL))) ;
4752
         }
4753
 
4754
         if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
4755
 
4756
            phaseChkFifo(ioport, thisCard);
4757
 
4758
/*         WRW_HARPOON((ioport+hp_intstat),
4759
            (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
4760
         */
4761
 
4762
                 WRW_HARPOON((ioport+hp_intstat), CLR_ALL_INT_1);
4763
 
4764
         autoCmdCmplt(ioport,thisCard);
4765
 
4766
         }
4767
 
4768
 
4769
      else if (hp_int & ITAR_DISC)
4770
         {
4771
 
4772
         if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
4773
 
4774
            phaseChkFifo(ioport, thisCard);
4775
 
4776
            }
4777
 
4778
         if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR) {
4779
 
4780
            WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
4781
            currSCCB->Sccb_XferState |= F_NO_DATA_YET;
4782
 
4783
            currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
4784
            }
4785
 
4786
         currSCCB->Sccb_scsistat = DISCONNECT_ST;
4787
         queueDisconnect(currSCCB,thisCard);
4788
 
4789
            /* Wait for the BusFree before starting a new command.  We
4790
               must also check for being reselected since the BusFree
4791
               may not show up if another device reselects us in 1.5us or
4792
               less.  SRR Wednesday, 3/8/1995.
4793
             */
4794
           while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)) &&
4795
                  !((RDW_HARPOON((ioport+hp_intstat)) & PHASE) &&
4796
                    RD_HARPOON((ioport+hp_scsisig)) ==
4797
                    (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG | SCSI_IOBIT))) ;
4798
 
4799
           /*
4800
             The additional loop exit condition above detects a timing problem
4801
             with the revision D/E harpoon chips.  The caller should reset the
4802
             host adapter to recover when 0xFE is returned.
4803
           */
4804
           if (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)))
4805
             {
4806
               mOS_Lock((PSCCBcard)pCurrCard);
4807
               MENABLE_INT(ioport);
4808
               mOS_UnLock((PSCCBcard)pCurrCard);
4809
               return 0xFE;
4810
             }
4811
 
4812
         WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
4813
 
4814
 
4815
         ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
4816
 
4817
        }
4818
 
4819
 
4820
      else if (hp_int & RSEL) {
4821
 
4822
         WRW_HARPOON((ioport+hp_intstat), (PROG_HLT | RSEL | PHASE | BUS_FREE));
4823
 
4824
         if (RDW_HARPOON((ioport+hp_intstat)) & ITAR_DISC)
4825
                      {
4826
            if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
4827
                              {
4828
               phaseChkFifo(ioport, thisCard);
4829
               }
4830
 
4831
            if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR)
4832
                              {
4833
               WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
4834
               currSCCB->Sccb_XferState |= F_NO_DATA_YET;
4835
               currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
4836
               }
4837
 
4838
            WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
4839
            currSCCB->Sccb_scsistat = DISCONNECT_ST;
4840
            queueDisconnect(currSCCB,thisCard);
4841
            }
4842
 
4843
         sres(ioport,thisCard,((PSCCBcard)pCurrCard));
4844
         phaseDecode(ioport,thisCard);
4845
 
4846
         }
4847
 
4848
 
4849
      else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE)))
4850
         {
4851
 
4852
            WRW_HARPOON((ioport+hp_intstat), (IDO_STRT | XFER_CNT_0));
4853
            phaseDecode(ioport,thisCard);
4854
 
4855
         }
4856
 
4857
 
4858
      else if ( (hp_int & IUNKWN) || (hp_int & PROG_HLT) )
4859
                   {
4860
                   WRW_HARPOON((ioport+hp_intstat), (PHASE | IUNKWN | PROG_HLT));
4861
                   if ((RD_HARPOON(ioport+hp_prgmcnt_0) & (UCHAR)0x3f)< (UCHAR)SELCHK)
4862
                        {
4863
                        phaseDecode(ioport,thisCard);
4864
                        }
4865
                   else
4866
                        {
4867
   /* Harpoon problem some SCSI target device respond to selection
4868
   with short BUSY pulse (<400ns) this will make the Harpoon is not able
4869
   to latch the correct Target ID into reg. x53.
4870
   The work around require to correct this reg. But when write to this
4871
   reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
4872
   need to read this reg first then restore it later. After update to 0x53 */
4873
 
4874
                        i = (UCHAR)(RD_HARPOON(ioport+hp_fifowrite));
4875
                        target = (UCHAR)(RD_HARPOON(ioport+hp_gp_reg_3));
4876
                        WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) ID_UNLOCK);
4877
                        WR_HARPOON(ioport+hp_select_id, (UCHAR)(target | target<<4));
4878
                        WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) 0x00);
4879
                        WR_HARPOON(ioport+hp_fifowrite, i);
4880
                        WR_HARPOON(ioport+hp_autostart_3, (AUTO_IMMED+TAG_STRT));
4881
                        }
4882
                   }
4883
 
4884
      else if (hp_int & XFER_CNT_0) {
4885
 
4886
         WRW_HARPOON((ioport+hp_intstat), XFER_CNT_0);
4887
 
4888
         schkdd(ioport,thisCard);
4889
 
4890
         }
4891
 
4892
 
4893
      else if (hp_int & BUS_FREE) {
4894
 
4895
         WRW_HARPOON((ioport+hp_intstat), BUS_FREE);
4896
 
4897
                if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
4898
 
4899
                hostDataXferAbort(ioport,thisCard,currSCCB);
4900
                                }
4901
 
4902
         phaseBusFree(ioport,thisCard);
4903
                        }
4904
 
4905
 
4906
      else if (hp_int & ITICKLE) {
4907
 
4908
         WRW_HARPOON((ioport+hp_intstat), ITICKLE);
4909
         ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
4910
         }
4911
 
4912
 
4913
 
4914
      if (((PSCCBcard)pCurrCard)->globalFlags & F_NEW_SCCB_CMD) {
4915
 
4916
 
4917
         ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
4918
 
4919
 
4920
         if (((PSCCBcard)pCurrCard)->currentSCCB == NULL) {
4921
 
4922
            queueSearchSelect(((PSCCBcard)pCurrCard),thisCard);
4923
            }
4924
 
4925
         if (((PSCCBcard)pCurrCard)->currentSCCB != NULL) {
4926
            ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
4927
            ssel(ioport,thisCard);
4928
            }
4929
 
4930
         break;
4931
 
4932
         }
4933
 
4934
      }  /*end while */
4935
 
4936
   mOS_Lock((PSCCBcard)pCurrCard);
4937
   MENABLE_INT(ioport);
4938
   mOS_UnLock((PSCCBcard)pCurrCard);
4939
 
4940
   return(0);
4941
}
4942
 
4943
/*---------------------------------------------------------------------
4944
 *
4945
 * Function: Sccb_bad_isr
4946
 *
4947
 * Description: Some type of interrupt has occurred which is slightly
4948
 *              out of the ordinary.  We will now decode it fully, in
4949
 *              this routine.  This is broken up in an attempt to save
4950
 *              processing time.
4951
 *
4952
 *---------------------------------------------------------------------*/
4953
#if defined(DOS)
4954
UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
4955
#else
4956
UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
4957
#endif
4958
{
4959
#if defined(HARP_REVX)
4960
   ULONG timer;
4961
#endif
4962
UCHAR temp, ScamFlg;
4963
PSCCBMgr_tar_info currTar_Info;
4964
PNVRamInfo pCurrNvRam;
4965
 
4966
 
4967
   if (RD_HARPOON(p_port+hp_ext_status) &
4968
         (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN) )
4969
      {
4970
 
4971
      if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
4972
         {
4973
 
4974
         hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
4975
         }
4976
 
4977
      if (RD_HARPOON(p_port+hp_pci_stat_cfg) & REC_MASTER_ABORT)
4978
 
4979
         {
4980
         WR_HARPOON(p_port+hp_pci_stat_cfg,
4981
            (RD_HARPOON(p_port+hp_pci_stat_cfg) & ~REC_MASTER_ABORT));
4982
 
4983
         WR_HARPOON(p_port+hp_host_blk_cnt, 0x00);
4984
 
4985
         }
4986
 
4987
      if (pCurrCard->currentSCCB != NULL)
4988
         {
4989
 
4990
         if (!pCurrCard->currentSCCB->HostStatus)
4991
            pCurrCard->currentSCCB->HostStatus = SCCB_BM_ERR;
4992
 
4993
         sxfrp(p_port,p_card);
4994
 
4995
             temp = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) &
4996
                                                        (EXT_ARB_ACK | SCSI_TERM_ENA_H));
4997
        WR_HARPOON(p_port+hp_ee_ctrl, ((UCHAR)temp | SEE_MS | SEE_CS));
4998
         WR_HARPOON(p_port+hp_ee_ctrl, temp);
4999
 
5000
         if (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
5001
            {
5002
            phaseDecode(p_port,p_card);
5003
            }
5004
         }
5005
      }
5006
 
5007
 
5008
   else if (p_int & RESET)
5009
         {
5010
 
5011
                                WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
5012
                                WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
5013
           if (pCurrCard->currentSCCB != NULL) {
5014
 
5015
               if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
5016
 
5017
               hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
5018
               }
5019
 
5020
 
5021
           DISABLE_AUTO(p_port);
5022
 
5023
           sresb(p_port,p_card);
5024
 
5025
           while(RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST) {}
5026
 
5027
                                pCurrNvRam = pCurrCard->pNvRamInfo;
5028
                                if(pCurrNvRam){
5029
                                        ScamFlg = pCurrNvRam->niScamConf;
5030
                                }
5031
                                else{
5032
                                   ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
5033
                                }
5034
 
5035
           XbowInit(p_port, ScamFlg);
5036
 
5037
               scini(p_card, pCurrCard->ourId, 0);
5038
 
5039
           return(0xFF);
5040
         }
5041
 
5042
 
5043
   else if (p_int & FIFO) {
5044
 
5045
      WRW_HARPOON((p_port+hp_intstat), FIFO);
5046
 
5047
#if defined(HARP_REVX)
5048
 
5049
      for (timer=0x00FFFFFFL; timer != 0x00000000L; timer--) {
5050
 
5051
         if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
5052
            break;
5053
 
5054
         if (RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)
5055
            break;
5056
         }
5057
 
5058
 
5059
      if ( (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY) &&
5060
           (RD_HARPOON(p_port+hp_fiforead) !=
5061
            RD_HARPOON(p_port+hp_fifowrite)) &&
5062
           (RD_HARPOON(p_port+hp_xfercnt_0))
5063
         )
5064
 
5065
            WR_HARPOON((p_port+hp_xferstat), 0x01);
5066
 
5067
/*      else
5068
 */
5069
/*         sxfrp(p_port,p_card);
5070
 */
5071
#else
5072
      if (pCurrCard->currentSCCB != NULL)
5073
         sxfrp(p_port,p_card);
5074
#endif
5075
      }
5076
 
5077
   else if (p_int & TIMEOUT)
5078
      {
5079
 
5080
      DISABLE_AUTO(p_port);
5081
 
5082
      WRW_HARPOON((p_port+hp_intstat),
5083
                  (PROG_HLT | TIMEOUT | SEL |BUS_FREE | PHASE | IUNKWN));
5084
 
5085
      pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
5086
 
5087
 
5088
                currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
5089
                if((pCurrCard->globalFlags & F_CONLUN_IO) &&
5090
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
5091
              currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = FALSE;
5092
                else
5093
              currTar_Info->TarLUNBusy[0] = FALSE;
5094
 
5095
 
5096
      if (currTar_Info->TarEEValue & EE_SYNC_MASK)
5097
         {
5098
               currTar_Info->TarSyncCtrl = 0;
5099
         currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
5100
         }
5101
 
5102
      if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
5103
         {
5104
         currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
5105
         }
5106
 
5107
      sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,currTar_Info);
5108
 
5109
      queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
5110
 
5111
      }
5112
 
5113
#if defined(SCAM_LEV_2)
5114
 
5115
   else if (p_int & SCAM_SEL)
5116
      {
5117
 
5118
      scarb(p_port,LEVEL2_TAR);
5119
      scsel(p_port);
5120
      scasid(p_card, p_port);
5121
 
5122
      scbusf(p_port);
5123
 
5124
      WRW_HARPOON((p_port+hp_intstat), SCAM_SEL);
5125
      }
5126
#endif
5127
 
5128
   return(0x00);
5129
}
5130
 
5131
 
5132
/*---------------------------------------------------------------------
5133
 *
5134
 * Function: SccbMgr_scsi_reset
5135
 *
5136
 * Description: A SCSI bus reset will be generated and all outstanding
5137
 *              Sccbs will be returned via the callback.
5138
 *
5139
 *---------------------------------------------------------------------*/
5140
#if (FW_TYPE==_UCB_MGR_)
5141
void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard)
5142
#else
5143
#if defined(DOS)
5144
void SccbMgr_scsi_reset(USHORT pCurrCard)
5145
#else
5146
void SccbMgr_scsi_reset(ULONG pCurrCard)
5147
#endif
5148
#endif
5149
{
5150
   UCHAR thisCard;
5151
 
5152
   thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
5153
 
5154
   mOS_Lock((PSCCBcard)pCurrCard);
5155
 
5156
   if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
5157
      {
5158
      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_clkctrl_0, CLKCTRL_DEFAULT);
5159
      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sys_ctrl, 0x00);
5160
      }
5161
 
5162
   sresb(((PSCCBcard)pCurrCard)->ioPort,thisCard);
5163
 
5164
   if (RD_HARPOON(((PSCCBcard)pCurrCard)->ioPort+hp_ext_status) & BM_CMD_BUSY)
5165
      {
5166
      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl,
5167
         (RD_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl)
5168
         & ~SCATTER_EN));
5169
 
5170
      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sg_addr,0x00);
5171
 
5172
      ((PSCCBcard) pCurrCard)->globalFlags &= ~F_HOST_XFER_ACT;
5173
      busMstrTimeOut(((PSCCBcard) pCurrCard)->ioPort);
5174
 
5175
      WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_int_mask,
5176
         (INT_CMD_COMPL | SCSI_INTERRUPT));
5177
      }
5178
 
5179
/*
5180
      if (utilEERead(((PSCCBcard)pCurrCard)->ioPort, (SCAM_CONFIG/2))
5181
            & SCAM_ENABLED)
5182
*/
5183
         scini(thisCard, ((PSCCBcard)pCurrCard)->ourId, 0);
5184
 
5185
#if (FW_TYPE==_UCB_MGR_)
5186
   ((PSCCBcard)pCurrCard)->cardInfo->ai_AEN_routine(0x01,pCurrCard,0,0,0,0);
5187
#endif
5188
 
5189
   mOS_UnLock((PSCCBcard)pCurrCard);
5190
}
5191
 
5192
 
5193
/*---------------------------------------------------------------------
5194
 *
5195
 * Function: SccbMgr_timer_expired
5196
 *
5197
 * Description: This function allow me to kill my own job that has not
5198
 *              yet completed, and has cause a timeout to occur.  This
5199
 *              timeout has caused the upper level driver to call this
5200
 *              function.
5201
 *
5202
 *---------------------------------------------------------------------*/
5203
 
5204
#if (FW_TYPE==_UCB_MGR_)
5205
void SccbMgr_timer_expired(CARD_HANDLE pCurrCard)
5206
#else
5207
#if defined(DOS)
5208
void SccbMgr_timer_expired(USHORT pCurrCard)
5209
#else
5210
void SccbMgr_timer_expired(ULONG pCurrCard)
5211
#endif
5212
#endif
5213
{
5214
}
5215
 
5216
#if defined(DOS)
5217
/*---------------------------------------------------------------------
5218
 *
5219
 * Function: SccbMgr_status
5220
 *
5221
 * Description: This function returns the number of outstanding SCCB's.
5222
 *              This is specific to the DOS enviroment, which needs this
5223
 *              to help them keep protected and real mode commands staight.
5224
 *
5225
 *---------------------------------------------------------------------*/
5226
 
5227
USHORT SccbMgr_status(USHORT pCurrCard)
5228
{
5229
   return(BL_Card[pCurrCard].cmdCounter);
5230
}
5231
#endif
5232
 
5233
/*---------------------------------------------------------------------
5234
 *
5235
 * Function: SccbMgrTableInit
5236
 *
5237
 * Description: Initialize all Sccb manager data structures.
5238
 *
5239
 *---------------------------------------------------------------------*/
5240
 
5241
void SccbMgrTableInitAll()
5242
{
5243
   UCHAR thisCard;
5244
 
5245
   for (thisCard = 0; thisCard < MAX_CARDS; thisCard++)
5246
      {
5247
      SccbMgrTableInitCard(&BL_Card[thisCard],thisCard);
5248
 
5249
      BL_Card[thisCard].ioPort      = 0x00;
5250
      BL_Card[thisCard].cardInfo    = NULL;
5251
      BL_Card[thisCard].cardIndex   = 0xFF;
5252
      BL_Card[thisCard].ourId       = 0x00;
5253
                BL_Card[thisCard].pNvRamInfo    = NULL;
5254
      }
5255
}
5256
 
5257
 
5258
/*---------------------------------------------------------------------
5259
 *
5260
 * Function: SccbMgrTableInit
5261
 *
5262
 * Description: Initialize all Sccb manager data structures.
5263
 *
5264
 *---------------------------------------------------------------------*/
5265
 
5266
void SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card)
5267
{
5268
   UCHAR scsiID, qtag;
5269
 
5270
        for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
5271
        {
5272
                BL_Card[p_card].discQ_Tbl[qtag] = NULL;
5273
        }
5274
 
5275
   for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
5276
      {
5277
      sccbMgrTbl[p_card][scsiID].TarStatus = 0;
5278
      sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
5279
      SccbMgrTableInitTarget(p_card, scsiID);
5280
      }
5281
 
5282
   pCurrCard->scanIndex = 0x00;
5283
   pCurrCard->currentSCCB = NULL;
5284
   pCurrCard->globalFlags = 0x00;
5285
   pCurrCard->cmdCounter  = 0x00;
5286
        pCurrCard->tagQ_Lst = 0x01;
5287
        pCurrCard->discQCount = 0;
5288
 
5289
 
5290
}
5291
 
5292
 
5293
/*---------------------------------------------------------------------
5294
 *
5295
 * Function: SccbMgrTableInit
5296
 *
5297
 * Description: Initialize all Sccb manager data structures.
5298
 *
5299
 *---------------------------------------------------------------------*/
5300
 
5301
void SccbMgrTableInitTarget(UCHAR p_card, UCHAR target)
5302
{
5303
 
5304
        UCHAR lun, qtag;
5305
        PSCCBMgr_tar_info currTar_Info;
5306
 
5307
        currTar_Info = &sccbMgrTbl[p_card][target];
5308
 
5309
        currTar_Info->TarSelQ_Cnt = 0;
5310
        currTar_Info->TarSyncCtrl = 0;
5311
 
5312
        currTar_Info->TarSelQ_Head = NULL;
5313
        currTar_Info->TarSelQ_Tail = NULL;
5314
        currTar_Info->TarTagQ_Cnt = 0;
5315
        currTar_Info->TarLUN_CA = FALSE;
5316
 
5317
 
5318
        for (lun = 0; lun < MAX_LUN; lun++)
5319
        {
5320
                currTar_Info->TarLUNBusy[lun] = FALSE;
5321
                currTar_Info->LunDiscQ_Idx[lun] = 0;
5322
        }
5323
 
5324
        for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
5325
        {
5326
                if(BL_Card[p_card].discQ_Tbl[qtag] != NULL)
5327
                {
5328
                        if(BL_Card[p_card].discQ_Tbl[qtag]->TargID == target)
5329
                        {
5330
                                BL_Card[p_card].discQ_Tbl[qtag] = NULL;
5331
                                BL_Card[p_card].discQCount--;
5332
                        }
5333
                }
5334
        }
5335
}
5336
 
5337
#if defined(BUGBUG)
5338
 
5339
/*****************************************************************
5340
 * Save the current byte in the debug array
5341
 *****************************************************************/
5342
 
5343
 
5344
void Debug_Load(UCHAR p_card, UCHAR p_bug_data)
5345
{
5346
   debug_int[p_card][debug_index[p_card]] = p_bug_data;
5347
   debug_index[p_card]++;
5348
 
5349
   if (debug_index[p_card] == debug_size)
5350
 
5351
      debug_index[p_card] = 0;
5352
}
5353
 
5354
#endif
5355
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
5356
/*----------------------------------------------------------------------
5357
 *
5358
 *
5359
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
5360
 *
5361
 *   This file is available under both the GNU General Public License
5362
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
5363
 *
5364
 *   $Workfile:   sccb_dat.c  $
5365
 *
5366
 *   Description:  Functions relating to handling of the SCCB interface
5367
 *                 between the device driver and the HARPOON.
5368
 *
5369
 *   $Date: 2005-12-20 10:17:45 $
5370
 *
5371
 *   $Revision: 1.1 $
5372
 *
5373
 *----------------------------------------------------------------------*/
5374
 
5375
/*#include <globals.h>*/
5376
 
5377
#if (FW_TYPE==_UCB_MGR_)
5378
        /*#include <budi.h>*/
5379
#endif
5380
 
5381
/*#include <sccbmgr.h>*/
5382
/*#include <blx30.h>*/
5383
/*#include <target.h>*/
5384
/*#include <harpoon.h>*/
5385
 
5386
/*
5387
**  IMPORTANT NOTE!!!
5388
**
5389
**  You MUST preassign all data to a valid value or zero.  This is
5390
**  required due to the MS compiler bug under OS/2 and Solaris Real-Mode
5391
**  driver environment.
5392
*/
5393
 
5394
 
5395
SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = { { { 0 } } };
5396
SCCBCARD BL_Card[MAX_CARDS] = { { 0 } };
5397
SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR] = { { { 0 } } };
5398
NVRAMINFO nvRamInfo[MAX_MB_CARDS] = { { 0 } };
5399
 
5400
 
5401
#if defined(OS2)
5402
void (far *s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
5403
UCHAR temp_id_string[ID_STRING_LENGTH] = { 0 };
5404
#elif defined(SOLARIS_REAL_MODE) || defined(__STDC__)
5405
void (*s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
5406
#else
5407
void (*s_PhaseTbl[8]) ();
5408
#endif
5409
 
5410
#if defined(DOS)
5411
UCHAR first_time = 0;
5412
#endif
5413
 
5414
UCHAR mbCards = 0;
5415
UCHAR scamHAString[] = {0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', \
5416
                                                                ' ', 'B', 'T', '-', '9', '3', '0', \
5417
                                                                0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \
5418
                                                                0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
5419
 
5420
USHORT default_intena = 0;
5421
 
5422
#if defined(BUGBUG)
5423
UCHAR    debug_int[MAX_CARDS][debug_size] = { 0 };
5424
UCHAR    debug_index[MAX_CARDS] = { 0 };
5425
UCHAR    reserved_1[3] = { 0 };
5426
#endif
5427
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
5428
/*----------------------------------------------------------------------
5429
 *
5430
 *
5431
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
5432
 *
5433
 *   This file is available under both the GNU General Public License
5434
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
5435
 *
5436
 *   $Workfile:   scsi.c  $
5437
 *
5438
 *   Description:  Functions for handling SCSI bus functions such as
5439
 *                 selection/reselection, sync negotiation, message-in
5440
 *                 decoding.
5441
 *
5442
 *   $Date: 2005-12-20 10:17:45 $
5443
 *
5444
 *   $Revision: 1.1 $
5445
 *
5446
 *----------------------------------------------------------------------*/
5447
 
5448
/*#include <globals.h>*/
5449
 
5450
#if (FW_TYPE==_UCB_MGR_)
5451
        /*#include <budi.h>*/
5452
#endif
5453
 
5454
/*#include <sccbmgr.h>*/
5455
/*#include <blx30.h>*/
5456
/*#include <target.h>*/
5457
/*#include <scsi2.h>*/
5458
/*#include <eeprom.h>*/
5459
/*#include <harpoon.h>*/
5460
 
5461
 
5462
/*
5463
extern SCCBCARD BL_Card[MAX_CARDS];
5464
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
5465
#if defined(BUGBUG)
5466
void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
5467
#endif
5468
*/
5469
 
5470
/*---------------------------------------------------------------------
5471
 *
5472
 * Function: sfetm
5473
 *
5474
 * Description: Read in a message byte from the SCSI bus, and check
5475
 *              for a parity error.
5476
 *
5477
 *---------------------------------------------------------------------*/
5478
 
5479
#if defined(DOS)
5480
UCHAR sfm(USHORT port, PSCCB pCurrSCCB)
5481
#else
5482
UCHAR sfm(ULONG port, PSCCB pCurrSCCB)
5483
#endif
5484
{
5485
        UCHAR message;
5486
        USHORT TimeOutLoop;
5487
 
5488
        TimeOutLoop = 0;
5489
        while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
5490
                        (TimeOutLoop++ < 20000) ){}
5491
 
5492
 
5493
        WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
5494
 
5495
        message = RD_HARPOON(port+hp_scsidata_0);
5496
 
5497
        WR_HARPOON(port+hp_scsisig, SCSI_ACK + S_MSGI_PH);
5498
 
5499
 
5500
        if (TimeOutLoop > 20000)
5501
                message = 0x00;   /* force message byte = 0 if Time Out on Req */
5502
 
5503
        if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
5504
                (RD_HARPOON(port+hp_addstat) & SCSI_PAR_ERR))
5505
        {
5506
                WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
5507
                WR_HARPOON(port+hp_xferstat, 0);
5508
                WR_HARPOON(port+hp_fiforead, 0);
5509
                WR_HARPOON(port+hp_fifowrite, 0);
5510
                if (pCurrSCCB != NULL)
5511
                {
5512
                        pCurrSCCB->Sccb_scsimsg = SMPARITY;
5513
                }
5514
                message = 0x00;
5515
                do
5516
                {
5517
                        ACCEPT_MSG_ATN(port);
5518
                        TimeOutLoop = 0;
5519
                        while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
5520
                                (TimeOutLoop++ < 20000) ){}
5521
                        if (TimeOutLoop > 20000)
5522
                        {
5523
                                WRW_HARPOON((port+hp_intstat), PARITY);
5524
                                return(message);
5525
                        }
5526
                        if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) != S_MSGI_PH)
5527
                        {
5528
                                WRW_HARPOON((port+hp_intstat), PARITY);
5529
                                return(message);
5530
                        }
5531
                        WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
5532
 
5533
                        RD_HARPOON(port+hp_scsidata_0);
5534
 
5535
                        WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
5536
 
5537
                }while(1);
5538
 
5539
        }
5540
        WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
5541
        WR_HARPOON(port+hp_xferstat, 0);
5542
        WR_HARPOON(port+hp_fiforead, 0);
5543
        WR_HARPOON(port+hp_fifowrite, 0);
5544
        return(message);
5545
}
5546
 
5547
 
5548
/*---------------------------------------------------------------------
5549
 *
5550
 * Function: ssel
5551
 *
5552
 * Description: Load up automation and select target device.
5553
 *
5554
 *---------------------------------------------------------------------*/
5555
 
5556
#if defined(DOS)
5557
void ssel(USHORT port, UCHAR p_card)
5558
#else
5559
void ssel(ULONG port, UCHAR p_card)
5560
#endif
5561
{
5562
 
5563
#if defined(DOS)
5564
   UCHAR auto_loaded, i, target, *theCCB;
5565
#elif defined(OS2)
5566
   UCHAR auto_loaded, i, target;
5567
   UCHAR far *theCCB;
5568
#else
5569
   UCHAR auto_loaded, i, target, *theCCB;
5570
#endif
5571
 
5572
#if defined(DOS)
5573
   USHORT cdb_reg;
5574
#else
5575
   ULONG cdb_reg;
5576
#endif
5577
   PSCCBcard CurrCard;
5578
   PSCCB currSCCB;
5579
   PSCCBMgr_tar_info currTar_Info;
5580
   UCHAR lastTag, lun;
5581
 
5582
   CurrCard = &BL_Card[p_card];
5583
   currSCCB = CurrCard->currentSCCB;
5584
   target = currSCCB->TargID;
5585
   currTar_Info = &sccbMgrTbl[p_card][target];
5586
   lastTag = CurrCard->tagQ_Lst;
5587
 
5588
   ARAM_ACCESS(port);
5589
 
5590
 
5591
        if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
5592
                currSCCB->ControlByte &= ~F_USE_CMD_Q;
5593
 
5594
        if(((CurrCard->globalFlags & F_CONLUN_IO) &&
5595
                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
5596
 
5597
           lun = currSCCB->Lun;
5598
        else
5599
                lun = 0;
5600
 
5601
 
5602
#if defined(DOS)
5603
   currTar_Info->TarLUNBusy[lun] = TRUE;
5604
 
5605
#else
5606
 
5607
   if (CurrCard->globalFlags & F_TAG_STARTED)
5608
      {
5609
      if (!(currSCCB->ControlByte & F_USE_CMD_Q))
5610
         {
5611
        if ((currTar_Info->TarLUN_CA == FALSE)
5612
            && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
5613
            == TAG_Q_TRYING))
5614
            {
5615
 
5616
                 if (currTar_Info->TarTagQ_Cnt !=0)
5617
                  {
5618
                           currTar_Info->TarLUNBusy[lun] = TRUE;
5619
                        queueSelectFail(CurrCard,p_card);
5620
                                           SGRAM_ACCESS(port);
5621
                           return;
5622
                           }
5623
 
5624
            else {
5625
                          currTar_Info->TarLUNBusy[lun] = TRUE;
5626
                          }
5627
 
5628
              }  /*End non-tagged */
5629
 
5630
              else {
5631
                 currTar_Info->TarLUNBusy[lun] = TRUE;
5632
                 }
5633
 
5634
              }  /*!Use cmd Q Tagged */
5635
 
5636
           else {
5637
             if (currTar_Info->TarLUN_CA == TRUE)
5638
               {
5639
              queueSelectFail(CurrCard,p_card);
5640
                                   SGRAM_ACCESS(port);
5641
              return;
5642
                    }
5643
 
5644
                currTar_Info->TarLUNBusy[lun] = TRUE;
5645
 
5646
             }  /*else use cmd Q tagged */
5647
 
5648
      }  /*if glob tagged started */
5649
 
5650
   else {
5651
        currTar_Info->TarLUNBusy[lun] = TRUE;
5652
        }
5653
 
5654
#endif /* DOS */
5655
 
5656
 
5657
 
5658
        if((((CurrCard->globalFlags & F_CONLUN_IO) &&
5659
                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
5660
                || (!(currSCCB->ControlByte & F_USE_CMD_Q))))
5661
        {
5662
                if(CurrCard->discQCount >= QUEUE_DEPTH)
5663
                {
5664
                        currTar_Info->TarLUNBusy[lun] = TRUE;
5665
                        queueSelectFail(CurrCard,p_card);
5666
                        SGRAM_ACCESS(port);
5667
                        return;
5668
                }
5669
                for (i = 1; i < QUEUE_DEPTH; i++)
5670
                {
5671
                        if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
5672
                        if (CurrCard->discQ_Tbl[lastTag] == NULL)
5673
                        {
5674
                                CurrCard->tagQ_Lst = lastTag;
5675
                                currTar_Info->LunDiscQ_Idx[lun] = lastTag;
5676
                                CurrCard->discQ_Tbl[lastTag] = currSCCB;
5677
                                CurrCard->discQCount++;
5678
                                break;
5679
                        }
5680
                }
5681
                if(i == QUEUE_DEPTH)
5682
                {
5683
                        currTar_Info->TarLUNBusy[lun] = TRUE;
5684
                        queueSelectFail(CurrCard,p_card);
5685
                        SGRAM_ACCESS(port);
5686
                        return;
5687
                }
5688
        }
5689
 
5690
 
5691
 
5692
   auto_loaded = FALSE;
5693
 
5694
   WR_HARPOON(port+hp_select_id, target);
5695
   WR_HARPOON(port+hp_gp_reg_3, target);  /* Use by new automation logic */
5696
 
5697
   if (currSCCB->OperationCode == RESET_COMMAND) {
5698
      WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
5699
                 (currSCCB->Sccb_idmsg & ~DISC_PRIV)));
5700
 
5701
      WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+NP);
5702
 
5703
      currSCCB->Sccb_scsimsg = SMDEV_RESET;
5704
 
5705
      WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5706
      auto_loaded = TRUE;
5707
      currSCCB->Sccb_scsistat = SELECT_BDR_ST;
5708
 
5709
      if (currTar_Info->TarEEValue & EE_SYNC_MASK)
5710
         {
5711
               currTar_Info->TarSyncCtrl = 0;
5712
              currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
5713
              }
5714
 
5715
#if defined(WIDE_SCSI)
5716
 
5717
      if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
5718
         {
5719
        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
5720
        }
5721
#endif
5722
 
5723
      sssyncv(port, target, NARROW_SCSI,currTar_Info);
5724
      SccbMgrTableInitTarget(p_card, target);
5725
 
5726
      }
5727
 
5728
                else if(currSCCB->Sccb_scsistat == ABORT_ST)
5729
                {
5730
                        WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
5731
                                                                (currSCCB->Sccb_idmsg & ~DISC_PRIV)));
5732
 
5733
      WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
5734
 
5735
                        WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+
5736
                                                                (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
5737
                                                                >> 6) | (UCHAR)0x20)));
5738
                        WRW_HARPOON((port+SYNC_MSGS+2),
5739
                                                        (MPM_OP+AMSG_OUT+currSCCB->Sccb_tag));
5740
                        WRW_HARPOON((port+SYNC_MSGS+4), (BRH_OP+ALWAYS+NP ));
5741
 
5742
                        WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5743
                        auto_loaded = TRUE;
5744
 
5745
                }
5746
 
5747
#if defined(WIDE_SCSI)
5748
 
5749
 
5750
   else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED))  {
5751
      auto_loaded = siwidn(port,p_card);
5752
      currSCCB->Sccb_scsistat = SELECT_WN_ST;
5753
      }
5754
 
5755
#endif
5756
 
5757
 
5758
   else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
5759
      == SYNC_SUPPORTED))  {
5760
      auto_loaded = sisyncn(port,p_card, FALSE);
5761
      currSCCB->Sccb_scsistat = SELECT_SN_ST;
5762
      }
5763
 
5764
 
5765
   if (!auto_loaded)
5766
      {
5767
 
5768
#if !defined(DOS)
5769
      if (currSCCB->ControlByte & F_USE_CMD_Q)
5770
         {
5771
 
5772
         CurrCard->globalFlags |= F_TAG_STARTED;
5773
 
5774
         if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
5775
            == TAG_Q_REJECT)
5776
            {
5777
            currSCCB->ControlByte &= ~F_USE_CMD_Q;
5778
 
5779
            /* Fix up the start instruction with a jump to
5780
               Non-Tag-CMD handling */
5781
            WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
5782
 
5783
            WRW_HARPOON((port+NON_TAG_ID_MSG),
5784
                             (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
5785
 
5786
                 WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5787
 
5788
                 /* Setup our STATE so we know what happend when
5789
               the wheels fall off. */
5790
            currSCCB->Sccb_scsistat = SELECT_ST;
5791
 
5792
                 currTar_Info->TarLUNBusy[lun] = TRUE;
5793
            }
5794
 
5795
         else
5796
            {
5797
            WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
5798
 
5799
            WRW_HARPOON((port+ID_MSG_STRT+2), (MPM_OP+AMSG_OUT+
5800
                        (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
5801
                        >> 6) | (UCHAR)0x20)));
5802
 
5803
                                for (i = 1; i < QUEUE_DEPTH; i++)
5804
                                {
5805
                                        if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
5806
                                        if (CurrCard->discQ_Tbl[lastTag] == NULL)
5807
                                        {
5808
                                                WRW_HARPOON((port+ID_MSG_STRT+6),
5809
                                                        (MPM_OP+AMSG_OUT+lastTag));
5810
                                                CurrCard->tagQ_Lst = lastTag;
5811
                                                currSCCB->Sccb_tag = lastTag;
5812
                                                CurrCard->discQ_Tbl[lastTag] = currSCCB;
5813
                                                CurrCard->discQCount++;
5814
                                                break;
5815
                                        }
5816
                                }
5817
 
5818
 
5819
            if ( i == QUEUE_DEPTH )
5820
               {
5821
                 currTar_Info->TarLUNBusy[lun] = TRUE;
5822
               queueSelectFail(CurrCard,p_card);
5823
                                   SGRAM_ACCESS(port);
5824
                 return;
5825
                 }
5826
 
5827
            currSCCB->Sccb_scsistat = SELECT_Q_ST;
5828
 
5829
              WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5830
            }
5831
         }
5832
 
5833
      else
5834
         {
5835
#endif   /* !DOS */
5836
 
5837
         WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
5838
 
5839
        WRW_HARPOON((port+NON_TAG_ID_MSG),
5840
            (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
5841
 
5842
         currSCCB->Sccb_scsistat = SELECT_ST;
5843
 
5844
         WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5845
#if !defined(DOS)
5846
         }
5847
#endif
5848
 
5849
 
5850
#if defined(OS2)
5851
      theCCB = (UCHAR far *)&currSCCB->Cdb[0];
5852
#else
5853
      theCCB = (UCHAR *)&currSCCB->Cdb[0];
5854
#endif
5855
 
5856
      cdb_reg = port + CMD_STRT;
5857
 
5858
      for (i=0; i < currSCCB->CdbLength; i++)
5859
         {
5860
         WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
5861
         cdb_reg +=2;
5862
         theCCB++;
5863
         }
5864
 
5865
      if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
5866
         WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+    NP));
5867
 
5868
      }  /* auto_loaded */
5869
 
5870
#if defined(WIDE_SCSI)
5871
   WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
5872
   WR_HARPOON(port+hp_xferstat, 0x00);
5873
#endif
5874
 
5875
   WRW_HARPOON((port+hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
5876
 
5877
   WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT));
5878
 
5879
 
5880
   if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED))
5881
      {
5882
      WR_HARPOON(port+hp_scsictrl_0, (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
5883
      }
5884
   else
5885
      {
5886
 
5887
/*      auto_loaded =  (RD_HARPOON(port+hp_autostart_3) & (UCHAR)0x1F);
5888
      auto_loaded |= AUTO_IMMED; */
5889
      auto_loaded = AUTO_IMMED;
5890
 
5891
      DISABLE_AUTO(port);
5892
 
5893
      WR_HARPOON(port+hp_autostart_3, auto_loaded);
5894
      }
5895
 
5896
   SGRAM_ACCESS(port);
5897
}
5898
 
5899
 
5900
/*---------------------------------------------------------------------
5901
 *
5902
 * Function: sres
5903
 *
5904
 * Description: Hookup the correct CCB and handle the incoming messages.
5905
 *
5906
 *---------------------------------------------------------------------*/
5907
 
5908
#if defined(DOS)
5909
void sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard)
5910
#else
5911
void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
5912
#endif
5913
{
5914
 
5915
#if defined(V302)
5916
#ifdef DOS
5917
   UCHAR our_target,message, msgRetryCount;
5918
   extern UCHAR lun, tag;
5919
#else
5920
   UCHAR our_target,message,lun,tag, msgRetryCount;
5921
#endif
5922
 
5923
#else  /* V302 */
5924
   UCHAR our_target, message, lun = 0, tag, msgRetryCount;
5925
#endif /* V302 */
5926
 
5927
 
5928
   PSCCBMgr_tar_info currTar_Info;
5929
        PSCCB currSCCB;
5930
 
5931
 
5932
 
5933
 
5934
        if(pCurrCard->currentSCCB != NULL)
5935
        {
5936
                currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
5937
                DISABLE_AUTO(port);
5938
 
5939
 
5940
                WR_HARPOON((port+hp_scsictrl_0),(ENA_RESEL | ENA_SCAM_SEL));
5941
 
5942
 
5943
                currSCCB = pCurrCard->currentSCCB;
5944
                if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
5945
                {
5946
                        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
5947
                        currSCCB->Sccb_scsistat = BUS_FREE_ST;
5948
                }
5949
                if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
5950
                {
5951
                        currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
5952
                        currSCCB->Sccb_scsistat = BUS_FREE_ST;
5953
                }
5954
                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
5955
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
5956
                {
5957
        currTar_Info->TarLUNBusy[currSCCB->Lun] = FALSE;
5958
                        if(currSCCB->Sccb_scsistat != ABORT_ST)
5959
                        {
5960
                                pCurrCard->discQCount--;
5961
                                pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[currSCCB->Lun]]
5962
                                                                                                        = NULL;
5963
                        }
5964
                }
5965
                else
5966
                {
5967
              currTar_Info->TarLUNBusy[0] = FALSE;
5968
                        if(currSCCB->Sccb_tag)
5969
                        {
5970
                                if(currSCCB->Sccb_scsistat != ABORT_ST)
5971
                                {
5972
                                        pCurrCard->discQCount--;
5973
                                        pCurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
5974
                                }
5975
                        }else
5976
                        {
5977
                                if(currSCCB->Sccb_scsistat != ABORT_ST)
5978
                                {
5979
                                        pCurrCard->discQCount--;
5980
                                        pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
5981
                                }
5982
                        }
5983
                }
5984
 
5985
      queueSelectFail(&BL_Card[p_card],p_card);
5986
        }
5987
 
5988
#if defined(WIDE_SCSI)
5989
        WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
5990
#endif
5991
 
5992
 
5993
        our_target = (UCHAR)(RD_HARPOON(port+hp_select_id) >> 4);
5994
        currTar_Info = &sccbMgrTbl[p_card][our_target];
5995
 
5996
 
5997
        msgRetryCount = 0;
5998
        do
5999
        {
6000
 
6001
#if defined(V302)
6002
 
6003
                message = GetTarLun(port, p_card, our_target, pCurrCard, &tag, &lun);
6004
 
6005
#else /* V302 */
6006
 
6007
                currTar_Info = &sccbMgrTbl[p_card][our_target];
6008
                tag = 0;
6009
 
6010
 
6011
                while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
6012
                {
6013
                        if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
6014
                        {
6015
 
6016
                                WRW_HARPOON((port+hp_intstat), PHASE);
6017
                                return;
6018
                        }
6019
                }
6020
 
6021
                WRW_HARPOON((port+hp_intstat), PHASE);
6022
                if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
6023
                {
6024
 
6025
                        message = sfm(port,pCurrCard->currentSCCB);
6026
                        if (message)
6027
                        {
6028
 
6029
                                if (message <= (0x80 | LUN_MASK))
6030
                                {
6031
                                        lun = message & (UCHAR)LUN_MASK;
6032
 
6033
#if !defined(DOS)
6034
                                        if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
6035
                                        {
6036
                                                if (currTar_Info->TarTagQ_Cnt != 0)
6037
                                                {
6038
 
6039
                                                        if (!(currTar_Info->TarLUN_CA))
6040
                                                        {
6041
                                                                ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
6042
 
6043
 
6044
                                                                message = sfm(port,pCurrCard->currentSCCB);
6045
                                                                if (message)
6046
                                                                {
6047
                                                                        ACCEPT_MSG(port);
6048
                                                                }
6049
 
6050
                                                                else
6051
                                                                message = FALSE;
6052
 
6053
                                                                if(message != FALSE)
6054
                                                                {
6055
                                                                        tag = sfm(port,pCurrCard->currentSCCB);
6056
 
6057
                                                                        if (!(tag))
6058
                                                                                message = FALSE;
6059
                                                                }
6060
 
6061
                                                        } /*C.A. exists! */
6062
 
6063
                                                } /*End Q cnt != 0 */
6064
 
6065
                                        } /*End Tag cmds supported! */
6066
#endif /* !DOS */
6067
 
6068
                                } /*End valid ID message.  */
6069
 
6070
                                else
6071
                                {
6072
 
6073
                                        ACCEPT_MSG_ATN(port);
6074
                                }
6075
 
6076
                        } /* End good id message. */
6077
 
6078
                        else
6079
                        {
6080
 
6081
                                message = FALSE;
6082
                        }
6083
                }
6084
                else
6085
                {
6086
                        ACCEPT_MSG_ATN(port);
6087
 
6088
                   while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
6089
                          !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
6090
                          (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
6091
 
6092
                        return;
6093
                }
6094
 
6095
#endif /* V302 */
6096
 
6097
                if(message == FALSE)
6098
                {
6099
                        msgRetryCount++;
6100
                        if(msgRetryCount == 1)
6101
                        {
6102
                                SendMsg(port, SMPARITY);
6103
                        }
6104
                        else
6105
                        {
6106
                                SendMsg(port, SMDEV_RESET);
6107
 
6108
                                sssyncv(port, our_target, NARROW_SCSI,currTar_Info);
6109
 
6110
                                if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_SYNC_MASK)
6111
                                {
6112
 
6113
                                        sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_SYNC_MASK;
6114
 
6115
                                }
6116
 
6117
                                if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_WIDE_SCSI)
6118
                                {
6119
 
6120
                                        sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_WIDE_MASK;
6121
                                }
6122
 
6123
 
6124
                                queueFlushTargSccb(p_card, our_target, SCCB_COMPLETE);
6125
                                SccbMgrTableInitTarget(p_card,our_target);
6126
                                return;
6127
                        }
6128
                }
6129
        }while(message == FALSE);
6130
 
6131
 
6132
 
6133
        if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
6134
                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
6135
        {
6136
                currTar_Info->TarLUNBusy[lun] = TRUE;
6137
                pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
6138
                if(pCurrCard->currentSCCB != NULL)
6139
                {
6140
                        ACCEPT_MSG(port);
6141
                }
6142
                else
6143
                {
6144
                        ACCEPT_MSG_ATN(port);
6145
                }
6146
        }
6147
        else
6148
        {
6149
                currTar_Info->TarLUNBusy[0] = TRUE;
6150
 
6151
 
6152
                if (tag)
6153
                {
6154
                        if (pCurrCard->discQ_Tbl[tag] != NULL)
6155
                        {
6156
                                pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[tag];
6157
                                currTar_Info->TarTagQ_Cnt--;
6158
                                ACCEPT_MSG(port);
6159
                        }
6160
                        else
6161
                        {
6162
                        ACCEPT_MSG_ATN(port);
6163
                        }
6164
                }else
6165
                {
6166
                        pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
6167
                        if(pCurrCard->currentSCCB != NULL)
6168
                        {
6169
                                ACCEPT_MSG(port);
6170
                        }
6171
                        else
6172
                        {
6173
                                ACCEPT_MSG_ATN(port);
6174
                        }
6175
                }
6176
        }
6177
 
6178
        if(pCurrCard->currentSCCB != NULL)
6179
        {
6180
                if(pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST)
6181
                {
6182
                /* During Abort Tag command, the target could have got re-selected
6183
                        and completed the command. Check the select Q and remove the CCB
6184
                        if it is in the Select Q */
6185
                        queueFindSccb(pCurrCard->currentSCCB, p_card);
6186
                }
6187
        }
6188
 
6189
 
6190
   while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
6191
          !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
6192
          (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
6193
}
6194
 
6195
#if defined(V302)
6196
 
6197
#if defined(DOS)
6198
UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
6199
#else
6200
UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
6201
#endif
6202
{
6203
   UCHAR message;
6204
   PSCCBMgr_tar_info currTar_Info;
6205
 
6206
 
6207
        currTar_Info = &sccbMgrTbl[p_card][our_target];
6208
        *tag = 0;
6209
 
6210
 
6211
        while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
6212
        {
6213
                if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
6214
                {
6215
 
6216
                        WRW_HARPOON((port+hp_intstat), PHASE);
6217
                        return(TRUE);
6218
                }
6219
        }
6220
 
6221
        WRW_HARPOON((port+hp_intstat), PHASE);
6222
        if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
6223
        {
6224
 
6225
                message = sfm(port,pCurrCard->currentSCCB);
6226
                if (message)
6227
                {
6228
 
6229
                        if (message <= (0x80 | LUN_MASK))
6230
                        {
6231
                                *lun = message & (UCHAR)LUN_MASK;
6232
 
6233
#if !defined(DOS)
6234
                                if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
6235
                                {
6236
                                        if (currTar_Info->TarTagQ_Cnt != 0)
6237
                                        {
6238
 
6239
                                                if (!(currTar_Info->TarLUN_CA))
6240
                                                {
6241
                                                        ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
6242
 
6243
 
6244
                                                        message = sfm(port,pCurrCard->currentSCCB);
6245
                                                        if (message)
6246
                                                        {
6247
                                                                ACCEPT_MSG(port);
6248
                                                        }
6249
 
6250
                                                        else
6251
                                                        return(FALSE);
6252
 
6253
                                                        *tag = sfm(port,pCurrCard->currentSCCB);
6254
 
6255
                                                        if (!(*tag)) return(FALSE);
6256
 
6257
                                                } /*C.A. exists! */
6258
 
6259
                                        } /*End Q cnt != 0 */
6260
 
6261
                                } /*End Tag cmds supported! */
6262
#endif /* !DOS */
6263
 
6264
                        } /*End valid ID message.  */
6265
 
6266
                        else
6267
                        {
6268
 
6269
                                ACCEPT_MSG_ATN(port);
6270
                        }
6271
 
6272
                } /* End good id message. */
6273
 
6274
                else
6275
                {
6276
 
6277
                        return(FALSE);
6278
                }
6279
        }
6280
        else
6281
        {
6282
                ACCEPT_MSG_ATN(port);
6283
                return(TRUE);
6284
        }
6285
        return(TRUE);
6286
}
6287
 
6288
#endif /* V302 */
6289
 
6290
#if defined(DOS)
6291
void SendMsg(USHORT port, UCHAR message)
6292
#else
6293
void SendMsg(ULONG port, UCHAR message)
6294
#endif
6295
{
6296
        while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
6297
        {
6298
                if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
6299
                {
6300
 
6301
                        WRW_HARPOON((port+hp_intstat), PHASE);
6302
                        return;
6303
                }
6304
        }
6305
 
6306
        WRW_HARPOON((port+hp_intstat), PHASE);
6307
        if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH)
6308
        {
6309
                WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
6310
 
6311
 
6312
                WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
6313
 
6314
                WR_HARPOON(port+hp_scsidata_0,message);
6315
 
6316
                WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
6317
 
6318
                ACCEPT_MSG(port);
6319
 
6320
                WR_HARPOON(port+hp_portctrl_0, 0x00);
6321
 
6322
                if ((message == SMABORT) || (message == SMDEV_RESET) ||
6323
                                (message == SMABORT_TAG) )
6324
                {
6325
                        while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
6326
 
6327
                        if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
6328
                        {
6329
                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
6330
                        }
6331
                }
6332
        }
6333
}
6334
 
6335
/*---------------------------------------------------------------------
6336
 *
6337
 * Function: sdecm
6338
 *
6339
 * Description: Determine the proper responce to the message from the
6340
 *              target device.
6341
 *
6342
 *---------------------------------------------------------------------*/
6343
#if defined(DOS)
6344
void sdecm(UCHAR message, USHORT port, UCHAR p_card)
6345
#else
6346
void sdecm(UCHAR message, ULONG port, UCHAR p_card)
6347
#endif
6348
{
6349
        PSCCB currSCCB;
6350
        PSCCBcard CurrCard;
6351
        PSCCBMgr_tar_info currTar_Info;
6352
 
6353
        CurrCard = &BL_Card[p_card];
6354
        currSCCB = CurrCard->currentSCCB;
6355
 
6356
        currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6357
 
6358
        if (message == SMREST_DATA_PTR)
6359
        {
6360
                if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET))
6361
                {
6362
                        currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
6363
 
6364
                        hostDataXferRestart(currSCCB);
6365
                }
6366
 
6367
                ACCEPT_MSG(port);
6368
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6369
        }
6370
 
6371
        else if (message == SMCMD_COMP)
6372
        {
6373
 
6374
 
6375
                if (currSCCB->Sccb_scsistat == SELECT_Q_ST)
6376
                {
6377
                        currTar_Info->TarStatus &= ~(UCHAR)TAR_TAG_Q_MASK;
6378
                        currTar_Info->TarStatus |= (UCHAR)TAG_Q_REJECT;
6379
                }
6380
 
6381
                ACCEPT_MSG(port);
6382
 
6383
        }
6384
 
6385
        else if ((message == SMNO_OP) || (message >= SMIDENT)
6386
                        || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY))
6387
        {
6388
 
6389
                ACCEPT_MSG(port);
6390
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6391
        }
6392
 
6393
        else if (message == SMREJECT)
6394
        {
6395
 
6396
                if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
6397
                                (currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
6398
                                ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING ) ||
6399
                                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING ) )
6400
 
6401
                {
6402
                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
6403
 
6404
                        ACCEPT_MSG(port);
6405
 
6406
 
6407
                        while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
6408
                                (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
6409
 
6410
                        if(currSCCB->Lun == 0x00)
6411
                        {
6412
                                if ((currSCCB->Sccb_scsistat == SELECT_SN_ST))
6413
                                {
6414
 
6415
                                        currTar_Info->TarStatus |= (UCHAR)SYNC_SUPPORTED;
6416
 
6417
                                        currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
6418
                                }
6419
 
6420
#if defined(WIDE_SCSI)
6421
                                else if ((currSCCB->Sccb_scsistat == SELECT_WN_ST))
6422
                                {
6423
 
6424
 
6425
                                        currTar_Info->TarStatus = (currTar_Info->TarStatus &
6426
                                                                                                        ~WIDE_ENABLED) | WIDE_NEGOCIATED;
6427
 
6428
                                        currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
6429
 
6430
                                }
6431
#endif
6432
 
6433
                                else if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING )
6434
                                {
6435
                                        currTar_Info->TarStatus = (currTar_Info->TarStatus &
6436
                                                                                                        ~(UCHAR)TAR_TAG_Q_MASK) | TAG_Q_REJECT;
6437
 
6438
 
6439
                                        currSCCB->ControlByte &= ~F_USE_CMD_Q;
6440
                                        CurrCard->discQCount--;
6441
                                        CurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
6442
                                        currSCCB->Sccb_tag = 0x00;
6443
 
6444
                                }
6445
                        }
6446
 
6447
                        if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
6448
                        {
6449
 
6450
 
6451
                                if(currSCCB->Lun == 0x00)
6452
                                {
6453
                                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
6454
                                        CurrCard->globalFlags |= F_NEW_SCCB_CMD;
6455
                                }
6456
                        }
6457
 
6458
                        else
6459
                        {
6460
 
6461
                                if((CurrCard->globalFlags & F_CONLUN_IO) &&
6462
                                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
6463
                                        currTar_Info->TarLUNBusy[currSCCB->Lun] = TRUE;
6464
                                else
6465
                                        currTar_Info->TarLUNBusy[0] = TRUE;
6466
 
6467
 
6468
                                currSCCB->ControlByte &= ~(UCHAR)F_USE_CMD_Q;
6469
 
6470
                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6471
 
6472
                        }
6473
                }
6474
 
6475
                else
6476
                {
6477
                        ACCEPT_MSG(port);
6478
 
6479
                        while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
6480
                                (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
6481
 
6482
                        if (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))
6483
                        {
6484
                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6485
                        }
6486
                }
6487
        }
6488
 
6489
        else if (message == SMEXT)
6490
        {
6491
 
6492
                ACCEPT_MSG(port);
6493
                shandem(port,p_card,currSCCB);
6494
        }
6495
 
6496
        else if (message == SMIGNORWR)
6497
        {
6498
 
6499
                ACCEPT_MSG(port);          /* ACK the RESIDUE MSG */
6500
 
6501
                message = sfm(port,currSCCB);
6502
 
6503
                if(currSCCB->Sccb_scsimsg != SMPARITY)
6504
                        ACCEPT_MSG(port);
6505
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6506
        }
6507
 
6508
 
6509
        else
6510
        {
6511
 
6512
                currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
6513
                currSCCB->Sccb_scsimsg = SMREJECT;
6514
 
6515
                ACCEPT_MSG_ATN(port);
6516
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6517
        }
6518
}
6519
 
6520
 
6521
/*---------------------------------------------------------------------
6522
 *
6523
 * Function: shandem
6524
 *
6525
 * Description: Decide what to do with the extended message.
6526
 *
6527
 *---------------------------------------------------------------------*/
6528
#if defined(DOS)
6529
void shandem(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
6530
#else
6531
void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
6532
#endif
6533
{
6534
        UCHAR length,message;
6535
 
6536
        length = sfm(port,pCurrSCCB);
6537
        if (length)
6538
        {
6539
 
6540
                ACCEPT_MSG(port);
6541
                message = sfm(port,pCurrSCCB);
6542
                if (message)
6543
                {
6544
 
6545
                        if (message == SMSYNC)
6546
                        {
6547
 
6548
                                if (length == 0x03)
6549
                                {
6550
 
6551
                                        ACCEPT_MSG(port);
6552
                                        stsyncn(port,p_card);
6553
                                }
6554
                                else
6555
                                {
6556
 
6557
                                        pCurrSCCB->Sccb_scsimsg = SMREJECT;
6558
                                        ACCEPT_MSG_ATN(port);
6559
                                }
6560
                        }
6561
#if defined(WIDE_SCSI)
6562
                        else if (message == SMWDTR)
6563
                        {
6564
 
6565
                                if (length == 0x02)
6566
                                {
6567
 
6568
                                        ACCEPT_MSG(port);
6569
                                        stwidn(port,p_card);
6570
                                }
6571
                                else
6572
                                {
6573
 
6574
                                        pCurrSCCB->Sccb_scsimsg = SMREJECT;
6575
                                        ACCEPT_MSG_ATN(port);
6576
 
6577
                                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6578
                                }
6579
                        }
6580
#endif
6581
                        else
6582
                        {
6583
 
6584
                                pCurrSCCB->Sccb_scsimsg = SMREJECT;
6585
                                ACCEPT_MSG_ATN(port);
6586
 
6587
                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6588
                        }
6589
                }
6590
                else
6591
                {
6592
                        if(pCurrSCCB->Sccb_scsimsg != SMPARITY)
6593
                                ACCEPT_MSG(port);
6594
                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6595
                }
6596
        }else
6597
        {
6598
                        if(pCurrSCCB->Sccb_scsimsg == SMPARITY)
6599
                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6600
        }
6601
}
6602
 
6603
 
6604
/*---------------------------------------------------------------------
6605
 *
6606
 * Function: sisyncn
6607
 *
6608
 * Description: Read in a message byte from the SCSI bus, and check
6609
 *              for a parity error.
6610
 *
6611
 *---------------------------------------------------------------------*/
6612
 
6613
#if defined(DOS)
6614
UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag)
6615
#else
6616
UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
6617
#endif
6618
{
6619
   PSCCB currSCCB;
6620
   PSCCBMgr_tar_info currTar_Info;
6621
 
6622
   currSCCB = BL_Card[p_card].currentSCCB;
6623
   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6624
 
6625
   if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
6626
 
6627
 
6628
      WRW_HARPOON((port+ID_MSG_STRT),
6629
                 (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
6630
 
6631
      WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
6632
 
6633
      WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
6634
      WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03  ));
6635
      WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
6636
 
6637
 
6638
      if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
6639
 
6640
         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 12));
6641
 
6642
      else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
6643
 
6644
         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 25));
6645
 
6646
      else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
6647
 
6648
         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 50));
6649
 
6650
      else
6651
         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 00));
6652
 
6653
 
6654
      WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP                ));
6655
      WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+DEFAULT_OFFSET));
6656
      WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP      ));
6657
 
6658
 
6659
                if(syncFlag == FALSE)
6660
                {
6661
                   WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
6662
              currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6663
              ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_TRYING);
6664
                }
6665
                else
6666
                {
6667
                   WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
6668
                }
6669
 
6670
 
6671
      return(TRUE);
6672
      }
6673
 
6674
   else {
6675
 
6676
      currTar_Info->TarStatus |=         (UCHAR)SYNC_SUPPORTED;
6677
      currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
6678
      return(FALSE);
6679
      }
6680
}
6681
 
6682
 
6683
 
6684
/*---------------------------------------------------------------------
6685
 *
6686
 * Function: stsyncn
6687
 *
6688
 * Description: The has sent us a Sync Nego message so handle it as
6689
 *              necessary.
6690
 *
6691
 *---------------------------------------------------------------------*/
6692
#if defined(DOS)
6693
void stsyncn(USHORT port, UCHAR p_card)
6694
#else
6695
void stsyncn(ULONG port, UCHAR p_card)
6696
#endif
6697
{
6698
   UCHAR sync_msg,offset,sync_reg,our_sync_msg;
6699
   PSCCB currSCCB;
6700
   PSCCBMgr_tar_info currTar_Info;
6701
 
6702
   currSCCB = BL_Card[p_card].currentSCCB;
6703
   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6704
 
6705
   sync_msg = sfm(port,currSCCB);
6706
 
6707
        if((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
6708
        {
6709
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6710
                return;
6711
        }
6712
 
6713
   ACCEPT_MSG(port);
6714
 
6715
 
6716
   offset = sfm(port,currSCCB);
6717
 
6718
        if((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
6719
        {
6720
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6721
                return;
6722
        }
6723
 
6724
   if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
6725
 
6726
      our_sync_msg = 12;              /* Setup our Message to 20mb/s */
6727
 
6728
   else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
6729
 
6730
      our_sync_msg = 25;              /* Setup our Message to 10mb/s */
6731
 
6732
   else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
6733
 
6734
      our_sync_msg = 50;              /* Setup our Message to 5mb/s */
6735
   else
6736
 
6737
      our_sync_msg = 0;               /* Message = Async */
6738
 
6739
   if (sync_msg < our_sync_msg) {
6740
      sync_msg = our_sync_msg;    /*if faster, then set to max. */
6741
      }
6742
 
6743
   if (offset == ASYNC)
6744
      sync_msg = ASYNC;
6745
 
6746
   if (offset > MAX_OFFSET)
6747
      offset = MAX_OFFSET;
6748
 
6749
   sync_reg = 0x00;
6750
 
6751
   if (sync_msg > 12)
6752
 
6753
      sync_reg = 0x20;        /* Use 10MB/s */
6754
 
6755
   if (sync_msg > 25)
6756
 
6757
      sync_reg = 0x40;        /* Use 6.6MB/s */
6758
 
6759
   if (sync_msg > 38)
6760
 
6761
      sync_reg = 0x60;        /* Use 5MB/s */
6762
 
6763
   if (sync_msg > 50)
6764
 
6765
      sync_reg = 0x80;        /* Use 4MB/s */
6766
 
6767
   if (sync_msg > 62)
6768
 
6769
      sync_reg = 0xA0;        /* Use 3.33MB/s */
6770
 
6771
   if (sync_msg > 75)
6772
 
6773
      sync_reg = 0xC0;        /* Use 2.85MB/s */
6774
 
6775
   if (sync_msg > 87)
6776
 
6777
      sync_reg = 0xE0;        /* Use 2.5MB/s */
6778
 
6779
   if (sync_msg > 100) {
6780
 
6781
      sync_reg = 0x00;        /* Use ASYNC */
6782
      offset = 0x00;
6783
      }
6784
 
6785
 
6786
#if defined(WIDE_SCSI)
6787
   if (currTar_Info->TarStatus & WIDE_ENABLED)
6788
 
6789
      sync_reg |= offset;
6790
 
6791
   else
6792
 
6793
      sync_reg |= (offset | NARROW_SCSI);
6794
 
6795
#else
6796
   sync_reg |= (offset | NARROW_SCSI);
6797
#endif
6798
 
6799
   sssyncv(port,currSCCB->TargID,sync_reg,currTar_Info);
6800
 
6801
 
6802
   if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
6803
 
6804
 
6805
      ACCEPT_MSG(port);
6806
 
6807
      currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6808
         ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
6809
 
6810
      WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6811
      }
6812
 
6813
   else {
6814
 
6815
 
6816
      ACCEPT_MSG_ATN(port);
6817
 
6818
      sisyncr(port,sync_msg,offset);
6819
 
6820
      currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6821
         ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
6822
      }
6823
}
6824
 
6825
 
6826
/*---------------------------------------------------------------------
6827
 *
6828
 * Function: sisyncr
6829
 *
6830
 * Description: Answer the targets sync message.
6831
 *
6832
 *---------------------------------------------------------------------*/
6833
#if defined(DOS)
6834
void sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset)
6835
#else
6836
void sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset)
6837
#endif
6838
{
6839
   ARAM_ACCESS(port);
6840
   WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
6841
   WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03  ));
6842
   WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
6843
   WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+sync_pulse));
6844
   WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP                ));
6845
   WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+offset));
6846
   WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP      ));
6847
   SGRAM_ACCESS(port);
6848
 
6849
   WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
6850
   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
6851
 
6852
   WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
6853
 
6854
   while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
6855
}
6856
 
6857
 
6858
 
6859
#if defined(WIDE_SCSI)
6860
 
6861
/*---------------------------------------------------------------------
6862
 *
6863
 * Function: siwidn
6864
 *
6865
 * Description: Read in a message byte from the SCSI bus, and check
6866
 *              for a parity error.
6867
 *
6868
 *---------------------------------------------------------------------*/
6869
 
6870
#if defined(DOS)
6871
UCHAR siwidn(USHORT port, UCHAR p_card)
6872
#else
6873
UCHAR siwidn(ULONG port, UCHAR p_card)
6874
#endif
6875
{
6876
   PSCCB currSCCB;
6877
   PSCCBMgr_tar_info currTar_Info;
6878
 
6879
   currSCCB = BL_Card[p_card].currentSCCB;
6880
   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6881
 
6882
   if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
6883
 
6884
 
6885
      WRW_HARPOON((port+ID_MSG_STRT),
6886
                      (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
6887
 
6888
      WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
6889
 
6890
      WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
6891
      WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02  ));
6892
      WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
6893
      WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP                ));
6894
      WRW_HARPOON((port+SYNC_MSGS+8), (MPM_OP+AMSG_OUT+ SM16BIT));
6895
      WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP      ));
6896
 
6897
      WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
6898
 
6899
 
6900
      currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6901
         ~(UCHAR)TAR_WIDE_MASK) | (UCHAR)WIDE_ENABLED);
6902
 
6903
      return(TRUE);
6904
      }
6905
 
6906
   else {
6907
 
6908
      currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6909
               ~(UCHAR)TAR_WIDE_MASK) | WIDE_NEGOCIATED);
6910
 
6911
      currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
6912
      return(FALSE);
6913
      }
6914
}
6915
 
6916
 
6917
 
6918
/*---------------------------------------------------------------------
6919
 *
6920
 * Function: stwidn
6921
 *
6922
 * Description: The has sent us a Wide Nego message so handle it as
6923
 *              necessary.
6924
 *
6925
 *---------------------------------------------------------------------*/
6926
#if defined(DOS)
6927
void stwidn(USHORT port, UCHAR p_card)
6928
#else
6929
void stwidn(ULONG port, UCHAR p_card)
6930
#endif
6931
{
6932
   UCHAR width;
6933
   PSCCB currSCCB;
6934
   PSCCBMgr_tar_info currTar_Info;
6935
 
6936
   currSCCB = BL_Card[p_card].currentSCCB;
6937
   currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6938
 
6939
   width = sfm(port,currSCCB);
6940
 
6941
        if((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
6942
        {
6943
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6944
                return;
6945
        }
6946
 
6947
 
6948
   if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
6949
      width = 0;
6950
 
6951
   if (width) {
6952
      currTar_Info->TarStatus |= WIDE_ENABLED;
6953
      width = 0;
6954
      }
6955
   else {
6956
      width = NARROW_SCSI;
6957
      currTar_Info->TarStatus &= ~WIDE_ENABLED;
6958
      }
6959
 
6960
 
6961
   sssyncv(port,currSCCB->TargID,width,currTar_Info);
6962
 
6963
 
6964
   if (currSCCB->Sccb_scsistat == SELECT_WN_ST)
6965
        {
6966
 
6967
 
6968
 
6969
      currTar_Info->TarStatus |=         WIDE_NEGOCIATED;
6970
 
6971
           if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_SUPPORTED))
6972
                {
6973
              ACCEPT_MSG_ATN(port);
6974
                   ARAM_ACCESS(port);
6975
                sisyncn(port,p_card, TRUE);
6976
              currSCCB->Sccb_scsistat = SELECT_SN_ST;
6977
                   SGRAM_ACCESS(port);
6978
                }
6979
                else
6980
                {
6981
              ACCEPT_MSG(port);
6982
                   WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6983
                }
6984
   }
6985
 
6986
   else {
6987
 
6988
 
6989
      ACCEPT_MSG_ATN(port);
6990
 
6991
      if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
6992
         width = SM16BIT;
6993
      else
6994
         width = SM8BIT;
6995
 
6996
      siwidr(port,width);
6997
 
6998
      currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
6999
      }
7000
}
7001
 
7002
 
7003
/*---------------------------------------------------------------------
7004
 *
7005
 * Function: siwidr
7006
 *
7007
 * Description: Answer the targets Wide nego message.
7008
 *
7009
 *---------------------------------------------------------------------*/
7010
#if defined(DOS)
7011
void siwidr(USHORT port, UCHAR width)
7012
#else
7013
void siwidr(ULONG port, UCHAR width)
7014
#endif
7015
{
7016
   ARAM_ACCESS(port);
7017
   WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
7018
   WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02  ));
7019
   WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
7020
   WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP                ));
7021
   WRW_HARPOON((port+SYNC_MSGS+8),(MPM_OP+AMSG_OUT+width));
7022
   WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP      ));
7023
   SGRAM_ACCESS(port);
7024
 
7025
   WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7026
   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
7027
 
7028
   WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
7029
 
7030
   while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
7031
}
7032
 
7033
#endif
7034
 
7035
 
7036
 
7037
/*---------------------------------------------------------------------
7038
 *
7039
 * Function: sssyncv
7040
 *
7041
 * Description: Write the desired value to the Sync Register for the
7042
 *              ID specified.
7043
 *
7044
 *---------------------------------------------------------------------*/
7045
#if defined(DOS)
7046
void sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
7047
#else
7048
void sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
7049
#endif
7050
{
7051
   UCHAR index;
7052
 
7053
   index = p_id;
7054
 
7055
   switch (index) {
7056
 
7057
      case 0:
7058
         index = 12;             /* hp_synctarg_0 */
7059
         break;
7060
      case 1:
7061
         index = 13;             /* hp_synctarg_1 */
7062
         break;
7063
      case 2:
7064
         index = 14;             /* hp_synctarg_2 */
7065
         break;
7066
      case 3:
7067
         index = 15;             /* hp_synctarg_3 */
7068
         break;
7069
      case 4:
7070
         index = 8;              /* hp_synctarg_4 */
7071
         break;
7072
      case 5:
7073
         index = 9;              /* hp_synctarg_5 */
7074
         break;
7075
      case 6:
7076
         index = 10;             /* hp_synctarg_6 */
7077
         break;
7078
      case 7:
7079
         index = 11;             /* hp_synctarg_7 */
7080
         break;
7081
      case 8:
7082
         index = 4;              /* hp_synctarg_8 */
7083
         break;
7084
      case 9:
7085
         index = 5;              /* hp_synctarg_9 */
7086
         break;
7087
      case 10:
7088
         index = 6;              /* hp_synctarg_10 */
7089
         break;
7090
      case 11:
7091
         index = 7;              /* hp_synctarg_11 */
7092
         break;
7093
      case 12:
7094
         index = 0;              /* hp_synctarg_12 */
7095
         break;
7096
      case 13:
7097
         index = 1;              /* hp_synctarg_13 */
7098
         break;
7099
      case 14:
7100
         index = 2;              /* hp_synctarg_14 */
7101
         break;
7102
      case 15:
7103
         index = 3;              /* hp_synctarg_15 */
7104
 
7105
      }
7106
 
7107
   WR_HARPOON(p_port+hp_synctarg_base+index, p_sync_value);
7108
 
7109
        currTar_Info->TarSyncCtrl = p_sync_value;
7110
}
7111
 
7112
 
7113
/*---------------------------------------------------------------------
7114
 *
7115
 * Function: sresb
7116
 *
7117
 * Description: Reset the desired card's SCSI bus.
7118
 *
7119
 *---------------------------------------------------------------------*/
7120
#if defined(DOS)
7121
void sresb(USHORT port, UCHAR p_card)
7122
#else
7123
void sresb(ULONG port, UCHAR p_card)
7124
#endif
7125
{
7126
   UCHAR scsiID, i;
7127
 
7128
   PSCCBMgr_tar_info currTar_Info;
7129
 
7130
   WR_HARPOON(port+hp_page_ctrl,
7131
      (RD_HARPOON(port+hp_page_ctrl) | G_INT_DISABLE));
7132
   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
7133
 
7134
   WR_HARPOON(port+hp_scsictrl_0, SCSI_RST);
7135
 
7136
   scsiID = RD_HARPOON(port+hp_seltimeout);
7137
   WR_HARPOON(port+hp_seltimeout,TO_5ms);
7138
   WRW_HARPOON((port+hp_intstat), TIMEOUT);
7139
 
7140
   WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT | START_TO));
7141
 
7142
   while (!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
7143
 
7144
   WR_HARPOON(port+hp_seltimeout,scsiID);
7145
 
7146
   WR_HARPOON(port+hp_scsictrl_0, ENA_SCAM_SEL);
7147
 
7148
   Wait(port, TO_5ms);
7149
 
7150
   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
7151
 
7152
   WR_HARPOON(port+hp_int_mask, (RD_HARPOON(port+hp_int_mask) | 0x00));
7153
 
7154
   for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
7155
      {
7156
      currTar_Info = &sccbMgrTbl[p_card][scsiID];
7157
 
7158
      if (currTar_Info->TarEEValue & EE_SYNC_MASK)
7159
         {
7160
                currTar_Info->TarSyncCtrl = 0;
7161
                currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
7162
              }
7163
 
7164
      if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
7165
         {
7166
        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
7167
        }
7168
 
7169
      sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
7170
 
7171
      SccbMgrTableInitTarget(p_card, scsiID);
7172
      }
7173
 
7174
   BL_Card[p_card].scanIndex = 0x00;
7175
   BL_Card[p_card].currentSCCB = NULL;
7176
   BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT
7177
                                                                                                        | F_NEW_SCCB_CMD);
7178
   BL_Card[p_card].cmdCounter  = 0x00;
7179
        BL_Card[p_card].discQCount = 0x00;
7180
   BL_Card[p_card].tagQ_Lst = 0x01;
7181
 
7182
        for(i = 0; i < QUEUE_DEPTH; i++)
7183
                BL_Card[p_card].discQ_Tbl[i] = NULL;
7184
 
7185
   WR_HARPOON(port+hp_page_ctrl,
7186
      (RD_HARPOON(port+hp_page_ctrl) & ~G_INT_DISABLE));
7187
 
7188
}
7189
 
7190
/*---------------------------------------------------------------------
7191
 *
7192
 * Function: ssenss
7193
 *
7194
 * Description: Setup for the Auto Sense command.
7195
 *
7196
 *---------------------------------------------------------------------*/
7197
void ssenss(PSCCBcard pCurrCard)
7198
{
7199
   UCHAR i;
7200
   PSCCB currSCCB;
7201
 
7202
   currSCCB = pCurrCard->currentSCCB;
7203
 
7204
 
7205
   currSCCB->Save_CdbLen = currSCCB->CdbLength;
7206
 
7207
   for (i = 0; i < 6; i++) {
7208
 
7209
      currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
7210
      }
7211
 
7212
   currSCCB->CdbLength = SIX_BYTE_CMD;
7213
   currSCCB->Cdb[0]    = SCSI_REQUEST_SENSE;
7214
   currSCCB->Cdb[1]    = currSCCB->Cdb[1] & (UCHAR)0xE0; /*Keep LUN. */
7215
   currSCCB->Cdb[2]    = 0x00;
7216
   currSCCB->Cdb[3]    = 0x00;
7217
   currSCCB->Cdb[4]    = currSCCB->RequestSenseLength;
7218
   currSCCB->Cdb[5]    = 0x00;
7219
 
7220
   currSCCB->Sccb_XferCnt = (unsigned long)currSCCB->RequestSenseLength;
7221
 
7222
   currSCCB->Sccb_ATC = 0x00;
7223
 
7224
   currSCCB->Sccb_XferState |= F_AUTO_SENSE;
7225
 
7226
   currSCCB->Sccb_XferState &= ~F_SG_XFER;
7227
 
7228
   currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV;
7229
 
7230
   currSCCB->ControlByte = 0x00;
7231
 
7232
   currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
7233
}
7234
 
7235
 
7236
 
7237
/*---------------------------------------------------------------------
7238
 *
7239
 * Function: sxfrp
7240
 *
7241
 * Description: Transfer data into the bit bucket until the device
7242
 *              decides to switch phase.
7243
 *
7244
 *---------------------------------------------------------------------*/
7245
 
7246
#if defined(DOS)
7247
void sxfrp(USHORT p_port, UCHAR p_card)
7248
#else
7249
void sxfrp(ULONG p_port, UCHAR p_card)
7250
#endif
7251
{
7252
   UCHAR curr_phz;
7253
 
7254
 
7255
   DISABLE_AUTO(p_port);
7256
 
7257
   if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
7258
 
7259
      hostDataXferAbort(p_port,p_card,BL_Card[p_card].currentSCCB);
7260
 
7261
      }
7262
 
7263
   /* If the Automation handled the end of the transfer then do not
7264
      match the phase or we will get out of sync with the ISR.       */
7265
 
7266
   if (RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | XFER_CNT_0 | AUTO_INT))
7267
      return;
7268
 
7269
   WR_HARPOON(p_port+hp_xfercnt_0, 0x00);
7270
 
7271
   curr_phz = RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ;
7272
 
7273
   WRW_HARPOON((p_port+hp_intstat), XFER_CNT_0);
7274
 
7275
 
7276
   WR_HARPOON(p_port+hp_scsisig, curr_phz);
7277
 
7278
   while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)) &&
7279
      (curr_phz == (RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ)) )
7280
      {
7281
      if (curr_phz & (UCHAR)SCSI_IOBIT)
7282
         {
7283
        WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
7284
 
7285
              if (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
7286
            {
7287
                 RD_HARPOON(p_port+hp_fifodata_0);
7288
                 }
7289
              }
7290
      else
7291
         {
7292
        WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | HOST_WRT));
7293
           if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
7294
            {
7295
                 WR_HARPOON(p_port+hp_fifodata_0,0xFA);
7296
                 }
7297
              }
7298
      } /* End of While loop for padding data I/O phase */
7299
 
7300
      while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
7301
         {
7302
         if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
7303
           break;
7304
         }
7305
 
7306
      WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
7307
      while (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
7308
         {
7309
         RD_HARPOON(p_port+hp_fifodata_0);
7310
         }
7311
 
7312
      if ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
7313
         {
7314
         WR_HARPOON(p_port+hp_autostart_0, (AUTO_IMMED+DISCONNECT_START));
7315
         while (!(RDW_HARPOON((p_port+hp_intstat)) & AUTO_INT)) {}
7316
 
7317
         if (RDW_HARPOON((p_port+hp_intstat)) & (ICMD_COMP | ITAR_DISC))
7318
           while (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RSEL))) ;
7319
         }
7320
}
7321
 
7322
 
7323
/*---------------------------------------------------------------------
7324
 *
7325
 * Function: schkdd
7326
 *
7327
 * Description: Make sure data has been flushed from both FIFOs and abort
7328
 *              the operations if necessary.
7329
 *
7330
 *---------------------------------------------------------------------*/
7331
 
7332
#if defined(DOS)
7333
void schkdd(USHORT port, UCHAR p_card)
7334
#else
7335
void schkdd(ULONG port, UCHAR p_card)
7336
#endif
7337
{
7338
   USHORT TimeOutLoop;
7339
        UCHAR sPhase;
7340
 
7341
   PSCCB currSCCB;
7342
 
7343
   currSCCB = BL_Card[p_card].currentSCCB;
7344
 
7345
 
7346
   if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
7347
       (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
7348
      return;
7349
      }
7350
 
7351
 
7352
 
7353
   if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT)
7354
      {
7355
 
7356
      currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt-1);
7357
 
7358
      currSCCB->Sccb_XferCnt = 1;
7359
 
7360
      currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
7361
      WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
7362
      WR_HARPOON(port+hp_xferstat, 0x00);
7363
      }
7364
 
7365
   else
7366
      {
7367
 
7368
      currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
7369
 
7370
      currSCCB->Sccb_XferCnt = 0;
7371
      }
7372
 
7373
   if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
7374
      (currSCCB->HostStatus == SCCB_COMPLETE)) {
7375
 
7376
      currSCCB->HostStatus = SCCB_PARITY_ERR;
7377
      WRW_HARPOON((port+hp_intstat), PARITY);
7378
      }
7379
 
7380
 
7381
   hostDataXferAbort(port,p_card,currSCCB);
7382
 
7383
 
7384
   while (RD_HARPOON(port+hp_scsisig) & SCSI_ACK) {}
7385
 
7386
   TimeOutLoop = 0;
7387
 
7388
   while(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)
7389
      {
7390
      if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) {
7391
              return;
7392
           }
7393
      if (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F) {
7394
              break;
7395
           }
7396
      if (RDW_HARPOON((port+hp_intstat)) & RESET) {
7397
              return;
7398
           }
7399
      if ((RD_HARPOON(port+hp_scsisig) & SCSI_REQ) || (TimeOutLoop++>0x3000) )
7400
           break;
7401
      }
7402
 
7403
        sPhase = RD_HARPOON(port+hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
7404
   if ((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))                     ||
7405
      (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F)                       ||
7406
      (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
7407
      (sPhase == (SCSI_BSY | S_DATAI_PH)))
7408
      {
7409
 
7410
           WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7411
 
7412
           if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED))
7413
         {
7414
              if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
7415
                 phaseDataIn(port,p_card);
7416
                }
7417
 
7418
                else {
7419
               phaseDataOut(port,p_card);
7420
                }
7421
                }
7422
                else
7423
        {
7424
                sxfrp(port,p_card);
7425
                if (!(RDW_HARPOON((port+hp_intstat)) &
7426
                      (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET)))
7427
         {
7428
                WRW_HARPOON((port+hp_intstat), AUTO_INT);
7429
                   phaseDecode(port,p_card);
7430
                   }
7431
           }
7432
 
7433
   }
7434
 
7435
   else {
7436
      WR_HARPOON(port+hp_portctrl_0, 0x00);
7437
      }
7438
}
7439
 
7440
 
7441
/*---------------------------------------------------------------------
7442
 *
7443
 * Function: sinits
7444
 *
7445
 * Description: Setup SCCB manager fields in this SCCB.
7446
 *
7447
 *---------------------------------------------------------------------*/
7448
 
7449
void sinits(PSCCB p_sccb, UCHAR p_card)
7450
{
7451
   PSCCBMgr_tar_info currTar_Info;
7452
 
7453
        if((p_sccb->TargID > MAX_SCSI_TAR) || (p_sccb->Lun > MAX_LUN))
7454
        {
7455
                return;
7456
        }
7457
   currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
7458
 
7459
   p_sccb->Sccb_XferState     = 0x00;
7460
   p_sccb->Sccb_XferCnt       = p_sccb->DataLength;
7461
 
7462
   if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
7463
      (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
7464
 
7465
      p_sccb->Sccb_SGoffset   = 0;
7466
      p_sccb->Sccb_XferState  = F_SG_XFER;
7467
      p_sccb->Sccb_XferCnt    = 0x00;
7468
      }
7469
 
7470
   if (p_sccb->DataLength == 0x00)
7471
 
7472
      p_sccb->Sccb_XferState |= F_ALL_XFERRED;
7473
 
7474
   if (p_sccb->ControlByte & F_USE_CMD_Q)
7475
      {
7476
      if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
7477
         p_sccb->ControlByte &= ~F_USE_CMD_Q;
7478
 
7479
      else
7480
              currTar_Info->TarStatus |= TAG_Q_TRYING;
7481
      }
7482
 
7483
/*      For !single SCSI device in system  & device allow Disconnect
7484
        or command is tag_q type then send Cmd with Disconnect Enable
7485
        else send Cmd with Disconnect Disable */
7486
 
7487
/*
7488
   if (((!(BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
7489
      (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
7490
      (currTar_Info->TarStatus & TAG_Q_TRYING)) {
7491
*/
7492
   if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
7493
      (currTar_Info->TarStatus & TAG_Q_TRYING)) {
7494
      p_sccb->Sccb_idmsg      = (UCHAR)(SMIDENT | DISC_PRIV) | p_sccb->Lun;
7495
      }
7496
 
7497
   else {
7498
 
7499
      p_sccb->Sccb_idmsg      = (UCHAR)SMIDENT | p_sccb->Lun;
7500
      }
7501
 
7502
   p_sccb->HostStatus         = 0x00;
7503
   p_sccb->TargetStatus       = 0x00;
7504
   p_sccb->Sccb_tag           = 0x00;
7505
   p_sccb->Sccb_MGRFlags      = 0x00;
7506
   p_sccb->Sccb_sgseg         = 0x00;
7507
   p_sccb->Sccb_ATC           = 0x00;
7508
   p_sccb->Sccb_savedATC      = 0x00;
7509
/*
7510
   p_sccb->SccbVirtDataPtr    = 0x00;
7511
   p_sccb->Sccb_forwardlink   = NULL;
7512
   p_sccb->Sccb_backlink      = NULL;
7513
 */
7514
   p_sccb->Sccb_scsistat      = BUS_FREE_ST;
7515
   p_sccb->SccbStatus         = SCCB_IN_PROCESS;
7516
   p_sccb->Sccb_scsimsg       = SMNO_OP;
7517
 
7518
}
7519
 
7520
 
7521
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
7522
/*----------------------------------------------------------------------
7523
 *
7524
 *
7525
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
7526
 *
7527
 *   This file is available under both the GNU General Public License
7528
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
7529
 *
7530
 *   $Workfile:   phase.c  $
7531
 *
7532
 *   Description:  Functions to intially handle the SCSI bus phase when
7533
 *                 the target asserts request (and the automation is not
7534
 *                 enabled to handle the situation).
7535
 *
7536
 *   $Date: 2005-12-20 10:17:45 $
7537
 *
7538
 *   $Revision: 1.1 $
7539
 *
7540
 *----------------------------------------------------------------------*/
7541
 
7542
/*#include <globals.h>*/
7543
 
7544
#if (FW_TYPE==_UCB_MGR_)
7545
        /*#include <budi.h>*/
7546
#endif
7547
 
7548
/*#include <sccbmgr.h>*/
7549
/*#include <blx30.h>*/
7550
/*#include <target.h>*/
7551
/*#include <scsi2.h>*/
7552
/*#include <harpoon.h>*/
7553
 
7554
 
7555
/*
7556
extern SCCBCARD BL_Card[MAX_CARDS];
7557
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
7558
 
7559
#if defined(OS2)
7560
   extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
7561
#else
7562
   #if defined(DOS)
7563
      extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
7564
   #else
7565
      extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
7566
   #endif
7567
#endif
7568
*/
7569
 
7570
/*---------------------------------------------------------------------
7571
 *
7572
 * Function: Phase Decode
7573
 *
7574
 * Description: Determine the phase and call the appropriate function.
7575
 *
7576
 *---------------------------------------------------------------------*/
7577
 
7578
#if defined(DOS)
7579
void phaseDecode(USHORT p_port, UCHAR p_card)
7580
#else
7581
void phaseDecode(ULONG p_port, UCHAR p_card)
7582
#endif
7583
{
7584
   unsigned char phase_ref;
7585
#if defined(OS2)
7586
   void (far *phase) (ULONG, UCHAR);
7587
#else
7588
   #if defined(DOS)
7589
      void (*phase) (USHORT, UCHAR);
7590
   #else
7591
      void (*phase) (ULONG, UCHAR);
7592
   #endif
7593
#endif
7594
 
7595
 
7596
   DISABLE_AUTO(p_port);
7597
 
7598
   phase_ref = (UCHAR) (RD_HARPOON(p_port+hp_scsisig) & S_SCSI_PHZ);
7599
 
7600
   phase = s_PhaseTbl[phase_ref];
7601
 
7602
   (*phase)(p_port, p_card);           /* Call the correct phase func */
7603
}
7604
 
7605
 
7606
 
7607
/*---------------------------------------------------------------------
7608
 *
7609
 * Function: Data Out Phase
7610
 *
7611
 * Description: Start up both the BusMaster and Xbow.
7612
 *
7613
 *---------------------------------------------------------------------*/
7614
 
7615
#if defined(OS2)
7616
void far phaseDataOut(ULONG port, UCHAR p_card)
7617
#else
7618
#if defined(DOS)
7619
void phaseDataOut(USHORT port, UCHAR p_card)
7620
#else
7621
void phaseDataOut(ULONG port, UCHAR p_card)
7622
#endif
7623
#endif
7624
{
7625
 
7626
   PSCCB currSCCB;
7627
 
7628
   currSCCB = BL_Card[p_card].currentSCCB;
7629
   if (currSCCB == NULL)
7630
      {
7631
      return;  /* Exit if No SCCB record */
7632
      }
7633
 
7634
   currSCCB->Sccb_scsistat = DATA_OUT_ST;
7635
   currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
7636
 
7637
   WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7638
 
7639
   WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
7640
 
7641
   WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
7642
 
7643
   dataXferProcessor(port, &BL_Card[p_card]);
7644
 
7645
#if defined(NOBUGBUG)
7646
   if (RDW_HARPOON((port+hp_intstat)) & XFER_CNT_0)
7647
      WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
7648
 
7649
#endif
7650
 
7651
 
7652
   if (currSCCB->Sccb_XferCnt == 0) {
7653
 
7654
 
7655
      if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
7656
         (currSCCB->HostStatus == SCCB_COMPLETE))
7657
         currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
7658
 
7659
      sxfrp(port,p_card);
7660
      if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
7661
            phaseDecode(port,p_card);
7662
      }
7663
}
7664
 
7665
 
7666
/*---------------------------------------------------------------------
7667
 *
7668
 * Function: Data In Phase
7669
 *
7670
 * Description: Startup the BusMaster and the XBOW.
7671
 *
7672
 *---------------------------------------------------------------------*/
7673
 
7674
#if defined(OS2)
7675
void far phaseDataIn(ULONG port, UCHAR p_card)
7676
#else
7677
#if defined(DOS)
7678
void phaseDataIn(USHORT port, UCHAR p_card)
7679
#else
7680
void phaseDataIn(ULONG port, UCHAR p_card)
7681
#endif
7682
#endif
7683
{
7684
 
7685
   PSCCB currSCCB;
7686
 
7687
   currSCCB = BL_Card[p_card].currentSCCB;
7688
 
7689
   if (currSCCB == NULL)
7690
      {
7691
      return;  /* Exit if No SCCB record */
7692
      }
7693
 
7694
 
7695
   currSCCB->Sccb_scsistat = DATA_IN_ST;
7696
   currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
7697
   currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
7698
 
7699
   WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7700
 
7701
   WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
7702
 
7703
   WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
7704
 
7705
   dataXferProcessor(port, &BL_Card[p_card]);
7706
 
7707
   if (currSCCB->Sccb_XferCnt == 0) {
7708
 
7709
 
7710
      if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
7711
         (currSCCB->HostStatus == SCCB_COMPLETE))
7712
         currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
7713
 
7714
      sxfrp(port,p_card);
7715
      if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
7716
            phaseDecode(port,p_card);
7717
 
7718
      }
7719
}
7720
 
7721
/*---------------------------------------------------------------------
7722
 *
7723
 * Function: Command Phase
7724
 *
7725
 * Description: Load the CDB into the automation and start it up.
7726
 *
7727
 *---------------------------------------------------------------------*/
7728
 
7729
#if defined(OS2)
7730
void far phaseCommand(ULONG p_port, UCHAR p_card)
7731
#else
7732
#if defined(DOS)
7733
void phaseCommand(USHORT p_port, UCHAR p_card)
7734
#else
7735
void phaseCommand(ULONG p_port, UCHAR p_card)
7736
#endif
7737
#endif
7738
{
7739
   PSCCB currSCCB;
7740
#if defined(DOS)
7741
   USHORT cdb_reg;
7742
#else
7743
   ULONG cdb_reg;
7744
#endif
7745
   UCHAR i;
7746
 
7747
   currSCCB = BL_Card[p_card].currentSCCB;
7748
 
7749
   if (currSCCB->OperationCode == RESET_COMMAND) {
7750
 
7751
      currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
7752
      currSCCB->CdbLength = SIX_BYTE_CMD;
7753
      }
7754
 
7755
   WR_HARPOON(p_port+hp_scsisig, 0x00);
7756
 
7757
   ARAM_ACCESS(p_port);
7758
 
7759
 
7760
   cdb_reg = p_port + CMD_STRT;
7761
 
7762
   for (i=0; i < currSCCB->CdbLength; i++) {
7763
 
7764
      if (currSCCB->OperationCode == RESET_COMMAND)
7765
 
7766
         WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
7767
 
7768
      else
7769
         WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
7770
      cdb_reg +=2;
7771
      }
7772
 
7773
   if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
7774
      WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+    NP));
7775
 
7776
   WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT));
7777
 
7778
   currSCCB->Sccb_scsistat = COMMAND_ST;
7779
 
7780
   WR_HARPOON(p_port+hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
7781
   SGRAM_ACCESS(p_port);
7782
}
7783
 
7784
 
7785
/*---------------------------------------------------------------------
7786
 *
7787
 * Function: Status phase
7788
 *
7789
 * Description: Bring in the status and command complete message bytes
7790
 *
7791
 *---------------------------------------------------------------------*/
7792
 
7793
#if defined(OS2)
7794
void far phaseStatus(ULONG port, UCHAR p_card)
7795
#else
7796
#if defined(DOS)
7797
void phaseStatus(USHORT port, UCHAR p_card)
7798
#else
7799
void phaseStatus(ULONG port, UCHAR p_card)
7800
#endif
7801
#endif
7802
{
7803
   /* Start-up the automation to finish off this command and let the
7804
      isr handle the interrupt for command complete when it comes in.
7805
      We could wait here for the interrupt to be generated?
7806
    */
7807
 
7808
   WR_HARPOON(port+hp_scsisig, 0x00);
7809
 
7810
   WR_HARPOON(port+hp_autostart_0, (AUTO_IMMED+END_DATA_START));
7811
}
7812
 
7813
 
7814
/*---------------------------------------------------------------------
7815
 *
7816
 * Function: Phase Message Out
7817
 *
7818
 * Description: Send out our message (if we have one) and handle whatever
7819
 *              else is involed.
7820
 *
7821
 *---------------------------------------------------------------------*/
7822
 
7823
#if defined(OS2)
7824
void far phaseMsgOut(ULONG port, UCHAR p_card)
7825
#else
7826
#if defined(DOS)
7827
void phaseMsgOut(USHORT port, UCHAR p_card)
7828
#else
7829
void phaseMsgOut(ULONG port, UCHAR p_card)
7830
#endif
7831
#endif
7832
{
7833
        UCHAR message,scsiID;
7834
        PSCCB currSCCB;
7835
        PSCCBMgr_tar_info currTar_Info;
7836
 
7837
        currSCCB = BL_Card[p_card].currentSCCB;
7838
 
7839
        if (currSCCB != NULL) {
7840
 
7841
                message = currSCCB->Sccb_scsimsg;
7842
                scsiID = currSCCB->TargID;
7843
 
7844
                if (message == SMDEV_RESET)
7845
                {
7846
 
7847
 
7848
                        currTar_Info = &sccbMgrTbl[p_card][scsiID];
7849
                        currTar_Info->TarSyncCtrl = 0;
7850
                        sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
7851
 
7852
                        if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_SYNC_MASK)
7853
                        {
7854
 
7855
                                sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_SYNC_MASK;
7856
 
7857
                        }
7858
 
7859
                        if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_WIDE_SCSI)
7860
                        {
7861
 
7862
                                sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_WIDE_MASK;
7863
                        }
7864
 
7865
 
7866
                        queueFlushSccb(p_card,SCCB_COMPLETE);
7867
                        SccbMgrTableInitTarget(p_card,scsiID);
7868
                }
7869
                else if (currSCCB->Sccb_scsistat == ABORT_ST)
7870
                {
7871
                        currSCCB->HostStatus = SCCB_COMPLETE;
7872
                        if(BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != NULL)
7873
                        {
7874
                                BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
7875
                                sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
7876
                        }
7877
 
7878
                }
7879
 
7880
                else if (currSCCB->Sccb_scsistat < COMMAND_ST)
7881
                {
7882
 
7883
 
7884
                        if(message == SMNO_OP)
7885
                        {
7886
                                currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
7887
 
7888
                                ssel(port,p_card);
7889
                                return;
7890
                        }
7891
                }
7892
                else
7893
                {
7894
 
7895
 
7896
                        if (message == SMABORT)
7897
 
7898
                                queueFlushSccb(p_card,SCCB_COMPLETE);
7899
                }
7900
 
7901
        }
7902
        else
7903
        {
7904
                message = SMABORT;
7905
        }
7906
 
7907
        WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
7908
 
7909
 
7910
        WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
7911
 
7912
        WR_HARPOON(port+hp_scsidata_0,message);
7913
 
7914
        WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
7915
 
7916
        ACCEPT_MSG(port);
7917
 
7918
        WR_HARPOON(port+hp_portctrl_0, 0x00);
7919
 
7920
        if ((message == SMABORT) || (message == SMDEV_RESET) ||
7921
                                (message == SMABORT_TAG) )
7922
        {
7923
 
7924
                while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
7925
 
7926
                if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
7927
                {
7928
                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
7929
 
7930
                        if (currSCCB != NULL)
7931
                        {
7932
 
7933
                                if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
7934
                                        ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
7935
                                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
7936
                                else
7937
                                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
7938
 
7939
                                queueCmdComplete(&BL_Card[p_card],currSCCB, p_card);
7940
                        }
7941
 
7942
                        else
7943
                        {
7944
                                BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
7945
                        }
7946
                }
7947
 
7948
                else
7949
                {
7950
 
7951
                        sxfrp(port,p_card);
7952
                }
7953
        }
7954
 
7955
        else
7956
        {
7957
 
7958
                if(message == SMPARITY)
7959
                {
7960
                        currSCCB->Sccb_scsimsg = SMNO_OP;
7961
                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
7962
                }
7963
                else
7964
                {
7965
                        sxfrp(port,p_card);
7966
                }
7967
        }
7968
}
7969
 
7970
 
7971
/*---------------------------------------------------------------------
7972
 *
7973
 * Function: Message In phase
7974
 *
7975
 * Description: Bring in the message and determine what to do with it.
7976
 *
7977
 *---------------------------------------------------------------------*/
7978
 
7979
#if defined(OS2)
7980
void far phaseMsgIn(ULONG port, UCHAR p_card)
7981
#else
7982
#if defined(DOS)
7983
void phaseMsgIn(USHORT port, UCHAR p_card)
7984
#else
7985
void phaseMsgIn(ULONG port, UCHAR p_card)
7986
#endif
7987
#endif
7988
{
7989
        UCHAR message;
7990
        PSCCB currSCCB;
7991
 
7992
        currSCCB = BL_Card[p_card].currentSCCB;
7993
 
7994
        if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT)
7995
        {
7996
 
7997
                phaseChkFifo(port, p_card);
7998
        }
7999
 
8000
        message = RD_HARPOON(port+hp_scsidata_0);
8001
        if ((message == SMDISC) || (message == SMSAVE_DATA_PTR))
8002
        {
8003
 
8004
                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+END_DATA_START));
8005
 
8006
        }
8007
 
8008
        else
8009
        {
8010
 
8011
                message = sfm(port,currSCCB);
8012
                if (message)
8013
                {
8014
 
8015
 
8016
                        sdecm(message,port,p_card);
8017
 
8018
                }
8019
                else
8020
                {
8021
                        if(currSCCB->Sccb_scsimsg != SMPARITY)
8022
                                ACCEPT_MSG(port);
8023
                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
8024
                }
8025
        }
8026
 
8027
}
8028
 
8029
 
8030
/*---------------------------------------------------------------------
8031
 *
8032
 * Function: Illegal phase
8033
 *
8034
 * Description: Target switched to some illegal phase, so all we can do
8035
 *              is report an error back to the host (if that is possible)
8036
 *              and send an ABORT message to the misbehaving target.
8037
 *
8038
 *---------------------------------------------------------------------*/
8039
 
8040
#if defined(OS2)
8041
void far phaseIllegal(ULONG port, UCHAR p_card)
8042
#else
8043
#if defined(DOS)
8044
void phaseIllegal(USHORT port, UCHAR p_card)
8045
#else
8046
void phaseIllegal(ULONG port, UCHAR p_card)
8047
#endif
8048
#endif
8049
{
8050
   PSCCB currSCCB;
8051
 
8052
   currSCCB = BL_Card[p_card].currentSCCB;
8053
 
8054
   WR_HARPOON(port+hp_scsisig, RD_HARPOON(port+hp_scsisig));
8055
   if (currSCCB != NULL) {
8056
 
8057
      currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
8058
      currSCCB->Sccb_scsistat = ABORT_ST;
8059
      currSCCB->Sccb_scsimsg = SMABORT;
8060
      }
8061
 
8062
   ACCEPT_MSG_ATN(port);
8063
}
8064
 
8065
 
8066
 
8067
/*---------------------------------------------------------------------
8068
 *
8069
 * Function: Phase Check FIFO
8070
 *
8071
 * Description: Make sure data has been flushed from both FIFOs and abort
8072
 *              the operations if necessary.
8073
 *
8074
 *---------------------------------------------------------------------*/
8075
 
8076
#if defined(DOS)
8077
void phaseChkFifo(USHORT port, UCHAR p_card)
8078
#else
8079
void phaseChkFifo(ULONG port, UCHAR p_card)
8080
#endif
8081
{
8082
   ULONG xfercnt;
8083
   PSCCB currSCCB;
8084
 
8085
   currSCCB = BL_Card[p_card].currentSCCB;
8086
 
8087
   if (currSCCB->Sccb_scsistat == DATA_IN_ST)
8088
      {
8089
 
8090
      while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
8091
              (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
8092
 
8093
 
8094
      if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
8095
         {
8096
              currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
8097
 
8098
              currSCCB->Sccb_XferCnt = 0;
8099
 
8100
              if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
8101
                    (currSCCB->HostStatus == SCCB_COMPLETE))
8102
            {
8103
                 currSCCB->HostStatus = SCCB_PARITY_ERR;
8104
                 WRW_HARPOON((port+hp_intstat), PARITY);
8105
                 }
8106
 
8107
              hostDataXferAbort(port,p_card,currSCCB);
8108
 
8109
              dataXferProcessor(port, &BL_Card[p_card]);
8110
 
8111
              while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
8112
                 (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
8113
 
8114
              }
8115
      }  /*End Data In specific code. */
8116
 
8117
 
8118
 
8119
#if defined(DOS)
8120
   asm { mov dx,port;
8121
      add dx,hp_xfercnt_2;
8122
      in  al,dx;
8123
      dec dx;
8124
      xor ah,ah;
8125
      mov word ptr xfercnt+2,ax;
8126
      in  al,dx;
8127
      dec dx;
8128
      mov ah,al;
8129
      in  al,dx;
8130
      mov word ptr xfercnt,ax;
8131
      }
8132
#else
8133
   GET_XFER_CNT(port,xfercnt);
8134
#endif
8135
 
8136
 
8137
   WR_HARPOON(port+hp_xfercnt_0, 0x00);
8138
 
8139
 
8140
   WR_HARPOON(port+hp_portctrl_0, 0x00);
8141
 
8142
   currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
8143
 
8144
   currSCCB->Sccb_XferCnt = xfercnt;
8145
 
8146
   if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
8147
      (currSCCB->HostStatus == SCCB_COMPLETE)) {
8148
 
8149
      currSCCB->HostStatus = SCCB_PARITY_ERR;
8150
      WRW_HARPOON((port+hp_intstat), PARITY);
8151
      }
8152
 
8153
 
8154
   hostDataXferAbort(port,p_card,currSCCB);
8155
 
8156
 
8157
   WR_HARPOON(port+hp_fifowrite, 0x00);
8158
   WR_HARPOON(port+hp_fiforead, 0x00);
8159
   WR_HARPOON(port+hp_xferstat, 0x00);
8160
 
8161
   WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
8162
}
8163
 
8164
 
8165
/*---------------------------------------------------------------------
8166
 *
8167
 * Function: Phase Bus Free
8168
 *
8169
 * Description: We just went bus free so figure out if it was
8170
 *              because of command complete or from a disconnect.
8171
 *
8172
 *---------------------------------------------------------------------*/
8173
#if defined(DOS)
8174
void phaseBusFree(USHORT port, UCHAR p_card)
8175
#else
8176
void phaseBusFree(ULONG port, UCHAR p_card)
8177
#endif
8178
{
8179
   PSCCB currSCCB;
8180
 
8181
   currSCCB = BL_Card[p_card].currentSCCB;
8182
 
8183
   if (currSCCB != NULL)
8184
      {
8185
 
8186
      DISABLE_AUTO(port);
8187
 
8188
 
8189
      if (currSCCB->OperationCode == RESET_COMMAND)
8190
         {
8191
 
8192
                        if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8193
                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
8194
                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
8195
                        else
8196
                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
8197
 
8198
              queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
8199
 
8200
              queueSearchSelect(&BL_Card[p_card],p_card);
8201
 
8202
              }
8203
 
8204
      else if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
8205
              {
8206
              sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
8207
                                 (UCHAR)SYNC_SUPPORTED;
8208
              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
8209
              }
8210
 
8211
      else if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
8212
              {
8213
              sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
8214
                            (sccbMgrTbl[p_card][currSCCB->TargID].
8215
                   TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
8216
 
8217
              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
8218
              }
8219
 
8220
#if !defined(DOS)
8221
      else if(currSCCB->Sccb_scsistat == SELECT_Q_ST)
8222
              {
8223
              /* Make sure this is not a phony BUS_FREE.  If we were
8224
              reselected or if BUSY is NOT on then this is a
8225
              valid BUS FREE.  SRR Wednesday, 5/10/1995.     */
8226
 
8227
              if ((!(RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ||
8228
                 (RDW_HARPOON((port+hp_intstat)) & RSEL))
8229
                 {
8230
                 sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_TAG_Q_MASK;
8231
                 sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= TAG_Q_REJECT;
8232
                 }
8233
 
8234
              else
8235
            {
8236
                 return;
8237
                 }
8238
         }
8239
#endif
8240
 
8241
      else
8242
              {
8243
 
8244
              currSCCB->Sccb_scsistat = BUS_FREE_ST;
8245
 
8246
         if (!currSCCB->HostStatus)
8247
                 {
8248
                 currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
8249
                 }
8250
 
8251
                        if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8252
                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
8253
                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
8254
                        else
8255
                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
8256
 
8257
              queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
8258
              return;
8259
              }
8260
 
8261
 
8262
      BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8263
 
8264
      } /*end if !=null */
8265
}
8266
 
8267
 
8268
 
8269
 
8270
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
8271
/*----------------------------------------------------------------------
8272
 *
8273
 *
8274
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
8275
 *
8276
 *   This file is available under both the GNU General Public License
8277
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
8278
 *
8279
 *   $Workfile:   automate.c  $
8280
 *
8281
 *   Description:  Functions relating to programming the automation of
8282
 *                 the HARPOON.
8283
 *
8284
 *   $Date: 2005-12-20 10:17:45 $
8285
 *
8286
 *   $Revision: 1.1 $
8287
 *
8288
 *----------------------------------------------------------------------*/
8289
 
8290
/*#include <globals.h>*/
8291
 
8292
#if (FW_TYPE==_UCB_MGR_)
8293
        /*#include <budi.h>*/
8294
#endif
8295
 
8296
/*#include <sccbmgr.h>*/
8297
/*#include <blx30.h>*/
8298
/*#include <target.h>*/
8299
/*#include <scsi2.h>*/
8300
/*#include <harpoon.h>*/
8301
 
8302
/*
8303
extern SCCBCARD BL_Card[MAX_CARDS];
8304
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
8305
extern SCCBCARD BL_Card[MAX_CARDS];
8306
*/
8307
 
8308
/*---------------------------------------------------------------------
8309
 *
8310
 * Function: Auto Load Default Map
8311
 *
8312
 * Description: Load the Automation RAM with the defualt map values.
8313
 *
8314
 *---------------------------------------------------------------------*/
8315
#if defined(DOS)
8316
void autoLoadDefaultMap(USHORT p_port)
8317
#else
8318
void autoLoadDefaultMap(ULONG p_port)
8319
#endif
8320
{
8321
#if defined(DOS)
8322
   USHORT map_addr;
8323
#else
8324
   ULONG map_addr;
8325
#endif
8326
 
8327
   ARAM_ACCESS(p_port);
8328
   map_addr = p_port + hp_aramBase;
8329
 
8330
   WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0xC0));  /*ID MESSAGE */
8331
   map_addr +=2;
8332
   WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x20));  /*SIMPLE TAG QUEUEING MSG */
8333
   map_addr +=2;
8334
   WRW_HARPOON(map_addr, RAT_OP);                   /*RESET ATTENTION */
8335
   map_addr +=2;
8336
   WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x00));  /*TAG ID MSG */
8337
   map_addr +=2;
8338
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 0 */
8339
   map_addr +=2;
8340
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 1 */
8341
   map_addr +=2;
8342
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 2 */
8343
   map_addr +=2;
8344
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 3 */
8345
   map_addr +=2;
8346
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 4 */
8347
   map_addr +=2;
8348
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 5 */
8349
   map_addr +=2;
8350
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 6 */
8351
   map_addr +=2;
8352
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 7 */
8353
   map_addr +=2;
8354
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 8 */
8355
   map_addr +=2;
8356
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 9 */
8357
   map_addr +=2;
8358
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 10 */
8359
   map_addr +=2;
8360
   WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 11 */
8361
   map_addr +=2;
8362
   WRW_HARPOON(map_addr, (CPE_OP+ADATA_OUT+ DINT)); /*JUMP IF DATA OUT */
8363
   map_addr +=2;
8364
   WRW_HARPOON(map_addr, (TCB_OP+FIFO_0+ DI));     /*JUMP IF NO DATA IN FIFO */
8365
   map_addr +=2;                                   /*This means AYNC DATA IN */
8366
   WRW_HARPOON(map_addr, (SSI_OP+   SSI_IDO_STRT)); /*STOP AND INTERRUPT */
8367
   map_addr +=2;
8368
   WRW_HARPOON(map_addr, (CPE_OP+ADATA_IN+DINT));   /*JUMP IF NOT DATA IN PHZ */
8369
   map_addr +=2;
8370
   WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  ST));    /*IF NOT MSG IN CHECK 4 DATA IN */
8371
   map_addr +=2;
8372
   WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x02));  /*SAVE DATA PTR MSG? */
8373
   map_addr +=2;
8374
   WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   DC));    /*GO CHECK FOR DISCONNECT MSG */
8375
   map_addr +=2;
8376
   WRW_HARPOON(map_addr, (MRR_OP+SDATA+    D_AR1)); /*SAVE DATA PTRS MSG */
8377
   map_addr +=2;
8378
   WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  ST));    /*IF NOT MSG IN CHECK DATA IN */
8379
   map_addr +=2;
8380
   WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x04));  /*DISCONNECT MSG? */
8381
   map_addr +=2;
8382
   WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   UNKNWN));/*UKNKNOWN MSG */
8383
   map_addr +=2;
8384
   WRW_HARPOON(map_addr, (MRR_OP+SDATA+    D_BUCKET));/*XFER DISCONNECT MSG */
8385
   map_addr +=2;
8386
   WRW_HARPOON(map_addr, (SSI_OP+          SSI_ITAR_DISC));/*STOP AND INTERRUPT */
8387
   map_addr +=2;
8388
   WRW_HARPOON(map_addr, (CPN_OP+ASTATUS+  UNKNWN));/*JUMP IF NOT STATUS PHZ. */
8389
   map_addr +=2;
8390
   WRW_HARPOON(map_addr, (MRR_OP+SDATA+  D_AR0));   /*GET STATUS BYTE */
8391
   map_addr +=2;
8392
   WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  CC));    /*ERROR IF NOT MSG IN PHZ */
8393
   map_addr +=2;
8394
   WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x00));  /*CHECK FOR CMD COMPLETE MSG. */
8395
   map_addr +=2;
8396
   WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   CC));    /*ERROR IF NOT CMD COMPLETE MSG. */
8397
   map_addr +=2;
8398
   WRW_HARPOON(map_addr, (MRR_OP+SDATA+  D_BUCKET));/*GET CMD COMPLETE MSG */
8399
   map_addr +=2;
8400
   WRW_HARPOON(map_addr, (SSI_OP+       SSI_ICMD_COMP));/*END OF COMMAND */
8401
   map_addr +=2;
8402
 
8403
   WRW_HARPOON(map_addr, (SSI_OP+ SSI_IUNKWN));  /*RECEIVED UNKNOWN MSG BYTE */
8404
   map_addr +=2;
8405
   WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC));  /*NO COMMAND COMPLETE AFTER STATUS */
8406
   map_addr +=2;
8407
   WRW_HARPOON(map_addr, (SSI_OP+ SSI_ITICKLE)); /*BIOS Tickled the Mgr */
8408
   map_addr +=2;
8409
   WRW_HARPOON(map_addr, (SSI_OP+ SSI_IRFAIL));  /*EXPECTED ID/TAG MESSAGES AND */
8410
   map_addr +=2;                             /* DIDN'T GET ONE */
8411
   WRW_HARPOON(map_addr, (CRR_OP+AR3+  S_IDREG)); /* comp SCSI SEL ID & AR3*/
8412
   map_addr +=2;
8413
   WRW_HARPOON(map_addr, (BRH_OP+EQUAL+   0x00));    /*SEL ID OK then Conti. */
8414
   map_addr +=2;
8415
   WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC));  /*NO COMMAND COMPLETE AFTER STATUS */
8416
 
8417
 
8418
 
8419
   SGRAM_ACCESS(p_port);
8420
}
8421
 
8422
/*---------------------------------------------------------------------
8423
 *
8424
 * Function: Auto Command Complete
8425
 *
8426
 * Description: Post command back to host and find another command
8427
 *              to execute.
8428
 *
8429
 *---------------------------------------------------------------------*/
8430
 
8431
#if defined(DOS)
8432
void autoCmdCmplt(USHORT p_port, UCHAR p_card)
8433
#else
8434
void autoCmdCmplt(ULONG p_port, UCHAR p_card)
8435
#endif
8436
{
8437
   PSCCB currSCCB;
8438
   UCHAR status_byte;
8439
 
8440
   currSCCB = BL_Card[p_card].currentSCCB;
8441
 
8442
   status_byte = RD_HARPOON(p_port+hp_gp_reg_0);
8443
 
8444
   sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = FALSE;
8445
 
8446
   if (status_byte != SSGOOD) {
8447
 
8448
      if (status_byte == SSQ_FULL) {
8449
 
8450
 
8451
                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8452
                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8453
                        {
8454
                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8455
                                if(BL_Card[p_card].discQCount != 0)
8456
                                        BL_Card[p_card].discQCount--;
8457
                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8458
                        }
8459
                        else
8460
                        {
8461
                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8462
                                if(currSCCB->Sccb_tag)
8463
                                {
8464
                                        if(BL_Card[p_card].discQCount != 0)
8465
                                                BL_Card[p_card].discQCount--;
8466
                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8467
                                }else
8468
                                {
8469
                                        if(BL_Card[p_card].discQCount != 0)
8470
                                                BL_Card[p_card].discQCount--;
8471
                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8472
                                }
8473
                        }
8474
 
8475
         currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
8476
 
8477
         queueSelectFail(&BL_Card[p_card],p_card);
8478
 
8479
         return;
8480
         }
8481
 
8482
      if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
8483
         {
8484
         sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
8485
            (UCHAR)SYNC_SUPPORTED;
8486
 
8487
              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
8488
         BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8489
 
8490
                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8491
                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8492
                        {
8493
                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8494
                                if(BL_Card[p_card].discQCount != 0)
8495
                                        BL_Card[p_card].discQCount--;
8496
                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8497
                        }
8498
                        else
8499
                        {
8500
                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8501
                                if(currSCCB->Sccb_tag)
8502
                                {
8503
                                        if(BL_Card[p_card].discQCount != 0)
8504
                                                BL_Card[p_card].discQCount--;
8505
                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8506
                                }else
8507
                                {
8508
                                        if(BL_Card[p_card].discQCount != 0)
8509
                                                BL_Card[p_card].discQCount--;
8510
                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8511
                                }
8512
                        }
8513
         return;
8514
 
8515
         }
8516
 
8517
      if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
8518
         {
8519
 
8520
              sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
8521
                 (sccbMgrTbl[p_card][currSCCB->TargID].
8522
                 TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
8523
 
8524
              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
8525
         BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8526
 
8527
                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8528
                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8529
                        {
8530
                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8531
                                if(BL_Card[p_card].discQCount != 0)
8532
                                        BL_Card[p_card].discQCount--;
8533
                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8534
                        }
8535
                        else
8536
                        {
8537
                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8538
                                if(currSCCB->Sccb_tag)
8539
                                {
8540
                                        if(BL_Card[p_card].discQCount != 0)
8541
                                                BL_Card[p_card].discQCount--;
8542
                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8543
                                }else
8544
                                {
8545
                                        if(BL_Card[p_card].discQCount != 0)
8546
                                                BL_Card[p_card].discQCount--;
8547
                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8548
                                }
8549
                        }
8550
         return;
8551
 
8552
         }
8553
 
8554
           if (status_byte == SSCHECK)
8555
                {
8556
                        if(BL_Card[p_card].globalFlags & F_DO_RENEGO)
8557
                        {
8558
                                if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_SYNC_MASK)
8559
                                {
8560
                                        sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_SYNC_MASK;
8561
                                }
8562
                                if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_WIDE_SCSI)
8563
                                {
8564
                                        sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_WIDE_MASK;
8565
                                }
8566
                        }
8567
                }
8568
 
8569
      if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
8570
 
8571
         currSCCB->SccbStatus = SCCB_ERROR;
8572
         currSCCB->TargetStatus = status_byte;
8573
 
8574
         if (status_byte == SSCHECK) {
8575
 
8576
            sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA
8577
               = TRUE;
8578
 
8579
 
8580
#if (FW_TYPE==_SCCB_MGR_)
8581
            if (currSCCB->RequestSenseLength != NO_AUTO_REQUEST_SENSE) {
8582
 
8583
               if (currSCCB->RequestSenseLength == 0)
8584
                  currSCCB->RequestSenseLength = 14;
8585
 
8586
               ssenss(&BL_Card[p_card]);
8587
               BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8588
 
8589
                                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8590
                                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8591
                                        {
8592
                                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8593
                                                if(BL_Card[p_card].discQCount != 0)
8594
                                                        BL_Card[p_card].discQCount--;
8595
                                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8596
                                        }
8597
                                        else
8598
                                        {
8599
                              sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8600
                                                if(currSCCB->Sccb_tag)
8601
                                                {
8602
                                                        if(BL_Card[p_card].discQCount != 0)
8603
                                                                BL_Card[p_card].discQCount--;
8604
                                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8605
                                                }else
8606
                                                {
8607
                                                        if(BL_Card[p_card].discQCount != 0)
8608
                                                                BL_Card[p_card].discQCount--;
8609
                                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8610
                                                }
8611
                                        }
8612
               return;
8613
               }
8614
#else
8615
                                   if ((!(currSCCB->Sccb_ucb_ptr->UCB_opcode & OPC_NO_AUTO_SENSE)) &&
8616
                                        (currSCCB->RequestSenseLength))
8617
                                   {
8618
                                        ssenss(&BL_Card[p_card]);
8619
                                      BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8620
 
8621
                                                if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8622
                                                        ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8623
                                                {
8624
                                   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8625
                                                        if(BL_Card[p_card].discQCount != 0)
8626
                                                                BL_Card[p_card].discQCount--;
8627
                                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8628
                                                }
8629
                                                else
8630
                                                {
8631
                                   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8632
                                                        if(currSCCB->Sccb_tag)
8633
                                                        {
8634
                                                                if(BL_Card[p_card].discQCount != 0)
8635
                                                                        BL_Card[p_card].discQCount--;
8636
                                                                BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8637
                                                        }else
8638
                                                        {
8639
                                                                if(BL_Card[p_card].discQCount != 0)
8640
                                                                        BL_Card[p_card].discQCount--;
8641
                                                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8642
                                                        }
8643
                                                }
8644
                                      return;
8645
                                   }
8646
 
8647
#endif
8648
            }
8649
         }
8650
      }
8651
 
8652
 
8653
        if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8654
                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
8655
           sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
8656
        else
8657
           sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
8658
 
8659
 
8660
   queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
8661
}
8662
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
8663
/*----------------------------------------------------------------------
8664
 *
8665
 *
8666
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
8667
 *
8668
 *   This file is available under both the GNU General Public License
8669
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
8670
 *
8671
 *   $Workfile:   busmstr.c  $
8672
 *
8673
 *   Description:  Functions to start, stop, and abort BusMaster operations.
8674
 *
8675
 *   $Date: 2005-12-20 10:17:45 $
8676
 *
8677
 *   $Revision: 1.1 $
8678
 *
8679
 *----------------------------------------------------------------------*/
8680
 
8681
/*#include <globals.h>*/
8682
 
8683
#if (FW_TYPE==_UCB_MGR_)
8684
        /*#include <budi.h>*/
8685
#endif
8686
 
8687
/*#include <sccbmgr.h>*/
8688
/*#include <blx30.h>*/
8689
/*#include <target.h>*/
8690
/*#include <scsi2.h>*/
8691
/*#include <harpoon.h>*/
8692
 
8693
 
8694
/*
8695
extern SCCBCARD BL_Card[MAX_CARDS];
8696
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
8697
*/
8698
 
8699
#define SHORT_WAIT   0x0000000F
8700
#define LONG_WAIT    0x0000FFFFL
8701
 
8702
#if defined(BUGBUG)
8703
void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
8704
#endif
8705
 
8706
/*---------------------------------------------------------------------
8707
 *
8708
 * Function: Data Transfer Processor
8709
 *
8710
 * Description: This routine performs two tasks.
8711
 *              (1) Start data transfer by calling HOST_DATA_XFER_START
8712
 *              function.  Once data transfer is started, (2) Depends
8713
 *              on the type of data transfer mode Scatter/Gather mode
8714
 *              or NON Scatter/Gather mode.  In NON Scatter/Gather mode,
8715
 *              this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
8716
 *              data transfer done.  In Scatter/Gather mode, this routine
8717
 *              checks bus master command complete and dual rank busy
8718
 *              bit to keep chaining SC transfer command.  Similarly,
8719
 *              in Scatter/Gather mode, it checks Sccb_MGRFlag
8720
 *              (F_HOST_XFER_ACT bit) for data transfer done.
8721
 *
8722
 *---------------------------------------------------------------------*/
8723
 
8724
#if defined(DOS)
8725
void dataXferProcessor(USHORT port, PSCCBcard pCurrCard)
8726
#else
8727
void dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
8728
#endif
8729
{
8730
   PSCCB currSCCB;
8731
 
8732
   currSCCB = pCurrCard->currentSCCB;
8733
 
8734
      if (currSCCB->Sccb_XferState & F_SG_XFER)
8735
                        {
8736
                        if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
8737
 
8738
                                {
8739
                        currSCCB->Sccb_sgseg += (UCHAR)SG_BUF_CNT;
8740
                currSCCB->Sccb_SGoffset = 0x00;
8741
                                }
8742
                        pCurrCard->globalFlags |= F_HOST_XFER_ACT;
8743
 
8744
         busMstrSGDataXferStart(port, currSCCB);
8745
                        }
8746
 
8747
      else
8748
                        {
8749
                        if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT))
8750
                                {
8751
                                pCurrCard->globalFlags |= F_HOST_XFER_ACT;
8752
 
8753
                busMstrDataXferStart(port, currSCCB);
8754
                }
8755
                        }
8756
}
8757
 
8758
 
8759
/*---------------------------------------------------------------------
8760
 *
8761
 * Function: BusMaster Scatter Gather Data Transfer Start
8762
 *
8763
 * Description:
8764
 *
8765
 *---------------------------------------------------------------------*/
8766
#if defined(DOS)
8767
void busMstrSGDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
8768
#else
8769
void busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
8770
#endif
8771
{
8772
   ULONG count,addr,tmpSGCnt;
8773
   UINT sg_index;
8774
   UCHAR sg_count, i;
8775
#if defined(DOS)
8776
   USHORT reg_offset;
8777
#else
8778
   ULONG reg_offset;
8779
#endif
8780
 
8781
 
8782
   if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
8783
 
8784
      count =  ((ULONG) HOST_RD_CMD)<<24;
8785
      }
8786
 
8787
   else {
8788
      count =  ((ULONG) HOST_WRT_CMD)<<24;
8789
      }
8790
 
8791
   sg_count = 0;
8792
   tmpSGCnt = 0;
8793
   sg_index = pcurrSCCB->Sccb_sgseg;
8794
   reg_offset = hp_aramBase;
8795
 
8796
 
8797
        i = (UCHAR) (RD_HARPOON(p_port+hp_page_ctrl) & ~(SGRAM_ARAM|SCATTER_EN));
8798
 
8799
 
8800
        WR_HARPOON(p_port+hp_page_ctrl, i);
8801
 
8802
   while ((sg_count < (UCHAR)SG_BUF_CNT) &&
8803
      ((ULONG)(sg_index * (UINT)SG_ELEMENT_SIZE) < pcurrSCCB->DataLength) ) {
8804
 
8805
#if defined(COMPILER_16_BIT) && !defined(DOS)
8806
      tmpSGCnt += *(((ULONG far *)pcurrSCCB->DataPointer)+
8807
         (sg_index * 2));
8808
 
8809
      count |= *(((ULONG far *)pcurrSCCB->DataPointer)+
8810
         (sg_index * 2));
8811
 
8812
      addr = *(((ULONG far *)pcurrSCCB->DataPointer)+
8813
         ((sg_index * 2) + 1));
8814
 
8815
#else
8816
      tmpSGCnt += *(((ULONG *)pcurrSCCB->DataPointer)+
8817
         (sg_index * 2));
8818
 
8819
      count |= *(((ULONG *)pcurrSCCB->DataPointer)+
8820
         (sg_index * 2));
8821
 
8822
      addr = *(((ULONG *)pcurrSCCB->DataPointer)+
8823
         ((sg_index * 2) + 1));
8824
#endif
8825
 
8826
 
8827
      if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
8828
 
8829
         addr += ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
8830
         count = (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
8831
 
8832
         tmpSGCnt = count & 0x00FFFFFFL;
8833
         }
8834
 
8835
      WR_HARP32(p_port,reg_offset,addr);
8836
      reg_offset +=4;
8837
 
8838
      WR_HARP32(p_port,reg_offset,count);
8839
      reg_offset +=4;
8840
 
8841
      count &= 0xFF000000L;
8842
      sg_index++;
8843
      sg_count++;
8844
 
8845
      } /*End While */
8846
 
8847
   pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
8848
 
8849
   WR_HARPOON(p_port+hp_sg_addr,(sg_count<<4));
8850
 
8851
   if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
8852
 
8853
      WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
8854
 
8855
 
8856
      WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
8857
      WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
8858
      }
8859
 
8860
   else {
8861
 
8862
 
8863
      if ((!(RD_HARPOON(p_port+hp_synctarg_0) & NARROW_SCSI)) &&
8864
         (tmpSGCnt & 0x000000001))
8865
         {
8866
 
8867
         pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
8868
         tmpSGCnt--;
8869
         }
8870
 
8871
 
8872
      WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
8873
 
8874
      WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
8875
      WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
8876
      }
8877
 
8878
 
8879
   WR_HARPOON(p_port+hp_page_ctrl, (UCHAR) (i | SCATTER_EN));
8880
 
8881
}
8882
 
8883
 
8884
/*---------------------------------------------------------------------
8885
 *
8886
 * Function: BusMaster Data Transfer Start
8887
 *
8888
 * Description:
8889
 *
8890
 *---------------------------------------------------------------------*/
8891
#if defined(DOS)
8892
void busMstrDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
8893
#else
8894
void busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
8895
#endif
8896
{
8897
   ULONG addr,count;
8898
 
8899
   if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
8900
 
8901
      count = pcurrSCCB->Sccb_XferCnt;
8902
 
8903
      addr = (ULONG) pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
8904
      }
8905
 
8906
   else {
8907
      addr = pcurrSCCB->SensePointer;
8908
      count = pcurrSCCB->RequestSenseLength;
8909
 
8910
      }
8911
 
8912
#if defined(DOS)
8913
   asm { mov dx,p_port;
8914
         mov ax,word ptr count;
8915
         add dx,hp_xfer_cnt_lo;
8916
         out dx,al;
8917
         inc dx;
8918
         xchg ah,al
8919
         out dx,al;
8920
         inc dx;
8921
         mov ax,word ptr count+2;
8922
         out dx,al;
8923
         inc dx;
8924
         inc dx;
8925
         mov ax,word ptr addr;
8926
         out dx,al;
8927
         inc dx;
8928
         xchg ah,al
8929
         out dx,al;
8930
         inc dx;
8931
         mov ax,word ptr addr+2;
8932
         out dx,al;
8933
         inc dx;
8934
         xchg ah,al
8935
         out dx,al;
8936
         }
8937
 
8938
   WR_HARP32(p_port,hp_xfercnt_0,count);
8939
 
8940
#else
8941
   HP_SETUP_ADDR_CNT(p_port,addr,count);
8942
#endif
8943
 
8944
 
8945
   if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
8946
 
8947
      WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
8948
      WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
8949
 
8950
      WR_HARPOON(p_port+hp_xfer_cmd,
8951
         (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
8952
      }
8953
 
8954
   else {
8955
 
8956
      WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
8957
      WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
8958
 
8959
      WR_HARPOON(p_port+hp_xfer_cmd,
8960
         (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
8961
 
8962
      }
8963
}
8964
 
8965
 
8966
/*---------------------------------------------------------------------
8967
 *
8968
 * Function: BusMaster Timeout Handler
8969
 *
8970
 * Description: This function is called after a bus master command busy time
8971
 *               out is detected.  This routines issue halt state machine
8972
 *               with a software time out for command busy.  If command busy
8973
 *               is still asserted at the end of the time out, it issues
8974
 *               hard abort with another software time out.  It hard abort
8975
 *               command busy is also time out, it'll just give up.
8976
 *
8977
 *---------------------------------------------------------------------*/
8978
#if defined(DOS)
8979
UCHAR busMstrTimeOut(USHORT p_port)
8980
#else
8981
UCHAR busMstrTimeOut(ULONG p_port)
8982
#endif
8983
{
8984
   ULONG timeout;
8985
 
8986
   timeout = LONG_WAIT;
8987
 
8988
   WR_HARPOON(p_port+hp_sys_ctrl, HALT_MACH);
8989
 
8990
   while ((!(RD_HARPOON(p_port+hp_ext_status) & CMD_ABORTED)) && timeout--) {}
8991
 
8992
 
8993
 
8994
   if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
8995
      WR_HARPOON(p_port+hp_sys_ctrl, HARD_ABORT);
8996
 
8997
      timeout = LONG_WAIT;
8998
      while ((RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
8999
      }
9000
 
9001
   RD_HARPOON(p_port+hp_int_status);           /*Clear command complete */
9002
 
9003
   if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
9004
      return(TRUE);
9005
      }
9006
 
9007
   else {
9008
      return(FALSE);
9009
      }
9010
}
9011
 
9012
 
9013
/*---------------------------------------------------------------------
9014
 *
9015
 * Function: Host Data Transfer Abort
9016
 *
9017
 * Description: Abort any in progress transfer.
9018
 *
9019
 *---------------------------------------------------------------------*/
9020
#if defined(DOS)
9021
void hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
9022
#else
9023
void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
9024
#endif
9025
{
9026
 
9027
   ULONG timeout;
9028
   ULONG remain_cnt;
9029
   UINT sg_ptr;
9030
 
9031
   BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
9032
 
9033
   if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
9034
 
9035
 
9036
      if (!(RD_HARPOON(port+hp_int_status) & INT_CMD_COMPL)) {
9037
 
9038
         WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) | FLUSH_XFER_CNTR));
9039
         timeout = LONG_WAIT;
9040
 
9041
         while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
9042
 
9043
         WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) & ~FLUSH_XFER_CNTR));
9044
 
9045
         if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9046
 
9047
            if (busMstrTimeOut(port)) {
9048
 
9049
               if (pCurrSCCB->HostStatus == 0x00)
9050
 
9051
                  pCurrSCCB->HostStatus = SCCB_BM_ERR;
9052
 
9053
               }
9054
 
9055
            if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS)
9056
 
9057
               if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS)
9058
 
9059
                  if (pCurrSCCB->HostStatus == 0x00)
9060
 
9061
                     {
9062
                     pCurrSCCB->HostStatus = SCCB_BM_ERR;
9063
#if defined(BUGBUG)
9064
                     WR_HARPOON(port+hp_dual_addr_lo,
9065
                        RD_HARPOON(port+hp_ext_status));
9066
#endif
9067
                     }
9068
            }
9069
         }
9070
      }
9071
 
9072
   else if (pCurrSCCB->Sccb_XferCnt) {
9073
 
9074
      if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
9075
 
9076
 
9077
              WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
9078
            ~SCATTER_EN));
9079
 
9080
         WR_HARPOON(port+hp_sg_addr,0x00);
9081
 
9082
         sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
9083
 
9084
         if (sg_ptr > (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE)) {
9085
 
9086
            sg_ptr = (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
9087
            }
9088
 
9089
         remain_cnt = pCurrSCCB->Sccb_XferCnt;
9090
 
9091
         while (remain_cnt < 0x01000000L) {
9092
 
9093
            sg_ptr--;
9094
 
9095
#if defined(COMPILER_16_BIT) && !defined(DOS)
9096
            if (remain_cnt > (ULONG)(*(((ULONG far *)pCurrSCCB->
9097
               DataPointer) + (sg_ptr * 2)))) {
9098
 
9099
               remain_cnt -= (ULONG)(*(((ULONG far *)pCurrSCCB->
9100
                  DataPointer) + (sg_ptr * 2)));
9101
               }
9102
 
9103
#else
9104
            if (remain_cnt > (ULONG)(*(((ULONG *)pCurrSCCB->
9105
               DataPointer) + (sg_ptr * 2)))) {
9106
 
9107
               remain_cnt -= (ULONG)(*(((ULONG *)pCurrSCCB->
9108
                  DataPointer) + (sg_ptr * 2)));
9109
               }
9110
#endif
9111
 
9112
            else {
9113
 
9114
               break;
9115
               }
9116
            }
9117
 
9118
 
9119
 
9120
         if (remain_cnt < 0x01000000L) {
9121
 
9122
 
9123
            pCurrSCCB->Sccb_SGoffset = remain_cnt;
9124
 
9125
            pCurrSCCB->Sccb_sgseg = (USHORT)sg_ptr;
9126
 
9127
 
9128
            if ((ULONG)(sg_ptr * SG_ELEMENT_SIZE) == pCurrSCCB->DataLength
9129
                && (remain_cnt == 0))
9130
 
9131
               pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
9132
            }
9133
 
9134
         else {
9135
 
9136
 
9137
            if (pCurrSCCB->HostStatus == 0x00) {
9138
 
9139
               pCurrSCCB->HostStatus = SCCB_GROSS_FW_ERR;
9140
               }
9141
            }
9142
         }
9143
 
9144
 
9145
      if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
9146
 
9147
 
9148
         if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9149
 
9150
            busMstrTimeOut(port);
9151
            }
9152
 
9153
         else {
9154
 
9155
            if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
9156
 
9157
               if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
9158
 
9159
                  if (pCurrSCCB->HostStatus == 0x00) {
9160
 
9161
                     pCurrSCCB->HostStatus = SCCB_BM_ERR;
9162
#if defined(BUGBUG)
9163
                     WR_HARPOON(port+hp_dual_addr_lo,
9164
                        RD_HARPOON(port+hp_ext_status));
9165
#endif
9166
                     }
9167
                  }
9168
               }
9169
 
9170
            }
9171
         }
9172
 
9173
      else {
9174
 
9175
 
9176
         if ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) {
9177
 
9178
            timeout = SHORT_WAIT;
9179
 
9180
            while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
9181
               ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) &&
9182
               timeout--) {}
9183
            }
9184
 
9185
         if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9186
 
9187
            WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) |
9188
               FLUSH_XFER_CNTR));
9189
 
9190
            timeout = LONG_WAIT;
9191
 
9192
            while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
9193
               timeout--) {}
9194
 
9195
            WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) &
9196
               ~FLUSH_XFER_CNTR));
9197
 
9198
 
9199
            if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9200
 
9201
               if (pCurrSCCB->HostStatus == 0x00) {
9202
 
9203
                  pCurrSCCB->HostStatus = SCCB_BM_ERR;
9204
                  }
9205
 
9206
               busMstrTimeOut(port);
9207
               }
9208
            }
9209
 
9210
         if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
9211
 
9212
            if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
9213
 
9214
               if (pCurrSCCB->HostStatus == 0x00) {
9215
 
9216
                  pCurrSCCB->HostStatus = SCCB_BM_ERR;
9217
#if defined(BUGBUG)
9218
                  WR_HARPOON(port+hp_dual_addr_lo,
9219
                     RD_HARPOON(port+hp_ext_status));
9220
#endif
9221
                  }
9222
               }
9223
            }
9224
         }
9225
 
9226
      }
9227
 
9228
   else {
9229
 
9230
 
9231
      if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9232
 
9233
         timeout = LONG_WAIT;
9234
 
9235
         while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
9236
 
9237
         if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9238
 
9239
            if (pCurrSCCB->HostStatus == 0x00) {
9240
 
9241
               pCurrSCCB->HostStatus = SCCB_BM_ERR;
9242
               }
9243
 
9244
            busMstrTimeOut(port);
9245
            }
9246
         }
9247
 
9248
 
9249
      if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
9250
 
9251
         if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
9252
 
9253
            if (pCurrSCCB->HostStatus == 0x00) {
9254
 
9255
               pCurrSCCB->HostStatus = SCCB_BM_ERR;
9256
#if defined(BUGBUG)
9257
               WR_HARPOON(port+hp_dual_addr_lo,
9258
                  RD_HARPOON(port+hp_ext_status));
9259
#endif
9260
               }
9261
            }
9262
 
9263
         }
9264
 
9265
      if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
9266
 
9267
         WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
9268
                 ~SCATTER_EN));
9269
 
9270
         WR_HARPOON(port+hp_sg_addr,0x00);
9271
 
9272
         pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
9273
 
9274
         pCurrSCCB->Sccb_SGoffset = 0x00;
9275
 
9276
 
9277
         if ((ULONG)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
9278
            pCurrSCCB->DataLength) {
9279
 
9280
            pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
9281
 
9282
            pCurrSCCB->Sccb_sgseg = (USHORT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
9283
 
9284
            }
9285
         }
9286
 
9287
      else {
9288
 
9289
         if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
9290
 
9291
            pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
9292
         }
9293
      }
9294
 
9295
   WR_HARPOON(port+hp_int_mask,(INT_CMD_COMPL | SCSI_INTERRUPT));
9296
}
9297
 
9298
 
9299
 
9300
/*---------------------------------------------------------------------
9301
 *
9302
 * Function: Host Data Transfer Restart
9303
 *
9304
 * Description: Reset the available count due to a restore data
9305
 *              pointers message.
9306
 *
9307
 *---------------------------------------------------------------------*/
9308
void hostDataXferRestart(PSCCB currSCCB)
9309
{
9310
   ULONG data_count;
9311
   UINT  sg_index;
9312
#if defined(COMPILER_16_BIT) && !defined(DOS)
9313
   ULONG far *sg_ptr;
9314
#else
9315
   ULONG *sg_ptr;
9316
#endif
9317
 
9318
   if (currSCCB->Sccb_XferState & F_SG_XFER) {
9319
 
9320
      currSCCB->Sccb_XferCnt = 0;
9321
 
9322
      sg_index = 0xffff;         /*Index by long words into sg list. */
9323
      data_count = 0;            /*Running count of SG xfer counts. */
9324
 
9325
#if defined(COMPILER_16_BIT) && !defined(DOS)
9326
      sg_ptr = (ULONG far *)currSCCB->DataPointer;
9327
#else
9328
      sg_ptr = (ULONG *)currSCCB->DataPointer;
9329
#endif
9330
 
9331
      while (data_count < currSCCB->Sccb_ATC) {
9332
 
9333
         sg_index++;
9334
         data_count += *(sg_ptr+(sg_index * 2));
9335
         }
9336
 
9337
      if (data_count == currSCCB->Sccb_ATC) {
9338
 
9339
         currSCCB->Sccb_SGoffset = 0;
9340
         sg_index++;
9341
         }
9342
 
9343
      else {
9344
         currSCCB->Sccb_SGoffset = data_count - currSCCB->Sccb_ATC;
9345
         }
9346
 
9347
      currSCCB->Sccb_sgseg = (USHORT)sg_index;
9348
      }
9349
 
9350
   else {
9351
      currSCCB->Sccb_XferCnt = currSCCB->DataLength - currSCCB->Sccb_ATC;
9352
      }
9353
}
9354
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
9355
/*----------------------------------------------------------------------
9356
 *
9357
 *
9358
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
9359
 *
9360
 *   This file is available under both the GNU General Public License
9361
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
9362
 *
9363
 *   $Workfile:   scam.c  $
9364
 *
9365
 *   Description:  Functions relating to handling of the SCAM selection
9366
 *                 and the determination of the SCSI IDs to be assigned
9367
 *                 to all perspective SCSI targets.
9368
 *
9369
 *   $Date: 2005-12-20 10:17:45 $
9370
 *
9371
 *   $Revision: 1.1 $
9372
 *
9373
 *----------------------------------------------------------------------*/
9374
 
9375
/*#include <globals.h>*/
9376
 
9377
#if (FW_TYPE==_UCB_MGR_)
9378
        /*#include <budi.h>*/
9379
#endif
9380
 
9381
/*#include <sccbmgr.h>*/
9382
/*#include <blx30.h>*/
9383
/*#include <target.h>*/
9384
/*#include <scsi2.h>*/
9385
/*#include <eeprom.h>*/
9386
/*#include <harpoon.h>*/
9387
 
9388
 
9389
 
9390
/*
9391
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
9392
extern SCCBCARD BL_Card[MAX_CARDS];
9393
extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
9394
extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
9395
#if defined(DOS) || defined(OS2)
9396
extern UCHAR temp_id_string[ID_STRING_LENGTH];
9397
#endif
9398
extern UCHAR scamHAString[];
9399
*/
9400
/*---------------------------------------------------------------------
9401
 *
9402
 * Function: scini
9403
 *
9404
 * Description: Setup all data structures necessary for SCAM selection.
9405
 *
9406
 *---------------------------------------------------------------------*/
9407
 
9408
void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
9409
{
9410
 
9411
#if defined(SCAM_LEV_2)
9412
   UCHAR loser,assigned_id;
9413
#endif
9414
#if defined(DOS)
9415
 
9416
   USHORT p_port;
9417
#else
9418
   ULONG p_port;
9419
#endif
9420
 
9421
   UCHAR i,k,ScamFlg ;
9422
   PSCCBcard currCard;
9423
        PNVRamInfo pCurrNvRam;
9424
 
9425
   currCard = &BL_Card[p_card];
9426
   p_port = currCard->ioPort;
9427
        pCurrNvRam = currCard->pNvRamInfo;
9428
 
9429
 
9430
        if(pCurrNvRam){
9431
                ScamFlg = pCurrNvRam->niScamConf;
9432
                i = pCurrNvRam->niSysConf;
9433
        }
9434
        else{
9435
           ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
9436
           i = (UCHAR)(utilEERead(p_port, (SYSTEM_CONFIG/2)));
9437
        }
9438
        if(!(i & 0x02)) /* check if reset bus in AutoSCSI parameter set */
9439
                return;
9440
 
9441
   inisci(p_card,p_port, p_our_id);
9442
 
9443
   /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
9444
      too slow to return to SCAM selection */
9445
 
9446
   /* if (p_power_up)
9447
         Wait1Second(p_port);
9448
      else
9449
         Wait(p_port, TO_250ms); */
9450
 
9451
   Wait1Second(p_port);
9452
 
9453
#if defined(SCAM_LEV_2)
9454
 
9455
   if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
9456
      {
9457
      while (!(scarb(p_port,INIT_SELTD))) {}
9458
 
9459
      scsel(p_port);
9460
 
9461
      do {
9462
         scxferc(p_port,SYNC_PTRN);
9463
         scxferc(p_port,DOM_MSTR);
9464
         loser = scsendi(p_port,&scamInfo[p_our_id].id_string[0]);
9465
         } while ( loser == 0xFF );
9466
 
9467
      scbusf(p_port);
9468
 
9469
      if ((p_power_up) && (!loser))
9470
         {
9471
         sresb(p_port,p_card);
9472
         Wait(p_port, TO_250ms);
9473
 
9474
         while (!(scarb(p_port,INIT_SELTD))) {}
9475
 
9476
         scsel(p_port);
9477
 
9478
         do {
9479
            scxferc(p_port, SYNC_PTRN);
9480
            scxferc(p_port, DOM_MSTR);
9481
            loser = scsendi(p_port,&scamInfo[p_our_id].
9482
               id_string[0]);
9483
            } while ( loser == 0xFF );
9484
 
9485
         scbusf(p_port);
9486
         }
9487
      }
9488
 
9489
   else
9490
      {
9491
      loser = FALSE;
9492
      }
9493
 
9494
 
9495
   if (!loser)
9496
      {
9497
 
9498
#endif  /* SCAM_LEV_2 */
9499
 
9500
      scamInfo[p_our_id].state = ID_ASSIGNED;
9501
 
9502
 
9503
                if (ScamFlg & SCAM_ENABLED)
9504
                {
9505
 
9506
              for (i=0; i < MAX_SCSI_TAR; i++)
9507
                   {
9508
           if ((scamInfo[i].state == ID_UNASSIGNED) ||
9509
                   (scamInfo[i].state == ID_UNUSED))
9510
                      {
9511
                   if (scsell(p_port,i))
9512
                   {
9513
                   scamInfo[i].state = LEGACY;
9514
                        if ((scamInfo[i].id_string[0] != 0xFF) ||
9515
                        (scamInfo[i].id_string[1] != 0xFA))
9516
                         {
9517
 
9518
                              scamInfo[i].id_string[0] = 0xFF;
9519
                           scamInfo[i].id_string[1] = 0xFA;
9520
                                                        if(pCurrNvRam == NULL)
9521
                                 currCard->globalFlags |= F_UPDATE_EEPROM;
9522
                }
9523
                         }
9524
                   }
9525
        }
9526
 
9527
              sresb(p_port,p_card);
9528
        Wait1Second(p_port);
9529
         while (!(scarb(p_port,INIT_SELTD))) {}
9530
         scsel(p_port);
9531
         scasid(p_card, p_port);
9532
         }
9533
 
9534
#if defined(SCAM_LEV_2)
9535
 
9536
      }
9537
 
9538
   else if ((loser) && (ScamFlg & SCAM_ENABLED))
9539
      {
9540
      scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
9541
      assigned_id = FALSE;
9542
      scwtsel(p_port);
9543
 
9544
      do {
9545
         while (scxferc(p_port,0x00) != SYNC_PTRN) {}
9546
 
9547
         i = scxferc(p_port,0x00);
9548
         if (i == ASSIGN_ID)
9549
            {
9550
            if (!(scsendi(p_port,&scamInfo[p_our_id].id_string[0])))
9551
                  {
9552
                  i = scxferc(p_port,0x00);
9553
                  if (scvalq(i))
9554
                     {
9555
                     k = scxferc(p_port,0x00);
9556
 
9557
                     if (scvalq(k))
9558
                        {
9559
                        currCard->ourId =
9560
                           ((UCHAR)(i<<3)+(k & (UCHAR)7)) & (UCHAR) 0x3F;
9561
                        inisci(p_card, p_port, p_our_id);
9562
                        scamInfo[currCard->ourId].state = ID_ASSIGNED;
9563
                        scamInfo[currCard->ourId].id_string[0]
9564
                           = SLV_TYPE_CODE0;
9565
                        assigned_id = TRUE;
9566
                        }
9567
                     }
9568
                  }
9569
            }
9570
 
9571
         else if (i == SET_P_FLAG)
9572
            {
9573
               if (!(scsendi(p_port,
9574
                        &scamInfo[p_our_id].id_string[0])))
9575
                        scamInfo[p_our_id].id_string[0] |= 0x80;
9576
            }
9577
         }while (!assigned_id);
9578
 
9579
      while (scxferc(p_port,0x00) != CFG_CMPLT) {}
9580
      }
9581
 
9582
#endif   /* SCAM_LEV_2 */
9583
   if (ScamFlg & SCAM_ENABLED)
9584
      {
9585
      scbusf(p_port);
9586
      if (currCard->globalFlags & F_UPDATE_EEPROM)
9587
         {
9588
         scsavdi(p_card, p_port);
9589
         currCard->globalFlags &= ~F_UPDATE_EEPROM;
9590
         }
9591
      }
9592
 
9593
 
9594
#if defined(DOS)
9595
   for (i=0; i < MAX_SCSI_TAR; i++)
9596
   {
9597
        if (((ScamFlg & SCAM_ENABLED) && (scamInfo[i].state == LEGACY))
9598
                        || (i != p_our_id))
9599
                {
9600
         scsellDOS(p_port,i);
9601
              }
9602
        }
9603
#endif
9604
 
9605
/*
9606
   for (i=0,k=0; i < MAX_SCSI_TAR; i++)
9607
      {
9608
      if ((scamInfo[i].state == ID_ASSIGNED) ||
9609
         (scamInfo[i].state == LEGACY))
9610
         k++;
9611
      }
9612
 
9613
   if (k==2)
9614
      currCard->globalFlags |= F_SINGLE_DEVICE;
9615
   else
9616
      currCard->globalFlags &= ~F_SINGLE_DEVICE;
9617
*/
9618
}
9619
 
9620
 
9621
/*---------------------------------------------------------------------
9622
 *
9623
 * Function: scarb
9624
 *
9625
 * Description: Gain control of the bus and wait SCAM select time (250ms)
9626
 *
9627
 *---------------------------------------------------------------------*/
9628
 
9629
#if defined(DOS)
9630
int scarb(USHORT p_port, UCHAR p_sel_type)
9631
#else
9632
int scarb(ULONG p_port, UCHAR p_sel_type)
9633
#endif
9634
{
9635
   if (p_sel_type == INIT_SELTD)
9636
      {
9637
 
9638
      while (RD_HARPOON(p_port+hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {}
9639
 
9640
 
9641
      if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL)
9642
         return(FALSE);
9643
 
9644
      if (RD_HARPOON(p_port+hp_scsidata_0) != 00)
9645
         return(FALSE);
9646
 
9647
      WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_BSY));
9648
 
9649
      if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL) {
9650
 
9651
         WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
9652
            ~SCSI_BSY));
9653
         return(FALSE);
9654
         }
9655
 
9656
 
9657
      WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_SEL));
9658
 
9659
      if (RD_HARPOON(p_port+hp_scsidata_0) != 00) {
9660
 
9661
         WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
9662
            ~(SCSI_BSY | SCSI_SEL)));
9663
         return(FALSE);
9664
         }
9665
      }
9666
 
9667
 
9668
   WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
9669
      & ~ACTdeassert));
9670
   WR_HARPOON(p_port+hp_scsireset, SCAM_EN);
9671
   WR_HARPOON(p_port+hp_scsidata_0, 0x00);
9672
#if defined(WIDE_SCSI)
9673
   WR_HARPOON(p_port+hp_scsidata_1, 0x00);
9674
#endif
9675
   WR_HARPOON(p_port+hp_portctrl_0, SCSI_BUS_EN);
9676
 
9677
   WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_MSG));
9678
 
9679
   WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig)
9680
      & ~SCSI_BSY));
9681
 
9682
   Wait(p_port,TO_250ms);
9683
 
9684
   return(TRUE);
9685
}
9686
 
9687
 
9688
/*---------------------------------------------------------------------
9689
 *
9690
 * Function: scbusf
9691
 *
9692
 * Description: Release the SCSI bus and disable SCAM selection.
9693
 *
9694
 *---------------------------------------------------------------------*/
9695
 
9696
#if defined(DOS)
9697
void scbusf(USHORT p_port)
9698
#else
9699
void scbusf(ULONG p_port)
9700
#endif
9701
{
9702
   WR_HARPOON(p_port+hp_page_ctrl,
9703
      (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
9704
 
9705
 
9706
   WR_HARPOON(p_port+hp_scsidata_0, 0x00);
9707
 
9708
   WR_HARPOON(p_port+hp_portctrl_0, (RD_HARPOON(p_port+hp_portctrl_0)
9709
      & ~SCSI_BUS_EN));
9710
 
9711
   WR_HARPOON(p_port+hp_scsisig, 0x00);
9712
 
9713
 
9714
   WR_HARPOON(p_port+hp_scsireset,  (RD_HARPOON(p_port+hp_scsireset)
9715
      & ~SCAM_EN));
9716
 
9717
   WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
9718
      | ACTdeassert));
9719
 
9720
#if defined(SCAM_LEV_2)
9721
   WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
9722
#else
9723
   WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT));
9724
#endif
9725
 
9726
   WR_HARPOON(p_port+hp_page_ctrl,
9727
      (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
9728
}
9729
 
9730
 
9731
 
9732
/*---------------------------------------------------------------------
9733
 *
9734
 * Function: scasid
9735
 *
9736
 * Description: Assign an ID to all the SCAM devices.
9737
 *
9738
 *---------------------------------------------------------------------*/
9739
 
9740
#if defined(DOS)
9741
void scasid(UCHAR p_card, USHORT p_port)
9742
#else
9743
void scasid(UCHAR p_card, ULONG p_port)
9744
#endif
9745
{
9746
#if defined(DOS) || defined(OS2)
9747
   /* Use external defined in global space area, instead of Stack
9748
      space. WIN/95 DOS doesnot work TINY mode. The OS doesnot intialize
9749
      SS equal to DS. Thus the array allocated on stack doesnot get
9750
      access correctly */
9751
#else
9752
   UCHAR temp_id_string[ID_STRING_LENGTH];
9753
#endif
9754
 
9755
   UCHAR i,k,scam_id;
9756
        UCHAR crcBytes[3];
9757
        PNVRamInfo pCurrNvRam;
9758
        ushort_ptr pCrcBytes;
9759
 
9760
        pCurrNvRam = BL_Card[p_card].pNvRamInfo;
9761
 
9762
   i=FALSE;
9763
 
9764
   while (!i)
9765
      {
9766
 
9767
      for (k=0; k < ID_STRING_LENGTH; k++)
9768
         {
9769
         temp_id_string[k] = (UCHAR) 0x00;
9770
         }
9771
 
9772
      scxferc(p_port,SYNC_PTRN);
9773
      scxferc(p_port,ASSIGN_ID);
9774
 
9775
      if (!(sciso(p_port,&temp_id_string[0])))
9776
         {
9777
                        if(pCurrNvRam){
9778
                                pCrcBytes = (ushort_ptr)&crcBytes[0];
9779
                                *pCrcBytes = CalcCrc16(&temp_id_string[0]);
9780
                                crcBytes[2] = CalcLrc(&temp_id_string[0]);
9781
                                temp_id_string[1] = crcBytes[2];
9782
                                temp_id_string[2] = crcBytes[0];
9783
                                temp_id_string[3] = crcBytes[1];
9784
                                for(k = 4; k < ID_STRING_LENGTH; k++)
9785
                                        temp_id_string[k] = (UCHAR) 0x00;
9786
                        }
9787
         i = scmachid(p_card,temp_id_string);
9788
 
9789
         if (i == CLR_PRIORITY)
9790
            {
9791
            scxferc(p_port,MISC_CODE);
9792
            scxferc(p_port,CLR_P_FLAG);
9793
            i = FALSE;  /*Not the last ID yet. */
9794
            }
9795
 
9796
         else if (i != NO_ID_AVAIL)
9797
            {
9798
            if (i < 8 )
9799
               scxferc(p_port,ID_0_7);
9800
            else
9801
               scxferc(p_port,ID_8_F);
9802
 
9803
            scam_id = (i & (UCHAR) 0x07);
9804
 
9805
 
9806
            for (k=1; k < 0x08; k <<= 1)
9807
               if (!( k & i ))
9808
                  scam_id += 0x08;        /*Count number of zeros in DB0-3. */
9809
 
9810
            scxferc(p_port,scam_id);
9811
 
9812
            i = FALSE;  /*Not the last ID yet. */
9813
            }
9814
         }
9815
 
9816
      else
9817
         {
9818
         i = TRUE;
9819
         }
9820
 
9821
      }  /*End while */
9822
 
9823
   scxferc(p_port,SYNC_PTRN);
9824
   scxferc(p_port,CFG_CMPLT);
9825
}
9826
 
9827
 
9828
 
9829
 
9830
 
9831
/*---------------------------------------------------------------------
9832
 *
9833
 * Function: scsel
9834
 *
9835
 * Description: Select all the SCAM devices.
9836
 *
9837
 *---------------------------------------------------------------------*/
9838
 
9839
#if defined(DOS)
9840
void scsel(USHORT p_port)
9841
#else
9842
void scsel(ULONG p_port)
9843
#endif
9844
{
9845
 
9846
   WR_HARPOON(p_port+hp_scsisig, SCSI_SEL);
9847
   scwiros(p_port, SCSI_MSG);
9848
 
9849
   WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY));
9850
 
9851
 
9852
   WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
9853
   WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) |
9854
      (UCHAR)(BIT(7)+BIT(6))));
9855
 
9856
 
9857
   WR_HARPOON(p_port+hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
9858
   scwiros(p_port, SCSI_SEL);
9859
 
9860
   WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) &
9861
      ~(UCHAR)BIT(6)));
9862
   scwirod(p_port, BIT(6));
9863
 
9864
   WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
9865
}
9866
 
9867
 
9868
 
9869
/*---------------------------------------------------------------------
9870
 *
9871
 * Function: scxferc
9872
 *
9873
 * Description: Handshake the p_data (DB4-0) across the bus.
9874
 *
9875
 *---------------------------------------------------------------------*/
9876
 
9877
#if defined(DOS)
9878
UCHAR scxferc(USHORT p_port, UCHAR p_data)
9879
#else
9880
UCHAR scxferc(ULONG p_port, UCHAR p_data)
9881
#endif
9882
{
9883
   UCHAR curr_data, ret_data;
9884
 
9885
   curr_data = p_data | BIT(7) | BIT(5);   /*Start with DB7 & DB5 asserted. */
9886
 
9887
   WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9888
 
9889
   curr_data &= ~BIT(7);
9890
 
9891
   WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9892
 
9893
   scwirod(p_port,BIT(7));              /*Wait for DB7 to be released. */
9894
        while (!(RD_HARPOON(p_port+hp_scsidata_0) & BIT(5)));
9895
 
9896
   ret_data = (RD_HARPOON(p_port+hp_scsidata_0) & (UCHAR) 0x1F);
9897
 
9898
   curr_data |= BIT(6);
9899
 
9900
   WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9901
 
9902
   curr_data &= ~BIT(5);
9903
 
9904
   WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9905
 
9906
   scwirod(p_port,BIT(5));              /*Wait for DB5 to be released. */
9907
 
9908
   curr_data &= ~(BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0)); /*Release data bits */
9909
   curr_data |= BIT(7);
9910
 
9911
   WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9912
 
9913
   curr_data &= ~BIT(6);
9914
 
9915
   WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9916
 
9917
   scwirod(p_port,BIT(6));              /*Wait for DB6 to be released. */
9918
 
9919
   return(ret_data);
9920
}
9921
 
9922
 
9923
/*---------------------------------------------------------------------
9924
 *
9925
 * Function: scsendi
9926
 *
9927
 * Description: Transfer our Identification string to determine if we
9928
 *              will be the dominant master.
9929
 *
9930
 *---------------------------------------------------------------------*/
9931
 
9932
#if defined(DOS)
9933
UCHAR scsendi(USHORT p_port, UCHAR p_id_string[])
9934
#else
9935
UCHAR scsendi(ULONG p_port, UCHAR p_id_string[])
9936
#endif
9937
{
9938
   UCHAR ret_data,byte_cnt,bit_cnt,defer;
9939
 
9940
   defer = FALSE;
9941
 
9942
   for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
9943
 
9944
      for (bit_cnt = 0x80; bit_cnt != 0 ; bit_cnt >>= 1) {
9945
 
9946
         if (defer)
9947
            ret_data = scxferc(p_port,00);
9948
 
9949
         else if (p_id_string[byte_cnt] & bit_cnt)
9950
 
9951
               ret_data = scxferc(p_port,02);
9952
 
9953
            else {
9954
 
9955
               ret_data = scxferc(p_port,01);
9956
               if (ret_data & 02)
9957
                  defer = TRUE;
9958
               }
9959
 
9960
         if ((ret_data & 0x1C) == 0x10)
9961
            return(0x00);  /*End of isolation stage, we won! */
9962
 
9963
         if (ret_data & 0x1C)
9964
            return(0xFF);
9965
 
9966
         if ((defer) && (!(ret_data & 0x1F)))
9967
            return(0x01);  /*End of isolation stage, we lost. */
9968
 
9969
         } /*bit loop */
9970
 
9971
      } /*byte loop */
9972
 
9973
   if (defer)
9974
      return(0x01);  /*We lost */
9975
   else
9976
      return(0);  /*We WON! Yeeessss! */
9977
}
9978
 
9979
 
9980
 
9981
/*---------------------------------------------------------------------
9982
 *
9983
 * Function: sciso
9984
 *
9985
 * Description: Transfer the Identification string.
9986
 *
9987
 *---------------------------------------------------------------------*/
9988
 
9989
#if defined(DOS)
9990
UCHAR sciso(USHORT p_port, UCHAR p_id_string[])
9991
#else
9992
UCHAR sciso(ULONG p_port, UCHAR p_id_string[])
9993
#endif
9994
{
9995
   UCHAR ret_data,the_data,byte_cnt,bit_cnt;
9996
 
9997
   the_data = 0;
9998
 
9999
   for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
10000
 
10001
      for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
10002
 
10003
         ret_data = scxferc(p_port,0);
10004
 
10005
         if (ret_data & 0xFC)
10006
            return(0xFF);
10007
 
10008
         else {
10009
 
10010
            the_data <<= 1;
10011
            if (ret_data & BIT(1)) {
10012
               the_data |= 1;
10013
               }
10014
            }
10015
 
10016
         if ((ret_data & 0x1F) == 0)
10017
           {
10018
/*
10019
                                if(bit_cnt != 0 || bit_cnt != 8)
10020
                                {
10021
                                        byte_cnt = 0;
10022
                                        bit_cnt = 0;
10023
                                        scxferc(p_port, SYNC_PTRN);
10024
                                        scxferc(p_port, ASSIGN_ID);
10025
                                        continue;
10026
                                }
10027
*/
10028
            if (byte_cnt)
10029
               return(0x00);
10030
            else
10031
               return(0xFF);
10032
           }
10033
 
10034
         } /*bit loop */
10035
 
10036
      p_id_string[byte_cnt] = the_data;
10037
 
10038
      } /*byte loop */
10039
 
10040
   return(0);
10041
}
10042
 
10043
 
10044
 
10045
/*---------------------------------------------------------------------
10046
 *
10047
 * Function: scwirod
10048
 *
10049
 * Description: Sample the SCSI data bus making sure the signal has been
10050
 *              deasserted for the correct number of consecutive samples.
10051
 *
10052
 *---------------------------------------------------------------------*/
10053
 
10054
#if defined(DOS)
10055
void scwirod(USHORT p_port, UCHAR p_data_bit)
10056
#else
10057
void scwirod(ULONG p_port, UCHAR p_data_bit)
10058
#endif
10059
{
10060
   UCHAR i;
10061
 
10062
   i = 0;
10063
   while ( i < MAX_SCSI_TAR ) {
10064
 
10065
      if (RD_HARPOON(p_port+hp_scsidata_0) & p_data_bit)
10066
 
10067
         i = 0;
10068
 
10069
      else
10070
 
10071
         i++;
10072
 
10073
      }
10074
}
10075
 
10076
 
10077
 
10078
/*---------------------------------------------------------------------
10079
 *
10080
 * Function: scwiros
10081
 *
10082
 * Description: Sample the SCSI Signal lines making sure the signal has been
10083
 *              deasserted for the correct number of consecutive samples.
10084
 *
10085
 *---------------------------------------------------------------------*/
10086
 
10087
#if defined(DOS)
10088
void scwiros(USHORT p_port, UCHAR p_data_bit)
10089
#else
10090
void scwiros(ULONG p_port, UCHAR p_data_bit)
10091
#endif
10092
{
10093
   UCHAR i;
10094
 
10095
   i = 0;
10096
   while ( i < MAX_SCSI_TAR ) {
10097
 
10098
      if (RD_HARPOON(p_port+hp_scsisig) & p_data_bit)
10099
 
10100
         i = 0;
10101
 
10102
      else
10103
 
10104
         i++;
10105
 
10106
      }
10107
}
10108
 
10109
 
10110
/*---------------------------------------------------------------------
10111
 *
10112
 * Function: scvalq
10113
 *
10114
 * Description: Make sure we received a valid data byte.
10115
 *
10116
 *---------------------------------------------------------------------*/
10117
 
10118
UCHAR scvalq(UCHAR p_quintet)
10119
{
10120
   UCHAR count;
10121
 
10122
   for (count=1; count < 0x08; count<<=1) {
10123
      if (!(p_quintet & count))
10124
         p_quintet -= 0x80;
10125
      }
10126
 
10127
   if (p_quintet & 0x18)
10128
      return(FALSE);
10129
 
10130
   else
10131
      return(TRUE);
10132
}
10133
 
10134
 
10135
/*---------------------------------------------------------------------
10136
 *
10137
 * Function: scsell
10138
 *
10139
 * Description: Select the specified device ID using a selection timeout
10140
 *              less than 4ms.  If somebody responds then it is a legacy
10141
 *              drive and this ID must be marked as such.
10142
 *
10143
 *---------------------------------------------------------------------*/
10144
 
10145
#if defined(DOS)
10146
UCHAR scsell(USHORT p_port, UCHAR targ_id)
10147
#else
10148
UCHAR scsell(ULONG p_port, UCHAR targ_id)
10149
#endif
10150
{
10151
#if defined(DOS)
10152
   USHORT i;
10153
#else
10154
   ULONG i;
10155
#endif
10156
 
10157
   WR_HARPOON(p_port+hp_page_ctrl,
10158
      (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
10159
 
10160
   ARAM_ACCESS(p_port);
10161
 
10162
   WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
10163
   WR_HARPOON(p_port+hp_seltimeout,TO_4ms);
10164
 
10165
 
10166
   for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
10167
      WRW_HARPOON(i, (MPM_OP+ACOMMAND));
10168
      }
10169
   WRW_HARPOON(i, (BRH_OP+ALWAYS+    NP));
10170
 
10171
   WRW_HARPOON((p_port+hp_intstat),
10172
               (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
10173
 
10174
   WR_HARPOON(p_port+hp_select_id, targ_id);
10175
 
10176
   WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
10177
   WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
10178
   WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
10179
 
10180
 
10181
   while (!(RDW_HARPOON((p_port+hp_intstat)) &
10182
            (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
10183
 
10184
   if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
10185
         Wait(p_port, TO_250ms);
10186
 
10187
   DISABLE_AUTO(p_port);
10188
 
10189
   WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
10190
   WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
10191
 
10192
   SGRAM_ACCESS(p_port);
10193
 
10194
   if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
10195
 
10196
      WRW_HARPOON((p_port+hp_intstat),
10197
                  (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
10198
 
10199
      WR_HARPOON(p_port+hp_page_ctrl,
10200
         (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10201
 
10202
      return(FALSE);  /*No legacy device */
10203
      }
10204
 
10205
   else {
10206
 
10207
      while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
10208
                                if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
10209
                                        {
10210
                                        WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
10211
                        ACCEPT_MSG(p_port);
10212
                                        }
10213
                }
10214
 
10215
      WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
10216
 
10217
      WR_HARPOON(p_port+hp_page_ctrl,
10218
         (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10219
 
10220
      return(TRUE);  /*Found one of them oldies! */
10221
      }
10222
}
10223
 
10224
#if defined(DOS)
10225
/*---------------------------------------------------------------------
10226
 *
10227
 * Function: scsell for DOS
10228
 *
10229
 * Description: Select the specified device ID using a selection timeout
10230
 *              less than 2ms.  This was specially required to solve
10231
 *              the problem with Plextor 12X CD-ROM drive. This drive
10232
 *                                       was responding the Selection at the end of 4ms and
10233
 *                                       hanging the system.
10234
 *
10235
 *---------------------------------------------------------------------*/
10236
 
10237
UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
10238
{
10239
   USHORT i;
10240
 
10241
   WR_HARPOON(p_port+hp_page_ctrl,
10242
      (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
10243
 
10244
   ARAM_ACCESS(p_port);
10245
 
10246
   WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
10247
   WR_HARPOON(p_port+hp_seltimeout,TO_2ms);
10248
 
10249
 
10250
   for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
10251
      WRW_HARPOON(i, (MPM_OP+ACOMMAND));
10252
      }
10253
   WRW_HARPOON(i, (BRH_OP+ALWAYS+    NP));
10254
 
10255
   WRW_HARPOON((p_port+hp_intstat),
10256
               (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
10257
 
10258
   WR_HARPOON(p_port+hp_select_id, targ_id);
10259
 
10260
   WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
10261
   WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
10262
   WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
10263
 
10264
 
10265
   while (!(RDW_HARPOON((p_port+hp_intstat)) &
10266
            (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
10267
 
10268
   if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
10269
         Wait(p_port, TO_250ms);
10270
 
10271
   DISABLE_AUTO(p_port);
10272
 
10273
   WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
10274
   WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
10275
 
10276
   SGRAM_ACCESS(p_port);
10277
 
10278
   if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
10279
 
10280
      WRW_HARPOON((p_port+hp_intstat),
10281
                  (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
10282
 
10283
      WR_HARPOON(p_port+hp_page_ctrl,
10284
         (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10285
 
10286
      return(FALSE);  /*No legacy device */
10287
      }
10288
 
10289
   else {
10290
 
10291
      while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
10292
                                if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
10293
                                        {
10294
                                        WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
10295
                        ACCEPT_MSG(p_port);
10296
                                        }
10297
                }
10298
 
10299
      WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
10300
 
10301
      WR_HARPOON(p_port+hp_page_ctrl,
10302
         (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10303
 
10304
      return(TRUE);  /*Found one of them oldies! */
10305
      }
10306
}
10307
#endif  /* DOS */
10308
 
10309
/*---------------------------------------------------------------------
10310
 *
10311
 * Function: scwtsel
10312
 *
10313
 * Description: Wait to be selected by another SCAM initiator.
10314
 *
10315
 *---------------------------------------------------------------------*/
10316
 
10317
#if defined(DOS)
10318
void scwtsel(USHORT p_port)
10319
#else
10320
void scwtsel(ULONG p_port)
10321
#endif
10322
{
10323
   while(!(RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) {}
10324
}
10325
 
10326
 
10327
/*---------------------------------------------------------------------
10328
 *
10329
 * Function: inisci
10330
 *
10331
 * Description: Setup the data Structure with the info from the EEPROM.
10332
 *
10333
 *---------------------------------------------------------------------*/
10334
 
10335
#if defined(DOS)
10336
void inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id)
10337
#else
10338
void inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
10339
#endif
10340
{
10341
   UCHAR i,k,max_id;
10342
   USHORT ee_data;
10343
        PNVRamInfo pCurrNvRam;
10344
 
10345
        pCurrNvRam = BL_Card[p_card].pNvRamInfo;
10346
 
10347
   if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
10348
      max_id = 0x08;
10349
 
10350
   else
10351
      max_id = 0x10;
10352
 
10353
        if(pCurrNvRam){
10354
                for(i = 0; i < max_id; i++){
10355
 
10356
                        for(k = 0; k < 4; k++)
10357
                                scamInfo[i].id_string[k] = pCurrNvRam->niScamTbl[i][k];
10358
                        for(k = 4; k < ID_STRING_LENGTH; k++)
10359
                                scamInfo[i].id_string[k] = (UCHAR) 0x00;
10360
 
10361
              if(scamInfo[i].id_string[0] == 0x00)
10362
           scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
10363
              else
10364
              scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
10365
 
10366
                }
10367
        }else {
10368
           for (i=0; i < max_id; i++)
10369
           {
10370
        for (k=0; k < ID_STRING_LENGTH; k+=2)
10371
                 {
10372
              ee_data = utilEERead(p_port, (USHORT)((EE_SCAMBASE/2) +
10373
             (USHORT) (i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
10374
                scamInfo[i].id_string[k] = (UCHAR) ee_data;
10375
                 ee_data >>= 8;
10376
              scamInfo[i].id_string[k+1] = (UCHAR) ee_data;
10377
           }
10378
 
10379
              if ((scamInfo[i].id_string[0] == 0x00) ||
10380
               (scamInfo[i].id_string[0] == 0xFF))
10381
 
10382
           scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
10383
 
10384
              else
10385
              scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
10386
 
10387
        }
10388
        }
10389
        for(k = 0; k < ID_STRING_LENGTH; k++)
10390
                scamInfo[p_our_id].id_string[k] = scamHAString[k];
10391
 
10392
}
10393
 
10394
/*---------------------------------------------------------------------
10395
 *
10396
 * Function: scmachid
10397
 *
10398
 * Description: Match the Device ID string with our values stored in
10399
 *              the EEPROM.
10400
 *
10401
 *---------------------------------------------------------------------*/
10402
 
10403
UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
10404
{
10405
 
10406
   UCHAR i,k,match;
10407
 
10408
 
10409
   for (i=0; i < MAX_SCSI_TAR; i++) {
10410
 
10411
#if !defined(SCAM_LEV_2)
10412
      if (scamInfo[i].state == ID_UNASSIGNED)
10413
         {
10414
#endif
10415
         match = TRUE;
10416
 
10417
         for (k=0; k < ID_STRING_LENGTH; k++)
10418
            {
10419
            if (p_id_string[k] != scamInfo[i].id_string[k])
10420
               match = FALSE;
10421
            }
10422
 
10423
         if (match)
10424
            {
10425
            scamInfo[i].state = ID_ASSIGNED;
10426
            return(i);
10427
            }
10428
 
10429
#if !defined(SCAM_LEV_2)
10430
         }
10431
#endif
10432
 
10433
      }
10434
 
10435
 
10436
 
10437
   if (p_id_string[0] & BIT(5))
10438
      i = 8;
10439
   else
10440
      i = MAX_SCSI_TAR;
10441
 
10442
   if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
10443
      match = p_id_string[1] & (UCHAR) 0x1F;
10444
   else
10445
      match = 7;
10446
 
10447
   while (i > 0)
10448
      {
10449
      i--;
10450
 
10451
      if (scamInfo[match].state == ID_UNUSED)
10452
         {
10453
         for (k=0; k < ID_STRING_LENGTH; k++)
10454
            {
10455
            scamInfo[match].id_string[k] = p_id_string[k];
10456
            }
10457
 
10458
         scamInfo[match].state = ID_ASSIGNED;
10459
 
10460
                        if(BL_Card[p_card].pNvRamInfo == NULL)
10461
                 BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
10462
         return(match);
10463
 
10464
         }
10465
 
10466
 
10467
      match--;
10468
 
10469
      if (match == 0xFF)
10470
        {
10471
         if (p_id_string[0] & BIT(5))
10472
            match = 7;
10473
         else
10474
            match = MAX_SCSI_TAR-1;
10475
        }
10476
      }
10477
 
10478
 
10479
 
10480
   if (p_id_string[0] & BIT(7))
10481
      {
10482
      return(CLR_PRIORITY);
10483
      }
10484
 
10485
 
10486
   if (p_id_string[0] & BIT(5))
10487
      i = 8;
10488
   else
10489
      i = MAX_SCSI_TAR;
10490
 
10491
   if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
10492
      match = p_id_string[1] & (UCHAR) 0x1F;
10493
   else
10494
      match = 7;
10495
 
10496
   while (i > 0)
10497
      {
10498
 
10499
      i--;
10500
 
10501
      if (scamInfo[match].state == ID_UNASSIGNED)
10502
         {
10503
         for (k=0; k < ID_STRING_LENGTH; k++)
10504
            {
10505
            scamInfo[match].id_string[k] = p_id_string[k];
10506
            }
10507
 
10508
         scamInfo[match].id_string[0] |= BIT(7);
10509
         scamInfo[match].state = ID_ASSIGNED;
10510
                        if(BL_Card[p_card].pNvRamInfo == NULL)
10511
                 BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
10512
         return(match);
10513
 
10514
         }
10515
 
10516
 
10517
      match--;
10518
 
10519
      if (match == 0xFF)
10520
        {
10521
         if (p_id_string[0] & BIT(5))
10522
            match = 7;
10523
         else
10524
            match = MAX_SCSI_TAR-1;
10525
        }
10526
      }
10527
 
10528
   return(NO_ID_AVAIL);
10529
}
10530
 
10531
 
10532
/*---------------------------------------------------------------------
10533
 *
10534
 * Function: scsavdi
10535
 *
10536
 * Description: Save off the device SCAM ID strings.
10537
 *
10538
 *---------------------------------------------------------------------*/
10539
 
10540
#if defined(DOS)
10541
void scsavdi(UCHAR p_card, USHORT p_port)
10542
#else
10543
void scsavdi(UCHAR p_card, ULONG p_port)
10544
#endif
10545
{
10546
   UCHAR i,k,max_id;
10547
   USHORT ee_data,sum_data;
10548
 
10549
 
10550
   sum_data = 0x0000;
10551
 
10552
   for (i = 1; i < EE_SCAMBASE/2; i++)
10553
      {
10554
      sum_data += utilEERead(p_port, i);
10555
      }
10556
 
10557
 
10558
   utilEEWriteOnOff(p_port,1);   /* Enable write access to the EEPROM */
10559
 
10560
   if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
10561
      max_id = 0x08;
10562
 
10563
   else
10564
      max_id = 0x10;
10565
 
10566
   for (i=0; i < max_id; i++)
10567
      {
10568
 
10569
      for (k=0; k < ID_STRING_LENGTH; k+=2)
10570
         {
10571
         ee_data = scamInfo[i].id_string[k+1];
10572
         ee_data <<= 8;
10573
         ee_data |= scamInfo[i].id_string[k];
10574
         sum_data += ee_data;
10575
         utilEEWrite(p_port, ee_data, (USHORT)((EE_SCAMBASE/2) +
10576
            (USHORT)(i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
10577
         }
10578
      }
10579
 
10580
 
10581
   utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM/2);
10582
   utilEEWriteOnOff(p_port,0);   /* Turn off write access */
10583
}
10584
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
10585
/*----------------------------------------------------------------------
10586
 *
10587
 *
10588
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
10589
 *
10590
 *   This file is available under both the GNU General Public License
10591
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
10592
 *
10593
 *   $Workfile:   diagnose.c  $
10594
 *
10595
 *   Description:  Diagnostic funtions for testing the integrity of
10596
 *                 the HARPOON.
10597
 *
10598
 *   $Date: 2005-12-20 10:17:45 $
10599
 *
10600
 *   $Revision: 1.1 $
10601
 *
10602
 *----------------------------------------------------------------------*/
10603
 
10604
/*#include <globals.h>*/
10605
 
10606
#if (FW_TYPE==_UCB_MGR_)
10607
        /*#include <budi.h>*/
10608
#endif
10609
 
10610
/*#include <sccbmgr.h>*/
10611
/*#include <blx30.h>*/
10612
/*#include <target.h>*/
10613
/*#include <eeprom.h>*/
10614
/*#include <harpoon.h>*/
10615
 
10616
/*---------------------------------------------------------------------
10617
 *
10618
 * Function: XbowInit
10619
 *
10620
 * Description: Setup the Xbow for normal operation.
10621
 *
10622
 *---------------------------------------------------------------------*/
10623
 
10624
#if defined(DOS)
10625
void XbowInit(USHORT port, UCHAR ScamFlg)
10626
#else
10627
void XbowInit(ULONG port, UCHAR ScamFlg)
10628
#endif
10629
{
10630
UCHAR i;
10631
 
10632
        i = RD_HARPOON(port+hp_page_ctrl);
10633
        WR_HARPOON(port+hp_page_ctrl, (UCHAR) (i | G_INT_DISABLE));
10634
 
10635
   WR_HARPOON(port+hp_scsireset,0x00);
10636
   WR_HARPOON(port+hp_portctrl_1,HOST_MODE8);
10637
 
10638
   WR_HARPOON(port+hp_scsireset,(DMA_RESET | HPSCSI_RESET | PROG_RESET | \
10639
                                 FIFO_CLR));
10640
 
10641
   WR_HARPOON(port+hp_scsireset,SCSI_INI);
10642
 
10643
   WR_HARPOON(port+hp_clkctrl_0,CLKCTRL_DEFAULT);
10644
 
10645
   WR_HARPOON(port+hp_scsisig,0x00);         /*  Clear any signals we might */
10646
   WR_HARPOON(port+hp_scsictrl_0,ENA_SCAM_SEL);
10647
 
10648
   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
10649
 
10650
#if defined(SCAM_LEV_2)
10651
   default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
10652
                    BUS_FREE | XFER_CNT_0 | AUTO_INT;
10653
 
10654
   if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
10655
                default_intena |= SCAM_SEL;
10656
 
10657
#else
10658
   default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
10659
                    BUS_FREE | XFER_CNT_0 | AUTO_INT;
10660
#endif
10661
   WRW_HARPOON((port+hp_intena), default_intena);
10662
 
10663
   WR_HARPOON(port+hp_seltimeout,TO_290ms);
10664
 
10665
   /* Turn on SCSI_MODE8 for narrow cards to fix the
10666
      strapping issue with the DUAL CHANNEL card */
10667
   if (RD_HARPOON(port+hp_page_ctrl) & NARROW_SCSI_CARD)
10668
      WR_HARPOON(port+hp_addstat,SCSI_MODE8);
10669
 
10670
#if defined(NO_BIOS_OPTION)
10671
 
10672
   WR_HARPOON(port+hp_synctarg_0,NARROW_SCSI);
10673
   WR_HARPOON(port+hp_synctarg_1,NARROW_SCSI);
10674
   WR_HARPOON(port+hp_synctarg_2,NARROW_SCSI);
10675
   WR_HARPOON(port+hp_synctarg_3,NARROW_SCSI);
10676
   WR_HARPOON(port+hp_synctarg_4,NARROW_SCSI);
10677
   WR_HARPOON(port+hp_synctarg_5,NARROW_SCSI);
10678
   WR_HARPOON(port+hp_synctarg_6,NARROW_SCSI);
10679
   WR_HARPOON(port+hp_synctarg_7,NARROW_SCSI);
10680
   WR_HARPOON(port+hp_synctarg_8,NARROW_SCSI);
10681
   WR_HARPOON(port+hp_synctarg_9,NARROW_SCSI);
10682
   WR_HARPOON(port+hp_synctarg_10,NARROW_SCSI);
10683
   WR_HARPOON(port+hp_synctarg_11,NARROW_SCSI);
10684
   WR_HARPOON(port+hp_synctarg_12,NARROW_SCSI);
10685
   WR_HARPOON(port+hp_synctarg_13,NARROW_SCSI);
10686
   WR_HARPOON(port+hp_synctarg_14,NARROW_SCSI);
10687
   WR_HARPOON(port+hp_synctarg_15,NARROW_SCSI);
10688
 
10689
#endif
10690
        WR_HARPOON(port+hp_page_ctrl, i);
10691
 
10692
}
10693
 
10694
 
10695
/*---------------------------------------------------------------------
10696
 *
10697
 * Function: BusMasterInit
10698
 *
10699
 * Description: Initialize the BusMaster for normal operations.
10700
 *
10701
 *---------------------------------------------------------------------*/
10702
 
10703
#if defined(DOS)
10704
void BusMasterInit(USHORT p_port)
10705
#else
10706
void BusMasterInit(ULONG p_port)
10707
#endif
10708
{
10709
 
10710
 
10711
   WR_HARPOON(p_port+hp_sys_ctrl, DRVR_RST);
10712
   WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
10713
 
10714
   WR_HARPOON(p_port+hp_host_blk_cnt, XFER_BLK64);
10715
 
10716
 
10717
   WR_HARPOON(p_port+hp_bm_ctrl, (BMCTRL_DEFAULT));
10718
 
10719
   WR_HARPOON(p_port+hp_ee_ctrl, (SCSI_TERM_ENA_H));
10720
 
10721
 
10722
#if defined(NT)
10723
 
10724
   WR_HARPOON(p_port+hp_pci_cmd_cfg, (RD_HARPOON(p_port+hp_pci_cmd_cfg)
10725
      & ~MEM_SPACE_ENA));
10726
 
10727
#endif
10728
 
10729
   RD_HARPOON(p_port+hp_int_status);        /*Clear interrupts. */
10730
   WR_HARPOON(p_port+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
10731
   WR_HARPOON(p_port+hp_page_ctrl, (RD_HARPOON(p_port+hp_page_ctrl) &
10732
      ~SCATTER_EN));
10733
}
10734
 
10735
 
10736
/*---------------------------------------------------------------------
10737
 *
10738
 * Function: DiagXbow
10739
 *
10740
 * Description: Test Xbow integrity.  Non-zero return indicates an error.
10741
 *
10742
 *---------------------------------------------------------------------*/
10743
 
10744
#if defined(DOS)
10745
int DiagXbow(USHORT port)
10746
#else
10747
int DiagXbow(ULONG port)
10748
#endif
10749
{
10750
   unsigned char fifo_cnt,loop_cnt;
10751
 
10752
   unsigned char fifodata[5];
10753
   fifodata[0] = 0x00;
10754
   fifodata[1] = 0xFF;
10755
   fifodata[2] = 0x55;
10756
   fifodata[3] = 0xAA;
10757
   fifodata[4] = 0x00;
10758
 
10759
 
10760
   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
10761
   WRW_HARPOON((port+hp_intena), 0x0000);
10762
 
10763
   WR_HARPOON(port+hp_seltimeout,TO_5ms);
10764
 
10765
   WR_HARPOON(port+hp_portctrl_0,START_TO);
10766
 
10767
 
10768
   for(fifodata[4] = 0x01; fifodata[4] != (UCHAR) 0; fifodata[4] = fifodata[4] << 1) {
10769
 
10770
      WR_HARPOON(port+hp_selfid_0,fifodata[4]);
10771
      WR_HARPOON(port+hp_selfid_1,fifodata[4]);
10772
 
10773
      if ((RD_HARPOON(port+hp_selfid_0) != fifodata[4]) ||
10774
          (RD_HARPOON(port+hp_selfid_1) != fifodata[4]))
10775
         return(1);
10776
      }
10777
 
10778
 
10779
   for(loop_cnt = 0; loop_cnt < 4; loop_cnt++) {
10780
 
10781
      WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | HOST_WRT | START_TO));
10782
 
10783
 
10784
      for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
10785
 
10786
         WR_HARPOON(port+hp_fifodata_0, fifodata[loop_cnt]);
10787
         }
10788
 
10789
 
10790
      if (!(RD_HARPOON(port+hp_xferstat) & FIFO_FULL))
10791
         return(1);
10792
 
10793
 
10794
      WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | START_TO));
10795
 
10796
      for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
10797
 
10798
         if (RD_HARPOON(port+hp_fifodata_0) != fifodata[loop_cnt])
10799
            return(1);
10800
         }
10801
 
10802
 
10803
      if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
10804
         return(1);
10805
      }
10806
 
10807
 
10808
   while(!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
10809
 
10810
 
10811
   WR_HARPOON(port+hp_seltimeout,TO_290ms);
10812
 
10813
   WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
10814
 
10815
   WRW_HARPOON((port+hp_intena), default_intena);
10816
 
10817
   return(0);
10818
}
10819
 
10820
 
10821
/*---------------------------------------------------------------------
10822
 *
10823
 * Function: DiagBusMaster
10824
 *
10825
 * Description: Test BusMaster integrity.  Non-zero return indicates an
10826
 *              error.
10827
 *
10828
 *---------------------------------------------------------------------*/
10829
 
10830
#if defined(DOS)
10831
int DiagBusMaster(USHORT port)
10832
#else
10833
int DiagBusMaster(ULONG port)
10834
#endif
10835
{
10836
   UCHAR testdata;
10837
 
10838
   for(testdata = (UCHAR) 1; testdata != (UCHAR)0; testdata = testdata << 1) {
10839
 
10840
      WR_HARPOON(port+hp_xfer_cnt_lo,testdata);
10841
      WR_HARPOON(port+hp_xfer_cnt_mi,testdata);
10842
      WR_HARPOON(port+hp_xfer_cnt_hi,testdata);
10843
      WR_HARPOON(port+hp_host_addr_lo,testdata);
10844
      WR_HARPOON(port+hp_host_addr_lmi,testdata);
10845
      WR_HARPOON(port+hp_host_addr_hmi,testdata);
10846
      WR_HARPOON(port+hp_host_addr_hi,testdata);
10847
 
10848
      if ((RD_HARPOON(port+hp_xfer_cnt_lo) != testdata)   ||
10849
          (RD_HARPOON(port+hp_xfer_cnt_mi) != testdata)   ||
10850
          (RD_HARPOON(port+hp_xfer_cnt_hi) != testdata)   ||
10851
          (RD_HARPOON(port+hp_host_addr_lo) != testdata)  ||
10852
          (RD_HARPOON(port+hp_host_addr_lmi) != testdata) ||
10853
          (RD_HARPOON(port+hp_host_addr_hmi) != testdata) ||
10854
          (RD_HARPOON(port+hp_host_addr_hi) != testdata))
10855
 
10856
         return(1);
10857
      }
10858
   RD_HARPOON(port+hp_int_status);        /*Clear interrupts. */
10859
   return(0);
10860
}
10861
 
10862
 
10863
 
10864
/*---------------------------------------------------------------------
10865
 *
10866
 * Function: DiagEEPROM
10867
 *
10868
 * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
10869
 *              neccessary.
10870
 *
10871
 *---------------------------------------------------------------------*/
10872
 
10873
#if defined(DOS)
10874
void DiagEEPROM(USHORT p_port)
10875
#else
10876
void DiagEEPROM(ULONG p_port)
10877
#endif
10878
 
10879
{
10880
   USHORT index,temp,max_wd_cnt;
10881
 
10882
   if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
10883
      max_wd_cnt = EEPROM_WD_CNT;
10884
   else
10885
      max_wd_cnt = EEPROM_WD_CNT * 2;
10886
 
10887
   temp = utilEERead(p_port, FW_SIGNATURE/2);
10888
 
10889
   if (temp == 0x4641) {
10890
 
10891
      for (index = 2; index < max_wd_cnt; index++) {
10892
 
10893
         temp += utilEERead(p_port, index);
10894
 
10895
         }
10896
 
10897
      if (temp == utilEERead(p_port, EEPROM_CHECK_SUM/2)) {
10898
 
10899
         return;          /*EEPROM is Okay so return now! */
10900
         }
10901
      }
10902
 
10903
 
10904
   utilEEWriteOnOff(p_port,(UCHAR)1);
10905
 
10906
   for (index = 0; index < max_wd_cnt; index++) {
10907
 
10908
      utilEEWrite(p_port, 0x0000, index);
10909
      }
10910
 
10911
   temp = 0;
10912
 
10913
   utilEEWrite(p_port, 0x4641, FW_SIGNATURE/2);
10914
   temp += 0x4641;
10915
   utilEEWrite(p_port, 0x3920, MODEL_NUMB_0/2);
10916
   temp += 0x3920;
10917
   utilEEWrite(p_port, 0x3033, MODEL_NUMB_2/2);
10918
   temp += 0x3033;
10919
   utilEEWrite(p_port, 0x2020, MODEL_NUMB_4/2);
10920
   temp += 0x2020;
10921
   utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG/2);
10922
   temp += 0x70D3;
10923
   utilEEWrite(p_port, 0x0010, BIOS_CONFIG/2);
10924
   temp += 0x0010;
10925
   utilEEWrite(p_port, 0x0003, SCAM_CONFIG/2);
10926
   temp += 0x0003;
10927
   utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID/2);
10928
   temp += 0x0007;
10929
 
10930
   utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN/2);
10931
   temp += 0x0000;
10932
   utilEEWrite(p_port, 0x0000, SEND_START_ENA/2);
10933
   temp += 0x0000;
10934
   utilEEWrite(p_port, 0x0000, DEVICE_ENABLE/2);
10935
   temp += 0x0000;
10936
 
10937
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01/2);
10938
   temp += 0x4242;
10939
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23/2);
10940
   temp += 0x4242;
10941
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45/2);
10942
   temp += 0x4242;
10943
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67/2);
10944
   temp += 0x4242;
10945
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89/2);
10946
   temp += 0x4242;
10947
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab/2);
10948
   temp += 0x4242;
10949
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd/2);
10950
   temp += 0x4242;
10951
   utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef/2);
10952
   temp += 0x4242;
10953
 
10954
 
10955
   utilEEWrite(p_port, 0x6C46, 64/2);  /*PRODUCT ID */
10956
   temp += 0x6C46;
10957
   utilEEWrite(p_port, 0x7361, 66/2);  /* FlashPoint LT   */
10958
   temp += 0x7361;
10959
   utilEEWrite(p_port, 0x5068, 68/2);
10960
   temp += 0x5068;
10961
   utilEEWrite(p_port, 0x696F, 70/2);
10962
   temp += 0x696F;
10963
   utilEEWrite(p_port, 0x746E, 72/2);
10964
   temp += 0x746E;
10965
   utilEEWrite(p_port, 0x4C20, 74/2);
10966
   temp += 0x4C20;
10967
   utilEEWrite(p_port, 0x2054, 76/2);
10968
   temp += 0x2054;
10969
   utilEEWrite(p_port, 0x2020, 78/2);
10970
   temp += 0x2020;
10971
 
10972
   index = ((EE_SCAMBASE/2)+(7*16));
10973
   utilEEWrite(p_port, (0x0700+TYPE_CODE0), index);
10974
   temp += (0x0700+TYPE_CODE0);
10975
   index++;
10976
   utilEEWrite(p_port, 0x5542, index);            /*Vendor ID code */
10977
   temp += 0x5542;                                /* BUSLOGIC      */
10978
   index++;
10979
   utilEEWrite(p_port, 0x4C53, index);
10980
   temp += 0x4C53;
10981
   index++;
10982
   utilEEWrite(p_port, 0x474F, index);
10983
   temp += 0x474F;
10984
   index++;
10985
   utilEEWrite(p_port, 0x4349, index);
10986
   temp += 0x4349;
10987
   index++;
10988
   utilEEWrite(p_port, 0x5442, index);            /*Vendor unique code */
10989
   temp += 0x5442;                         /* BT- 930           */
10990
   index++;
10991
   utilEEWrite(p_port, 0x202D, index);
10992
   temp += 0x202D;
10993
   index++;
10994
   utilEEWrite(p_port, 0x3339, index);
10995
   temp += 0x3339;
10996
   index++;                                 /*Serial #          */
10997
   utilEEWrite(p_port, 0x2030, index);             /* 01234567         */
10998
   temp += 0x2030;
10999
   index++;
11000
   utilEEWrite(p_port, 0x5453, index);
11001
   temp += 0x5453;
11002
   index++;
11003
   utilEEWrite(p_port, 0x5645, index);
11004
   temp += 0x5645;
11005
   index++;
11006
   utilEEWrite(p_port, 0x2045, index);
11007
   temp += 0x2045;
11008
   index++;
11009
   utilEEWrite(p_port, 0x202F, index);
11010
   temp += 0x202F;
11011
   index++;
11012
   utilEEWrite(p_port, 0x4F4A, index);
11013
   temp += 0x4F4A;
11014
   index++;
11015
   utilEEWrite(p_port, 0x204E, index);
11016
   temp += 0x204E;
11017
   index++;
11018
   utilEEWrite(p_port, 0x3539, index);
11019
   temp += 0x3539;
11020
 
11021
 
11022
 
11023
   utilEEWrite(p_port, temp, EEPROM_CHECK_SUM/2);
11024
 
11025
   utilEEWriteOnOff(p_port,(UCHAR)0);
11026
 
11027
}
11028
 
11029
#ident "$Id: FlashPoint.c,v 1.1 2005-12-20 10:17:45 jcastillo Exp $"
11030
/*----------------------------------------------------------------------
11031
 *
11032
 *
11033
 *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
11034
 *
11035
 *   This file is available under both the GNU General Public License
11036
 *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
11037
 *
11038
 *   $Workfile:   utility.c  $
11039
 *
11040
 *   Description:  Utility functions relating to queueing and EEPROM
11041
 *                 manipulation and any other garbage functions.
11042
 *
11043
 *   $Date: 2005-12-20 10:17:45 $
11044
 *
11045
 *   $Revision: 1.1 $
11046
 *
11047
 *----------------------------------------------------------------------*/
11048
/*#include <globals.h>*/
11049
 
11050
#if (FW_TYPE==_UCB_MGR_)
11051
        /*#include <budi.h>*/
11052
#endif
11053
 
11054
/*#include <sccbmgr.h>*/
11055
/*#include <blx30.h>*/
11056
/*#include <target.h>*/
11057
/*#include <scsi2.h>*/
11058
/*#include <harpoon.h>*/
11059
 
11060
 
11061
/*
11062
extern SCCBCARD BL_Card[MAX_CARDS];
11063
extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
11064
extern unsigned int SccbGlobalFlags;
11065
*/
11066
 
11067
/*---------------------------------------------------------------------
11068
 *
11069
 * Function: Queue Search Select
11070
 *
11071
 * Description: Try to find a new command to execute.
11072
 *
11073
 *---------------------------------------------------------------------*/
11074
 
11075
void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
11076
{
11077
   UCHAR scan_ptr, lun;
11078
   PSCCBMgr_tar_info currTar_Info;
11079
        PSCCB pOldSccb;
11080
 
11081
   scan_ptr = pCurrCard->scanIndex;
11082
        do
11083
        {
11084
                currTar_Info = &sccbMgrTbl[p_card][scan_ptr];
11085
                if((pCurrCard->globalFlags & F_CONLUN_IO) &&
11086
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
11087
                {
11088
                        if (currTar_Info->TarSelQ_Cnt != 0)
11089
                        {
11090
 
11091
                                scan_ptr++;
11092
                                if (scan_ptr == MAX_SCSI_TAR)
11093
                                        scan_ptr = 0;
11094
 
11095
                                for(lun=0; lun < MAX_LUN; lun++)
11096
                                {
11097
                                        if(currTar_Info->TarLUNBusy[lun] == FALSE)
11098
                                        {
11099
 
11100
                                                pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
11101
                                                pOldSccb = NULL;
11102
 
11103
                                                while((pCurrCard->currentSCCB != NULL) &&
11104
                                                                 (lun != pCurrCard->currentSCCB->Lun))
11105
                                                {
11106
                                                        pOldSccb = pCurrCard->currentSCCB;
11107
                                                        pCurrCard->currentSCCB = (PSCCB)(pCurrCard->currentSCCB)->
11108
                                                                                                                                        Sccb_forwardlink;
11109
                                                }
11110
                                                if(pCurrCard->currentSCCB == NULL)
11111
                                                        continue;
11112
                                                if(pOldSccb != NULL)
11113
                                                {
11114
                                                        pOldSccb->Sccb_forwardlink = (PSCCB)(pCurrCard->currentSCCB)->
11115
                                                                                                                                        Sccb_forwardlink;
11116
                                                        pOldSccb->Sccb_backlink = (PSCCB)(pCurrCard->currentSCCB)->
11117
                                                                                                                                        Sccb_backlink;
11118
                                                        currTar_Info->TarSelQ_Cnt--;
11119
                                                }
11120
                                                else
11121
                                                {
11122
                                                        currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
11123
 
11124
                                                        if (currTar_Info->TarSelQ_Head == NULL)
11125
                                                        {
11126
                                                                currTar_Info->TarSelQ_Tail = NULL;
11127
                                                                currTar_Info->TarSelQ_Cnt = 0;
11128
                                                        }
11129
                                                        else
11130
                                                        {
11131
                                                                currTar_Info->TarSelQ_Cnt--;
11132
                                                                currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
11133
                                                        }
11134
                                                }
11135
                                        pCurrCard->scanIndex = scan_ptr;
11136
 
11137
                                        pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11138
 
11139
                                        break;
11140
                                        }
11141
                                }
11142
                        }
11143
 
11144
                        else
11145
                        {
11146
                                scan_ptr++;
11147
                                if (scan_ptr == MAX_SCSI_TAR) {
11148
                                        scan_ptr = 0;
11149
                                }
11150
                        }
11151
 
11152
                }
11153
                else
11154
                {
11155
                        if ((currTar_Info->TarSelQ_Cnt != 0) &&
11156
                                (currTar_Info->TarLUNBusy[0] == FALSE))
11157
                        {
11158
 
11159
                                pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
11160
 
11161
                                currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
11162
 
11163
                                if (currTar_Info->TarSelQ_Head == NULL)
11164
                                {
11165
                                        currTar_Info->TarSelQ_Tail = NULL;
11166
                                        currTar_Info->TarSelQ_Cnt = 0;
11167
                                }
11168
                                else
11169
                                {
11170
                                        currTar_Info->TarSelQ_Cnt--;
11171
                                        currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
11172
                                }
11173
 
11174
                                scan_ptr++;
11175
                                if (scan_ptr == MAX_SCSI_TAR)
11176
                                        scan_ptr = 0;
11177
 
11178
                                pCurrCard->scanIndex = scan_ptr;
11179
 
11180
                                pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11181
 
11182
                                break;
11183
                        }
11184
 
11185
                        else
11186
                        {
11187
                                scan_ptr++;
11188
                                if (scan_ptr == MAX_SCSI_TAR)
11189
                                {
11190
                                        scan_ptr = 0;
11191
                                }
11192
                        }
11193
                }
11194
        } while (scan_ptr != pCurrCard->scanIndex);
11195
}
11196
 
11197
 
11198
/*---------------------------------------------------------------------
11199
 *
11200
 * Function: Queue Select Fail
11201
 *
11202
 * Description: Add the current SCCB to the head of the Queue.
11203
 *
11204
 *---------------------------------------------------------------------*/
11205
 
11206
void queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
11207
{
11208
   UCHAR thisTarg;
11209
   PSCCBMgr_tar_info currTar_Info;
11210
 
11211
   if (pCurrCard->currentSCCB != NULL)
11212
          {
11213
          thisTarg = (UCHAR)(((PSCCB)(pCurrCard->currentSCCB))->TargID);
11214
      currTar_Info = &sccbMgrTbl[p_card][thisTarg];
11215
 
11216
      pCurrCard->currentSCCB->Sccb_backlink = (PSCCB)NULL;
11217
 
11218
      pCurrCard->currentSCCB->Sccb_forwardlink = currTar_Info->TarSelQ_Head;
11219
 
11220
          if (currTar_Info->TarSelQ_Cnt == 0)
11221
                 {
11222
                 currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
11223
                 }
11224
 
11225
          else
11226
                 {
11227
                 currTar_Info->TarSelQ_Head->Sccb_backlink = pCurrCard->currentSCCB;
11228
                 }
11229
 
11230
 
11231
          currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
11232
 
11233
          pCurrCard->currentSCCB = NULL;
11234
          currTar_Info->TarSelQ_Cnt++;
11235
          }
11236
}
11237
/*---------------------------------------------------------------------
11238
 *
11239
 * Function: Queue Command Complete
11240
 *
11241
 * Description: Call the callback function with the current SCCB.
11242
 *
11243
 *---------------------------------------------------------------------*/
11244
 
11245
void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
11246
{
11247
 
11248
#if (FW_TYPE==_UCB_MGR_)
11249
 
11250
   u08bits SCSIcmd;
11251
   CALL_BK_FN callback;
11252
   PSCCBMgr_tar_info currTar_Info;
11253
 
11254
   PUCB p_ucb;
11255
   p_ucb=p_sccb->Sccb_ucb_ptr;
11256
 
11257
   SCSIcmd = p_sccb->Cdb[0];
11258
 
11259
 
11260
   if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED))
11261
   {
11262
 
11263
      if ((p_ucb->UCB_opcode & OPC_CHK_UNDER_OVER_RUN)                     &&
11264
         (p_sccb->HostStatus == SCCB_COMPLETE)                             &&
11265
         (p_sccb->TargetStatus != SSCHECK))
11266
 
11267
         if ((SCSIcmd == SCSI_READ)             ||
11268
             (SCSIcmd == SCSI_WRITE)            ||
11269
             (SCSIcmd == SCSI_READ_EXTENDED)    ||
11270
             (SCSIcmd == SCSI_WRITE_EXTENDED)   ||
11271
             (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
11272
             (SCSIcmd == SCSI_START_STOP_UNIT)  ||
11273
             (pCurrCard->globalFlags & F_NO_FILTER)
11274
            )
11275
               p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
11276
   }
11277
 
11278
   p_ucb->UCB_status=SCCB_SUCCESS;
11279
 
11280
   if ((p_ucb->UCB_hbastat=p_sccb->HostStatus) || (p_ucb->UCB_scsistat=p_sccb->TargetStatus))
11281
   {
11282
      p_ucb->UCB_status=SCCB_ERROR;
11283
   }
11284
 
11285
   if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
11286
      (p_sccb->OperationCode == RESIDUAL_COMMAND))
11287
   {
11288
 
11289
         utilUpdateResidual(p_sccb);
11290
 
11291
         p_ucb->UCB_datalen=p_sccb->DataLength;
11292
   }
11293
 
11294
   pCurrCard->cmdCounter--;
11295
   if (!pCurrCard->cmdCounter)
11296
   {
11297
 
11298
      if (pCurrCard->globalFlags & F_GREEN_PC)
11299
      {
11300
         WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
11301
         WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
11302
      }
11303
 
11304
      WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
11305
      (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
11306
   }
11307
 
11308
        if(pCurrCard->discQCount != 0)
11309
        {
11310
      currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
11311
                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
11312
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
11313
                {
11314
                        pCurrCard->discQCount--;
11315
                        pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
11316
                }
11317
                else
11318
                {
11319
                        if(p_sccb->Sccb_tag)
11320
                        {
11321
                                pCurrCard->discQCount--;
11322
                                pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
11323
                        }else
11324
                        {
11325
                                pCurrCard->discQCount--;
11326
                                pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
11327
                        }
11328
                }
11329
 
11330
        }
11331
   callback = (CALL_BK_FN)p_ucb->UCB_callback;
11332
   callback(p_ucb);
11333
   pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11334
   pCurrCard->currentSCCB = NULL;
11335
}
11336
 
11337
 
11338
 
11339
 
11340
#else
11341
 
11342
   UCHAR i, SCSIcmd;
11343
   CALL_BK_FN callback;
11344
   PSCCBMgr_tar_info currTar_Info;
11345
 
11346
   SCSIcmd = p_sccb->Cdb[0];
11347
 
11348
 
11349
   if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
11350
 
11351
          if ((p_sccb->ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN)) &&
11352
                 (p_sccb->HostStatus == SCCB_COMPLETE)                             &&
11353
                 (p_sccb->TargetStatus != SSCHECK))
11354
 
11355
                 if ((SCSIcmd == SCSI_READ)             ||
11356
                         (SCSIcmd == SCSI_WRITE)            ||
11357
                         (SCSIcmd == SCSI_READ_EXTENDED)    ||
11358
                         (SCSIcmd == SCSI_WRITE_EXTENDED)   ||
11359
                         (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
11360
                         (SCSIcmd == SCSI_START_STOP_UNIT)  ||
11361
                         (pCurrCard->globalFlags & F_NO_FILTER)
11362
                        )
11363
                           p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
11364
          }
11365
 
11366
 
11367
        if(p_sccb->SccbStatus == SCCB_IN_PROCESS)
11368
        {
11369
           if (p_sccb->HostStatus || p_sccb->TargetStatus)
11370
                  p_sccb->SccbStatus = SCCB_ERROR;
11371
           else
11372
                  p_sccb->SccbStatus = SCCB_SUCCESS;
11373
        }
11374
 
11375
   if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
11376
 
11377
          p_sccb->CdbLength = p_sccb->Save_CdbLen;
11378
          for (i=0; i < 6; i++) {
11379
                 p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
11380
                 }
11381
          }
11382
 
11383
   if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
11384
          (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
11385
 
11386
                 utilUpdateResidual(p_sccb);
11387
                 }
11388
 
11389
   pCurrCard->cmdCounter--;
11390
   if (!pCurrCard->cmdCounter) {
11391
 
11392
          if (pCurrCard->globalFlags & F_GREEN_PC) {
11393
                 WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
11394
                 WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
11395
                 }
11396
 
11397
          WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
11398
          (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
11399
 
11400
          }
11401
 
11402
        if(pCurrCard->discQCount != 0)
11403
        {
11404
      currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
11405
                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
11406
                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
11407
                {
11408
                        pCurrCard->discQCount--;
11409
                        pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
11410
                }
11411
                else
11412
                {
11413
                        if(p_sccb->Sccb_tag)
11414
                        {
11415
                                pCurrCard->discQCount--;
11416
                                pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
11417
                        }else
11418
                        {
11419
                                pCurrCard->discQCount--;
11420
                                pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
11421
                        }
11422
                }
11423
 
11424
        }
11425
 
11426
        callback = (CALL_BK_FN)p_sccb->SccbCallback;
11427
   callback(p_sccb);
11428
   pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11429
   pCurrCard->currentSCCB = NULL;
11430
}
11431
#endif /* ( if FW_TYPE==...) */
11432
 
11433
 
11434
/*---------------------------------------------------------------------
11435
 *
11436
 * Function: Queue Disconnect
11437
 *
11438
 * Description: Add SCCB to our disconnect array.
11439
 *
11440
 *---------------------------------------------------------------------*/
11441
void queueDisconnect(PSCCB p_sccb, UCHAR p_card)
11442
{
11443
   PSCCBMgr_tar_info currTar_Info;
11444
 
11445
        currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
11446
 
11447
        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
11448
                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
11449
        {
11450
                BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = p_sccb;
11451
        }
11452
        else
11453
        {
11454
                if (p_sccb->Sccb_tag)
11455
                {
11456
                        BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = p_sccb;
11457
                        sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = FALSE;
11458
                        sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
11459
                }else
11460
                {
11461
                        BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = p_sccb;
11462
                }
11463
        }
11464
        BL_Card[p_card].currentSCCB = NULL;
11465
}
11466
 
11467
 
11468
/*---------------------------------------------------------------------
11469
 *
11470
 * Function: Queue Flush SCCB
11471
 *
11472
 * Description: Flush all SCCB's back to the host driver for this target.
11473
 *
11474
 *---------------------------------------------------------------------*/
11475
 
11476
void  queueFlushSccb(UCHAR p_card, UCHAR error_code)
11477
{
11478
   UCHAR qtag,thisTarg;
11479
   PSCCB currSCCB;
11480
   PSCCBMgr_tar_info currTar_Info;
11481
 
11482
   currSCCB = BL_Card[p_card].currentSCCB;
11483
        if(currSCCB != NULL)
11484
        {
11485
           thisTarg = (UCHAR)currSCCB->TargID;
11486
        currTar_Info = &sccbMgrTbl[p_card][thisTarg];
11487
 
11488
           for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
11489
 
11490
                  if (BL_Card[p_card].discQ_Tbl[qtag] &&
11491
                                        (BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
11492
                         {
11493
 
11494
                         BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
11495
 
11496
                         queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
11497
 
11498
                         BL_Card[p_card].discQ_Tbl[qtag] = NULL;
11499
                         currTar_Info->TarTagQ_Cnt--;
11500
 
11501
                         }
11502
                  }
11503
        }
11504
 
11505
}
11506
 
11507
/*---------------------------------------------------------------------
11508
 *
11509
 * Function: Queue Flush Target SCCB
11510
 *
11511
 * Description: Flush all SCCB's back to the host driver for this target.
11512
 *
11513
 *---------------------------------------------------------------------*/
11514
 
11515
void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code)
11516
{
11517
   UCHAR qtag;
11518
   PSCCBMgr_tar_info currTar_Info;
11519
 
11520
   currTar_Info = &sccbMgrTbl[p_card][thisTarg];
11521
 
11522
   for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
11523
 
11524
          if (BL_Card[p_card].discQ_Tbl[qtag] &&
11525
                                (BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
11526
                 {
11527
 
11528
                 BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
11529
 
11530
                 queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
11531
 
11532
                 BL_Card[p_card].discQ_Tbl[qtag] = NULL;
11533
                 currTar_Info->TarTagQ_Cnt--;
11534
 
11535
                 }
11536
          }
11537
 
11538
}
11539
 
11540
 
11541
 
11542
 
11543
 
11544
void queueAddSccb(PSCCB p_SCCB, UCHAR p_card)
11545
{
11546
   PSCCBMgr_tar_info currTar_Info;
11547
   currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
11548
 
11549
   p_SCCB->Sccb_forwardlink = NULL;
11550
 
11551
   p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
11552
 
11553
   if (currTar_Info->TarSelQ_Cnt == 0) {
11554
 
11555
          currTar_Info->TarSelQ_Head = p_SCCB;
11556
          }
11557
 
11558
   else {
11559
 
11560
          currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
11561
          }
11562
 
11563
 
11564
   currTar_Info->TarSelQ_Tail = p_SCCB;
11565
   currTar_Info->TarSelQ_Cnt++;
11566
}
11567
 
11568
 
11569
/*---------------------------------------------------------------------
11570
 *
11571
 * Function: Queue Find SCCB
11572
 *
11573
 * Description: Search the target select Queue for this SCCB, and
11574
 *              remove it if found.
11575
 *
11576
 *---------------------------------------------------------------------*/
11577
 
11578
UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
11579
{
11580
   PSCCB q_ptr;
11581
   PSCCBMgr_tar_info currTar_Info;
11582
 
11583
   currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
11584
 
11585
   q_ptr = currTar_Info->TarSelQ_Head;
11586
 
11587
   while(q_ptr != NULL) {
11588
 
11589
          if (q_ptr == p_SCCB) {
11590
 
11591
 
11592
                 if (currTar_Info->TarSelQ_Head == q_ptr) {
11593
 
11594
                        currTar_Info->TarSelQ_Head = q_ptr->Sccb_forwardlink;
11595
                        }
11596
 
11597
                 if (currTar_Info->TarSelQ_Tail == q_ptr) {
11598
 
11599
                        currTar_Info->TarSelQ_Tail = q_ptr->Sccb_backlink;
11600
                        }
11601
 
11602
                 if (q_ptr->Sccb_forwardlink != NULL) {
11603
                        q_ptr->Sccb_forwardlink->Sccb_backlink = q_ptr->Sccb_backlink;
11604
                        }
11605
 
11606
                 if (q_ptr->Sccb_backlink != NULL) {
11607
                        q_ptr->Sccb_backlink->Sccb_forwardlink = q_ptr->Sccb_forwardlink;
11608
                        }
11609
 
11610
                 currTar_Info->TarSelQ_Cnt--;
11611
 
11612
                 return(TRUE);
11613
                 }
11614
 
11615
          else {
11616
                 q_ptr = q_ptr->Sccb_forwardlink;
11617
                 }
11618
          }
11619
 
11620
 
11621
   return(FALSE);
11622
 
11623
}
11624
 
11625
 
11626
/*---------------------------------------------------------------------
11627
 *
11628
 * Function: Utility Update Residual Count
11629
 *
11630
 * Description: Update the XferCnt to the remaining byte count.
11631
 *              If we transferred all the data then just write zero.
11632
 *              If Non-SG transfer then report Total Cnt - Actual Transfer
11633
 *              Cnt.  For SG transfers add the count fields of all
11634
 *              remaining SG elements, as well as any partial remaining
11635
 *              element.
11636
 *
11637
 *---------------------------------------------------------------------*/
11638
 
11639
void  utilUpdateResidual(PSCCB p_SCCB)
11640
{
11641
   ULONG partial_cnt;
11642
   UINT  sg_index;
11643
#if defined(COMPILER_16_BIT) && !defined(DOS)
11644
   ULONG far *sg_ptr;
11645
#else
11646
   ULONG *sg_ptr;
11647
#endif
11648
 
11649
   if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
11650
 
11651
          p_SCCB->DataLength = 0x0000;
11652
          }
11653
 
11654
   else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
11655
 
11656
                 partial_cnt = 0x0000;
11657
 
11658
                 sg_index = p_SCCB->Sccb_sgseg;
11659
 
11660
#if defined(COMPILER_16_BIT) && !defined(DOS)
11661
                 sg_ptr = (ULONG far *)p_SCCB->DataPointer;
11662
#else
11663
                 sg_ptr = (ULONG *)p_SCCB->DataPointer;
11664
#endif
11665
 
11666
                 if (p_SCCB->Sccb_SGoffset) {
11667
 
11668
                        partial_cnt = p_SCCB->Sccb_SGoffset;
11669
                        sg_index++;
11670
                        }
11671
 
11672
                 while ( ((ULONG)sg_index * (ULONG)SG_ELEMENT_SIZE) <
11673
                        p_SCCB->DataLength ) {
11674
 
11675
                        partial_cnt += *(sg_ptr+(sg_index * 2));
11676
                        sg_index++;
11677
                        }
11678
 
11679
                 p_SCCB->DataLength = partial_cnt;
11680
                 }
11681
 
11682
          else {
11683
 
11684
                 p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
11685
                 }
11686
}
11687
 
11688
 
11689
/*---------------------------------------------------------------------
11690
 *
11691
 * Function: Wait 1 Second
11692
 *
11693
 * Description: Wait for 1 second.
11694
 *
11695
 *---------------------------------------------------------------------*/
11696
 
11697
#if defined(DOS)
11698
void Wait1Second(USHORT p_port)
11699
#else
11700
void Wait1Second(ULONG p_port)
11701
#endif
11702
{
11703
   UCHAR i;
11704
 
11705
   for(i=0; i < 4; i++) {
11706
 
11707
          Wait(p_port, TO_250ms);
11708
 
11709
          if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
11710
                 break;
11711
 
11712
          if((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
11713
                 break;
11714
          }
11715
}
11716
 
11717
 
11718
/*---------------------------------------------------------------------
11719
 *
11720
 * Function: Wait
11721
 *
11722
 * Description: Wait the desired delay.
11723
 *
11724
 *---------------------------------------------------------------------*/
11725
 
11726
#if defined(DOS)
11727
void Wait(USHORT p_port, UCHAR p_delay)
11728
#else
11729
void Wait(ULONG p_port, UCHAR p_delay)
11730
#endif
11731
{
11732
   UCHAR old_timer;
11733
   UCHAR green_flag;
11734
 
11735
   old_timer = RD_HARPOON(p_port+hp_seltimeout);
11736
 
11737
   green_flag=RD_HARPOON(p_port+hp_clkctrl_0);
11738
   WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
11739
 
11740
   WR_HARPOON(p_port+hp_seltimeout,p_delay);
11741
   WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
11742
   WRW_HARPOON((p_port+hp_intena), (default_intena & ~TIMEOUT));
11743
 
11744
 
11745
   WR_HARPOON(p_port+hp_portctrl_0,
11746
          (RD_HARPOON(p_port+hp_portctrl_0) | START_TO));
11747
 
11748
   while (!(RDW_HARPOON((p_port+hp_intstat)) & TIMEOUT)) {
11749
 
11750
          if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
11751
                 break;
11752
 
11753
          if ((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
11754
                 break;
11755
          }
11756
 
11757
   WR_HARPOON(p_port+hp_portctrl_0,
11758
          (RD_HARPOON(p_port+hp_portctrl_0) & ~START_TO));
11759
 
11760
   WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
11761
   WRW_HARPOON((p_port+hp_intena), default_intena);
11762
 
11763
   WR_HARPOON(p_port+hp_clkctrl_0,green_flag);
11764
 
11765
   WR_HARPOON(p_port+hp_seltimeout,old_timer);
11766
}
11767
 
11768
 
11769
/*---------------------------------------------------------------------
11770
 *
11771
 * Function: Enable/Disable Write to EEPROM
11772
 *
11773
 * Description: The EEPROM must first be enabled for writes
11774
 *              A total of 9 clocks are needed.
11775
 *
11776
 *---------------------------------------------------------------------*/
11777
 
11778
#if defined(DOS)
11779
void utilEEWriteOnOff(USHORT p_port,UCHAR p_mode)
11780
#else
11781
void utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
11782
#endif
11783
{
11784
   UCHAR ee_value;
11785
 
11786
   ee_value = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H));
11787
 
11788
   if (p_mode)
11789
 
11790
          utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
11791
 
11792
   else
11793
 
11794
 
11795
          utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
11796
 
11797
   WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
11798
   WR_HARPOON(p_port+hp_ee_ctrl, ee_value);       /*Turn off Master Select */
11799
}
11800
 
11801
 
11802
/*---------------------------------------------------------------------
11803
 *
11804
 * Function: Write EEPROM
11805
 *
11806
 * Description: Write a word to the EEPROM at the specified
11807
 *              address.
11808
 *
11809
 *---------------------------------------------------------------------*/
11810
 
11811
#if defined(DOS)
11812
void utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr)
11813
#else
11814
void utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
11815
#endif
11816
{
11817
 
11818
   UCHAR ee_value;
11819
   USHORT i;
11820
 
11821
   ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
11822
                   (SEE_MS | SEE_CS));
11823
 
11824
 
11825
 
11826
   utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
11827
 
11828
 
11829
   ee_value |= (SEE_MS + SEE_CS);
11830
 
11831
   for(i = 0x8000; i != 0; i>>=1) {
11832
 
11833
          if (i & ee_data)
11834
         ee_value |= SEE_DO;
11835
          else
11836
         ee_value &= ~SEE_DO;
11837
 
11838
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11839
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11840
          ee_value |= SEE_CLK;          /* Clock  data! */
11841
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11842
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11843
          ee_value &= ~SEE_CLK;
11844
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11845
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11846
          }
11847
   ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
11848
   WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));
11849
 
11850
   Wait(p_port, TO_10ms);
11851
 
11852
   WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */
11853
   WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));       /* Turn off CS */
11854
   WR_HARPOON(p_port+hp_ee_ctrl, ee_value);       /* Turn off Master Select */
11855
}
11856
 
11857
/*---------------------------------------------------------------------
11858
 *
11859
 * Function: Read EEPROM
11860
 *
11861
 * Description: Read a word from the EEPROM at the desired
11862
 *              address.
11863
 *
11864
 *---------------------------------------------------------------------*/
11865
 
11866
#if defined(DOS)
11867
USHORT utilEERead(USHORT p_port, USHORT ee_addr)
11868
#else
11869
USHORT utilEERead(ULONG p_port, USHORT ee_addr)
11870
#endif
11871
{
11872
   USHORT i, ee_data1, ee_data2;
11873
 
11874
        i = 0;
11875
        ee_data1 = utilEEReadOrg(p_port, ee_addr);
11876
        do
11877
        {
11878
                ee_data2 = utilEEReadOrg(p_port, ee_addr);
11879
 
11880
                if(ee_data1 == ee_data2)
11881
                        return(ee_data1);
11882
 
11883
                ee_data1 = ee_data2;
11884
                i++;
11885
 
11886
        }while(i < 4);
11887
 
11888
        return(ee_data1);
11889
}
11890
 
11891
/*---------------------------------------------------------------------
11892
 *
11893
 * Function: Read EEPROM Original
11894
 *
11895
 * Description: Read a word from the EEPROM at the desired
11896
 *              address.
11897
 *
11898
 *---------------------------------------------------------------------*/
11899
 
11900
#if defined(DOS)
11901
USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr)
11902
#else
11903
USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr)
11904
#endif
11905
{
11906
 
11907
   UCHAR ee_value;
11908
   USHORT i, ee_data;
11909
 
11910
   ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
11911
                   (SEE_MS | SEE_CS));
11912
 
11913
 
11914
   utilEESendCmdAddr(p_port, EE_READ, ee_addr);
11915
 
11916
 
11917
   ee_value |= (SEE_MS + SEE_CS);
11918
   ee_data = 0;
11919
 
11920
   for(i = 1; i <= 16; i++) {
11921
 
11922
          ee_value |= SEE_CLK;          /* Clock  data! */
11923
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11924
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11925
          ee_value &= ~SEE_CLK;
11926
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11927
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11928
 
11929
          ee_data <<= 1;
11930
 
11931
          if (RD_HARPOON(p_port+hp_ee_ctrl) & SEE_DI)
11932
                 ee_data |= 1;
11933
          }
11934
 
11935
   ee_value &= ~(SEE_MS + SEE_CS);
11936
   WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
11937
   WR_HARPOON(p_port+hp_ee_ctrl, ee_value);   /*Turn off Master Select */
11938
 
11939
   return(ee_data);
11940
}
11941
 
11942
 
11943
/*---------------------------------------------------------------------
11944
 *
11945
 * Function: Send EE command and Address to the EEPROM
11946
 *
11947
 * Description: Transfers the correct command and sends the address
11948
 *              to the eeprom.
11949
 *
11950
 *---------------------------------------------------------------------*/
11951
 
11952
#if defined(DOS)
11953
void utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr)
11954
#else
11955
void utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr)
11956
#endif
11957
{
11958
   UCHAR ee_value;
11959
   UCHAR narrow_flg;
11960
 
11961
   USHORT i;
11962
 
11963
 
11964
   narrow_flg= (UCHAR)(RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD);
11965
 
11966
 
11967
   ee_value = SEE_MS;
11968
   WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11969
 
11970
   ee_value |= SEE_CS;                             /* Set CS to EEPROM */
11971
   WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11972
 
11973
 
11974
   for(i = 0x04; i != 0; i>>=1) {
11975
 
11976
          if (i & ee_cmd)
11977
                 ee_value |= SEE_DO;
11978
          else
11979
                 ee_value &= ~SEE_DO;
11980
 
11981
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11982
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11983
          ee_value |= SEE_CLK;                         /* Clock  data! */
11984
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11985
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11986
          ee_value &= ~SEE_CLK;
11987
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11988
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11989
          }
11990
 
11991
 
11992
   if (narrow_flg)
11993
          i = 0x0080;
11994
 
11995
   else
11996
          i = 0x0200;
11997
 
11998
 
11999
   while (i != 0) {
12000
 
12001
          if (i & ee_addr)
12002
                 ee_value |= SEE_DO;
12003
          else
12004
                 ee_value &= ~SEE_DO;
12005
 
12006
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12007
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12008
          ee_value |= SEE_CLK;                         /* Clock  data! */
12009
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12010
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12011
          ee_value &= ~SEE_CLK;
12012
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12013
          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12014
 
12015
          i >>= 1;
12016
          }
12017
}
12018
 
12019
USHORT CalcCrc16(UCHAR buffer[])
12020
{
12021
   USHORT crc=0;
12022
        int i,j;
12023
   USHORT ch;
12024
   for (i=0; i < ID_STRING_LENGTH; i++)
12025
   {
12026
      ch = (USHORT) buffer[i];
12027
           for(j=0; j < 8; j++)
12028
           {
12029
                   if ((crc ^ ch) & 1)
12030
            crc = (crc >> 1) ^ CRCMASK;
12031
                   else
12032
            crc >>= 1;
12033
                   ch >>= 1;
12034
           }
12035
   }
12036
        return(crc);
12037
}
12038
 
12039
UCHAR CalcLrc(UCHAR buffer[])
12040
{
12041
        int i;
12042
        UCHAR lrc;
12043
        lrc = 0;
12044
        for(i = 0; i < ID_STRING_LENGTH; i++)
12045
                lrc ^= buffer[i];
12046
        return(lrc);
12047
}
12048
 
12049
 
12050
 
12051
/*
12052
  The following inline definitions avoid type conflicts.
12053
*/
12054
 
12055
static inline unsigned char
12056
FlashPoint__ProbeHostAdapter(FlashPoint_Info_T *FlashPointInfo)
12057
{
12058
  return FlashPoint_ProbeHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
12059
}
12060
 
12061
 
12062
static inline FlashPoint_CardHandle_T
12063
FlashPoint__HardwareResetHostAdapter(FlashPoint_Info_T *FlashPointInfo)
12064
{
12065
  return FlashPoint_HardwareResetHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
12066
}
12067
 
12068
static inline void
12069
FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle)
12070
{
12071
  FlashPoint_ReleaseHostAdapter(CardHandle);
12072
}
12073
 
12074
 
12075
static inline void
12076
FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB)
12077
{
12078
  FlashPoint_StartCCB(CardHandle, (PSCCB) CCB);
12079
}
12080
 
12081
 
12082
static inline void
12083
FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB)
12084
{
12085
  FlashPoint_AbortCCB(CardHandle, (PSCCB) CCB);
12086
}
12087
 
12088
 
12089
static inline boolean
12090
FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)
12091
{
12092
  return FlashPoint_InterruptPending(CardHandle);
12093
}
12094
 
12095
 
12096
static inline int
12097
FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle)
12098
{
12099
  return FlashPoint_HandleInterrupt(CardHandle);
12100
}
12101
 
12102
 
12103
#define FlashPoint_ProbeHostAdapter         FlashPoint__ProbeHostAdapter
12104
#define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
12105
#define FlashPoint_ReleaseHostAdapter       FlashPoint__ReleaseHostAdapter
12106
#define FlashPoint_StartCCB                 FlashPoint__StartCCB
12107
#define FlashPoint_AbortCCB                 FlashPoint__AbortCCB
12108
#define FlashPoint_InterruptPending         FlashPoint__InterruptPending
12109
#define FlashPoint_HandleInterrupt          FlashPoint__HandleInterrupt
12110
 
12111
 
12112
/*
12113
  FlashPoint_InquireTargetInfo returns the Synchronous Period, Synchronous
12114
  Offset, and Wide Transfers Active information for TargetID on CardHandle.
12115
*/
12116
 
12117
void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T CardHandle,
12118
                                  int TargetID,
12119
                                  unsigned char *SynchronousPeriod,
12120
                                  unsigned char *SynchronousOffset,
12121
                                  unsigned char *WideTransfersActive)
12122
{
12123
  SCCBMGR_TAR_INFO *TargetInfo =
12124
    &sccbMgrTbl[((SCCBCARD *)CardHandle)->cardIndex][TargetID];
12125
  if ((TargetInfo->TarSyncCtrl & SYNC_OFFSET) > 0)
12126
    {
12127
      *SynchronousPeriod = 5 * ((TargetInfo->TarSyncCtrl >> 5) + 1);
12128
      *SynchronousOffset = TargetInfo->TarSyncCtrl & SYNC_OFFSET;
12129
    }
12130
  else
12131
    {
12132
      *SynchronousPeriod = 0;
12133
      *SynchronousOffset = 0;
12134
    }
12135
  *WideTransfersActive = (TargetInfo->TarSyncCtrl & NARROW_SCSI ? 0 : 1);
12136
}
12137
 
12138
 
12139
#else  /* CONFIG_SCSI_OMIT_FLASHPOINT */
12140
 
12141
 
12142
/*
12143
  Define prototypes for the FlashPoint SCCB Manager Functions.
12144
*/
12145
 
12146
extern unsigned char FlashPoint_ProbeHostAdapter(FlashPoint_Info_T *);
12147
extern FlashPoint_CardHandle_T
12148
       FlashPoint_HardwareResetHostAdapter(FlashPoint_Info_T *);
12149
extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *);
12150
extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *);
12151
extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
12152
extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T);
12153
extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T);
12154
extern void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T,
12155
                                         int, unsigned char *,
12156
                                         unsigned char *, unsigned char *);
12157
 
12158
 
12159
#endif /* CONFIG_SCSI_OMIT_FLASHPOINT */

powered by: WebSVN 2.1.0

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