18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci  FlashPoint.c -- FlashPoint SCCB Manager for Linux
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci  This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
68c2ecf20Sopenharmony_ci  Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
78c2ecf20Sopenharmony_ci  Linux compatibility.  It was provided by BusLogic in the form of 16 separate
88c2ecf20Sopenharmony_ci  source files, which would have unnecessarily cluttered the scsi directory, so
98c2ecf20Sopenharmony_ci  the individual files have been combined into this single file.
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci  Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci  This file is available under both the GNU General Public License
148c2ecf20Sopenharmony_ci  and a BSD-style copyright; see LICENSE.FlashPoint for details.
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci*/
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#ifdef CONFIG_SCSI_FLASHPOINT
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define MAX_CARDS	8
228c2ecf20Sopenharmony_ci#undef BUSTYPE_PCI
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define CRCMASK	0xA001
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#define FAILURE         0xFFFFFFFFL
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistruct sccb;
298c2ecf20Sopenharmony_citypedef void (*CALL_BK_FN) (struct sccb *);
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct sccb_mgr_info {
328c2ecf20Sopenharmony_ci	u32 si_baseaddr;
338c2ecf20Sopenharmony_ci	unsigned char si_present;
348c2ecf20Sopenharmony_ci	unsigned char si_intvect;
358c2ecf20Sopenharmony_ci	unsigned char si_id;
368c2ecf20Sopenharmony_ci	unsigned char si_lun;
378c2ecf20Sopenharmony_ci	u16 si_fw_revision;
388c2ecf20Sopenharmony_ci	u16 si_per_targ_init_sync;
398c2ecf20Sopenharmony_ci	u16 si_per_targ_fast_nego;
408c2ecf20Sopenharmony_ci	u16 si_per_targ_ultra_nego;
418c2ecf20Sopenharmony_ci	u16 si_per_targ_no_disc;
428c2ecf20Sopenharmony_ci	u16 si_per_targ_wide_nego;
438c2ecf20Sopenharmony_ci	u16 si_mflags;
448c2ecf20Sopenharmony_ci	unsigned char si_card_family;
458c2ecf20Sopenharmony_ci	unsigned char si_bustype;
468c2ecf20Sopenharmony_ci	unsigned char si_card_model[3];
478c2ecf20Sopenharmony_ci	unsigned char si_relative_cardnum;
488c2ecf20Sopenharmony_ci	unsigned char si_reserved[4];
498c2ecf20Sopenharmony_ci	u32 si_OS_reserved;
508c2ecf20Sopenharmony_ci	unsigned char si_XlatInfo[4];
518c2ecf20Sopenharmony_ci	u32 si_reserved2[5];
528c2ecf20Sopenharmony_ci	u32 si_secondary_range;
538c2ecf20Sopenharmony_ci};
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci#define SCSI_PARITY_ENA		  0x0001
568c2ecf20Sopenharmony_ci#define LOW_BYTE_TERM		  0x0010
578c2ecf20Sopenharmony_ci#define HIGH_BYTE_TERM		  0x0020
588c2ecf20Sopenharmony_ci#define BUSTYPE_PCI	  0x3
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#define SUPPORT_16TAR_32LUN	  0x0002
618c2ecf20Sopenharmony_ci#define SOFT_RESET		  0x0004
628c2ecf20Sopenharmony_ci#define EXTENDED_TRANSLATION	  0x0008
638c2ecf20Sopenharmony_ci#define POST_ALL_UNDERRRUNS	  0x0040
648c2ecf20Sopenharmony_ci#define FLAG_SCAM_ENABLED	  0x0080
658c2ecf20Sopenharmony_ci#define FLAG_SCAM_LEVEL2	  0x0100
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci#define HARPOON_FAMILY        0x02
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci/* SCCB struct used for both SCCB and UCB manager compiles!
708c2ecf20Sopenharmony_ci * The UCB Manager treats the SCCB as it's 'native hardware structure'
718c2ecf20Sopenharmony_ci */
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci/*#pragma pack(1)*/
748c2ecf20Sopenharmony_cistruct sccb {
758c2ecf20Sopenharmony_ci	unsigned char OperationCode;
768c2ecf20Sopenharmony_ci	unsigned char ControlByte;
778c2ecf20Sopenharmony_ci	unsigned char CdbLength;
788c2ecf20Sopenharmony_ci	unsigned char RequestSenseLength;
798c2ecf20Sopenharmony_ci	u32 DataLength;
808c2ecf20Sopenharmony_ci	void *DataPointer;
818c2ecf20Sopenharmony_ci	unsigned char CcbRes[2];
828c2ecf20Sopenharmony_ci	unsigned char HostStatus;
838c2ecf20Sopenharmony_ci	unsigned char TargetStatus;
848c2ecf20Sopenharmony_ci	unsigned char TargID;
858c2ecf20Sopenharmony_ci	unsigned char Lun;
868c2ecf20Sopenharmony_ci	unsigned char Cdb[12];
878c2ecf20Sopenharmony_ci	unsigned char CcbRes1;
888c2ecf20Sopenharmony_ci	unsigned char Reserved1;
898c2ecf20Sopenharmony_ci	u32 Reserved2;
908c2ecf20Sopenharmony_ci	u32 SensePointer;
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	CALL_BK_FN SccbCallback;	/* VOID (*SccbCallback)(); */
938c2ecf20Sopenharmony_ci	u32 SccbIOPort;			/* Identifies board base port */
948c2ecf20Sopenharmony_ci	unsigned char SccbStatus;
958c2ecf20Sopenharmony_ci	unsigned char SCCBRes2;
968c2ecf20Sopenharmony_ci	u16 SccbOSFlags;
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	u32 Sccb_XferCnt;	/* actual transfer count */
998c2ecf20Sopenharmony_ci	u32 Sccb_ATC;
1008c2ecf20Sopenharmony_ci	u32 SccbVirtDataPtr;	/* virtual addr for OS/2 */
1018c2ecf20Sopenharmony_ci	u32 Sccb_res1;
1028c2ecf20Sopenharmony_ci	u16 Sccb_MGRFlags;
1038c2ecf20Sopenharmony_ci	u16 Sccb_sgseg;
1048c2ecf20Sopenharmony_ci	unsigned char Sccb_scsimsg;	/* identify msg for selection */
1058c2ecf20Sopenharmony_ci	unsigned char Sccb_tag;
1068c2ecf20Sopenharmony_ci	unsigned char Sccb_scsistat;
1078c2ecf20Sopenharmony_ci	unsigned char Sccb_idmsg;	/* image of last msg in */
1088c2ecf20Sopenharmony_ci	struct sccb *Sccb_forwardlink;
1098c2ecf20Sopenharmony_ci	struct sccb *Sccb_backlink;
1108c2ecf20Sopenharmony_ci	u32 Sccb_savedATC;
1118c2ecf20Sopenharmony_ci	unsigned char Save_Cdb[6];
1128c2ecf20Sopenharmony_ci	unsigned char Save_CdbLen;
1138c2ecf20Sopenharmony_ci	unsigned char Sccb_XferState;
1148c2ecf20Sopenharmony_ci	u32 Sccb_SGoffset;
1158c2ecf20Sopenharmony_ci};
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci#pragma pack()
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci#define SCATTER_GATHER_COMMAND    0x02
1208c2ecf20Sopenharmony_ci#define RESIDUAL_COMMAND          0x03
1218c2ecf20Sopenharmony_ci#define RESIDUAL_SG_COMMAND       0x04
1228c2ecf20Sopenharmony_ci#define RESET_COMMAND             0x81
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci#define F_USE_CMD_Q              0x20	/*Inidcates TAGGED command. */
1258c2ecf20Sopenharmony_ci#define TAG_TYPE_MASK            0xC0	/*Type of tag msg to send. */
1268c2ecf20Sopenharmony_ci#define SCCB_DATA_XFER_OUT       0x10	/* Write */
1278c2ecf20Sopenharmony_ci#define SCCB_DATA_XFER_IN        0x08	/* Read */
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci#define NO_AUTO_REQUEST_SENSE    0x01	/* No Request Sense Buffer */
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci#define BUS_FREE_ST     0
1328c2ecf20Sopenharmony_ci#define SELECT_ST       1
1338c2ecf20Sopenharmony_ci#define SELECT_BDR_ST   2	/* Select w\ Bus Device Reset */
1348c2ecf20Sopenharmony_ci#define SELECT_SN_ST    3	/* Select w\ Sync Nego */
1358c2ecf20Sopenharmony_ci#define SELECT_WN_ST    4	/* Select w\ Wide Data Nego */
1368c2ecf20Sopenharmony_ci#define SELECT_Q_ST     5	/* Select w\ Tagged Q'ing */
1378c2ecf20Sopenharmony_ci#define COMMAND_ST      6
1388c2ecf20Sopenharmony_ci#define DATA_OUT_ST     7
1398c2ecf20Sopenharmony_ci#define DATA_IN_ST      8
1408c2ecf20Sopenharmony_ci#define DISCONNECT_ST   9
1418c2ecf20Sopenharmony_ci#define ABORT_ST        11
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci#define F_HOST_XFER_DIR                0x01
1448c2ecf20Sopenharmony_ci#define F_ALL_XFERRED                  0x02
1458c2ecf20Sopenharmony_ci#define F_SG_XFER                      0x04
1468c2ecf20Sopenharmony_ci#define F_AUTO_SENSE                   0x08
1478c2ecf20Sopenharmony_ci#define F_ODD_BALL_CNT                 0x10
1488c2ecf20Sopenharmony_ci#define F_NO_DATA_YET                  0x80
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci#define F_STATUSLOADED                 0x01
1518c2ecf20Sopenharmony_ci#define F_DEV_SELECTED                 0x04
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci#define SCCB_COMPLETE               0x00	/* SCCB completed without error */
1548c2ecf20Sopenharmony_ci#define SCCB_DATA_UNDER_RUN         0x0C
1558c2ecf20Sopenharmony_ci#define SCCB_SELECTION_TIMEOUT      0x11	/* Set SCSI selection timed out */
1568c2ecf20Sopenharmony_ci#define SCCB_DATA_OVER_RUN          0x12
1578c2ecf20Sopenharmony_ci#define SCCB_PHASE_SEQUENCE_FAIL    0x14	/* Target bus phase sequence failure */
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci#define SCCB_GROSS_FW_ERR           0x27	/* Major problem! */
1608c2ecf20Sopenharmony_ci#define SCCB_BM_ERR                 0x30	/* BusMaster error. */
1618c2ecf20Sopenharmony_ci#define SCCB_PARITY_ERR             0x34	/* SCSI parity error */
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci#define SCCB_IN_PROCESS            0x00
1648c2ecf20Sopenharmony_ci#define SCCB_SUCCESS               0x01
1658c2ecf20Sopenharmony_ci#define SCCB_ABORT                 0x02
1668c2ecf20Sopenharmony_ci#define SCCB_ERROR                 0x04
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci#define  ORION_FW_REV      3110
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci#define QUEUE_DEPTH     254+1	/*1 for Normal disconnect 32 for Q'ing. */
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci#define	MAX_MB_CARDS	4	/* Max. no of cards suppoerted on Mother Board */
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci#define MAX_SCSI_TAR    16
1758c2ecf20Sopenharmony_ci#define MAX_LUN         32
1768c2ecf20Sopenharmony_ci#define LUN_MASK			0x1f
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci#define SG_BUF_CNT      16	/*Number of prefetched elements. */
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci#define SG_ELEMENT_SIZE 8	/*Eight byte per element. */
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci#define RD_HARPOON(ioport)          inb((u32)ioport)
1838c2ecf20Sopenharmony_ci#define RDW_HARPOON(ioport)         inw((u32)ioport)
1848c2ecf20Sopenharmony_ci#define RD_HARP32(ioport,offset,data) (data = inl((u32)(ioport + offset)))
1858c2ecf20Sopenharmony_ci#define WR_HARPOON(ioport,val)      outb((u8) val, (u32)ioport)
1868c2ecf20Sopenharmony_ci#define WRW_HARPOON(ioport,val)       outw((u16)val, (u32)ioport)
1878c2ecf20Sopenharmony_ci#define WR_HARP32(ioport,offset,data)  outl(data, (u32)(ioport + offset))
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci#define  TAR_SYNC_MASK     (BIT(7)+BIT(6))
1908c2ecf20Sopenharmony_ci#define  SYNC_TRYING               BIT(6)
1918c2ecf20Sopenharmony_ci#define  SYNC_SUPPORTED    (BIT(7)+BIT(6))
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci#define  TAR_WIDE_MASK     (BIT(5)+BIT(4))
1948c2ecf20Sopenharmony_ci#define  WIDE_ENABLED              BIT(4)
1958c2ecf20Sopenharmony_ci#define  WIDE_NEGOCIATED   BIT(5)
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci#define  TAR_TAG_Q_MASK    (BIT(3)+BIT(2))
1988c2ecf20Sopenharmony_ci#define  TAG_Q_TRYING              BIT(2)
1998c2ecf20Sopenharmony_ci#define  TAG_Q_REJECT      BIT(3)
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci#define  TAR_ALLOW_DISC    BIT(0)
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci#define  EE_SYNC_MASK      (BIT(0)+BIT(1))
2048c2ecf20Sopenharmony_ci#define  EE_SYNC_5MB       BIT(0)
2058c2ecf20Sopenharmony_ci#define  EE_SYNC_10MB      BIT(1)
2068c2ecf20Sopenharmony_ci#define  EE_SYNC_20MB      (BIT(0)+BIT(1))
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci#define  EE_WIDE_SCSI      BIT(7)
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_cistruct sccb_mgr_tar_info {
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci	struct sccb *TarSelQ_Head;
2138c2ecf20Sopenharmony_ci	struct sccb *TarSelQ_Tail;
2148c2ecf20Sopenharmony_ci	unsigned char TarLUN_CA;	/*Contingent Allgiance */
2158c2ecf20Sopenharmony_ci	unsigned char TarTagQ_Cnt;
2168c2ecf20Sopenharmony_ci	unsigned char TarSelQ_Cnt;
2178c2ecf20Sopenharmony_ci	unsigned char TarStatus;
2188c2ecf20Sopenharmony_ci	unsigned char TarEEValue;
2198c2ecf20Sopenharmony_ci	unsigned char TarSyncCtrl;
2208c2ecf20Sopenharmony_ci	unsigned char TarReserved[2];	/* for alignment */
2218c2ecf20Sopenharmony_ci	unsigned char LunDiscQ_Idx[MAX_LUN];
2228c2ecf20Sopenharmony_ci	unsigned char TarLUNBusy[MAX_LUN];
2238c2ecf20Sopenharmony_ci};
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_cistruct nvram_info {
2268c2ecf20Sopenharmony_ci	unsigned char niModel;		/* Model No. of card */
2278c2ecf20Sopenharmony_ci	unsigned char niCardNo;		/* Card no. */
2288c2ecf20Sopenharmony_ci	u32 niBaseAddr;			/* Port Address of card */
2298c2ecf20Sopenharmony_ci	unsigned char niSysConf;	/* Adapter Configuration byte -
2308c2ecf20Sopenharmony_ci					   Byte 16 of eeprom map */
2318c2ecf20Sopenharmony_ci	unsigned char niScsiConf;	/* SCSI Configuration byte -
2328c2ecf20Sopenharmony_ci					   Byte 17 of eeprom map */
2338c2ecf20Sopenharmony_ci	unsigned char niScamConf;	/* SCAM Configuration byte -
2348c2ecf20Sopenharmony_ci					   Byte 20 of eeprom map */
2358c2ecf20Sopenharmony_ci	unsigned char niAdapId;		/* Host Adapter ID -
2368c2ecf20Sopenharmony_ci					   Byte 24 of eerpom map */
2378c2ecf20Sopenharmony_ci	unsigned char niSyncTbl[MAX_SCSI_TAR / 2];	/* Sync/Wide byte
2388c2ecf20Sopenharmony_ci							   of targets */
2398c2ecf20Sopenharmony_ci	unsigned char niScamTbl[MAX_SCSI_TAR][4];	/* Compressed Scam name
2408c2ecf20Sopenharmony_ci							   string of Targets */
2418c2ecf20Sopenharmony_ci};
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci#define	MODEL_LT		1
2448c2ecf20Sopenharmony_ci#define	MODEL_DL		2
2458c2ecf20Sopenharmony_ci#define	MODEL_LW		3
2468c2ecf20Sopenharmony_ci#define	MODEL_DW		4
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_cistruct sccb_card {
2498c2ecf20Sopenharmony_ci	struct sccb *currentSCCB;
2508c2ecf20Sopenharmony_ci	struct sccb_mgr_info *cardInfo;
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci	u32 ioPort;
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci	unsigned short cmdCounter;
2558c2ecf20Sopenharmony_ci	unsigned char discQCount;
2568c2ecf20Sopenharmony_ci	unsigned char tagQ_Lst;
2578c2ecf20Sopenharmony_ci	unsigned char cardIndex;
2588c2ecf20Sopenharmony_ci	unsigned char scanIndex;
2598c2ecf20Sopenharmony_ci	unsigned char globalFlags;
2608c2ecf20Sopenharmony_ci	unsigned char ourId;
2618c2ecf20Sopenharmony_ci	struct nvram_info *pNvRamInfo;
2628c2ecf20Sopenharmony_ci	struct sccb *discQ_Tbl[QUEUE_DEPTH];
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci};
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_ci#define F_TAG_STARTED		0x01
2678c2ecf20Sopenharmony_ci#define F_CONLUN_IO			0x02
2688c2ecf20Sopenharmony_ci#define F_DO_RENEGO			0x04
2698c2ecf20Sopenharmony_ci#define F_NO_FILTER			0x08
2708c2ecf20Sopenharmony_ci#define F_GREEN_PC			0x10
2718c2ecf20Sopenharmony_ci#define F_HOST_XFER_ACT		0x20
2728c2ecf20Sopenharmony_ci#define F_NEW_SCCB_CMD		0x40
2738c2ecf20Sopenharmony_ci#define F_UPDATE_EEPROM		0x80
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci#define  ID_STRING_LENGTH  32
2768c2ecf20Sopenharmony_ci#define  TYPE_CODE0        0x63	/*Level2 Mstr (bits 7-6),  */
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ci#define  SLV_TYPE_CODE0    0xA3	/*Priority Bit set (bits 7-6),  */
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci#define  ASSIGN_ID   0x00
2818c2ecf20Sopenharmony_ci#define  SET_P_FLAG  0x01
2828c2ecf20Sopenharmony_ci#define  CFG_CMPLT   0x03
2838c2ecf20Sopenharmony_ci#define  DOM_MSTR    0x0F
2848c2ecf20Sopenharmony_ci#define  SYNC_PTRN   0x1F
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci#define  ID_0_7      0x18
2878c2ecf20Sopenharmony_ci#define  ID_8_F      0x11
2888c2ecf20Sopenharmony_ci#define  MISC_CODE   0x14
2898c2ecf20Sopenharmony_ci#define  CLR_P_FLAG  0x18
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_ci#define  INIT_SELTD  0x01
2928c2ecf20Sopenharmony_ci#define  LEVEL2_TAR  0x02
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_cienum scam_id_st { ID0, ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, ID9, ID10, ID11,
2958c2ecf20Sopenharmony_ci	    ID12,
2968c2ecf20Sopenharmony_ci	ID13, ID14, ID15, ID_UNUSED, ID_UNASSIGNED, ID_ASSIGNED, LEGACY,
2978c2ecf20Sopenharmony_ci	CLR_PRIORITY, NO_ID_AVAIL
2988c2ecf20Sopenharmony_ci};
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_citypedef struct SCCBscam_info {
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci	unsigned char id_string[ID_STRING_LENGTH];
3038c2ecf20Sopenharmony_ci	enum scam_id_st state;
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci} SCCBSCAM_INFO;
3068c2ecf20Sopenharmony_ci
3078c2ecf20Sopenharmony_ci#define  SCSI_REQUEST_SENSE      0x03
3088c2ecf20Sopenharmony_ci#define  SCSI_READ               0x08
3098c2ecf20Sopenharmony_ci#define  SCSI_WRITE              0x0A
3108c2ecf20Sopenharmony_ci#define  SCSI_START_STOP_UNIT    0x1B
3118c2ecf20Sopenharmony_ci#define  SCSI_READ_EXTENDED      0x28
3128c2ecf20Sopenharmony_ci#define  SCSI_WRITE_EXTENDED     0x2A
3138c2ecf20Sopenharmony_ci#define  SCSI_WRITE_AND_VERIFY   0x2E
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci#define  SSGOOD                  0x00
3168c2ecf20Sopenharmony_ci#define  SSCHECK                 0x02
3178c2ecf20Sopenharmony_ci#define  SSQ_FULL                0x28
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci#define  SMCMD_COMP              0x00
3208c2ecf20Sopenharmony_ci#define  SMEXT                   0x01
3218c2ecf20Sopenharmony_ci#define  SMSAVE_DATA_PTR         0x02
3228c2ecf20Sopenharmony_ci#define  SMREST_DATA_PTR         0x03
3238c2ecf20Sopenharmony_ci#define  SMDISC                  0x04
3248c2ecf20Sopenharmony_ci#define  SMABORT                 0x06
3258c2ecf20Sopenharmony_ci#define  SMREJECT                0x07
3268c2ecf20Sopenharmony_ci#define  SMNO_OP                 0x08
3278c2ecf20Sopenharmony_ci#define  SMPARITY                0x09
3288c2ecf20Sopenharmony_ci#define  SMDEV_RESET             0x0C
3298c2ecf20Sopenharmony_ci#define	SMABORT_TAG					0x0D
3308c2ecf20Sopenharmony_ci#define	SMINIT_RECOVERY			0x0F
3318c2ecf20Sopenharmony_ci#define	SMREL_RECOVERY				0x10
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ci#define  SMIDENT                 0x80
3348c2ecf20Sopenharmony_ci#define  DISC_PRIV               0x40
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ci#define  SMSYNC                  0x01
3378c2ecf20Sopenharmony_ci#define  SMWDTR                  0x03
3388c2ecf20Sopenharmony_ci#define  SM8BIT                  0x00
3398c2ecf20Sopenharmony_ci#define  SM16BIT                 0x01
3408c2ecf20Sopenharmony_ci#define  SMIGNORWR               0x23	/* Ignore Wide Residue */
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ci#define  SIX_BYTE_CMD            0x06
3438c2ecf20Sopenharmony_ci#define  TWELVE_BYTE_CMD         0x0C
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci#define  ASYNC                   0x00
3468c2ecf20Sopenharmony_ci#define  MAX_OFFSET              0x0F	/* Maxbyteoffset for Sync Xfers */
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci#define  EEPROM_WD_CNT     256
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci#define  EEPROM_CHECK_SUM  0
3518c2ecf20Sopenharmony_ci#define  FW_SIGNATURE      2
3528c2ecf20Sopenharmony_ci#define  MODEL_NUMB_0      4
3538c2ecf20Sopenharmony_ci#define  MODEL_NUMB_2      6
3548c2ecf20Sopenharmony_ci#define  MODEL_NUMB_4      8
3558c2ecf20Sopenharmony_ci#define  SYSTEM_CONFIG     16
3568c2ecf20Sopenharmony_ci#define  SCSI_CONFIG       17
3578c2ecf20Sopenharmony_ci#define  BIOS_CONFIG       18
3588c2ecf20Sopenharmony_ci#define  SCAM_CONFIG       20
3598c2ecf20Sopenharmony_ci#define  ADAPTER_SCSI_ID   24
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci#define  IGNORE_B_SCAN     32
3628c2ecf20Sopenharmony_ci#define  SEND_START_ENA    34
3638c2ecf20Sopenharmony_ci#define  DEVICE_ENABLE     36
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBL     38
3668c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBL01   38
3678c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBL23   40
3688c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBL45   42
3698c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBL67   44
3708c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBL89   46
3718c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBLab   48
3728c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBLcd   50
3738c2ecf20Sopenharmony_ci#define  SYNC_RATE_TBLef   52
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci#define  EE_SCAMBASE      256
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci#define  SCAM_ENABLED   BIT(2)
3788c2ecf20Sopenharmony_ci#define  SCAM_LEVEL2    BIT(3)
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci#define	RENEGO_ENA		BIT(10)
3818c2ecf20Sopenharmony_ci#define	CONNIO_ENA		BIT(11)
3828c2ecf20Sopenharmony_ci#define  GREEN_PC_ENA   BIT(12)
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_ci#define  AUTO_RATE_00   00
3858c2ecf20Sopenharmony_ci#define  AUTO_RATE_05   01
3868c2ecf20Sopenharmony_ci#define  AUTO_RATE_10   02
3878c2ecf20Sopenharmony_ci#define  AUTO_RATE_20   03
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci#define  WIDE_NEGO_BIT     BIT(7)
3908c2ecf20Sopenharmony_ci#define  DISC_ENABLE_BIT   BIT(6)
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci#define  hp_vendor_id_0       0x00	/* LSB */
3938c2ecf20Sopenharmony_ci#define  ORION_VEND_0   0x4B
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_ci#define  hp_vendor_id_1       0x01	/* MSB */
3968c2ecf20Sopenharmony_ci#define  ORION_VEND_1   0x10
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci#define  hp_device_id_0       0x02	/* LSB */
3998c2ecf20Sopenharmony_ci#define  ORION_DEV_0    0x30
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_ci#define  hp_device_id_1       0x03	/* MSB */
4028c2ecf20Sopenharmony_ci#define  ORION_DEV_1    0x81
4038c2ecf20Sopenharmony_ci
4048c2ecf20Sopenharmony_ci	/* Sub Vendor ID and Sub Device ID only available in
4058c2ecf20Sopenharmony_ci	   Harpoon Version 2 and higher */
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_ci#define  hp_sub_device_id_0   0x06	/* LSB */
4088c2ecf20Sopenharmony_ci
4098c2ecf20Sopenharmony_ci#define  hp_semaphore         0x0C
4108c2ecf20Sopenharmony_ci#define SCCB_MGR_ACTIVE    BIT(0)
4118c2ecf20Sopenharmony_ci#define TICKLE_ME          BIT(1)
4128c2ecf20Sopenharmony_ci#define SCCB_MGR_PRESENT   BIT(3)
4138c2ecf20Sopenharmony_ci#define BIOS_IN_USE        BIT(4)
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_ci#define  hp_sys_ctrl          0x0F
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ci#define  STOP_CLK          BIT(0)	/*Turn off BusMaster Clock */
4188c2ecf20Sopenharmony_ci#define  DRVR_RST          BIT(1)	/*Firmware Reset to 80C15 chip */
4198c2ecf20Sopenharmony_ci#define  HALT_MACH         BIT(3)	/*Halt State Machine      */
4208c2ecf20Sopenharmony_ci#define  HARD_ABORT        BIT(4)	/*Hard Abort              */
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci#define  hp_host_blk_cnt      0x13
4238c2ecf20Sopenharmony_ci
4248c2ecf20Sopenharmony_ci#define  XFER_BLK64        0x06	/*     1 1 0 64 byte per block */
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci#define  BM_THRESHOLD      0x40	/* PCI mode can only xfer 16 bytes */
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_ci#define  hp_int_mask          0x17
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci#define  INT_CMD_COMPL     BIT(0)	/* DMA command complete   */
4318c2ecf20Sopenharmony_ci#define  INT_EXT_STATUS    BIT(1)	/* Extended Status Set    */
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci#define  hp_xfer_cnt_lo       0x18
4348c2ecf20Sopenharmony_ci#define  hp_xfer_cnt_hi       0x1A
4358c2ecf20Sopenharmony_ci#define  hp_xfer_cmd          0x1B
4368c2ecf20Sopenharmony_ci
4378c2ecf20Sopenharmony_ci#define  XFER_HOST_DMA     0x00	/*     0 0 0 Transfer Host -> DMA */
4388c2ecf20Sopenharmony_ci#define  XFER_DMA_HOST     0x01	/*     0 0 1 Transfer DMA  -> Host */
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_ci#define  XFER_HOST_AUTO    0x00	/*     0 0 Auto Transfer Size   */
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci#define  XFER_DMA_8BIT     0x20	/*     0 1 8 BIT  Transfer Size */
4438c2ecf20Sopenharmony_ci
4448c2ecf20Sopenharmony_ci#define  DISABLE_INT       BIT(7)	/*Do not interrupt at end of cmd. */
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci#define  HOST_WRT_CMD      ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
4478c2ecf20Sopenharmony_ci#define  HOST_RD_CMD       ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_ci#define  hp_host_addr_lo      0x1C
4508c2ecf20Sopenharmony_ci#define  hp_host_addr_hmi     0x1E
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci#define  hp_ee_ctrl           0x22
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci#define  EXT_ARB_ACK       BIT(7)
4558c2ecf20Sopenharmony_ci#define  SCSI_TERM_ENA_H   BIT(6)	/* SCSI high byte terminator */
4568c2ecf20Sopenharmony_ci#define  SEE_MS            BIT(5)
4578c2ecf20Sopenharmony_ci#define  SEE_CS            BIT(3)
4588c2ecf20Sopenharmony_ci#define  SEE_CLK           BIT(2)
4598c2ecf20Sopenharmony_ci#define  SEE_DO            BIT(1)
4608c2ecf20Sopenharmony_ci#define  SEE_DI            BIT(0)
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci#define  EE_READ           0x06
4638c2ecf20Sopenharmony_ci#define  EE_WRITE          0x05
4648c2ecf20Sopenharmony_ci#define  EWEN              0x04
4658c2ecf20Sopenharmony_ci#define  EWEN_ADDR         0x03C0
4668c2ecf20Sopenharmony_ci#define  EWDS              0x04
4678c2ecf20Sopenharmony_ci#define  EWDS_ADDR         0x0000
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_ci#define  hp_bm_ctrl           0x26
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ci#define  SCSI_TERM_ENA_L   BIT(0)	/*Enable/Disable external terminators */
4728c2ecf20Sopenharmony_ci#define  FLUSH_XFER_CNTR   BIT(1)	/*Flush transfer counter */
4738c2ecf20Sopenharmony_ci#define  FORCE1_XFER       BIT(5)	/*Always xfer one byte in byte mode */
4748c2ecf20Sopenharmony_ci#define  FAST_SINGLE       BIT(6)	/*?? */
4758c2ecf20Sopenharmony_ci
4768c2ecf20Sopenharmony_ci#define  BMCTRL_DEFAULT    (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
4778c2ecf20Sopenharmony_ci
4788c2ecf20Sopenharmony_ci#define  hp_sg_addr           0x28
4798c2ecf20Sopenharmony_ci#define  hp_page_ctrl         0x29
4808c2ecf20Sopenharmony_ci
4818c2ecf20Sopenharmony_ci#define  SCATTER_EN        BIT(0)
4828c2ecf20Sopenharmony_ci#define  SGRAM_ARAM        BIT(1)
4838c2ecf20Sopenharmony_ci#define  G_INT_DISABLE     BIT(3)	/* Enable/Disable all Interrupts */
4848c2ecf20Sopenharmony_ci#define  NARROW_SCSI_CARD  BIT(4)	/* NARROW/WIDE SCSI config pin */
4858c2ecf20Sopenharmony_ci
4868c2ecf20Sopenharmony_ci#define  hp_pci_stat_cfg      0x2D
4878c2ecf20Sopenharmony_ci
4888c2ecf20Sopenharmony_ci#define  REC_MASTER_ABORT  BIT(5)	/*received Master abort */
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_ci#define  hp_rev_num           0x33
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci#define  hp_stack_data        0x34
4938c2ecf20Sopenharmony_ci#define  hp_stack_addr        0x35
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci#define  hp_ext_status        0x36
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci#define  BM_FORCE_OFF      BIT(0)	/*Bus Master is forced to get off */
4988c2ecf20Sopenharmony_ci#define  PCI_TGT_ABORT     BIT(0)	/*PCI bus master transaction aborted */
4998c2ecf20Sopenharmony_ci#define  PCI_DEV_TMOUT     BIT(1)	/*PCI Device Time out */
5008c2ecf20Sopenharmony_ci#define  CMD_ABORTED       BIT(4)	/*Command aborted */
5018c2ecf20Sopenharmony_ci#define  BM_PARITY_ERR     BIT(5)	/*parity error on data received   */
5028c2ecf20Sopenharmony_ci#define  PIO_OVERRUN       BIT(6)	/*Slave data overrun */
5038c2ecf20Sopenharmony_ci#define  BM_CMD_BUSY       BIT(7)	/*Bus master transfer command busy */
5048c2ecf20Sopenharmony_ci#define  BAD_EXT_STATUS    (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \
5058c2ecf20Sopenharmony_ci                                  BM_PARITY_ERR | PIO_OVERRUN)
5068c2ecf20Sopenharmony_ci
5078c2ecf20Sopenharmony_ci#define  hp_int_status        0x37
5088c2ecf20Sopenharmony_ci
5098c2ecf20Sopenharmony_ci#define  EXT_STATUS_ON     BIT(1)	/*Extended status is valid */
5108c2ecf20Sopenharmony_ci#define  SCSI_INTERRUPT    BIT(2)	/*Global indication of a SCSI int. */
5118c2ecf20Sopenharmony_ci#define  INT_ASSERTED      BIT(5)	/* */
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ci#define  hp_fifo_cnt          0x38
5148c2ecf20Sopenharmony_ci
5158c2ecf20Sopenharmony_ci#define  hp_intena		 0x40
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_ci#define  RESET		 BIT(7)
5188c2ecf20Sopenharmony_ci#define  PROG_HLT		 BIT(6)
5198c2ecf20Sopenharmony_ci#define  PARITY		 BIT(5)
5208c2ecf20Sopenharmony_ci#define  FIFO		 BIT(4)
5218c2ecf20Sopenharmony_ci#define  SEL		 BIT(3)
5228c2ecf20Sopenharmony_ci#define  SCAM_SEL		 BIT(2)
5238c2ecf20Sopenharmony_ci#define  RSEL		 BIT(1)
5248c2ecf20Sopenharmony_ci#define  TIMEOUT		 BIT(0)
5258c2ecf20Sopenharmony_ci#define  BUS_FREE		 BIT(15)
5268c2ecf20Sopenharmony_ci#define  XFER_CNT_0	 BIT(14)
5278c2ecf20Sopenharmony_ci#define  PHASE		 BIT(13)
5288c2ecf20Sopenharmony_ci#define  IUNKWN		 BIT(12)
5298c2ecf20Sopenharmony_ci#define  ICMD_COMP	 BIT(11)
5308c2ecf20Sopenharmony_ci#define  ITICKLE		 BIT(10)
5318c2ecf20Sopenharmony_ci#define  IDO_STRT		 BIT(9)
5328c2ecf20Sopenharmony_ci#define  ITAR_DISC	 BIT(8)
5338c2ecf20Sopenharmony_ci#define  AUTO_INT		 (BIT(12)+BIT(11)+BIT(10)+BIT(9)+BIT(8))
5348c2ecf20Sopenharmony_ci#define  CLR_ALL_INT	 0xFFFF
5358c2ecf20Sopenharmony_ci#define  CLR_ALL_INT_1	 0xFF00
5368c2ecf20Sopenharmony_ci
5378c2ecf20Sopenharmony_ci#define  hp_intstat		 0x42
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci#define  hp_scsisig           0x44
5408c2ecf20Sopenharmony_ci
5418c2ecf20Sopenharmony_ci#define  SCSI_SEL          BIT(7)
5428c2ecf20Sopenharmony_ci#define  SCSI_BSY          BIT(6)
5438c2ecf20Sopenharmony_ci#define  SCSI_REQ          BIT(5)
5448c2ecf20Sopenharmony_ci#define  SCSI_ACK          BIT(4)
5458c2ecf20Sopenharmony_ci#define  SCSI_ATN          BIT(3)
5468c2ecf20Sopenharmony_ci#define  SCSI_CD           BIT(2)
5478c2ecf20Sopenharmony_ci#define  SCSI_MSG          BIT(1)
5488c2ecf20Sopenharmony_ci#define  SCSI_IOBIT        BIT(0)
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_ci#define  S_SCSI_PHZ        (BIT(2)+BIT(1)+BIT(0))
5518c2ecf20Sopenharmony_ci#define  S_MSGO_PH         (BIT(2)+BIT(1)       )
5528c2ecf20Sopenharmony_ci#define  S_MSGI_PH         (BIT(2)+BIT(1)+BIT(0))
5538c2ecf20Sopenharmony_ci#define  S_DATAI_PH        (              BIT(0))
5548c2ecf20Sopenharmony_ci#define  S_DATAO_PH        0x00
5558c2ecf20Sopenharmony_ci#define  S_ILL_PH          (       BIT(1)       )
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ci#define  hp_scsictrl_0        0x45
5588c2ecf20Sopenharmony_ci
5598c2ecf20Sopenharmony_ci#define  SEL_TAR           BIT(6)
5608c2ecf20Sopenharmony_ci#define  ENA_ATN           BIT(4)
5618c2ecf20Sopenharmony_ci#define  ENA_RESEL         BIT(2)
5628c2ecf20Sopenharmony_ci#define  SCSI_RST          BIT(1)
5638c2ecf20Sopenharmony_ci#define  ENA_SCAM_SEL      BIT(0)
5648c2ecf20Sopenharmony_ci
5658c2ecf20Sopenharmony_ci#define  hp_portctrl_0        0x46
5668c2ecf20Sopenharmony_ci
5678c2ecf20Sopenharmony_ci#define  SCSI_PORT         BIT(7)
5688c2ecf20Sopenharmony_ci#define  SCSI_INBIT        BIT(6)
5698c2ecf20Sopenharmony_ci#define  DMA_PORT          BIT(5)
5708c2ecf20Sopenharmony_ci#define  DMA_RD            BIT(4)
5718c2ecf20Sopenharmony_ci#define  HOST_PORT         BIT(3)
5728c2ecf20Sopenharmony_ci#define  HOST_WRT          BIT(2)
5738c2ecf20Sopenharmony_ci#define  SCSI_BUS_EN       BIT(1)
5748c2ecf20Sopenharmony_ci#define  START_TO          BIT(0)
5758c2ecf20Sopenharmony_ci
5768c2ecf20Sopenharmony_ci#define  hp_scsireset         0x47
5778c2ecf20Sopenharmony_ci
5788c2ecf20Sopenharmony_ci#define  SCSI_INI          BIT(6)
5798c2ecf20Sopenharmony_ci#define  SCAM_EN           BIT(5)
5808c2ecf20Sopenharmony_ci#define  DMA_RESET         BIT(3)
5818c2ecf20Sopenharmony_ci#define  HPSCSI_RESET      BIT(2)
5828c2ecf20Sopenharmony_ci#define  PROG_RESET        BIT(1)
5838c2ecf20Sopenharmony_ci#define  FIFO_CLR          BIT(0)
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_ci#define  hp_xfercnt_0         0x48
5868c2ecf20Sopenharmony_ci#define  hp_xfercnt_2         0x4A
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci#define  hp_fifodata_0        0x4C
5898c2ecf20Sopenharmony_ci#define  hp_addstat           0x4E
5908c2ecf20Sopenharmony_ci
5918c2ecf20Sopenharmony_ci#define  SCAM_TIMER        BIT(7)
5928c2ecf20Sopenharmony_ci#define  SCSI_MODE8        BIT(3)
5938c2ecf20Sopenharmony_ci#define  SCSI_PAR_ERR      BIT(0)
5948c2ecf20Sopenharmony_ci
5958c2ecf20Sopenharmony_ci#define  hp_prgmcnt_0         0x4F
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_ci#define  hp_selfid_0          0x50
5988c2ecf20Sopenharmony_ci#define  hp_selfid_1          0x51
5998c2ecf20Sopenharmony_ci#define  hp_arb_id            0x52
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci#define  hp_select_id         0x53
6028c2ecf20Sopenharmony_ci
6038c2ecf20Sopenharmony_ci#define  hp_synctarg_base     0x54
6048c2ecf20Sopenharmony_ci#define  hp_synctarg_12       0x54
6058c2ecf20Sopenharmony_ci#define  hp_synctarg_13       0x55
6068c2ecf20Sopenharmony_ci#define  hp_synctarg_14       0x56
6078c2ecf20Sopenharmony_ci#define  hp_synctarg_15       0x57
6088c2ecf20Sopenharmony_ci
6098c2ecf20Sopenharmony_ci#define  hp_synctarg_8        0x58
6108c2ecf20Sopenharmony_ci#define  hp_synctarg_9        0x59
6118c2ecf20Sopenharmony_ci#define  hp_synctarg_10       0x5A
6128c2ecf20Sopenharmony_ci#define  hp_synctarg_11       0x5B
6138c2ecf20Sopenharmony_ci
6148c2ecf20Sopenharmony_ci#define  hp_synctarg_4        0x5C
6158c2ecf20Sopenharmony_ci#define  hp_synctarg_5        0x5D
6168c2ecf20Sopenharmony_ci#define  hp_synctarg_6        0x5E
6178c2ecf20Sopenharmony_ci#define  hp_synctarg_7        0x5F
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_ci#define  hp_synctarg_0        0x60
6208c2ecf20Sopenharmony_ci#define  hp_synctarg_1        0x61
6218c2ecf20Sopenharmony_ci#define  hp_synctarg_2        0x62
6228c2ecf20Sopenharmony_ci#define  hp_synctarg_3        0x63
6238c2ecf20Sopenharmony_ci
6248c2ecf20Sopenharmony_ci#define  NARROW_SCSI       BIT(4)
6258c2ecf20Sopenharmony_ci#define  DEFAULT_OFFSET    0x0F
6268c2ecf20Sopenharmony_ci
6278c2ecf20Sopenharmony_ci#define  hp_autostart_0       0x64
6288c2ecf20Sopenharmony_ci#define  hp_autostart_1       0x65
6298c2ecf20Sopenharmony_ci#define  hp_autostart_3       0x67
6308c2ecf20Sopenharmony_ci
6318c2ecf20Sopenharmony_ci#define  AUTO_IMMED    BIT(5)
6328c2ecf20Sopenharmony_ci#define  SELECT   BIT(6)
6338c2ecf20Sopenharmony_ci#define  END_DATA (BIT(7)+BIT(6))
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_ci#define  hp_gp_reg_0          0x68
6368c2ecf20Sopenharmony_ci#define  hp_gp_reg_1          0x69
6378c2ecf20Sopenharmony_ci#define  hp_gp_reg_3          0x6B
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci#define  hp_seltimeout        0x6C
6408c2ecf20Sopenharmony_ci
6418c2ecf20Sopenharmony_ci#define  TO_4ms            0x67	/* 3.9959ms */
6428c2ecf20Sopenharmony_ci
6438c2ecf20Sopenharmony_ci#define  TO_5ms            0x03	/* 4.9152ms */
6448c2ecf20Sopenharmony_ci#define  TO_10ms           0x07	/* 11.xxxms */
6458c2ecf20Sopenharmony_ci#define  TO_250ms          0x99	/* 250.68ms */
6468c2ecf20Sopenharmony_ci#define  TO_290ms          0xB1	/* 289.99ms */
6478c2ecf20Sopenharmony_ci
6488c2ecf20Sopenharmony_ci#define  hp_clkctrl_0         0x6D
6498c2ecf20Sopenharmony_ci
6508c2ecf20Sopenharmony_ci#define  PWR_DWN           BIT(6)
6518c2ecf20Sopenharmony_ci#define  ACTdeassert       BIT(4)
6528c2ecf20Sopenharmony_ci#define  CLK_40MHZ         (BIT(1) + BIT(0))
6538c2ecf20Sopenharmony_ci
6548c2ecf20Sopenharmony_ci#define  CLKCTRL_DEFAULT   (ACTdeassert | CLK_40MHZ)
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ci#define  hp_fiforead          0x6E
6578c2ecf20Sopenharmony_ci#define  hp_fifowrite         0x6F
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_ci#define  hp_offsetctr         0x70
6608c2ecf20Sopenharmony_ci#define  hp_xferstat          0x71
6618c2ecf20Sopenharmony_ci
6628c2ecf20Sopenharmony_ci#define  FIFO_EMPTY        BIT(6)
6638c2ecf20Sopenharmony_ci
6648c2ecf20Sopenharmony_ci#define  hp_portctrl_1        0x72
6658c2ecf20Sopenharmony_ci
6668c2ecf20Sopenharmony_ci#define  CHK_SCSI_P        BIT(3)
6678c2ecf20Sopenharmony_ci#define  HOST_MODE8        BIT(0)
6688c2ecf20Sopenharmony_ci
6698c2ecf20Sopenharmony_ci#define  hp_xfer_pad          0x73
6708c2ecf20Sopenharmony_ci
6718c2ecf20Sopenharmony_ci#define  ID_UNLOCK         BIT(3)
6728c2ecf20Sopenharmony_ci
6738c2ecf20Sopenharmony_ci#define  hp_scsidata_0        0x74
6748c2ecf20Sopenharmony_ci#define  hp_scsidata_1        0x75
6758c2ecf20Sopenharmony_ci
6768c2ecf20Sopenharmony_ci#define  hp_aramBase          0x80
6778c2ecf20Sopenharmony_ci#define  BIOS_DATA_OFFSET     0x60
6788c2ecf20Sopenharmony_ci#define  BIOS_RELATIVE_CARD   0x64
6798c2ecf20Sopenharmony_ci
6808c2ecf20Sopenharmony_ci#define  AR3      (BIT(9) + BIT(8))
6818c2ecf20Sopenharmony_ci#define  SDATA    BIT(10)
6828c2ecf20Sopenharmony_ci
6838c2ecf20Sopenharmony_ci#define  CRD_OP   BIT(11)	/* Cmp Reg. w/ Data */
6848c2ecf20Sopenharmony_ci
6858c2ecf20Sopenharmony_ci#define  CRR_OP   BIT(12)	/* Cmp Reg. w. Reg. */
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci#define  CPE_OP   (BIT(14)+BIT(11))	/* Cmp SCSI phs & Branch EQ */
6888c2ecf20Sopenharmony_ci
6898c2ecf20Sopenharmony_ci#define  CPN_OP   (BIT(14)+BIT(12))	/* Cmp SCSI phs & Branch NOT EQ */
6908c2ecf20Sopenharmony_ci
6918c2ecf20Sopenharmony_ci#define  ADATA_OUT   0x00
6928c2ecf20Sopenharmony_ci#define  ADATA_IN    BIT(8)
6938c2ecf20Sopenharmony_ci#define  ACOMMAND    BIT(10)
6948c2ecf20Sopenharmony_ci#define  ASTATUS     (BIT(10)+BIT(8))
6958c2ecf20Sopenharmony_ci#define  AMSG_OUT    (BIT(10)+BIT(9))
6968c2ecf20Sopenharmony_ci#define  AMSG_IN     (BIT(10)+BIT(9)+BIT(8))
6978c2ecf20Sopenharmony_ci
6988c2ecf20Sopenharmony_ci#define  BRH_OP   BIT(13)	/* Branch */
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_ci#define  ALWAYS   0x00
7018c2ecf20Sopenharmony_ci#define  EQUAL    BIT(8)
7028c2ecf20Sopenharmony_ci#define  NOT_EQ   BIT(9)
7038c2ecf20Sopenharmony_ci
7048c2ecf20Sopenharmony_ci#define  TCB_OP   (BIT(13)+BIT(11))	/* Test condition & branch */
7058c2ecf20Sopenharmony_ci
7068c2ecf20Sopenharmony_ci#define  FIFO_0      BIT(10)
7078c2ecf20Sopenharmony_ci
7088c2ecf20Sopenharmony_ci#define  MPM_OP   BIT(15)	/* Match phase and move data */
7098c2ecf20Sopenharmony_ci
7108c2ecf20Sopenharmony_ci#define  MRR_OP   BIT(14)	/* Move DReg. to Reg. */
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_ci#define  S_IDREG  (BIT(2)+BIT(1)+BIT(0))
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci#define  D_AR0    0x00
7158c2ecf20Sopenharmony_ci#define  D_AR1    BIT(0)
7168c2ecf20Sopenharmony_ci#define  D_BUCKET (BIT(2) + BIT(1) + BIT(0))
7178c2ecf20Sopenharmony_ci
7188c2ecf20Sopenharmony_ci#define  RAT_OP      (BIT(14)+BIT(13)+BIT(11))
7198c2ecf20Sopenharmony_ci
7208c2ecf20Sopenharmony_ci#define  SSI_OP      (BIT(15)+BIT(11))
7218c2ecf20Sopenharmony_ci
7228c2ecf20Sopenharmony_ci#define  SSI_ITAR_DISC	(ITAR_DISC >> 8)
7238c2ecf20Sopenharmony_ci#define  SSI_IDO_STRT	(IDO_STRT >> 8)
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_ci#define  SSI_ICMD_COMP	(ICMD_COMP >> 8)
7268c2ecf20Sopenharmony_ci#define  SSI_ITICKLE	(ITICKLE >> 8)
7278c2ecf20Sopenharmony_ci
7288c2ecf20Sopenharmony_ci#define  SSI_IUNKWN	(IUNKWN >> 8)
7298c2ecf20Sopenharmony_ci#define  SSI_INO_CC	(IUNKWN >> 8)
7308c2ecf20Sopenharmony_ci#define  SSI_IRFAIL	(IUNKWN >> 8)
7318c2ecf20Sopenharmony_ci
7328c2ecf20Sopenharmony_ci#define  NP    0x10		/*Next Phase */
7338c2ecf20Sopenharmony_ci#define  NTCMD 0x02		/*Non- Tagged Command start */
7348c2ecf20Sopenharmony_ci#define  CMDPZ 0x04		/*Command phase */
7358c2ecf20Sopenharmony_ci#define  DINT  0x12		/*Data Out/In interrupt */
7368c2ecf20Sopenharmony_ci#define  DI    0x13		/*Data Out */
7378c2ecf20Sopenharmony_ci#define  DC    0x19		/*Disconnect Message */
7388c2ecf20Sopenharmony_ci#define  ST    0x1D		/*Status Phase */
7398c2ecf20Sopenharmony_ci#define  UNKNWN 0x24		/*Unknown bus action */
7408c2ecf20Sopenharmony_ci#define  CC    0x25		/*Command Completion failure */
7418c2ecf20Sopenharmony_ci#define  TICK  0x26		/*New target reselected us. */
7428c2ecf20Sopenharmony_ci#define  SELCHK 0x28		/*Select & Check SCSI ID latch reg */
7438c2ecf20Sopenharmony_ci
7448c2ecf20Sopenharmony_ci#define  ID_MSG_STRT    hp_aramBase + 0x00
7458c2ecf20Sopenharmony_ci#define  NON_TAG_ID_MSG hp_aramBase + 0x06
7468c2ecf20Sopenharmony_ci#define  CMD_STRT       hp_aramBase + 0x08
7478c2ecf20Sopenharmony_ci#define  SYNC_MSGS      hp_aramBase + 0x08
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci#define  TAG_STRT          0x00
7508c2ecf20Sopenharmony_ci#define  DISCONNECT_START  0x10/2
7518c2ecf20Sopenharmony_ci#define  END_DATA_START    0x14/2
7528c2ecf20Sopenharmony_ci#define  CMD_ONLY_STRT     CMDPZ/2
7538c2ecf20Sopenharmony_ci#define  SELCHK_STRT     SELCHK/2
7548c2ecf20Sopenharmony_ci
7558c2ecf20Sopenharmony_ci#define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
7568c2ecf20Sopenharmony_ci/* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \
7578c2ecf20Sopenharmony_ci                                 xfercnt <<= 16,\
7588c2ecf20Sopenharmony_ci                                 xfercnt |= RDW_HARPOON((unsigned short)(port+hp_xfercnt_0)))
7598c2ecf20Sopenharmony_ci */
7608c2ecf20Sopenharmony_ci#define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (unsigned short)(addr & 0x0000FFFFL)),\
7618c2ecf20Sopenharmony_ci         addr >>= 16,\
7628c2ecf20Sopenharmony_ci         WRW_HARPOON((port+hp_host_addr_hmi), (unsigned short)(addr & 0x0000FFFFL)),\
7638c2ecf20Sopenharmony_ci         WR_HARP32(port,hp_xfercnt_0,count),\
7648c2ecf20Sopenharmony_ci         WRW_HARPOON((port+hp_xfer_cnt_lo), (unsigned short)(count & 0x0000FFFFL)),\
7658c2ecf20Sopenharmony_ci         count >>= 16,\
7668c2ecf20Sopenharmony_ci         WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
7678c2ecf20Sopenharmony_ci
7688c2ecf20Sopenharmony_ci#define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
7698c2ecf20Sopenharmony_ci                          WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
7708c2ecf20Sopenharmony_ci
7718c2ecf20Sopenharmony_ci#define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
7728c2ecf20Sopenharmony_ci                          WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci#define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\
7758c2ecf20Sopenharmony_ci                        WR_HARPOON(port+hp_scsireset, 0x00))
7768c2ecf20Sopenharmony_ci
7778c2ecf20Sopenharmony_ci#define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
7788c2ecf20Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
7798c2ecf20Sopenharmony_ci
7808c2ecf20Sopenharmony_ci#define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
7818c2ecf20Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
7828c2ecf20Sopenharmony_ci
7838c2ecf20Sopenharmony_ci#define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
7848c2ecf20Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
7858c2ecf20Sopenharmony_ci
7868c2ecf20Sopenharmony_ci#define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
7878c2ecf20Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
7888c2ecf20Sopenharmony_ci
7898c2ecf20Sopenharmony_cistatic unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
7908c2ecf20Sopenharmony_ci				 unsigned char syncFlag);
7918c2ecf20Sopenharmony_cistatic void FPT_ssel(u32 port, unsigned char p_card);
7928c2ecf20Sopenharmony_cistatic void FPT_sres(u32 port, unsigned char p_card,
7938c2ecf20Sopenharmony_ci		     struct sccb_card *pCurrCard);
7948c2ecf20Sopenharmony_cistatic void FPT_shandem(u32 port, unsigned char p_card,
7958c2ecf20Sopenharmony_ci			struct sccb *pCurrSCCB);
7968c2ecf20Sopenharmony_cistatic void FPT_stsyncn(u32 port, unsigned char p_card);
7978c2ecf20Sopenharmony_cistatic void FPT_sisyncr(u32 port, unsigned char sync_pulse,
7988c2ecf20Sopenharmony_ci			unsigned char offset);
7998c2ecf20Sopenharmony_cistatic void FPT_sssyncv(u32 p_port, unsigned char p_id,
8008c2ecf20Sopenharmony_ci			unsigned char p_sync_value,
8018c2ecf20Sopenharmony_ci			struct sccb_mgr_tar_info *currTar_Info);
8028c2ecf20Sopenharmony_cistatic void FPT_sresb(u32 port, unsigned char p_card);
8038c2ecf20Sopenharmony_cistatic void FPT_sxfrp(u32 p_port, unsigned char p_card);
8048c2ecf20Sopenharmony_cistatic void FPT_schkdd(u32 port, unsigned char p_card);
8058c2ecf20Sopenharmony_cistatic unsigned char FPT_RdStack(u32 port, unsigned char index);
8068c2ecf20Sopenharmony_cistatic void FPT_WrStack(u32 portBase, unsigned char index,
8078c2ecf20Sopenharmony_ci			unsigned char data);
8088c2ecf20Sopenharmony_cistatic unsigned char FPT_ChkIfChipInitialized(u32 ioPort);
8098c2ecf20Sopenharmony_ci
8108c2ecf20Sopenharmony_cistatic void FPT_SendMsg(u32 port, unsigned char message);
8118c2ecf20Sopenharmony_cistatic void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
8128c2ecf20Sopenharmony_ci				   unsigned char error_code);
8138c2ecf20Sopenharmony_ci
8148c2ecf20Sopenharmony_cistatic void FPT_sinits(struct sccb *p_sccb, unsigned char p_card);
8158c2ecf20Sopenharmony_cistatic void FPT_RNVRamData(struct nvram_info *pNvRamInfo);
8168c2ecf20Sopenharmony_ci
8178c2ecf20Sopenharmony_cistatic unsigned char FPT_siwidn(u32 port, unsigned char p_card);
8188c2ecf20Sopenharmony_cistatic void FPT_stwidn(u32 port, unsigned char p_card);
8198c2ecf20Sopenharmony_cistatic void FPT_siwidr(u32 port, unsigned char width);
8208c2ecf20Sopenharmony_ci
8218c2ecf20Sopenharmony_cistatic void FPT_queueSelectFail(struct sccb_card *pCurrCard,
8228c2ecf20Sopenharmony_ci				unsigned char p_card);
8238c2ecf20Sopenharmony_cistatic void FPT_queueDisconnect(struct sccb *p_SCCB, unsigned char p_card);
8248c2ecf20Sopenharmony_cistatic void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
8258c2ecf20Sopenharmony_ci				 struct sccb *p_SCCB, unsigned char p_card);
8268c2ecf20Sopenharmony_cistatic void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
8278c2ecf20Sopenharmony_ci				  unsigned char p_card);
8288c2ecf20Sopenharmony_cistatic void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code);
8298c2ecf20Sopenharmony_cistatic void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char card);
8308c2ecf20Sopenharmony_cistatic unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
8318c2ecf20Sopenharmony_ci				       unsigned char p_card);
8328c2ecf20Sopenharmony_cistatic void FPT_utilUpdateResidual(struct sccb *p_SCCB);
8338c2ecf20Sopenharmony_cistatic unsigned short FPT_CalcCrc16(unsigned char buffer[]);
8348c2ecf20Sopenharmony_cistatic unsigned char FPT_CalcLrc(unsigned char buffer[]);
8358c2ecf20Sopenharmony_ci
8368c2ecf20Sopenharmony_cistatic void FPT_Wait1Second(u32 p_port);
8378c2ecf20Sopenharmony_cistatic void FPT_Wait(u32 p_port, unsigned char p_delay);
8388c2ecf20Sopenharmony_cistatic void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode);
8398c2ecf20Sopenharmony_cistatic void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
8408c2ecf20Sopenharmony_ci			    unsigned short ee_addr);
8418c2ecf20Sopenharmony_cistatic unsigned short FPT_utilEERead(u32 p_port,
8428c2ecf20Sopenharmony_ci				     unsigned short ee_addr);
8438c2ecf20Sopenharmony_cistatic unsigned short FPT_utilEEReadOrg(u32 p_port,
8448c2ecf20Sopenharmony_ci					unsigned short ee_addr);
8458c2ecf20Sopenharmony_cistatic void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
8468c2ecf20Sopenharmony_ci				  unsigned short ee_addr);
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_cistatic void FPT_phaseDataOut(u32 port, unsigned char p_card);
8498c2ecf20Sopenharmony_cistatic void FPT_phaseDataIn(u32 port, unsigned char p_card);
8508c2ecf20Sopenharmony_cistatic void FPT_phaseCommand(u32 port, unsigned char p_card);
8518c2ecf20Sopenharmony_cistatic void FPT_phaseStatus(u32 port, unsigned char p_card);
8528c2ecf20Sopenharmony_cistatic void FPT_phaseMsgOut(u32 port, unsigned char p_card);
8538c2ecf20Sopenharmony_cistatic void FPT_phaseMsgIn(u32 port, unsigned char p_card);
8548c2ecf20Sopenharmony_cistatic void FPT_phaseIllegal(u32 port, unsigned char p_card);
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_cistatic void FPT_phaseDecode(u32 port, unsigned char p_card);
8578c2ecf20Sopenharmony_cistatic void FPT_phaseChkFifo(u32 port, unsigned char p_card);
8588c2ecf20Sopenharmony_cistatic void FPT_phaseBusFree(u32 p_port, unsigned char p_card);
8598c2ecf20Sopenharmony_ci
8608c2ecf20Sopenharmony_cistatic void FPT_XbowInit(u32 port, unsigned char scamFlg);
8618c2ecf20Sopenharmony_cistatic void FPT_BusMasterInit(u32 p_port);
8628c2ecf20Sopenharmony_cistatic void FPT_DiagEEPROM(u32 p_port);
8638c2ecf20Sopenharmony_ci
8648c2ecf20Sopenharmony_cistatic void FPT_dataXferProcessor(u32 port,
8658c2ecf20Sopenharmony_ci				  struct sccb_card *pCurrCard);
8668c2ecf20Sopenharmony_cistatic void FPT_busMstrSGDataXferStart(u32 port,
8678c2ecf20Sopenharmony_ci				       struct sccb *pCurrSCCB);
8688c2ecf20Sopenharmony_cistatic void FPT_busMstrDataXferStart(u32 port,
8698c2ecf20Sopenharmony_ci				     struct sccb *pCurrSCCB);
8708c2ecf20Sopenharmony_cistatic void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
8718c2ecf20Sopenharmony_ci				  struct sccb *pCurrSCCB);
8728c2ecf20Sopenharmony_cistatic void FPT_hostDataXferRestart(struct sccb *currSCCB);
8738c2ecf20Sopenharmony_ci
8748c2ecf20Sopenharmony_cistatic unsigned char FPT_SccbMgr_bad_isr(u32 p_port,
8758c2ecf20Sopenharmony_ci					 unsigned char p_card,
8768c2ecf20Sopenharmony_ci					 struct sccb_card *pCurrCard,
8778c2ecf20Sopenharmony_ci					 unsigned short p_int);
8788c2ecf20Sopenharmony_ci
8798c2ecf20Sopenharmony_cistatic void FPT_SccbMgrTableInitAll(void);
8808c2ecf20Sopenharmony_cistatic void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
8818c2ecf20Sopenharmony_ci				     unsigned char p_card);
8828c2ecf20Sopenharmony_cistatic void FPT_SccbMgrTableInitTarget(unsigned char p_card,
8838c2ecf20Sopenharmony_ci				       unsigned char target);
8848c2ecf20Sopenharmony_ci
8858c2ecf20Sopenharmony_cistatic void FPT_scini(unsigned char p_card, unsigned char p_our_id,
8868c2ecf20Sopenharmony_ci		      unsigned char p_power_up);
8878c2ecf20Sopenharmony_ci
8888c2ecf20Sopenharmony_cistatic int FPT_scarb(u32 p_port, unsigned char p_sel_type);
8898c2ecf20Sopenharmony_cistatic void FPT_scbusf(u32 p_port);
8908c2ecf20Sopenharmony_cistatic void FPT_scsel(u32 p_port);
8918c2ecf20Sopenharmony_cistatic void FPT_scasid(unsigned char p_card, u32 p_port);
8928c2ecf20Sopenharmony_cistatic unsigned char FPT_scxferc(u32 p_port, unsigned char p_data);
8938c2ecf20Sopenharmony_cistatic unsigned char FPT_scsendi(u32 p_port,
8948c2ecf20Sopenharmony_ci				 unsigned char p_id_string[]);
8958c2ecf20Sopenharmony_cistatic unsigned char FPT_sciso(u32 p_port,
8968c2ecf20Sopenharmony_ci			       unsigned char p_id_string[]);
8978c2ecf20Sopenharmony_cistatic void FPT_scwirod(u32 p_port, unsigned char p_data_bit);
8988c2ecf20Sopenharmony_cistatic void FPT_scwiros(u32 p_port, unsigned char p_data_bit);
8998c2ecf20Sopenharmony_cistatic unsigned char FPT_scvalq(unsigned char p_quintet);
9008c2ecf20Sopenharmony_cistatic unsigned char FPT_scsell(u32 p_port, unsigned char targ_id);
9018c2ecf20Sopenharmony_cistatic void FPT_scwtsel(u32 p_port);
9028c2ecf20Sopenharmony_cistatic void FPT_inisci(unsigned char p_card, u32 p_port,
9038c2ecf20Sopenharmony_ci		       unsigned char p_our_id);
9048c2ecf20Sopenharmony_cistatic void FPT_scsavdi(unsigned char p_card, u32 p_port);
9058c2ecf20Sopenharmony_cistatic unsigned char FPT_scmachid(unsigned char p_card,
9068c2ecf20Sopenharmony_ci				  unsigned char p_id_string[]);
9078c2ecf20Sopenharmony_ci
9088c2ecf20Sopenharmony_cistatic void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card);
9098c2ecf20Sopenharmony_cistatic void FPT_autoLoadDefaultMap(u32 p_port);
9108c2ecf20Sopenharmony_ci
9118c2ecf20Sopenharmony_cistatic struct sccb_mgr_tar_info FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] =
9128c2ecf20Sopenharmony_ci    { {{0}} };
9138c2ecf20Sopenharmony_cistatic struct sccb_card FPT_BL_Card[MAX_CARDS] = { {0} };
9148c2ecf20Sopenharmony_cistatic SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { {{0}} };
9158c2ecf20Sopenharmony_cistatic struct nvram_info FPT_nvRamInfo[MAX_MB_CARDS] = { {0} };
9168c2ecf20Sopenharmony_ci
9178c2ecf20Sopenharmony_cistatic unsigned char FPT_mbCards = 0;
9188c2ecf20Sopenharmony_cistatic unsigned char FPT_scamHAString[] =
9198c2ecf20Sopenharmony_ci    { 0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C',
9208c2ecf20Sopenharmony_ci	' ', 'B', 'T', '-', '9', '3', '0',
9218c2ecf20Sopenharmony_ci	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
9228c2ecf20Sopenharmony_ci	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
9238c2ecf20Sopenharmony_ci};
9248c2ecf20Sopenharmony_ci
9258c2ecf20Sopenharmony_cistatic unsigned short FPT_default_intena = 0;
9268c2ecf20Sopenharmony_ci
9278c2ecf20Sopenharmony_cistatic void (*FPT_s_PhaseTbl[8]) (u32, unsigned char) = {
9288c2ecf20Sopenharmony_ci0};
9298c2ecf20Sopenharmony_ci
9308c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
9318c2ecf20Sopenharmony_ci *
9328c2ecf20Sopenharmony_ci * Function: FlashPoint_ProbeHostAdapter
9338c2ecf20Sopenharmony_ci *
9348c2ecf20Sopenharmony_ci * Description: Setup and/or Search for cards and return info to caller.
9358c2ecf20Sopenharmony_ci *
9368c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
9378c2ecf20Sopenharmony_ci
9388c2ecf20Sopenharmony_cistatic int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
9398c2ecf20Sopenharmony_ci{
9408c2ecf20Sopenharmony_ci	static unsigned char first_time = 1;
9418c2ecf20Sopenharmony_ci
9428c2ecf20Sopenharmony_ci	unsigned char i, j, id, ScamFlg;
9438c2ecf20Sopenharmony_ci	unsigned short temp, temp2, temp3, temp4, temp5, temp6;
9448c2ecf20Sopenharmony_ci	u32 ioport;
9458c2ecf20Sopenharmony_ci	struct nvram_info *pCurrNvRam;
9468c2ecf20Sopenharmony_ci
9478c2ecf20Sopenharmony_ci	ioport = pCardInfo->si_baseaddr;
9488c2ecf20Sopenharmony_ci
9498c2ecf20Sopenharmony_ci	if (RD_HARPOON(ioport + hp_vendor_id_0) != ORION_VEND_0)
9508c2ecf20Sopenharmony_ci		return (int)FAILURE;
9518c2ecf20Sopenharmony_ci
9528c2ecf20Sopenharmony_ci	if ((RD_HARPOON(ioport + hp_vendor_id_1) != ORION_VEND_1))
9538c2ecf20Sopenharmony_ci		return (int)FAILURE;
9548c2ecf20Sopenharmony_ci
9558c2ecf20Sopenharmony_ci	if ((RD_HARPOON(ioport + hp_device_id_0) != ORION_DEV_0))
9568c2ecf20Sopenharmony_ci		return (int)FAILURE;
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_ci	if ((RD_HARPOON(ioport + hp_device_id_1) != ORION_DEV_1))
9598c2ecf20Sopenharmony_ci		return (int)FAILURE;
9608c2ecf20Sopenharmony_ci
9618c2ecf20Sopenharmony_ci	if (RD_HARPOON(ioport + hp_rev_num) != 0x0f) {
9628c2ecf20Sopenharmony_ci
9638c2ecf20Sopenharmony_ci/* For new Harpoon then check for sub_device ID LSB
9648c2ecf20Sopenharmony_ci   the bits(0-3) must be all ZERO for compatible with
9658c2ecf20Sopenharmony_ci   current version of SCCBMgr, else skip this Harpoon
9668c2ecf20Sopenharmony_ci	device. */
9678c2ecf20Sopenharmony_ci
9688c2ecf20Sopenharmony_ci		if (RD_HARPOON(ioport + hp_sub_device_id_0) & 0x0f)
9698c2ecf20Sopenharmony_ci			return (int)FAILURE;
9708c2ecf20Sopenharmony_ci	}
9718c2ecf20Sopenharmony_ci
9728c2ecf20Sopenharmony_ci	if (first_time) {
9738c2ecf20Sopenharmony_ci		FPT_SccbMgrTableInitAll();
9748c2ecf20Sopenharmony_ci		first_time = 0;
9758c2ecf20Sopenharmony_ci		FPT_mbCards = 0;
9768c2ecf20Sopenharmony_ci	}
9778c2ecf20Sopenharmony_ci
9788c2ecf20Sopenharmony_ci	if (FPT_RdStack(ioport, 0) != 0x00) {
9798c2ecf20Sopenharmony_ci		if (FPT_ChkIfChipInitialized(ioport) == 0) {
9808c2ecf20Sopenharmony_ci			pCurrNvRam = NULL;
9818c2ecf20Sopenharmony_ci			WR_HARPOON(ioport + hp_semaphore, 0x00);
9828c2ecf20Sopenharmony_ci			FPT_XbowInit(ioport, 0);	/*Must Init the SCSI before attempting */
9838c2ecf20Sopenharmony_ci			FPT_DiagEEPROM(ioport);
9848c2ecf20Sopenharmony_ci		} else {
9858c2ecf20Sopenharmony_ci			if (FPT_mbCards < MAX_MB_CARDS) {
9868c2ecf20Sopenharmony_ci				pCurrNvRam = &FPT_nvRamInfo[FPT_mbCards];
9878c2ecf20Sopenharmony_ci				FPT_mbCards++;
9888c2ecf20Sopenharmony_ci				pCurrNvRam->niBaseAddr = ioport;
9898c2ecf20Sopenharmony_ci				FPT_RNVRamData(pCurrNvRam);
9908c2ecf20Sopenharmony_ci			} else
9918c2ecf20Sopenharmony_ci				return (int)FAILURE;
9928c2ecf20Sopenharmony_ci		}
9938c2ecf20Sopenharmony_ci	} else
9948c2ecf20Sopenharmony_ci		pCurrNvRam = NULL;
9958c2ecf20Sopenharmony_ci
9968c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
9978c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
9988c2ecf20Sopenharmony_ci
9998c2ecf20Sopenharmony_ci	if (pCurrNvRam)
10008c2ecf20Sopenharmony_ci		pCardInfo->si_id = pCurrNvRam->niAdapId;
10018c2ecf20Sopenharmony_ci	else
10028c2ecf20Sopenharmony_ci		pCardInfo->si_id =
10038c2ecf20Sopenharmony_ci		    (unsigned
10048c2ecf20Sopenharmony_ci		     char)(FPT_utilEERead(ioport,
10058c2ecf20Sopenharmony_ci					  (ADAPTER_SCSI_ID /
10068c2ecf20Sopenharmony_ci					   2)) & (unsigned char)0x0FF);
10078c2ecf20Sopenharmony_ci
10088c2ecf20Sopenharmony_ci	pCardInfo->si_lun = 0x00;
10098c2ecf20Sopenharmony_ci	pCardInfo->si_fw_revision = ORION_FW_REV;
10108c2ecf20Sopenharmony_ci	temp2 = 0x0000;
10118c2ecf20Sopenharmony_ci	temp3 = 0x0000;
10128c2ecf20Sopenharmony_ci	temp4 = 0x0000;
10138c2ecf20Sopenharmony_ci	temp5 = 0x0000;
10148c2ecf20Sopenharmony_ci	temp6 = 0x0000;
10158c2ecf20Sopenharmony_ci
10168c2ecf20Sopenharmony_ci	for (id = 0; id < (16 / 2); id++) {
10178c2ecf20Sopenharmony_ci
10188c2ecf20Sopenharmony_ci		if (pCurrNvRam) {
10198c2ecf20Sopenharmony_ci			temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
10208c2ecf20Sopenharmony_ci			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
10218c2ecf20Sopenharmony_ci			    (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
10228c2ecf20Sopenharmony_ci		} else
10238c2ecf20Sopenharmony_ci			temp =
10248c2ecf20Sopenharmony_ci			    FPT_utilEERead(ioport,
10258c2ecf20Sopenharmony_ci					   (unsigned short)((SYNC_RATE_TBL / 2)
10268c2ecf20Sopenharmony_ci							    + id));
10278c2ecf20Sopenharmony_ci
10288c2ecf20Sopenharmony_ci		for (i = 0; i < 2; temp >>= 8, i++) {
10298c2ecf20Sopenharmony_ci
10308c2ecf20Sopenharmony_ci			temp2 >>= 1;
10318c2ecf20Sopenharmony_ci			temp3 >>= 1;
10328c2ecf20Sopenharmony_ci			temp4 >>= 1;
10338c2ecf20Sopenharmony_ci			temp5 >>= 1;
10348c2ecf20Sopenharmony_ci			temp6 >>= 1;
10358c2ecf20Sopenharmony_ci			switch (temp & 0x3) {
10368c2ecf20Sopenharmony_ci			case AUTO_RATE_20:	/* Synchronous, 20 mega-transfers/second */
10378c2ecf20Sopenharmony_ci				temp6 |= 0x8000;
10388c2ecf20Sopenharmony_ci				fallthrough;
10398c2ecf20Sopenharmony_ci			case AUTO_RATE_10:	/* Synchronous, 10 mega-transfers/second */
10408c2ecf20Sopenharmony_ci				temp5 |= 0x8000;
10418c2ecf20Sopenharmony_ci				fallthrough;
10428c2ecf20Sopenharmony_ci			case AUTO_RATE_05:	/* Synchronous, 5 mega-transfers/second */
10438c2ecf20Sopenharmony_ci				temp2 |= 0x8000;
10448c2ecf20Sopenharmony_ci				fallthrough;
10458c2ecf20Sopenharmony_ci			case AUTO_RATE_00:	/* Asynchronous */
10468c2ecf20Sopenharmony_ci				break;
10478c2ecf20Sopenharmony_ci			}
10488c2ecf20Sopenharmony_ci
10498c2ecf20Sopenharmony_ci			if (temp & DISC_ENABLE_BIT)
10508c2ecf20Sopenharmony_ci				temp3 |= 0x8000;
10518c2ecf20Sopenharmony_ci
10528c2ecf20Sopenharmony_ci			if (temp & WIDE_NEGO_BIT)
10538c2ecf20Sopenharmony_ci				temp4 |= 0x8000;
10548c2ecf20Sopenharmony_ci
10558c2ecf20Sopenharmony_ci		}
10568c2ecf20Sopenharmony_ci	}
10578c2ecf20Sopenharmony_ci
10588c2ecf20Sopenharmony_ci	pCardInfo->si_per_targ_init_sync = temp2;
10598c2ecf20Sopenharmony_ci	pCardInfo->si_per_targ_no_disc = temp3;
10608c2ecf20Sopenharmony_ci	pCardInfo->si_per_targ_wide_nego = temp4;
10618c2ecf20Sopenharmony_ci	pCardInfo->si_per_targ_fast_nego = temp5;
10628c2ecf20Sopenharmony_ci	pCardInfo->si_per_targ_ultra_nego = temp6;
10638c2ecf20Sopenharmony_ci
10648c2ecf20Sopenharmony_ci	if (pCurrNvRam)
10658c2ecf20Sopenharmony_ci		i = pCurrNvRam->niSysConf;
10668c2ecf20Sopenharmony_ci	else
10678c2ecf20Sopenharmony_ci		i = (unsigned
10688c2ecf20Sopenharmony_ci		     char)(FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)));
10698c2ecf20Sopenharmony_ci
10708c2ecf20Sopenharmony_ci	if (pCurrNvRam)
10718c2ecf20Sopenharmony_ci		ScamFlg = pCurrNvRam->niScamConf;
10728c2ecf20Sopenharmony_ci	else
10738c2ecf20Sopenharmony_ci		ScamFlg =
10748c2ecf20Sopenharmony_ci		    (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
10758c2ecf20Sopenharmony_ci
10768c2ecf20Sopenharmony_ci	pCardInfo->si_mflags = 0x0000;
10778c2ecf20Sopenharmony_ci
10788c2ecf20Sopenharmony_ci	if (i & 0x01)
10798c2ecf20Sopenharmony_ci		pCardInfo->si_mflags |= SCSI_PARITY_ENA;
10808c2ecf20Sopenharmony_ci
10818c2ecf20Sopenharmony_ci	if (!(i & 0x02))
10828c2ecf20Sopenharmony_ci		pCardInfo->si_mflags |= SOFT_RESET;
10838c2ecf20Sopenharmony_ci
10848c2ecf20Sopenharmony_ci	if (i & 0x10)
10858c2ecf20Sopenharmony_ci		pCardInfo->si_mflags |= EXTENDED_TRANSLATION;
10868c2ecf20Sopenharmony_ci
10878c2ecf20Sopenharmony_ci	if (ScamFlg & SCAM_ENABLED)
10888c2ecf20Sopenharmony_ci		pCardInfo->si_mflags |= FLAG_SCAM_ENABLED;
10898c2ecf20Sopenharmony_ci
10908c2ecf20Sopenharmony_ci	if (ScamFlg & SCAM_LEVEL2)
10918c2ecf20Sopenharmony_ci		pCardInfo->si_mflags |= FLAG_SCAM_LEVEL2;
10928c2ecf20Sopenharmony_ci
10938c2ecf20Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
10948c2ecf20Sopenharmony_ci	if (i & 0x04) {
10958c2ecf20Sopenharmony_ci		j |= SCSI_TERM_ENA_L;
10968c2ecf20Sopenharmony_ci	}
10978c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_bm_ctrl, j);
10988c2ecf20Sopenharmony_ci
10998c2ecf20Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
11008c2ecf20Sopenharmony_ci	if (i & 0x08) {
11018c2ecf20Sopenharmony_ci		j |= SCSI_TERM_ENA_H;
11028c2ecf20Sopenharmony_ci	}
11038c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_ee_ctrl, j);
11048c2ecf20Sopenharmony_ci
11058c2ecf20Sopenharmony_ci	if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD))
11068c2ecf20Sopenharmony_ci
11078c2ecf20Sopenharmony_ci		pCardInfo->si_mflags |= SUPPORT_16TAR_32LUN;
11088c2ecf20Sopenharmony_ci
11098c2ecf20Sopenharmony_ci	pCardInfo->si_card_family = HARPOON_FAMILY;
11108c2ecf20Sopenharmony_ci	pCardInfo->si_bustype = BUSTYPE_PCI;
11118c2ecf20Sopenharmony_ci
11128c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
11138c2ecf20Sopenharmony_ci		pCardInfo->si_card_model[0] = '9';
11148c2ecf20Sopenharmony_ci		switch (pCurrNvRam->niModel & 0x0f) {
11158c2ecf20Sopenharmony_ci		case MODEL_LT:
11168c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[1] = '3';
11178c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[2] = '0';
11188c2ecf20Sopenharmony_ci			break;
11198c2ecf20Sopenharmony_ci		case MODEL_LW:
11208c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[1] = '5';
11218c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[2] = '0';
11228c2ecf20Sopenharmony_ci			break;
11238c2ecf20Sopenharmony_ci		case MODEL_DL:
11248c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[1] = '3';
11258c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[2] = '2';
11268c2ecf20Sopenharmony_ci			break;
11278c2ecf20Sopenharmony_ci		case MODEL_DW:
11288c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[1] = '5';
11298c2ecf20Sopenharmony_ci			pCardInfo->si_card_model[2] = '2';
11308c2ecf20Sopenharmony_ci			break;
11318c2ecf20Sopenharmony_ci		}
11328c2ecf20Sopenharmony_ci	} else {
11338c2ecf20Sopenharmony_ci		temp = FPT_utilEERead(ioport, (MODEL_NUMB_0 / 2));
11348c2ecf20Sopenharmony_ci		pCardInfo->si_card_model[0] = (unsigned char)(temp >> 8);
11358c2ecf20Sopenharmony_ci		temp = FPT_utilEERead(ioport, (MODEL_NUMB_2 / 2));
11368c2ecf20Sopenharmony_ci
11378c2ecf20Sopenharmony_ci		pCardInfo->si_card_model[1] = (unsigned char)(temp & 0x00FF);
11388c2ecf20Sopenharmony_ci		pCardInfo->si_card_model[2] = (unsigned char)(temp >> 8);
11398c2ecf20Sopenharmony_ci	}
11408c2ecf20Sopenharmony_ci
11418c2ecf20Sopenharmony_ci	if (pCardInfo->si_card_model[1] == '3') {
11428c2ecf20Sopenharmony_ci		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
11438c2ecf20Sopenharmony_ci			pCardInfo->si_mflags |= LOW_BYTE_TERM;
11448c2ecf20Sopenharmony_ci	} else if (pCardInfo->si_card_model[2] == '0') {
11458c2ecf20Sopenharmony_ci		temp = RD_HARPOON(ioport + hp_xfer_pad);
11468c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4)));
11478c2ecf20Sopenharmony_ci		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
11488c2ecf20Sopenharmony_ci			pCardInfo->si_mflags |= LOW_BYTE_TERM;
11498c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4)));
11508c2ecf20Sopenharmony_ci		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
11518c2ecf20Sopenharmony_ci			pCardInfo->si_mflags |= HIGH_BYTE_TERM;
11528c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, temp);
11538c2ecf20Sopenharmony_ci	} else {
11548c2ecf20Sopenharmony_ci		temp = RD_HARPOON(ioport + hp_ee_ctrl);
11558c2ecf20Sopenharmony_ci		temp2 = RD_HARPOON(ioport + hp_xfer_pad);
11568c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_ee_ctrl, (temp | SEE_CS));
11578c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
11588c2ecf20Sopenharmony_ci		temp3 = 0;
11598c2ecf20Sopenharmony_ci		for (i = 0; i < 8; i++) {
11608c2ecf20Sopenharmony_ci			temp3 <<= 1;
11618c2ecf20Sopenharmony_ci			if (!(RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7)))
11628c2ecf20Sopenharmony_ci				temp3 |= 1;
11638c2ecf20Sopenharmony_ci			WR_HARPOON(ioport + hp_xfer_pad, (temp2 & ~BIT(4)));
11648c2ecf20Sopenharmony_ci			WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
11658c2ecf20Sopenharmony_ci		}
11668c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_ee_ctrl, temp);
11678c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, temp2);
11688c2ecf20Sopenharmony_ci		if (!(temp3 & BIT(7)))
11698c2ecf20Sopenharmony_ci			pCardInfo->si_mflags |= LOW_BYTE_TERM;
11708c2ecf20Sopenharmony_ci		if (!(temp3 & BIT(6)))
11718c2ecf20Sopenharmony_ci			pCardInfo->si_mflags |= HIGH_BYTE_TERM;
11728c2ecf20Sopenharmony_ci	}
11738c2ecf20Sopenharmony_ci
11748c2ecf20Sopenharmony_ci	ARAM_ACCESS(ioport);
11758c2ecf20Sopenharmony_ci
11768c2ecf20Sopenharmony_ci	for (i = 0; i < 4; i++) {
11778c2ecf20Sopenharmony_ci
11788c2ecf20Sopenharmony_ci		pCardInfo->si_XlatInfo[i] =
11798c2ecf20Sopenharmony_ci		    RD_HARPOON(ioport + hp_aramBase + BIOS_DATA_OFFSET + i);
11808c2ecf20Sopenharmony_ci	}
11818c2ecf20Sopenharmony_ci
11828c2ecf20Sopenharmony_ci	/* return with -1 if no sort, else return with
11838c2ecf20Sopenharmony_ci	   logical card number sorted by BIOS (zero-based) */
11848c2ecf20Sopenharmony_ci
11858c2ecf20Sopenharmony_ci	pCardInfo->si_relative_cardnum =
11868c2ecf20Sopenharmony_ci	    (unsigned
11878c2ecf20Sopenharmony_ci	     char)(RD_HARPOON(ioport + hp_aramBase + BIOS_RELATIVE_CARD) - 1);
11888c2ecf20Sopenharmony_ci
11898c2ecf20Sopenharmony_ci	SGRAM_ACCESS(ioport);
11908c2ecf20Sopenharmony_ci
11918c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[0] = FPT_phaseDataOut;
11928c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[1] = FPT_phaseDataIn;
11938c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[2] = FPT_phaseIllegal;
11948c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[3] = FPT_phaseIllegal;
11958c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[4] = FPT_phaseCommand;
11968c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[5] = FPT_phaseStatus;
11978c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[6] = FPT_phaseMsgOut;
11988c2ecf20Sopenharmony_ci	FPT_s_PhaseTbl[7] = FPT_phaseMsgIn;
11998c2ecf20Sopenharmony_ci
12008c2ecf20Sopenharmony_ci	pCardInfo->si_present = 0x01;
12018c2ecf20Sopenharmony_ci
12028c2ecf20Sopenharmony_ci	return 0;
12038c2ecf20Sopenharmony_ci}
12048c2ecf20Sopenharmony_ci
12058c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
12068c2ecf20Sopenharmony_ci *
12078c2ecf20Sopenharmony_ci * Function: FlashPoint_HardwareResetHostAdapter
12088c2ecf20Sopenharmony_ci *
12098c2ecf20Sopenharmony_ci * Description: Setup adapter for normal operation (hard reset).
12108c2ecf20Sopenharmony_ci *
12118c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
12128c2ecf20Sopenharmony_ci
12138c2ecf20Sopenharmony_cistatic void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
12148c2ecf20Sopenharmony_ci							 *pCardInfo)
12158c2ecf20Sopenharmony_ci{
12168c2ecf20Sopenharmony_ci	struct sccb_card *CurrCard = NULL;
12178c2ecf20Sopenharmony_ci	struct nvram_info *pCurrNvRam;
12188c2ecf20Sopenharmony_ci	unsigned char i, j, thisCard, ScamFlg;
12198c2ecf20Sopenharmony_ci	unsigned short temp, sync_bit_map, id;
12208c2ecf20Sopenharmony_ci	u32 ioport;
12218c2ecf20Sopenharmony_ci
12228c2ecf20Sopenharmony_ci	ioport = pCardInfo->si_baseaddr;
12238c2ecf20Sopenharmony_ci
12248c2ecf20Sopenharmony_ci	for (thisCard = 0; thisCard <= MAX_CARDS; thisCard++) {
12258c2ecf20Sopenharmony_ci
12268c2ecf20Sopenharmony_ci		if (thisCard == MAX_CARDS)
12278c2ecf20Sopenharmony_ci			return (void *)FAILURE;
12288c2ecf20Sopenharmony_ci
12298c2ecf20Sopenharmony_ci		if (FPT_BL_Card[thisCard].ioPort == ioport) {
12308c2ecf20Sopenharmony_ci
12318c2ecf20Sopenharmony_ci			CurrCard = &FPT_BL_Card[thisCard];
12328c2ecf20Sopenharmony_ci			FPT_SccbMgrTableInitCard(CurrCard, thisCard);
12338c2ecf20Sopenharmony_ci			break;
12348c2ecf20Sopenharmony_ci		}
12358c2ecf20Sopenharmony_ci
12368c2ecf20Sopenharmony_ci		else if (FPT_BL_Card[thisCard].ioPort == 0x00) {
12378c2ecf20Sopenharmony_ci
12388c2ecf20Sopenharmony_ci			FPT_BL_Card[thisCard].ioPort = ioport;
12398c2ecf20Sopenharmony_ci			CurrCard = &FPT_BL_Card[thisCard];
12408c2ecf20Sopenharmony_ci
12418c2ecf20Sopenharmony_ci			if (FPT_mbCards)
12428c2ecf20Sopenharmony_ci				for (i = 0; i < FPT_mbCards; i++) {
12438c2ecf20Sopenharmony_ci					if (CurrCard->ioPort ==
12448c2ecf20Sopenharmony_ci					    FPT_nvRamInfo[i].niBaseAddr)
12458c2ecf20Sopenharmony_ci						CurrCard->pNvRamInfo =
12468c2ecf20Sopenharmony_ci						    &FPT_nvRamInfo[i];
12478c2ecf20Sopenharmony_ci				}
12488c2ecf20Sopenharmony_ci			FPT_SccbMgrTableInitCard(CurrCard, thisCard);
12498c2ecf20Sopenharmony_ci			CurrCard->cardIndex = thisCard;
12508c2ecf20Sopenharmony_ci			CurrCard->cardInfo = pCardInfo;
12518c2ecf20Sopenharmony_ci
12528c2ecf20Sopenharmony_ci			break;
12538c2ecf20Sopenharmony_ci		}
12548c2ecf20Sopenharmony_ci	}
12558c2ecf20Sopenharmony_ci
12568c2ecf20Sopenharmony_ci	pCurrNvRam = CurrCard->pNvRamInfo;
12578c2ecf20Sopenharmony_ci
12588c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
12598c2ecf20Sopenharmony_ci		ScamFlg = pCurrNvRam->niScamConf;
12608c2ecf20Sopenharmony_ci	} else {
12618c2ecf20Sopenharmony_ci		ScamFlg =
12628c2ecf20Sopenharmony_ci		    (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
12638c2ecf20Sopenharmony_ci	}
12648c2ecf20Sopenharmony_ci
12658c2ecf20Sopenharmony_ci	FPT_BusMasterInit(ioport);
12668c2ecf20Sopenharmony_ci	FPT_XbowInit(ioport, ScamFlg);
12678c2ecf20Sopenharmony_ci
12688c2ecf20Sopenharmony_ci	FPT_autoLoadDefaultMap(ioport);
12698c2ecf20Sopenharmony_ci
12708c2ecf20Sopenharmony_ci	for (i = 0, id = 0x01; i != pCardInfo->si_id; i++, id <<= 1) {
12718c2ecf20Sopenharmony_ci	}
12728c2ecf20Sopenharmony_ci
12738c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_selfid_0, id);
12748c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_selfid_1, 0x00);
12758c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id);
12768c2ecf20Sopenharmony_ci	CurrCard->ourId = pCardInfo->si_id;
12778c2ecf20Sopenharmony_ci
12788c2ecf20Sopenharmony_ci	i = (unsigned char)pCardInfo->si_mflags;
12798c2ecf20Sopenharmony_ci	if (i & SCSI_PARITY_ENA)
12808c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P));
12818c2ecf20Sopenharmony_ci
12828c2ecf20Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
12838c2ecf20Sopenharmony_ci	if (i & LOW_BYTE_TERM)
12848c2ecf20Sopenharmony_ci		j |= SCSI_TERM_ENA_L;
12858c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_bm_ctrl, j);
12868c2ecf20Sopenharmony_ci
12878c2ecf20Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
12888c2ecf20Sopenharmony_ci	if (i & HIGH_BYTE_TERM)
12898c2ecf20Sopenharmony_ci		j |= SCSI_TERM_ENA_H;
12908c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_ee_ctrl, j);
12918c2ecf20Sopenharmony_ci
12928c2ecf20Sopenharmony_ci	if (!(pCardInfo->si_mflags & SOFT_RESET)) {
12938c2ecf20Sopenharmony_ci
12948c2ecf20Sopenharmony_ci		FPT_sresb(ioport, thisCard);
12958c2ecf20Sopenharmony_ci
12968c2ecf20Sopenharmony_ci		FPT_scini(thisCard, pCardInfo->si_id, 0);
12978c2ecf20Sopenharmony_ci	}
12988c2ecf20Sopenharmony_ci
12998c2ecf20Sopenharmony_ci	if (pCardInfo->si_mflags & POST_ALL_UNDERRRUNS)
13008c2ecf20Sopenharmony_ci		CurrCard->globalFlags |= F_NO_FILTER;
13018c2ecf20Sopenharmony_ci
13028c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
13038c2ecf20Sopenharmony_ci		if (pCurrNvRam->niSysConf & 0x10)
13048c2ecf20Sopenharmony_ci			CurrCard->globalFlags |= F_GREEN_PC;
13058c2ecf20Sopenharmony_ci	} else {
13068c2ecf20Sopenharmony_ci		if (FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)) & GREEN_PC_ENA)
13078c2ecf20Sopenharmony_ci			CurrCard->globalFlags |= F_GREEN_PC;
13088c2ecf20Sopenharmony_ci	}
13098c2ecf20Sopenharmony_ci
13108c2ecf20Sopenharmony_ci	/* Set global flag to indicate Re-Negotiation to be done on all
13118c2ecf20Sopenharmony_ci	   ckeck condition */
13128c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
13138c2ecf20Sopenharmony_ci		if (pCurrNvRam->niScsiConf & 0x04)
13148c2ecf20Sopenharmony_ci			CurrCard->globalFlags |= F_DO_RENEGO;
13158c2ecf20Sopenharmony_ci	} else {
13168c2ecf20Sopenharmony_ci		if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & RENEGO_ENA)
13178c2ecf20Sopenharmony_ci			CurrCard->globalFlags |= F_DO_RENEGO;
13188c2ecf20Sopenharmony_ci	}
13198c2ecf20Sopenharmony_ci
13208c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
13218c2ecf20Sopenharmony_ci		if (pCurrNvRam->niScsiConf & 0x08)
13228c2ecf20Sopenharmony_ci			CurrCard->globalFlags |= F_CONLUN_IO;
13238c2ecf20Sopenharmony_ci	} else {
13248c2ecf20Sopenharmony_ci		if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & CONNIO_ENA)
13258c2ecf20Sopenharmony_ci			CurrCard->globalFlags |= F_CONLUN_IO;
13268c2ecf20Sopenharmony_ci	}
13278c2ecf20Sopenharmony_ci
13288c2ecf20Sopenharmony_ci	temp = pCardInfo->si_per_targ_no_disc;
13298c2ecf20Sopenharmony_ci
13308c2ecf20Sopenharmony_ci	for (i = 0, id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
13318c2ecf20Sopenharmony_ci
13328c2ecf20Sopenharmony_ci		if (temp & id)
13338c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
13348c2ecf20Sopenharmony_ci	}
13358c2ecf20Sopenharmony_ci
13368c2ecf20Sopenharmony_ci	sync_bit_map = 0x0001;
13378c2ecf20Sopenharmony_ci
13388c2ecf20Sopenharmony_ci	for (id = 0; id < (MAX_SCSI_TAR / 2); id++) {
13398c2ecf20Sopenharmony_ci
13408c2ecf20Sopenharmony_ci		if (pCurrNvRam) {
13418c2ecf20Sopenharmony_ci			temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
13428c2ecf20Sopenharmony_ci			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
13438c2ecf20Sopenharmony_ci			    (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
13448c2ecf20Sopenharmony_ci		} else
13458c2ecf20Sopenharmony_ci			temp =
13468c2ecf20Sopenharmony_ci			    FPT_utilEERead(ioport,
13478c2ecf20Sopenharmony_ci					   (unsigned short)((SYNC_RATE_TBL / 2)
13488c2ecf20Sopenharmony_ci							    + id));
13498c2ecf20Sopenharmony_ci
13508c2ecf20Sopenharmony_ci		for (i = 0; i < 2; temp >>= 8, i++) {
13518c2ecf20Sopenharmony_ci
13528c2ecf20Sopenharmony_ci			if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
13538c2ecf20Sopenharmony_ci
13548c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
13558c2ecf20Sopenharmony_ci							 i].TarEEValue =
13568c2ecf20Sopenharmony_ci				    (unsigned char)temp;
13578c2ecf20Sopenharmony_ci			}
13588c2ecf20Sopenharmony_ci
13598c2ecf20Sopenharmony_ci			else {
13608c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
13618c2ecf20Sopenharmony_ci							 i].TarStatus |=
13628c2ecf20Sopenharmony_ci				    SYNC_SUPPORTED;
13638c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
13648c2ecf20Sopenharmony_ci							 i].TarEEValue =
13658c2ecf20Sopenharmony_ci				    (unsigned char)(temp & ~EE_SYNC_MASK);
13668c2ecf20Sopenharmony_ci			}
13678c2ecf20Sopenharmony_ci
13688c2ecf20Sopenharmony_ci/*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
13698c2ecf20Sopenharmony_ci            (id*2+i >= 8)){
13708c2ecf20Sopenharmony_ci*/
13718c2ecf20Sopenharmony_ci			if (pCardInfo->si_per_targ_wide_nego & sync_bit_map) {
13728c2ecf20Sopenharmony_ci
13738c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
13748c2ecf20Sopenharmony_ci							 i].TarEEValue |=
13758c2ecf20Sopenharmony_ci				    EE_WIDE_SCSI;
13768c2ecf20Sopenharmony_ci
13778c2ecf20Sopenharmony_ci			}
13788c2ecf20Sopenharmony_ci
13798c2ecf20Sopenharmony_ci			else {	/* NARROW SCSI */
13808c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
13818c2ecf20Sopenharmony_ci							 i].TarStatus |=
13828c2ecf20Sopenharmony_ci				    WIDE_NEGOCIATED;
13838c2ecf20Sopenharmony_ci			}
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_ci			sync_bit_map <<= 1;
13868c2ecf20Sopenharmony_ci
13878c2ecf20Sopenharmony_ci		}
13888c2ecf20Sopenharmony_ci	}
13898c2ecf20Sopenharmony_ci
13908c2ecf20Sopenharmony_ci	WR_HARPOON((ioport + hp_semaphore),
13918c2ecf20Sopenharmony_ci		   (unsigned char)(RD_HARPOON((ioport + hp_semaphore)) |
13928c2ecf20Sopenharmony_ci				   SCCB_MGR_PRESENT));
13938c2ecf20Sopenharmony_ci
13948c2ecf20Sopenharmony_ci	return (void *)CurrCard;
13958c2ecf20Sopenharmony_ci}
13968c2ecf20Sopenharmony_ci
13978c2ecf20Sopenharmony_cistatic void FlashPoint_ReleaseHostAdapter(void *pCurrCard)
13988c2ecf20Sopenharmony_ci{
13998c2ecf20Sopenharmony_ci	unsigned char i;
14008c2ecf20Sopenharmony_ci	u32 portBase;
14018c2ecf20Sopenharmony_ci	u32 regOffset;
14028c2ecf20Sopenharmony_ci	u32 scamData;
14038c2ecf20Sopenharmony_ci	u32 *pScamTbl;
14048c2ecf20Sopenharmony_ci	struct nvram_info *pCurrNvRam;
14058c2ecf20Sopenharmony_ci
14068c2ecf20Sopenharmony_ci	pCurrNvRam = ((struct sccb_card *)pCurrCard)->pNvRamInfo;
14078c2ecf20Sopenharmony_ci
14088c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
14098c2ecf20Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
14108c2ecf20Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
14118c2ecf20Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
14128c2ecf20Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
14138c2ecf20Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
14148c2ecf20Sopenharmony_ci
14158c2ecf20Sopenharmony_ci		for (i = 0; i < MAX_SCSI_TAR / 2; i++)
14168c2ecf20Sopenharmony_ci			FPT_WrStack(pCurrNvRam->niBaseAddr,
14178c2ecf20Sopenharmony_ci				    (unsigned char)(i + 5),
14188c2ecf20Sopenharmony_ci				    pCurrNvRam->niSyncTbl[i]);
14198c2ecf20Sopenharmony_ci
14208c2ecf20Sopenharmony_ci		portBase = pCurrNvRam->niBaseAddr;
14218c2ecf20Sopenharmony_ci
14228c2ecf20Sopenharmony_ci		for (i = 0; i < MAX_SCSI_TAR; i++) {
14238c2ecf20Sopenharmony_ci			regOffset = hp_aramBase + 64 + i * 4;
14248c2ecf20Sopenharmony_ci			pScamTbl = (u32 *)&pCurrNvRam->niScamTbl[i];
14258c2ecf20Sopenharmony_ci			scamData = *pScamTbl;
14268c2ecf20Sopenharmony_ci			WR_HARP32(portBase, regOffset, scamData);
14278c2ecf20Sopenharmony_ci		}
14288c2ecf20Sopenharmony_ci
14298c2ecf20Sopenharmony_ci	} else {
14308c2ecf20Sopenharmony_ci		FPT_WrStack(((struct sccb_card *)pCurrCard)->ioPort, 0, 0);
14318c2ecf20Sopenharmony_ci	}
14328c2ecf20Sopenharmony_ci}
14338c2ecf20Sopenharmony_ci
14348c2ecf20Sopenharmony_cistatic void FPT_RNVRamData(struct nvram_info *pNvRamInfo)
14358c2ecf20Sopenharmony_ci{
14368c2ecf20Sopenharmony_ci	unsigned char i;
14378c2ecf20Sopenharmony_ci	u32 portBase;
14388c2ecf20Sopenharmony_ci	u32 regOffset;
14398c2ecf20Sopenharmony_ci	u32 scamData;
14408c2ecf20Sopenharmony_ci	u32 *pScamTbl;
14418c2ecf20Sopenharmony_ci
14428c2ecf20Sopenharmony_ci	pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0);
14438c2ecf20Sopenharmony_ci	pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1);
14448c2ecf20Sopenharmony_ci	pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2);
14458c2ecf20Sopenharmony_ci	pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3);
14468c2ecf20Sopenharmony_ci	pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4);
14478c2ecf20Sopenharmony_ci
14488c2ecf20Sopenharmony_ci	for (i = 0; i < MAX_SCSI_TAR / 2; i++)
14498c2ecf20Sopenharmony_ci		pNvRamInfo->niSyncTbl[i] =
14508c2ecf20Sopenharmony_ci		    FPT_RdStack(pNvRamInfo->niBaseAddr, (unsigned char)(i + 5));
14518c2ecf20Sopenharmony_ci
14528c2ecf20Sopenharmony_ci	portBase = pNvRamInfo->niBaseAddr;
14538c2ecf20Sopenharmony_ci
14548c2ecf20Sopenharmony_ci	for (i = 0; i < MAX_SCSI_TAR; i++) {
14558c2ecf20Sopenharmony_ci		regOffset = hp_aramBase + 64 + i * 4;
14568c2ecf20Sopenharmony_ci		RD_HARP32(portBase, regOffset, scamData);
14578c2ecf20Sopenharmony_ci		pScamTbl = (u32 *)&pNvRamInfo->niScamTbl[i];
14588c2ecf20Sopenharmony_ci		*pScamTbl = scamData;
14598c2ecf20Sopenharmony_ci	}
14608c2ecf20Sopenharmony_ci
14618c2ecf20Sopenharmony_ci}
14628c2ecf20Sopenharmony_ci
14638c2ecf20Sopenharmony_cistatic unsigned char FPT_RdStack(u32 portBase, unsigned char index)
14648c2ecf20Sopenharmony_ci{
14658c2ecf20Sopenharmony_ci	WR_HARPOON(portBase + hp_stack_addr, index);
14668c2ecf20Sopenharmony_ci	return RD_HARPOON(portBase + hp_stack_data);
14678c2ecf20Sopenharmony_ci}
14688c2ecf20Sopenharmony_ci
14698c2ecf20Sopenharmony_cistatic void FPT_WrStack(u32 portBase, unsigned char index, unsigned char data)
14708c2ecf20Sopenharmony_ci{
14718c2ecf20Sopenharmony_ci	WR_HARPOON(portBase + hp_stack_addr, index);
14728c2ecf20Sopenharmony_ci	WR_HARPOON(portBase + hp_stack_data, data);
14738c2ecf20Sopenharmony_ci}
14748c2ecf20Sopenharmony_ci
14758c2ecf20Sopenharmony_cistatic unsigned char FPT_ChkIfChipInitialized(u32 ioPort)
14768c2ecf20Sopenharmony_ci{
14778c2ecf20Sopenharmony_ci	if ((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4))
14788c2ecf20Sopenharmony_ci		return 0;
14798c2ecf20Sopenharmony_ci	if ((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
14808c2ecf20Sopenharmony_ci	    != CLKCTRL_DEFAULT)
14818c2ecf20Sopenharmony_ci		return 0;
14828c2ecf20Sopenharmony_ci	if ((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
14838c2ecf20Sopenharmony_ci	    (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
14848c2ecf20Sopenharmony_ci		return 1;
14858c2ecf20Sopenharmony_ci	return 0;
14868c2ecf20Sopenharmony_ci
14878c2ecf20Sopenharmony_ci}
14888c2ecf20Sopenharmony_ci
14898c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
14908c2ecf20Sopenharmony_ci *
14918c2ecf20Sopenharmony_ci * Function: FlashPoint_StartCCB
14928c2ecf20Sopenharmony_ci *
14938c2ecf20Sopenharmony_ci * Description: Start a command pointed to by p_Sccb. When the
14948c2ecf20Sopenharmony_ci *              command is completed it will be returned via the
14958c2ecf20Sopenharmony_ci *              callback function.
14968c2ecf20Sopenharmony_ci *
14978c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
14988c2ecf20Sopenharmony_cistatic void FlashPoint_StartCCB(void *curr_card, struct sccb *p_Sccb)
14998c2ecf20Sopenharmony_ci{
15008c2ecf20Sopenharmony_ci	u32 ioport;
15018c2ecf20Sopenharmony_ci	unsigned char thisCard, lun;
15028c2ecf20Sopenharmony_ci	struct sccb *pSaveSccb;
15038c2ecf20Sopenharmony_ci	CALL_BK_FN callback;
15048c2ecf20Sopenharmony_ci	struct sccb_card *pCurrCard = curr_card;
15058c2ecf20Sopenharmony_ci
15068c2ecf20Sopenharmony_ci	thisCard = pCurrCard->cardIndex;
15078c2ecf20Sopenharmony_ci	ioport = pCurrCard->ioPort;
15088c2ecf20Sopenharmony_ci
15098c2ecf20Sopenharmony_ci	if ((p_Sccb->TargID >= MAX_SCSI_TAR) || (p_Sccb->Lun >= MAX_LUN)) {
15108c2ecf20Sopenharmony_ci
15118c2ecf20Sopenharmony_ci		p_Sccb->HostStatus = SCCB_COMPLETE;
15128c2ecf20Sopenharmony_ci		p_Sccb->SccbStatus = SCCB_ERROR;
15138c2ecf20Sopenharmony_ci		callback = (CALL_BK_FN) p_Sccb->SccbCallback;
15148c2ecf20Sopenharmony_ci		if (callback)
15158c2ecf20Sopenharmony_ci			callback(p_Sccb);
15168c2ecf20Sopenharmony_ci
15178c2ecf20Sopenharmony_ci		return;
15188c2ecf20Sopenharmony_ci	}
15198c2ecf20Sopenharmony_ci
15208c2ecf20Sopenharmony_ci	FPT_sinits(p_Sccb, thisCard);
15218c2ecf20Sopenharmony_ci
15228c2ecf20Sopenharmony_ci	if (!pCurrCard->cmdCounter) {
15238c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_semaphore,
15248c2ecf20Sopenharmony_ci			   (RD_HARPOON(ioport + hp_semaphore)
15258c2ecf20Sopenharmony_ci			    | SCCB_MGR_ACTIVE));
15268c2ecf20Sopenharmony_ci
15278c2ecf20Sopenharmony_ci		if (pCurrCard->globalFlags & F_GREEN_PC) {
15288c2ecf20Sopenharmony_ci			WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
15298c2ecf20Sopenharmony_ci			WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
15308c2ecf20Sopenharmony_ci		}
15318c2ecf20Sopenharmony_ci	}
15328c2ecf20Sopenharmony_ci
15338c2ecf20Sopenharmony_ci	pCurrCard->cmdCounter++;
15348c2ecf20Sopenharmony_ci
15358c2ecf20Sopenharmony_ci	if (RD_HARPOON(ioport + hp_semaphore) & BIOS_IN_USE) {
15368c2ecf20Sopenharmony_ci
15378c2ecf20Sopenharmony_ci		WR_HARPOON(ioport + hp_semaphore,
15388c2ecf20Sopenharmony_ci			   (RD_HARPOON(ioport + hp_semaphore)
15398c2ecf20Sopenharmony_ci			    | TICKLE_ME));
15408c2ecf20Sopenharmony_ci		if (p_Sccb->OperationCode == RESET_COMMAND) {
15418c2ecf20Sopenharmony_ci			pSaveSccb =
15428c2ecf20Sopenharmony_ci			    pCurrCard->currentSCCB;
15438c2ecf20Sopenharmony_ci			pCurrCard->currentSCCB = p_Sccb;
15448c2ecf20Sopenharmony_ci			FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
15458c2ecf20Sopenharmony_ci			pCurrCard->currentSCCB =
15468c2ecf20Sopenharmony_ci			    pSaveSccb;
15478c2ecf20Sopenharmony_ci		} else {
15488c2ecf20Sopenharmony_ci			FPT_queueAddSccb(p_Sccb, thisCard);
15498c2ecf20Sopenharmony_ci		}
15508c2ecf20Sopenharmony_ci	}
15518c2ecf20Sopenharmony_ci
15528c2ecf20Sopenharmony_ci	else if ((RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
15538c2ecf20Sopenharmony_ci
15548c2ecf20Sopenharmony_ci		if (p_Sccb->OperationCode == RESET_COMMAND) {
15558c2ecf20Sopenharmony_ci			pSaveSccb =
15568c2ecf20Sopenharmony_ci			    pCurrCard->currentSCCB;
15578c2ecf20Sopenharmony_ci			pCurrCard->currentSCCB = p_Sccb;
15588c2ecf20Sopenharmony_ci			FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
15598c2ecf20Sopenharmony_ci			pCurrCard->currentSCCB =
15608c2ecf20Sopenharmony_ci			    pSaveSccb;
15618c2ecf20Sopenharmony_ci		} else {
15628c2ecf20Sopenharmony_ci			FPT_queueAddSccb(p_Sccb, thisCard);
15638c2ecf20Sopenharmony_ci		}
15648c2ecf20Sopenharmony_ci	}
15658c2ecf20Sopenharmony_ci
15668c2ecf20Sopenharmony_ci	else {
15678c2ecf20Sopenharmony_ci
15688c2ecf20Sopenharmony_ci		MDISABLE_INT(ioport);
15698c2ecf20Sopenharmony_ci
15708c2ecf20Sopenharmony_ci		if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
15718c2ecf20Sopenharmony_ci		    ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].
15728c2ecf20Sopenharmony_ci		      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
15738c2ecf20Sopenharmony_ci			lun = p_Sccb->Lun;
15748c2ecf20Sopenharmony_ci		else
15758c2ecf20Sopenharmony_ci			lun = 0;
15768c2ecf20Sopenharmony_ci		if ((pCurrCard->currentSCCB == NULL) &&
15778c2ecf20Sopenharmony_ci		    (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0)
15788c2ecf20Sopenharmony_ci		    && (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
15798c2ecf20Sopenharmony_ci			== 0)) {
15808c2ecf20Sopenharmony_ci
15818c2ecf20Sopenharmony_ci			pCurrCard->currentSCCB = p_Sccb;
15828c2ecf20Sopenharmony_ci			FPT_ssel(p_Sccb->SccbIOPort, thisCard);
15838c2ecf20Sopenharmony_ci		}
15848c2ecf20Sopenharmony_ci
15858c2ecf20Sopenharmony_ci		else {
15868c2ecf20Sopenharmony_ci
15878c2ecf20Sopenharmony_ci			if (p_Sccb->OperationCode == RESET_COMMAND) {
15888c2ecf20Sopenharmony_ci				pSaveSccb = pCurrCard->currentSCCB;
15898c2ecf20Sopenharmony_ci				pCurrCard->currentSCCB = p_Sccb;
15908c2ecf20Sopenharmony_ci				FPT_queueSelectFail(&FPT_BL_Card[thisCard],
15918c2ecf20Sopenharmony_ci						    thisCard);
15928c2ecf20Sopenharmony_ci				pCurrCard->currentSCCB = pSaveSccb;
15938c2ecf20Sopenharmony_ci			} else {
15948c2ecf20Sopenharmony_ci				FPT_queueAddSccb(p_Sccb, thisCard);
15958c2ecf20Sopenharmony_ci			}
15968c2ecf20Sopenharmony_ci		}
15978c2ecf20Sopenharmony_ci
15988c2ecf20Sopenharmony_ci		MENABLE_INT(ioport);
15998c2ecf20Sopenharmony_ci	}
16008c2ecf20Sopenharmony_ci
16018c2ecf20Sopenharmony_ci}
16028c2ecf20Sopenharmony_ci
16038c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
16048c2ecf20Sopenharmony_ci *
16058c2ecf20Sopenharmony_ci * Function: FlashPoint_AbortCCB
16068c2ecf20Sopenharmony_ci *
16078c2ecf20Sopenharmony_ci * Description: Abort the command pointed to by p_Sccb.  When the
16088c2ecf20Sopenharmony_ci *              command is completed it will be returned via the
16098c2ecf20Sopenharmony_ci *              callback function.
16108c2ecf20Sopenharmony_ci *
16118c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
16128c2ecf20Sopenharmony_cistatic int FlashPoint_AbortCCB(void *pCurrCard, struct sccb *p_Sccb)
16138c2ecf20Sopenharmony_ci{
16148c2ecf20Sopenharmony_ci	u32 ioport;
16158c2ecf20Sopenharmony_ci
16168c2ecf20Sopenharmony_ci	unsigned char thisCard;
16178c2ecf20Sopenharmony_ci	CALL_BK_FN callback;
16188c2ecf20Sopenharmony_ci	unsigned char TID;
16198c2ecf20Sopenharmony_ci	struct sccb *pSaveSCCB;
16208c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
16218c2ecf20Sopenharmony_ci
16228c2ecf20Sopenharmony_ci	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
16238c2ecf20Sopenharmony_ci
16248c2ecf20Sopenharmony_ci	thisCard = ((struct sccb_card *)pCurrCard)->cardIndex;
16258c2ecf20Sopenharmony_ci
16268c2ecf20Sopenharmony_ci	if (!(RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
16278c2ecf20Sopenharmony_ci
16288c2ecf20Sopenharmony_ci		if (FPT_queueFindSccb(p_Sccb, thisCard)) {
16298c2ecf20Sopenharmony_ci
16308c2ecf20Sopenharmony_ci			((struct sccb_card *)pCurrCard)->cmdCounter--;
16318c2ecf20Sopenharmony_ci
16328c2ecf20Sopenharmony_ci			if (!((struct sccb_card *)pCurrCard)->cmdCounter)
16338c2ecf20Sopenharmony_ci				WR_HARPOON(ioport + hp_semaphore,
16348c2ecf20Sopenharmony_ci					   (RD_HARPOON(ioport + hp_semaphore)
16358c2ecf20Sopenharmony_ci					    & (unsigned
16368c2ecf20Sopenharmony_ci					       char)(~(SCCB_MGR_ACTIVE |
16378c2ecf20Sopenharmony_ci						       TICKLE_ME))));
16388c2ecf20Sopenharmony_ci
16398c2ecf20Sopenharmony_ci			p_Sccb->SccbStatus = SCCB_ABORT;
16408c2ecf20Sopenharmony_ci			callback = p_Sccb->SccbCallback;
16418c2ecf20Sopenharmony_ci			callback(p_Sccb);
16428c2ecf20Sopenharmony_ci
16438c2ecf20Sopenharmony_ci			return 0;
16448c2ecf20Sopenharmony_ci		}
16458c2ecf20Sopenharmony_ci
16468c2ecf20Sopenharmony_ci		else {
16478c2ecf20Sopenharmony_ci			if (((struct sccb_card *)pCurrCard)->currentSCCB ==
16488c2ecf20Sopenharmony_ci			    p_Sccb) {
16498c2ecf20Sopenharmony_ci				p_Sccb->SccbStatus = SCCB_ABORT;
16508c2ecf20Sopenharmony_ci				return 0;
16518c2ecf20Sopenharmony_ci
16528c2ecf20Sopenharmony_ci			}
16538c2ecf20Sopenharmony_ci
16548c2ecf20Sopenharmony_ci			else {
16558c2ecf20Sopenharmony_ci
16568c2ecf20Sopenharmony_ci				TID = p_Sccb->TargID;
16578c2ecf20Sopenharmony_ci
16588c2ecf20Sopenharmony_ci				if (p_Sccb->Sccb_tag) {
16598c2ecf20Sopenharmony_ci					MDISABLE_INT(ioport);
16608c2ecf20Sopenharmony_ci					if (((struct sccb_card *)pCurrCard)->
16618c2ecf20Sopenharmony_ci					    discQ_Tbl[p_Sccb->Sccb_tag] ==
16628c2ecf20Sopenharmony_ci					    p_Sccb) {
16638c2ecf20Sopenharmony_ci						p_Sccb->SccbStatus = SCCB_ABORT;
16648c2ecf20Sopenharmony_ci						p_Sccb->Sccb_scsistat =
16658c2ecf20Sopenharmony_ci						    ABORT_ST;
16668c2ecf20Sopenharmony_ci						p_Sccb->Sccb_scsimsg =
16678c2ecf20Sopenharmony_ci						    SMABORT_TAG;
16688c2ecf20Sopenharmony_ci
16698c2ecf20Sopenharmony_ci						if (((struct sccb_card *)
16708c2ecf20Sopenharmony_ci						     pCurrCard)->currentSCCB ==
16718c2ecf20Sopenharmony_ci						    NULL) {
16728c2ecf20Sopenharmony_ci							((struct sccb_card *)
16738c2ecf20Sopenharmony_ci							 pCurrCard)->
16748c2ecf20Sopenharmony_ci					currentSCCB = p_Sccb;
16758c2ecf20Sopenharmony_ci							FPT_ssel(ioport,
16768c2ecf20Sopenharmony_ci								 thisCard);
16778c2ecf20Sopenharmony_ci						} else {
16788c2ecf20Sopenharmony_ci							pSaveSCCB =
16798c2ecf20Sopenharmony_ci							    ((struct sccb_card
16808c2ecf20Sopenharmony_ci							      *)pCurrCard)->
16818c2ecf20Sopenharmony_ci							    currentSCCB;
16828c2ecf20Sopenharmony_ci							((struct sccb_card *)
16838c2ecf20Sopenharmony_ci							 pCurrCard)->
16848c2ecf20Sopenharmony_ci					currentSCCB = p_Sccb;
16858c2ecf20Sopenharmony_ci							FPT_queueSelectFail((struct sccb_card *)pCurrCard, thisCard);
16868c2ecf20Sopenharmony_ci							((struct sccb_card *)
16878c2ecf20Sopenharmony_ci							 pCurrCard)->
16888c2ecf20Sopenharmony_ci					currentSCCB = pSaveSCCB;
16898c2ecf20Sopenharmony_ci						}
16908c2ecf20Sopenharmony_ci					}
16918c2ecf20Sopenharmony_ci					MENABLE_INT(ioport);
16928c2ecf20Sopenharmony_ci					return 0;
16938c2ecf20Sopenharmony_ci				} else {
16948c2ecf20Sopenharmony_ci					currTar_Info =
16958c2ecf20Sopenharmony_ci					    &FPT_sccbMgrTbl[thisCard][p_Sccb->
16968c2ecf20Sopenharmony_ci								      TargID];
16978c2ecf20Sopenharmony_ci
16988c2ecf20Sopenharmony_ci					if (FPT_BL_Card[thisCard].
16998c2ecf20Sopenharmony_ci					    discQ_Tbl[currTar_Info->
17008c2ecf20Sopenharmony_ci						      LunDiscQ_Idx[p_Sccb->Lun]]
17018c2ecf20Sopenharmony_ci					    == p_Sccb) {
17028c2ecf20Sopenharmony_ci						p_Sccb->SccbStatus = SCCB_ABORT;
17038c2ecf20Sopenharmony_ci						return 0;
17048c2ecf20Sopenharmony_ci					}
17058c2ecf20Sopenharmony_ci				}
17068c2ecf20Sopenharmony_ci			}
17078c2ecf20Sopenharmony_ci		}
17088c2ecf20Sopenharmony_ci	}
17098c2ecf20Sopenharmony_ci	return -1;
17108c2ecf20Sopenharmony_ci}
17118c2ecf20Sopenharmony_ci
17128c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
17138c2ecf20Sopenharmony_ci *
17148c2ecf20Sopenharmony_ci * Function: FlashPoint_InterruptPending
17158c2ecf20Sopenharmony_ci *
17168c2ecf20Sopenharmony_ci * Description: Do a quick check to determine if there is a pending
17178c2ecf20Sopenharmony_ci *              interrupt for this card and disable the IRQ Pin if so.
17188c2ecf20Sopenharmony_ci *
17198c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
17208c2ecf20Sopenharmony_cistatic unsigned char FlashPoint_InterruptPending(void *pCurrCard)
17218c2ecf20Sopenharmony_ci{
17228c2ecf20Sopenharmony_ci	u32 ioport;
17238c2ecf20Sopenharmony_ci
17248c2ecf20Sopenharmony_ci	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
17258c2ecf20Sopenharmony_ci
17268c2ecf20Sopenharmony_ci	if (RD_HARPOON(ioport + hp_int_status) & INT_ASSERTED) {
17278c2ecf20Sopenharmony_ci		return 1;
17288c2ecf20Sopenharmony_ci	}
17298c2ecf20Sopenharmony_ci
17308c2ecf20Sopenharmony_ci	else
17318c2ecf20Sopenharmony_ci
17328c2ecf20Sopenharmony_ci		return 0;
17338c2ecf20Sopenharmony_ci}
17348c2ecf20Sopenharmony_ci
17358c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
17368c2ecf20Sopenharmony_ci *
17378c2ecf20Sopenharmony_ci * Function: FlashPoint_HandleInterrupt
17388c2ecf20Sopenharmony_ci *
17398c2ecf20Sopenharmony_ci * Description: This is our entry point when an interrupt is generated
17408c2ecf20Sopenharmony_ci *              by the card and the upper level driver passes it on to
17418c2ecf20Sopenharmony_ci *              us.
17428c2ecf20Sopenharmony_ci *
17438c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
17448c2ecf20Sopenharmony_cistatic int FlashPoint_HandleInterrupt(void *pcard)
17458c2ecf20Sopenharmony_ci{
17468c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
17478c2ecf20Sopenharmony_ci	unsigned char thisCard, result, bm_status, bm_int_st;
17488c2ecf20Sopenharmony_ci	unsigned short hp_int;
17498c2ecf20Sopenharmony_ci	unsigned char i, target;
17508c2ecf20Sopenharmony_ci	struct sccb_card *pCurrCard = pcard;
17518c2ecf20Sopenharmony_ci	u32 ioport;
17528c2ecf20Sopenharmony_ci
17538c2ecf20Sopenharmony_ci	thisCard = pCurrCard->cardIndex;
17548c2ecf20Sopenharmony_ci	ioport = pCurrCard->ioPort;
17558c2ecf20Sopenharmony_ci
17568c2ecf20Sopenharmony_ci	MDISABLE_INT(ioport);
17578c2ecf20Sopenharmony_ci
17588c2ecf20Sopenharmony_ci	if ((bm_int_st = RD_HARPOON(ioport + hp_int_status)) & EXT_STATUS_ON)
17598c2ecf20Sopenharmony_ci		bm_status = RD_HARPOON(ioport + hp_ext_status) &
17608c2ecf20Sopenharmony_ci					(unsigned char)BAD_EXT_STATUS;
17618c2ecf20Sopenharmony_ci	else
17628c2ecf20Sopenharmony_ci		bm_status = 0;
17638c2ecf20Sopenharmony_ci
17648c2ecf20Sopenharmony_ci	WR_HARPOON(ioport + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
17658c2ecf20Sopenharmony_ci
17668c2ecf20Sopenharmony_ci	while ((hp_int = RDW_HARPOON((ioport + hp_intstat)) &
17678c2ecf20Sopenharmony_ci				FPT_default_intena) | bm_status) {
17688c2ecf20Sopenharmony_ci
17698c2ecf20Sopenharmony_ci		currSCCB = pCurrCard->currentSCCB;
17708c2ecf20Sopenharmony_ci
17718c2ecf20Sopenharmony_ci		if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
17728c2ecf20Sopenharmony_ci			result =
17738c2ecf20Sopenharmony_ci			    FPT_SccbMgr_bad_isr(ioport, thisCard, pCurrCard,
17748c2ecf20Sopenharmony_ci						hp_int);
17758c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
17768c2ecf20Sopenharmony_ci				    (FIFO | TIMEOUT | RESET | SCAM_SEL));
17778c2ecf20Sopenharmony_ci			bm_status = 0;
17788c2ecf20Sopenharmony_ci
17798c2ecf20Sopenharmony_ci			if (result) {
17808c2ecf20Sopenharmony_ci
17818c2ecf20Sopenharmony_ci				MENABLE_INT(ioport);
17828c2ecf20Sopenharmony_ci				return result;
17838c2ecf20Sopenharmony_ci			}
17848c2ecf20Sopenharmony_ci		}
17858c2ecf20Sopenharmony_ci
17868c2ecf20Sopenharmony_ci		else if (hp_int & ICMD_COMP) {
17878c2ecf20Sopenharmony_ci
17888c2ecf20Sopenharmony_ci			if (!(hp_int & BUS_FREE)) {
17898c2ecf20Sopenharmony_ci				/* Wait for the BusFree before starting a new command.  We
17908c2ecf20Sopenharmony_ci				   must also check for being reselected since the BusFree
17918c2ecf20Sopenharmony_ci				   may not show up if another device reselects us in 1.5us or
17928c2ecf20Sopenharmony_ci				   less.  SRR Wednesday, 3/8/1995.
17938c2ecf20Sopenharmony_ci				 */
17948c2ecf20Sopenharmony_ci				while (!
17958c2ecf20Sopenharmony_ci				       (RDW_HARPOON((ioport + hp_intstat)) &
17968c2ecf20Sopenharmony_ci					(BUS_FREE | RSEL))) ;
17978c2ecf20Sopenharmony_ci			}
17988c2ecf20Sopenharmony_ci
17998c2ecf20Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
18008c2ecf20Sopenharmony_ci
18018c2ecf20Sopenharmony_ci				FPT_phaseChkFifo(ioport, thisCard);
18028c2ecf20Sopenharmony_ci
18038c2ecf20Sopenharmony_ci/*         WRW_HARPOON((ioport+hp_intstat),
18048c2ecf20Sopenharmony_ci            (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
18058c2ecf20Sopenharmony_ci         */
18068c2ecf20Sopenharmony_ci
18078c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), CLR_ALL_INT_1);
18088c2ecf20Sopenharmony_ci
18098c2ecf20Sopenharmony_ci			FPT_autoCmdCmplt(ioport, thisCard);
18108c2ecf20Sopenharmony_ci
18118c2ecf20Sopenharmony_ci		}
18128c2ecf20Sopenharmony_ci
18138c2ecf20Sopenharmony_ci		else if (hp_int & ITAR_DISC) {
18148c2ecf20Sopenharmony_ci
18158c2ecf20Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
18168c2ecf20Sopenharmony_ci				FPT_phaseChkFifo(ioport, thisCard);
18178c2ecf20Sopenharmony_ci
18188c2ecf20Sopenharmony_ci			if (RD_HARPOON(ioport + hp_gp_reg_1) ==
18198c2ecf20Sopenharmony_ci					SMSAVE_DATA_PTR) {
18208c2ecf20Sopenharmony_ci
18218c2ecf20Sopenharmony_ci				WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
18228c2ecf20Sopenharmony_ci				currSCCB->Sccb_XferState |= F_NO_DATA_YET;
18238c2ecf20Sopenharmony_ci
18248c2ecf20Sopenharmony_ci				currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
18258c2ecf20Sopenharmony_ci			}
18268c2ecf20Sopenharmony_ci
18278c2ecf20Sopenharmony_ci			currSCCB->Sccb_scsistat = DISCONNECT_ST;
18288c2ecf20Sopenharmony_ci			FPT_queueDisconnect(currSCCB, thisCard);
18298c2ecf20Sopenharmony_ci
18308c2ecf20Sopenharmony_ci			/* Wait for the BusFree before starting a new command.  We
18318c2ecf20Sopenharmony_ci			   must also check for being reselected since the BusFree
18328c2ecf20Sopenharmony_ci			   may not show up if another device reselects us in 1.5us or
18338c2ecf20Sopenharmony_ci			   less.  SRR Wednesday, 3/8/1995.
18348c2ecf20Sopenharmony_ci			 */
18358c2ecf20Sopenharmony_ci			while (!
18368c2ecf20Sopenharmony_ci			       (RDW_HARPOON((ioport + hp_intstat)) &
18378c2ecf20Sopenharmony_ci				(BUS_FREE | RSEL))
18388c2ecf20Sopenharmony_ci			       && !((RDW_HARPOON((ioport + hp_intstat)) & PHASE)
18398c2ecf20Sopenharmony_ci				    && RD_HARPOON((ioport + hp_scsisig)) ==
18408c2ecf20Sopenharmony_ci				    (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG |
18418c2ecf20Sopenharmony_ci				     SCSI_IOBIT))) ;
18428c2ecf20Sopenharmony_ci
18438c2ecf20Sopenharmony_ci			/*
18448c2ecf20Sopenharmony_ci			   The additional loop exit condition above detects a timing problem
18458c2ecf20Sopenharmony_ci			   with the revision D/E harpoon chips.  The caller should reset the
18468c2ecf20Sopenharmony_ci			   host adapter to recover when 0xFE is returned.
18478c2ecf20Sopenharmony_ci			 */
18488c2ecf20Sopenharmony_ci			if (!
18498c2ecf20Sopenharmony_ci			    (RDW_HARPOON((ioport + hp_intstat)) &
18508c2ecf20Sopenharmony_ci			     (BUS_FREE | RSEL))) {
18518c2ecf20Sopenharmony_ci				MENABLE_INT(ioport);
18528c2ecf20Sopenharmony_ci				return 0xFE;
18538c2ecf20Sopenharmony_ci			}
18548c2ecf20Sopenharmony_ci
18558c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
18568c2ecf20Sopenharmony_ci				    (BUS_FREE | ITAR_DISC));
18578c2ecf20Sopenharmony_ci
18588c2ecf20Sopenharmony_ci			pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
18598c2ecf20Sopenharmony_ci
18608c2ecf20Sopenharmony_ci		}
18618c2ecf20Sopenharmony_ci
18628c2ecf20Sopenharmony_ci		else if (hp_int & RSEL) {
18638c2ecf20Sopenharmony_ci
18648c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
18658c2ecf20Sopenharmony_ci				    (PROG_HLT | RSEL | PHASE | BUS_FREE));
18668c2ecf20Sopenharmony_ci
18678c2ecf20Sopenharmony_ci			if (RDW_HARPOON((ioport + hp_intstat)) & ITAR_DISC) {
18688c2ecf20Sopenharmony_ci				if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
18698c2ecf20Sopenharmony_ci					FPT_phaseChkFifo(ioport, thisCard);
18708c2ecf20Sopenharmony_ci
18718c2ecf20Sopenharmony_ci				if (RD_HARPOON(ioport + hp_gp_reg_1) ==
18728c2ecf20Sopenharmony_ci				    SMSAVE_DATA_PTR) {
18738c2ecf20Sopenharmony_ci					WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
18748c2ecf20Sopenharmony_ci					currSCCB->Sccb_XferState |=
18758c2ecf20Sopenharmony_ci					    F_NO_DATA_YET;
18768c2ecf20Sopenharmony_ci					currSCCB->Sccb_savedATC =
18778c2ecf20Sopenharmony_ci					    currSCCB->Sccb_ATC;
18788c2ecf20Sopenharmony_ci				}
18798c2ecf20Sopenharmony_ci
18808c2ecf20Sopenharmony_ci				WRW_HARPOON((ioport + hp_intstat),
18818c2ecf20Sopenharmony_ci					    (BUS_FREE | ITAR_DISC));
18828c2ecf20Sopenharmony_ci				currSCCB->Sccb_scsistat = DISCONNECT_ST;
18838c2ecf20Sopenharmony_ci				FPT_queueDisconnect(currSCCB, thisCard);
18848c2ecf20Sopenharmony_ci			}
18858c2ecf20Sopenharmony_ci
18868c2ecf20Sopenharmony_ci			FPT_sres(ioport, thisCard, pCurrCard);
18878c2ecf20Sopenharmony_ci			FPT_phaseDecode(ioport, thisCard);
18888c2ecf20Sopenharmony_ci
18898c2ecf20Sopenharmony_ci		}
18908c2ecf20Sopenharmony_ci
18918c2ecf20Sopenharmony_ci		else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE))) {
18928c2ecf20Sopenharmony_ci
18938c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
18948c2ecf20Sopenharmony_ci				    (IDO_STRT | XFER_CNT_0));
18958c2ecf20Sopenharmony_ci			FPT_phaseDecode(ioport, thisCard);
18968c2ecf20Sopenharmony_ci
18978c2ecf20Sopenharmony_ci		}
18988c2ecf20Sopenharmony_ci
18998c2ecf20Sopenharmony_ci		else if ((hp_int & IUNKWN) || (hp_int & PROG_HLT)) {
19008c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
19018c2ecf20Sopenharmony_ci				    (PHASE | IUNKWN | PROG_HLT));
19028c2ecf20Sopenharmony_ci			if ((RD_HARPOON(ioport + hp_prgmcnt_0) & (unsigned char)
19038c2ecf20Sopenharmony_ci			     0x3f) < (unsigned char)SELCHK) {
19048c2ecf20Sopenharmony_ci				FPT_phaseDecode(ioport, thisCard);
19058c2ecf20Sopenharmony_ci			} else {
19068c2ecf20Sopenharmony_ci				/* Harpoon problem some SCSI target device respond to selection
19078c2ecf20Sopenharmony_ci				   with short BUSY pulse (<400ns) this will make the Harpoon is not able
19088c2ecf20Sopenharmony_ci				   to latch the correct Target ID into reg. x53.
19098c2ecf20Sopenharmony_ci				   The work around require to correct this reg. But when write to this
19108c2ecf20Sopenharmony_ci				   reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
19118c2ecf20Sopenharmony_ci				   need to read this reg first then restore it later. After update to 0x53 */
19128c2ecf20Sopenharmony_ci
19138c2ecf20Sopenharmony_ci				i = (unsigned
19148c2ecf20Sopenharmony_ci				     char)(RD_HARPOON(ioport + hp_fifowrite));
19158c2ecf20Sopenharmony_ci				target =
19168c2ecf20Sopenharmony_ci				    (unsigned
19178c2ecf20Sopenharmony_ci				     char)(RD_HARPOON(ioport + hp_gp_reg_3));
19188c2ecf20Sopenharmony_ci				WR_HARPOON(ioport + hp_xfer_pad,
19198c2ecf20Sopenharmony_ci					   (unsigned char)ID_UNLOCK);
19208c2ecf20Sopenharmony_ci				WR_HARPOON(ioport + hp_select_id,
19218c2ecf20Sopenharmony_ci					   (unsigned char)(target | target <<
19228c2ecf20Sopenharmony_ci							   4));
19238c2ecf20Sopenharmony_ci				WR_HARPOON(ioport + hp_xfer_pad,
19248c2ecf20Sopenharmony_ci					   (unsigned char)0x00);
19258c2ecf20Sopenharmony_ci				WR_HARPOON(ioport + hp_fifowrite, i);
19268c2ecf20Sopenharmony_ci				WR_HARPOON(ioport + hp_autostart_3,
19278c2ecf20Sopenharmony_ci					   (AUTO_IMMED + TAG_STRT));
19288c2ecf20Sopenharmony_ci			}
19298c2ecf20Sopenharmony_ci		}
19308c2ecf20Sopenharmony_ci
19318c2ecf20Sopenharmony_ci		else if (hp_int & XFER_CNT_0) {
19328c2ecf20Sopenharmony_ci
19338c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), XFER_CNT_0);
19348c2ecf20Sopenharmony_ci
19358c2ecf20Sopenharmony_ci			FPT_schkdd(ioport, thisCard);
19368c2ecf20Sopenharmony_ci
19378c2ecf20Sopenharmony_ci		}
19388c2ecf20Sopenharmony_ci
19398c2ecf20Sopenharmony_ci		else if (hp_int & BUS_FREE) {
19408c2ecf20Sopenharmony_ci
19418c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), BUS_FREE);
19428c2ecf20Sopenharmony_ci
19438c2ecf20Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
19448c2ecf20Sopenharmony_ci
19458c2ecf20Sopenharmony_ci				FPT_hostDataXferAbort(ioport, thisCard,
19468c2ecf20Sopenharmony_ci						      currSCCB);
19478c2ecf20Sopenharmony_ci			}
19488c2ecf20Sopenharmony_ci
19498c2ecf20Sopenharmony_ci			FPT_phaseBusFree(ioport, thisCard);
19508c2ecf20Sopenharmony_ci		}
19518c2ecf20Sopenharmony_ci
19528c2ecf20Sopenharmony_ci		else if (hp_int & ITICKLE) {
19538c2ecf20Sopenharmony_ci
19548c2ecf20Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), ITICKLE);
19558c2ecf20Sopenharmony_ci			pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
19568c2ecf20Sopenharmony_ci		}
19578c2ecf20Sopenharmony_ci
19588c2ecf20Sopenharmony_ci		if (((struct sccb_card *)pCurrCard)->
19598c2ecf20Sopenharmony_ci		    globalFlags & F_NEW_SCCB_CMD) {
19608c2ecf20Sopenharmony_ci
19618c2ecf20Sopenharmony_ci			pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
19628c2ecf20Sopenharmony_ci
19638c2ecf20Sopenharmony_ci			if (pCurrCard->currentSCCB == NULL)
19648c2ecf20Sopenharmony_ci				FPT_queueSearchSelect(pCurrCard, thisCard);
19658c2ecf20Sopenharmony_ci
19668c2ecf20Sopenharmony_ci			if (pCurrCard->currentSCCB != NULL) {
19678c2ecf20Sopenharmony_ci				pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
19688c2ecf20Sopenharmony_ci				FPT_ssel(ioport, thisCard);
19698c2ecf20Sopenharmony_ci			}
19708c2ecf20Sopenharmony_ci
19718c2ecf20Sopenharmony_ci			break;
19728c2ecf20Sopenharmony_ci
19738c2ecf20Sopenharmony_ci		}
19748c2ecf20Sopenharmony_ci
19758c2ecf20Sopenharmony_ci	}			/*end while */
19768c2ecf20Sopenharmony_ci
19778c2ecf20Sopenharmony_ci	MENABLE_INT(ioport);
19788c2ecf20Sopenharmony_ci
19798c2ecf20Sopenharmony_ci	return 0;
19808c2ecf20Sopenharmony_ci}
19818c2ecf20Sopenharmony_ci
19828c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
19838c2ecf20Sopenharmony_ci *
19848c2ecf20Sopenharmony_ci * Function: Sccb_bad_isr
19858c2ecf20Sopenharmony_ci *
19868c2ecf20Sopenharmony_ci * Description: Some type of interrupt has occurred which is slightly
19878c2ecf20Sopenharmony_ci *              out of the ordinary.  We will now decode it fully, in
19888c2ecf20Sopenharmony_ci *              this routine.  This is broken up in an attempt to save
19898c2ecf20Sopenharmony_ci *              processing time.
19908c2ecf20Sopenharmony_ci *
19918c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
19928c2ecf20Sopenharmony_cistatic unsigned char FPT_SccbMgr_bad_isr(u32 p_port, unsigned char p_card,
19938c2ecf20Sopenharmony_ci					 struct sccb_card *pCurrCard,
19948c2ecf20Sopenharmony_ci					 unsigned short p_int)
19958c2ecf20Sopenharmony_ci{
19968c2ecf20Sopenharmony_ci	unsigned char temp, ScamFlg;
19978c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
19988c2ecf20Sopenharmony_ci	struct nvram_info *pCurrNvRam;
19998c2ecf20Sopenharmony_ci
20008c2ecf20Sopenharmony_ci	if (RD_HARPOON(p_port + hp_ext_status) &
20018c2ecf20Sopenharmony_ci	    (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN)) {
20028c2ecf20Sopenharmony_ci
20038c2ecf20Sopenharmony_ci		if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
20048c2ecf20Sopenharmony_ci
20058c2ecf20Sopenharmony_ci			FPT_hostDataXferAbort(p_port, p_card,
20068c2ecf20Sopenharmony_ci					      pCurrCard->currentSCCB);
20078c2ecf20Sopenharmony_ci		}
20088c2ecf20Sopenharmony_ci
20098c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_pci_stat_cfg) & REC_MASTER_ABORT)
20108c2ecf20Sopenharmony_ci		{
20118c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_pci_stat_cfg,
20128c2ecf20Sopenharmony_ci				   (RD_HARPOON(p_port + hp_pci_stat_cfg) &
20138c2ecf20Sopenharmony_ci				    ~REC_MASTER_ABORT));
20148c2ecf20Sopenharmony_ci
20158c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_host_blk_cnt, 0x00);
20168c2ecf20Sopenharmony_ci
20178c2ecf20Sopenharmony_ci		}
20188c2ecf20Sopenharmony_ci
20198c2ecf20Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL) {
20208c2ecf20Sopenharmony_ci
20218c2ecf20Sopenharmony_ci			if (!pCurrCard->currentSCCB->HostStatus)
20228c2ecf20Sopenharmony_ci				pCurrCard->currentSCCB->HostStatus =
20238c2ecf20Sopenharmony_ci				    SCCB_BM_ERR;
20248c2ecf20Sopenharmony_ci
20258c2ecf20Sopenharmony_ci			FPT_sxfrp(p_port, p_card);
20268c2ecf20Sopenharmony_ci
20278c2ecf20Sopenharmony_ci			temp = (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
20288c2ecf20Sopenharmony_ci					       (EXT_ARB_ACK | SCSI_TERM_ENA_H));
20298c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_ee_ctrl,
20308c2ecf20Sopenharmony_ci				   ((unsigned char)temp | SEE_MS | SEE_CS));
20318c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_ee_ctrl, temp);
20328c2ecf20Sopenharmony_ci
20338c2ecf20Sopenharmony_ci			if (!
20348c2ecf20Sopenharmony_ci			    (RDW_HARPOON((p_port + hp_intstat)) &
20358c2ecf20Sopenharmony_ci			     (BUS_FREE | RESET))) {
20368c2ecf20Sopenharmony_ci				FPT_phaseDecode(p_port, p_card);
20378c2ecf20Sopenharmony_ci			}
20388c2ecf20Sopenharmony_ci		}
20398c2ecf20Sopenharmony_ci	}
20408c2ecf20Sopenharmony_ci
20418c2ecf20Sopenharmony_ci	else if (p_int & RESET) {
20428c2ecf20Sopenharmony_ci
20438c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
20448c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
20458c2ecf20Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL) {
20468c2ecf20Sopenharmony_ci
20478c2ecf20Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
20488c2ecf20Sopenharmony_ci
20498c2ecf20Sopenharmony_ci				FPT_hostDataXferAbort(p_port, p_card,
20508c2ecf20Sopenharmony_ci						      pCurrCard->currentSCCB);
20518c2ecf20Sopenharmony_ci		}
20528c2ecf20Sopenharmony_ci
20538c2ecf20Sopenharmony_ci		DISABLE_AUTO(p_port);
20548c2ecf20Sopenharmony_ci
20558c2ecf20Sopenharmony_ci		FPT_sresb(p_port, p_card);
20568c2ecf20Sopenharmony_ci
20578c2ecf20Sopenharmony_ci		while (RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST) {
20588c2ecf20Sopenharmony_ci		}
20598c2ecf20Sopenharmony_ci
20608c2ecf20Sopenharmony_ci		pCurrNvRam = pCurrCard->pNvRamInfo;
20618c2ecf20Sopenharmony_ci		if (pCurrNvRam) {
20628c2ecf20Sopenharmony_ci			ScamFlg = pCurrNvRam->niScamConf;
20638c2ecf20Sopenharmony_ci		} else {
20648c2ecf20Sopenharmony_ci			ScamFlg =
20658c2ecf20Sopenharmony_ci			    (unsigned char)FPT_utilEERead(p_port,
20668c2ecf20Sopenharmony_ci							  SCAM_CONFIG / 2);
20678c2ecf20Sopenharmony_ci		}
20688c2ecf20Sopenharmony_ci
20698c2ecf20Sopenharmony_ci		FPT_XbowInit(p_port, ScamFlg);
20708c2ecf20Sopenharmony_ci
20718c2ecf20Sopenharmony_ci		FPT_scini(p_card, pCurrCard->ourId, 0);
20728c2ecf20Sopenharmony_ci
20738c2ecf20Sopenharmony_ci		return 0xFF;
20748c2ecf20Sopenharmony_ci	}
20758c2ecf20Sopenharmony_ci
20768c2ecf20Sopenharmony_ci	else if (p_int & FIFO) {
20778c2ecf20Sopenharmony_ci
20788c2ecf20Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat), FIFO);
20798c2ecf20Sopenharmony_ci
20808c2ecf20Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL)
20818c2ecf20Sopenharmony_ci			FPT_sxfrp(p_port, p_card);
20828c2ecf20Sopenharmony_ci	}
20838c2ecf20Sopenharmony_ci
20848c2ecf20Sopenharmony_ci	else if (p_int & TIMEOUT) {
20858c2ecf20Sopenharmony_ci
20868c2ecf20Sopenharmony_ci		DISABLE_AUTO(p_port);
20878c2ecf20Sopenharmony_ci
20888c2ecf20Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat),
20898c2ecf20Sopenharmony_ci			    (PROG_HLT | TIMEOUT | SEL | BUS_FREE | PHASE |
20908c2ecf20Sopenharmony_ci			     IUNKWN));
20918c2ecf20Sopenharmony_ci
20928c2ecf20Sopenharmony_ci		pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
20938c2ecf20Sopenharmony_ci
20948c2ecf20Sopenharmony_ci		currTar_Info =
20958c2ecf20Sopenharmony_ci		    &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
20968c2ecf20Sopenharmony_ci		if ((pCurrCard->globalFlags & F_CONLUN_IO)
20978c2ecf20Sopenharmony_ci		    && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
20988c2ecf20Sopenharmony_ci			TAG_Q_TRYING))
20998c2ecf20Sopenharmony_ci			currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] =
21008c2ecf20Sopenharmony_ci			    0;
21018c2ecf20Sopenharmony_ci		else
21028c2ecf20Sopenharmony_ci			currTar_Info->TarLUNBusy[0] = 0;
21038c2ecf20Sopenharmony_ci
21048c2ecf20Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
21058c2ecf20Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
21068c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
21078c2ecf20Sopenharmony_ci		}
21088c2ecf20Sopenharmony_ci
21098c2ecf20Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
21108c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
21118c2ecf20Sopenharmony_ci		}
21128c2ecf20Sopenharmony_ci
21138c2ecf20Sopenharmony_ci		FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,
21148c2ecf20Sopenharmony_ci			    currTar_Info);
21158c2ecf20Sopenharmony_ci
21168c2ecf20Sopenharmony_ci		FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
21178c2ecf20Sopenharmony_ci
21188c2ecf20Sopenharmony_ci	}
21198c2ecf20Sopenharmony_ci
21208c2ecf20Sopenharmony_ci	else if (p_int & SCAM_SEL) {
21218c2ecf20Sopenharmony_ci
21228c2ecf20Sopenharmony_ci		FPT_scarb(p_port, LEVEL2_TAR);
21238c2ecf20Sopenharmony_ci		FPT_scsel(p_port);
21248c2ecf20Sopenharmony_ci		FPT_scasid(p_card, p_port);
21258c2ecf20Sopenharmony_ci
21268c2ecf20Sopenharmony_ci		FPT_scbusf(p_port);
21278c2ecf20Sopenharmony_ci
21288c2ecf20Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat), SCAM_SEL);
21298c2ecf20Sopenharmony_ci	}
21308c2ecf20Sopenharmony_ci
21318c2ecf20Sopenharmony_ci	return 0x00;
21328c2ecf20Sopenharmony_ci}
21338c2ecf20Sopenharmony_ci
21348c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
21358c2ecf20Sopenharmony_ci *
21368c2ecf20Sopenharmony_ci * Function: SccbMgrTableInit
21378c2ecf20Sopenharmony_ci *
21388c2ecf20Sopenharmony_ci * Description: Initialize all Sccb manager data structures.
21398c2ecf20Sopenharmony_ci *
21408c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
21418c2ecf20Sopenharmony_ci
21428c2ecf20Sopenharmony_cistatic void FPT_SccbMgrTableInitAll(void)
21438c2ecf20Sopenharmony_ci{
21448c2ecf20Sopenharmony_ci	unsigned char thisCard;
21458c2ecf20Sopenharmony_ci
21468c2ecf20Sopenharmony_ci	for (thisCard = 0; thisCard < MAX_CARDS; thisCard++) {
21478c2ecf20Sopenharmony_ci		FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard], thisCard);
21488c2ecf20Sopenharmony_ci
21498c2ecf20Sopenharmony_ci		FPT_BL_Card[thisCard].ioPort = 0x00;
21508c2ecf20Sopenharmony_ci		FPT_BL_Card[thisCard].cardInfo = NULL;
21518c2ecf20Sopenharmony_ci		FPT_BL_Card[thisCard].cardIndex = 0xFF;
21528c2ecf20Sopenharmony_ci		FPT_BL_Card[thisCard].ourId = 0x00;
21538c2ecf20Sopenharmony_ci		FPT_BL_Card[thisCard].pNvRamInfo = NULL;
21548c2ecf20Sopenharmony_ci	}
21558c2ecf20Sopenharmony_ci}
21568c2ecf20Sopenharmony_ci
21578c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
21588c2ecf20Sopenharmony_ci *
21598c2ecf20Sopenharmony_ci * Function: SccbMgrTableInit
21608c2ecf20Sopenharmony_ci *
21618c2ecf20Sopenharmony_ci * Description: Initialize all Sccb manager data structures.
21628c2ecf20Sopenharmony_ci *
21638c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
21648c2ecf20Sopenharmony_ci
21658c2ecf20Sopenharmony_cistatic void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
21668c2ecf20Sopenharmony_ci				     unsigned char p_card)
21678c2ecf20Sopenharmony_ci{
21688c2ecf20Sopenharmony_ci	unsigned char scsiID, qtag;
21698c2ecf20Sopenharmony_ci
21708c2ecf20Sopenharmony_ci	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
21718c2ecf20Sopenharmony_ci		FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
21728c2ecf20Sopenharmony_ci	}
21738c2ecf20Sopenharmony_ci
21748c2ecf20Sopenharmony_ci	for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
21758c2ecf20Sopenharmony_ci		FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0;
21768c2ecf20Sopenharmony_ci		FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
21778c2ecf20Sopenharmony_ci		FPT_SccbMgrTableInitTarget(p_card, scsiID);
21788c2ecf20Sopenharmony_ci	}
21798c2ecf20Sopenharmony_ci
21808c2ecf20Sopenharmony_ci	pCurrCard->scanIndex = 0x00;
21818c2ecf20Sopenharmony_ci	pCurrCard->currentSCCB = NULL;
21828c2ecf20Sopenharmony_ci	pCurrCard->globalFlags = 0x00;
21838c2ecf20Sopenharmony_ci	pCurrCard->cmdCounter = 0x00;
21848c2ecf20Sopenharmony_ci	pCurrCard->tagQ_Lst = 0x01;
21858c2ecf20Sopenharmony_ci	pCurrCard->discQCount = 0;
21868c2ecf20Sopenharmony_ci
21878c2ecf20Sopenharmony_ci}
21888c2ecf20Sopenharmony_ci
21898c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
21908c2ecf20Sopenharmony_ci *
21918c2ecf20Sopenharmony_ci * Function: SccbMgrTableInit
21928c2ecf20Sopenharmony_ci *
21938c2ecf20Sopenharmony_ci * Description: Initialize all Sccb manager data structures.
21948c2ecf20Sopenharmony_ci *
21958c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
21968c2ecf20Sopenharmony_ci
21978c2ecf20Sopenharmony_cistatic void FPT_SccbMgrTableInitTarget(unsigned char p_card,
21988c2ecf20Sopenharmony_ci				       unsigned char target)
21998c2ecf20Sopenharmony_ci{
22008c2ecf20Sopenharmony_ci
22018c2ecf20Sopenharmony_ci	unsigned char lun, qtag;
22028c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
22038c2ecf20Sopenharmony_ci
22048c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][target];
22058c2ecf20Sopenharmony_ci
22068c2ecf20Sopenharmony_ci	currTar_Info->TarSelQ_Cnt = 0;
22078c2ecf20Sopenharmony_ci	currTar_Info->TarSyncCtrl = 0;
22088c2ecf20Sopenharmony_ci
22098c2ecf20Sopenharmony_ci	currTar_Info->TarSelQ_Head = NULL;
22108c2ecf20Sopenharmony_ci	currTar_Info->TarSelQ_Tail = NULL;
22118c2ecf20Sopenharmony_ci	currTar_Info->TarTagQ_Cnt = 0;
22128c2ecf20Sopenharmony_ci	currTar_Info->TarLUN_CA = 0;
22138c2ecf20Sopenharmony_ci
22148c2ecf20Sopenharmony_ci	for (lun = 0; lun < MAX_LUN; lun++) {
22158c2ecf20Sopenharmony_ci		currTar_Info->TarLUNBusy[lun] = 0;
22168c2ecf20Sopenharmony_ci		currTar_Info->LunDiscQ_Idx[lun] = 0;
22178c2ecf20Sopenharmony_ci	}
22188c2ecf20Sopenharmony_ci
22198c2ecf20Sopenharmony_ci	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
22208c2ecf20Sopenharmony_ci		if (FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL) {
22218c2ecf20Sopenharmony_ci			if (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
22228c2ecf20Sopenharmony_ci			    target) {
22238c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
22248c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].discQCount--;
22258c2ecf20Sopenharmony_ci			}
22268c2ecf20Sopenharmony_ci		}
22278c2ecf20Sopenharmony_ci	}
22288c2ecf20Sopenharmony_ci}
22298c2ecf20Sopenharmony_ci
22308c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
22318c2ecf20Sopenharmony_ci *
22328c2ecf20Sopenharmony_ci * Function: sfetm
22338c2ecf20Sopenharmony_ci *
22348c2ecf20Sopenharmony_ci * Description: Read in a message byte from the SCSI bus, and check
22358c2ecf20Sopenharmony_ci *              for a parity error.
22368c2ecf20Sopenharmony_ci *
22378c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
22388c2ecf20Sopenharmony_ci
22398c2ecf20Sopenharmony_cistatic unsigned char FPT_sfm(u32 port, struct sccb *pCurrSCCB)
22408c2ecf20Sopenharmony_ci{
22418c2ecf20Sopenharmony_ci	unsigned char message;
22428c2ecf20Sopenharmony_ci	unsigned short TimeOutLoop;
22438c2ecf20Sopenharmony_ci
22448c2ecf20Sopenharmony_ci	TimeOutLoop = 0;
22458c2ecf20Sopenharmony_ci	while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
22468c2ecf20Sopenharmony_ci	       (TimeOutLoop++ < 20000)) {
22478c2ecf20Sopenharmony_ci	}
22488c2ecf20Sopenharmony_ci
22498c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
22508c2ecf20Sopenharmony_ci
22518c2ecf20Sopenharmony_ci	message = RD_HARPOON(port + hp_scsidata_0);
22528c2ecf20Sopenharmony_ci
22538c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, SCSI_ACK + S_MSGI_PH);
22548c2ecf20Sopenharmony_ci
22558c2ecf20Sopenharmony_ci	if (TimeOutLoop > 20000)
22568c2ecf20Sopenharmony_ci		message = 0x00;	/* force message byte = 0 if Time Out on Req */
22578c2ecf20Sopenharmony_ci
22588c2ecf20Sopenharmony_ci	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
22598c2ecf20Sopenharmony_ci	    (RD_HARPOON(port + hp_addstat) & SCSI_PAR_ERR)) {
22608c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
22618c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_xferstat, 0);
22628c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_fiforead, 0);
22638c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_fifowrite, 0);
22648c2ecf20Sopenharmony_ci		if (pCurrSCCB != NULL) {
22658c2ecf20Sopenharmony_ci			pCurrSCCB->Sccb_scsimsg = SMPARITY;
22668c2ecf20Sopenharmony_ci		}
22678c2ecf20Sopenharmony_ci		message = 0x00;
22688c2ecf20Sopenharmony_ci		do {
22698c2ecf20Sopenharmony_ci			ACCEPT_MSG_ATN(port);
22708c2ecf20Sopenharmony_ci			TimeOutLoop = 0;
22718c2ecf20Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
22728c2ecf20Sopenharmony_ci			       (TimeOutLoop++ < 20000)) {
22738c2ecf20Sopenharmony_ci			}
22748c2ecf20Sopenharmony_ci			if (TimeOutLoop > 20000) {
22758c2ecf20Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PARITY);
22768c2ecf20Sopenharmony_ci				return message;
22778c2ecf20Sopenharmony_ci			}
22788c2ecf20Sopenharmony_ci			if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) !=
22798c2ecf20Sopenharmony_ci			    S_MSGI_PH) {
22808c2ecf20Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PARITY);
22818c2ecf20Sopenharmony_ci				return message;
22828c2ecf20Sopenharmony_ci			}
22838c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
22848c2ecf20Sopenharmony_ci
22858c2ecf20Sopenharmony_ci			RD_HARPOON(port + hp_scsidata_0);
22868c2ecf20Sopenharmony_ci
22878c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
22888c2ecf20Sopenharmony_ci
22898c2ecf20Sopenharmony_ci		} while (1);
22908c2ecf20Sopenharmony_ci
22918c2ecf20Sopenharmony_ci	}
22928c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
22938c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_xferstat, 0);
22948c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_fiforead, 0);
22958c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_fifowrite, 0);
22968c2ecf20Sopenharmony_ci	return message;
22978c2ecf20Sopenharmony_ci}
22988c2ecf20Sopenharmony_ci
22998c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
23008c2ecf20Sopenharmony_ci *
23018c2ecf20Sopenharmony_ci * Function: FPT_ssel
23028c2ecf20Sopenharmony_ci *
23038c2ecf20Sopenharmony_ci * Description: Load up automation and select target device.
23048c2ecf20Sopenharmony_ci *
23058c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
23068c2ecf20Sopenharmony_ci
23078c2ecf20Sopenharmony_cistatic void FPT_ssel(u32 port, unsigned char p_card)
23088c2ecf20Sopenharmony_ci{
23098c2ecf20Sopenharmony_ci
23108c2ecf20Sopenharmony_ci	unsigned char auto_loaded, i, target, *theCCB;
23118c2ecf20Sopenharmony_ci
23128c2ecf20Sopenharmony_ci	u32 cdb_reg;
23138c2ecf20Sopenharmony_ci	struct sccb_card *CurrCard;
23148c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
23158c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
23168c2ecf20Sopenharmony_ci	unsigned char lastTag, lun;
23178c2ecf20Sopenharmony_ci
23188c2ecf20Sopenharmony_ci	CurrCard = &FPT_BL_Card[p_card];
23198c2ecf20Sopenharmony_ci	currSCCB = CurrCard->currentSCCB;
23208c2ecf20Sopenharmony_ci	target = currSCCB->TargID;
23218c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][target];
23228c2ecf20Sopenharmony_ci	lastTag = CurrCard->tagQ_Lst;
23238c2ecf20Sopenharmony_ci
23248c2ecf20Sopenharmony_ci	ARAM_ACCESS(port);
23258c2ecf20Sopenharmony_ci
23268c2ecf20Sopenharmony_ci	if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
23278c2ecf20Sopenharmony_ci		currSCCB->ControlByte &= ~F_USE_CMD_Q;
23288c2ecf20Sopenharmony_ci
23298c2ecf20Sopenharmony_ci	if (((CurrCard->globalFlags & F_CONLUN_IO) &&
23308c2ecf20Sopenharmony_ci	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
23318c2ecf20Sopenharmony_ci
23328c2ecf20Sopenharmony_ci		lun = currSCCB->Lun;
23338c2ecf20Sopenharmony_ci	else
23348c2ecf20Sopenharmony_ci		lun = 0;
23358c2ecf20Sopenharmony_ci
23368c2ecf20Sopenharmony_ci	if (CurrCard->globalFlags & F_TAG_STARTED) {
23378c2ecf20Sopenharmony_ci		if (!(currSCCB->ControlByte & F_USE_CMD_Q)) {
23388c2ecf20Sopenharmony_ci			if ((currTar_Info->TarLUN_CA == 0)
23398c2ecf20Sopenharmony_ci			    && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
23408c2ecf20Sopenharmony_ci				== TAG_Q_TRYING)) {
23418c2ecf20Sopenharmony_ci
23428c2ecf20Sopenharmony_ci				if (currTar_Info->TarTagQ_Cnt != 0) {
23438c2ecf20Sopenharmony_ci					currTar_Info->TarLUNBusy[lun] = 1;
23448c2ecf20Sopenharmony_ci					FPT_queueSelectFail(CurrCard, p_card);
23458c2ecf20Sopenharmony_ci					SGRAM_ACCESS(port);
23468c2ecf20Sopenharmony_ci					return;
23478c2ecf20Sopenharmony_ci				}
23488c2ecf20Sopenharmony_ci
23498c2ecf20Sopenharmony_ci				else {
23508c2ecf20Sopenharmony_ci					currTar_Info->TarLUNBusy[lun] = 1;
23518c2ecf20Sopenharmony_ci				}
23528c2ecf20Sopenharmony_ci
23538c2ecf20Sopenharmony_ci			}
23548c2ecf20Sopenharmony_ci			/*End non-tagged */
23558c2ecf20Sopenharmony_ci			else {
23568c2ecf20Sopenharmony_ci				currTar_Info->TarLUNBusy[lun] = 1;
23578c2ecf20Sopenharmony_ci			}
23588c2ecf20Sopenharmony_ci
23598c2ecf20Sopenharmony_ci		}
23608c2ecf20Sopenharmony_ci		/*!Use cmd Q Tagged */
23618c2ecf20Sopenharmony_ci		else {
23628c2ecf20Sopenharmony_ci			if (currTar_Info->TarLUN_CA == 1) {
23638c2ecf20Sopenharmony_ci				FPT_queueSelectFail(CurrCard, p_card);
23648c2ecf20Sopenharmony_ci				SGRAM_ACCESS(port);
23658c2ecf20Sopenharmony_ci				return;
23668c2ecf20Sopenharmony_ci			}
23678c2ecf20Sopenharmony_ci
23688c2ecf20Sopenharmony_ci			currTar_Info->TarLUNBusy[lun] = 1;
23698c2ecf20Sopenharmony_ci
23708c2ecf20Sopenharmony_ci		}		/*else use cmd Q tagged */
23718c2ecf20Sopenharmony_ci
23728c2ecf20Sopenharmony_ci	}
23738c2ecf20Sopenharmony_ci	/*if glob tagged started */
23748c2ecf20Sopenharmony_ci	else {
23758c2ecf20Sopenharmony_ci		currTar_Info->TarLUNBusy[lun] = 1;
23768c2ecf20Sopenharmony_ci	}
23778c2ecf20Sopenharmony_ci
23788c2ecf20Sopenharmony_ci	if ((((CurrCard->globalFlags & F_CONLUN_IO) &&
23798c2ecf20Sopenharmony_ci	      ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
23808c2ecf20Sopenharmony_ci	     || (!(currSCCB->ControlByte & F_USE_CMD_Q)))) {
23818c2ecf20Sopenharmony_ci		if (CurrCard->discQCount >= QUEUE_DEPTH) {
23828c2ecf20Sopenharmony_ci			currTar_Info->TarLUNBusy[lun] = 1;
23838c2ecf20Sopenharmony_ci			FPT_queueSelectFail(CurrCard, p_card);
23848c2ecf20Sopenharmony_ci			SGRAM_ACCESS(port);
23858c2ecf20Sopenharmony_ci			return;
23868c2ecf20Sopenharmony_ci		}
23878c2ecf20Sopenharmony_ci		for (i = 1; i < QUEUE_DEPTH; i++) {
23888c2ecf20Sopenharmony_ci			if (++lastTag >= QUEUE_DEPTH)
23898c2ecf20Sopenharmony_ci				lastTag = 1;
23908c2ecf20Sopenharmony_ci			if (CurrCard->discQ_Tbl[lastTag] == NULL) {
23918c2ecf20Sopenharmony_ci				CurrCard->tagQ_Lst = lastTag;
23928c2ecf20Sopenharmony_ci				currTar_Info->LunDiscQ_Idx[lun] = lastTag;
23938c2ecf20Sopenharmony_ci				CurrCard->discQ_Tbl[lastTag] = currSCCB;
23948c2ecf20Sopenharmony_ci				CurrCard->discQCount++;
23958c2ecf20Sopenharmony_ci				break;
23968c2ecf20Sopenharmony_ci			}
23978c2ecf20Sopenharmony_ci		}
23988c2ecf20Sopenharmony_ci		if (i == QUEUE_DEPTH) {
23998c2ecf20Sopenharmony_ci			currTar_Info->TarLUNBusy[lun] = 1;
24008c2ecf20Sopenharmony_ci			FPT_queueSelectFail(CurrCard, p_card);
24018c2ecf20Sopenharmony_ci			SGRAM_ACCESS(port);
24028c2ecf20Sopenharmony_ci			return;
24038c2ecf20Sopenharmony_ci		}
24048c2ecf20Sopenharmony_ci	}
24058c2ecf20Sopenharmony_ci
24068c2ecf20Sopenharmony_ci	auto_loaded = 0;
24078c2ecf20Sopenharmony_ci
24088c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_select_id, target);
24098c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_gp_reg_3, target);	/* Use by new automation logic */
24108c2ecf20Sopenharmony_ci
24118c2ecf20Sopenharmony_ci	if (currSCCB->OperationCode == RESET_COMMAND) {
24128c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
24138c2ecf20Sopenharmony_ci						   (currSCCB->
24148c2ecf20Sopenharmony_ci						    Sccb_idmsg & ~DISC_PRIV)));
24158c2ecf20Sopenharmony_ci
24168c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + NP);
24178c2ecf20Sopenharmony_ci
24188c2ecf20Sopenharmony_ci		currSCCB->Sccb_scsimsg = SMDEV_RESET;
24198c2ecf20Sopenharmony_ci
24208c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
24218c2ecf20Sopenharmony_ci		auto_loaded = 1;
24228c2ecf20Sopenharmony_ci		currSCCB->Sccb_scsistat = SELECT_BDR_ST;
24238c2ecf20Sopenharmony_ci
24248c2ecf20Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
24258c2ecf20Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
24268c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
24278c2ecf20Sopenharmony_ci		}
24288c2ecf20Sopenharmony_ci
24298c2ecf20Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
24308c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
24318c2ecf20Sopenharmony_ci		}
24328c2ecf20Sopenharmony_ci
24338c2ecf20Sopenharmony_ci		FPT_sssyncv(port, target, NARROW_SCSI, currTar_Info);
24348c2ecf20Sopenharmony_ci		FPT_SccbMgrTableInitTarget(p_card, target);
24358c2ecf20Sopenharmony_ci
24368c2ecf20Sopenharmony_ci	}
24378c2ecf20Sopenharmony_ci
24388c2ecf20Sopenharmony_ci	else if (currSCCB->Sccb_scsistat == ABORT_ST) {
24398c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
24408c2ecf20Sopenharmony_ci						   (currSCCB->
24418c2ecf20Sopenharmony_ci						    Sccb_idmsg & ~DISC_PRIV)));
24428c2ecf20Sopenharmony_ci
24438c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
24448c2ecf20Sopenharmony_ci
24458c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT +
24468c2ecf20Sopenharmony_ci						     (((unsigned
24478c2ecf20Sopenharmony_ci							char)(currSCCB->
24488c2ecf20Sopenharmony_ci							      ControlByte &
24498c2ecf20Sopenharmony_ci							      TAG_TYPE_MASK)
24508c2ecf20Sopenharmony_ci						       >> 6) | (unsigned char)
24518c2ecf20Sopenharmony_ci						      0x20)));
24528c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 2),
24538c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT + currSCCB->Sccb_tag));
24548c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 4), (BRH_OP + ALWAYS + NP));
24558c2ecf20Sopenharmony_ci
24568c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
24578c2ecf20Sopenharmony_ci		auto_loaded = 1;
24588c2ecf20Sopenharmony_ci
24598c2ecf20Sopenharmony_ci	}
24608c2ecf20Sopenharmony_ci
24618c2ecf20Sopenharmony_ci	else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) {
24628c2ecf20Sopenharmony_ci		auto_loaded = FPT_siwidn(port, p_card);
24638c2ecf20Sopenharmony_ci		currSCCB->Sccb_scsistat = SELECT_WN_ST;
24648c2ecf20Sopenharmony_ci	}
24658c2ecf20Sopenharmony_ci
24668c2ecf20Sopenharmony_ci	else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
24678c2ecf20Sopenharmony_ci		   == SYNC_SUPPORTED)) {
24688c2ecf20Sopenharmony_ci		auto_loaded = FPT_sisyncn(port, p_card, 0);
24698c2ecf20Sopenharmony_ci		currSCCB->Sccb_scsistat = SELECT_SN_ST;
24708c2ecf20Sopenharmony_ci	}
24718c2ecf20Sopenharmony_ci
24728c2ecf20Sopenharmony_ci	if (!auto_loaded) {
24738c2ecf20Sopenharmony_ci
24748c2ecf20Sopenharmony_ci		if (currSCCB->ControlByte & F_USE_CMD_Q) {
24758c2ecf20Sopenharmony_ci
24768c2ecf20Sopenharmony_ci			CurrCard->globalFlags |= F_TAG_STARTED;
24778c2ecf20Sopenharmony_ci
24788c2ecf20Sopenharmony_ci			if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
24798c2ecf20Sopenharmony_ci			    == TAG_Q_REJECT) {
24808c2ecf20Sopenharmony_ci				currSCCB->ControlByte &= ~F_USE_CMD_Q;
24818c2ecf20Sopenharmony_ci
24828c2ecf20Sopenharmony_ci				/* Fix up the start instruction with a jump to
24838c2ecf20Sopenharmony_ci				   Non-Tag-CMD handling */
24848c2ecf20Sopenharmony_ci				WRW_HARPOON((port + ID_MSG_STRT),
24858c2ecf20Sopenharmony_ci					    BRH_OP + ALWAYS + NTCMD);
24868c2ecf20Sopenharmony_ci
24878c2ecf20Sopenharmony_ci				WRW_HARPOON((port + NON_TAG_ID_MSG),
24888c2ecf20Sopenharmony_ci					    (MPM_OP + AMSG_OUT +
24898c2ecf20Sopenharmony_ci					     currSCCB->Sccb_idmsg));
24908c2ecf20Sopenharmony_ci
24918c2ecf20Sopenharmony_ci				WR_HARPOON(port + hp_autostart_3,
24928c2ecf20Sopenharmony_ci					   (SELECT + SELCHK_STRT));
24938c2ecf20Sopenharmony_ci
24948c2ecf20Sopenharmony_ci				/* Setup our STATE so we know what happened when
24958c2ecf20Sopenharmony_ci				   the wheels fall off. */
24968c2ecf20Sopenharmony_ci				currSCCB->Sccb_scsistat = SELECT_ST;
24978c2ecf20Sopenharmony_ci
24988c2ecf20Sopenharmony_ci				currTar_Info->TarLUNBusy[lun] = 1;
24998c2ecf20Sopenharmony_ci			}
25008c2ecf20Sopenharmony_ci
25018c2ecf20Sopenharmony_ci			else {
25028c2ecf20Sopenharmony_ci				WRW_HARPOON((port + ID_MSG_STRT),
25038c2ecf20Sopenharmony_ci					    (MPM_OP + AMSG_OUT +
25048c2ecf20Sopenharmony_ci					     currSCCB->Sccb_idmsg));
25058c2ecf20Sopenharmony_ci
25068c2ecf20Sopenharmony_ci				WRW_HARPOON((port + ID_MSG_STRT + 2),
25078c2ecf20Sopenharmony_ci					    (MPM_OP + AMSG_OUT +
25088c2ecf20Sopenharmony_ci					     (((unsigned char)(currSCCB->
25098c2ecf20Sopenharmony_ci							       ControlByte &
25108c2ecf20Sopenharmony_ci							       TAG_TYPE_MASK)
25118c2ecf20Sopenharmony_ci					       >> 6) | (unsigned char)0x20)));
25128c2ecf20Sopenharmony_ci
25138c2ecf20Sopenharmony_ci				for (i = 1; i < QUEUE_DEPTH; i++) {
25148c2ecf20Sopenharmony_ci					if (++lastTag >= QUEUE_DEPTH)
25158c2ecf20Sopenharmony_ci						lastTag = 1;
25168c2ecf20Sopenharmony_ci					if (CurrCard->discQ_Tbl[lastTag] ==
25178c2ecf20Sopenharmony_ci					    NULL) {
25188c2ecf20Sopenharmony_ci						WRW_HARPOON((port +
25198c2ecf20Sopenharmony_ci							     ID_MSG_STRT + 6),
25208c2ecf20Sopenharmony_ci							    (MPM_OP + AMSG_OUT +
25218c2ecf20Sopenharmony_ci							     lastTag));
25228c2ecf20Sopenharmony_ci						CurrCard->tagQ_Lst = lastTag;
25238c2ecf20Sopenharmony_ci						currSCCB->Sccb_tag = lastTag;
25248c2ecf20Sopenharmony_ci						CurrCard->discQ_Tbl[lastTag] =
25258c2ecf20Sopenharmony_ci						    currSCCB;
25268c2ecf20Sopenharmony_ci						CurrCard->discQCount++;
25278c2ecf20Sopenharmony_ci						break;
25288c2ecf20Sopenharmony_ci					}
25298c2ecf20Sopenharmony_ci				}
25308c2ecf20Sopenharmony_ci
25318c2ecf20Sopenharmony_ci				if (i == QUEUE_DEPTH) {
25328c2ecf20Sopenharmony_ci					currTar_Info->TarLUNBusy[lun] = 1;
25338c2ecf20Sopenharmony_ci					FPT_queueSelectFail(CurrCard, p_card);
25348c2ecf20Sopenharmony_ci					SGRAM_ACCESS(port);
25358c2ecf20Sopenharmony_ci					return;
25368c2ecf20Sopenharmony_ci				}
25378c2ecf20Sopenharmony_ci
25388c2ecf20Sopenharmony_ci				currSCCB->Sccb_scsistat = SELECT_Q_ST;
25398c2ecf20Sopenharmony_ci
25408c2ecf20Sopenharmony_ci				WR_HARPOON(port + hp_autostart_3,
25418c2ecf20Sopenharmony_ci					   (SELECT + SELCHK_STRT));
25428c2ecf20Sopenharmony_ci			}
25438c2ecf20Sopenharmony_ci		}
25448c2ecf20Sopenharmony_ci
25458c2ecf20Sopenharmony_ci		else {
25468c2ecf20Sopenharmony_ci
25478c2ecf20Sopenharmony_ci			WRW_HARPOON((port + ID_MSG_STRT),
25488c2ecf20Sopenharmony_ci				    BRH_OP + ALWAYS + NTCMD);
25498c2ecf20Sopenharmony_ci
25508c2ecf20Sopenharmony_ci			WRW_HARPOON((port + NON_TAG_ID_MSG),
25518c2ecf20Sopenharmony_ci				    (MPM_OP + AMSG_OUT + currSCCB->Sccb_idmsg));
25528c2ecf20Sopenharmony_ci
25538c2ecf20Sopenharmony_ci			currSCCB->Sccb_scsistat = SELECT_ST;
25548c2ecf20Sopenharmony_ci
25558c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_3,
25568c2ecf20Sopenharmony_ci				   (SELECT + SELCHK_STRT));
25578c2ecf20Sopenharmony_ci		}
25588c2ecf20Sopenharmony_ci
25598c2ecf20Sopenharmony_ci		theCCB = (unsigned char *)&currSCCB->Cdb[0];
25608c2ecf20Sopenharmony_ci
25618c2ecf20Sopenharmony_ci		cdb_reg = port + CMD_STRT;
25628c2ecf20Sopenharmony_ci
25638c2ecf20Sopenharmony_ci		for (i = 0; i < currSCCB->CdbLength; i++) {
25648c2ecf20Sopenharmony_ci			WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
25658c2ecf20Sopenharmony_ci			cdb_reg += 2;
25668c2ecf20Sopenharmony_ci			theCCB++;
25678c2ecf20Sopenharmony_ci		}
25688c2ecf20Sopenharmony_ci
25698c2ecf20Sopenharmony_ci		if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
25708c2ecf20Sopenharmony_ci			WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
25718c2ecf20Sopenharmony_ci
25728c2ecf20Sopenharmony_ci	}
25738c2ecf20Sopenharmony_ci	/* auto_loaded */
25748c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
25758c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_xferstat, 0x00);
25768c2ecf20Sopenharmony_ci
25778c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
25788c2ecf20Sopenharmony_ci
25798c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT));
25808c2ecf20Sopenharmony_ci
25818c2ecf20Sopenharmony_ci	if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED)) {
25828c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_scsictrl_0,
25838c2ecf20Sopenharmony_ci			   (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
25848c2ecf20Sopenharmony_ci	} else {
25858c2ecf20Sopenharmony_ci
25868c2ecf20Sopenharmony_ci/*      auto_loaded =  (RD_HARPOON(port+hp_autostart_3) & (unsigned char)0x1F);
25878c2ecf20Sopenharmony_ci      auto_loaded |= AUTO_IMMED; */
25888c2ecf20Sopenharmony_ci		auto_loaded = AUTO_IMMED;
25898c2ecf20Sopenharmony_ci
25908c2ecf20Sopenharmony_ci		DISABLE_AUTO(port);
25918c2ecf20Sopenharmony_ci
25928c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, auto_loaded);
25938c2ecf20Sopenharmony_ci	}
25948c2ecf20Sopenharmony_ci
25958c2ecf20Sopenharmony_ci	SGRAM_ACCESS(port);
25968c2ecf20Sopenharmony_ci}
25978c2ecf20Sopenharmony_ci
25988c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
25998c2ecf20Sopenharmony_ci *
26008c2ecf20Sopenharmony_ci * Function: FPT_sres
26018c2ecf20Sopenharmony_ci *
26028c2ecf20Sopenharmony_ci * Description: Hookup the correct CCB and handle the incoming messages.
26038c2ecf20Sopenharmony_ci *
26048c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
26058c2ecf20Sopenharmony_ci
26068c2ecf20Sopenharmony_cistatic void FPT_sres(u32 port, unsigned char p_card,
26078c2ecf20Sopenharmony_ci		     struct sccb_card *pCurrCard)
26088c2ecf20Sopenharmony_ci{
26098c2ecf20Sopenharmony_ci
26108c2ecf20Sopenharmony_ci	unsigned char our_target, message, lun = 0, tag, msgRetryCount;
26118c2ecf20Sopenharmony_ci
26128c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
26138c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
26148c2ecf20Sopenharmony_ci
26158c2ecf20Sopenharmony_ci	if (pCurrCard->currentSCCB != NULL) {
26168c2ecf20Sopenharmony_ci		currTar_Info =
26178c2ecf20Sopenharmony_ci		    &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
26188c2ecf20Sopenharmony_ci		DISABLE_AUTO(port);
26198c2ecf20Sopenharmony_ci
26208c2ecf20Sopenharmony_ci		WR_HARPOON((port + hp_scsictrl_0), (ENA_RESEL | ENA_SCAM_SEL));
26218c2ecf20Sopenharmony_ci
26228c2ecf20Sopenharmony_ci		currSCCB = pCurrCard->currentSCCB;
26238c2ecf20Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
26248c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
26258c2ecf20Sopenharmony_ci			currSCCB->Sccb_scsistat = BUS_FREE_ST;
26268c2ecf20Sopenharmony_ci		}
26278c2ecf20Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
26288c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
26298c2ecf20Sopenharmony_ci			currSCCB->Sccb_scsistat = BUS_FREE_ST;
26308c2ecf20Sopenharmony_ci		}
26318c2ecf20Sopenharmony_ci		if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
26328c2ecf20Sopenharmony_ci		     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
26338c2ecf20Sopenharmony_ci		      TAG_Q_TRYING))) {
26348c2ecf20Sopenharmony_ci			currTar_Info->TarLUNBusy[currSCCB->Lun] = 0;
26358c2ecf20Sopenharmony_ci			if (currSCCB->Sccb_scsistat != ABORT_ST) {
26368c2ecf20Sopenharmony_ci				pCurrCard->discQCount--;
26378c2ecf20Sopenharmony_ci				pCurrCard->discQ_Tbl[currTar_Info->
26388c2ecf20Sopenharmony_ci						     LunDiscQ_Idx[currSCCB->
26398c2ecf20Sopenharmony_ci								  Lun]]
26408c2ecf20Sopenharmony_ci				    = NULL;
26418c2ecf20Sopenharmony_ci			}
26428c2ecf20Sopenharmony_ci		} else {
26438c2ecf20Sopenharmony_ci			currTar_Info->TarLUNBusy[0] = 0;
26448c2ecf20Sopenharmony_ci			if (currSCCB->Sccb_tag) {
26458c2ecf20Sopenharmony_ci				if (currSCCB->Sccb_scsistat != ABORT_ST) {
26468c2ecf20Sopenharmony_ci					pCurrCard->discQCount--;
26478c2ecf20Sopenharmony_ci					pCurrCard->discQ_Tbl[currSCCB->
26488c2ecf20Sopenharmony_ci							     Sccb_tag] = NULL;
26498c2ecf20Sopenharmony_ci				}
26508c2ecf20Sopenharmony_ci			} else {
26518c2ecf20Sopenharmony_ci				if (currSCCB->Sccb_scsistat != ABORT_ST) {
26528c2ecf20Sopenharmony_ci					pCurrCard->discQCount--;
26538c2ecf20Sopenharmony_ci					pCurrCard->discQ_Tbl[currTar_Info->
26548c2ecf20Sopenharmony_ci							     LunDiscQ_Idx[0]] =
26558c2ecf20Sopenharmony_ci					    NULL;
26568c2ecf20Sopenharmony_ci				}
26578c2ecf20Sopenharmony_ci			}
26588c2ecf20Sopenharmony_ci		}
26598c2ecf20Sopenharmony_ci
26608c2ecf20Sopenharmony_ci		FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
26618c2ecf20Sopenharmony_ci	}
26628c2ecf20Sopenharmony_ci
26638c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
26648c2ecf20Sopenharmony_ci
26658c2ecf20Sopenharmony_ci	our_target = (unsigned char)(RD_HARPOON(port + hp_select_id) >> 4);
26668c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
26678c2ecf20Sopenharmony_ci
26688c2ecf20Sopenharmony_ci	msgRetryCount = 0;
26698c2ecf20Sopenharmony_ci	do {
26708c2ecf20Sopenharmony_ci
26718c2ecf20Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
26728c2ecf20Sopenharmony_ci		tag = 0;
26738c2ecf20Sopenharmony_ci
26748c2ecf20Sopenharmony_ci		while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
26758c2ecf20Sopenharmony_ci			if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
26768c2ecf20Sopenharmony_ci
26778c2ecf20Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PHASE);
26788c2ecf20Sopenharmony_ci				return;
26798c2ecf20Sopenharmony_ci			}
26808c2ecf20Sopenharmony_ci		}
26818c2ecf20Sopenharmony_ci
26828c2ecf20Sopenharmony_ci		WRW_HARPOON((port + hp_intstat), PHASE);
26838c2ecf20Sopenharmony_ci		if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH) {
26848c2ecf20Sopenharmony_ci
26858c2ecf20Sopenharmony_ci			message = FPT_sfm(port, pCurrCard->currentSCCB);
26868c2ecf20Sopenharmony_ci			if (message) {
26878c2ecf20Sopenharmony_ci
26888c2ecf20Sopenharmony_ci				if (message <= (0x80 | LUN_MASK)) {
26898c2ecf20Sopenharmony_ci					lun = message & (unsigned char)LUN_MASK;
26908c2ecf20Sopenharmony_ci
26918c2ecf20Sopenharmony_ci					if ((currTar_Info->
26928c2ecf20Sopenharmony_ci					     TarStatus & TAR_TAG_Q_MASK) ==
26938c2ecf20Sopenharmony_ci					    TAG_Q_TRYING) {
26948c2ecf20Sopenharmony_ci						if (currTar_Info->TarTagQ_Cnt !=
26958c2ecf20Sopenharmony_ci						    0) {
26968c2ecf20Sopenharmony_ci
26978c2ecf20Sopenharmony_ci							if (!
26988c2ecf20Sopenharmony_ci							    (currTar_Info->
26998c2ecf20Sopenharmony_ci							     TarLUN_CA)) {
27008c2ecf20Sopenharmony_ci								ACCEPT_MSG(port);	/*Release the ACK for ID msg. */
27018c2ecf20Sopenharmony_ci
27028c2ecf20Sopenharmony_ci								message =
27038c2ecf20Sopenharmony_ci								    FPT_sfm
27048c2ecf20Sopenharmony_ci								    (port,
27058c2ecf20Sopenharmony_ci								     pCurrCard->
27068c2ecf20Sopenharmony_ci								     currentSCCB);
27078c2ecf20Sopenharmony_ci								if (message) {
27088c2ecf20Sopenharmony_ci									ACCEPT_MSG
27098c2ecf20Sopenharmony_ci									    (port);
27108c2ecf20Sopenharmony_ci								}
27118c2ecf20Sopenharmony_ci
27128c2ecf20Sopenharmony_ci								else
27138c2ecf20Sopenharmony_ci									message
27148c2ecf20Sopenharmony_ci									    = 0;
27158c2ecf20Sopenharmony_ci
27168c2ecf20Sopenharmony_ci								if (message !=
27178c2ecf20Sopenharmony_ci								    0) {
27188c2ecf20Sopenharmony_ci									tag =
27198c2ecf20Sopenharmony_ci									    FPT_sfm
27208c2ecf20Sopenharmony_ci									    (port,
27218c2ecf20Sopenharmony_ci									     pCurrCard->
27228c2ecf20Sopenharmony_ci									     currentSCCB);
27238c2ecf20Sopenharmony_ci
27248c2ecf20Sopenharmony_ci									if (!
27258c2ecf20Sopenharmony_ci									    (tag))
27268c2ecf20Sopenharmony_ci										message
27278c2ecf20Sopenharmony_ci										    =
27288c2ecf20Sopenharmony_ci										    0;
27298c2ecf20Sopenharmony_ci								}
27308c2ecf20Sopenharmony_ci
27318c2ecf20Sopenharmony_ci							}
27328c2ecf20Sopenharmony_ci							/*C.A. exists! */
27338c2ecf20Sopenharmony_ci						}
27348c2ecf20Sopenharmony_ci						/*End Q cnt != 0 */
27358c2ecf20Sopenharmony_ci					}
27368c2ecf20Sopenharmony_ci					/*End Tag cmds supported! */
27378c2ecf20Sopenharmony_ci				}
27388c2ecf20Sopenharmony_ci				/*End valid ID message.  */
27398c2ecf20Sopenharmony_ci				else {
27408c2ecf20Sopenharmony_ci
27418c2ecf20Sopenharmony_ci					ACCEPT_MSG_ATN(port);
27428c2ecf20Sopenharmony_ci				}
27438c2ecf20Sopenharmony_ci
27448c2ecf20Sopenharmony_ci			}
27458c2ecf20Sopenharmony_ci			/* End good id message. */
27468c2ecf20Sopenharmony_ci			else {
27478c2ecf20Sopenharmony_ci
27488c2ecf20Sopenharmony_ci				message = 0;
27498c2ecf20Sopenharmony_ci			}
27508c2ecf20Sopenharmony_ci		} else {
27518c2ecf20Sopenharmony_ci			ACCEPT_MSG_ATN(port);
27528c2ecf20Sopenharmony_ci
27538c2ecf20Sopenharmony_ci			while (!
27548c2ecf20Sopenharmony_ci			       (RDW_HARPOON((port + hp_intstat)) &
27558c2ecf20Sopenharmony_ci				(PHASE | RESET))
27568c2ecf20Sopenharmony_ci			       && !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
27578c2ecf20Sopenharmony_ci			       && (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
27588c2ecf20Sopenharmony_ci
27598c2ecf20Sopenharmony_ci			return;
27608c2ecf20Sopenharmony_ci		}
27618c2ecf20Sopenharmony_ci
27628c2ecf20Sopenharmony_ci		if (message == 0) {
27638c2ecf20Sopenharmony_ci			msgRetryCount++;
27648c2ecf20Sopenharmony_ci			if (msgRetryCount == 1) {
27658c2ecf20Sopenharmony_ci				FPT_SendMsg(port, SMPARITY);
27668c2ecf20Sopenharmony_ci			} else {
27678c2ecf20Sopenharmony_ci				FPT_SendMsg(port, SMDEV_RESET);
27688c2ecf20Sopenharmony_ci
27698c2ecf20Sopenharmony_ci				FPT_sssyncv(port, our_target, NARROW_SCSI,
27708c2ecf20Sopenharmony_ci					    currTar_Info);
27718c2ecf20Sopenharmony_ci
27728c2ecf20Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][our_target].
27738c2ecf20Sopenharmony_ci				    TarEEValue & EE_SYNC_MASK) {
27748c2ecf20Sopenharmony_ci
27758c2ecf20Sopenharmony_ci					FPT_sccbMgrTbl[p_card][our_target].
27768c2ecf20Sopenharmony_ci					    TarStatus &= ~TAR_SYNC_MASK;
27778c2ecf20Sopenharmony_ci
27788c2ecf20Sopenharmony_ci				}
27798c2ecf20Sopenharmony_ci
27808c2ecf20Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][our_target].
27818c2ecf20Sopenharmony_ci				    TarEEValue & EE_WIDE_SCSI) {
27828c2ecf20Sopenharmony_ci
27838c2ecf20Sopenharmony_ci					FPT_sccbMgrTbl[p_card][our_target].
27848c2ecf20Sopenharmony_ci					    TarStatus &= ~TAR_WIDE_MASK;
27858c2ecf20Sopenharmony_ci				}
27868c2ecf20Sopenharmony_ci
27878c2ecf20Sopenharmony_ci				FPT_queueFlushTargSccb(p_card, our_target,
27888c2ecf20Sopenharmony_ci						       SCCB_COMPLETE);
27898c2ecf20Sopenharmony_ci				FPT_SccbMgrTableInitTarget(p_card, our_target);
27908c2ecf20Sopenharmony_ci				return;
27918c2ecf20Sopenharmony_ci			}
27928c2ecf20Sopenharmony_ci		}
27938c2ecf20Sopenharmony_ci	} while (message == 0);
27948c2ecf20Sopenharmony_ci
27958c2ecf20Sopenharmony_ci	if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
27968c2ecf20Sopenharmony_ci	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
27978c2ecf20Sopenharmony_ci		currTar_Info->TarLUNBusy[lun] = 1;
27988c2ecf20Sopenharmony_ci		pCurrCard->currentSCCB =
27998c2ecf20Sopenharmony_ci		    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
28008c2ecf20Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL) {
28018c2ecf20Sopenharmony_ci			ACCEPT_MSG(port);
28028c2ecf20Sopenharmony_ci		} else {
28038c2ecf20Sopenharmony_ci			ACCEPT_MSG_ATN(port);
28048c2ecf20Sopenharmony_ci		}
28058c2ecf20Sopenharmony_ci	} else {
28068c2ecf20Sopenharmony_ci		currTar_Info->TarLUNBusy[0] = 1;
28078c2ecf20Sopenharmony_ci
28088c2ecf20Sopenharmony_ci		if (tag) {
28098c2ecf20Sopenharmony_ci			if (pCurrCard->discQ_Tbl[tag] != NULL) {
28108c2ecf20Sopenharmony_ci				pCurrCard->currentSCCB =
28118c2ecf20Sopenharmony_ci				    pCurrCard->discQ_Tbl[tag];
28128c2ecf20Sopenharmony_ci				currTar_Info->TarTagQ_Cnt--;
28138c2ecf20Sopenharmony_ci				ACCEPT_MSG(port);
28148c2ecf20Sopenharmony_ci			} else {
28158c2ecf20Sopenharmony_ci				ACCEPT_MSG_ATN(port);
28168c2ecf20Sopenharmony_ci			}
28178c2ecf20Sopenharmony_ci		} else {
28188c2ecf20Sopenharmony_ci			pCurrCard->currentSCCB =
28198c2ecf20Sopenharmony_ci			    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
28208c2ecf20Sopenharmony_ci			if (pCurrCard->currentSCCB != NULL) {
28218c2ecf20Sopenharmony_ci				ACCEPT_MSG(port);
28228c2ecf20Sopenharmony_ci			} else {
28238c2ecf20Sopenharmony_ci				ACCEPT_MSG_ATN(port);
28248c2ecf20Sopenharmony_ci			}
28258c2ecf20Sopenharmony_ci		}
28268c2ecf20Sopenharmony_ci	}
28278c2ecf20Sopenharmony_ci
28288c2ecf20Sopenharmony_ci	if (pCurrCard->currentSCCB != NULL) {
28298c2ecf20Sopenharmony_ci		if (pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST) {
28308c2ecf20Sopenharmony_ci			/* During Abort Tag command, the target could have got re-selected
28318c2ecf20Sopenharmony_ci			   and completed the command. Check the select Q and remove the CCB
28328c2ecf20Sopenharmony_ci			   if it is in the Select Q */
28338c2ecf20Sopenharmony_ci			FPT_queueFindSccb(pCurrCard->currentSCCB, p_card);
28348c2ecf20Sopenharmony_ci		}
28358c2ecf20Sopenharmony_ci	}
28368c2ecf20Sopenharmony_ci
28378c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & (PHASE | RESET)) &&
28388c2ecf20Sopenharmony_ci	       !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ) &&
28398c2ecf20Sopenharmony_ci	       (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
28408c2ecf20Sopenharmony_ci}
28418c2ecf20Sopenharmony_ci
28428c2ecf20Sopenharmony_cistatic void FPT_SendMsg(u32 port, unsigned char message)
28438c2ecf20Sopenharmony_ci{
28448c2ecf20Sopenharmony_ci	while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
28458c2ecf20Sopenharmony_ci		if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
28468c2ecf20Sopenharmony_ci
28478c2ecf20Sopenharmony_ci			WRW_HARPOON((port + hp_intstat), PHASE);
28488c2ecf20Sopenharmony_ci			return;
28498c2ecf20Sopenharmony_ci		}
28508c2ecf20Sopenharmony_ci	}
28518c2ecf20Sopenharmony_ci
28528c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), PHASE);
28538c2ecf20Sopenharmony_ci	if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH) {
28548c2ecf20Sopenharmony_ci		WRW_HARPOON((port + hp_intstat),
28558c2ecf20Sopenharmony_ci			    (BUS_FREE | PHASE | XFER_CNT_0));
28568c2ecf20Sopenharmony_ci
28578c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
28588c2ecf20Sopenharmony_ci
28598c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_scsidata_0, message);
28608c2ecf20Sopenharmony_ci
28618c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
28628c2ecf20Sopenharmony_ci
28638c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);
28648c2ecf20Sopenharmony_ci
28658c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, 0x00);
28668c2ecf20Sopenharmony_ci
28678c2ecf20Sopenharmony_ci		if ((message == SMABORT) || (message == SMDEV_RESET) ||
28688c2ecf20Sopenharmony_ci		    (message == SMABORT_TAG)) {
28698c2ecf20Sopenharmony_ci			while (!
28708c2ecf20Sopenharmony_ci			       (RDW_HARPOON((port + hp_intstat)) &
28718c2ecf20Sopenharmony_ci				(BUS_FREE | PHASE))) {
28728c2ecf20Sopenharmony_ci			}
28738c2ecf20Sopenharmony_ci
28748c2ecf20Sopenharmony_ci			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
28758c2ecf20Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), BUS_FREE);
28768c2ecf20Sopenharmony_ci			}
28778c2ecf20Sopenharmony_ci		}
28788c2ecf20Sopenharmony_ci	}
28798c2ecf20Sopenharmony_ci}
28808c2ecf20Sopenharmony_ci
28818c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
28828c2ecf20Sopenharmony_ci *
28838c2ecf20Sopenharmony_ci * Function: FPT_sdecm
28848c2ecf20Sopenharmony_ci *
28858c2ecf20Sopenharmony_ci * Description: Determine the proper response to the message from the
28868c2ecf20Sopenharmony_ci *              target device.
28878c2ecf20Sopenharmony_ci *
28888c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
28898c2ecf20Sopenharmony_cistatic void FPT_sdecm(unsigned char message, u32 port, unsigned char p_card)
28908c2ecf20Sopenharmony_ci{
28918c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
28928c2ecf20Sopenharmony_ci	struct sccb_card *CurrCard;
28938c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
28948c2ecf20Sopenharmony_ci
28958c2ecf20Sopenharmony_ci	CurrCard = &FPT_BL_Card[p_card];
28968c2ecf20Sopenharmony_ci	currSCCB = CurrCard->currentSCCB;
28978c2ecf20Sopenharmony_ci
28988c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
28998c2ecf20Sopenharmony_ci
29008c2ecf20Sopenharmony_ci	if (message == SMREST_DATA_PTR) {
29018c2ecf20Sopenharmony_ci		if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) {
29028c2ecf20Sopenharmony_ci			currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
29038c2ecf20Sopenharmony_ci
29048c2ecf20Sopenharmony_ci			FPT_hostDataXferRestart(currSCCB);
29058c2ecf20Sopenharmony_ci		}
29068c2ecf20Sopenharmony_ci
29078c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);
29088c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
29098c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
29108c2ecf20Sopenharmony_ci	}
29118c2ecf20Sopenharmony_ci
29128c2ecf20Sopenharmony_ci	else if (message == SMCMD_COMP) {
29138c2ecf20Sopenharmony_ci
29148c2ecf20Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
29158c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &=
29168c2ecf20Sopenharmony_ci			    ~(unsigned char)TAR_TAG_Q_MASK;
29178c2ecf20Sopenharmony_ci			currTar_Info->TarStatus |= (unsigned char)TAG_Q_REJECT;
29188c2ecf20Sopenharmony_ci		}
29198c2ecf20Sopenharmony_ci
29208c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);
29218c2ecf20Sopenharmony_ci
29228c2ecf20Sopenharmony_ci	}
29238c2ecf20Sopenharmony_ci
29248c2ecf20Sopenharmony_ci	else if ((message == SMNO_OP) || (message >= SMIDENT)
29258c2ecf20Sopenharmony_ci		 || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY)) {
29268c2ecf20Sopenharmony_ci
29278c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);
29288c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
29298c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
29308c2ecf20Sopenharmony_ci	}
29318c2ecf20Sopenharmony_ci
29328c2ecf20Sopenharmony_ci	else if (message == SMREJECT) {
29338c2ecf20Sopenharmony_ci
29348c2ecf20Sopenharmony_ci		if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
29358c2ecf20Sopenharmony_ci		    (currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
29368c2ecf20Sopenharmony_ci		    ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)
29378c2ecf20Sopenharmony_ci		    || ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) ==
29388c2ecf20Sopenharmony_ci			TAG_Q_TRYING))
29398c2ecf20Sopenharmony_ci		{
29408c2ecf20Sopenharmony_ci			WRW_HARPOON((port + hp_intstat), BUS_FREE);
29418c2ecf20Sopenharmony_ci
29428c2ecf20Sopenharmony_ci			ACCEPT_MSG(port);
29438c2ecf20Sopenharmony_ci
29448c2ecf20Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
29458c2ecf20Sopenharmony_ci			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
29468c2ecf20Sopenharmony_ci			{
29478c2ecf20Sopenharmony_ci			}
29488c2ecf20Sopenharmony_ci
29498c2ecf20Sopenharmony_ci			if (currSCCB->Lun == 0x00) {
29508c2ecf20Sopenharmony_ci				if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
29518c2ecf20Sopenharmony_ci
29528c2ecf20Sopenharmony_ci					currTar_Info->TarStatus |=
29538c2ecf20Sopenharmony_ci					    (unsigned char)SYNC_SUPPORTED;
29548c2ecf20Sopenharmony_ci
29558c2ecf20Sopenharmony_ci					currTar_Info->TarEEValue &=
29568c2ecf20Sopenharmony_ci					    ~EE_SYNC_MASK;
29578c2ecf20Sopenharmony_ci				}
29588c2ecf20Sopenharmony_ci
29598c2ecf20Sopenharmony_ci				else if (currSCCB->Sccb_scsistat ==
29608c2ecf20Sopenharmony_ci					  SELECT_WN_ST) {
29618c2ecf20Sopenharmony_ci
29628c2ecf20Sopenharmony_ci					currTar_Info->TarStatus =
29638c2ecf20Sopenharmony_ci					    (currTar_Info->
29648c2ecf20Sopenharmony_ci					     TarStatus & ~WIDE_ENABLED) |
29658c2ecf20Sopenharmony_ci					    WIDE_NEGOCIATED;
29668c2ecf20Sopenharmony_ci
29678c2ecf20Sopenharmony_ci					currTar_Info->TarEEValue &=
29688c2ecf20Sopenharmony_ci					    ~EE_WIDE_SCSI;
29698c2ecf20Sopenharmony_ci
29708c2ecf20Sopenharmony_ci				}
29718c2ecf20Sopenharmony_ci
29728c2ecf20Sopenharmony_ci				else if ((currTar_Info->
29738c2ecf20Sopenharmony_ci					  TarStatus & TAR_TAG_Q_MASK) ==
29748c2ecf20Sopenharmony_ci					 TAG_Q_TRYING) {
29758c2ecf20Sopenharmony_ci					currTar_Info->TarStatus =
29768c2ecf20Sopenharmony_ci					    (currTar_Info->
29778c2ecf20Sopenharmony_ci					     TarStatus & ~(unsigned char)
29788c2ecf20Sopenharmony_ci					     TAR_TAG_Q_MASK) | TAG_Q_REJECT;
29798c2ecf20Sopenharmony_ci
29808c2ecf20Sopenharmony_ci					currSCCB->ControlByte &= ~F_USE_CMD_Q;
29818c2ecf20Sopenharmony_ci					CurrCard->discQCount--;
29828c2ecf20Sopenharmony_ci					CurrCard->discQ_Tbl[currSCCB->
29838c2ecf20Sopenharmony_ci							    Sccb_tag] = NULL;
29848c2ecf20Sopenharmony_ci					currSCCB->Sccb_tag = 0x00;
29858c2ecf20Sopenharmony_ci
29868c2ecf20Sopenharmony_ci				}
29878c2ecf20Sopenharmony_ci			}
29888c2ecf20Sopenharmony_ci
29898c2ecf20Sopenharmony_ci			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
29908c2ecf20Sopenharmony_ci
29918c2ecf20Sopenharmony_ci				if (currSCCB->Lun == 0x00) {
29928c2ecf20Sopenharmony_ci					WRW_HARPOON((port + hp_intstat),
29938c2ecf20Sopenharmony_ci						    BUS_FREE);
29948c2ecf20Sopenharmony_ci					CurrCard->globalFlags |= F_NEW_SCCB_CMD;
29958c2ecf20Sopenharmony_ci				}
29968c2ecf20Sopenharmony_ci			}
29978c2ecf20Sopenharmony_ci
29988c2ecf20Sopenharmony_ci			else {
29998c2ecf20Sopenharmony_ci
30008c2ecf20Sopenharmony_ci				if ((CurrCard->globalFlags & F_CONLUN_IO) &&
30018c2ecf20Sopenharmony_ci				    ((currTar_Info->
30028c2ecf20Sopenharmony_ci				      TarStatus & TAR_TAG_Q_MASK) !=
30038c2ecf20Sopenharmony_ci				     TAG_Q_TRYING))
30048c2ecf20Sopenharmony_ci					currTar_Info->TarLUNBusy[currSCCB->
30058c2ecf20Sopenharmony_ci								 Lun] = 1;
30068c2ecf20Sopenharmony_ci				else
30078c2ecf20Sopenharmony_ci					currTar_Info->TarLUNBusy[0] = 1;
30088c2ecf20Sopenharmony_ci
30098c2ecf20Sopenharmony_ci				currSCCB->ControlByte &=
30108c2ecf20Sopenharmony_ci				    ~(unsigned char)F_USE_CMD_Q;
30118c2ecf20Sopenharmony_ci
30128c2ecf20Sopenharmony_ci				WR_HARPOON(port + hp_autostart_1,
30138c2ecf20Sopenharmony_ci					   (AUTO_IMMED + DISCONNECT_START));
30148c2ecf20Sopenharmony_ci
30158c2ecf20Sopenharmony_ci			}
30168c2ecf20Sopenharmony_ci		}
30178c2ecf20Sopenharmony_ci
30188c2ecf20Sopenharmony_ci		else {
30198c2ecf20Sopenharmony_ci			ACCEPT_MSG(port);
30208c2ecf20Sopenharmony_ci
30218c2ecf20Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
30228c2ecf20Sopenharmony_ci			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
30238c2ecf20Sopenharmony_ci			{
30248c2ecf20Sopenharmony_ci			}
30258c2ecf20Sopenharmony_ci
30268c2ecf20Sopenharmony_ci			if (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)) {
30278c2ecf20Sopenharmony_ci				WR_HARPOON(port + hp_autostart_1,
30288c2ecf20Sopenharmony_ci					   (AUTO_IMMED + DISCONNECT_START));
30298c2ecf20Sopenharmony_ci			}
30308c2ecf20Sopenharmony_ci		}
30318c2ecf20Sopenharmony_ci	}
30328c2ecf20Sopenharmony_ci
30338c2ecf20Sopenharmony_ci	else if (message == SMEXT) {
30348c2ecf20Sopenharmony_ci
30358c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);
30368c2ecf20Sopenharmony_ci		FPT_shandem(port, p_card, currSCCB);
30378c2ecf20Sopenharmony_ci	}
30388c2ecf20Sopenharmony_ci
30398c2ecf20Sopenharmony_ci	else if (message == SMIGNORWR) {
30408c2ecf20Sopenharmony_ci
30418c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);	/* ACK the RESIDUE MSG */
30428c2ecf20Sopenharmony_ci
30438c2ecf20Sopenharmony_ci		message = FPT_sfm(port, currSCCB);
30448c2ecf20Sopenharmony_ci
30458c2ecf20Sopenharmony_ci		if (currSCCB->Sccb_scsimsg != SMPARITY)
30468c2ecf20Sopenharmony_ci			ACCEPT_MSG(port);
30478c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
30488c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
30498c2ecf20Sopenharmony_ci	}
30508c2ecf20Sopenharmony_ci
30518c2ecf20Sopenharmony_ci	else {
30528c2ecf20Sopenharmony_ci
30538c2ecf20Sopenharmony_ci		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
30548c2ecf20Sopenharmony_ci		currSCCB->Sccb_scsimsg = SMREJECT;
30558c2ecf20Sopenharmony_ci
30568c2ecf20Sopenharmony_ci		ACCEPT_MSG_ATN(port);
30578c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
30588c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
30598c2ecf20Sopenharmony_ci	}
30608c2ecf20Sopenharmony_ci}
30618c2ecf20Sopenharmony_ci
30628c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
30638c2ecf20Sopenharmony_ci *
30648c2ecf20Sopenharmony_ci * Function: FPT_shandem
30658c2ecf20Sopenharmony_ci *
30668c2ecf20Sopenharmony_ci * Description: Decide what to do with the extended message.
30678c2ecf20Sopenharmony_ci *
30688c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
30698c2ecf20Sopenharmony_cistatic void FPT_shandem(u32 port, unsigned char p_card, struct sccb *pCurrSCCB)
30708c2ecf20Sopenharmony_ci{
30718c2ecf20Sopenharmony_ci	unsigned char length, message;
30728c2ecf20Sopenharmony_ci
30738c2ecf20Sopenharmony_ci	length = FPT_sfm(port, pCurrSCCB);
30748c2ecf20Sopenharmony_ci	if (length) {
30758c2ecf20Sopenharmony_ci
30768c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);
30778c2ecf20Sopenharmony_ci		message = FPT_sfm(port, pCurrSCCB);
30788c2ecf20Sopenharmony_ci		if (message) {
30798c2ecf20Sopenharmony_ci
30808c2ecf20Sopenharmony_ci			if (message == SMSYNC) {
30818c2ecf20Sopenharmony_ci
30828c2ecf20Sopenharmony_ci				if (length == 0x03) {
30838c2ecf20Sopenharmony_ci
30848c2ecf20Sopenharmony_ci					ACCEPT_MSG(port);
30858c2ecf20Sopenharmony_ci					FPT_stsyncn(port, p_card);
30868c2ecf20Sopenharmony_ci				} else {
30878c2ecf20Sopenharmony_ci
30888c2ecf20Sopenharmony_ci					pCurrSCCB->Sccb_scsimsg = SMREJECT;
30898c2ecf20Sopenharmony_ci					ACCEPT_MSG_ATN(port);
30908c2ecf20Sopenharmony_ci				}
30918c2ecf20Sopenharmony_ci			} else if (message == SMWDTR) {
30928c2ecf20Sopenharmony_ci
30938c2ecf20Sopenharmony_ci				if (length == 0x02) {
30948c2ecf20Sopenharmony_ci
30958c2ecf20Sopenharmony_ci					ACCEPT_MSG(port);
30968c2ecf20Sopenharmony_ci					FPT_stwidn(port, p_card);
30978c2ecf20Sopenharmony_ci				} else {
30988c2ecf20Sopenharmony_ci
30998c2ecf20Sopenharmony_ci					pCurrSCCB->Sccb_scsimsg = SMREJECT;
31008c2ecf20Sopenharmony_ci					ACCEPT_MSG_ATN(port);
31018c2ecf20Sopenharmony_ci
31028c2ecf20Sopenharmony_ci					WR_HARPOON(port + hp_autostart_1,
31038c2ecf20Sopenharmony_ci						   (AUTO_IMMED +
31048c2ecf20Sopenharmony_ci						    DISCONNECT_START));
31058c2ecf20Sopenharmony_ci				}
31068c2ecf20Sopenharmony_ci			} else {
31078c2ecf20Sopenharmony_ci
31088c2ecf20Sopenharmony_ci				pCurrSCCB->Sccb_scsimsg = SMREJECT;
31098c2ecf20Sopenharmony_ci				ACCEPT_MSG_ATN(port);
31108c2ecf20Sopenharmony_ci
31118c2ecf20Sopenharmony_ci				WR_HARPOON(port + hp_autostart_1,
31128c2ecf20Sopenharmony_ci					   (AUTO_IMMED + DISCONNECT_START));
31138c2ecf20Sopenharmony_ci			}
31148c2ecf20Sopenharmony_ci		} else {
31158c2ecf20Sopenharmony_ci			if (pCurrSCCB->Sccb_scsimsg != SMPARITY)
31168c2ecf20Sopenharmony_ci				ACCEPT_MSG(port);
31178c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
31188c2ecf20Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
31198c2ecf20Sopenharmony_ci		}
31208c2ecf20Sopenharmony_ci	} else {
31218c2ecf20Sopenharmony_ci		if (pCurrSCCB->Sccb_scsimsg == SMPARITY)
31228c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
31238c2ecf20Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
31248c2ecf20Sopenharmony_ci	}
31258c2ecf20Sopenharmony_ci}
31268c2ecf20Sopenharmony_ci
31278c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
31288c2ecf20Sopenharmony_ci *
31298c2ecf20Sopenharmony_ci * Function: FPT_sisyncn
31308c2ecf20Sopenharmony_ci *
31318c2ecf20Sopenharmony_ci * Description: Read in a message byte from the SCSI bus, and check
31328c2ecf20Sopenharmony_ci *              for a parity error.
31338c2ecf20Sopenharmony_ci *
31348c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
31358c2ecf20Sopenharmony_ci
31368c2ecf20Sopenharmony_cistatic unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
31378c2ecf20Sopenharmony_ci				 unsigned char syncFlag)
31388c2ecf20Sopenharmony_ci{
31398c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
31408c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
31418c2ecf20Sopenharmony_ci
31428c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
31438c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
31448c2ecf20Sopenharmony_ci
31458c2ecf20Sopenharmony_ci	if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
31468c2ecf20Sopenharmony_ci
31478c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT),
31488c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT +
31498c2ecf20Sopenharmony_ci			     (currSCCB->
31508c2ecf20Sopenharmony_ci			      Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
31518c2ecf20Sopenharmony_ci
31528c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
31538c2ecf20Sopenharmony_ci
31548c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 0),
31558c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT + SMEXT));
31568c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
31578c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 4),
31588c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT + SMSYNC));
31598c2ecf20Sopenharmony_ci
31608c2ecf20Sopenharmony_ci		if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
31618c2ecf20Sopenharmony_ci
31628c2ecf20Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
31638c2ecf20Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 12));
31648c2ecf20Sopenharmony_ci
31658c2ecf20Sopenharmony_ci		else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
31668c2ecf20Sopenharmony_ci			 EE_SYNC_10MB)
31678c2ecf20Sopenharmony_ci
31688c2ecf20Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
31698c2ecf20Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 25));
31708c2ecf20Sopenharmony_ci
31718c2ecf20Sopenharmony_ci		else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
31728c2ecf20Sopenharmony_ci			 EE_SYNC_5MB)
31738c2ecf20Sopenharmony_ci
31748c2ecf20Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
31758c2ecf20Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 50));
31768c2ecf20Sopenharmony_ci
31778c2ecf20Sopenharmony_ci		else
31788c2ecf20Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
31798c2ecf20Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 00));
31808c2ecf20Sopenharmony_ci
31818c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
31828c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 10),
31838c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT + DEFAULT_OFFSET));
31848c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
31858c2ecf20Sopenharmony_ci
31868c2ecf20Sopenharmony_ci		if (syncFlag == 0) {
31878c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_3,
31888c2ecf20Sopenharmony_ci				   (SELECT + SELCHK_STRT));
31898c2ecf20Sopenharmony_ci			currTar_Info->TarStatus =
31908c2ecf20Sopenharmony_ci			    ((currTar_Info->
31918c2ecf20Sopenharmony_ci			      TarStatus & ~(unsigned char)TAR_SYNC_MASK) |
31928c2ecf20Sopenharmony_ci			     (unsigned char)SYNC_TRYING);
31938c2ecf20Sopenharmony_ci		} else {
31948c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_3,
31958c2ecf20Sopenharmony_ci				   (AUTO_IMMED + CMD_ONLY_STRT));
31968c2ecf20Sopenharmony_ci		}
31978c2ecf20Sopenharmony_ci
31988c2ecf20Sopenharmony_ci		return 1;
31998c2ecf20Sopenharmony_ci	}
32008c2ecf20Sopenharmony_ci
32018c2ecf20Sopenharmony_ci	else {
32028c2ecf20Sopenharmony_ci
32038c2ecf20Sopenharmony_ci		currTar_Info->TarStatus |= (unsigned char)SYNC_SUPPORTED;
32048c2ecf20Sopenharmony_ci		currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
32058c2ecf20Sopenharmony_ci		return 0;
32068c2ecf20Sopenharmony_ci	}
32078c2ecf20Sopenharmony_ci}
32088c2ecf20Sopenharmony_ci
32098c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
32108c2ecf20Sopenharmony_ci *
32118c2ecf20Sopenharmony_ci * Function: FPT_stsyncn
32128c2ecf20Sopenharmony_ci *
32138c2ecf20Sopenharmony_ci * Description: The has sent us a Sync Nego message so handle it as
32148c2ecf20Sopenharmony_ci *              necessary.
32158c2ecf20Sopenharmony_ci *
32168c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
32178c2ecf20Sopenharmony_cistatic void FPT_stsyncn(u32 port, unsigned char p_card)
32188c2ecf20Sopenharmony_ci{
32198c2ecf20Sopenharmony_ci	unsigned char sync_msg, offset, sync_reg, our_sync_msg;
32208c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
32218c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
32228c2ecf20Sopenharmony_ci
32238c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
32248c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
32258c2ecf20Sopenharmony_ci
32268c2ecf20Sopenharmony_ci	sync_msg = FPT_sfm(port, currSCCB);
32278c2ecf20Sopenharmony_ci
32288c2ecf20Sopenharmony_ci	if ((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
32298c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
32308c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
32318c2ecf20Sopenharmony_ci		return;
32328c2ecf20Sopenharmony_ci	}
32338c2ecf20Sopenharmony_ci
32348c2ecf20Sopenharmony_ci	ACCEPT_MSG(port);
32358c2ecf20Sopenharmony_ci
32368c2ecf20Sopenharmony_ci	offset = FPT_sfm(port, currSCCB);
32378c2ecf20Sopenharmony_ci
32388c2ecf20Sopenharmony_ci	if ((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
32398c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
32408c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
32418c2ecf20Sopenharmony_ci		return;
32428c2ecf20Sopenharmony_ci	}
32438c2ecf20Sopenharmony_ci
32448c2ecf20Sopenharmony_ci	if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
32458c2ecf20Sopenharmony_ci
32468c2ecf20Sopenharmony_ci		our_sync_msg = 12;	/* Setup our Message to 20mb/s */
32478c2ecf20Sopenharmony_ci
32488c2ecf20Sopenharmony_ci	else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
32498c2ecf20Sopenharmony_ci
32508c2ecf20Sopenharmony_ci		our_sync_msg = 25;	/* Setup our Message to 10mb/s */
32518c2ecf20Sopenharmony_ci
32528c2ecf20Sopenharmony_ci	else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
32538c2ecf20Sopenharmony_ci
32548c2ecf20Sopenharmony_ci		our_sync_msg = 50;	/* Setup our Message to 5mb/s */
32558c2ecf20Sopenharmony_ci	else
32568c2ecf20Sopenharmony_ci
32578c2ecf20Sopenharmony_ci		our_sync_msg = 0;	/* Message = Async */
32588c2ecf20Sopenharmony_ci
32598c2ecf20Sopenharmony_ci	if (sync_msg < our_sync_msg) {
32608c2ecf20Sopenharmony_ci		sync_msg = our_sync_msg;	/*if faster, then set to max. */
32618c2ecf20Sopenharmony_ci	}
32628c2ecf20Sopenharmony_ci
32638c2ecf20Sopenharmony_ci	if (offset == ASYNC)
32648c2ecf20Sopenharmony_ci		sync_msg = ASYNC;
32658c2ecf20Sopenharmony_ci
32668c2ecf20Sopenharmony_ci	if (offset > MAX_OFFSET)
32678c2ecf20Sopenharmony_ci		offset = MAX_OFFSET;
32688c2ecf20Sopenharmony_ci
32698c2ecf20Sopenharmony_ci	sync_reg = 0x00;
32708c2ecf20Sopenharmony_ci
32718c2ecf20Sopenharmony_ci	if (sync_msg > 12)
32728c2ecf20Sopenharmony_ci
32738c2ecf20Sopenharmony_ci		sync_reg = 0x20;	/* Use 10MB/s */
32748c2ecf20Sopenharmony_ci
32758c2ecf20Sopenharmony_ci	if (sync_msg > 25)
32768c2ecf20Sopenharmony_ci
32778c2ecf20Sopenharmony_ci		sync_reg = 0x40;	/* Use 6.6MB/s */
32788c2ecf20Sopenharmony_ci
32798c2ecf20Sopenharmony_ci	if (sync_msg > 38)
32808c2ecf20Sopenharmony_ci
32818c2ecf20Sopenharmony_ci		sync_reg = 0x60;	/* Use 5MB/s */
32828c2ecf20Sopenharmony_ci
32838c2ecf20Sopenharmony_ci	if (sync_msg > 50)
32848c2ecf20Sopenharmony_ci
32858c2ecf20Sopenharmony_ci		sync_reg = 0x80;	/* Use 4MB/s */
32868c2ecf20Sopenharmony_ci
32878c2ecf20Sopenharmony_ci	if (sync_msg > 62)
32888c2ecf20Sopenharmony_ci
32898c2ecf20Sopenharmony_ci		sync_reg = 0xA0;	/* Use 3.33MB/s */
32908c2ecf20Sopenharmony_ci
32918c2ecf20Sopenharmony_ci	if (sync_msg > 75)
32928c2ecf20Sopenharmony_ci
32938c2ecf20Sopenharmony_ci		sync_reg = 0xC0;	/* Use 2.85MB/s */
32948c2ecf20Sopenharmony_ci
32958c2ecf20Sopenharmony_ci	if (sync_msg > 87)
32968c2ecf20Sopenharmony_ci
32978c2ecf20Sopenharmony_ci		sync_reg = 0xE0;	/* Use 2.5MB/s */
32988c2ecf20Sopenharmony_ci
32998c2ecf20Sopenharmony_ci	if (sync_msg > 100) {
33008c2ecf20Sopenharmony_ci
33018c2ecf20Sopenharmony_ci		sync_reg = 0x00;	/* Use ASYNC */
33028c2ecf20Sopenharmony_ci		offset = 0x00;
33038c2ecf20Sopenharmony_ci	}
33048c2ecf20Sopenharmony_ci
33058c2ecf20Sopenharmony_ci	if (currTar_Info->TarStatus & WIDE_ENABLED)
33068c2ecf20Sopenharmony_ci
33078c2ecf20Sopenharmony_ci		sync_reg |= offset;
33088c2ecf20Sopenharmony_ci
33098c2ecf20Sopenharmony_ci	else
33108c2ecf20Sopenharmony_ci
33118c2ecf20Sopenharmony_ci		sync_reg |= (offset | NARROW_SCSI);
33128c2ecf20Sopenharmony_ci
33138c2ecf20Sopenharmony_ci	FPT_sssyncv(port, currSCCB->TargID, sync_reg, currTar_Info);
33148c2ecf20Sopenharmony_ci
33158c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
33168c2ecf20Sopenharmony_ci
33178c2ecf20Sopenharmony_ci		ACCEPT_MSG(port);
33188c2ecf20Sopenharmony_ci
33198c2ecf20Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
33208c2ecf20Sopenharmony_ci					    ~(unsigned char)TAR_SYNC_MASK) |
33218c2ecf20Sopenharmony_ci					   (unsigned char)SYNC_SUPPORTED);
33228c2ecf20Sopenharmony_ci
33238c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
33248c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
33258c2ecf20Sopenharmony_ci	}
33268c2ecf20Sopenharmony_ci
33278c2ecf20Sopenharmony_ci	else {
33288c2ecf20Sopenharmony_ci
33298c2ecf20Sopenharmony_ci		ACCEPT_MSG_ATN(port);
33308c2ecf20Sopenharmony_ci
33318c2ecf20Sopenharmony_ci		FPT_sisyncr(port, sync_msg, offset);
33328c2ecf20Sopenharmony_ci
33338c2ecf20Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
33348c2ecf20Sopenharmony_ci					    ~(unsigned char)TAR_SYNC_MASK) |
33358c2ecf20Sopenharmony_ci					   (unsigned char)SYNC_SUPPORTED);
33368c2ecf20Sopenharmony_ci	}
33378c2ecf20Sopenharmony_ci}
33388c2ecf20Sopenharmony_ci
33398c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
33408c2ecf20Sopenharmony_ci *
33418c2ecf20Sopenharmony_ci * Function: FPT_sisyncr
33428c2ecf20Sopenharmony_ci *
33438c2ecf20Sopenharmony_ci * Description: Answer the targets sync message.
33448c2ecf20Sopenharmony_ci *
33458c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
33468c2ecf20Sopenharmony_cistatic void FPT_sisyncr(u32 port, unsigned char sync_pulse,
33478c2ecf20Sopenharmony_ci			unsigned char offset)
33488c2ecf20Sopenharmony_ci{
33498c2ecf20Sopenharmony_ci	ARAM_ACCESS(port);
33508c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT));
33518c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
33528c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMSYNC));
33538c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 6), (MPM_OP + AMSG_OUT + sync_pulse));
33548c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
33558c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 10), (MPM_OP + AMSG_OUT + offset));
33568c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
33578c2ecf20Sopenharmony_ci	SGRAM_ACCESS(port);
33588c2ecf20Sopenharmony_ci
33598c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
33608c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
33618c2ecf20Sopenharmony_ci
33628c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
33638c2ecf20Sopenharmony_ci
33648c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
33658c2ecf20Sopenharmony_ci	}
33668c2ecf20Sopenharmony_ci}
33678c2ecf20Sopenharmony_ci
33688c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
33698c2ecf20Sopenharmony_ci *
33708c2ecf20Sopenharmony_ci * Function: FPT_siwidn
33718c2ecf20Sopenharmony_ci *
33728c2ecf20Sopenharmony_ci * Description: Read in a message byte from the SCSI bus, and check
33738c2ecf20Sopenharmony_ci *              for a parity error.
33748c2ecf20Sopenharmony_ci *
33758c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
33768c2ecf20Sopenharmony_ci
33778c2ecf20Sopenharmony_cistatic unsigned char FPT_siwidn(u32 port, unsigned char p_card)
33788c2ecf20Sopenharmony_ci{
33798c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
33808c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
33818c2ecf20Sopenharmony_ci
33828c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
33838c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
33848c2ecf20Sopenharmony_ci
33858c2ecf20Sopenharmony_ci	if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
33868c2ecf20Sopenharmony_ci
33878c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT),
33888c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT +
33898c2ecf20Sopenharmony_ci			     (currSCCB->
33908c2ecf20Sopenharmony_ci			      Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
33918c2ecf20Sopenharmony_ci
33928c2ecf20Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
33938c2ecf20Sopenharmony_ci
33948c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 0),
33958c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT + SMEXT));
33968c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
33978c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 4),
33988c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT + SMWDTR));
33998c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
34008c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 8),
34018c2ecf20Sopenharmony_ci			    (MPM_OP + AMSG_OUT + SM16BIT));
34028c2ecf20Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
34038c2ecf20Sopenharmony_ci
34048c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
34058c2ecf20Sopenharmony_ci
34068c2ecf20Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
34078c2ecf20Sopenharmony_ci					    ~(unsigned char)TAR_WIDE_MASK) |
34088c2ecf20Sopenharmony_ci					   (unsigned char)WIDE_ENABLED);
34098c2ecf20Sopenharmony_ci
34108c2ecf20Sopenharmony_ci		return 1;
34118c2ecf20Sopenharmony_ci	}
34128c2ecf20Sopenharmony_ci
34138c2ecf20Sopenharmony_ci	else {
34148c2ecf20Sopenharmony_ci
34158c2ecf20Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
34168c2ecf20Sopenharmony_ci					    ~(unsigned char)TAR_WIDE_MASK) |
34178c2ecf20Sopenharmony_ci					   WIDE_NEGOCIATED);
34188c2ecf20Sopenharmony_ci
34198c2ecf20Sopenharmony_ci		currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
34208c2ecf20Sopenharmony_ci		return 0;
34218c2ecf20Sopenharmony_ci	}
34228c2ecf20Sopenharmony_ci}
34238c2ecf20Sopenharmony_ci
34248c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
34258c2ecf20Sopenharmony_ci *
34268c2ecf20Sopenharmony_ci * Function: FPT_stwidn
34278c2ecf20Sopenharmony_ci *
34288c2ecf20Sopenharmony_ci * Description: The has sent us a Wide Nego message so handle it as
34298c2ecf20Sopenharmony_ci *              necessary.
34308c2ecf20Sopenharmony_ci *
34318c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
34328c2ecf20Sopenharmony_cistatic void FPT_stwidn(u32 port, unsigned char p_card)
34338c2ecf20Sopenharmony_ci{
34348c2ecf20Sopenharmony_ci	unsigned char width;
34358c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
34368c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
34378c2ecf20Sopenharmony_ci
34388c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
34398c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
34408c2ecf20Sopenharmony_ci
34418c2ecf20Sopenharmony_ci	width = FPT_sfm(port, currSCCB);
34428c2ecf20Sopenharmony_ci
34438c2ecf20Sopenharmony_ci	if ((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
34448c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
34458c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
34468c2ecf20Sopenharmony_ci		return;
34478c2ecf20Sopenharmony_ci	}
34488c2ecf20Sopenharmony_ci
34498c2ecf20Sopenharmony_ci	if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
34508c2ecf20Sopenharmony_ci		width = 0;
34518c2ecf20Sopenharmony_ci
34528c2ecf20Sopenharmony_ci	if (width) {
34538c2ecf20Sopenharmony_ci		currTar_Info->TarStatus |= WIDE_ENABLED;
34548c2ecf20Sopenharmony_ci		width = 0;
34558c2ecf20Sopenharmony_ci	} else {
34568c2ecf20Sopenharmony_ci		width = NARROW_SCSI;
34578c2ecf20Sopenharmony_ci		currTar_Info->TarStatus &= ~WIDE_ENABLED;
34588c2ecf20Sopenharmony_ci	}
34598c2ecf20Sopenharmony_ci
34608c2ecf20Sopenharmony_ci	FPT_sssyncv(port, currSCCB->TargID, width, currTar_Info);
34618c2ecf20Sopenharmony_ci
34628c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
34638c2ecf20Sopenharmony_ci
34648c2ecf20Sopenharmony_ci		currTar_Info->TarStatus |= WIDE_NEGOCIATED;
34658c2ecf20Sopenharmony_ci
34668c2ecf20Sopenharmony_ci		if (!
34678c2ecf20Sopenharmony_ci		    ((currTar_Info->TarStatus & TAR_SYNC_MASK) ==
34688c2ecf20Sopenharmony_ci		     SYNC_SUPPORTED)) {
34698c2ecf20Sopenharmony_ci			ACCEPT_MSG_ATN(port);
34708c2ecf20Sopenharmony_ci			ARAM_ACCESS(port);
34718c2ecf20Sopenharmony_ci			FPT_sisyncn(port, p_card, 1);
34728c2ecf20Sopenharmony_ci			currSCCB->Sccb_scsistat = SELECT_SN_ST;
34738c2ecf20Sopenharmony_ci			SGRAM_ACCESS(port);
34748c2ecf20Sopenharmony_ci		} else {
34758c2ecf20Sopenharmony_ci			ACCEPT_MSG(port);
34768c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
34778c2ecf20Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
34788c2ecf20Sopenharmony_ci		}
34798c2ecf20Sopenharmony_ci	}
34808c2ecf20Sopenharmony_ci
34818c2ecf20Sopenharmony_ci	else {
34828c2ecf20Sopenharmony_ci
34838c2ecf20Sopenharmony_ci		ACCEPT_MSG_ATN(port);
34848c2ecf20Sopenharmony_ci
34858c2ecf20Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
34868c2ecf20Sopenharmony_ci			width = SM16BIT;
34878c2ecf20Sopenharmony_ci		else
34888c2ecf20Sopenharmony_ci			width = SM8BIT;
34898c2ecf20Sopenharmony_ci
34908c2ecf20Sopenharmony_ci		FPT_siwidr(port, width);
34918c2ecf20Sopenharmony_ci
34928c2ecf20Sopenharmony_ci		currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
34938c2ecf20Sopenharmony_ci	}
34948c2ecf20Sopenharmony_ci}
34958c2ecf20Sopenharmony_ci
34968c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
34978c2ecf20Sopenharmony_ci *
34988c2ecf20Sopenharmony_ci * Function: FPT_siwidr
34998c2ecf20Sopenharmony_ci *
35008c2ecf20Sopenharmony_ci * Description: Answer the targets Wide nego message.
35018c2ecf20Sopenharmony_ci *
35028c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
35038c2ecf20Sopenharmony_cistatic void FPT_siwidr(u32 port, unsigned char width)
35048c2ecf20Sopenharmony_ci{
35058c2ecf20Sopenharmony_ci	ARAM_ACCESS(port);
35068c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT));
35078c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
35088c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMWDTR));
35098c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
35108c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 8), (MPM_OP + AMSG_OUT + width));
35118c2ecf20Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
35128c2ecf20Sopenharmony_ci	SGRAM_ACCESS(port);
35138c2ecf20Sopenharmony_ci
35148c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
35158c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
35168c2ecf20Sopenharmony_ci
35178c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
35188c2ecf20Sopenharmony_ci
35198c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
35208c2ecf20Sopenharmony_ci	}
35218c2ecf20Sopenharmony_ci}
35228c2ecf20Sopenharmony_ci
35238c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
35248c2ecf20Sopenharmony_ci *
35258c2ecf20Sopenharmony_ci * Function: FPT_sssyncv
35268c2ecf20Sopenharmony_ci *
35278c2ecf20Sopenharmony_ci * Description: Write the desired value to the Sync Register for the
35288c2ecf20Sopenharmony_ci *              ID specified.
35298c2ecf20Sopenharmony_ci *
35308c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
35318c2ecf20Sopenharmony_cistatic void FPT_sssyncv(u32 p_port, unsigned char p_id,
35328c2ecf20Sopenharmony_ci			unsigned char p_sync_value,
35338c2ecf20Sopenharmony_ci			struct sccb_mgr_tar_info *currTar_Info)
35348c2ecf20Sopenharmony_ci{
35358c2ecf20Sopenharmony_ci	unsigned char index;
35368c2ecf20Sopenharmony_ci
35378c2ecf20Sopenharmony_ci	index = p_id;
35388c2ecf20Sopenharmony_ci
35398c2ecf20Sopenharmony_ci	switch (index) {
35408c2ecf20Sopenharmony_ci
35418c2ecf20Sopenharmony_ci	case 0:
35428c2ecf20Sopenharmony_ci		index = 12;	/* hp_synctarg_0 */
35438c2ecf20Sopenharmony_ci		break;
35448c2ecf20Sopenharmony_ci	case 1:
35458c2ecf20Sopenharmony_ci		index = 13;	/* hp_synctarg_1 */
35468c2ecf20Sopenharmony_ci		break;
35478c2ecf20Sopenharmony_ci	case 2:
35488c2ecf20Sopenharmony_ci		index = 14;	/* hp_synctarg_2 */
35498c2ecf20Sopenharmony_ci		break;
35508c2ecf20Sopenharmony_ci	case 3:
35518c2ecf20Sopenharmony_ci		index = 15;	/* hp_synctarg_3 */
35528c2ecf20Sopenharmony_ci		break;
35538c2ecf20Sopenharmony_ci	case 4:
35548c2ecf20Sopenharmony_ci		index = 8;	/* hp_synctarg_4 */
35558c2ecf20Sopenharmony_ci		break;
35568c2ecf20Sopenharmony_ci	case 5:
35578c2ecf20Sopenharmony_ci		index = 9;	/* hp_synctarg_5 */
35588c2ecf20Sopenharmony_ci		break;
35598c2ecf20Sopenharmony_ci	case 6:
35608c2ecf20Sopenharmony_ci		index = 10;	/* hp_synctarg_6 */
35618c2ecf20Sopenharmony_ci		break;
35628c2ecf20Sopenharmony_ci	case 7:
35638c2ecf20Sopenharmony_ci		index = 11;	/* hp_synctarg_7 */
35648c2ecf20Sopenharmony_ci		break;
35658c2ecf20Sopenharmony_ci	case 8:
35668c2ecf20Sopenharmony_ci		index = 4;	/* hp_synctarg_8 */
35678c2ecf20Sopenharmony_ci		break;
35688c2ecf20Sopenharmony_ci	case 9:
35698c2ecf20Sopenharmony_ci		index = 5;	/* hp_synctarg_9 */
35708c2ecf20Sopenharmony_ci		break;
35718c2ecf20Sopenharmony_ci	case 10:
35728c2ecf20Sopenharmony_ci		index = 6;	/* hp_synctarg_10 */
35738c2ecf20Sopenharmony_ci		break;
35748c2ecf20Sopenharmony_ci	case 11:
35758c2ecf20Sopenharmony_ci		index = 7;	/* hp_synctarg_11 */
35768c2ecf20Sopenharmony_ci		break;
35778c2ecf20Sopenharmony_ci	case 12:
35788c2ecf20Sopenharmony_ci		index = 0;	/* hp_synctarg_12 */
35798c2ecf20Sopenharmony_ci		break;
35808c2ecf20Sopenharmony_ci	case 13:
35818c2ecf20Sopenharmony_ci		index = 1;	/* hp_synctarg_13 */
35828c2ecf20Sopenharmony_ci		break;
35838c2ecf20Sopenharmony_ci	case 14:
35848c2ecf20Sopenharmony_ci		index = 2;	/* hp_synctarg_14 */
35858c2ecf20Sopenharmony_ci		break;
35868c2ecf20Sopenharmony_ci	case 15:
35878c2ecf20Sopenharmony_ci		index = 3;	/* hp_synctarg_15 */
35888c2ecf20Sopenharmony_ci
35898c2ecf20Sopenharmony_ci	}
35908c2ecf20Sopenharmony_ci
35918c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_synctarg_base + index, p_sync_value);
35928c2ecf20Sopenharmony_ci
35938c2ecf20Sopenharmony_ci	currTar_Info->TarSyncCtrl = p_sync_value;
35948c2ecf20Sopenharmony_ci}
35958c2ecf20Sopenharmony_ci
35968c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
35978c2ecf20Sopenharmony_ci *
35988c2ecf20Sopenharmony_ci * Function: FPT_sresb
35998c2ecf20Sopenharmony_ci *
36008c2ecf20Sopenharmony_ci * Description: Reset the desired card's SCSI bus.
36018c2ecf20Sopenharmony_ci *
36028c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
36038c2ecf20Sopenharmony_cistatic void FPT_sresb(u32 port, unsigned char p_card)
36048c2ecf20Sopenharmony_ci{
36058c2ecf20Sopenharmony_ci	unsigned char scsiID, i;
36068c2ecf20Sopenharmony_ci
36078c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
36088c2ecf20Sopenharmony_ci
36098c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl,
36108c2ecf20Sopenharmony_ci		   (RD_HARPOON(port + hp_page_ctrl) | G_INT_DISABLE));
36118c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
36128c2ecf20Sopenharmony_ci
36138c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsictrl_0, SCSI_RST);
36148c2ecf20Sopenharmony_ci
36158c2ecf20Sopenharmony_ci	scsiID = RD_HARPOON(port + hp_seltimeout);
36168c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_seltimeout, TO_5ms);
36178c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), TIMEOUT);
36188c2ecf20Sopenharmony_ci
36198c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT | START_TO));
36208c2ecf20Sopenharmony_ci
36218c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & TIMEOUT)) {
36228c2ecf20Sopenharmony_ci	}
36238c2ecf20Sopenharmony_ci
36248c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_seltimeout, scsiID);
36258c2ecf20Sopenharmony_ci
36268c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
36278c2ecf20Sopenharmony_ci
36288c2ecf20Sopenharmony_ci	FPT_Wait(port, TO_5ms);
36298c2ecf20Sopenharmony_ci
36308c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
36318c2ecf20Sopenharmony_ci
36328c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_int_mask, (RD_HARPOON(port + hp_int_mask) | 0x00));
36338c2ecf20Sopenharmony_ci
36348c2ecf20Sopenharmony_ci	for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
36358c2ecf20Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
36368c2ecf20Sopenharmony_ci
36378c2ecf20Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
36388c2ecf20Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
36398c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
36408c2ecf20Sopenharmony_ci		}
36418c2ecf20Sopenharmony_ci
36428c2ecf20Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
36438c2ecf20Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
36448c2ecf20Sopenharmony_ci		}
36458c2ecf20Sopenharmony_ci
36468c2ecf20Sopenharmony_ci		FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
36478c2ecf20Sopenharmony_ci
36488c2ecf20Sopenharmony_ci		FPT_SccbMgrTableInitTarget(p_card, scsiID);
36498c2ecf20Sopenharmony_ci	}
36508c2ecf20Sopenharmony_ci
36518c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].scanIndex = 0x00;
36528c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].currentSCCB = NULL;
36538c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT
36548c2ecf20Sopenharmony_ci					     | F_NEW_SCCB_CMD);
36558c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].cmdCounter = 0x00;
36568c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].discQCount = 0x00;
36578c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].tagQ_Lst = 0x01;
36588c2ecf20Sopenharmony_ci
36598c2ecf20Sopenharmony_ci	for (i = 0; i < QUEUE_DEPTH; i++)
36608c2ecf20Sopenharmony_ci		FPT_BL_Card[p_card].discQ_Tbl[i] = NULL;
36618c2ecf20Sopenharmony_ci
36628c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl,
36638c2ecf20Sopenharmony_ci		   (RD_HARPOON(port + hp_page_ctrl) & ~G_INT_DISABLE));
36648c2ecf20Sopenharmony_ci
36658c2ecf20Sopenharmony_ci}
36668c2ecf20Sopenharmony_ci
36678c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
36688c2ecf20Sopenharmony_ci *
36698c2ecf20Sopenharmony_ci * Function: FPT_ssenss
36708c2ecf20Sopenharmony_ci *
36718c2ecf20Sopenharmony_ci * Description: Setup for the Auto Sense command.
36728c2ecf20Sopenharmony_ci *
36738c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
36748c2ecf20Sopenharmony_cistatic void FPT_ssenss(struct sccb_card *pCurrCard)
36758c2ecf20Sopenharmony_ci{
36768c2ecf20Sopenharmony_ci	unsigned char i;
36778c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
36788c2ecf20Sopenharmony_ci
36798c2ecf20Sopenharmony_ci	currSCCB = pCurrCard->currentSCCB;
36808c2ecf20Sopenharmony_ci
36818c2ecf20Sopenharmony_ci	currSCCB->Save_CdbLen = currSCCB->CdbLength;
36828c2ecf20Sopenharmony_ci
36838c2ecf20Sopenharmony_ci	for (i = 0; i < 6; i++) {
36848c2ecf20Sopenharmony_ci
36858c2ecf20Sopenharmony_ci		currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
36868c2ecf20Sopenharmony_ci	}
36878c2ecf20Sopenharmony_ci
36888c2ecf20Sopenharmony_ci	currSCCB->CdbLength = SIX_BYTE_CMD;
36898c2ecf20Sopenharmony_ci	currSCCB->Cdb[0] = SCSI_REQUEST_SENSE;
36908c2ecf20Sopenharmony_ci	currSCCB->Cdb[1] = currSCCB->Cdb[1] & (unsigned char)0xE0;	/*Keep LUN. */
36918c2ecf20Sopenharmony_ci	currSCCB->Cdb[2] = 0x00;
36928c2ecf20Sopenharmony_ci	currSCCB->Cdb[3] = 0x00;
36938c2ecf20Sopenharmony_ci	currSCCB->Cdb[4] = currSCCB->RequestSenseLength;
36948c2ecf20Sopenharmony_ci	currSCCB->Cdb[5] = 0x00;
36958c2ecf20Sopenharmony_ci
36968c2ecf20Sopenharmony_ci	currSCCB->Sccb_XferCnt = (u32)currSCCB->RequestSenseLength;
36978c2ecf20Sopenharmony_ci
36988c2ecf20Sopenharmony_ci	currSCCB->Sccb_ATC = 0x00;
36998c2ecf20Sopenharmony_ci
37008c2ecf20Sopenharmony_ci	currSCCB->Sccb_XferState |= F_AUTO_SENSE;
37018c2ecf20Sopenharmony_ci
37028c2ecf20Sopenharmony_ci	currSCCB->Sccb_XferState &= ~F_SG_XFER;
37038c2ecf20Sopenharmony_ci
37048c2ecf20Sopenharmony_ci	currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(unsigned char)DISC_PRIV;
37058c2ecf20Sopenharmony_ci
37068c2ecf20Sopenharmony_ci	currSCCB->ControlByte = 0x00;
37078c2ecf20Sopenharmony_ci
37088c2ecf20Sopenharmony_ci	currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
37098c2ecf20Sopenharmony_ci}
37108c2ecf20Sopenharmony_ci
37118c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
37128c2ecf20Sopenharmony_ci *
37138c2ecf20Sopenharmony_ci * Function: FPT_sxfrp
37148c2ecf20Sopenharmony_ci *
37158c2ecf20Sopenharmony_ci * Description: Transfer data into the bit bucket until the device
37168c2ecf20Sopenharmony_ci *              decides to switch phase.
37178c2ecf20Sopenharmony_ci *
37188c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
37198c2ecf20Sopenharmony_ci
37208c2ecf20Sopenharmony_cistatic void FPT_sxfrp(u32 p_port, unsigned char p_card)
37218c2ecf20Sopenharmony_ci{
37228c2ecf20Sopenharmony_ci	unsigned char curr_phz;
37238c2ecf20Sopenharmony_ci
37248c2ecf20Sopenharmony_ci	DISABLE_AUTO(p_port);
37258c2ecf20Sopenharmony_ci
37268c2ecf20Sopenharmony_ci	if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
37278c2ecf20Sopenharmony_ci
37288c2ecf20Sopenharmony_ci		FPT_hostDataXferAbort(p_port, p_card,
37298c2ecf20Sopenharmony_ci				      FPT_BL_Card[p_card].currentSCCB);
37308c2ecf20Sopenharmony_ci
37318c2ecf20Sopenharmony_ci	}
37328c2ecf20Sopenharmony_ci
37338c2ecf20Sopenharmony_ci	/* If the Automation handled the end of the transfer then do not
37348c2ecf20Sopenharmony_ci	   match the phase or we will get out of sync with the ISR.       */
37358c2ecf20Sopenharmony_ci
37368c2ecf20Sopenharmony_ci	if (RDW_HARPOON((p_port + hp_intstat)) &
37378c2ecf20Sopenharmony_ci	    (BUS_FREE | XFER_CNT_0 | AUTO_INT))
37388c2ecf20Sopenharmony_ci		return;
37398c2ecf20Sopenharmony_ci
37408c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_xfercnt_0, 0x00);
37418c2ecf20Sopenharmony_ci
37428c2ecf20Sopenharmony_ci	curr_phz = RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ;
37438c2ecf20Sopenharmony_ci
37448c2ecf20Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), XFER_CNT_0);
37458c2ecf20Sopenharmony_ci
37468c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, curr_phz);
37478c2ecf20Sopenharmony_ci
37488c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET)) &&
37498c2ecf20Sopenharmony_ci	       (curr_phz ==
37508c2ecf20Sopenharmony_ci		(RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ)))
37518c2ecf20Sopenharmony_ci	{
37528c2ecf20Sopenharmony_ci		if (curr_phz & (unsigned char)SCSI_IOBIT) {
37538c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_portctrl_0,
37548c2ecf20Sopenharmony_ci				   (SCSI_PORT | HOST_PORT | SCSI_INBIT));
37558c2ecf20Sopenharmony_ci
37568c2ecf20Sopenharmony_ci			if (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
37578c2ecf20Sopenharmony_ci				RD_HARPOON(p_port + hp_fifodata_0);
37588c2ecf20Sopenharmony_ci			}
37598c2ecf20Sopenharmony_ci		} else {
37608c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_portctrl_0,
37618c2ecf20Sopenharmony_ci				   (SCSI_PORT | HOST_PORT | HOST_WRT));
37628c2ecf20Sopenharmony_ci			if (RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY) {
37638c2ecf20Sopenharmony_ci				WR_HARPOON(p_port + hp_fifodata_0, 0xFA);
37648c2ecf20Sopenharmony_ci			}
37658c2ecf20Sopenharmony_ci		}
37668c2ecf20Sopenharmony_ci	}			/* End of While loop for padding data I/O phase */
37678c2ecf20Sopenharmony_ci
37688c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
37698c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ)
37708c2ecf20Sopenharmony_ci			break;
37718c2ecf20Sopenharmony_ci	}
37728c2ecf20Sopenharmony_ci
37738c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0,
37748c2ecf20Sopenharmony_ci		   (SCSI_PORT | HOST_PORT | SCSI_INBIT));
37758c2ecf20Sopenharmony_ci	while (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
37768c2ecf20Sopenharmony_ci		RD_HARPOON(p_port + hp_fifodata_0);
37778c2ecf20Sopenharmony_ci	}
37788c2ecf20Sopenharmony_ci
37798c2ecf20Sopenharmony_ci	if (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
37808c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_autostart_0,
37818c2ecf20Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
37828c2ecf20Sopenharmony_ci		while (!(RDW_HARPOON((p_port + hp_intstat)) & AUTO_INT)) {
37838c2ecf20Sopenharmony_ci		}
37848c2ecf20Sopenharmony_ci
37858c2ecf20Sopenharmony_ci		if (RDW_HARPOON((p_port + hp_intstat)) &
37868c2ecf20Sopenharmony_ci		    (ICMD_COMP | ITAR_DISC))
37878c2ecf20Sopenharmony_ci			while (!
37888c2ecf20Sopenharmony_ci			       (RDW_HARPOON((p_port + hp_intstat)) &
37898c2ecf20Sopenharmony_ci				(BUS_FREE | RSEL))) ;
37908c2ecf20Sopenharmony_ci	}
37918c2ecf20Sopenharmony_ci}
37928c2ecf20Sopenharmony_ci
37938c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
37948c2ecf20Sopenharmony_ci *
37958c2ecf20Sopenharmony_ci * Function: FPT_schkdd
37968c2ecf20Sopenharmony_ci *
37978c2ecf20Sopenharmony_ci * Description: Make sure data has been flushed from both FIFOs and abort
37988c2ecf20Sopenharmony_ci *              the operations if necessary.
37998c2ecf20Sopenharmony_ci *
38008c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
38018c2ecf20Sopenharmony_ci
38028c2ecf20Sopenharmony_cistatic void FPT_schkdd(u32 port, unsigned char p_card)
38038c2ecf20Sopenharmony_ci{
38048c2ecf20Sopenharmony_ci	unsigned short TimeOutLoop;
38058c2ecf20Sopenharmony_ci	unsigned char sPhase;
38068c2ecf20Sopenharmony_ci
38078c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
38088c2ecf20Sopenharmony_ci
38098c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
38108c2ecf20Sopenharmony_ci
38118c2ecf20Sopenharmony_ci	if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
38128c2ecf20Sopenharmony_ci	    (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
38138c2ecf20Sopenharmony_ci		return;
38148c2ecf20Sopenharmony_ci	}
38158c2ecf20Sopenharmony_ci
38168c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT) {
38178c2ecf20Sopenharmony_ci
38188c2ecf20Sopenharmony_ci		currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - 1);
38198c2ecf20Sopenharmony_ci
38208c2ecf20Sopenharmony_ci		currSCCB->Sccb_XferCnt = 1;
38218c2ecf20Sopenharmony_ci
38228c2ecf20Sopenharmony_ci		currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
38238c2ecf20Sopenharmony_ci		WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
38248c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_xferstat, 0x00);
38258c2ecf20Sopenharmony_ci	}
38268c2ecf20Sopenharmony_ci
38278c2ecf20Sopenharmony_ci	else {
38288c2ecf20Sopenharmony_ci
38298c2ecf20Sopenharmony_ci		currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
38308c2ecf20Sopenharmony_ci
38318c2ecf20Sopenharmony_ci		currSCCB->Sccb_XferCnt = 0;
38328c2ecf20Sopenharmony_ci	}
38338c2ecf20Sopenharmony_ci
38348c2ecf20Sopenharmony_ci	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
38358c2ecf20Sopenharmony_ci	    (currSCCB->HostStatus == SCCB_COMPLETE)) {
38368c2ecf20Sopenharmony_ci
38378c2ecf20Sopenharmony_ci		currSCCB->HostStatus = SCCB_PARITY_ERR;
38388c2ecf20Sopenharmony_ci		WRW_HARPOON((port + hp_intstat), PARITY);
38398c2ecf20Sopenharmony_ci	}
38408c2ecf20Sopenharmony_ci
38418c2ecf20Sopenharmony_ci	FPT_hostDataXferAbort(port, p_card, currSCCB);
38428c2ecf20Sopenharmony_ci
38438c2ecf20Sopenharmony_ci	while (RD_HARPOON(port + hp_scsisig) & SCSI_ACK) {
38448c2ecf20Sopenharmony_ci	}
38458c2ecf20Sopenharmony_ci
38468c2ecf20Sopenharmony_ci	TimeOutLoop = 0;
38478c2ecf20Sopenharmony_ci
38488c2ecf20Sopenharmony_ci	while (RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY) {
38498c2ecf20Sopenharmony_ci		if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
38508c2ecf20Sopenharmony_ci			return;
38518c2ecf20Sopenharmony_ci		}
38528c2ecf20Sopenharmony_ci		if (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) {
38538c2ecf20Sopenharmony_ci			break;
38548c2ecf20Sopenharmony_ci		}
38558c2ecf20Sopenharmony_ci		if (RDW_HARPOON((port + hp_intstat)) & RESET) {
38568c2ecf20Sopenharmony_ci			return;
38578c2ecf20Sopenharmony_ci		}
38588c2ecf20Sopenharmony_ci		if ((RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
38598c2ecf20Sopenharmony_ci		    || (TimeOutLoop++ > 0x3000))
38608c2ecf20Sopenharmony_ci			break;
38618c2ecf20Sopenharmony_ci	}
38628c2ecf20Sopenharmony_ci
38638c2ecf20Sopenharmony_ci	sPhase = RD_HARPOON(port + hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
38648c2ecf20Sopenharmony_ci	if ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) ||
38658c2ecf20Sopenharmony_ci	    (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) ||
38668c2ecf20Sopenharmony_ci	    (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
38678c2ecf20Sopenharmony_ci	    (sPhase == (SCSI_BSY | S_DATAI_PH))) {
38688c2ecf20Sopenharmony_ci
38698c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
38708c2ecf20Sopenharmony_ci
38718c2ecf20Sopenharmony_ci		if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED)) {
38728c2ecf20Sopenharmony_ci			if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
38738c2ecf20Sopenharmony_ci				FPT_phaseDataIn(port, p_card);
38748c2ecf20Sopenharmony_ci			}
38758c2ecf20Sopenharmony_ci
38768c2ecf20Sopenharmony_ci			else {
38778c2ecf20Sopenharmony_ci				FPT_phaseDataOut(port, p_card);
38788c2ecf20Sopenharmony_ci			}
38798c2ecf20Sopenharmony_ci		} else {
38808c2ecf20Sopenharmony_ci			FPT_sxfrp(port, p_card);
38818c2ecf20Sopenharmony_ci			if (!(RDW_HARPOON((port + hp_intstat)) &
38828c2ecf20Sopenharmony_ci			      (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET))) {
38838c2ecf20Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), AUTO_INT);
38848c2ecf20Sopenharmony_ci				FPT_phaseDecode(port, p_card);
38858c2ecf20Sopenharmony_ci			}
38868c2ecf20Sopenharmony_ci		}
38878c2ecf20Sopenharmony_ci
38888c2ecf20Sopenharmony_ci	}
38898c2ecf20Sopenharmony_ci
38908c2ecf20Sopenharmony_ci	else {
38918c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, 0x00);
38928c2ecf20Sopenharmony_ci	}
38938c2ecf20Sopenharmony_ci}
38948c2ecf20Sopenharmony_ci
38958c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
38968c2ecf20Sopenharmony_ci *
38978c2ecf20Sopenharmony_ci * Function: FPT_sinits
38988c2ecf20Sopenharmony_ci *
38998c2ecf20Sopenharmony_ci * Description: Setup SCCB manager fields in this SCCB.
39008c2ecf20Sopenharmony_ci *
39018c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
39028c2ecf20Sopenharmony_ci
39038c2ecf20Sopenharmony_cistatic void FPT_sinits(struct sccb *p_sccb, unsigned char p_card)
39048c2ecf20Sopenharmony_ci{
39058c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
39068c2ecf20Sopenharmony_ci
39078c2ecf20Sopenharmony_ci	if ((p_sccb->TargID >= MAX_SCSI_TAR) || (p_sccb->Lun >= MAX_LUN)) {
39088c2ecf20Sopenharmony_ci		return;
39098c2ecf20Sopenharmony_ci	}
39108c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
39118c2ecf20Sopenharmony_ci
39128c2ecf20Sopenharmony_ci	p_sccb->Sccb_XferState = 0x00;
39138c2ecf20Sopenharmony_ci	p_sccb->Sccb_XferCnt = p_sccb->DataLength;
39148c2ecf20Sopenharmony_ci
39158c2ecf20Sopenharmony_ci	if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
39168c2ecf20Sopenharmony_ci	    (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
39178c2ecf20Sopenharmony_ci
39188c2ecf20Sopenharmony_ci		p_sccb->Sccb_SGoffset = 0;
39198c2ecf20Sopenharmony_ci		p_sccb->Sccb_XferState = F_SG_XFER;
39208c2ecf20Sopenharmony_ci		p_sccb->Sccb_XferCnt = 0x00;
39218c2ecf20Sopenharmony_ci	}
39228c2ecf20Sopenharmony_ci
39238c2ecf20Sopenharmony_ci	if (p_sccb->DataLength == 0x00)
39248c2ecf20Sopenharmony_ci
39258c2ecf20Sopenharmony_ci		p_sccb->Sccb_XferState |= F_ALL_XFERRED;
39268c2ecf20Sopenharmony_ci
39278c2ecf20Sopenharmony_ci	if (p_sccb->ControlByte & F_USE_CMD_Q) {
39288c2ecf20Sopenharmony_ci		if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
39298c2ecf20Sopenharmony_ci			p_sccb->ControlByte &= ~F_USE_CMD_Q;
39308c2ecf20Sopenharmony_ci
39318c2ecf20Sopenharmony_ci		else
39328c2ecf20Sopenharmony_ci			currTar_Info->TarStatus |= TAG_Q_TRYING;
39338c2ecf20Sopenharmony_ci	}
39348c2ecf20Sopenharmony_ci
39358c2ecf20Sopenharmony_ci/*      For !single SCSI device in system  & device allow Disconnect
39368c2ecf20Sopenharmony_ci	or command is tag_q type then send Cmd with Disconnect Enable
39378c2ecf20Sopenharmony_ci	else send Cmd with Disconnect Disable */
39388c2ecf20Sopenharmony_ci
39398c2ecf20Sopenharmony_ci/*
39408c2ecf20Sopenharmony_ci   if (((!(FPT_BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
39418c2ecf20Sopenharmony_ci      (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
39428c2ecf20Sopenharmony_ci      (currTar_Info->TarStatus & TAG_Q_TRYING)) {
39438c2ecf20Sopenharmony_ci*/
39448c2ecf20Sopenharmony_ci	if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
39458c2ecf20Sopenharmony_ci	    (currTar_Info->TarStatus & TAG_Q_TRYING)) {
39468c2ecf20Sopenharmony_ci		p_sccb->Sccb_idmsg =
39478c2ecf20Sopenharmony_ci		    (unsigned char)(SMIDENT | DISC_PRIV) | p_sccb->Lun;
39488c2ecf20Sopenharmony_ci	}
39498c2ecf20Sopenharmony_ci
39508c2ecf20Sopenharmony_ci	else {
39518c2ecf20Sopenharmony_ci
39528c2ecf20Sopenharmony_ci		p_sccb->Sccb_idmsg = (unsigned char)SMIDENT | p_sccb->Lun;
39538c2ecf20Sopenharmony_ci	}
39548c2ecf20Sopenharmony_ci
39558c2ecf20Sopenharmony_ci	p_sccb->HostStatus = 0x00;
39568c2ecf20Sopenharmony_ci	p_sccb->TargetStatus = 0x00;
39578c2ecf20Sopenharmony_ci	p_sccb->Sccb_tag = 0x00;
39588c2ecf20Sopenharmony_ci	p_sccb->Sccb_MGRFlags = 0x00;
39598c2ecf20Sopenharmony_ci	p_sccb->Sccb_sgseg = 0x00;
39608c2ecf20Sopenharmony_ci	p_sccb->Sccb_ATC = 0x00;
39618c2ecf20Sopenharmony_ci	p_sccb->Sccb_savedATC = 0x00;
39628c2ecf20Sopenharmony_ci/*
39638c2ecf20Sopenharmony_ci   p_sccb->SccbVirtDataPtr    = 0x00;
39648c2ecf20Sopenharmony_ci   p_sccb->Sccb_forwardlink   = NULL;
39658c2ecf20Sopenharmony_ci   p_sccb->Sccb_backlink      = NULL;
39668c2ecf20Sopenharmony_ci */
39678c2ecf20Sopenharmony_ci	p_sccb->Sccb_scsistat = BUS_FREE_ST;
39688c2ecf20Sopenharmony_ci	p_sccb->SccbStatus = SCCB_IN_PROCESS;
39698c2ecf20Sopenharmony_ci	p_sccb->Sccb_scsimsg = SMNO_OP;
39708c2ecf20Sopenharmony_ci
39718c2ecf20Sopenharmony_ci}
39728c2ecf20Sopenharmony_ci
39738c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
39748c2ecf20Sopenharmony_ci *
39758c2ecf20Sopenharmony_ci * Function: Phase Decode
39768c2ecf20Sopenharmony_ci *
39778c2ecf20Sopenharmony_ci * Description: Determine the phase and call the appropriate function.
39788c2ecf20Sopenharmony_ci *
39798c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
39808c2ecf20Sopenharmony_ci
39818c2ecf20Sopenharmony_cistatic void FPT_phaseDecode(u32 p_port, unsigned char p_card)
39828c2ecf20Sopenharmony_ci{
39838c2ecf20Sopenharmony_ci	unsigned char phase_ref;
39848c2ecf20Sopenharmony_ci	void (*phase) (u32, unsigned char);
39858c2ecf20Sopenharmony_ci
39868c2ecf20Sopenharmony_ci	DISABLE_AUTO(p_port);
39878c2ecf20Sopenharmony_ci
39888c2ecf20Sopenharmony_ci	phase_ref =
39898c2ecf20Sopenharmony_ci	    (unsigned char)(RD_HARPOON(p_port + hp_scsisig) & S_SCSI_PHZ);
39908c2ecf20Sopenharmony_ci
39918c2ecf20Sopenharmony_ci	phase = FPT_s_PhaseTbl[phase_ref];
39928c2ecf20Sopenharmony_ci
39938c2ecf20Sopenharmony_ci	(*phase) (p_port, p_card);	/* Call the correct phase func */
39948c2ecf20Sopenharmony_ci}
39958c2ecf20Sopenharmony_ci
39968c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
39978c2ecf20Sopenharmony_ci *
39988c2ecf20Sopenharmony_ci * Function: Data Out Phase
39998c2ecf20Sopenharmony_ci *
40008c2ecf20Sopenharmony_ci * Description: Start up both the BusMaster and Xbow.
40018c2ecf20Sopenharmony_ci *
40028c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
40038c2ecf20Sopenharmony_ci
40048c2ecf20Sopenharmony_cistatic void FPT_phaseDataOut(u32 port, unsigned char p_card)
40058c2ecf20Sopenharmony_ci{
40068c2ecf20Sopenharmony_ci
40078c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
40088c2ecf20Sopenharmony_ci
40098c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
40108c2ecf20Sopenharmony_ci	if (currSCCB == NULL) {
40118c2ecf20Sopenharmony_ci		return;		/* Exit if No SCCB record */
40128c2ecf20Sopenharmony_ci	}
40138c2ecf20Sopenharmony_ci
40148c2ecf20Sopenharmony_ci	currSCCB->Sccb_scsistat = DATA_OUT_ST;
40158c2ecf20Sopenharmony_ci	currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
40168c2ecf20Sopenharmony_ci
40178c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
40188c2ecf20Sopenharmony_ci
40198c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
40208c2ecf20Sopenharmony_ci
40218c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
40228c2ecf20Sopenharmony_ci
40238c2ecf20Sopenharmony_ci	FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
40248c2ecf20Sopenharmony_ci
40258c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_XferCnt == 0) {
40268c2ecf20Sopenharmony_ci
40278c2ecf20Sopenharmony_ci		if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
40288c2ecf20Sopenharmony_ci		    (currSCCB->HostStatus == SCCB_COMPLETE))
40298c2ecf20Sopenharmony_ci			currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
40308c2ecf20Sopenharmony_ci
40318c2ecf20Sopenharmony_ci		FPT_sxfrp(port, p_card);
40328c2ecf20Sopenharmony_ci		if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
40338c2ecf20Sopenharmony_ci			FPT_phaseDecode(port, p_card);
40348c2ecf20Sopenharmony_ci	}
40358c2ecf20Sopenharmony_ci}
40368c2ecf20Sopenharmony_ci
40378c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
40388c2ecf20Sopenharmony_ci *
40398c2ecf20Sopenharmony_ci * Function: Data In Phase
40408c2ecf20Sopenharmony_ci *
40418c2ecf20Sopenharmony_ci * Description: Startup the BusMaster and the XBOW.
40428c2ecf20Sopenharmony_ci *
40438c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
40448c2ecf20Sopenharmony_ci
40458c2ecf20Sopenharmony_cistatic void FPT_phaseDataIn(u32 port, unsigned char p_card)
40468c2ecf20Sopenharmony_ci{
40478c2ecf20Sopenharmony_ci
40488c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
40498c2ecf20Sopenharmony_ci
40508c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
40518c2ecf20Sopenharmony_ci
40528c2ecf20Sopenharmony_ci	if (currSCCB == NULL) {
40538c2ecf20Sopenharmony_ci		return;		/* Exit if No SCCB record */
40548c2ecf20Sopenharmony_ci	}
40558c2ecf20Sopenharmony_ci
40568c2ecf20Sopenharmony_ci	currSCCB->Sccb_scsistat = DATA_IN_ST;
40578c2ecf20Sopenharmony_ci	currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
40588c2ecf20Sopenharmony_ci	currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
40598c2ecf20Sopenharmony_ci
40608c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
40618c2ecf20Sopenharmony_ci
40628c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
40638c2ecf20Sopenharmony_ci
40648c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
40658c2ecf20Sopenharmony_ci
40668c2ecf20Sopenharmony_ci	FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
40678c2ecf20Sopenharmony_ci
40688c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_XferCnt == 0) {
40698c2ecf20Sopenharmony_ci
40708c2ecf20Sopenharmony_ci		if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
40718c2ecf20Sopenharmony_ci		    (currSCCB->HostStatus == SCCB_COMPLETE))
40728c2ecf20Sopenharmony_ci			currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
40738c2ecf20Sopenharmony_ci
40748c2ecf20Sopenharmony_ci		FPT_sxfrp(port, p_card);
40758c2ecf20Sopenharmony_ci		if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
40768c2ecf20Sopenharmony_ci			FPT_phaseDecode(port, p_card);
40778c2ecf20Sopenharmony_ci
40788c2ecf20Sopenharmony_ci	}
40798c2ecf20Sopenharmony_ci}
40808c2ecf20Sopenharmony_ci
40818c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
40828c2ecf20Sopenharmony_ci *
40838c2ecf20Sopenharmony_ci * Function: Command Phase
40848c2ecf20Sopenharmony_ci *
40858c2ecf20Sopenharmony_ci * Description: Load the CDB into the automation and start it up.
40868c2ecf20Sopenharmony_ci *
40878c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
40888c2ecf20Sopenharmony_ci
40898c2ecf20Sopenharmony_cistatic void FPT_phaseCommand(u32 p_port, unsigned char p_card)
40908c2ecf20Sopenharmony_ci{
40918c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
40928c2ecf20Sopenharmony_ci	u32 cdb_reg;
40938c2ecf20Sopenharmony_ci	unsigned char i;
40948c2ecf20Sopenharmony_ci
40958c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
40968c2ecf20Sopenharmony_ci
40978c2ecf20Sopenharmony_ci	if (currSCCB->OperationCode == RESET_COMMAND) {
40988c2ecf20Sopenharmony_ci
40998c2ecf20Sopenharmony_ci		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
41008c2ecf20Sopenharmony_ci		currSCCB->CdbLength = SIX_BYTE_CMD;
41018c2ecf20Sopenharmony_ci	}
41028c2ecf20Sopenharmony_ci
41038c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, 0x00);
41048c2ecf20Sopenharmony_ci
41058c2ecf20Sopenharmony_ci	ARAM_ACCESS(p_port);
41068c2ecf20Sopenharmony_ci
41078c2ecf20Sopenharmony_ci	cdb_reg = p_port + CMD_STRT;
41088c2ecf20Sopenharmony_ci
41098c2ecf20Sopenharmony_ci	for (i = 0; i < currSCCB->CdbLength; i++) {
41108c2ecf20Sopenharmony_ci
41118c2ecf20Sopenharmony_ci		if (currSCCB->OperationCode == RESET_COMMAND)
41128c2ecf20Sopenharmony_ci
41138c2ecf20Sopenharmony_ci			WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
41148c2ecf20Sopenharmony_ci
41158c2ecf20Sopenharmony_ci		else
41168c2ecf20Sopenharmony_ci			WRW_HARPOON(cdb_reg,
41178c2ecf20Sopenharmony_ci				    (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
41188c2ecf20Sopenharmony_ci		cdb_reg += 2;
41198c2ecf20Sopenharmony_ci	}
41208c2ecf20Sopenharmony_ci
41218c2ecf20Sopenharmony_ci	if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
41228c2ecf20Sopenharmony_ci		WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
41238c2ecf20Sopenharmony_ci
41248c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, (SCSI_PORT));
41258c2ecf20Sopenharmony_ci
41268c2ecf20Sopenharmony_ci	currSCCB->Sccb_scsistat = COMMAND_ST;
41278c2ecf20Sopenharmony_ci
41288c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
41298c2ecf20Sopenharmony_ci	SGRAM_ACCESS(p_port);
41308c2ecf20Sopenharmony_ci}
41318c2ecf20Sopenharmony_ci
41328c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
41338c2ecf20Sopenharmony_ci *
41348c2ecf20Sopenharmony_ci * Function: Status phase
41358c2ecf20Sopenharmony_ci *
41368c2ecf20Sopenharmony_ci * Description: Bring in the status and command complete message bytes
41378c2ecf20Sopenharmony_ci *
41388c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
41398c2ecf20Sopenharmony_ci
41408c2ecf20Sopenharmony_cistatic void FPT_phaseStatus(u32 port, unsigned char p_card)
41418c2ecf20Sopenharmony_ci{
41428c2ecf20Sopenharmony_ci	/* Start-up the automation to finish off this command and let the
41438c2ecf20Sopenharmony_ci	   isr handle the interrupt for command complete when it comes in.
41448c2ecf20Sopenharmony_ci	   We could wait here for the interrupt to be generated?
41458c2ecf20Sopenharmony_ci	 */
41468c2ecf20Sopenharmony_ci
41478c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, 0x00);
41488c2ecf20Sopenharmony_ci
41498c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_autostart_0, (AUTO_IMMED + END_DATA_START));
41508c2ecf20Sopenharmony_ci}
41518c2ecf20Sopenharmony_ci
41528c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
41538c2ecf20Sopenharmony_ci *
41548c2ecf20Sopenharmony_ci * Function: Phase Message Out
41558c2ecf20Sopenharmony_ci *
41568c2ecf20Sopenharmony_ci * Description: Send out our message (if we have one) and handle whatever
41578c2ecf20Sopenharmony_ci *              else is involed.
41588c2ecf20Sopenharmony_ci *
41598c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
41608c2ecf20Sopenharmony_ci
41618c2ecf20Sopenharmony_cistatic void FPT_phaseMsgOut(u32 port, unsigned char p_card)
41628c2ecf20Sopenharmony_ci{
41638c2ecf20Sopenharmony_ci	unsigned char message, scsiID;
41648c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
41658c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
41668c2ecf20Sopenharmony_ci
41678c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
41688c2ecf20Sopenharmony_ci
41698c2ecf20Sopenharmony_ci	if (currSCCB != NULL) {
41708c2ecf20Sopenharmony_ci
41718c2ecf20Sopenharmony_ci		message = currSCCB->Sccb_scsimsg;
41728c2ecf20Sopenharmony_ci		scsiID = currSCCB->TargID;
41738c2ecf20Sopenharmony_ci
41748c2ecf20Sopenharmony_ci		if (message == SMDEV_RESET) {
41758c2ecf20Sopenharmony_ci
41768c2ecf20Sopenharmony_ci			currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
41778c2ecf20Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
41788c2ecf20Sopenharmony_ci			FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
41798c2ecf20Sopenharmony_ci
41808c2ecf20Sopenharmony_ci			if (FPT_sccbMgrTbl[p_card][scsiID].
41818c2ecf20Sopenharmony_ci			    TarEEValue & EE_SYNC_MASK) {
41828c2ecf20Sopenharmony_ci
41838c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
41848c2ecf20Sopenharmony_ci				    ~TAR_SYNC_MASK;
41858c2ecf20Sopenharmony_ci
41868c2ecf20Sopenharmony_ci			}
41878c2ecf20Sopenharmony_ci
41888c2ecf20Sopenharmony_ci			if (FPT_sccbMgrTbl[p_card][scsiID].
41898c2ecf20Sopenharmony_ci			    TarEEValue & EE_WIDE_SCSI) {
41908c2ecf20Sopenharmony_ci
41918c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
41928c2ecf20Sopenharmony_ci				    ~TAR_WIDE_MASK;
41938c2ecf20Sopenharmony_ci			}
41948c2ecf20Sopenharmony_ci
41958c2ecf20Sopenharmony_ci			FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
41968c2ecf20Sopenharmony_ci			FPT_SccbMgrTableInitTarget(p_card, scsiID);
41978c2ecf20Sopenharmony_ci		} else if (currSCCB->Sccb_scsistat == ABORT_ST) {
41988c2ecf20Sopenharmony_ci			currSCCB->HostStatus = SCCB_COMPLETE;
41998c2ecf20Sopenharmony_ci			if (FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] !=
42008c2ecf20Sopenharmony_ci			    NULL) {
42018c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
42028c2ecf20Sopenharmony_ci							      Sccb_tag] = NULL;
42038c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
42048c2ecf20Sopenharmony_ci			}
42058c2ecf20Sopenharmony_ci
42068c2ecf20Sopenharmony_ci		}
42078c2ecf20Sopenharmony_ci
42088c2ecf20Sopenharmony_ci		else if (currSCCB->Sccb_scsistat < COMMAND_ST) {
42098c2ecf20Sopenharmony_ci
42108c2ecf20Sopenharmony_ci			if (message == SMNO_OP) {
42118c2ecf20Sopenharmony_ci				currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
42128c2ecf20Sopenharmony_ci
42138c2ecf20Sopenharmony_ci				FPT_ssel(port, p_card);
42148c2ecf20Sopenharmony_ci				return;
42158c2ecf20Sopenharmony_ci			}
42168c2ecf20Sopenharmony_ci		} else {
42178c2ecf20Sopenharmony_ci
42188c2ecf20Sopenharmony_ci			if (message == SMABORT)
42198c2ecf20Sopenharmony_ci
42208c2ecf20Sopenharmony_ci				FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
42218c2ecf20Sopenharmony_ci		}
42228c2ecf20Sopenharmony_ci
42238c2ecf20Sopenharmony_ci	} else {
42248c2ecf20Sopenharmony_ci		message = SMABORT;
42258c2ecf20Sopenharmony_ci	}
42268c2ecf20Sopenharmony_ci
42278c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
42288c2ecf20Sopenharmony_ci
42298c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
42308c2ecf20Sopenharmony_ci
42318c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsidata_0, message);
42328c2ecf20Sopenharmony_ci
42338c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
42348c2ecf20Sopenharmony_ci
42358c2ecf20Sopenharmony_ci	ACCEPT_MSG(port);
42368c2ecf20Sopenharmony_ci
42378c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, 0x00);
42388c2ecf20Sopenharmony_ci
42398c2ecf20Sopenharmony_ci	if ((message == SMABORT) || (message == SMDEV_RESET) ||
42408c2ecf20Sopenharmony_ci	    (message == SMABORT_TAG)) {
42418c2ecf20Sopenharmony_ci
42428c2ecf20Sopenharmony_ci		while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | PHASE))) {
42438c2ecf20Sopenharmony_ci		}
42448c2ecf20Sopenharmony_ci
42458c2ecf20Sopenharmony_ci		if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
42468c2ecf20Sopenharmony_ci			WRW_HARPOON((port + hp_intstat), BUS_FREE);
42478c2ecf20Sopenharmony_ci
42488c2ecf20Sopenharmony_ci			if (currSCCB != NULL) {
42498c2ecf20Sopenharmony_ci
42508c2ecf20Sopenharmony_ci				if ((FPT_BL_Card[p_card].
42518c2ecf20Sopenharmony_ci				     globalFlags & F_CONLUN_IO)
42528c2ecf20Sopenharmony_ci				    &&
42538c2ecf20Sopenharmony_ci				    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
42548c2ecf20Sopenharmony_ci				      TarStatus & TAR_TAG_Q_MASK) !=
42558c2ecf20Sopenharmony_ci				     TAG_Q_TRYING))
42568c2ecf20Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
42578c2ecf20Sopenharmony_ci							       TargID].
42588c2ecf20Sopenharmony_ci					    TarLUNBusy[currSCCB->Lun] = 0;
42598c2ecf20Sopenharmony_ci				else
42608c2ecf20Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
42618c2ecf20Sopenharmony_ci							       TargID].
42628c2ecf20Sopenharmony_ci					    TarLUNBusy[0] = 0;
42638c2ecf20Sopenharmony_ci
42648c2ecf20Sopenharmony_ci				FPT_queueCmdComplete(&FPT_BL_Card[p_card],
42658c2ecf20Sopenharmony_ci						     currSCCB, p_card);
42668c2ecf20Sopenharmony_ci			}
42678c2ecf20Sopenharmony_ci
42688c2ecf20Sopenharmony_ci			else {
42698c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].globalFlags |=
42708c2ecf20Sopenharmony_ci				    F_NEW_SCCB_CMD;
42718c2ecf20Sopenharmony_ci			}
42728c2ecf20Sopenharmony_ci		}
42738c2ecf20Sopenharmony_ci
42748c2ecf20Sopenharmony_ci		else {
42758c2ecf20Sopenharmony_ci
42768c2ecf20Sopenharmony_ci			FPT_sxfrp(port, p_card);
42778c2ecf20Sopenharmony_ci		}
42788c2ecf20Sopenharmony_ci	}
42798c2ecf20Sopenharmony_ci
42808c2ecf20Sopenharmony_ci	else {
42818c2ecf20Sopenharmony_ci
42828c2ecf20Sopenharmony_ci		if (message == SMPARITY) {
42838c2ecf20Sopenharmony_ci			currSCCB->Sccb_scsimsg = SMNO_OP;
42848c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
42858c2ecf20Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
42868c2ecf20Sopenharmony_ci		} else {
42878c2ecf20Sopenharmony_ci			FPT_sxfrp(port, p_card);
42888c2ecf20Sopenharmony_ci		}
42898c2ecf20Sopenharmony_ci	}
42908c2ecf20Sopenharmony_ci}
42918c2ecf20Sopenharmony_ci
42928c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
42938c2ecf20Sopenharmony_ci *
42948c2ecf20Sopenharmony_ci * Function: Message In phase
42958c2ecf20Sopenharmony_ci *
42968c2ecf20Sopenharmony_ci * Description: Bring in the message and determine what to do with it.
42978c2ecf20Sopenharmony_ci *
42988c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
42998c2ecf20Sopenharmony_ci
43008c2ecf20Sopenharmony_cistatic void FPT_phaseMsgIn(u32 port, unsigned char p_card)
43018c2ecf20Sopenharmony_ci{
43028c2ecf20Sopenharmony_ci	unsigned char message;
43038c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
43048c2ecf20Sopenharmony_ci
43058c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
43068c2ecf20Sopenharmony_ci
43078c2ecf20Sopenharmony_ci	if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
43088c2ecf20Sopenharmony_ci
43098c2ecf20Sopenharmony_ci		FPT_phaseChkFifo(port, p_card);
43108c2ecf20Sopenharmony_ci	}
43118c2ecf20Sopenharmony_ci
43128c2ecf20Sopenharmony_ci	message = RD_HARPOON(port + hp_scsidata_0);
43138c2ecf20Sopenharmony_ci	if ((message == SMDISC) || (message == SMSAVE_DATA_PTR)) {
43148c2ecf20Sopenharmony_ci
43158c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
43168c2ecf20Sopenharmony_ci			   (AUTO_IMMED + END_DATA_START));
43178c2ecf20Sopenharmony_ci
43188c2ecf20Sopenharmony_ci	}
43198c2ecf20Sopenharmony_ci
43208c2ecf20Sopenharmony_ci	else {
43218c2ecf20Sopenharmony_ci
43228c2ecf20Sopenharmony_ci		message = FPT_sfm(port, currSCCB);
43238c2ecf20Sopenharmony_ci		if (message) {
43248c2ecf20Sopenharmony_ci
43258c2ecf20Sopenharmony_ci			FPT_sdecm(message, port, p_card);
43268c2ecf20Sopenharmony_ci
43278c2ecf20Sopenharmony_ci		} else {
43288c2ecf20Sopenharmony_ci			if (currSCCB->Sccb_scsimsg != SMPARITY)
43298c2ecf20Sopenharmony_ci				ACCEPT_MSG(port);
43308c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
43318c2ecf20Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
43328c2ecf20Sopenharmony_ci		}
43338c2ecf20Sopenharmony_ci	}
43348c2ecf20Sopenharmony_ci
43358c2ecf20Sopenharmony_ci}
43368c2ecf20Sopenharmony_ci
43378c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
43388c2ecf20Sopenharmony_ci *
43398c2ecf20Sopenharmony_ci * Function: Illegal phase
43408c2ecf20Sopenharmony_ci *
43418c2ecf20Sopenharmony_ci * Description: Target switched to some illegal phase, so all we can do
43428c2ecf20Sopenharmony_ci *              is report an error back to the host (if that is possible)
43438c2ecf20Sopenharmony_ci *              and send an ABORT message to the misbehaving target.
43448c2ecf20Sopenharmony_ci *
43458c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
43468c2ecf20Sopenharmony_ci
43478c2ecf20Sopenharmony_cistatic void FPT_phaseIllegal(u32 port, unsigned char p_card)
43488c2ecf20Sopenharmony_ci{
43498c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
43508c2ecf20Sopenharmony_ci
43518c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
43528c2ecf20Sopenharmony_ci
43538c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, RD_HARPOON(port + hp_scsisig));
43548c2ecf20Sopenharmony_ci	if (currSCCB != NULL) {
43558c2ecf20Sopenharmony_ci
43568c2ecf20Sopenharmony_ci		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
43578c2ecf20Sopenharmony_ci		currSCCB->Sccb_scsistat = ABORT_ST;
43588c2ecf20Sopenharmony_ci		currSCCB->Sccb_scsimsg = SMABORT;
43598c2ecf20Sopenharmony_ci	}
43608c2ecf20Sopenharmony_ci
43618c2ecf20Sopenharmony_ci	ACCEPT_MSG_ATN(port);
43628c2ecf20Sopenharmony_ci}
43638c2ecf20Sopenharmony_ci
43648c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
43658c2ecf20Sopenharmony_ci *
43668c2ecf20Sopenharmony_ci * Function: Phase Check FIFO
43678c2ecf20Sopenharmony_ci *
43688c2ecf20Sopenharmony_ci * Description: Make sure data has been flushed from both FIFOs and abort
43698c2ecf20Sopenharmony_ci *              the operations if necessary.
43708c2ecf20Sopenharmony_ci *
43718c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
43728c2ecf20Sopenharmony_ci
43738c2ecf20Sopenharmony_cistatic void FPT_phaseChkFifo(u32 port, unsigned char p_card)
43748c2ecf20Sopenharmony_ci{
43758c2ecf20Sopenharmony_ci	u32 xfercnt;
43768c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
43778c2ecf20Sopenharmony_ci
43788c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
43798c2ecf20Sopenharmony_ci
43808c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_scsistat == DATA_IN_ST) {
43818c2ecf20Sopenharmony_ci
43828c2ecf20Sopenharmony_ci		while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) &&
43838c2ecf20Sopenharmony_ci		       (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)) {
43848c2ecf20Sopenharmony_ci		}
43858c2ecf20Sopenharmony_ci
43868c2ecf20Sopenharmony_ci		if (!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) {
43878c2ecf20Sopenharmony_ci			currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
43888c2ecf20Sopenharmony_ci
43898c2ecf20Sopenharmony_ci			currSCCB->Sccb_XferCnt = 0;
43908c2ecf20Sopenharmony_ci
43918c2ecf20Sopenharmony_ci			if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
43928c2ecf20Sopenharmony_ci			    (currSCCB->HostStatus == SCCB_COMPLETE)) {
43938c2ecf20Sopenharmony_ci				currSCCB->HostStatus = SCCB_PARITY_ERR;
43948c2ecf20Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PARITY);
43958c2ecf20Sopenharmony_ci			}
43968c2ecf20Sopenharmony_ci
43978c2ecf20Sopenharmony_ci			FPT_hostDataXferAbort(port, p_card, currSCCB);
43988c2ecf20Sopenharmony_ci
43998c2ecf20Sopenharmony_ci			FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
44008c2ecf20Sopenharmony_ci
44018c2ecf20Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY))
44028c2ecf20Sopenharmony_ci			       && (RD_HARPOON(port + hp_ext_status) &
44038c2ecf20Sopenharmony_ci				   BM_CMD_BUSY)) {
44048c2ecf20Sopenharmony_ci			}
44058c2ecf20Sopenharmony_ci
44068c2ecf20Sopenharmony_ci		}
44078c2ecf20Sopenharmony_ci	}
44088c2ecf20Sopenharmony_ci
44098c2ecf20Sopenharmony_ci	/*End Data In specific code. */
44108c2ecf20Sopenharmony_ci	GET_XFER_CNT(port, xfercnt);
44118c2ecf20Sopenharmony_ci
44128c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_xfercnt_0, 0x00);
44138c2ecf20Sopenharmony_ci
44148c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, 0x00);
44158c2ecf20Sopenharmony_ci
44168c2ecf20Sopenharmony_ci	currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
44178c2ecf20Sopenharmony_ci
44188c2ecf20Sopenharmony_ci	currSCCB->Sccb_XferCnt = xfercnt;
44198c2ecf20Sopenharmony_ci
44208c2ecf20Sopenharmony_ci	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
44218c2ecf20Sopenharmony_ci	    (currSCCB->HostStatus == SCCB_COMPLETE)) {
44228c2ecf20Sopenharmony_ci
44238c2ecf20Sopenharmony_ci		currSCCB->HostStatus = SCCB_PARITY_ERR;
44248c2ecf20Sopenharmony_ci		WRW_HARPOON((port + hp_intstat), PARITY);
44258c2ecf20Sopenharmony_ci	}
44268c2ecf20Sopenharmony_ci
44278c2ecf20Sopenharmony_ci	FPT_hostDataXferAbort(port, p_card, currSCCB);
44288c2ecf20Sopenharmony_ci
44298c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_fifowrite, 0x00);
44308c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_fiforead, 0x00);
44318c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_xferstat, 0x00);
44328c2ecf20Sopenharmony_ci
44338c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
44348c2ecf20Sopenharmony_ci}
44358c2ecf20Sopenharmony_ci
44368c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
44378c2ecf20Sopenharmony_ci *
44388c2ecf20Sopenharmony_ci * Function: Phase Bus Free
44398c2ecf20Sopenharmony_ci *
44408c2ecf20Sopenharmony_ci * Description: We just went bus free so figure out if it was
44418c2ecf20Sopenharmony_ci *              because of command complete or from a disconnect.
44428c2ecf20Sopenharmony_ci *
44438c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
44448c2ecf20Sopenharmony_cistatic void FPT_phaseBusFree(u32 port, unsigned char p_card)
44458c2ecf20Sopenharmony_ci{
44468c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
44478c2ecf20Sopenharmony_ci
44488c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
44498c2ecf20Sopenharmony_ci
44508c2ecf20Sopenharmony_ci	if (currSCCB != NULL) {
44518c2ecf20Sopenharmony_ci
44528c2ecf20Sopenharmony_ci		DISABLE_AUTO(port);
44538c2ecf20Sopenharmony_ci
44548c2ecf20Sopenharmony_ci		if (currSCCB->OperationCode == RESET_COMMAND) {
44558c2ecf20Sopenharmony_ci
44568c2ecf20Sopenharmony_ci			if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
44578c2ecf20Sopenharmony_ci			    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
44588c2ecf20Sopenharmony_ci			      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
44598c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
44608c2ecf20Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 0;
44618c2ecf20Sopenharmony_ci			else
44628c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
44638c2ecf20Sopenharmony_ci				    TarLUNBusy[0] = 0;
44648c2ecf20Sopenharmony_ci
44658c2ecf20Sopenharmony_ci			FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
44668c2ecf20Sopenharmony_ci					     p_card);
44678c2ecf20Sopenharmony_ci
44688c2ecf20Sopenharmony_ci			FPT_queueSearchSelect(&FPT_BL_Card[p_card], p_card);
44698c2ecf20Sopenharmony_ci
44708c2ecf20Sopenharmony_ci		}
44718c2ecf20Sopenharmony_ci
44728c2ecf20Sopenharmony_ci		else if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
44738c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
44748c2ecf20Sopenharmony_ci			    (unsigned char)SYNC_SUPPORTED;
44758c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
44768c2ecf20Sopenharmony_ci			    ~EE_SYNC_MASK;
44778c2ecf20Sopenharmony_ci		}
44788c2ecf20Sopenharmony_ci
44798c2ecf20Sopenharmony_ci		else if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
44808c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
44818c2ecf20Sopenharmony_ci			    (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
44828c2ecf20Sopenharmony_ci			     TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
44838c2ecf20Sopenharmony_ci
44848c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
44858c2ecf20Sopenharmony_ci			    ~EE_WIDE_SCSI;
44868c2ecf20Sopenharmony_ci		}
44878c2ecf20Sopenharmony_ci
44888c2ecf20Sopenharmony_ci		else if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
44898c2ecf20Sopenharmony_ci			/* Make sure this is not a phony BUS_FREE.  If we were
44908c2ecf20Sopenharmony_ci			   reselected or if BUSY is NOT on then this is a
44918c2ecf20Sopenharmony_ci			   valid BUS FREE.  SRR Wednesday, 5/10/1995.     */
44928c2ecf20Sopenharmony_ci
44938c2ecf20Sopenharmony_ci			if ((!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ||
44948c2ecf20Sopenharmony_ci			    (RDW_HARPOON((port + hp_intstat)) & RSEL)) {
44958c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
44968c2ecf20Sopenharmony_ci				    TarStatus &= ~TAR_TAG_Q_MASK;
44978c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
44988c2ecf20Sopenharmony_ci				    TarStatus |= TAG_Q_REJECT;
44998c2ecf20Sopenharmony_ci			}
45008c2ecf20Sopenharmony_ci
45018c2ecf20Sopenharmony_ci			else {
45028c2ecf20Sopenharmony_ci				return;
45038c2ecf20Sopenharmony_ci			}
45048c2ecf20Sopenharmony_ci		}
45058c2ecf20Sopenharmony_ci
45068c2ecf20Sopenharmony_ci		else {
45078c2ecf20Sopenharmony_ci
45088c2ecf20Sopenharmony_ci			currSCCB->Sccb_scsistat = BUS_FREE_ST;
45098c2ecf20Sopenharmony_ci
45108c2ecf20Sopenharmony_ci			if (!currSCCB->HostStatus) {
45118c2ecf20Sopenharmony_ci				currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
45128c2ecf20Sopenharmony_ci			}
45138c2ecf20Sopenharmony_ci
45148c2ecf20Sopenharmony_ci			if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
45158c2ecf20Sopenharmony_ci			    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
45168c2ecf20Sopenharmony_ci			      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
45178c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
45188c2ecf20Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 0;
45198c2ecf20Sopenharmony_ci			else
45208c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
45218c2ecf20Sopenharmony_ci				    TarLUNBusy[0] = 0;
45228c2ecf20Sopenharmony_ci
45238c2ecf20Sopenharmony_ci			FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
45248c2ecf20Sopenharmony_ci					     p_card);
45258c2ecf20Sopenharmony_ci			return;
45268c2ecf20Sopenharmony_ci		}
45278c2ecf20Sopenharmony_ci
45288c2ecf20Sopenharmony_ci		FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
45298c2ecf20Sopenharmony_ci
45308c2ecf20Sopenharmony_ci	}			/*end if !=null */
45318c2ecf20Sopenharmony_ci}
45328c2ecf20Sopenharmony_ci
45338c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
45348c2ecf20Sopenharmony_ci *
45358c2ecf20Sopenharmony_ci * Function: Auto Load Default Map
45368c2ecf20Sopenharmony_ci *
45378c2ecf20Sopenharmony_ci * Description: Load the Automation RAM with the defualt map values.
45388c2ecf20Sopenharmony_ci *
45398c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
45408c2ecf20Sopenharmony_cistatic void FPT_autoLoadDefaultMap(u32 p_port)
45418c2ecf20Sopenharmony_ci{
45428c2ecf20Sopenharmony_ci	u32 map_addr;
45438c2ecf20Sopenharmony_ci
45448c2ecf20Sopenharmony_ci	ARAM_ACCESS(p_port);
45458c2ecf20Sopenharmony_ci	map_addr = p_port + hp_aramBase;
45468c2ecf20Sopenharmony_ci
45478c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0xC0));	/*ID MESSAGE */
45488c2ecf20Sopenharmony_ci	map_addr += 2;
45498c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x20));	/*SIMPLE TAG QUEUEING MSG */
45508c2ecf20Sopenharmony_ci	map_addr += 2;
45518c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, RAT_OP);	/*RESET ATTENTION */
45528c2ecf20Sopenharmony_ci	map_addr += 2;
45538c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x00));	/*TAG ID MSG */
45548c2ecf20Sopenharmony_ci	map_addr += 2;
45558c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 0 */
45568c2ecf20Sopenharmony_ci	map_addr += 2;
45578c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 1 */
45588c2ecf20Sopenharmony_ci	map_addr += 2;
45598c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 2 */
45608c2ecf20Sopenharmony_ci	map_addr += 2;
45618c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 3 */
45628c2ecf20Sopenharmony_ci	map_addr += 2;
45638c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 4 */
45648c2ecf20Sopenharmony_ci	map_addr += 2;
45658c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 5 */
45668c2ecf20Sopenharmony_ci	map_addr += 2;
45678c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 6 */
45688c2ecf20Sopenharmony_ci	map_addr += 2;
45698c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 7 */
45708c2ecf20Sopenharmony_ci	map_addr += 2;
45718c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 8 */
45728c2ecf20Sopenharmony_ci	map_addr += 2;
45738c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 9 */
45748c2ecf20Sopenharmony_ci	map_addr += 2;
45758c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 10 */
45768c2ecf20Sopenharmony_ci	map_addr += 2;
45778c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 11 */
45788c2ecf20Sopenharmony_ci	map_addr += 2;
45798c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CPE_OP + ADATA_OUT + DINT));	/*JUMP IF DATA OUT */
45808c2ecf20Sopenharmony_ci	map_addr += 2;
45818c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (TCB_OP + FIFO_0 + DI));	/*JUMP IF NO DATA IN FIFO */
45828c2ecf20Sopenharmony_ci	map_addr += 2;		/*This means AYNC DATA IN */
45838c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_IDO_STRT));	/*STOP AND INTERRUPT */
45848c2ecf20Sopenharmony_ci	map_addr += 2;
45858c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CPE_OP + ADATA_IN + DINT));	/*JUMP IF NOT DATA IN PHZ */
45868c2ecf20Sopenharmony_ci	map_addr += 2;
45878c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST));	/*IF NOT MSG IN CHECK 4 DATA IN */
45888c2ecf20Sopenharmony_ci	map_addr += 2;
45898c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x02));	/*SAVE DATA PTR MSG? */
45908c2ecf20Sopenharmony_ci	map_addr += 2;
45918c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + DC));	/*GO CHECK FOR DISCONNECT MSG */
45928c2ecf20Sopenharmony_ci	map_addr += 2;
45938c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR1));	/*SAVE DATA PTRS MSG */
45948c2ecf20Sopenharmony_ci	map_addr += 2;
45958c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST));	/*IF NOT MSG IN CHECK DATA IN */
45968c2ecf20Sopenharmony_ci	map_addr += 2;
45978c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x04));	/*DISCONNECT MSG? */
45988c2ecf20Sopenharmony_ci	map_addr += 2;
45998c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + UNKNWN));	/*UKNKNOWN MSG */
46008c2ecf20Sopenharmony_ci	map_addr += 2;
46018c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET));	/*XFER DISCONNECT MSG */
46028c2ecf20Sopenharmony_ci	map_addr += 2;
46038c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_ITAR_DISC));	/*STOP AND INTERRUPT */
46048c2ecf20Sopenharmony_ci	map_addr += 2;
46058c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + ASTATUS + UNKNWN));	/*JUMP IF NOT STATUS PHZ. */
46068c2ecf20Sopenharmony_ci	map_addr += 2;
46078c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR0));	/*GET STATUS BYTE */
46088c2ecf20Sopenharmony_ci	map_addr += 2;
46098c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + CC));	/*ERROR IF NOT MSG IN PHZ */
46108c2ecf20Sopenharmony_ci	map_addr += 2;
46118c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x00));	/*CHECK FOR CMD COMPLETE MSG. */
46128c2ecf20Sopenharmony_ci	map_addr += 2;
46138c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + CC));	/*ERROR IF NOT CMD COMPLETE MSG. */
46148c2ecf20Sopenharmony_ci	map_addr += 2;
46158c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET));	/*GET CMD COMPLETE MSG */
46168c2ecf20Sopenharmony_ci	map_addr += 2;
46178c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_ICMD_COMP));	/*END OF COMMAND */
46188c2ecf20Sopenharmony_ci	map_addr += 2;
46198c2ecf20Sopenharmony_ci
46208c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_IUNKWN));	/*RECEIVED UNKNOWN MSG BYTE */
46218c2ecf20Sopenharmony_ci	map_addr += 2;
46228c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC));	/*NO COMMAND COMPLETE AFTER STATUS */
46238c2ecf20Sopenharmony_ci	map_addr += 2;
46248c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_ITICKLE));	/*BIOS Tickled the Mgr */
46258c2ecf20Sopenharmony_ci	map_addr += 2;
46268c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_IRFAIL));	/*EXPECTED ID/TAG MESSAGES AND */
46278c2ecf20Sopenharmony_ci	map_addr += 2;		/* DIDN'T GET ONE */
46288c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (CRR_OP + AR3 + S_IDREG));	/* comp SCSI SEL ID & AR3 */
46298c2ecf20Sopenharmony_ci	map_addr += 2;
46308c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + EQUAL + 0x00));	/*SEL ID OK then Conti. */
46318c2ecf20Sopenharmony_ci	map_addr += 2;
46328c2ecf20Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC));	/*NO COMMAND COMPLETE AFTER STATUS */
46338c2ecf20Sopenharmony_ci
46348c2ecf20Sopenharmony_ci	SGRAM_ACCESS(p_port);
46358c2ecf20Sopenharmony_ci}
46368c2ecf20Sopenharmony_ci
46378c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
46388c2ecf20Sopenharmony_ci *
46398c2ecf20Sopenharmony_ci * Function: Auto Command Complete
46408c2ecf20Sopenharmony_ci *
46418c2ecf20Sopenharmony_ci * Description: Post command back to host and find another command
46428c2ecf20Sopenharmony_ci *              to execute.
46438c2ecf20Sopenharmony_ci *
46448c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
46458c2ecf20Sopenharmony_ci
46468c2ecf20Sopenharmony_cistatic void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card)
46478c2ecf20Sopenharmony_ci{
46488c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
46498c2ecf20Sopenharmony_ci	unsigned char status_byte;
46508c2ecf20Sopenharmony_ci
46518c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
46528c2ecf20Sopenharmony_ci
46538c2ecf20Sopenharmony_ci	status_byte = RD_HARPOON(p_port + hp_gp_reg_0);
46548c2ecf20Sopenharmony_ci
46558c2ecf20Sopenharmony_ci	FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0;
46568c2ecf20Sopenharmony_ci
46578c2ecf20Sopenharmony_ci	if (status_byte != SSGOOD) {
46588c2ecf20Sopenharmony_ci
46598c2ecf20Sopenharmony_ci		if (status_byte == SSQ_FULL) {
46608c2ecf20Sopenharmony_ci
46618c2ecf20Sopenharmony_ci			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
46628c2ecf20Sopenharmony_ci			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
46638c2ecf20Sopenharmony_ci			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
46648c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
46658c2ecf20Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 1;
46668c2ecf20Sopenharmony_ci				if (FPT_BL_Card[p_card].discQCount != 0)
46678c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].discQCount--;
46688c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].
46698c2ecf20Sopenharmony_ci				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
46708c2ecf20Sopenharmony_ci					      [currSCCB->TargID].
46718c2ecf20Sopenharmony_ci					      LunDiscQ_Idx[currSCCB->Lun]] =
46728c2ecf20Sopenharmony_ci				    NULL;
46738c2ecf20Sopenharmony_ci			} else {
46748c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
46758c2ecf20Sopenharmony_ci				    TarLUNBusy[0] = 1;
46768c2ecf20Sopenharmony_ci				if (currSCCB->Sccb_tag) {
46778c2ecf20Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
46788c2ecf20Sopenharmony_ci						FPT_BL_Card[p_card].
46798c2ecf20Sopenharmony_ci						    discQCount--;
46808c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
46818c2ecf20Sopenharmony_ci								      Sccb_tag]
46828c2ecf20Sopenharmony_ci					    = NULL;
46838c2ecf20Sopenharmony_ci				} else {
46848c2ecf20Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
46858c2ecf20Sopenharmony_ci						FPT_BL_Card[p_card].
46868c2ecf20Sopenharmony_ci						    discQCount--;
46878c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].
46888c2ecf20Sopenharmony_ci					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
46898c2ecf20Sopenharmony_ci						      [currSCCB->TargID].
46908c2ecf20Sopenharmony_ci						      LunDiscQ_Idx[0]] = NULL;
46918c2ecf20Sopenharmony_ci				}
46928c2ecf20Sopenharmony_ci			}
46938c2ecf20Sopenharmony_ci
46948c2ecf20Sopenharmony_ci			currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
46958c2ecf20Sopenharmony_ci
46968c2ecf20Sopenharmony_ci			FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
46978c2ecf20Sopenharmony_ci
46988c2ecf20Sopenharmony_ci			return;
46998c2ecf20Sopenharmony_ci		}
47008c2ecf20Sopenharmony_ci
47018c2ecf20Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
47028c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
47038c2ecf20Sopenharmony_ci			    (unsigned char)SYNC_SUPPORTED;
47048c2ecf20Sopenharmony_ci
47058c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
47068c2ecf20Sopenharmony_ci			    ~EE_SYNC_MASK;
47078c2ecf20Sopenharmony_ci			FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
47088c2ecf20Sopenharmony_ci
47098c2ecf20Sopenharmony_ci			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
47108c2ecf20Sopenharmony_ci			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47118c2ecf20Sopenharmony_ci			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
47128c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47138c2ecf20Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 1;
47148c2ecf20Sopenharmony_ci				if (FPT_BL_Card[p_card].discQCount != 0)
47158c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].discQCount--;
47168c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].
47178c2ecf20Sopenharmony_ci				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
47188c2ecf20Sopenharmony_ci					      [currSCCB->TargID].
47198c2ecf20Sopenharmony_ci					      LunDiscQ_Idx[currSCCB->Lun]] =
47208c2ecf20Sopenharmony_ci				    NULL;
47218c2ecf20Sopenharmony_ci			} else {
47228c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47238c2ecf20Sopenharmony_ci				    TarLUNBusy[0] = 1;
47248c2ecf20Sopenharmony_ci				if (currSCCB->Sccb_tag) {
47258c2ecf20Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
47268c2ecf20Sopenharmony_ci						FPT_BL_Card[p_card].
47278c2ecf20Sopenharmony_ci						    discQCount--;
47288c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
47298c2ecf20Sopenharmony_ci								      Sccb_tag]
47308c2ecf20Sopenharmony_ci					    = NULL;
47318c2ecf20Sopenharmony_ci				} else {
47328c2ecf20Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
47338c2ecf20Sopenharmony_ci						FPT_BL_Card[p_card].
47348c2ecf20Sopenharmony_ci						    discQCount--;
47358c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].
47368c2ecf20Sopenharmony_ci					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
47378c2ecf20Sopenharmony_ci						      [currSCCB->TargID].
47388c2ecf20Sopenharmony_ci						      LunDiscQ_Idx[0]] = NULL;
47398c2ecf20Sopenharmony_ci				}
47408c2ecf20Sopenharmony_ci			}
47418c2ecf20Sopenharmony_ci			return;
47428c2ecf20Sopenharmony_ci
47438c2ecf20Sopenharmony_ci		}
47448c2ecf20Sopenharmony_ci
47458c2ecf20Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
47468c2ecf20Sopenharmony_ci
47478c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
47488c2ecf20Sopenharmony_ci			    (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47498c2ecf20Sopenharmony_ci			     TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
47508c2ecf20Sopenharmony_ci
47518c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
47528c2ecf20Sopenharmony_ci			    ~EE_WIDE_SCSI;
47538c2ecf20Sopenharmony_ci			FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
47548c2ecf20Sopenharmony_ci
47558c2ecf20Sopenharmony_ci			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
47568c2ecf20Sopenharmony_ci			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47578c2ecf20Sopenharmony_ci			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
47588c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47598c2ecf20Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 1;
47608c2ecf20Sopenharmony_ci				if (FPT_BL_Card[p_card].discQCount != 0)
47618c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].discQCount--;
47628c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].
47638c2ecf20Sopenharmony_ci				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
47648c2ecf20Sopenharmony_ci					      [currSCCB->TargID].
47658c2ecf20Sopenharmony_ci					      LunDiscQ_Idx[currSCCB->Lun]] =
47668c2ecf20Sopenharmony_ci				    NULL;
47678c2ecf20Sopenharmony_ci			} else {
47688c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47698c2ecf20Sopenharmony_ci				    TarLUNBusy[0] = 1;
47708c2ecf20Sopenharmony_ci				if (currSCCB->Sccb_tag) {
47718c2ecf20Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
47728c2ecf20Sopenharmony_ci						FPT_BL_Card[p_card].
47738c2ecf20Sopenharmony_ci						    discQCount--;
47748c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
47758c2ecf20Sopenharmony_ci								      Sccb_tag]
47768c2ecf20Sopenharmony_ci					    = NULL;
47778c2ecf20Sopenharmony_ci				} else {
47788c2ecf20Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
47798c2ecf20Sopenharmony_ci						FPT_BL_Card[p_card].
47808c2ecf20Sopenharmony_ci						    discQCount--;
47818c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].
47828c2ecf20Sopenharmony_ci					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
47838c2ecf20Sopenharmony_ci						      [currSCCB->TargID].
47848c2ecf20Sopenharmony_ci						      LunDiscQ_Idx[0]] = NULL;
47858c2ecf20Sopenharmony_ci				}
47868c2ecf20Sopenharmony_ci			}
47878c2ecf20Sopenharmony_ci			return;
47888c2ecf20Sopenharmony_ci
47898c2ecf20Sopenharmony_ci		}
47908c2ecf20Sopenharmony_ci
47918c2ecf20Sopenharmony_ci		if (status_byte == SSCHECK) {
47928c2ecf20Sopenharmony_ci			if (FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO) {
47938c2ecf20Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
47948c2ecf20Sopenharmony_ci				    TarEEValue & EE_SYNC_MASK) {
47958c2ecf20Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
47968c2ecf20Sopenharmony_ci							       TargID].
47978c2ecf20Sopenharmony_ci					    TarStatus &= ~TAR_SYNC_MASK;
47988c2ecf20Sopenharmony_ci				}
47998c2ecf20Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
48008c2ecf20Sopenharmony_ci				    TarEEValue & EE_WIDE_SCSI) {
48018c2ecf20Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
48028c2ecf20Sopenharmony_ci							       TargID].
48038c2ecf20Sopenharmony_ci					    TarStatus &= ~TAR_WIDE_MASK;
48048c2ecf20Sopenharmony_ci				}
48058c2ecf20Sopenharmony_ci			}
48068c2ecf20Sopenharmony_ci		}
48078c2ecf20Sopenharmony_ci
48088c2ecf20Sopenharmony_ci		if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
48098c2ecf20Sopenharmony_ci
48108c2ecf20Sopenharmony_ci			currSCCB->SccbStatus = SCCB_ERROR;
48118c2ecf20Sopenharmony_ci			currSCCB->TargetStatus = status_byte;
48128c2ecf20Sopenharmony_ci
48138c2ecf20Sopenharmony_ci			if (status_byte == SSCHECK) {
48148c2ecf20Sopenharmony_ci
48158c2ecf20Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
48168c2ecf20Sopenharmony_ci				    TarLUN_CA = 1;
48178c2ecf20Sopenharmony_ci
48188c2ecf20Sopenharmony_ci				if (currSCCB->RequestSenseLength !=
48198c2ecf20Sopenharmony_ci				    NO_AUTO_REQUEST_SENSE) {
48208c2ecf20Sopenharmony_ci
48218c2ecf20Sopenharmony_ci					if (currSCCB->RequestSenseLength == 0)
48228c2ecf20Sopenharmony_ci						currSCCB->RequestSenseLength =
48238c2ecf20Sopenharmony_ci						    14;
48248c2ecf20Sopenharmony_ci
48258c2ecf20Sopenharmony_ci					FPT_ssenss(&FPT_BL_Card[p_card]);
48268c2ecf20Sopenharmony_ci					FPT_BL_Card[p_card].globalFlags |=
48278c2ecf20Sopenharmony_ci					    F_NEW_SCCB_CMD;
48288c2ecf20Sopenharmony_ci
48298c2ecf20Sopenharmony_ci					if (((FPT_BL_Card[p_card].
48308c2ecf20Sopenharmony_ci					      globalFlags & F_CONLUN_IO)
48318c2ecf20Sopenharmony_ci					     &&
48328c2ecf20Sopenharmony_ci					     ((FPT_sccbMgrTbl[p_card]
48338c2ecf20Sopenharmony_ci					       [currSCCB->TargID].
48348c2ecf20Sopenharmony_ci					       TarStatus & TAR_TAG_Q_MASK) !=
48358c2ecf20Sopenharmony_ci					      TAG_Q_TRYING))) {
48368c2ecf20Sopenharmony_ci						FPT_sccbMgrTbl[p_card]
48378c2ecf20Sopenharmony_ci						    [currSCCB->TargID].
48388c2ecf20Sopenharmony_ci						    TarLUNBusy[currSCCB->Lun] =
48398c2ecf20Sopenharmony_ci						    1;
48408c2ecf20Sopenharmony_ci						if (FPT_BL_Card[p_card].
48418c2ecf20Sopenharmony_ci						    discQCount != 0)
48428c2ecf20Sopenharmony_ci							FPT_BL_Card[p_card].
48438c2ecf20Sopenharmony_ci							    discQCount--;
48448c2ecf20Sopenharmony_ci						FPT_BL_Card[p_card].
48458c2ecf20Sopenharmony_ci						    discQ_Tbl[FPT_sccbMgrTbl
48468c2ecf20Sopenharmony_ci							      [p_card]
48478c2ecf20Sopenharmony_ci							      [currSCCB->
48488c2ecf20Sopenharmony_ci							       TargID].
48498c2ecf20Sopenharmony_ci							      LunDiscQ_Idx
48508c2ecf20Sopenharmony_ci							      [currSCCB->Lun]] =
48518c2ecf20Sopenharmony_ci						    NULL;
48528c2ecf20Sopenharmony_ci					} else {
48538c2ecf20Sopenharmony_ci						FPT_sccbMgrTbl[p_card]
48548c2ecf20Sopenharmony_ci						    [currSCCB->TargID].
48558c2ecf20Sopenharmony_ci						    TarLUNBusy[0] = 1;
48568c2ecf20Sopenharmony_ci						if (currSCCB->Sccb_tag) {
48578c2ecf20Sopenharmony_ci							if (FPT_BL_Card[p_card].
48588c2ecf20Sopenharmony_ci							    discQCount != 0)
48598c2ecf20Sopenharmony_ci								FPT_BL_Card
48608c2ecf20Sopenharmony_ci								    [p_card].
48618c2ecf20Sopenharmony_ci								    discQCount--;
48628c2ecf20Sopenharmony_ci							FPT_BL_Card[p_card].
48638c2ecf20Sopenharmony_ci							    discQ_Tbl[currSCCB->
48648c2ecf20Sopenharmony_ci								      Sccb_tag]
48658c2ecf20Sopenharmony_ci							    = NULL;
48668c2ecf20Sopenharmony_ci						} else {
48678c2ecf20Sopenharmony_ci							if (FPT_BL_Card[p_card].
48688c2ecf20Sopenharmony_ci							    discQCount != 0)
48698c2ecf20Sopenharmony_ci								FPT_BL_Card
48708c2ecf20Sopenharmony_ci								    [p_card].
48718c2ecf20Sopenharmony_ci								    discQCount--;
48728c2ecf20Sopenharmony_ci							FPT_BL_Card[p_card].
48738c2ecf20Sopenharmony_ci							    discQ_Tbl
48748c2ecf20Sopenharmony_ci							    [FPT_sccbMgrTbl
48758c2ecf20Sopenharmony_ci							     [p_card][currSCCB->
48768c2ecf20Sopenharmony_ci								      TargID].
48778c2ecf20Sopenharmony_ci							     LunDiscQ_Idx[0]] =
48788c2ecf20Sopenharmony_ci							    NULL;
48798c2ecf20Sopenharmony_ci						}
48808c2ecf20Sopenharmony_ci					}
48818c2ecf20Sopenharmony_ci					return;
48828c2ecf20Sopenharmony_ci				}
48838c2ecf20Sopenharmony_ci			}
48848c2ecf20Sopenharmony_ci		}
48858c2ecf20Sopenharmony_ci	}
48868c2ecf20Sopenharmony_ci
48878c2ecf20Sopenharmony_ci	if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
48888c2ecf20Sopenharmony_ci	    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
48898c2ecf20Sopenharmony_ci	      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
48908c2ecf20Sopenharmony_ci		FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->
48918c2ecf20Sopenharmony_ci								    Lun] = 0;
48928c2ecf20Sopenharmony_ci	else
48938c2ecf20Sopenharmony_ci		FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
48948c2ecf20Sopenharmony_ci
48958c2ecf20Sopenharmony_ci	FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
48968c2ecf20Sopenharmony_ci}
48978c2ecf20Sopenharmony_ci
48988c2ecf20Sopenharmony_ci#define SHORT_WAIT   0x0000000F
48998c2ecf20Sopenharmony_ci#define LONG_WAIT    0x0000FFFFL
49008c2ecf20Sopenharmony_ci
49018c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
49028c2ecf20Sopenharmony_ci *
49038c2ecf20Sopenharmony_ci * Function: Data Transfer Processor
49048c2ecf20Sopenharmony_ci *
49058c2ecf20Sopenharmony_ci * Description: This routine performs two tasks.
49068c2ecf20Sopenharmony_ci *              (1) Start data transfer by calling HOST_DATA_XFER_START
49078c2ecf20Sopenharmony_ci *              function.  Once data transfer is started, (2) Depends
49088c2ecf20Sopenharmony_ci *              on the type of data transfer mode Scatter/Gather mode
49098c2ecf20Sopenharmony_ci *              or NON Scatter/Gather mode.  In NON Scatter/Gather mode,
49108c2ecf20Sopenharmony_ci *              this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
49118c2ecf20Sopenharmony_ci *              data transfer done.  In Scatter/Gather mode, this routine
49128c2ecf20Sopenharmony_ci *              checks bus master command complete and dual rank busy
49138c2ecf20Sopenharmony_ci *              bit to keep chaining SC transfer command.  Similarly,
49148c2ecf20Sopenharmony_ci *              in Scatter/Gather mode, it checks Sccb_MGRFlag
49158c2ecf20Sopenharmony_ci *              (F_HOST_XFER_ACT bit) for data transfer done.
49168c2ecf20Sopenharmony_ci *
49178c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
49188c2ecf20Sopenharmony_ci
49198c2ecf20Sopenharmony_cistatic void FPT_dataXferProcessor(u32 port, struct sccb_card *pCurrCard)
49208c2ecf20Sopenharmony_ci{
49218c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
49228c2ecf20Sopenharmony_ci
49238c2ecf20Sopenharmony_ci	currSCCB = pCurrCard->currentSCCB;
49248c2ecf20Sopenharmony_ci
49258c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_XferState & F_SG_XFER) {
49268c2ecf20Sopenharmony_ci		if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
49278c2ecf20Sopenharmony_ci		{
49288c2ecf20Sopenharmony_ci			currSCCB->Sccb_sgseg += (unsigned char)SG_BUF_CNT;
49298c2ecf20Sopenharmony_ci			currSCCB->Sccb_SGoffset = 0x00;
49308c2ecf20Sopenharmony_ci		}
49318c2ecf20Sopenharmony_ci		pCurrCard->globalFlags |= F_HOST_XFER_ACT;
49328c2ecf20Sopenharmony_ci
49338c2ecf20Sopenharmony_ci		FPT_busMstrSGDataXferStart(port, currSCCB);
49348c2ecf20Sopenharmony_ci	}
49358c2ecf20Sopenharmony_ci
49368c2ecf20Sopenharmony_ci	else {
49378c2ecf20Sopenharmony_ci		if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) {
49388c2ecf20Sopenharmony_ci			pCurrCard->globalFlags |= F_HOST_XFER_ACT;
49398c2ecf20Sopenharmony_ci
49408c2ecf20Sopenharmony_ci			FPT_busMstrDataXferStart(port, currSCCB);
49418c2ecf20Sopenharmony_ci		}
49428c2ecf20Sopenharmony_ci	}
49438c2ecf20Sopenharmony_ci}
49448c2ecf20Sopenharmony_ci
49458c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
49468c2ecf20Sopenharmony_ci *
49478c2ecf20Sopenharmony_ci * Function: BusMaster Scatter Gather Data Transfer Start
49488c2ecf20Sopenharmony_ci *
49498c2ecf20Sopenharmony_ci * Description:
49508c2ecf20Sopenharmony_ci *
49518c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
49528c2ecf20Sopenharmony_cistatic void FPT_busMstrSGDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
49538c2ecf20Sopenharmony_ci{
49548c2ecf20Sopenharmony_ci	u32 count, addr, tmpSGCnt;
49558c2ecf20Sopenharmony_ci	unsigned int sg_index;
49568c2ecf20Sopenharmony_ci	unsigned char sg_count, i;
49578c2ecf20Sopenharmony_ci	u32 reg_offset;
49588c2ecf20Sopenharmony_ci	struct blogic_sg_seg *segp;
49598c2ecf20Sopenharmony_ci
49608c2ecf20Sopenharmony_ci	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)
49618c2ecf20Sopenharmony_ci		count = ((u32)HOST_RD_CMD) << 24;
49628c2ecf20Sopenharmony_ci	else
49638c2ecf20Sopenharmony_ci		count = ((u32)HOST_WRT_CMD) << 24;
49648c2ecf20Sopenharmony_ci
49658c2ecf20Sopenharmony_ci	sg_count = 0;
49668c2ecf20Sopenharmony_ci	tmpSGCnt = 0;
49678c2ecf20Sopenharmony_ci	sg_index = pcurrSCCB->Sccb_sgseg;
49688c2ecf20Sopenharmony_ci	reg_offset = hp_aramBase;
49698c2ecf20Sopenharmony_ci
49708c2ecf20Sopenharmony_ci	i = (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
49718c2ecf20Sopenharmony_ci			    ~(SGRAM_ARAM | SCATTER_EN));
49728c2ecf20Sopenharmony_ci
49738c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl, i);
49748c2ecf20Sopenharmony_ci
49758c2ecf20Sopenharmony_ci	while ((sg_count < (unsigned char)SG_BUF_CNT) &&
49768c2ecf20Sopenharmony_ci			((sg_index * (unsigned int)SG_ELEMENT_SIZE) <
49778c2ecf20Sopenharmony_ci			pcurrSCCB->DataLength)) {
49788c2ecf20Sopenharmony_ci
49798c2ecf20Sopenharmony_ci		segp = (struct blogic_sg_seg *)(pcurrSCCB->DataPointer) +
49808c2ecf20Sopenharmony_ci				sg_index;
49818c2ecf20Sopenharmony_ci		tmpSGCnt += segp->segbytes;
49828c2ecf20Sopenharmony_ci		count |= segp->segbytes;
49838c2ecf20Sopenharmony_ci		addr = segp->segdata;
49848c2ecf20Sopenharmony_ci
49858c2ecf20Sopenharmony_ci		if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
49868c2ecf20Sopenharmony_ci			addr +=
49878c2ecf20Sopenharmony_ci			    ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
49888c2ecf20Sopenharmony_ci			count =
49898c2ecf20Sopenharmony_ci			    (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
49908c2ecf20Sopenharmony_ci			tmpSGCnt = count & 0x00FFFFFFL;
49918c2ecf20Sopenharmony_ci		}
49928c2ecf20Sopenharmony_ci
49938c2ecf20Sopenharmony_ci		WR_HARP32(p_port, reg_offset, addr);
49948c2ecf20Sopenharmony_ci		reg_offset += 4;
49958c2ecf20Sopenharmony_ci
49968c2ecf20Sopenharmony_ci		WR_HARP32(p_port, reg_offset, count);
49978c2ecf20Sopenharmony_ci		reg_offset += 4;
49988c2ecf20Sopenharmony_ci
49998c2ecf20Sopenharmony_ci		count &= 0xFF000000L;
50008c2ecf20Sopenharmony_ci		sg_index++;
50018c2ecf20Sopenharmony_ci		sg_count++;
50028c2ecf20Sopenharmony_ci
50038c2ecf20Sopenharmony_ci	}			/*End While */
50048c2ecf20Sopenharmony_ci
50058c2ecf20Sopenharmony_ci	pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
50068c2ecf20Sopenharmony_ci
50078c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_sg_addr, (sg_count << 4));
50088c2ecf20Sopenharmony_ci
50098c2ecf20Sopenharmony_ci	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
50108c2ecf20Sopenharmony_ci
50118c2ecf20Sopenharmony_ci		WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
50128c2ecf20Sopenharmony_ci
50138c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
50148c2ecf20Sopenharmony_ci			   (DMA_PORT | SCSI_PORT | SCSI_INBIT));
50158c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
50168c2ecf20Sopenharmony_ci	}
50178c2ecf20Sopenharmony_ci
50188c2ecf20Sopenharmony_ci	else {
50198c2ecf20Sopenharmony_ci
50208c2ecf20Sopenharmony_ci		if ((!(RD_HARPOON(p_port + hp_synctarg_0) & NARROW_SCSI)) &&
50218c2ecf20Sopenharmony_ci		    (tmpSGCnt & 0x000000001)) {
50228c2ecf20Sopenharmony_ci
50238c2ecf20Sopenharmony_ci			pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
50248c2ecf20Sopenharmony_ci			tmpSGCnt--;
50258c2ecf20Sopenharmony_ci		}
50268c2ecf20Sopenharmony_ci
50278c2ecf20Sopenharmony_ci		WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
50288c2ecf20Sopenharmony_ci
50298c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
50308c2ecf20Sopenharmony_ci			   (SCSI_PORT | DMA_PORT | DMA_RD));
50318c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
50328c2ecf20Sopenharmony_ci	}
50338c2ecf20Sopenharmony_ci
50348c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl, (unsigned char)(i | SCATTER_EN));
50358c2ecf20Sopenharmony_ci
50368c2ecf20Sopenharmony_ci}
50378c2ecf20Sopenharmony_ci
50388c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
50398c2ecf20Sopenharmony_ci *
50408c2ecf20Sopenharmony_ci * Function: BusMaster Data Transfer Start
50418c2ecf20Sopenharmony_ci *
50428c2ecf20Sopenharmony_ci * Description:
50438c2ecf20Sopenharmony_ci *
50448c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
50458c2ecf20Sopenharmony_cistatic void FPT_busMstrDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
50468c2ecf20Sopenharmony_ci{
50478c2ecf20Sopenharmony_ci	u32 addr, count;
50488c2ecf20Sopenharmony_ci
50498c2ecf20Sopenharmony_ci	if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
50508c2ecf20Sopenharmony_ci
50518c2ecf20Sopenharmony_ci		count = pcurrSCCB->Sccb_XferCnt;
50528c2ecf20Sopenharmony_ci
50538c2ecf20Sopenharmony_ci		addr = (u32)(unsigned long)pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
50548c2ecf20Sopenharmony_ci	}
50558c2ecf20Sopenharmony_ci
50568c2ecf20Sopenharmony_ci	else {
50578c2ecf20Sopenharmony_ci		addr = pcurrSCCB->SensePointer;
50588c2ecf20Sopenharmony_ci		count = pcurrSCCB->RequestSenseLength;
50598c2ecf20Sopenharmony_ci
50608c2ecf20Sopenharmony_ci	}
50618c2ecf20Sopenharmony_ci
50628c2ecf20Sopenharmony_ci	HP_SETUP_ADDR_CNT(p_port, addr, count);
50638c2ecf20Sopenharmony_ci
50648c2ecf20Sopenharmony_ci	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
50658c2ecf20Sopenharmony_ci
50668c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
50678c2ecf20Sopenharmony_ci			   (DMA_PORT | SCSI_PORT | SCSI_INBIT));
50688c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
50698c2ecf20Sopenharmony_ci
50708c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_xfer_cmd,
50718c2ecf20Sopenharmony_ci			   (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
50728c2ecf20Sopenharmony_ci	}
50738c2ecf20Sopenharmony_ci
50748c2ecf20Sopenharmony_ci	else {
50758c2ecf20Sopenharmony_ci
50768c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
50778c2ecf20Sopenharmony_ci			   (SCSI_PORT | DMA_PORT | DMA_RD));
50788c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
50798c2ecf20Sopenharmony_ci
50808c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_xfer_cmd,
50818c2ecf20Sopenharmony_ci			   (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
50828c2ecf20Sopenharmony_ci
50838c2ecf20Sopenharmony_ci	}
50848c2ecf20Sopenharmony_ci}
50858c2ecf20Sopenharmony_ci
50868c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
50878c2ecf20Sopenharmony_ci *
50888c2ecf20Sopenharmony_ci * Function: BusMaster Timeout Handler
50898c2ecf20Sopenharmony_ci *
50908c2ecf20Sopenharmony_ci * Description: This function is called after a bus master command busy time
50918c2ecf20Sopenharmony_ci *               out is detected.  This routines issue halt state machine
50928c2ecf20Sopenharmony_ci *               with a software time out for command busy.  If command busy
50938c2ecf20Sopenharmony_ci *               is still asserted at the end of the time out, it issues
50948c2ecf20Sopenharmony_ci *               hard abort with another software time out.  It hard abort
50958c2ecf20Sopenharmony_ci *               command busy is also time out, it'll just give up.
50968c2ecf20Sopenharmony_ci *
50978c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
50988c2ecf20Sopenharmony_cistatic unsigned char FPT_busMstrTimeOut(u32 p_port)
50998c2ecf20Sopenharmony_ci{
51008c2ecf20Sopenharmony_ci	unsigned long timeout;
51018c2ecf20Sopenharmony_ci
51028c2ecf20Sopenharmony_ci	timeout = LONG_WAIT;
51038c2ecf20Sopenharmony_ci
51048c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_sys_ctrl, HALT_MACH);
51058c2ecf20Sopenharmony_ci
51068c2ecf20Sopenharmony_ci	while ((!(RD_HARPOON(p_port + hp_ext_status) & CMD_ABORTED))
51078c2ecf20Sopenharmony_ci	       && timeout--) {
51088c2ecf20Sopenharmony_ci	}
51098c2ecf20Sopenharmony_ci
51108c2ecf20Sopenharmony_ci	if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
51118c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_sys_ctrl, HARD_ABORT);
51128c2ecf20Sopenharmony_ci
51138c2ecf20Sopenharmony_ci		timeout = LONG_WAIT;
51148c2ecf20Sopenharmony_ci		while ((RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY)
51158c2ecf20Sopenharmony_ci		       && timeout--) {
51168c2ecf20Sopenharmony_ci		}
51178c2ecf20Sopenharmony_ci	}
51188c2ecf20Sopenharmony_ci
51198c2ecf20Sopenharmony_ci	RD_HARPOON(p_port + hp_int_status);	/*Clear command complete */
51208c2ecf20Sopenharmony_ci
51218c2ecf20Sopenharmony_ci	if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
51228c2ecf20Sopenharmony_ci		return 1;
51238c2ecf20Sopenharmony_ci	}
51248c2ecf20Sopenharmony_ci
51258c2ecf20Sopenharmony_ci	else {
51268c2ecf20Sopenharmony_ci		return 0;
51278c2ecf20Sopenharmony_ci	}
51288c2ecf20Sopenharmony_ci}
51298c2ecf20Sopenharmony_ci
51308c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
51318c2ecf20Sopenharmony_ci *
51328c2ecf20Sopenharmony_ci * Function: Host Data Transfer Abort
51338c2ecf20Sopenharmony_ci *
51348c2ecf20Sopenharmony_ci * Description: Abort any in progress transfer.
51358c2ecf20Sopenharmony_ci *
51368c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
51378c2ecf20Sopenharmony_cistatic void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
51388c2ecf20Sopenharmony_ci				  struct sccb *pCurrSCCB)
51398c2ecf20Sopenharmony_ci{
51408c2ecf20Sopenharmony_ci
51418c2ecf20Sopenharmony_ci	unsigned long timeout;
51428c2ecf20Sopenharmony_ci	unsigned long remain_cnt;
51438c2ecf20Sopenharmony_ci	u32 sg_ptr;
51448c2ecf20Sopenharmony_ci	struct blogic_sg_seg *segp;
51458c2ecf20Sopenharmony_ci
51468c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
51478c2ecf20Sopenharmony_ci
51488c2ecf20Sopenharmony_ci	if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
51498c2ecf20Sopenharmony_ci
51508c2ecf20Sopenharmony_ci		if (!(RD_HARPOON(port + hp_int_status) & INT_CMD_COMPL)) {
51518c2ecf20Sopenharmony_ci
51528c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_bm_ctrl,
51538c2ecf20Sopenharmony_ci				   (RD_HARPOON(port + hp_bm_ctrl) |
51548c2ecf20Sopenharmony_ci				    FLUSH_XFER_CNTR));
51558c2ecf20Sopenharmony_ci			timeout = LONG_WAIT;
51568c2ecf20Sopenharmony_ci
51578c2ecf20Sopenharmony_ci			while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
51588c2ecf20Sopenharmony_ci			       && timeout--) {
51598c2ecf20Sopenharmony_ci			}
51608c2ecf20Sopenharmony_ci
51618c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_bm_ctrl,
51628c2ecf20Sopenharmony_ci				   (RD_HARPOON(port + hp_bm_ctrl) &
51638c2ecf20Sopenharmony_ci				    ~FLUSH_XFER_CNTR));
51648c2ecf20Sopenharmony_ci
51658c2ecf20Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
51668c2ecf20Sopenharmony_ci
51678c2ecf20Sopenharmony_ci				if (FPT_busMstrTimeOut(port)) {
51688c2ecf20Sopenharmony_ci
51698c2ecf20Sopenharmony_ci					if (pCurrSCCB->HostStatus == 0x00)
51708c2ecf20Sopenharmony_ci
51718c2ecf20Sopenharmony_ci						pCurrSCCB->HostStatus =
51728c2ecf20Sopenharmony_ci						    SCCB_BM_ERR;
51738c2ecf20Sopenharmony_ci
51748c2ecf20Sopenharmony_ci				}
51758c2ecf20Sopenharmony_ci
51768c2ecf20Sopenharmony_ci				if (RD_HARPOON(port + hp_int_status) &
51778c2ecf20Sopenharmony_ci				    INT_EXT_STATUS)
51788c2ecf20Sopenharmony_ci
51798c2ecf20Sopenharmony_ci					if (RD_HARPOON(port + hp_ext_status) &
51808c2ecf20Sopenharmony_ci					    BAD_EXT_STATUS)
51818c2ecf20Sopenharmony_ci
51828c2ecf20Sopenharmony_ci						if (pCurrSCCB->HostStatus ==
51838c2ecf20Sopenharmony_ci						    0x00)
51848c2ecf20Sopenharmony_ci						{
51858c2ecf20Sopenharmony_ci							pCurrSCCB->HostStatus =
51868c2ecf20Sopenharmony_ci							    SCCB_BM_ERR;
51878c2ecf20Sopenharmony_ci						}
51888c2ecf20Sopenharmony_ci			}
51898c2ecf20Sopenharmony_ci		}
51908c2ecf20Sopenharmony_ci	}
51918c2ecf20Sopenharmony_ci
51928c2ecf20Sopenharmony_ci	else if (pCurrSCCB->Sccb_XferCnt) {
51938c2ecf20Sopenharmony_ci
51948c2ecf20Sopenharmony_ci		if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
51958c2ecf20Sopenharmony_ci
51968c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_page_ctrl,
51978c2ecf20Sopenharmony_ci				   (RD_HARPOON(port + hp_page_ctrl) &
51988c2ecf20Sopenharmony_ci				    ~SCATTER_EN));
51998c2ecf20Sopenharmony_ci
52008c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_sg_addr, 0x00);
52018c2ecf20Sopenharmony_ci
52028c2ecf20Sopenharmony_ci			sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
52038c2ecf20Sopenharmony_ci
52048c2ecf20Sopenharmony_ci			if (sg_ptr >
52058c2ecf20Sopenharmony_ci			    (unsigned int)(pCurrSCCB->DataLength /
52068c2ecf20Sopenharmony_ci					   SG_ELEMENT_SIZE)) {
52078c2ecf20Sopenharmony_ci
52088c2ecf20Sopenharmony_ci				sg_ptr = (u32)(pCurrSCCB->DataLength /
52098c2ecf20Sopenharmony_ci							SG_ELEMENT_SIZE);
52108c2ecf20Sopenharmony_ci			}
52118c2ecf20Sopenharmony_ci
52128c2ecf20Sopenharmony_ci			remain_cnt = pCurrSCCB->Sccb_XferCnt;
52138c2ecf20Sopenharmony_ci
52148c2ecf20Sopenharmony_ci			while (remain_cnt < 0x01000000L) {
52158c2ecf20Sopenharmony_ci
52168c2ecf20Sopenharmony_ci				sg_ptr--;
52178c2ecf20Sopenharmony_ci				segp = (struct blogic_sg_seg *)(pCurrSCCB->
52188c2ecf20Sopenharmony_ci						DataPointer) + (sg_ptr * 2);
52198c2ecf20Sopenharmony_ci				if (remain_cnt > (unsigned long)segp->segbytes)
52208c2ecf20Sopenharmony_ci					remain_cnt -=
52218c2ecf20Sopenharmony_ci						(unsigned long)segp->segbytes;
52228c2ecf20Sopenharmony_ci				else
52238c2ecf20Sopenharmony_ci					break;
52248c2ecf20Sopenharmony_ci			}
52258c2ecf20Sopenharmony_ci
52268c2ecf20Sopenharmony_ci			if (remain_cnt < 0x01000000L) {
52278c2ecf20Sopenharmony_ci
52288c2ecf20Sopenharmony_ci				pCurrSCCB->Sccb_SGoffset = remain_cnt;
52298c2ecf20Sopenharmony_ci
52308c2ecf20Sopenharmony_ci				pCurrSCCB->Sccb_sgseg = (unsigned short)sg_ptr;
52318c2ecf20Sopenharmony_ci
52328c2ecf20Sopenharmony_ci				if ((unsigned long)(sg_ptr * SG_ELEMENT_SIZE) ==
52338c2ecf20Sopenharmony_ci				    pCurrSCCB->DataLength && (remain_cnt == 0))
52348c2ecf20Sopenharmony_ci
52358c2ecf20Sopenharmony_ci					pCurrSCCB->Sccb_XferState |=
52368c2ecf20Sopenharmony_ci					    F_ALL_XFERRED;
52378c2ecf20Sopenharmony_ci			}
52388c2ecf20Sopenharmony_ci
52398c2ecf20Sopenharmony_ci			else {
52408c2ecf20Sopenharmony_ci
52418c2ecf20Sopenharmony_ci				if (pCurrSCCB->HostStatus == 0x00) {
52428c2ecf20Sopenharmony_ci
52438c2ecf20Sopenharmony_ci					pCurrSCCB->HostStatus =
52448c2ecf20Sopenharmony_ci					    SCCB_GROSS_FW_ERR;
52458c2ecf20Sopenharmony_ci				}
52468c2ecf20Sopenharmony_ci			}
52478c2ecf20Sopenharmony_ci		}
52488c2ecf20Sopenharmony_ci
52498c2ecf20Sopenharmony_ci		if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
52508c2ecf20Sopenharmony_ci
52518c2ecf20Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
52528c2ecf20Sopenharmony_ci
52538c2ecf20Sopenharmony_ci				FPT_busMstrTimeOut(port);
52548c2ecf20Sopenharmony_ci			}
52558c2ecf20Sopenharmony_ci
52568c2ecf20Sopenharmony_ci			else {
52578c2ecf20Sopenharmony_ci
52588c2ecf20Sopenharmony_ci				if (RD_HARPOON(port + hp_int_status) &
52598c2ecf20Sopenharmony_ci				    INT_EXT_STATUS) {
52608c2ecf20Sopenharmony_ci
52618c2ecf20Sopenharmony_ci					if (RD_HARPOON(port + hp_ext_status) &
52628c2ecf20Sopenharmony_ci					    BAD_EXT_STATUS) {
52638c2ecf20Sopenharmony_ci
52648c2ecf20Sopenharmony_ci						if (pCurrSCCB->HostStatus ==
52658c2ecf20Sopenharmony_ci						    0x00) {
52668c2ecf20Sopenharmony_ci
52678c2ecf20Sopenharmony_ci							pCurrSCCB->HostStatus =
52688c2ecf20Sopenharmony_ci							    SCCB_BM_ERR;
52698c2ecf20Sopenharmony_ci						}
52708c2ecf20Sopenharmony_ci					}
52718c2ecf20Sopenharmony_ci				}
52728c2ecf20Sopenharmony_ci
52738c2ecf20Sopenharmony_ci			}
52748c2ecf20Sopenharmony_ci		}
52758c2ecf20Sopenharmony_ci
52768c2ecf20Sopenharmony_ci		else {
52778c2ecf20Sopenharmony_ci
52788c2ecf20Sopenharmony_ci			if ((RD_HARPOON(port + hp_fifo_cnt)) >= BM_THRESHOLD) {
52798c2ecf20Sopenharmony_ci
52808c2ecf20Sopenharmony_ci				timeout = SHORT_WAIT;
52818c2ecf20Sopenharmony_ci
52828c2ecf20Sopenharmony_ci				while ((RD_HARPOON(port + hp_ext_status) &
52838c2ecf20Sopenharmony_ci					BM_CMD_BUSY)
52848c2ecf20Sopenharmony_ci				       && ((RD_HARPOON(port + hp_fifo_cnt)) >=
52858c2ecf20Sopenharmony_ci					   BM_THRESHOLD) && timeout--) {
52868c2ecf20Sopenharmony_ci				}
52878c2ecf20Sopenharmony_ci			}
52888c2ecf20Sopenharmony_ci
52898c2ecf20Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
52908c2ecf20Sopenharmony_ci
52918c2ecf20Sopenharmony_ci				WR_HARPOON(port + hp_bm_ctrl,
52928c2ecf20Sopenharmony_ci					   (RD_HARPOON(port + hp_bm_ctrl) |
52938c2ecf20Sopenharmony_ci					    FLUSH_XFER_CNTR));
52948c2ecf20Sopenharmony_ci
52958c2ecf20Sopenharmony_ci				timeout = LONG_WAIT;
52968c2ecf20Sopenharmony_ci
52978c2ecf20Sopenharmony_ci				while ((RD_HARPOON(port + hp_ext_status) &
52988c2ecf20Sopenharmony_ci					BM_CMD_BUSY) && timeout--) {
52998c2ecf20Sopenharmony_ci				}
53008c2ecf20Sopenharmony_ci
53018c2ecf20Sopenharmony_ci				WR_HARPOON(port + hp_bm_ctrl,
53028c2ecf20Sopenharmony_ci					   (RD_HARPOON(port + hp_bm_ctrl) &
53038c2ecf20Sopenharmony_ci					    ~FLUSH_XFER_CNTR));
53048c2ecf20Sopenharmony_ci
53058c2ecf20Sopenharmony_ci				if (RD_HARPOON(port + hp_ext_status) &
53068c2ecf20Sopenharmony_ci				    BM_CMD_BUSY) {
53078c2ecf20Sopenharmony_ci
53088c2ecf20Sopenharmony_ci					if (pCurrSCCB->HostStatus == 0x00) {
53098c2ecf20Sopenharmony_ci
53108c2ecf20Sopenharmony_ci						pCurrSCCB->HostStatus =
53118c2ecf20Sopenharmony_ci						    SCCB_BM_ERR;
53128c2ecf20Sopenharmony_ci					}
53138c2ecf20Sopenharmony_ci
53148c2ecf20Sopenharmony_ci					FPT_busMstrTimeOut(port);
53158c2ecf20Sopenharmony_ci				}
53168c2ecf20Sopenharmony_ci			}
53178c2ecf20Sopenharmony_ci
53188c2ecf20Sopenharmony_ci			if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
53198c2ecf20Sopenharmony_ci
53208c2ecf20Sopenharmony_ci				if (RD_HARPOON(port + hp_ext_status) &
53218c2ecf20Sopenharmony_ci				    BAD_EXT_STATUS) {
53228c2ecf20Sopenharmony_ci
53238c2ecf20Sopenharmony_ci					if (pCurrSCCB->HostStatus == 0x00) {
53248c2ecf20Sopenharmony_ci
53258c2ecf20Sopenharmony_ci						pCurrSCCB->HostStatus =
53268c2ecf20Sopenharmony_ci						    SCCB_BM_ERR;
53278c2ecf20Sopenharmony_ci					}
53288c2ecf20Sopenharmony_ci				}
53298c2ecf20Sopenharmony_ci			}
53308c2ecf20Sopenharmony_ci		}
53318c2ecf20Sopenharmony_ci
53328c2ecf20Sopenharmony_ci	}
53338c2ecf20Sopenharmony_ci
53348c2ecf20Sopenharmony_ci	else {
53358c2ecf20Sopenharmony_ci
53368c2ecf20Sopenharmony_ci		if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
53378c2ecf20Sopenharmony_ci
53388c2ecf20Sopenharmony_ci			timeout = LONG_WAIT;
53398c2ecf20Sopenharmony_ci
53408c2ecf20Sopenharmony_ci			while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
53418c2ecf20Sopenharmony_ci			       && timeout--) {
53428c2ecf20Sopenharmony_ci			}
53438c2ecf20Sopenharmony_ci
53448c2ecf20Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
53458c2ecf20Sopenharmony_ci
53468c2ecf20Sopenharmony_ci				if (pCurrSCCB->HostStatus == 0x00) {
53478c2ecf20Sopenharmony_ci
53488c2ecf20Sopenharmony_ci					pCurrSCCB->HostStatus = SCCB_BM_ERR;
53498c2ecf20Sopenharmony_ci				}
53508c2ecf20Sopenharmony_ci
53518c2ecf20Sopenharmony_ci				FPT_busMstrTimeOut(port);
53528c2ecf20Sopenharmony_ci			}
53538c2ecf20Sopenharmony_ci		}
53548c2ecf20Sopenharmony_ci
53558c2ecf20Sopenharmony_ci		if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
53568c2ecf20Sopenharmony_ci
53578c2ecf20Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BAD_EXT_STATUS) {
53588c2ecf20Sopenharmony_ci
53598c2ecf20Sopenharmony_ci				if (pCurrSCCB->HostStatus == 0x00) {
53608c2ecf20Sopenharmony_ci
53618c2ecf20Sopenharmony_ci					pCurrSCCB->HostStatus = SCCB_BM_ERR;
53628c2ecf20Sopenharmony_ci				}
53638c2ecf20Sopenharmony_ci			}
53648c2ecf20Sopenharmony_ci
53658c2ecf20Sopenharmony_ci		}
53668c2ecf20Sopenharmony_ci
53678c2ecf20Sopenharmony_ci		if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
53688c2ecf20Sopenharmony_ci
53698c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_page_ctrl,
53708c2ecf20Sopenharmony_ci				   (RD_HARPOON(port + hp_page_ctrl) &
53718c2ecf20Sopenharmony_ci				    ~SCATTER_EN));
53728c2ecf20Sopenharmony_ci
53738c2ecf20Sopenharmony_ci			WR_HARPOON(port + hp_sg_addr, 0x00);
53748c2ecf20Sopenharmony_ci
53758c2ecf20Sopenharmony_ci			pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
53768c2ecf20Sopenharmony_ci
53778c2ecf20Sopenharmony_ci			pCurrSCCB->Sccb_SGoffset = 0x00;
53788c2ecf20Sopenharmony_ci
53798c2ecf20Sopenharmony_ci			if ((u32)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
53808c2ecf20Sopenharmony_ci					pCurrSCCB->DataLength) {
53818c2ecf20Sopenharmony_ci
53828c2ecf20Sopenharmony_ci				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
53838c2ecf20Sopenharmony_ci				pCurrSCCB->Sccb_sgseg =
53848c2ecf20Sopenharmony_ci				    (unsigned short)(pCurrSCCB->DataLength /
53858c2ecf20Sopenharmony_ci						     SG_ELEMENT_SIZE);
53868c2ecf20Sopenharmony_ci			}
53878c2ecf20Sopenharmony_ci		}
53888c2ecf20Sopenharmony_ci
53898c2ecf20Sopenharmony_ci		else {
53908c2ecf20Sopenharmony_ci			if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
53918c2ecf20Sopenharmony_ci				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
53928c2ecf20Sopenharmony_ci		}
53938c2ecf20Sopenharmony_ci	}
53948c2ecf20Sopenharmony_ci
53958c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
53968c2ecf20Sopenharmony_ci}
53978c2ecf20Sopenharmony_ci
53988c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
53998c2ecf20Sopenharmony_ci *
54008c2ecf20Sopenharmony_ci * Function: Host Data Transfer Restart
54018c2ecf20Sopenharmony_ci *
54028c2ecf20Sopenharmony_ci * Description: Reset the available count due to a restore data
54038c2ecf20Sopenharmony_ci *              pointers message.
54048c2ecf20Sopenharmony_ci *
54058c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
54068c2ecf20Sopenharmony_cistatic void FPT_hostDataXferRestart(struct sccb *currSCCB)
54078c2ecf20Sopenharmony_ci{
54088c2ecf20Sopenharmony_ci	unsigned long data_count;
54098c2ecf20Sopenharmony_ci	unsigned int sg_index;
54108c2ecf20Sopenharmony_ci	struct blogic_sg_seg *segp;
54118c2ecf20Sopenharmony_ci
54128c2ecf20Sopenharmony_ci	if (currSCCB->Sccb_XferState & F_SG_XFER) {
54138c2ecf20Sopenharmony_ci
54148c2ecf20Sopenharmony_ci		currSCCB->Sccb_XferCnt = 0;
54158c2ecf20Sopenharmony_ci
54168c2ecf20Sopenharmony_ci		sg_index = 0xffff;	/*Index by long words into sg list. */
54178c2ecf20Sopenharmony_ci		data_count = 0;		/*Running count of SG xfer counts. */
54188c2ecf20Sopenharmony_ci
54198c2ecf20Sopenharmony_ci
54208c2ecf20Sopenharmony_ci		while (data_count < currSCCB->Sccb_ATC) {
54218c2ecf20Sopenharmony_ci
54228c2ecf20Sopenharmony_ci			sg_index++;
54238c2ecf20Sopenharmony_ci			segp = (struct blogic_sg_seg *)(currSCCB->DataPointer) +
54248c2ecf20Sopenharmony_ci						(sg_index * 2);
54258c2ecf20Sopenharmony_ci			data_count += segp->segbytes;
54268c2ecf20Sopenharmony_ci		}
54278c2ecf20Sopenharmony_ci
54288c2ecf20Sopenharmony_ci		if (data_count == currSCCB->Sccb_ATC) {
54298c2ecf20Sopenharmony_ci
54308c2ecf20Sopenharmony_ci			currSCCB->Sccb_SGoffset = 0;
54318c2ecf20Sopenharmony_ci			sg_index++;
54328c2ecf20Sopenharmony_ci		}
54338c2ecf20Sopenharmony_ci
54348c2ecf20Sopenharmony_ci		else {
54358c2ecf20Sopenharmony_ci			currSCCB->Sccb_SGoffset =
54368c2ecf20Sopenharmony_ci			    data_count - currSCCB->Sccb_ATC;
54378c2ecf20Sopenharmony_ci		}
54388c2ecf20Sopenharmony_ci
54398c2ecf20Sopenharmony_ci		currSCCB->Sccb_sgseg = (unsigned short)sg_index;
54408c2ecf20Sopenharmony_ci	}
54418c2ecf20Sopenharmony_ci
54428c2ecf20Sopenharmony_ci	else {
54438c2ecf20Sopenharmony_ci		currSCCB->Sccb_XferCnt =
54448c2ecf20Sopenharmony_ci		    currSCCB->DataLength - currSCCB->Sccb_ATC;
54458c2ecf20Sopenharmony_ci	}
54468c2ecf20Sopenharmony_ci}
54478c2ecf20Sopenharmony_ci
54488c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
54498c2ecf20Sopenharmony_ci *
54508c2ecf20Sopenharmony_ci * Function: FPT_scini
54518c2ecf20Sopenharmony_ci *
54528c2ecf20Sopenharmony_ci * Description: Setup all data structures necessary for SCAM selection.
54538c2ecf20Sopenharmony_ci *
54548c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
54558c2ecf20Sopenharmony_ci
54568c2ecf20Sopenharmony_cistatic void FPT_scini(unsigned char p_card, unsigned char p_our_id,
54578c2ecf20Sopenharmony_ci		      unsigned char p_power_up)
54588c2ecf20Sopenharmony_ci{
54598c2ecf20Sopenharmony_ci
54608c2ecf20Sopenharmony_ci	unsigned char loser, assigned_id;
54618c2ecf20Sopenharmony_ci	u32 p_port;
54628c2ecf20Sopenharmony_ci
54638c2ecf20Sopenharmony_ci	unsigned char i, k, ScamFlg;
54648c2ecf20Sopenharmony_ci	struct sccb_card *currCard;
54658c2ecf20Sopenharmony_ci	struct nvram_info *pCurrNvRam;
54668c2ecf20Sopenharmony_ci
54678c2ecf20Sopenharmony_ci	currCard = &FPT_BL_Card[p_card];
54688c2ecf20Sopenharmony_ci	p_port = currCard->ioPort;
54698c2ecf20Sopenharmony_ci	pCurrNvRam = currCard->pNvRamInfo;
54708c2ecf20Sopenharmony_ci
54718c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
54728c2ecf20Sopenharmony_ci		ScamFlg = pCurrNvRam->niScamConf;
54738c2ecf20Sopenharmony_ci		i = pCurrNvRam->niSysConf;
54748c2ecf20Sopenharmony_ci	} else {
54758c2ecf20Sopenharmony_ci		ScamFlg =
54768c2ecf20Sopenharmony_ci		    (unsigned char)FPT_utilEERead(p_port, SCAM_CONFIG / 2);
54778c2ecf20Sopenharmony_ci		i = (unsigned
54788c2ecf20Sopenharmony_ci		     char)(FPT_utilEERead(p_port, (SYSTEM_CONFIG / 2)));
54798c2ecf20Sopenharmony_ci	}
54808c2ecf20Sopenharmony_ci	if (!(i & 0x02))	/* check if reset bus in AutoSCSI parameter set */
54818c2ecf20Sopenharmony_ci		return;
54828c2ecf20Sopenharmony_ci
54838c2ecf20Sopenharmony_ci	FPT_inisci(p_card, p_port, p_our_id);
54848c2ecf20Sopenharmony_ci
54858c2ecf20Sopenharmony_ci	/* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
54868c2ecf20Sopenharmony_ci	   too slow to return to SCAM selection */
54878c2ecf20Sopenharmony_ci
54888c2ecf20Sopenharmony_ci	/* if (p_power_up)
54898c2ecf20Sopenharmony_ci	   FPT_Wait1Second(p_port);
54908c2ecf20Sopenharmony_ci	   else
54918c2ecf20Sopenharmony_ci	   FPT_Wait(p_port, TO_250ms); */
54928c2ecf20Sopenharmony_ci
54938c2ecf20Sopenharmony_ci	FPT_Wait1Second(p_port);
54948c2ecf20Sopenharmony_ci
54958c2ecf20Sopenharmony_ci	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) {
54968c2ecf20Sopenharmony_ci		while (!(FPT_scarb(p_port, INIT_SELTD))) {
54978c2ecf20Sopenharmony_ci		}
54988c2ecf20Sopenharmony_ci
54998c2ecf20Sopenharmony_ci		FPT_scsel(p_port);
55008c2ecf20Sopenharmony_ci
55018c2ecf20Sopenharmony_ci		do {
55028c2ecf20Sopenharmony_ci			FPT_scxferc(p_port, SYNC_PTRN);
55038c2ecf20Sopenharmony_ci			FPT_scxferc(p_port, DOM_MSTR);
55048c2ecf20Sopenharmony_ci			loser =
55058c2ecf20Sopenharmony_ci			    FPT_scsendi(p_port,
55068c2ecf20Sopenharmony_ci					&FPT_scamInfo[p_our_id].id_string[0]);
55078c2ecf20Sopenharmony_ci		} while (loser == 0xFF);
55088c2ecf20Sopenharmony_ci
55098c2ecf20Sopenharmony_ci		FPT_scbusf(p_port);
55108c2ecf20Sopenharmony_ci
55118c2ecf20Sopenharmony_ci		if ((p_power_up) && (!loser)) {
55128c2ecf20Sopenharmony_ci			FPT_sresb(p_port, p_card);
55138c2ecf20Sopenharmony_ci			FPT_Wait(p_port, TO_250ms);
55148c2ecf20Sopenharmony_ci
55158c2ecf20Sopenharmony_ci			while (!(FPT_scarb(p_port, INIT_SELTD))) {
55168c2ecf20Sopenharmony_ci			}
55178c2ecf20Sopenharmony_ci
55188c2ecf20Sopenharmony_ci			FPT_scsel(p_port);
55198c2ecf20Sopenharmony_ci
55208c2ecf20Sopenharmony_ci			do {
55218c2ecf20Sopenharmony_ci				FPT_scxferc(p_port, SYNC_PTRN);
55228c2ecf20Sopenharmony_ci				FPT_scxferc(p_port, DOM_MSTR);
55238c2ecf20Sopenharmony_ci				loser =
55248c2ecf20Sopenharmony_ci				    FPT_scsendi(p_port,
55258c2ecf20Sopenharmony_ci						&FPT_scamInfo[p_our_id].
55268c2ecf20Sopenharmony_ci						id_string[0]);
55278c2ecf20Sopenharmony_ci			} while (loser == 0xFF);
55288c2ecf20Sopenharmony_ci
55298c2ecf20Sopenharmony_ci			FPT_scbusf(p_port);
55308c2ecf20Sopenharmony_ci		}
55318c2ecf20Sopenharmony_ci	}
55328c2ecf20Sopenharmony_ci
55338c2ecf20Sopenharmony_ci	else {
55348c2ecf20Sopenharmony_ci		loser = 0;
55358c2ecf20Sopenharmony_ci	}
55368c2ecf20Sopenharmony_ci
55378c2ecf20Sopenharmony_ci	if (!loser) {
55388c2ecf20Sopenharmony_ci
55398c2ecf20Sopenharmony_ci		FPT_scamInfo[p_our_id].state = ID_ASSIGNED;
55408c2ecf20Sopenharmony_ci
55418c2ecf20Sopenharmony_ci		if (ScamFlg & SCAM_ENABLED) {
55428c2ecf20Sopenharmony_ci
55438c2ecf20Sopenharmony_ci			for (i = 0; i < MAX_SCSI_TAR; i++) {
55448c2ecf20Sopenharmony_ci				if ((FPT_scamInfo[i].state == ID_UNASSIGNED) ||
55458c2ecf20Sopenharmony_ci				    (FPT_scamInfo[i].state == ID_UNUSED)) {
55468c2ecf20Sopenharmony_ci					if (FPT_scsell(p_port, i)) {
55478c2ecf20Sopenharmony_ci						FPT_scamInfo[i].state = LEGACY;
55488c2ecf20Sopenharmony_ci						if ((FPT_scamInfo[i].
55498c2ecf20Sopenharmony_ci						     id_string[0] != 0xFF)
55508c2ecf20Sopenharmony_ci						    || (FPT_scamInfo[i].
55518c2ecf20Sopenharmony_ci							id_string[1] != 0xFA)) {
55528c2ecf20Sopenharmony_ci
55538c2ecf20Sopenharmony_ci							FPT_scamInfo[i].
55548c2ecf20Sopenharmony_ci							    id_string[0] = 0xFF;
55558c2ecf20Sopenharmony_ci							FPT_scamInfo[i].
55568c2ecf20Sopenharmony_ci							    id_string[1] = 0xFA;
55578c2ecf20Sopenharmony_ci							if (pCurrNvRam == NULL)
55588c2ecf20Sopenharmony_ci								currCard->
55598c2ecf20Sopenharmony_ci								    globalFlags
55608c2ecf20Sopenharmony_ci								    |=
55618c2ecf20Sopenharmony_ci								    F_UPDATE_EEPROM;
55628c2ecf20Sopenharmony_ci						}
55638c2ecf20Sopenharmony_ci					}
55648c2ecf20Sopenharmony_ci				}
55658c2ecf20Sopenharmony_ci			}
55668c2ecf20Sopenharmony_ci
55678c2ecf20Sopenharmony_ci			FPT_sresb(p_port, p_card);
55688c2ecf20Sopenharmony_ci			FPT_Wait1Second(p_port);
55698c2ecf20Sopenharmony_ci			while (!(FPT_scarb(p_port, INIT_SELTD))) {
55708c2ecf20Sopenharmony_ci			}
55718c2ecf20Sopenharmony_ci			FPT_scsel(p_port);
55728c2ecf20Sopenharmony_ci			FPT_scasid(p_card, p_port);
55738c2ecf20Sopenharmony_ci		}
55748c2ecf20Sopenharmony_ci
55758c2ecf20Sopenharmony_ci	}
55768c2ecf20Sopenharmony_ci
55778c2ecf20Sopenharmony_ci	else if ((loser) && (ScamFlg & SCAM_ENABLED)) {
55788c2ecf20Sopenharmony_ci		FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
55798c2ecf20Sopenharmony_ci		assigned_id = 0;
55808c2ecf20Sopenharmony_ci		FPT_scwtsel(p_port);
55818c2ecf20Sopenharmony_ci
55828c2ecf20Sopenharmony_ci		do {
55838c2ecf20Sopenharmony_ci			while (FPT_scxferc(p_port, 0x00) != SYNC_PTRN) {
55848c2ecf20Sopenharmony_ci			}
55858c2ecf20Sopenharmony_ci
55868c2ecf20Sopenharmony_ci			i = FPT_scxferc(p_port, 0x00);
55878c2ecf20Sopenharmony_ci			if (i == ASSIGN_ID) {
55888c2ecf20Sopenharmony_ci				if (!
55898c2ecf20Sopenharmony_ci				    (FPT_scsendi
55908c2ecf20Sopenharmony_ci				     (p_port,
55918c2ecf20Sopenharmony_ci				      &FPT_scamInfo[p_our_id].id_string[0]))) {
55928c2ecf20Sopenharmony_ci					i = FPT_scxferc(p_port, 0x00);
55938c2ecf20Sopenharmony_ci					if (FPT_scvalq(i)) {
55948c2ecf20Sopenharmony_ci						k = FPT_scxferc(p_port, 0x00);
55958c2ecf20Sopenharmony_ci
55968c2ecf20Sopenharmony_ci						if (FPT_scvalq(k)) {
55978c2ecf20Sopenharmony_ci							currCard->ourId =
55988c2ecf20Sopenharmony_ci							    ((unsigned char)(i
55998c2ecf20Sopenharmony_ci									     <<
56008c2ecf20Sopenharmony_ci									     3)
56018c2ecf20Sopenharmony_ci							     +
56028c2ecf20Sopenharmony_ci							     (k &
56038c2ecf20Sopenharmony_ci							      (unsigned char)7))
56048c2ecf20Sopenharmony_ci							    & (unsigned char)
56058c2ecf20Sopenharmony_ci							    0x3F;
56068c2ecf20Sopenharmony_ci							FPT_inisci(p_card,
56078c2ecf20Sopenharmony_ci								   p_port,
56088c2ecf20Sopenharmony_ci								   p_our_id);
56098c2ecf20Sopenharmony_ci							FPT_scamInfo[currCard->
56108c2ecf20Sopenharmony_ci								     ourId].
56118c2ecf20Sopenharmony_ci							    state = ID_ASSIGNED;
56128c2ecf20Sopenharmony_ci							FPT_scamInfo[currCard->
56138c2ecf20Sopenharmony_ci								     ourId].
56148c2ecf20Sopenharmony_ci							    id_string[0]
56158c2ecf20Sopenharmony_ci							    = SLV_TYPE_CODE0;
56168c2ecf20Sopenharmony_ci							assigned_id = 1;
56178c2ecf20Sopenharmony_ci						}
56188c2ecf20Sopenharmony_ci					}
56198c2ecf20Sopenharmony_ci				}
56208c2ecf20Sopenharmony_ci			}
56218c2ecf20Sopenharmony_ci
56228c2ecf20Sopenharmony_ci			else if (i == SET_P_FLAG) {
56238c2ecf20Sopenharmony_ci				if (!(FPT_scsendi(p_port,
56248c2ecf20Sopenharmony_ci						  &FPT_scamInfo[p_our_id].
56258c2ecf20Sopenharmony_ci						  id_string[0])))
56268c2ecf20Sopenharmony_ci					FPT_scamInfo[p_our_id].id_string[0] |=
56278c2ecf20Sopenharmony_ci					    0x80;
56288c2ecf20Sopenharmony_ci			}
56298c2ecf20Sopenharmony_ci		} while (!assigned_id);
56308c2ecf20Sopenharmony_ci
56318c2ecf20Sopenharmony_ci		while (FPT_scxferc(p_port, 0x00) != CFG_CMPLT) {
56328c2ecf20Sopenharmony_ci		}
56338c2ecf20Sopenharmony_ci	}
56348c2ecf20Sopenharmony_ci
56358c2ecf20Sopenharmony_ci	if (ScamFlg & SCAM_ENABLED) {
56368c2ecf20Sopenharmony_ci		FPT_scbusf(p_port);
56378c2ecf20Sopenharmony_ci		if (currCard->globalFlags & F_UPDATE_EEPROM) {
56388c2ecf20Sopenharmony_ci			FPT_scsavdi(p_card, p_port);
56398c2ecf20Sopenharmony_ci			currCard->globalFlags &= ~F_UPDATE_EEPROM;
56408c2ecf20Sopenharmony_ci		}
56418c2ecf20Sopenharmony_ci	}
56428c2ecf20Sopenharmony_ci
56438c2ecf20Sopenharmony_ci/*
56448c2ecf20Sopenharmony_ci   for (i=0,k=0; i < MAX_SCSI_TAR; i++)
56458c2ecf20Sopenharmony_ci      {
56468c2ecf20Sopenharmony_ci      if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
56478c2ecf20Sopenharmony_ci         (FPT_scamInfo[i].state == LEGACY))
56488c2ecf20Sopenharmony_ci         k++;
56498c2ecf20Sopenharmony_ci      }
56508c2ecf20Sopenharmony_ci
56518c2ecf20Sopenharmony_ci   if (k==2)
56528c2ecf20Sopenharmony_ci      currCard->globalFlags |= F_SINGLE_DEVICE;
56538c2ecf20Sopenharmony_ci   else
56548c2ecf20Sopenharmony_ci      currCard->globalFlags &= ~F_SINGLE_DEVICE;
56558c2ecf20Sopenharmony_ci*/
56568c2ecf20Sopenharmony_ci}
56578c2ecf20Sopenharmony_ci
56588c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
56598c2ecf20Sopenharmony_ci *
56608c2ecf20Sopenharmony_ci * Function: FPT_scarb
56618c2ecf20Sopenharmony_ci *
56628c2ecf20Sopenharmony_ci * Description: Gain control of the bus and wait SCAM select time (250ms)
56638c2ecf20Sopenharmony_ci *
56648c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
56658c2ecf20Sopenharmony_ci
56668c2ecf20Sopenharmony_cistatic int FPT_scarb(u32 p_port, unsigned char p_sel_type)
56678c2ecf20Sopenharmony_ci{
56688c2ecf20Sopenharmony_ci	if (p_sel_type == INIT_SELTD) {
56698c2ecf20Sopenharmony_ci
56708c2ecf20Sopenharmony_ci		while (RD_HARPOON(p_port + hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {
56718c2ecf20Sopenharmony_ci		}
56728c2ecf20Sopenharmony_ci
56738c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL)
56748c2ecf20Sopenharmony_ci			return 0;
56758c2ecf20Sopenharmony_ci
56768c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsidata_0) != 00)
56778c2ecf20Sopenharmony_ci			return 0;
56788c2ecf20Sopenharmony_ci
56798c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig,
56808c2ecf20Sopenharmony_ci			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_BSY));
56818c2ecf20Sopenharmony_ci
56828c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) {
56838c2ecf20Sopenharmony_ci
56848c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_scsisig,
56858c2ecf20Sopenharmony_ci				   (RD_HARPOON(p_port + hp_scsisig) &
56868c2ecf20Sopenharmony_ci				    ~SCSI_BSY));
56878c2ecf20Sopenharmony_ci			return 0;
56888c2ecf20Sopenharmony_ci		}
56898c2ecf20Sopenharmony_ci
56908c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig,
56918c2ecf20Sopenharmony_ci			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_SEL));
56928c2ecf20Sopenharmony_ci
56938c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsidata_0) != 00) {
56948c2ecf20Sopenharmony_ci
56958c2ecf20Sopenharmony_ci			WR_HARPOON(p_port + hp_scsisig,
56968c2ecf20Sopenharmony_ci				   (RD_HARPOON(p_port + hp_scsisig) &
56978c2ecf20Sopenharmony_ci				    ~(SCSI_BSY | SCSI_SEL)));
56988c2ecf20Sopenharmony_ci			return 0;
56998c2ecf20Sopenharmony_ci		}
57008c2ecf20Sopenharmony_ci	}
57018c2ecf20Sopenharmony_ci
57028c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
57038c2ecf20Sopenharmony_ci					   & ~ACTdeassert));
57048c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsireset, SCAM_EN);
57058c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, 0x00);
57068c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_1, 0x00);
57078c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, SCSI_BUS_EN);
57088c2ecf20Sopenharmony_ci
57098c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig,
57108c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_scsisig) | SCSI_MSG));
57118c2ecf20Sopenharmony_ci
57128c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, (RD_HARPOON(p_port + hp_scsisig)
57138c2ecf20Sopenharmony_ci					 & ~SCSI_BSY));
57148c2ecf20Sopenharmony_ci
57158c2ecf20Sopenharmony_ci	FPT_Wait(p_port, TO_250ms);
57168c2ecf20Sopenharmony_ci
57178c2ecf20Sopenharmony_ci	return 1;
57188c2ecf20Sopenharmony_ci}
57198c2ecf20Sopenharmony_ci
57208c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
57218c2ecf20Sopenharmony_ci *
57228c2ecf20Sopenharmony_ci * Function: FPT_scbusf
57238c2ecf20Sopenharmony_ci *
57248c2ecf20Sopenharmony_ci * Description: Release the SCSI bus and disable SCAM selection.
57258c2ecf20Sopenharmony_ci *
57268c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
57278c2ecf20Sopenharmony_ci
57288c2ecf20Sopenharmony_cistatic void FPT_scbusf(u32 p_port)
57298c2ecf20Sopenharmony_ci{
57308c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl,
57318c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
57328c2ecf20Sopenharmony_ci
57338c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, 0x00);
57348c2ecf20Sopenharmony_ci
57358c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, (RD_HARPOON(p_port + hp_portctrl_0)
57368c2ecf20Sopenharmony_ci					    & ~SCSI_BUS_EN));
57378c2ecf20Sopenharmony_ci
57388c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, 0x00);
57398c2ecf20Sopenharmony_ci
57408c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsireset, (RD_HARPOON(p_port + hp_scsireset)
57418c2ecf20Sopenharmony_ci					   & ~SCAM_EN));
57428c2ecf20Sopenharmony_ci
57438c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
57448c2ecf20Sopenharmony_ci					   | ACTdeassert));
57458c2ecf20Sopenharmony_ci
57468c2ecf20Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
57478c2ecf20Sopenharmony_ci
57488c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl,
57498c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_page_ctrl) & ~G_INT_DISABLE));
57508c2ecf20Sopenharmony_ci}
57518c2ecf20Sopenharmony_ci
57528c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
57538c2ecf20Sopenharmony_ci *
57548c2ecf20Sopenharmony_ci * Function: FPT_scasid
57558c2ecf20Sopenharmony_ci *
57568c2ecf20Sopenharmony_ci * Description: Assign an ID to all the SCAM devices.
57578c2ecf20Sopenharmony_ci *
57588c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
57598c2ecf20Sopenharmony_ci
57608c2ecf20Sopenharmony_cistatic void FPT_scasid(unsigned char p_card, u32 p_port)
57618c2ecf20Sopenharmony_ci{
57628c2ecf20Sopenharmony_ci	unsigned char temp_id_string[ID_STRING_LENGTH];
57638c2ecf20Sopenharmony_ci
57648c2ecf20Sopenharmony_ci	unsigned char i, k, scam_id;
57658c2ecf20Sopenharmony_ci	unsigned char crcBytes[3];
57668c2ecf20Sopenharmony_ci	struct nvram_info *pCurrNvRam;
57678c2ecf20Sopenharmony_ci	unsigned short *pCrcBytes;
57688c2ecf20Sopenharmony_ci
57698c2ecf20Sopenharmony_ci	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
57708c2ecf20Sopenharmony_ci
57718c2ecf20Sopenharmony_ci	i = 0;
57728c2ecf20Sopenharmony_ci
57738c2ecf20Sopenharmony_ci	while (!i) {
57748c2ecf20Sopenharmony_ci
57758c2ecf20Sopenharmony_ci		for (k = 0; k < ID_STRING_LENGTH; k++) {
57768c2ecf20Sopenharmony_ci			temp_id_string[k] = (unsigned char)0x00;
57778c2ecf20Sopenharmony_ci		}
57788c2ecf20Sopenharmony_ci
57798c2ecf20Sopenharmony_ci		FPT_scxferc(p_port, SYNC_PTRN);
57808c2ecf20Sopenharmony_ci		FPT_scxferc(p_port, ASSIGN_ID);
57818c2ecf20Sopenharmony_ci
57828c2ecf20Sopenharmony_ci		if (!(FPT_sciso(p_port, &temp_id_string[0]))) {
57838c2ecf20Sopenharmony_ci			if (pCurrNvRam) {
57848c2ecf20Sopenharmony_ci				pCrcBytes = (unsigned short *)&crcBytes[0];
57858c2ecf20Sopenharmony_ci				*pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
57868c2ecf20Sopenharmony_ci				crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
57878c2ecf20Sopenharmony_ci				temp_id_string[1] = crcBytes[2];
57888c2ecf20Sopenharmony_ci				temp_id_string[2] = crcBytes[0];
57898c2ecf20Sopenharmony_ci				temp_id_string[3] = crcBytes[1];
57908c2ecf20Sopenharmony_ci				for (k = 4; k < ID_STRING_LENGTH; k++)
57918c2ecf20Sopenharmony_ci					temp_id_string[k] = (unsigned char)0x00;
57928c2ecf20Sopenharmony_ci			}
57938c2ecf20Sopenharmony_ci			i = FPT_scmachid(p_card, temp_id_string);
57948c2ecf20Sopenharmony_ci
57958c2ecf20Sopenharmony_ci			if (i == CLR_PRIORITY) {
57968c2ecf20Sopenharmony_ci				FPT_scxferc(p_port, MISC_CODE);
57978c2ecf20Sopenharmony_ci				FPT_scxferc(p_port, CLR_P_FLAG);
57988c2ecf20Sopenharmony_ci				i = 0;	/*Not the last ID yet. */
57998c2ecf20Sopenharmony_ci			}
58008c2ecf20Sopenharmony_ci
58018c2ecf20Sopenharmony_ci			else if (i != NO_ID_AVAIL) {
58028c2ecf20Sopenharmony_ci				if (i < 8)
58038c2ecf20Sopenharmony_ci					FPT_scxferc(p_port, ID_0_7);
58048c2ecf20Sopenharmony_ci				else
58058c2ecf20Sopenharmony_ci					FPT_scxferc(p_port, ID_8_F);
58068c2ecf20Sopenharmony_ci
58078c2ecf20Sopenharmony_ci				scam_id = (i & (unsigned char)0x07);
58088c2ecf20Sopenharmony_ci
58098c2ecf20Sopenharmony_ci				for (k = 1; k < 0x08; k <<= 1)
58108c2ecf20Sopenharmony_ci					if (!(k & i))
58118c2ecf20Sopenharmony_ci						scam_id += 0x08;	/*Count number of zeros in DB0-3. */
58128c2ecf20Sopenharmony_ci
58138c2ecf20Sopenharmony_ci				FPT_scxferc(p_port, scam_id);
58148c2ecf20Sopenharmony_ci
58158c2ecf20Sopenharmony_ci				i = 0;	/*Not the last ID yet. */
58168c2ecf20Sopenharmony_ci			}
58178c2ecf20Sopenharmony_ci		}
58188c2ecf20Sopenharmony_ci
58198c2ecf20Sopenharmony_ci		else {
58208c2ecf20Sopenharmony_ci			i = 1;
58218c2ecf20Sopenharmony_ci		}
58228c2ecf20Sopenharmony_ci
58238c2ecf20Sopenharmony_ci	}			/*End while */
58248c2ecf20Sopenharmony_ci
58258c2ecf20Sopenharmony_ci	FPT_scxferc(p_port, SYNC_PTRN);
58268c2ecf20Sopenharmony_ci	FPT_scxferc(p_port, CFG_CMPLT);
58278c2ecf20Sopenharmony_ci}
58288c2ecf20Sopenharmony_ci
58298c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
58308c2ecf20Sopenharmony_ci *
58318c2ecf20Sopenharmony_ci * Function: FPT_scsel
58328c2ecf20Sopenharmony_ci *
58338c2ecf20Sopenharmony_ci * Description: Select all the SCAM devices.
58348c2ecf20Sopenharmony_ci *
58358c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
58368c2ecf20Sopenharmony_ci
58378c2ecf20Sopenharmony_cistatic void FPT_scsel(u32 p_port)
58388c2ecf20Sopenharmony_ci{
58398c2ecf20Sopenharmony_ci
58408c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, SCSI_SEL);
58418c2ecf20Sopenharmony_ci	FPT_scwiros(p_port, SCSI_MSG);
58428c2ecf20Sopenharmony_ci
58438c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, (SCSI_SEL | SCSI_BSY));
58448c2ecf20Sopenharmony_ci
58458c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig,
58468c2ecf20Sopenharmony_ci		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
58478c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0,
58488c2ecf20Sopenharmony_ci		   (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) |
58498c2ecf20Sopenharmony_ci				   (unsigned char)(BIT(7) + BIT(6))));
58508c2ecf20Sopenharmony_ci
58518c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
58528c2ecf20Sopenharmony_ci	FPT_scwiros(p_port, SCSI_SEL);
58538c2ecf20Sopenharmony_ci
58548c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0,
58558c2ecf20Sopenharmony_ci		   (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) &
58568c2ecf20Sopenharmony_ci				   ~(unsigned char)BIT(6)));
58578c2ecf20Sopenharmony_ci	FPT_scwirod(p_port, BIT(6));
58588c2ecf20Sopenharmony_ci
58598c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig,
58608c2ecf20Sopenharmony_ci		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
58618c2ecf20Sopenharmony_ci}
58628c2ecf20Sopenharmony_ci
58638c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
58648c2ecf20Sopenharmony_ci *
58658c2ecf20Sopenharmony_ci * Function: FPT_scxferc
58668c2ecf20Sopenharmony_ci *
58678c2ecf20Sopenharmony_ci * Description: Handshake the p_data (DB4-0) across the bus.
58688c2ecf20Sopenharmony_ci *
58698c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
58708c2ecf20Sopenharmony_ci
58718c2ecf20Sopenharmony_cistatic unsigned char FPT_scxferc(u32 p_port, unsigned char p_data)
58728c2ecf20Sopenharmony_ci{
58738c2ecf20Sopenharmony_ci	unsigned char curr_data, ret_data;
58748c2ecf20Sopenharmony_ci
58758c2ecf20Sopenharmony_ci	curr_data = p_data | BIT(7) | BIT(5);	/*Start with DB7 & DB5 asserted. */
58768c2ecf20Sopenharmony_ci
58778c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
58788c2ecf20Sopenharmony_ci
58798c2ecf20Sopenharmony_ci	curr_data &= ~BIT(7);
58808c2ecf20Sopenharmony_ci
58818c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
58828c2ecf20Sopenharmony_ci
58838c2ecf20Sopenharmony_ci	FPT_scwirod(p_port, BIT(7));	/*Wait for DB7 to be released. */
58848c2ecf20Sopenharmony_ci	while (!(RD_HARPOON(p_port + hp_scsidata_0) & BIT(5))) ;
58858c2ecf20Sopenharmony_ci
58868c2ecf20Sopenharmony_ci	ret_data = (RD_HARPOON(p_port + hp_scsidata_0) & (unsigned char)0x1F);
58878c2ecf20Sopenharmony_ci
58888c2ecf20Sopenharmony_ci	curr_data |= BIT(6);
58898c2ecf20Sopenharmony_ci
58908c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
58918c2ecf20Sopenharmony_ci
58928c2ecf20Sopenharmony_ci	curr_data &= ~BIT(5);
58938c2ecf20Sopenharmony_ci
58948c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
58958c2ecf20Sopenharmony_ci
58968c2ecf20Sopenharmony_ci	FPT_scwirod(p_port, BIT(5));	/*Wait for DB5 to be released. */
58978c2ecf20Sopenharmony_ci
58988c2ecf20Sopenharmony_ci	curr_data &= ~(BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0));	/*Release data bits */
58998c2ecf20Sopenharmony_ci	curr_data |= BIT(7);
59008c2ecf20Sopenharmony_ci
59018c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
59028c2ecf20Sopenharmony_ci
59038c2ecf20Sopenharmony_ci	curr_data &= ~BIT(6);
59048c2ecf20Sopenharmony_ci
59058c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
59068c2ecf20Sopenharmony_ci
59078c2ecf20Sopenharmony_ci	FPT_scwirod(p_port, BIT(6));	/*Wait for DB6 to be released. */
59088c2ecf20Sopenharmony_ci
59098c2ecf20Sopenharmony_ci	return ret_data;
59108c2ecf20Sopenharmony_ci}
59118c2ecf20Sopenharmony_ci
59128c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
59138c2ecf20Sopenharmony_ci *
59148c2ecf20Sopenharmony_ci * Function: FPT_scsendi
59158c2ecf20Sopenharmony_ci *
59168c2ecf20Sopenharmony_ci * Description: Transfer our Identification string to determine if we
59178c2ecf20Sopenharmony_ci *              will be the dominant master.
59188c2ecf20Sopenharmony_ci *
59198c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
59208c2ecf20Sopenharmony_ci
59218c2ecf20Sopenharmony_cistatic unsigned char FPT_scsendi(u32 p_port, unsigned char p_id_string[])
59228c2ecf20Sopenharmony_ci{
59238c2ecf20Sopenharmony_ci	unsigned char ret_data, byte_cnt, bit_cnt, defer;
59248c2ecf20Sopenharmony_ci
59258c2ecf20Sopenharmony_ci	defer = 0;
59268c2ecf20Sopenharmony_ci
59278c2ecf20Sopenharmony_ci	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
59288c2ecf20Sopenharmony_ci
59298c2ecf20Sopenharmony_ci		for (bit_cnt = 0x80; bit_cnt != 0; bit_cnt >>= 1) {
59308c2ecf20Sopenharmony_ci
59318c2ecf20Sopenharmony_ci			if (defer)
59328c2ecf20Sopenharmony_ci				ret_data = FPT_scxferc(p_port, 00);
59338c2ecf20Sopenharmony_ci
59348c2ecf20Sopenharmony_ci			else if (p_id_string[byte_cnt] & bit_cnt)
59358c2ecf20Sopenharmony_ci
59368c2ecf20Sopenharmony_ci				ret_data = FPT_scxferc(p_port, 02);
59378c2ecf20Sopenharmony_ci
59388c2ecf20Sopenharmony_ci			else {
59398c2ecf20Sopenharmony_ci
59408c2ecf20Sopenharmony_ci				ret_data = FPT_scxferc(p_port, 01);
59418c2ecf20Sopenharmony_ci				if (ret_data & 02)
59428c2ecf20Sopenharmony_ci					defer = 1;
59438c2ecf20Sopenharmony_ci			}
59448c2ecf20Sopenharmony_ci
59458c2ecf20Sopenharmony_ci			if ((ret_data & 0x1C) == 0x10)
59468c2ecf20Sopenharmony_ci				return 0x00;	/*End of isolation stage, we won! */
59478c2ecf20Sopenharmony_ci
59488c2ecf20Sopenharmony_ci			if (ret_data & 0x1C)
59498c2ecf20Sopenharmony_ci				return 0xFF;
59508c2ecf20Sopenharmony_ci
59518c2ecf20Sopenharmony_ci			if ((defer) && (!(ret_data & 0x1F)))
59528c2ecf20Sopenharmony_ci				return 0x01;	/*End of isolation stage, we lost. */
59538c2ecf20Sopenharmony_ci
59548c2ecf20Sopenharmony_ci		}		/*bit loop */
59558c2ecf20Sopenharmony_ci
59568c2ecf20Sopenharmony_ci	}			/*byte loop */
59578c2ecf20Sopenharmony_ci
59588c2ecf20Sopenharmony_ci	if (defer)
59598c2ecf20Sopenharmony_ci		return 0x01;	/*We lost */
59608c2ecf20Sopenharmony_ci	else
59618c2ecf20Sopenharmony_ci		return 0;	/*We WON! Yeeessss! */
59628c2ecf20Sopenharmony_ci}
59638c2ecf20Sopenharmony_ci
59648c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
59658c2ecf20Sopenharmony_ci *
59668c2ecf20Sopenharmony_ci * Function: FPT_sciso
59678c2ecf20Sopenharmony_ci *
59688c2ecf20Sopenharmony_ci * Description: Transfer the Identification string.
59698c2ecf20Sopenharmony_ci *
59708c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
59718c2ecf20Sopenharmony_ci
59728c2ecf20Sopenharmony_cistatic unsigned char FPT_sciso(u32 p_port, unsigned char p_id_string[])
59738c2ecf20Sopenharmony_ci{
59748c2ecf20Sopenharmony_ci	unsigned char ret_data, the_data, byte_cnt, bit_cnt;
59758c2ecf20Sopenharmony_ci
59768c2ecf20Sopenharmony_ci	the_data = 0;
59778c2ecf20Sopenharmony_ci
59788c2ecf20Sopenharmony_ci	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
59798c2ecf20Sopenharmony_ci
59808c2ecf20Sopenharmony_ci		for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
59818c2ecf20Sopenharmony_ci
59828c2ecf20Sopenharmony_ci			ret_data = FPT_scxferc(p_port, 0);
59838c2ecf20Sopenharmony_ci
59848c2ecf20Sopenharmony_ci			if (ret_data & 0xFC)
59858c2ecf20Sopenharmony_ci				return 0xFF;
59868c2ecf20Sopenharmony_ci
59878c2ecf20Sopenharmony_ci			else {
59888c2ecf20Sopenharmony_ci
59898c2ecf20Sopenharmony_ci				the_data <<= 1;
59908c2ecf20Sopenharmony_ci				if (ret_data & BIT(1)) {
59918c2ecf20Sopenharmony_ci					the_data |= 1;
59928c2ecf20Sopenharmony_ci				}
59938c2ecf20Sopenharmony_ci			}
59948c2ecf20Sopenharmony_ci
59958c2ecf20Sopenharmony_ci			if ((ret_data & 0x1F) == 0) {
59968c2ecf20Sopenharmony_ci/*
59978c2ecf20Sopenharmony_ci				if(bit_cnt != 0 || bit_cnt != 8)
59988c2ecf20Sopenharmony_ci				{
59998c2ecf20Sopenharmony_ci					byte_cnt = 0;
60008c2ecf20Sopenharmony_ci					bit_cnt = 0;
60018c2ecf20Sopenharmony_ci					FPT_scxferc(p_port, SYNC_PTRN);
60028c2ecf20Sopenharmony_ci					FPT_scxferc(p_port, ASSIGN_ID);
60038c2ecf20Sopenharmony_ci					continue;
60048c2ecf20Sopenharmony_ci				}
60058c2ecf20Sopenharmony_ci*/
60068c2ecf20Sopenharmony_ci				if (byte_cnt)
60078c2ecf20Sopenharmony_ci					return 0x00;
60088c2ecf20Sopenharmony_ci				else
60098c2ecf20Sopenharmony_ci					return 0xFF;
60108c2ecf20Sopenharmony_ci			}
60118c2ecf20Sopenharmony_ci
60128c2ecf20Sopenharmony_ci		}		/*bit loop */
60138c2ecf20Sopenharmony_ci
60148c2ecf20Sopenharmony_ci		p_id_string[byte_cnt] = the_data;
60158c2ecf20Sopenharmony_ci
60168c2ecf20Sopenharmony_ci	}			/*byte loop */
60178c2ecf20Sopenharmony_ci
60188c2ecf20Sopenharmony_ci	return 0;
60198c2ecf20Sopenharmony_ci}
60208c2ecf20Sopenharmony_ci
60218c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
60228c2ecf20Sopenharmony_ci *
60238c2ecf20Sopenharmony_ci * Function: FPT_scwirod
60248c2ecf20Sopenharmony_ci *
60258c2ecf20Sopenharmony_ci * Description: Sample the SCSI data bus making sure the signal has been
60268c2ecf20Sopenharmony_ci *              deasserted for the correct number of consecutive samples.
60278c2ecf20Sopenharmony_ci *
60288c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
60298c2ecf20Sopenharmony_ci
60308c2ecf20Sopenharmony_cistatic void FPT_scwirod(u32 p_port, unsigned char p_data_bit)
60318c2ecf20Sopenharmony_ci{
60328c2ecf20Sopenharmony_ci	unsigned char i;
60338c2ecf20Sopenharmony_ci
60348c2ecf20Sopenharmony_ci	i = 0;
60358c2ecf20Sopenharmony_ci	while (i < MAX_SCSI_TAR) {
60368c2ecf20Sopenharmony_ci
60378c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsidata_0) & p_data_bit)
60388c2ecf20Sopenharmony_ci
60398c2ecf20Sopenharmony_ci			i = 0;
60408c2ecf20Sopenharmony_ci
60418c2ecf20Sopenharmony_ci		else
60428c2ecf20Sopenharmony_ci
60438c2ecf20Sopenharmony_ci			i++;
60448c2ecf20Sopenharmony_ci
60458c2ecf20Sopenharmony_ci	}
60468c2ecf20Sopenharmony_ci}
60478c2ecf20Sopenharmony_ci
60488c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
60498c2ecf20Sopenharmony_ci *
60508c2ecf20Sopenharmony_ci * Function: FPT_scwiros
60518c2ecf20Sopenharmony_ci *
60528c2ecf20Sopenharmony_ci * Description: Sample the SCSI Signal lines making sure the signal has been
60538c2ecf20Sopenharmony_ci *              deasserted for the correct number of consecutive samples.
60548c2ecf20Sopenharmony_ci *
60558c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
60568c2ecf20Sopenharmony_ci
60578c2ecf20Sopenharmony_cistatic void FPT_scwiros(u32 p_port, unsigned char p_data_bit)
60588c2ecf20Sopenharmony_ci{
60598c2ecf20Sopenharmony_ci	unsigned char i;
60608c2ecf20Sopenharmony_ci
60618c2ecf20Sopenharmony_ci	i = 0;
60628c2ecf20Sopenharmony_ci	while (i < MAX_SCSI_TAR) {
60638c2ecf20Sopenharmony_ci
60648c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & p_data_bit)
60658c2ecf20Sopenharmony_ci
60668c2ecf20Sopenharmony_ci			i = 0;
60678c2ecf20Sopenharmony_ci
60688c2ecf20Sopenharmony_ci		else
60698c2ecf20Sopenharmony_ci
60708c2ecf20Sopenharmony_ci			i++;
60718c2ecf20Sopenharmony_ci
60728c2ecf20Sopenharmony_ci	}
60738c2ecf20Sopenharmony_ci}
60748c2ecf20Sopenharmony_ci
60758c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
60768c2ecf20Sopenharmony_ci *
60778c2ecf20Sopenharmony_ci * Function: FPT_scvalq
60788c2ecf20Sopenharmony_ci *
60798c2ecf20Sopenharmony_ci * Description: Make sure we received a valid data byte.
60808c2ecf20Sopenharmony_ci *
60818c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
60828c2ecf20Sopenharmony_ci
60838c2ecf20Sopenharmony_cistatic unsigned char FPT_scvalq(unsigned char p_quintet)
60848c2ecf20Sopenharmony_ci{
60858c2ecf20Sopenharmony_ci	unsigned char count;
60868c2ecf20Sopenharmony_ci
60878c2ecf20Sopenharmony_ci	for (count = 1; count < 0x08; count <<= 1) {
60888c2ecf20Sopenharmony_ci		if (!(p_quintet & count))
60898c2ecf20Sopenharmony_ci			p_quintet -= 0x80;
60908c2ecf20Sopenharmony_ci	}
60918c2ecf20Sopenharmony_ci
60928c2ecf20Sopenharmony_ci	if (p_quintet & 0x18)
60938c2ecf20Sopenharmony_ci		return 0;
60948c2ecf20Sopenharmony_ci
60958c2ecf20Sopenharmony_ci	else
60968c2ecf20Sopenharmony_ci		return 1;
60978c2ecf20Sopenharmony_ci}
60988c2ecf20Sopenharmony_ci
60998c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
61008c2ecf20Sopenharmony_ci *
61018c2ecf20Sopenharmony_ci * Function: FPT_scsell
61028c2ecf20Sopenharmony_ci *
61038c2ecf20Sopenharmony_ci * Description: Select the specified device ID using a selection timeout
61048c2ecf20Sopenharmony_ci *              less than 4ms.  If somebody responds then it is a legacy
61058c2ecf20Sopenharmony_ci *              drive and this ID must be marked as such.
61068c2ecf20Sopenharmony_ci *
61078c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
61088c2ecf20Sopenharmony_ci
61098c2ecf20Sopenharmony_cistatic unsigned char FPT_scsell(u32 p_port, unsigned char targ_id)
61108c2ecf20Sopenharmony_ci{
61118c2ecf20Sopenharmony_ci	unsigned long i;
61128c2ecf20Sopenharmony_ci
61138c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl,
61148c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
61158c2ecf20Sopenharmony_ci
61168c2ecf20Sopenharmony_ci	ARAM_ACCESS(p_port);
61178c2ecf20Sopenharmony_ci
61188c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_addstat,
61198c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_addstat) | SCAM_TIMER));
61208c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, TO_4ms);
61218c2ecf20Sopenharmony_ci
61228c2ecf20Sopenharmony_ci	for (i = p_port + CMD_STRT; i < p_port + CMD_STRT + 12; i += 2) {
61238c2ecf20Sopenharmony_ci		WRW_HARPOON(i, (MPM_OP + ACOMMAND));
61248c2ecf20Sopenharmony_ci	}
61258c2ecf20Sopenharmony_ci	WRW_HARPOON(i, (BRH_OP + ALWAYS + NP));
61268c2ecf20Sopenharmony_ci
61278c2ecf20Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat),
61288c2ecf20Sopenharmony_ci		    (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
61298c2ecf20Sopenharmony_ci
61308c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_select_id, targ_id);
61318c2ecf20Sopenharmony_ci
61328c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, SCSI_PORT);
61338c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_autostart_3, (SELECT | CMD_ONLY_STRT));
61348c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
61358c2ecf20Sopenharmony_ci
61368c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) &
61378c2ecf20Sopenharmony_ci		 (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {
61388c2ecf20Sopenharmony_ci	}
61398c2ecf20Sopenharmony_ci
61408c2ecf20Sopenharmony_ci	if (RDW_HARPOON((p_port + hp_intstat)) & RESET)
61418c2ecf20Sopenharmony_ci		FPT_Wait(p_port, TO_250ms);
61428c2ecf20Sopenharmony_ci
61438c2ecf20Sopenharmony_ci	DISABLE_AUTO(p_port);
61448c2ecf20Sopenharmony_ci
61458c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_addstat,
61468c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_addstat) & ~SCAM_TIMER));
61478c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, TO_290ms);
61488c2ecf20Sopenharmony_ci
61498c2ecf20Sopenharmony_ci	SGRAM_ACCESS(p_port);
61508c2ecf20Sopenharmony_ci
61518c2ecf20Sopenharmony_ci	if (RDW_HARPOON((p_port + hp_intstat)) & (RESET | TIMEOUT)) {
61528c2ecf20Sopenharmony_ci
61538c2ecf20Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat),
61548c2ecf20Sopenharmony_ci			    (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
61558c2ecf20Sopenharmony_ci
61568c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_page_ctrl,
61578c2ecf20Sopenharmony_ci			   (RD_HARPOON(p_port + hp_page_ctrl) &
61588c2ecf20Sopenharmony_ci			    ~G_INT_DISABLE));
61598c2ecf20Sopenharmony_ci
61608c2ecf20Sopenharmony_ci		return 0;	/*No legacy device */
61618c2ecf20Sopenharmony_ci	}
61628c2ecf20Sopenharmony_ci
61638c2ecf20Sopenharmony_ci	else {
61648c2ecf20Sopenharmony_ci
61658c2ecf20Sopenharmony_ci		while (!(RDW_HARPOON((p_port + hp_intstat)) & BUS_FREE)) {
61668c2ecf20Sopenharmony_ci			if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ) {
61678c2ecf20Sopenharmony_ci				WR_HARPOON(p_port + hp_scsisig,
61688c2ecf20Sopenharmony_ci					   (SCSI_ACK + S_ILL_PH));
61698c2ecf20Sopenharmony_ci				ACCEPT_MSG(p_port);
61708c2ecf20Sopenharmony_ci			}
61718c2ecf20Sopenharmony_ci		}
61728c2ecf20Sopenharmony_ci
61738c2ecf20Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat), CLR_ALL_INT_1);
61748c2ecf20Sopenharmony_ci
61758c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_page_ctrl,
61768c2ecf20Sopenharmony_ci			   (RD_HARPOON(p_port + hp_page_ctrl) &
61778c2ecf20Sopenharmony_ci			    ~G_INT_DISABLE));
61788c2ecf20Sopenharmony_ci
61798c2ecf20Sopenharmony_ci		return 1;	/*Found one of them oldies! */
61808c2ecf20Sopenharmony_ci	}
61818c2ecf20Sopenharmony_ci}
61828c2ecf20Sopenharmony_ci
61838c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
61848c2ecf20Sopenharmony_ci *
61858c2ecf20Sopenharmony_ci * Function: FPT_scwtsel
61868c2ecf20Sopenharmony_ci *
61878c2ecf20Sopenharmony_ci * Description: Wait to be selected by another SCAM initiator.
61888c2ecf20Sopenharmony_ci *
61898c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
61908c2ecf20Sopenharmony_ci
61918c2ecf20Sopenharmony_cistatic void FPT_scwtsel(u32 p_port)
61928c2ecf20Sopenharmony_ci{
61938c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) {
61948c2ecf20Sopenharmony_ci	}
61958c2ecf20Sopenharmony_ci}
61968c2ecf20Sopenharmony_ci
61978c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
61988c2ecf20Sopenharmony_ci *
61998c2ecf20Sopenharmony_ci * Function: FPT_inisci
62008c2ecf20Sopenharmony_ci *
62018c2ecf20Sopenharmony_ci * Description: Setup the data Structure with the info from the EEPROM.
62028c2ecf20Sopenharmony_ci *
62038c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
62048c2ecf20Sopenharmony_ci
62058c2ecf20Sopenharmony_cistatic void FPT_inisci(unsigned char p_card, u32 p_port, unsigned char p_our_id)
62068c2ecf20Sopenharmony_ci{
62078c2ecf20Sopenharmony_ci	unsigned char i, k, max_id;
62088c2ecf20Sopenharmony_ci	unsigned short ee_data;
62098c2ecf20Sopenharmony_ci	struct nvram_info *pCurrNvRam;
62108c2ecf20Sopenharmony_ci
62118c2ecf20Sopenharmony_ci	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
62128c2ecf20Sopenharmony_ci
62138c2ecf20Sopenharmony_ci	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
62148c2ecf20Sopenharmony_ci		max_id = 0x08;
62158c2ecf20Sopenharmony_ci
62168c2ecf20Sopenharmony_ci	else
62178c2ecf20Sopenharmony_ci		max_id = 0x10;
62188c2ecf20Sopenharmony_ci
62198c2ecf20Sopenharmony_ci	if (pCurrNvRam) {
62208c2ecf20Sopenharmony_ci		for (i = 0; i < max_id; i++) {
62218c2ecf20Sopenharmony_ci
62228c2ecf20Sopenharmony_ci			for (k = 0; k < 4; k++)
62238c2ecf20Sopenharmony_ci				FPT_scamInfo[i].id_string[k] =
62248c2ecf20Sopenharmony_ci				    pCurrNvRam->niScamTbl[i][k];
62258c2ecf20Sopenharmony_ci			for (k = 4; k < ID_STRING_LENGTH; k++)
62268c2ecf20Sopenharmony_ci				FPT_scamInfo[i].id_string[k] =
62278c2ecf20Sopenharmony_ci				    (unsigned char)0x00;
62288c2ecf20Sopenharmony_ci
62298c2ecf20Sopenharmony_ci			if (FPT_scamInfo[i].id_string[0] == 0x00)
62308c2ecf20Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
62318c2ecf20Sopenharmony_ci			else
62328c2ecf20Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
62338c2ecf20Sopenharmony_ci
62348c2ecf20Sopenharmony_ci		}
62358c2ecf20Sopenharmony_ci	} else {
62368c2ecf20Sopenharmony_ci		for (i = 0; i < max_id; i++) {
62378c2ecf20Sopenharmony_ci			for (k = 0; k < ID_STRING_LENGTH; k += 2) {
62388c2ecf20Sopenharmony_ci				ee_data =
62398c2ecf20Sopenharmony_ci				    FPT_utilEERead(p_port,
62408c2ecf20Sopenharmony_ci						   (unsigned
62418c2ecf20Sopenharmony_ci						    short)((EE_SCAMBASE / 2) +
62428c2ecf20Sopenharmony_ci							   (unsigned short)(i *
62438c2ecf20Sopenharmony_ci									    ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
62448c2ecf20Sopenharmony_ci				FPT_scamInfo[i].id_string[k] =
62458c2ecf20Sopenharmony_ci				    (unsigned char)ee_data;
62468c2ecf20Sopenharmony_ci				ee_data >>= 8;
62478c2ecf20Sopenharmony_ci				FPT_scamInfo[i].id_string[k + 1] =
62488c2ecf20Sopenharmony_ci				    (unsigned char)ee_data;
62498c2ecf20Sopenharmony_ci			}
62508c2ecf20Sopenharmony_ci
62518c2ecf20Sopenharmony_ci			if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
62528c2ecf20Sopenharmony_ci			    (FPT_scamInfo[i].id_string[0] == 0xFF))
62538c2ecf20Sopenharmony_ci
62548c2ecf20Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
62558c2ecf20Sopenharmony_ci
62568c2ecf20Sopenharmony_ci			else
62578c2ecf20Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
62588c2ecf20Sopenharmony_ci
62598c2ecf20Sopenharmony_ci		}
62608c2ecf20Sopenharmony_ci	}
62618c2ecf20Sopenharmony_ci	for (k = 0; k < ID_STRING_LENGTH; k++)
62628c2ecf20Sopenharmony_ci		FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
62638c2ecf20Sopenharmony_ci
62648c2ecf20Sopenharmony_ci}
62658c2ecf20Sopenharmony_ci
62668c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
62678c2ecf20Sopenharmony_ci *
62688c2ecf20Sopenharmony_ci * Function: FPT_scmachid
62698c2ecf20Sopenharmony_ci *
62708c2ecf20Sopenharmony_ci * Description: Match the Device ID string with our values stored in
62718c2ecf20Sopenharmony_ci *              the EEPROM.
62728c2ecf20Sopenharmony_ci *
62738c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
62748c2ecf20Sopenharmony_ci
62758c2ecf20Sopenharmony_cistatic unsigned char FPT_scmachid(unsigned char p_card,
62768c2ecf20Sopenharmony_ci				  unsigned char p_id_string[])
62778c2ecf20Sopenharmony_ci{
62788c2ecf20Sopenharmony_ci
62798c2ecf20Sopenharmony_ci	unsigned char i, k, match;
62808c2ecf20Sopenharmony_ci
62818c2ecf20Sopenharmony_ci	for (i = 0; i < MAX_SCSI_TAR; i++) {
62828c2ecf20Sopenharmony_ci
62838c2ecf20Sopenharmony_ci		match = 1;
62848c2ecf20Sopenharmony_ci
62858c2ecf20Sopenharmony_ci		for (k = 0; k < ID_STRING_LENGTH; k++) {
62868c2ecf20Sopenharmony_ci			if (p_id_string[k] != FPT_scamInfo[i].id_string[k])
62878c2ecf20Sopenharmony_ci				match = 0;
62888c2ecf20Sopenharmony_ci		}
62898c2ecf20Sopenharmony_ci
62908c2ecf20Sopenharmony_ci		if (match) {
62918c2ecf20Sopenharmony_ci			FPT_scamInfo[i].state = ID_ASSIGNED;
62928c2ecf20Sopenharmony_ci			return i;
62938c2ecf20Sopenharmony_ci		}
62948c2ecf20Sopenharmony_ci
62958c2ecf20Sopenharmony_ci	}
62968c2ecf20Sopenharmony_ci
62978c2ecf20Sopenharmony_ci	if (p_id_string[0] & BIT(5))
62988c2ecf20Sopenharmony_ci		i = 8;
62998c2ecf20Sopenharmony_ci	else
63008c2ecf20Sopenharmony_ci		i = MAX_SCSI_TAR;
63018c2ecf20Sopenharmony_ci
63028c2ecf20Sopenharmony_ci	if (((p_id_string[0] & 0x06) == 0x02)
63038c2ecf20Sopenharmony_ci	    || ((p_id_string[0] & 0x06) == 0x04))
63048c2ecf20Sopenharmony_ci		match = p_id_string[1] & (unsigned char)0x1F;
63058c2ecf20Sopenharmony_ci	else
63068c2ecf20Sopenharmony_ci		match = 7;
63078c2ecf20Sopenharmony_ci
63088c2ecf20Sopenharmony_ci	while (i > 0) {
63098c2ecf20Sopenharmony_ci		i--;
63108c2ecf20Sopenharmony_ci
63118c2ecf20Sopenharmony_ci		if (FPT_scamInfo[match].state == ID_UNUSED) {
63128c2ecf20Sopenharmony_ci			for (k = 0; k < ID_STRING_LENGTH; k++) {
63138c2ecf20Sopenharmony_ci				FPT_scamInfo[match].id_string[k] =
63148c2ecf20Sopenharmony_ci				    p_id_string[k];
63158c2ecf20Sopenharmony_ci			}
63168c2ecf20Sopenharmony_ci
63178c2ecf20Sopenharmony_ci			FPT_scamInfo[match].state = ID_ASSIGNED;
63188c2ecf20Sopenharmony_ci
63198c2ecf20Sopenharmony_ci			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
63208c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].globalFlags |=
63218c2ecf20Sopenharmony_ci				    F_UPDATE_EEPROM;
63228c2ecf20Sopenharmony_ci			return match;
63238c2ecf20Sopenharmony_ci
63248c2ecf20Sopenharmony_ci		}
63258c2ecf20Sopenharmony_ci
63268c2ecf20Sopenharmony_ci		match--;
63278c2ecf20Sopenharmony_ci
63288c2ecf20Sopenharmony_ci		if (match == 0xFF) {
63298c2ecf20Sopenharmony_ci			if (p_id_string[0] & BIT(5))
63308c2ecf20Sopenharmony_ci				match = 7;
63318c2ecf20Sopenharmony_ci			else
63328c2ecf20Sopenharmony_ci				match = MAX_SCSI_TAR - 1;
63338c2ecf20Sopenharmony_ci		}
63348c2ecf20Sopenharmony_ci	}
63358c2ecf20Sopenharmony_ci
63368c2ecf20Sopenharmony_ci	if (p_id_string[0] & BIT(7)) {
63378c2ecf20Sopenharmony_ci		return CLR_PRIORITY;
63388c2ecf20Sopenharmony_ci	}
63398c2ecf20Sopenharmony_ci
63408c2ecf20Sopenharmony_ci	if (p_id_string[0] & BIT(5))
63418c2ecf20Sopenharmony_ci		i = 8;
63428c2ecf20Sopenharmony_ci	else
63438c2ecf20Sopenharmony_ci		i = MAX_SCSI_TAR;
63448c2ecf20Sopenharmony_ci
63458c2ecf20Sopenharmony_ci	if (((p_id_string[0] & 0x06) == 0x02)
63468c2ecf20Sopenharmony_ci	    || ((p_id_string[0] & 0x06) == 0x04))
63478c2ecf20Sopenharmony_ci		match = p_id_string[1] & (unsigned char)0x1F;
63488c2ecf20Sopenharmony_ci	else
63498c2ecf20Sopenharmony_ci		match = 7;
63508c2ecf20Sopenharmony_ci
63518c2ecf20Sopenharmony_ci	while (i > 0) {
63528c2ecf20Sopenharmony_ci
63538c2ecf20Sopenharmony_ci		i--;
63548c2ecf20Sopenharmony_ci
63558c2ecf20Sopenharmony_ci		if (FPT_scamInfo[match].state == ID_UNASSIGNED) {
63568c2ecf20Sopenharmony_ci			for (k = 0; k < ID_STRING_LENGTH; k++) {
63578c2ecf20Sopenharmony_ci				FPT_scamInfo[match].id_string[k] =
63588c2ecf20Sopenharmony_ci				    p_id_string[k];
63598c2ecf20Sopenharmony_ci			}
63608c2ecf20Sopenharmony_ci
63618c2ecf20Sopenharmony_ci			FPT_scamInfo[match].id_string[0] |= BIT(7);
63628c2ecf20Sopenharmony_ci			FPT_scamInfo[match].state = ID_ASSIGNED;
63638c2ecf20Sopenharmony_ci			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
63648c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].globalFlags |=
63658c2ecf20Sopenharmony_ci				    F_UPDATE_EEPROM;
63668c2ecf20Sopenharmony_ci			return match;
63678c2ecf20Sopenharmony_ci
63688c2ecf20Sopenharmony_ci		}
63698c2ecf20Sopenharmony_ci
63708c2ecf20Sopenharmony_ci		match--;
63718c2ecf20Sopenharmony_ci
63728c2ecf20Sopenharmony_ci		if (match == 0xFF) {
63738c2ecf20Sopenharmony_ci			if (p_id_string[0] & BIT(5))
63748c2ecf20Sopenharmony_ci				match = 7;
63758c2ecf20Sopenharmony_ci			else
63768c2ecf20Sopenharmony_ci				match = MAX_SCSI_TAR - 1;
63778c2ecf20Sopenharmony_ci		}
63788c2ecf20Sopenharmony_ci	}
63798c2ecf20Sopenharmony_ci
63808c2ecf20Sopenharmony_ci	return NO_ID_AVAIL;
63818c2ecf20Sopenharmony_ci}
63828c2ecf20Sopenharmony_ci
63838c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
63848c2ecf20Sopenharmony_ci *
63858c2ecf20Sopenharmony_ci * Function: FPT_scsavdi
63868c2ecf20Sopenharmony_ci *
63878c2ecf20Sopenharmony_ci * Description: Save off the device SCAM ID strings.
63888c2ecf20Sopenharmony_ci *
63898c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
63908c2ecf20Sopenharmony_ci
63918c2ecf20Sopenharmony_cistatic void FPT_scsavdi(unsigned char p_card, u32 p_port)
63928c2ecf20Sopenharmony_ci{
63938c2ecf20Sopenharmony_ci	unsigned char i, k, max_id;
63948c2ecf20Sopenharmony_ci	unsigned short ee_data, sum_data;
63958c2ecf20Sopenharmony_ci
63968c2ecf20Sopenharmony_ci	sum_data = 0x0000;
63978c2ecf20Sopenharmony_ci
63988c2ecf20Sopenharmony_ci	for (i = 1; i < EE_SCAMBASE / 2; i++) {
63998c2ecf20Sopenharmony_ci		sum_data += FPT_utilEERead(p_port, i);
64008c2ecf20Sopenharmony_ci	}
64018c2ecf20Sopenharmony_ci
64028c2ecf20Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, 1);	/* Enable write access to the EEPROM */
64038c2ecf20Sopenharmony_ci
64048c2ecf20Sopenharmony_ci	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
64058c2ecf20Sopenharmony_ci		max_id = 0x08;
64068c2ecf20Sopenharmony_ci
64078c2ecf20Sopenharmony_ci	else
64088c2ecf20Sopenharmony_ci		max_id = 0x10;
64098c2ecf20Sopenharmony_ci
64108c2ecf20Sopenharmony_ci	for (i = 0; i < max_id; i++) {
64118c2ecf20Sopenharmony_ci
64128c2ecf20Sopenharmony_ci		for (k = 0; k < ID_STRING_LENGTH; k += 2) {
64138c2ecf20Sopenharmony_ci			ee_data = FPT_scamInfo[i].id_string[k + 1];
64148c2ecf20Sopenharmony_ci			ee_data <<= 8;
64158c2ecf20Sopenharmony_ci			ee_data |= FPT_scamInfo[i].id_string[k];
64168c2ecf20Sopenharmony_ci			sum_data += ee_data;
64178c2ecf20Sopenharmony_ci			FPT_utilEEWrite(p_port, ee_data,
64188c2ecf20Sopenharmony_ci					(unsigned short)((EE_SCAMBASE / 2) +
64198c2ecf20Sopenharmony_ci							 (unsigned short)(i *
64208c2ecf20Sopenharmony_ci									  ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
64218c2ecf20Sopenharmony_ci		}
64228c2ecf20Sopenharmony_ci	}
64238c2ecf20Sopenharmony_ci
64248c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM / 2);
64258c2ecf20Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, 0);	/* Turn off write access */
64268c2ecf20Sopenharmony_ci}
64278c2ecf20Sopenharmony_ci
64288c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
64298c2ecf20Sopenharmony_ci *
64308c2ecf20Sopenharmony_ci * Function: FPT_XbowInit
64318c2ecf20Sopenharmony_ci *
64328c2ecf20Sopenharmony_ci * Description: Setup the Xbow for normal operation.
64338c2ecf20Sopenharmony_ci *
64348c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
64358c2ecf20Sopenharmony_ci
64368c2ecf20Sopenharmony_cistatic void FPT_XbowInit(u32 port, unsigned char ScamFlg)
64378c2ecf20Sopenharmony_ci{
64388c2ecf20Sopenharmony_ci	unsigned char i;
64398c2ecf20Sopenharmony_ci
64408c2ecf20Sopenharmony_ci	i = RD_HARPOON(port + hp_page_ctrl);
64418c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl, (unsigned char)(i | G_INT_DISABLE));
64428c2ecf20Sopenharmony_ci
64438c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsireset, 0x00);
64448c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_1, HOST_MODE8);
64458c2ecf20Sopenharmony_ci
64468c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsireset, (DMA_RESET | HPSCSI_RESET | PROG_RESET |
64478c2ecf20Sopenharmony_ci					 FIFO_CLR));
64488c2ecf20Sopenharmony_ci
64498c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsireset, SCSI_INI);
64508c2ecf20Sopenharmony_ci
64518c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_clkctrl_0, CLKCTRL_DEFAULT);
64528c2ecf20Sopenharmony_ci
64538c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, 0x00);	/*  Clear any signals we might */
64548c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
64558c2ecf20Sopenharmony_ci
64568c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
64578c2ecf20Sopenharmony_ci
64588c2ecf20Sopenharmony_ci	FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
64598c2ecf20Sopenharmony_ci	    BUS_FREE | XFER_CNT_0 | AUTO_INT;
64608c2ecf20Sopenharmony_ci
64618c2ecf20Sopenharmony_ci	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
64628c2ecf20Sopenharmony_ci		FPT_default_intena |= SCAM_SEL;
64638c2ecf20Sopenharmony_ci
64648c2ecf20Sopenharmony_ci	WRW_HARPOON((port + hp_intena), FPT_default_intena);
64658c2ecf20Sopenharmony_ci
64668c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_seltimeout, TO_290ms);
64678c2ecf20Sopenharmony_ci
64688c2ecf20Sopenharmony_ci	/* Turn on SCSI_MODE8 for narrow cards to fix the
64698c2ecf20Sopenharmony_ci	   strapping issue with the DUAL CHANNEL card */
64708c2ecf20Sopenharmony_ci	if (RD_HARPOON(port + hp_page_ctrl) & NARROW_SCSI_CARD)
64718c2ecf20Sopenharmony_ci		WR_HARPOON(port + hp_addstat, SCSI_MODE8);
64728c2ecf20Sopenharmony_ci
64738c2ecf20Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl, i);
64748c2ecf20Sopenharmony_ci
64758c2ecf20Sopenharmony_ci}
64768c2ecf20Sopenharmony_ci
64778c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
64788c2ecf20Sopenharmony_ci *
64798c2ecf20Sopenharmony_ci * Function: FPT_BusMasterInit
64808c2ecf20Sopenharmony_ci *
64818c2ecf20Sopenharmony_ci * Description: Initialize the BusMaster for normal operations.
64828c2ecf20Sopenharmony_ci *
64838c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
64848c2ecf20Sopenharmony_ci
64858c2ecf20Sopenharmony_cistatic void FPT_BusMasterInit(u32 p_port)
64868c2ecf20Sopenharmony_ci{
64878c2ecf20Sopenharmony_ci
64888c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_sys_ctrl, DRVR_RST);
64898c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
64908c2ecf20Sopenharmony_ci
64918c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_host_blk_cnt, XFER_BLK64);
64928c2ecf20Sopenharmony_ci
64938c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_bm_ctrl, (BMCTRL_DEFAULT));
64948c2ecf20Sopenharmony_ci
64958c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (SCSI_TERM_ENA_H));
64968c2ecf20Sopenharmony_ci
64978c2ecf20Sopenharmony_ci	RD_HARPOON(p_port + hp_int_status);	/*Clear interrupts. */
64988c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
64998c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl, (RD_HARPOON(p_port + hp_page_ctrl) &
65008c2ecf20Sopenharmony_ci					   ~SCATTER_EN));
65018c2ecf20Sopenharmony_ci}
65028c2ecf20Sopenharmony_ci
65038c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
65048c2ecf20Sopenharmony_ci *
65058c2ecf20Sopenharmony_ci * Function: FPT_DiagEEPROM
65068c2ecf20Sopenharmony_ci *
65078c2ecf20Sopenharmony_ci * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
65088c2ecf20Sopenharmony_ci *              necessary.
65098c2ecf20Sopenharmony_ci *
65108c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
65118c2ecf20Sopenharmony_ci
65128c2ecf20Sopenharmony_cistatic void FPT_DiagEEPROM(u32 p_port)
65138c2ecf20Sopenharmony_ci{
65148c2ecf20Sopenharmony_ci	unsigned short index, temp, max_wd_cnt;
65158c2ecf20Sopenharmony_ci
65168c2ecf20Sopenharmony_ci	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
65178c2ecf20Sopenharmony_ci		max_wd_cnt = EEPROM_WD_CNT;
65188c2ecf20Sopenharmony_ci	else
65198c2ecf20Sopenharmony_ci		max_wd_cnt = EEPROM_WD_CNT * 2;
65208c2ecf20Sopenharmony_ci
65218c2ecf20Sopenharmony_ci	temp = FPT_utilEERead(p_port, FW_SIGNATURE / 2);
65228c2ecf20Sopenharmony_ci
65238c2ecf20Sopenharmony_ci	if (temp == 0x4641) {
65248c2ecf20Sopenharmony_ci
65258c2ecf20Sopenharmony_ci		for (index = 2; index < max_wd_cnt; index++) {
65268c2ecf20Sopenharmony_ci
65278c2ecf20Sopenharmony_ci			temp += FPT_utilEERead(p_port, index);
65288c2ecf20Sopenharmony_ci
65298c2ecf20Sopenharmony_ci		}
65308c2ecf20Sopenharmony_ci
65318c2ecf20Sopenharmony_ci		if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM / 2)) {
65328c2ecf20Sopenharmony_ci
65338c2ecf20Sopenharmony_ci			return;	/*EEPROM is Okay so return now! */
65348c2ecf20Sopenharmony_ci		}
65358c2ecf20Sopenharmony_ci	}
65368c2ecf20Sopenharmony_ci
65378c2ecf20Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, (unsigned char)1);
65388c2ecf20Sopenharmony_ci
65398c2ecf20Sopenharmony_ci	for (index = 0; index < max_wd_cnt; index++) {
65408c2ecf20Sopenharmony_ci
65418c2ecf20Sopenharmony_ci		FPT_utilEEWrite(p_port, 0x0000, index);
65428c2ecf20Sopenharmony_ci	}
65438c2ecf20Sopenharmony_ci
65448c2ecf20Sopenharmony_ci	temp = 0;
65458c2ecf20Sopenharmony_ci
65468c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE / 2);
65478c2ecf20Sopenharmony_ci	temp += 0x4641;
65488c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0 / 2);
65498c2ecf20Sopenharmony_ci	temp += 0x3920;
65508c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2 / 2);
65518c2ecf20Sopenharmony_ci	temp += 0x3033;
65528c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4 / 2);
65538c2ecf20Sopenharmony_ci	temp += 0x2020;
65548c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG / 2);
65558c2ecf20Sopenharmony_ci	temp += 0x70D3;
65568c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG / 2);
65578c2ecf20Sopenharmony_ci	temp += 0x0010;
65588c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG / 2);
65598c2ecf20Sopenharmony_ci	temp += 0x0003;
65608c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID / 2);
65618c2ecf20Sopenharmony_ci	temp += 0x0007;
65628c2ecf20Sopenharmony_ci
65638c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN / 2);
65648c2ecf20Sopenharmony_ci	temp += 0x0000;
65658c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA / 2);
65668c2ecf20Sopenharmony_ci	temp += 0x0000;
65678c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE / 2);
65688c2ecf20Sopenharmony_ci	temp += 0x0000;
65698c2ecf20Sopenharmony_ci
65708c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01 / 2);
65718c2ecf20Sopenharmony_ci	temp += 0x4242;
65728c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23 / 2);
65738c2ecf20Sopenharmony_ci	temp += 0x4242;
65748c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45 / 2);
65758c2ecf20Sopenharmony_ci	temp += 0x4242;
65768c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67 / 2);
65778c2ecf20Sopenharmony_ci	temp += 0x4242;
65788c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89 / 2);
65798c2ecf20Sopenharmony_ci	temp += 0x4242;
65808c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab / 2);
65818c2ecf20Sopenharmony_ci	temp += 0x4242;
65828c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd / 2);
65838c2ecf20Sopenharmony_ci	temp += 0x4242;
65848c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef / 2);
65858c2ecf20Sopenharmony_ci	temp += 0x4242;
65868c2ecf20Sopenharmony_ci
65878c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x6C46, 64 / 2);	/*PRODUCT ID */
65888c2ecf20Sopenharmony_ci	temp += 0x6C46;
65898c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x7361, 66 / 2);	/* FlashPoint LT   */
65908c2ecf20Sopenharmony_ci	temp += 0x7361;
65918c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5068, 68 / 2);
65928c2ecf20Sopenharmony_ci	temp += 0x5068;
65938c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x696F, 70 / 2);
65948c2ecf20Sopenharmony_ci	temp += 0x696F;
65958c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x746E, 72 / 2);
65968c2ecf20Sopenharmony_ci	temp += 0x746E;
65978c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4C20, 74 / 2);
65988c2ecf20Sopenharmony_ci	temp += 0x4C20;
65998c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2054, 76 / 2);
66008c2ecf20Sopenharmony_ci	temp += 0x2054;
66018c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2020, 78 / 2);
66028c2ecf20Sopenharmony_ci	temp += 0x2020;
66038c2ecf20Sopenharmony_ci
66048c2ecf20Sopenharmony_ci	index = ((EE_SCAMBASE / 2) + (7 * 16));
66058c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, (0x0700 + TYPE_CODE0), index);
66068c2ecf20Sopenharmony_ci	temp += (0x0700 + TYPE_CODE0);
66078c2ecf20Sopenharmony_ci	index++;
66088c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5542, index);	/*Vendor ID code */
66098c2ecf20Sopenharmony_ci	temp += 0x5542;		/* BUSLOGIC      */
66108c2ecf20Sopenharmony_ci	index++;
66118c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4C53, index);
66128c2ecf20Sopenharmony_ci	temp += 0x4C53;
66138c2ecf20Sopenharmony_ci	index++;
66148c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x474F, index);
66158c2ecf20Sopenharmony_ci	temp += 0x474F;
66168c2ecf20Sopenharmony_ci	index++;
66178c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4349, index);
66188c2ecf20Sopenharmony_ci	temp += 0x4349;
66198c2ecf20Sopenharmony_ci	index++;
66208c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5442, index);	/*Vendor unique code */
66218c2ecf20Sopenharmony_ci	temp += 0x5442;		/* BT- 930           */
66228c2ecf20Sopenharmony_ci	index++;
66238c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x202D, index);
66248c2ecf20Sopenharmony_ci	temp += 0x202D;
66258c2ecf20Sopenharmony_ci	index++;
66268c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3339, index);
66278c2ecf20Sopenharmony_ci	temp += 0x3339;
66288c2ecf20Sopenharmony_ci	index++;		/*Serial #          */
66298c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2030, index);	/* 01234567         */
66308c2ecf20Sopenharmony_ci	temp += 0x2030;
66318c2ecf20Sopenharmony_ci	index++;
66328c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5453, index);
66338c2ecf20Sopenharmony_ci	temp += 0x5453;
66348c2ecf20Sopenharmony_ci	index++;
66358c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5645, index);
66368c2ecf20Sopenharmony_ci	temp += 0x5645;
66378c2ecf20Sopenharmony_ci	index++;
66388c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2045, index);
66398c2ecf20Sopenharmony_ci	temp += 0x2045;
66408c2ecf20Sopenharmony_ci	index++;
66418c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x202F, index);
66428c2ecf20Sopenharmony_ci	temp += 0x202F;
66438c2ecf20Sopenharmony_ci	index++;
66448c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4F4A, index);
66458c2ecf20Sopenharmony_ci	temp += 0x4F4A;
66468c2ecf20Sopenharmony_ci	index++;
66478c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x204E, index);
66488c2ecf20Sopenharmony_ci	temp += 0x204E;
66498c2ecf20Sopenharmony_ci	index++;
66508c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3539, index);
66518c2ecf20Sopenharmony_ci	temp += 0x3539;
66528c2ecf20Sopenharmony_ci
66538c2ecf20Sopenharmony_ci	FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM / 2);
66548c2ecf20Sopenharmony_ci
66558c2ecf20Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, (unsigned char)0);
66568c2ecf20Sopenharmony_ci
66578c2ecf20Sopenharmony_ci}
66588c2ecf20Sopenharmony_ci
66598c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
66608c2ecf20Sopenharmony_ci *
66618c2ecf20Sopenharmony_ci * Function: Queue Search Select
66628c2ecf20Sopenharmony_ci *
66638c2ecf20Sopenharmony_ci * Description: Try to find a new command to execute.
66648c2ecf20Sopenharmony_ci *
66658c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
66668c2ecf20Sopenharmony_ci
66678c2ecf20Sopenharmony_cistatic void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
66688c2ecf20Sopenharmony_ci				  unsigned char p_card)
66698c2ecf20Sopenharmony_ci{
66708c2ecf20Sopenharmony_ci	unsigned char scan_ptr, lun;
66718c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
66728c2ecf20Sopenharmony_ci	struct sccb *pOldSccb;
66738c2ecf20Sopenharmony_ci
66748c2ecf20Sopenharmony_ci	scan_ptr = pCurrCard->scanIndex;
66758c2ecf20Sopenharmony_ci	do {
66768c2ecf20Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
66778c2ecf20Sopenharmony_ci		if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
66788c2ecf20Sopenharmony_ci		    ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
66798c2ecf20Sopenharmony_ci		     TAG_Q_TRYING)) {
66808c2ecf20Sopenharmony_ci			if (currTar_Info->TarSelQ_Cnt != 0) {
66818c2ecf20Sopenharmony_ci
66828c2ecf20Sopenharmony_ci				scan_ptr++;
66838c2ecf20Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR)
66848c2ecf20Sopenharmony_ci					scan_ptr = 0;
66858c2ecf20Sopenharmony_ci
66868c2ecf20Sopenharmony_ci				for (lun = 0; lun < MAX_LUN; lun++) {
66878c2ecf20Sopenharmony_ci					if (currTar_Info->TarLUNBusy[lun] == 0) {
66888c2ecf20Sopenharmony_ci
66898c2ecf20Sopenharmony_ci						pCurrCard->currentSCCB =
66908c2ecf20Sopenharmony_ci						    currTar_Info->TarSelQ_Head;
66918c2ecf20Sopenharmony_ci						pOldSccb = NULL;
66928c2ecf20Sopenharmony_ci
66938c2ecf20Sopenharmony_ci						while ((pCurrCard->
66948c2ecf20Sopenharmony_ci							currentSCCB != NULL)
66958c2ecf20Sopenharmony_ci						       && (lun !=
66968c2ecf20Sopenharmony_ci							   pCurrCard->
66978c2ecf20Sopenharmony_ci							   currentSCCB->Lun)) {
66988c2ecf20Sopenharmony_ci							pOldSccb =
66998c2ecf20Sopenharmony_ci							    pCurrCard->
67008c2ecf20Sopenharmony_ci							    currentSCCB;
67018c2ecf20Sopenharmony_ci							pCurrCard->currentSCCB =
67028c2ecf20Sopenharmony_ci							    (struct sccb
67038c2ecf20Sopenharmony_ci							     *)(pCurrCard->
67048c2ecf20Sopenharmony_ci								currentSCCB)->
67058c2ecf20Sopenharmony_ci							    Sccb_forwardlink;
67068c2ecf20Sopenharmony_ci						}
67078c2ecf20Sopenharmony_ci						if (pCurrCard->currentSCCB ==
67088c2ecf20Sopenharmony_ci						    NULL)
67098c2ecf20Sopenharmony_ci							continue;
67108c2ecf20Sopenharmony_ci						if (pOldSccb != NULL) {
67118c2ecf20Sopenharmony_ci							pOldSccb->
67128c2ecf20Sopenharmony_ci							    Sccb_forwardlink =
67138c2ecf20Sopenharmony_ci							    (struct sccb
67148c2ecf20Sopenharmony_ci							     *)(pCurrCard->
67158c2ecf20Sopenharmony_ci								currentSCCB)->
67168c2ecf20Sopenharmony_ci							    Sccb_forwardlink;
67178c2ecf20Sopenharmony_ci							pOldSccb->
67188c2ecf20Sopenharmony_ci							    Sccb_backlink =
67198c2ecf20Sopenharmony_ci							    (struct sccb
67208c2ecf20Sopenharmony_ci							     *)(pCurrCard->
67218c2ecf20Sopenharmony_ci								currentSCCB)->
67228c2ecf20Sopenharmony_ci							    Sccb_backlink;
67238c2ecf20Sopenharmony_ci							currTar_Info->
67248c2ecf20Sopenharmony_ci							    TarSelQ_Cnt--;
67258c2ecf20Sopenharmony_ci						} else {
67268c2ecf20Sopenharmony_ci							currTar_Info->
67278c2ecf20Sopenharmony_ci							    TarSelQ_Head =
67288c2ecf20Sopenharmony_ci							    (struct sccb
67298c2ecf20Sopenharmony_ci							     *)(pCurrCard->
67308c2ecf20Sopenharmony_ci								currentSCCB)->
67318c2ecf20Sopenharmony_ci							    Sccb_forwardlink;
67328c2ecf20Sopenharmony_ci
67338c2ecf20Sopenharmony_ci							if (currTar_Info->
67348c2ecf20Sopenharmony_ci							    TarSelQ_Head ==
67358c2ecf20Sopenharmony_ci							    NULL) {
67368c2ecf20Sopenharmony_ci								currTar_Info->
67378c2ecf20Sopenharmony_ci								    TarSelQ_Tail
67388c2ecf20Sopenharmony_ci								    = NULL;
67398c2ecf20Sopenharmony_ci								currTar_Info->
67408c2ecf20Sopenharmony_ci								    TarSelQ_Cnt
67418c2ecf20Sopenharmony_ci								    = 0;
67428c2ecf20Sopenharmony_ci							} else {
67438c2ecf20Sopenharmony_ci								currTar_Info->
67448c2ecf20Sopenharmony_ci								    TarSelQ_Cnt--;
67458c2ecf20Sopenharmony_ci								currTar_Info->
67468c2ecf20Sopenharmony_ci								    TarSelQ_Head->
67478c2ecf20Sopenharmony_ci								    Sccb_backlink
67488c2ecf20Sopenharmony_ci								    =
67498c2ecf20Sopenharmony_ci								    (struct sccb
67508c2ecf20Sopenharmony_ci								     *)NULL;
67518c2ecf20Sopenharmony_ci							}
67528c2ecf20Sopenharmony_ci						}
67538c2ecf20Sopenharmony_ci						pCurrCard->scanIndex = scan_ptr;
67548c2ecf20Sopenharmony_ci
67558c2ecf20Sopenharmony_ci						pCurrCard->globalFlags |=
67568c2ecf20Sopenharmony_ci						    F_NEW_SCCB_CMD;
67578c2ecf20Sopenharmony_ci
67588c2ecf20Sopenharmony_ci						break;
67598c2ecf20Sopenharmony_ci					}
67608c2ecf20Sopenharmony_ci				}
67618c2ecf20Sopenharmony_ci			}
67628c2ecf20Sopenharmony_ci
67638c2ecf20Sopenharmony_ci			else {
67648c2ecf20Sopenharmony_ci				scan_ptr++;
67658c2ecf20Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR) {
67668c2ecf20Sopenharmony_ci					scan_ptr = 0;
67678c2ecf20Sopenharmony_ci				}
67688c2ecf20Sopenharmony_ci			}
67698c2ecf20Sopenharmony_ci
67708c2ecf20Sopenharmony_ci		} else {
67718c2ecf20Sopenharmony_ci			if ((currTar_Info->TarSelQ_Cnt != 0) &&
67728c2ecf20Sopenharmony_ci			    (currTar_Info->TarLUNBusy[0] == 0)) {
67738c2ecf20Sopenharmony_ci
67748c2ecf20Sopenharmony_ci				pCurrCard->currentSCCB =
67758c2ecf20Sopenharmony_ci				    currTar_Info->TarSelQ_Head;
67768c2ecf20Sopenharmony_ci
67778c2ecf20Sopenharmony_ci				currTar_Info->TarSelQ_Head =
67788c2ecf20Sopenharmony_ci				    (struct sccb *)(pCurrCard->currentSCCB)->
67798c2ecf20Sopenharmony_ci				    Sccb_forwardlink;
67808c2ecf20Sopenharmony_ci
67818c2ecf20Sopenharmony_ci				if (currTar_Info->TarSelQ_Head == NULL) {
67828c2ecf20Sopenharmony_ci					currTar_Info->TarSelQ_Tail = NULL;
67838c2ecf20Sopenharmony_ci					currTar_Info->TarSelQ_Cnt = 0;
67848c2ecf20Sopenharmony_ci				} else {
67858c2ecf20Sopenharmony_ci					currTar_Info->TarSelQ_Cnt--;
67868c2ecf20Sopenharmony_ci					currTar_Info->TarSelQ_Head->
67878c2ecf20Sopenharmony_ci					    Sccb_backlink = (struct sccb *)NULL;
67888c2ecf20Sopenharmony_ci				}
67898c2ecf20Sopenharmony_ci
67908c2ecf20Sopenharmony_ci				scan_ptr++;
67918c2ecf20Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR)
67928c2ecf20Sopenharmony_ci					scan_ptr = 0;
67938c2ecf20Sopenharmony_ci
67948c2ecf20Sopenharmony_ci				pCurrCard->scanIndex = scan_ptr;
67958c2ecf20Sopenharmony_ci
67968c2ecf20Sopenharmony_ci				pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
67978c2ecf20Sopenharmony_ci
67988c2ecf20Sopenharmony_ci				break;
67998c2ecf20Sopenharmony_ci			}
68008c2ecf20Sopenharmony_ci
68018c2ecf20Sopenharmony_ci			else {
68028c2ecf20Sopenharmony_ci				scan_ptr++;
68038c2ecf20Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR) {
68048c2ecf20Sopenharmony_ci					scan_ptr = 0;
68058c2ecf20Sopenharmony_ci				}
68068c2ecf20Sopenharmony_ci			}
68078c2ecf20Sopenharmony_ci		}
68088c2ecf20Sopenharmony_ci	} while (scan_ptr != pCurrCard->scanIndex);
68098c2ecf20Sopenharmony_ci}
68108c2ecf20Sopenharmony_ci
68118c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
68128c2ecf20Sopenharmony_ci *
68138c2ecf20Sopenharmony_ci * Function: Queue Select Fail
68148c2ecf20Sopenharmony_ci *
68158c2ecf20Sopenharmony_ci * Description: Add the current SCCB to the head of the Queue.
68168c2ecf20Sopenharmony_ci *
68178c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
68188c2ecf20Sopenharmony_ci
68198c2ecf20Sopenharmony_cistatic void FPT_queueSelectFail(struct sccb_card *pCurrCard,
68208c2ecf20Sopenharmony_ci				unsigned char p_card)
68218c2ecf20Sopenharmony_ci{
68228c2ecf20Sopenharmony_ci	unsigned char thisTarg;
68238c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
68248c2ecf20Sopenharmony_ci
68258c2ecf20Sopenharmony_ci	if (pCurrCard->currentSCCB != NULL) {
68268c2ecf20Sopenharmony_ci		thisTarg =
68278c2ecf20Sopenharmony_ci		    (unsigned char)(((struct sccb *)(pCurrCard->currentSCCB))->
68288c2ecf20Sopenharmony_ci				    TargID);
68298c2ecf20Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
68308c2ecf20Sopenharmony_ci
68318c2ecf20Sopenharmony_ci		pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL;
68328c2ecf20Sopenharmony_ci
68338c2ecf20Sopenharmony_ci		pCurrCard->currentSCCB->Sccb_forwardlink =
68348c2ecf20Sopenharmony_ci		    currTar_Info->TarSelQ_Head;
68358c2ecf20Sopenharmony_ci
68368c2ecf20Sopenharmony_ci		if (currTar_Info->TarSelQ_Cnt == 0) {
68378c2ecf20Sopenharmony_ci			currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
68388c2ecf20Sopenharmony_ci		}
68398c2ecf20Sopenharmony_ci
68408c2ecf20Sopenharmony_ci		else {
68418c2ecf20Sopenharmony_ci			currTar_Info->TarSelQ_Head->Sccb_backlink =
68428c2ecf20Sopenharmony_ci			    pCurrCard->currentSCCB;
68438c2ecf20Sopenharmony_ci		}
68448c2ecf20Sopenharmony_ci
68458c2ecf20Sopenharmony_ci		currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
68468c2ecf20Sopenharmony_ci
68478c2ecf20Sopenharmony_ci		pCurrCard->currentSCCB = NULL;
68488c2ecf20Sopenharmony_ci		currTar_Info->TarSelQ_Cnt++;
68498c2ecf20Sopenharmony_ci	}
68508c2ecf20Sopenharmony_ci}
68518c2ecf20Sopenharmony_ci
68528c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
68538c2ecf20Sopenharmony_ci *
68548c2ecf20Sopenharmony_ci * Function: Queue Command Complete
68558c2ecf20Sopenharmony_ci *
68568c2ecf20Sopenharmony_ci * Description: Call the callback function with the current SCCB.
68578c2ecf20Sopenharmony_ci *
68588c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
68598c2ecf20Sopenharmony_ci
68608c2ecf20Sopenharmony_cistatic void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
68618c2ecf20Sopenharmony_ci				 struct sccb *p_sccb, unsigned char p_card)
68628c2ecf20Sopenharmony_ci{
68638c2ecf20Sopenharmony_ci
68648c2ecf20Sopenharmony_ci	unsigned char i, SCSIcmd;
68658c2ecf20Sopenharmony_ci	CALL_BK_FN callback;
68668c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
68678c2ecf20Sopenharmony_ci
68688c2ecf20Sopenharmony_ci	SCSIcmd = p_sccb->Cdb[0];
68698c2ecf20Sopenharmony_ci
68708c2ecf20Sopenharmony_ci	if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
68718c2ecf20Sopenharmony_ci
68728c2ecf20Sopenharmony_ci		if ((p_sccb->
68738c2ecf20Sopenharmony_ci		     ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN))
68748c2ecf20Sopenharmony_ci		    && (p_sccb->HostStatus == SCCB_COMPLETE)
68758c2ecf20Sopenharmony_ci		    && (p_sccb->TargetStatus != SSCHECK))
68768c2ecf20Sopenharmony_ci
68778c2ecf20Sopenharmony_ci			if ((SCSIcmd == SCSI_READ) ||
68788c2ecf20Sopenharmony_ci			    (SCSIcmd == SCSI_WRITE) ||
68798c2ecf20Sopenharmony_ci			    (SCSIcmd == SCSI_READ_EXTENDED) ||
68808c2ecf20Sopenharmony_ci			    (SCSIcmd == SCSI_WRITE_EXTENDED) ||
68818c2ecf20Sopenharmony_ci			    (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
68828c2ecf20Sopenharmony_ci			    (SCSIcmd == SCSI_START_STOP_UNIT) ||
68838c2ecf20Sopenharmony_ci			    (pCurrCard->globalFlags & F_NO_FILTER)
68848c2ecf20Sopenharmony_ci			    )
68858c2ecf20Sopenharmony_ci				p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
68868c2ecf20Sopenharmony_ci	}
68878c2ecf20Sopenharmony_ci
68888c2ecf20Sopenharmony_ci	if (p_sccb->SccbStatus == SCCB_IN_PROCESS) {
68898c2ecf20Sopenharmony_ci		if (p_sccb->HostStatus || p_sccb->TargetStatus)
68908c2ecf20Sopenharmony_ci			p_sccb->SccbStatus = SCCB_ERROR;
68918c2ecf20Sopenharmony_ci		else
68928c2ecf20Sopenharmony_ci			p_sccb->SccbStatus = SCCB_SUCCESS;
68938c2ecf20Sopenharmony_ci	}
68948c2ecf20Sopenharmony_ci
68958c2ecf20Sopenharmony_ci	if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
68968c2ecf20Sopenharmony_ci
68978c2ecf20Sopenharmony_ci		p_sccb->CdbLength = p_sccb->Save_CdbLen;
68988c2ecf20Sopenharmony_ci		for (i = 0; i < 6; i++) {
68998c2ecf20Sopenharmony_ci			p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
69008c2ecf20Sopenharmony_ci		}
69018c2ecf20Sopenharmony_ci	}
69028c2ecf20Sopenharmony_ci
69038c2ecf20Sopenharmony_ci	if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
69048c2ecf20Sopenharmony_ci	    (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
69058c2ecf20Sopenharmony_ci
69068c2ecf20Sopenharmony_ci		FPT_utilUpdateResidual(p_sccb);
69078c2ecf20Sopenharmony_ci	}
69088c2ecf20Sopenharmony_ci
69098c2ecf20Sopenharmony_ci	pCurrCard->cmdCounter--;
69108c2ecf20Sopenharmony_ci	if (!pCurrCard->cmdCounter) {
69118c2ecf20Sopenharmony_ci
69128c2ecf20Sopenharmony_ci		if (pCurrCard->globalFlags & F_GREEN_PC) {
69138c2ecf20Sopenharmony_ci			WR_HARPOON(pCurrCard->ioPort + hp_clkctrl_0,
69148c2ecf20Sopenharmony_ci				   (PWR_DWN | CLKCTRL_DEFAULT));
69158c2ecf20Sopenharmony_ci			WR_HARPOON(pCurrCard->ioPort + hp_sys_ctrl, STOP_CLK);
69168c2ecf20Sopenharmony_ci		}
69178c2ecf20Sopenharmony_ci
69188c2ecf20Sopenharmony_ci		WR_HARPOON(pCurrCard->ioPort + hp_semaphore,
69198c2ecf20Sopenharmony_ci			   (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) &
69208c2ecf20Sopenharmony_ci			    ~SCCB_MGR_ACTIVE));
69218c2ecf20Sopenharmony_ci
69228c2ecf20Sopenharmony_ci	}
69238c2ecf20Sopenharmony_ci
69248c2ecf20Sopenharmony_ci	if (pCurrCard->discQCount != 0) {
69258c2ecf20Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
69268c2ecf20Sopenharmony_ci		if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
69278c2ecf20Sopenharmony_ci		     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
69288c2ecf20Sopenharmony_ci		      TAG_Q_TRYING))) {
69298c2ecf20Sopenharmony_ci			pCurrCard->discQCount--;
69308c2ecf20Sopenharmony_ci			pCurrCard->discQ_Tbl[currTar_Info->
69318c2ecf20Sopenharmony_ci					     LunDiscQ_Idx[p_sccb->Lun]] = NULL;
69328c2ecf20Sopenharmony_ci		} else {
69338c2ecf20Sopenharmony_ci			if (p_sccb->Sccb_tag) {
69348c2ecf20Sopenharmony_ci				pCurrCard->discQCount--;
69358c2ecf20Sopenharmony_ci				pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
69368c2ecf20Sopenharmony_ci			} else {
69378c2ecf20Sopenharmony_ci				pCurrCard->discQCount--;
69388c2ecf20Sopenharmony_ci				pCurrCard->discQ_Tbl[currTar_Info->
69398c2ecf20Sopenharmony_ci						     LunDiscQ_Idx[0]] = NULL;
69408c2ecf20Sopenharmony_ci			}
69418c2ecf20Sopenharmony_ci		}
69428c2ecf20Sopenharmony_ci
69438c2ecf20Sopenharmony_ci	}
69448c2ecf20Sopenharmony_ci
69458c2ecf20Sopenharmony_ci	callback = (CALL_BK_FN) p_sccb->SccbCallback;
69468c2ecf20Sopenharmony_ci	callback(p_sccb);
69478c2ecf20Sopenharmony_ci	pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
69488c2ecf20Sopenharmony_ci	pCurrCard->currentSCCB = NULL;
69498c2ecf20Sopenharmony_ci}
69508c2ecf20Sopenharmony_ci
69518c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
69528c2ecf20Sopenharmony_ci *
69538c2ecf20Sopenharmony_ci * Function: Queue Disconnect
69548c2ecf20Sopenharmony_ci *
69558c2ecf20Sopenharmony_ci * Description: Add SCCB to our disconnect array.
69568c2ecf20Sopenharmony_ci *
69578c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
69588c2ecf20Sopenharmony_cistatic void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card)
69598c2ecf20Sopenharmony_ci{
69608c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
69618c2ecf20Sopenharmony_ci
69628c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
69638c2ecf20Sopenharmony_ci
69648c2ecf20Sopenharmony_ci	if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
69658c2ecf20Sopenharmony_ci	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
69668c2ecf20Sopenharmony_ci		FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
69678c2ecf20Sopenharmony_ci					      LunDiscQ_Idx[p_sccb->Lun]] =
69688c2ecf20Sopenharmony_ci		    p_sccb;
69698c2ecf20Sopenharmony_ci	} else {
69708c2ecf20Sopenharmony_ci		if (p_sccb->Sccb_tag) {
69718c2ecf20Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] =
69728c2ecf20Sopenharmony_ci			    p_sccb;
69738c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] =
69748c2ecf20Sopenharmony_ci			    0;
69758c2ecf20Sopenharmony_ci			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
69768c2ecf20Sopenharmony_ci		} else {
69778c2ecf20Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
69788c2ecf20Sopenharmony_ci						      LunDiscQ_Idx[0]] = p_sccb;
69798c2ecf20Sopenharmony_ci		}
69808c2ecf20Sopenharmony_ci	}
69818c2ecf20Sopenharmony_ci	FPT_BL_Card[p_card].currentSCCB = NULL;
69828c2ecf20Sopenharmony_ci}
69838c2ecf20Sopenharmony_ci
69848c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
69858c2ecf20Sopenharmony_ci *
69868c2ecf20Sopenharmony_ci * Function: Queue Flush SCCB
69878c2ecf20Sopenharmony_ci *
69888c2ecf20Sopenharmony_ci * Description: Flush all SCCB's back to the host driver for this target.
69898c2ecf20Sopenharmony_ci *
69908c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
69918c2ecf20Sopenharmony_ci
69928c2ecf20Sopenharmony_cistatic void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code)
69938c2ecf20Sopenharmony_ci{
69948c2ecf20Sopenharmony_ci	unsigned char qtag, thisTarg;
69958c2ecf20Sopenharmony_ci	struct sccb *currSCCB;
69968c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
69978c2ecf20Sopenharmony_ci
69988c2ecf20Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
69998c2ecf20Sopenharmony_ci	if (currSCCB != NULL) {
70008c2ecf20Sopenharmony_ci		thisTarg = (unsigned char)currSCCB->TargID;
70018c2ecf20Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
70028c2ecf20Sopenharmony_ci
70038c2ecf20Sopenharmony_ci		for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
70048c2ecf20Sopenharmony_ci
70058c2ecf20Sopenharmony_ci			if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
70068c2ecf20Sopenharmony_ci			    (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
70078c2ecf20Sopenharmony_ci			     thisTarg)) {
70088c2ecf20Sopenharmony_ci
70098c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[qtag]->
70108c2ecf20Sopenharmony_ci				    HostStatus = (unsigned char)error_code;
70118c2ecf20Sopenharmony_ci
70128c2ecf20Sopenharmony_ci				FPT_queueCmdComplete(&FPT_BL_Card[p_card],
70138c2ecf20Sopenharmony_ci						     FPT_BL_Card[p_card].
70148c2ecf20Sopenharmony_ci						     discQ_Tbl[qtag], p_card);
70158c2ecf20Sopenharmony_ci
70168c2ecf20Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
70178c2ecf20Sopenharmony_ci				currTar_Info->TarTagQ_Cnt--;
70188c2ecf20Sopenharmony_ci
70198c2ecf20Sopenharmony_ci			}
70208c2ecf20Sopenharmony_ci		}
70218c2ecf20Sopenharmony_ci	}
70228c2ecf20Sopenharmony_ci
70238c2ecf20Sopenharmony_ci}
70248c2ecf20Sopenharmony_ci
70258c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
70268c2ecf20Sopenharmony_ci *
70278c2ecf20Sopenharmony_ci * Function: Queue Flush Target SCCB
70288c2ecf20Sopenharmony_ci *
70298c2ecf20Sopenharmony_ci * Description: Flush all SCCB's back to the host driver for this target.
70308c2ecf20Sopenharmony_ci *
70318c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
70328c2ecf20Sopenharmony_ci
70338c2ecf20Sopenharmony_cistatic void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
70348c2ecf20Sopenharmony_ci				   unsigned char error_code)
70358c2ecf20Sopenharmony_ci{
70368c2ecf20Sopenharmony_ci	unsigned char qtag;
70378c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
70388c2ecf20Sopenharmony_ci
70398c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
70408c2ecf20Sopenharmony_ci
70418c2ecf20Sopenharmony_ci	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
70428c2ecf20Sopenharmony_ci
70438c2ecf20Sopenharmony_ci		if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
70448c2ecf20Sopenharmony_ci		    (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg)) {
70458c2ecf20Sopenharmony_ci
70468c2ecf20Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus =
70478c2ecf20Sopenharmony_ci			    (unsigned char)error_code;
70488c2ecf20Sopenharmony_ci
70498c2ecf20Sopenharmony_ci			FPT_queueCmdComplete(&FPT_BL_Card[p_card],
70508c2ecf20Sopenharmony_ci					     FPT_BL_Card[p_card].
70518c2ecf20Sopenharmony_ci					     discQ_Tbl[qtag], p_card);
70528c2ecf20Sopenharmony_ci
70538c2ecf20Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
70548c2ecf20Sopenharmony_ci			currTar_Info->TarTagQ_Cnt--;
70558c2ecf20Sopenharmony_ci
70568c2ecf20Sopenharmony_ci		}
70578c2ecf20Sopenharmony_ci	}
70588c2ecf20Sopenharmony_ci
70598c2ecf20Sopenharmony_ci}
70608c2ecf20Sopenharmony_ci
70618c2ecf20Sopenharmony_cistatic void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card)
70628c2ecf20Sopenharmony_ci{
70638c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
70648c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
70658c2ecf20Sopenharmony_ci
70668c2ecf20Sopenharmony_ci	p_SCCB->Sccb_forwardlink = NULL;
70678c2ecf20Sopenharmony_ci
70688c2ecf20Sopenharmony_ci	p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
70698c2ecf20Sopenharmony_ci
70708c2ecf20Sopenharmony_ci	if (currTar_Info->TarSelQ_Cnt == 0) {
70718c2ecf20Sopenharmony_ci
70728c2ecf20Sopenharmony_ci		currTar_Info->TarSelQ_Head = p_SCCB;
70738c2ecf20Sopenharmony_ci	}
70748c2ecf20Sopenharmony_ci
70758c2ecf20Sopenharmony_ci	else {
70768c2ecf20Sopenharmony_ci
70778c2ecf20Sopenharmony_ci		currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
70788c2ecf20Sopenharmony_ci	}
70798c2ecf20Sopenharmony_ci
70808c2ecf20Sopenharmony_ci	currTar_Info->TarSelQ_Tail = p_SCCB;
70818c2ecf20Sopenharmony_ci	currTar_Info->TarSelQ_Cnt++;
70828c2ecf20Sopenharmony_ci}
70838c2ecf20Sopenharmony_ci
70848c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
70858c2ecf20Sopenharmony_ci *
70868c2ecf20Sopenharmony_ci * Function: Queue Find SCCB
70878c2ecf20Sopenharmony_ci *
70888c2ecf20Sopenharmony_ci * Description: Search the target select Queue for this SCCB, and
70898c2ecf20Sopenharmony_ci *              remove it if found.
70908c2ecf20Sopenharmony_ci *
70918c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
70928c2ecf20Sopenharmony_ci
70938c2ecf20Sopenharmony_cistatic unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
70948c2ecf20Sopenharmony_ci				       unsigned char p_card)
70958c2ecf20Sopenharmony_ci{
70968c2ecf20Sopenharmony_ci	struct sccb *q_ptr;
70978c2ecf20Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
70988c2ecf20Sopenharmony_ci
70998c2ecf20Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
71008c2ecf20Sopenharmony_ci
71018c2ecf20Sopenharmony_ci	q_ptr = currTar_Info->TarSelQ_Head;
71028c2ecf20Sopenharmony_ci
71038c2ecf20Sopenharmony_ci	while (q_ptr != NULL) {
71048c2ecf20Sopenharmony_ci
71058c2ecf20Sopenharmony_ci		if (q_ptr == p_SCCB) {
71068c2ecf20Sopenharmony_ci
71078c2ecf20Sopenharmony_ci			if (currTar_Info->TarSelQ_Head == q_ptr) {
71088c2ecf20Sopenharmony_ci
71098c2ecf20Sopenharmony_ci				currTar_Info->TarSelQ_Head =
71108c2ecf20Sopenharmony_ci				    q_ptr->Sccb_forwardlink;
71118c2ecf20Sopenharmony_ci			}
71128c2ecf20Sopenharmony_ci
71138c2ecf20Sopenharmony_ci			if (currTar_Info->TarSelQ_Tail == q_ptr) {
71148c2ecf20Sopenharmony_ci
71158c2ecf20Sopenharmony_ci				currTar_Info->TarSelQ_Tail =
71168c2ecf20Sopenharmony_ci				    q_ptr->Sccb_backlink;
71178c2ecf20Sopenharmony_ci			}
71188c2ecf20Sopenharmony_ci
71198c2ecf20Sopenharmony_ci			if (q_ptr->Sccb_forwardlink != NULL) {
71208c2ecf20Sopenharmony_ci				q_ptr->Sccb_forwardlink->Sccb_backlink =
71218c2ecf20Sopenharmony_ci				    q_ptr->Sccb_backlink;
71228c2ecf20Sopenharmony_ci			}
71238c2ecf20Sopenharmony_ci
71248c2ecf20Sopenharmony_ci			if (q_ptr->Sccb_backlink != NULL) {
71258c2ecf20Sopenharmony_ci				q_ptr->Sccb_backlink->Sccb_forwardlink =
71268c2ecf20Sopenharmony_ci				    q_ptr->Sccb_forwardlink;
71278c2ecf20Sopenharmony_ci			}
71288c2ecf20Sopenharmony_ci
71298c2ecf20Sopenharmony_ci			currTar_Info->TarSelQ_Cnt--;
71308c2ecf20Sopenharmony_ci
71318c2ecf20Sopenharmony_ci			return 1;
71328c2ecf20Sopenharmony_ci		}
71338c2ecf20Sopenharmony_ci
71348c2ecf20Sopenharmony_ci		else {
71358c2ecf20Sopenharmony_ci			q_ptr = q_ptr->Sccb_forwardlink;
71368c2ecf20Sopenharmony_ci		}
71378c2ecf20Sopenharmony_ci	}
71388c2ecf20Sopenharmony_ci
71398c2ecf20Sopenharmony_ci	return 0;
71408c2ecf20Sopenharmony_ci
71418c2ecf20Sopenharmony_ci}
71428c2ecf20Sopenharmony_ci
71438c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
71448c2ecf20Sopenharmony_ci *
71458c2ecf20Sopenharmony_ci * Function: Utility Update Residual Count
71468c2ecf20Sopenharmony_ci *
71478c2ecf20Sopenharmony_ci * Description: Update the XferCnt to the remaining byte count.
71488c2ecf20Sopenharmony_ci *              If we transferred all the data then just write zero.
71498c2ecf20Sopenharmony_ci *              If Non-SG transfer then report Total Cnt - Actual Transfer
71508c2ecf20Sopenharmony_ci *              Cnt.  For SG transfers add the count fields of all
71518c2ecf20Sopenharmony_ci *              remaining SG elements, as well as any partial remaining
71528c2ecf20Sopenharmony_ci *              element.
71538c2ecf20Sopenharmony_ci *
71548c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
71558c2ecf20Sopenharmony_ci
71568c2ecf20Sopenharmony_cistatic void FPT_utilUpdateResidual(struct sccb *p_SCCB)
71578c2ecf20Sopenharmony_ci{
71588c2ecf20Sopenharmony_ci	unsigned long partial_cnt;
71598c2ecf20Sopenharmony_ci	unsigned int sg_index;
71608c2ecf20Sopenharmony_ci	struct blogic_sg_seg *segp;
71618c2ecf20Sopenharmony_ci
71628c2ecf20Sopenharmony_ci	if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
71638c2ecf20Sopenharmony_ci
71648c2ecf20Sopenharmony_ci		p_SCCB->DataLength = 0x0000;
71658c2ecf20Sopenharmony_ci	}
71668c2ecf20Sopenharmony_ci
71678c2ecf20Sopenharmony_ci	else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
71688c2ecf20Sopenharmony_ci
71698c2ecf20Sopenharmony_ci		partial_cnt = 0x0000;
71708c2ecf20Sopenharmony_ci
71718c2ecf20Sopenharmony_ci		sg_index = p_SCCB->Sccb_sgseg;
71728c2ecf20Sopenharmony_ci
71738c2ecf20Sopenharmony_ci
71748c2ecf20Sopenharmony_ci		if (p_SCCB->Sccb_SGoffset) {
71758c2ecf20Sopenharmony_ci
71768c2ecf20Sopenharmony_ci			partial_cnt = p_SCCB->Sccb_SGoffset;
71778c2ecf20Sopenharmony_ci			sg_index++;
71788c2ecf20Sopenharmony_ci		}
71798c2ecf20Sopenharmony_ci
71808c2ecf20Sopenharmony_ci		while (((unsigned long)sg_index *
71818c2ecf20Sopenharmony_ci			(unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) {
71828c2ecf20Sopenharmony_ci			segp = (struct blogic_sg_seg *)(p_SCCB->DataPointer) +
71838c2ecf20Sopenharmony_ci					(sg_index * 2);
71848c2ecf20Sopenharmony_ci			partial_cnt += segp->segbytes;
71858c2ecf20Sopenharmony_ci			sg_index++;
71868c2ecf20Sopenharmony_ci		}
71878c2ecf20Sopenharmony_ci
71888c2ecf20Sopenharmony_ci		p_SCCB->DataLength = partial_cnt;
71898c2ecf20Sopenharmony_ci	}
71908c2ecf20Sopenharmony_ci
71918c2ecf20Sopenharmony_ci	else {
71928c2ecf20Sopenharmony_ci
71938c2ecf20Sopenharmony_ci		p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
71948c2ecf20Sopenharmony_ci	}
71958c2ecf20Sopenharmony_ci}
71968c2ecf20Sopenharmony_ci
71978c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
71988c2ecf20Sopenharmony_ci *
71998c2ecf20Sopenharmony_ci * Function: Wait 1 Second
72008c2ecf20Sopenharmony_ci *
72018c2ecf20Sopenharmony_ci * Description: Wait for 1 second.
72028c2ecf20Sopenharmony_ci *
72038c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
72048c2ecf20Sopenharmony_ci
72058c2ecf20Sopenharmony_cistatic void FPT_Wait1Second(u32 p_port)
72068c2ecf20Sopenharmony_ci{
72078c2ecf20Sopenharmony_ci	unsigned char i;
72088c2ecf20Sopenharmony_ci
72098c2ecf20Sopenharmony_ci	for (i = 0; i < 4; i++) {
72108c2ecf20Sopenharmony_ci
72118c2ecf20Sopenharmony_ci		FPT_Wait(p_port, TO_250ms);
72128c2ecf20Sopenharmony_ci
72138c2ecf20Sopenharmony_ci		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
72148c2ecf20Sopenharmony_ci			break;
72158c2ecf20Sopenharmony_ci
72168c2ecf20Sopenharmony_ci		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
72178c2ecf20Sopenharmony_ci			break;
72188c2ecf20Sopenharmony_ci	}
72198c2ecf20Sopenharmony_ci}
72208c2ecf20Sopenharmony_ci
72218c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
72228c2ecf20Sopenharmony_ci *
72238c2ecf20Sopenharmony_ci * Function: FPT_Wait
72248c2ecf20Sopenharmony_ci *
72258c2ecf20Sopenharmony_ci * Description: Wait the desired delay.
72268c2ecf20Sopenharmony_ci *
72278c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
72288c2ecf20Sopenharmony_ci
72298c2ecf20Sopenharmony_cistatic void FPT_Wait(u32 p_port, unsigned char p_delay)
72308c2ecf20Sopenharmony_ci{
72318c2ecf20Sopenharmony_ci	unsigned char old_timer;
72328c2ecf20Sopenharmony_ci	unsigned char green_flag;
72338c2ecf20Sopenharmony_ci
72348c2ecf20Sopenharmony_ci	old_timer = RD_HARPOON(p_port + hp_seltimeout);
72358c2ecf20Sopenharmony_ci
72368c2ecf20Sopenharmony_ci	green_flag = RD_HARPOON(p_port + hp_clkctrl_0);
72378c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
72388c2ecf20Sopenharmony_ci
72398c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, p_delay);
72408c2ecf20Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
72418c2ecf20Sopenharmony_ci	WRW_HARPOON((p_port + hp_intena), (FPT_default_intena & ~TIMEOUT));
72428c2ecf20Sopenharmony_ci
72438c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0,
72448c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_portctrl_0) | START_TO));
72458c2ecf20Sopenharmony_ci
72468c2ecf20Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & TIMEOUT)) {
72478c2ecf20Sopenharmony_ci
72488c2ecf20Sopenharmony_ci		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
72498c2ecf20Sopenharmony_ci			break;
72508c2ecf20Sopenharmony_ci
72518c2ecf20Sopenharmony_ci		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
72528c2ecf20Sopenharmony_ci			break;
72538c2ecf20Sopenharmony_ci	}
72548c2ecf20Sopenharmony_ci
72558c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0,
72568c2ecf20Sopenharmony_ci		   (RD_HARPOON(p_port + hp_portctrl_0) & ~START_TO));
72578c2ecf20Sopenharmony_ci
72588c2ecf20Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
72598c2ecf20Sopenharmony_ci	WRW_HARPOON((p_port + hp_intena), FPT_default_intena);
72608c2ecf20Sopenharmony_ci
72618c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, green_flag);
72628c2ecf20Sopenharmony_ci
72638c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, old_timer);
72648c2ecf20Sopenharmony_ci}
72658c2ecf20Sopenharmony_ci
72668c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
72678c2ecf20Sopenharmony_ci *
72688c2ecf20Sopenharmony_ci * Function: Enable/Disable Write to EEPROM
72698c2ecf20Sopenharmony_ci *
72708c2ecf20Sopenharmony_ci * Description: The EEPROM must first be enabled for writes
72718c2ecf20Sopenharmony_ci *              A total of 9 clocks are needed.
72728c2ecf20Sopenharmony_ci *
72738c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
72748c2ecf20Sopenharmony_ci
72758c2ecf20Sopenharmony_cistatic void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode)
72768c2ecf20Sopenharmony_ci{
72778c2ecf20Sopenharmony_ci	unsigned char ee_value;
72788c2ecf20Sopenharmony_ci
72798c2ecf20Sopenharmony_ci	ee_value =
72808c2ecf20Sopenharmony_ci	    (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
72818c2ecf20Sopenharmony_ci			    (EXT_ARB_ACK | SCSI_TERM_ENA_H));
72828c2ecf20Sopenharmony_ci
72838c2ecf20Sopenharmony_ci	if (p_mode)
72848c2ecf20Sopenharmony_ci
72858c2ecf20Sopenharmony_ci		FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
72868c2ecf20Sopenharmony_ci
72878c2ecf20Sopenharmony_ci	else
72888c2ecf20Sopenharmony_ci
72898c2ecf20Sopenharmony_ci		FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
72908c2ecf20Sopenharmony_ci
72918c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/*Turn off CS */
72928c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/*Turn off Master Select */
72938c2ecf20Sopenharmony_ci}
72948c2ecf20Sopenharmony_ci
72958c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
72968c2ecf20Sopenharmony_ci *
72978c2ecf20Sopenharmony_ci * Function: Write EEPROM
72988c2ecf20Sopenharmony_ci *
72998c2ecf20Sopenharmony_ci * Description: Write a word to the EEPROM at the specified
73008c2ecf20Sopenharmony_ci *              address.
73018c2ecf20Sopenharmony_ci *
73028c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
73038c2ecf20Sopenharmony_ci
73048c2ecf20Sopenharmony_cistatic void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
73058c2ecf20Sopenharmony_ci			    unsigned short ee_addr)
73068c2ecf20Sopenharmony_ci{
73078c2ecf20Sopenharmony_ci
73088c2ecf20Sopenharmony_ci	unsigned char ee_value;
73098c2ecf20Sopenharmony_ci	unsigned short i;
73108c2ecf20Sopenharmony_ci
73118c2ecf20Sopenharmony_ci	ee_value =
73128c2ecf20Sopenharmony_ci	    (unsigned
73138c2ecf20Sopenharmony_ci	     char)((RD_HARPOON(p_port + hp_ee_ctrl) &
73148c2ecf20Sopenharmony_ci		    (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
73158c2ecf20Sopenharmony_ci
73168c2ecf20Sopenharmony_ci	FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
73178c2ecf20Sopenharmony_ci
73188c2ecf20Sopenharmony_ci	ee_value |= (SEE_MS + SEE_CS);
73198c2ecf20Sopenharmony_ci
73208c2ecf20Sopenharmony_ci	for (i = 0x8000; i != 0; i >>= 1) {
73218c2ecf20Sopenharmony_ci
73228c2ecf20Sopenharmony_ci		if (i & ee_data)
73238c2ecf20Sopenharmony_ci			ee_value |= SEE_DO;
73248c2ecf20Sopenharmony_ci		else
73258c2ecf20Sopenharmony_ci			ee_value &= ~SEE_DO;
73268c2ecf20Sopenharmony_ci
73278c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
73288c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
73298c2ecf20Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
73308c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
73318c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
73328c2ecf20Sopenharmony_ci		ee_value &= ~SEE_CLK;
73338c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
73348c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
73358c2ecf20Sopenharmony_ci	}
73368c2ecf20Sopenharmony_ci	ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
73378c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));
73388c2ecf20Sopenharmony_ci
73398c2ecf20Sopenharmony_ci	FPT_Wait(p_port, TO_10ms);
73408c2ecf20Sopenharmony_ci
73418c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS));	/* Set CS to EEPROM */
73428c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/* Turn off CS */
73438c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/* Turn off Master Select */
73448c2ecf20Sopenharmony_ci}
73458c2ecf20Sopenharmony_ci
73468c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
73478c2ecf20Sopenharmony_ci *
73488c2ecf20Sopenharmony_ci * Function: Read EEPROM
73498c2ecf20Sopenharmony_ci *
73508c2ecf20Sopenharmony_ci * Description: Read a word from the EEPROM at the desired
73518c2ecf20Sopenharmony_ci *              address.
73528c2ecf20Sopenharmony_ci *
73538c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
73548c2ecf20Sopenharmony_ci
73558c2ecf20Sopenharmony_cistatic unsigned short FPT_utilEERead(u32 p_port,
73568c2ecf20Sopenharmony_ci				     unsigned short ee_addr)
73578c2ecf20Sopenharmony_ci{
73588c2ecf20Sopenharmony_ci	unsigned short i, ee_data1, ee_data2;
73598c2ecf20Sopenharmony_ci
73608c2ecf20Sopenharmony_ci	i = 0;
73618c2ecf20Sopenharmony_ci	ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
73628c2ecf20Sopenharmony_ci	do {
73638c2ecf20Sopenharmony_ci		ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
73648c2ecf20Sopenharmony_ci
73658c2ecf20Sopenharmony_ci		if (ee_data1 == ee_data2)
73668c2ecf20Sopenharmony_ci			return ee_data1;
73678c2ecf20Sopenharmony_ci
73688c2ecf20Sopenharmony_ci		ee_data1 = ee_data2;
73698c2ecf20Sopenharmony_ci		i++;
73708c2ecf20Sopenharmony_ci
73718c2ecf20Sopenharmony_ci	} while (i < 4);
73728c2ecf20Sopenharmony_ci
73738c2ecf20Sopenharmony_ci	return ee_data1;
73748c2ecf20Sopenharmony_ci}
73758c2ecf20Sopenharmony_ci
73768c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
73778c2ecf20Sopenharmony_ci *
73788c2ecf20Sopenharmony_ci * Function: Read EEPROM Original
73798c2ecf20Sopenharmony_ci *
73808c2ecf20Sopenharmony_ci * Description: Read a word from the EEPROM at the desired
73818c2ecf20Sopenharmony_ci *              address.
73828c2ecf20Sopenharmony_ci *
73838c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
73848c2ecf20Sopenharmony_ci
73858c2ecf20Sopenharmony_cistatic unsigned short FPT_utilEEReadOrg(u32 p_port, unsigned short ee_addr)
73868c2ecf20Sopenharmony_ci{
73878c2ecf20Sopenharmony_ci
73888c2ecf20Sopenharmony_ci	unsigned char ee_value;
73898c2ecf20Sopenharmony_ci	unsigned short i, ee_data;
73908c2ecf20Sopenharmony_ci
73918c2ecf20Sopenharmony_ci	ee_value =
73928c2ecf20Sopenharmony_ci	    (unsigned
73938c2ecf20Sopenharmony_ci	     char)((RD_HARPOON(p_port + hp_ee_ctrl) &
73948c2ecf20Sopenharmony_ci		    (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
73958c2ecf20Sopenharmony_ci
73968c2ecf20Sopenharmony_ci	FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
73978c2ecf20Sopenharmony_ci
73988c2ecf20Sopenharmony_ci	ee_value |= (SEE_MS + SEE_CS);
73998c2ecf20Sopenharmony_ci	ee_data = 0;
74008c2ecf20Sopenharmony_ci
74018c2ecf20Sopenharmony_ci	for (i = 1; i <= 16; i++) {
74028c2ecf20Sopenharmony_ci
74038c2ecf20Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
74048c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74058c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74068c2ecf20Sopenharmony_ci		ee_value &= ~SEE_CLK;
74078c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74088c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74098c2ecf20Sopenharmony_ci
74108c2ecf20Sopenharmony_ci		ee_data <<= 1;
74118c2ecf20Sopenharmony_ci
74128c2ecf20Sopenharmony_ci		if (RD_HARPOON(p_port + hp_ee_ctrl) & SEE_DI)
74138c2ecf20Sopenharmony_ci			ee_data |= 1;
74148c2ecf20Sopenharmony_ci	}
74158c2ecf20Sopenharmony_ci
74168c2ecf20Sopenharmony_ci	ee_value &= ~(SEE_MS + SEE_CS);
74178c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/*Turn off CS */
74188c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/*Turn off Master Select */
74198c2ecf20Sopenharmony_ci
74208c2ecf20Sopenharmony_ci	return ee_data;
74218c2ecf20Sopenharmony_ci}
74228c2ecf20Sopenharmony_ci
74238c2ecf20Sopenharmony_ci/*---------------------------------------------------------------------
74248c2ecf20Sopenharmony_ci *
74258c2ecf20Sopenharmony_ci * Function: Send EE command and Address to the EEPROM
74268c2ecf20Sopenharmony_ci *
74278c2ecf20Sopenharmony_ci * Description: Transfers the correct command and sends the address
74288c2ecf20Sopenharmony_ci *              to the eeprom.
74298c2ecf20Sopenharmony_ci *
74308c2ecf20Sopenharmony_ci *---------------------------------------------------------------------*/
74318c2ecf20Sopenharmony_ci
74328c2ecf20Sopenharmony_cistatic void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
74338c2ecf20Sopenharmony_ci				  unsigned short ee_addr)
74348c2ecf20Sopenharmony_ci{
74358c2ecf20Sopenharmony_ci	unsigned char ee_value;
74368c2ecf20Sopenharmony_ci	unsigned char narrow_flg;
74378c2ecf20Sopenharmony_ci
74388c2ecf20Sopenharmony_ci	unsigned short i;
74398c2ecf20Sopenharmony_ci
74408c2ecf20Sopenharmony_ci	narrow_flg =
74418c2ecf20Sopenharmony_ci	    (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
74428c2ecf20Sopenharmony_ci			    NARROW_SCSI_CARD);
74438c2ecf20Sopenharmony_ci
74448c2ecf20Sopenharmony_ci	ee_value = SEE_MS;
74458c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74468c2ecf20Sopenharmony_ci
74478c2ecf20Sopenharmony_ci	ee_value |= SEE_CS;	/* Set CS to EEPROM */
74488c2ecf20Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74498c2ecf20Sopenharmony_ci
74508c2ecf20Sopenharmony_ci	for (i = 0x04; i != 0; i >>= 1) {
74518c2ecf20Sopenharmony_ci
74528c2ecf20Sopenharmony_ci		if (i & ee_cmd)
74538c2ecf20Sopenharmony_ci			ee_value |= SEE_DO;
74548c2ecf20Sopenharmony_ci		else
74558c2ecf20Sopenharmony_ci			ee_value &= ~SEE_DO;
74568c2ecf20Sopenharmony_ci
74578c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74588c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74598c2ecf20Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
74608c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74618c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74628c2ecf20Sopenharmony_ci		ee_value &= ~SEE_CLK;
74638c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74648c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74658c2ecf20Sopenharmony_ci	}
74668c2ecf20Sopenharmony_ci
74678c2ecf20Sopenharmony_ci	if (narrow_flg)
74688c2ecf20Sopenharmony_ci		i = 0x0080;
74698c2ecf20Sopenharmony_ci
74708c2ecf20Sopenharmony_ci	else
74718c2ecf20Sopenharmony_ci		i = 0x0200;
74728c2ecf20Sopenharmony_ci
74738c2ecf20Sopenharmony_ci	while (i != 0) {
74748c2ecf20Sopenharmony_ci
74758c2ecf20Sopenharmony_ci		if (i & ee_addr)
74768c2ecf20Sopenharmony_ci			ee_value |= SEE_DO;
74778c2ecf20Sopenharmony_ci		else
74788c2ecf20Sopenharmony_ci			ee_value &= ~SEE_DO;
74798c2ecf20Sopenharmony_ci
74808c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74818c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74828c2ecf20Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
74838c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74848c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74858c2ecf20Sopenharmony_ci		ee_value &= ~SEE_CLK;
74868c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74878c2ecf20Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
74888c2ecf20Sopenharmony_ci
74898c2ecf20Sopenharmony_ci		i >>= 1;
74908c2ecf20Sopenharmony_ci	}
74918c2ecf20Sopenharmony_ci}
74928c2ecf20Sopenharmony_ci
74938c2ecf20Sopenharmony_cistatic unsigned short FPT_CalcCrc16(unsigned char buffer[])
74948c2ecf20Sopenharmony_ci{
74958c2ecf20Sopenharmony_ci	unsigned short crc = 0;
74968c2ecf20Sopenharmony_ci	int i, j;
74978c2ecf20Sopenharmony_ci	unsigned short ch;
74988c2ecf20Sopenharmony_ci	for (i = 0; i < ID_STRING_LENGTH; i++) {
74998c2ecf20Sopenharmony_ci		ch = (unsigned short)buffer[i];
75008c2ecf20Sopenharmony_ci		for (j = 0; j < 8; j++) {
75018c2ecf20Sopenharmony_ci			if ((crc ^ ch) & 1)
75028c2ecf20Sopenharmony_ci				crc = (crc >> 1) ^ CRCMASK;
75038c2ecf20Sopenharmony_ci			else
75048c2ecf20Sopenharmony_ci				crc >>= 1;
75058c2ecf20Sopenharmony_ci			ch >>= 1;
75068c2ecf20Sopenharmony_ci		}
75078c2ecf20Sopenharmony_ci	}
75088c2ecf20Sopenharmony_ci	return crc;
75098c2ecf20Sopenharmony_ci}
75108c2ecf20Sopenharmony_ci
75118c2ecf20Sopenharmony_cistatic unsigned char FPT_CalcLrc(unsigned char buffer[])
75128c2ecf20Sopenharmony_ci{
75138c2ecf20Sopenharmony_ci	int i;
75148c2ecf20Sopenharmony_ci	unsigned char lrc;
75158c2ecf20Sopenharmony_ci	lrc = 0;
75168c2ecf20Sopenharmony_ci	for (i = 0; i < ID_STRING_LENGTH; i++)
75178c2ecf20Sopenharmony_ci		lrc ^= buffer[i];
75188c2ecf20Sopenharmony_ci	return lrc;
75198c2ecf20Sopenharmony_ci}
75208c2ecf20Sopenharmony_ci
75218c2ecf20Sopenharmony_ci/*
75228c2ecf20Sopenharmony_ci  The following inline definitions avoid type conflicts.
75238c2ecf20Sopenharmony_ci*/
75248c2ecf20Sopenharmony_ci
75258c2ecf20Sopenharmony_cistatic inline unsigned char
75268c2ecf20Sopenharmony_ciFlashPoint__ProbeHostAdapter(struct fpoint_info *FlashPointInfo)
75278c2ecf20Sopenharmony_ci{
75288c2ecf20Sopenharmony_ci	return FlashPoint_ProbeHostAdapter((struct sccb_mgr_info *)
75298c2ecf20Sopenharmony_ci					   FlashPointInfo);
75308c2ecf20Sopenharmony_ci}
75318c2ecf20Sopenharmony_ci
75328c2ecf20Sopenharmony_cistatic inline void *
75338c2ecf20Sopenharmony_ciFlashPoint__HardwareResetHostAdapter(struct fpoint_info *FlashPointInfo)
75348c2ecf20Sopenharmony_ci{
75358c2ecf20Sopenharmony_ci	return FlashPoint_HardwareResetHostAdapter((struct sccb_mgr_info *)
75368c2ecf20Sopenharmony_ci						   FlashPointInfo);
75378c2ecf20Sopenharmony_ci}
75388c2ecf20Sopenharmony_ci
75398c2ecf20Sopenharmony_cistatic inline void
75408c2ecf20Sopenharmony_ciFlashPoint__ReleaseHostAdapter(void *CardHandle)
75418c2ecf20Sopenharmony_ci{
75428c2ecf20Sopenharmony_ci	FlashPoint_ReleaseHostAdapter(CardHandle);
75438c2ecf20Sopenharmony_ci}
75448c2ecf20Sopenharmony_ci
75458c2ecf20Sopenharmony_cistatic inline void
75468c2ecf20Sopenharmony_ciFlashPoint__StartCCB(void *CardHandle, struct blogic_ccb *CCB)
75478c2ecf20Sopenharmony_ci{
75488c2ecf20Sopenharmony_ci	FlashPoint_StartCCB(CardHandle, (struct sccb *)CCB);
75498c2ecf20Sopenharmony_ci}
75508c2ecf20Sopenharmony_ci
75518c2ecf20Sopenharmony_cistatic inline void
75528c2ecf20Sopenharmony_ciFlashPoint__AbortCCB(void *CardHandle, struct blogic_ccb *CCB)
75538c2ecf20Sopenharmony_ci{
75548c2ecf20Sopenharmony_ci	FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB);
75558c2ecf20Sopenharmony_ci}
75568c2ecf20Sopenharmony_ci
75578c2ecf20Sopenharmony_cistatic inline bool
75588c2ecf20Sopenharmony_ciFlashPoint__InterruptPending(void *CardHandle)
75598c2ecf20Sopenharmony_ci{
75608c2ecf20Sopenharmony_ci	return FlashPoint_InterruptPending(CardHandle);
75618c2ecf20Sopenharmony_ci}
75628c2ecf20Sopenharmony_ci
75638c2ecf20Sopenharmony_cistatic inline int
75648c2ecf20Sopenharmony_ciFlashPoint__HandleInterrupt(void *CardHandle)
75658c2ecf20Sopenharmony_ci{
75668c2ecf20Sopenharmony_ci	return FlashPoint_HandleInterrupt(CardHandle);
75678c2ecf20Sopenharmony_ci}
75688c2ecf20Sopenharmony_ci
75698c2ecf20Sopenharmony_ci#define FlashPoint_ProbeHostAdapter	    FlashPoint__ProbeHostAdapter
75708c2ecf20Sopenharmony_ci#define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
75718c2ecf20Sopenharmony_ci#define FlashPoint_ReleaseHostAdapter	    FlashPoint__ReleaseHostAdapter
75728c2ecf20Sopenharmony_ci#define FlashPoint_StartCCB		    FlashPoint__StartCCB
75738c2ecf20Sopenharmony_ci#define FlashPoint_AbortCCB		    FlashPoint__AbortCCB
75748c2ecf20Sopenharmony_ci#define FlashPoint_InterruptPending	    FlashPoint__InterruptPending
75758c2ecf20Sopenharmony_ci#define FlashPoint_HandleInterrupt	    FlashPoint__HandleInterrupt
75768c2ecf20Sopenharmony_ci
75778c2ecf20Sopenharmony_ci#else				/* !CONFIG_SCSI_FLASHPOINT */
75788c2ecf20Sopenharmony_ci
75798c2ecf20Sopenharmony_ci/*
75808c2ecf20Sopenharmony_ci  Define prototypes for the FlashPoint SCCB Manager Functions.
75818c2ecf20Sopenharmony_ci*/
75828c2ecf20Sopenharmony_ci
75838c2ecf20Sopenharmony_ciextern unsigned char FlashPoint_ProbeHostAdapter(struct fpoint_info *);
75848c2ecf20Sopenharmony_ciextern void *FlashPoint_HardwareResetHostAdapter(struct fpoint_info *);
75858c2ecf20Sopenharmony_ciextern void FlashPoint_StartCCB(void *, struct blogic_ccb *);
75868c2ecf20Sopenharmony_ciextern int FlashPoint_AbortCCB(void *, struct blogic_ccb *);
75878c2ecf20Sopenharmony_ciextern bool FlashPoint_InterruptPending(void *);
75888c2ecf20Sopenharmony_ciextern int FlashPoint_HandleInterrupt(void *);
75898c2ecf20Sopenharmony_ciextern void FlashPoint_ReleaseHostAdapter(void *);
75908c2ecf20Sopenharmony_ci
75918c2ecf20Sopenharmony_ci#endif				/* CONFIG_SCSI_FLASHPOINT */
7592