|
|
1.1 root 1: /*
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: 1999/04/26 05:53:56 $
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: 1999/04/26 05:53:56 $
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: 1999/04/26 05:53:56 $
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: 1999/04/26 05:53:56 $
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: 1999/04/26 05:53:56 $
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: 1999/04/26 05:53:56 $
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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.