162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci  FlashPoint.c -- FlashPoint SCCB Manager for Linux
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci  This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
662306a36Sopenharmony_ci  Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
762306a36Sopenharmony_ci  Linux compatibility.  It was provided by BusLogic in the form of 16 separate
862306a36Sopenharmony_ci  source files, which would have unnecessarily cluttered the scsi directory, so
962306a36Sopenharmony_ci  the individual files have been combined into this single file.
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci  Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci  This file is available under both the GNU General Public License
1462306a36Sopenharmony_ci  and a BSD-style copyright; see LICENSE.FlashPoint for details.
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci*/
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#ifdef CONFIG_SCSI_FLASHPOINT
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define MAX_CARDS	8
2262306a36Sopenharmony_ci#undef BUSTYPE_PCI
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define CRCMASK	0xA001
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define FAILURE         0xFFFFFFFFL
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct sccb;
2962306a36Sopenharmony_citypedef void (*CALL_BK_FN) (struct sccb *);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct sccb_mgr_info {
3262306a36Sopenharmony_ci	u32 si_baseaddr;
3362306a36Sopenharmony_ci	unsigned char si_present;
3462306a36Sopenharmony_ci	unsigned char si_intvect;
3562306a36Sopenharmony_ci	unsigned char si_id;
3662306a36Sopenharmony_ci	unsigned char si_lun;
3762306a36Sopenharmony_ci	u16 si_fw_revision;
3862306a36Sopenharmony_ci	u16 si_per_targ_init_sync;
3962306a36Sopenharmony_ci	u16 si_per_targ_fast_nego;
4062306a36Sopenharmony_ci	u16 si_per_targ_ultra_nego;
4162306a36Sopenharmony_ci	u16 si_per_targ_no_disc;
4262306a36Sopenharmony_ci	u16 si_per_targ_wide_nego;
4362306a36Sopenharmony_ci	u16 si_mflags;
4462306a36Sopenharmony_ci	unsigned char si_card_family;
4562306a36Sopenharmony_ci	unsigned char si_bustype;
4662306a36Sopenharmony_ci	unsigned char si_card_model[3];
4762306a36Sopenharmony_ci	unsigned char si_relative_cardnum;
4862306a36Sopenharmony_ci	unsigned char si_reserved[4];
4962306a36Sopenharmony_ci	u32 si_OS_reserved;
5062306a36Sopenharmony_ci	unsigned char si_XlatInfo[4];
5162306a36Sopenharmony_ci	u32 si_reserved2[5];
5262306a36Sopenharmony_ci	u32 si_secondary_range;
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define SCSI_PARITY_ENA		  0x0001
5662306a36Sopenharmony_ci#define LOW_BYTE_TERM		  0x0010
5762306a36Sopenharmony_ci#define HIGH_BYTE_TERM		  0x0020
5862306a36Sopenharmony_ci#define BUSTYPE_PCI	  0x3
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define SUPPORT_16TAR_32LUN	  0x0002
6162306a36Sopenharmony_ci#define SOFT_RESET		  0x0004
6262306a36Sopenharmony_ci#define EXTENDED_TRANSLATION	  0x0008
6362306a36Sopenharmony_ci#define POST_ALL_UNDERRRUNS	  0x0040
6462306a36Sopenharmony_ci#define FLAG_SCAM_ENABLED	  0x0080
6562306a36Sopenharmony_ci#define FLAG_SCAM_LEVEL2	  0x0100
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define HARPOON_FAMILY        0x02
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* SCCB struct used for both SCCB and UCB manager compiles!
7062306a36Sopenharmony_ci * The UCB Manager treats the SCCB as it's 'native hardware structure'
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/*#pragma pack(1)*/
7462306a36Sopenharmony_cistruct sccb {
7562306a36Sopenharmony_ci	unsigned char OperationCode;
7662306a36Sopenharmony_ci	unsigned char ControlByte;
7762306a36Sopenharmony_ci	unsigned char CdbLength;
7862306a36Sopenharmony_ci	unsigned char RequestSenseLength;
7962306a36Sopenharmony_ci	u32 DataLength;
8062306a36Sopenharmony_ci	void *DataPointer;
8162306a36Sopenharmony_ci	unsigned char CcbRes[2];
8262306a36Sopenharmony_ci	unsigned char HostStatus;
8362306a36Sopenharmony_ci	unsigned char TargetStatus;
8462306a36Sopenharmony_ci	unsigned char TargID;
8562306a36Sopenharmony_ci	unsigned char Lun;
8662306a36Sopenharmony_ci	unsigned char Cdb[12];
8762306a36Sopenharmony_ci	unsigned char CcbRes1;
8862306a36Sopenharmony_ci	unsigned char Reserved1;
8962306a36Sopenharmony_ci	u32 Reserved2;
9062306a36Sopenharmony_ci	u32 SensePointer;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	CALL_BK_FN SccbCallback;	/* VOID (*SccbCallback)(); */
9362306a36Sopenharmony_ci	u32 SccbIOPort;			/* Identifies board base port */
9462306a36Sopenharmony_ci	unsigned char SccbStatus;
9562306a36Sopenharmony_ci	unsigned char SCCBRes2;
9662306a36Sopenharmony_ci	u16 SccbOSFlags;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	u32 Sccb_XferCnt;	/* actual transfer count */
9962306a36Sopenharmony_ci	u32 Sccb_ATC;
10062306a36Sopenharmony_ci	u32 SccbVirtDataPtr;	/* virtual addr for OS/2 */
10162306a36Sopenharmony_ci	u32 Sccb_res1;
10262306a36Sopenharmony_ci	u16 Sccb_MGRFlags;
10362306a36Sopenharmony_ci	u16 Sccb_sgseg;
10462306a36Sopenharmony_ci	unsigned char Sccb_scsimsg;	/* identify msg for selection */
10562306a36Sopenharmony_ci	unsigned char Sccb_tag;
10662306a36Sopenharmony_ci	unsigned char Sccb_scsistat;
10762306a36Sopenharmony_ci	unsigned char Sccb_idmsg;	/* image of last msg in */
10862306a36Sopenharmony_ci	struct sccb *Sccb_forwardlink;
10962306a36Sopenharmony_ci	struct sccb *Sccb_backlink;
11062306a36Sopenharmony_ci	u32 Sccb_savedATC;
11162306a36Sopenharmony_ci	unsigned char Save_Cdb[6];
11262306a36Sopenharmony_ci	unsigned char Save_CdbLen;
11362306a36Sopenharmony_ci	unsigned char Sccb_XferState;
11462306a36Sopenharmony_ci	u32 Sccb_SGoffset;
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#pragma pack()
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define SCATTER_GATHER_COMMAND    0x02
12062306a36Sopenharmony_ci#define RESIDUAL_COMMAND          0x03
12162306a36Sopenharmony_ci#define RESIDUAL_SG_COMMAND       0x04
12262306a36Sopenharmony_ci#define RESET_COMMAND             0x81
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci#define F_USE_CMD_Q              0x20	/*Inidcates TAGGED command. */
12562306a36Sopenharmony_ci#define TAG_TYPE_MASK            0xC0	/*Type of tag msg to send. */
12662306a36Sopenharmony_ci#define SCCB_DATA_XFER_OUT       0x10	/* Write */
12762306a36Sopenharmony_ci#define SCCB_DATA_XFER_IN        0x08	/* Read */
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#define NO_AUTO_REQUEST_SENSE    0x01	/* No Request Sense Buffer */
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci#define BUS_FREE_ST     0
13262306a36Sopenharmony_ci#define SELECT_ST       1
13362306a36Sopenharmony_ci#define SELECT_BDR_ST   2	/* Select w\ Bus Device Reset */
13462306a36Sopenharmony_ci#define SELECT_SN_ST    3	/* Select w\ Sync Nego */
13562306a36Sopenharmony_ci#define SELECT_WN_ST    4	/* Select w\ Wide Data Nego */
13662306a36Sopenharmony_ci#define SELECT_Q_ST     5	/* Select w\ Tagged Q'ing */
13762306a36Sopenharmony_ci#define COMMAND_ST      6
13862306a36Sopenharmony_ci#define DATA_OUT_ST     7
13962306a36Sopenharmony_ci#define DATA_IN_ST      8
14062306a36Sopenharmony_ci#define DISCONNECT_ST   9
14162306a36Sopenharmony_ci#define ABORT_ST        11
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#define F_HOST_XFER_DIR                0x01
14462306a36Sopenharmony_ci#define F_ALL_XFERRED                  0x02
14562306a36Sopenharmony_ci#define F_SG_XFER                      0x04
14662306a36Sopenharmony_ci#define F_AUTO_SENSE                   0x08
14762306a36Sopenharmony_ci#define F_ODD_BALL_CNT                 0x10
14862306a36Sopenharmony_ci#define F_NO_DATA_YET                  0x80
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define F_STATUSLOADED                 0x01
15162306a36Sopenharmony_ci#define F_DEV_SELECTED                 0x04
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#define SCCB_COMPLETE               0x00	/* SCCB completed without error */
15462306a36Sopenharmony_ci#define SCCB_DATA_UNDER_RUN         0x0C
15562306a36Sopenharmony_ci#define SCCB_SELECTION_TIMEOUT      0x11	/* Set SCSI selection timed out */
15662306a36Sopenharmony_ci#define SCCB_DATA_OVER_RUN          0x12
15762306a36Sopenharmony_ci#define SCCB_PHASE_SEQUENCE_FAIL    0x14	/* Target bus phase sequence failure */
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci#define SCCB_GROSS_FW_ERR           0x27	/* Major problem! */
16062306a36Sopenharmony_ci#define SCCB_BM_ERR                 0x30	/* BusMaster error. */
16162306a36Sopenharmony_ci#define SCCB_PARITY_ERR             0x34	/* SCSI parity error */
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci#define SCCB_IN_PROCESS            0x00
16462306a36Sopenharmony_ci#define SCCB_SUCCESS               0x01
16562306a36Sopenharmony_ci#define SCCB_ABORT                 0x02
16662306a36Sopenharmony_ci#define SCCB_ERROR                 0x04
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#define  ORION_FW_REV      3110
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci#define QUEUE_DEPTH     254+1	/*1 for Normal disconnect 32 for Q'ing. */
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci#define	MAX_MB_CARDS	4	/* Max. no of cards suppoerted on Mother Board */
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci#define MAX_SCSI_TAR    16
17562306a36Sopenharmony_ci#define MAX_LUN         32
17662306a36Sopenharmony_ci#define LUN_MASK			0x1f
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci#define SG_BUF_CNT      16	/*Number of prefetched elements. */
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci#define SG_ELEMENT_SIZE 8	/*Eight byte per element. */
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci#define RD_HARPOON(ioport)          inb((u32)ioport)
18362306a36Sopenharmony_ci#define RDW_HARPOON(ioport)         inw((u32)ioport)
18462306a36Sopenharmony_ci#define RD_HARP32(ioport,offset,data) (data = inl((u32)(ioport + offset)))
18562306a36Sopenharmony_ci#define WR_HARPOON(ioport,val)      outb((u8) val, (u32)ioport)
18662306a36Sopenharmony_ci#define WRW_HARPOON(ioport,val)       outw((u16)val, (u32)ioport)
18762306a36Sopenharmony_ci#define WR_HARP32(ioport,offset,data)  outl(data, (u32)(ioport + offset))
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci#define  TAR_SYNC_MASK     (BIT(7)+BIT(6))
19062306a36Sopenharmony_ci#define  SYNC_TRYING               BIT(6)
19162306a36Sopenharmony_ci#define  SYNC_SUPPORTED    (BIT(7)+BIT(6))
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci#define  TAR_WIDE_MASK     (BIT(5)+BIT(4))
19462306a36Sopenharmony_ci#define  WIDE_ENABLED              BIT(4)
19562306a36Sopenharmony_ci#define  WIDE_NEGOCIATED   BIT(5)
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci#define  TAR_TAG_Q_MASK    (BIT(3)+BIT(2))
19862306a36Sopenharmony_ci#define  TAG_Q_TRYING              BIT(2)
19962306a36Sopenharmony_ci#define  TAG_Q_REJECT      BIT(3)
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci#define  TAR_ALLOW_DISC    BIT(0)
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci#define  EE_SYNC_MASK      (BIT(0)+BIT(1))
20462306a36Sopenharmony_ci#define  EE_SYNC_5MB       BIT(0)
20562306a36Sopenharmony_ci#define  EE_SYNC_10MB      BIT(1)
20662306a36Sopenharmony_ci#define  EE_SYNC_20MB      (BIT(0)+BIT(1))
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci#define  EE_WIDE_SCSI      BIT(7)
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cistruct sccb_mgr_tar_info {
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	struct sccb *TarSelQ_Head;
21362306a36Sopenharmony_ci	struct sccb *TarSelQ_Tail;
21462306a36Sopenharmony_ci	unsigned char TarLUN_CA;	/*Contingent Allgiance */
21562306a36Sopenharmony_ci	unsigned char TarTagQ_Cnt;
21662306a36Sopenharmony_ci	unsigned char TarSelQ_Cnt;
21762306a36Sopenharmony_ci	unsigned char TarStatus;
21862306a36Sopenharmony_ci	unsigned char TarEEValue;
21962306a36Sopenharmony_ci	unsigned char TarSyncCtrl;
22062306a36Sopenharmony_ci	unsigned char TarReserved[2];	/* for alignment */
22162306a36Sopenharmony_ci	unsigned char LunDiscQ_Idx[MAX_LUN];
22262306a36Sopenharmony_ci	unsigned char TarLUNBusy[MAX_LUN];
22362306a36Sopenharmony_ci};
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cistruct nvram_info {
22662306a36Sopenharmony_ci	unsigned char niModel;		/* Model No. of card */
22762306a36Sopenharmony_ci	unsigned char niCardNo;		/* Card no. */
22862306a36Sopenharmony_ci	u32 niBaseAddr;			/* Port Address of card */
22962306a36Sopenharmony_ci	unsigned char niSysConf;	/* Adapter Configuration byte -
23062306a36Sopenharmony_ci					   Byte 16 of eeprom map */
23162306a36Sopenharmony_ci	unsigned char niScsiConf;	/* SCSI Configuration byte -
23262306a36Sopenharmony_ci					   Byte 17 of eeprom map */
23362306a36Sopenharmony_ci	unsigned char niScamConf;	/* SCAM Configuration byte -
23462306a36Sopenharmony_ci					   Byte 20 of eeprom map */
23562306a36Sopenharmony_ci	unsigned char niAdapId;		/* Host Adapter ID -
23662306a36Sopenharmony_ci					   Byte 24 of eerpom map */
23762306a36Sopenharmony_ci	unsigned char niSyncTbl[MAX_SCSI_TAR / 2];	/* Sync/Wide byte
23862306a36Sopenharmony_ci							   of targets */
23962306a36Sopenharmony_ci	unsigned char niScamTbl[MAX_SCSI_TAR][4];	/* Compressed Scam name
24062306a36Sopenharmony_ci							   string of Targets */
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci#define	MODEL_LT		1
24462306a36Sopenharmony_ci#define	MODEL_DL		2
24562306a36Sopenharmony_ci#define	MODEL_LW		3
24662306a36Sopenharmony_ci#define	MODEL_DW		4
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistruct sccb_card {
24962306a36Sopenharmony_ci	struct sccb *currentSCCB;
25062306a36Sopenharmony_ci	struct sccb_mgr_info *cardInfo;
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	u32 ioPort;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	unsigned short cmdCounter;
25562306a36Sopenharmony_ci	unsigned char discQCount;
25662306a36Sopenharmony_ci	unsigned char tagQ_Lst;
25762306a36Sopenharmony_ci	unsigned char cardIndex;
25862306a36Sopenharmony_ci	unsigned char scanIndex;
25962306a36Sopenharmony_ci	unsigned char globalFlags;
26062306a36Sopenharmony_ci	unsigned char ourId;
26162306a36Sopenharmony_ci	struct nvram_info *pNvRamInfo;
26262306a36Sopenharmony_ci	struct sccb *discQ_Tbl[QUEUE_DEPTH];
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci};
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci#define F_TAG_STARTED		0x01
26762306a36Sopenharmony_ci#define F_CONLUN_IO			0x02
26862306a36Sopenharmony_ci#define F_DO_RENEGO			0x04
26962306a36Sopenharmony_ci#define F_NO_FILTER			0x08
27062306a36Sopenharmony_ci#define F_GREEN_PC			0x10
27162306a36Sopenharmony_ci#define F_HOST_XFER_ACT		0x20
27262306a36Sopenharmony_ci#define F_NEW_SCCB_CMD		0x40
27362306a36Sopenharmony_ci#define F_UPDATE_EEPROM		0x80
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci#define  ID_STRING_LENGTH  32
27662306a36Sopenharmony_ci#define  TYPE_CODE0        0x63	/*Level2 Mstr (bits 7-6),  */
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci#define  SLV_TYPE_CODE0    0xA3	/*Priority Bit set (bits 7-6),  */
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci#define  ASSIGN_ID   0x00
28162306a36Sopenharmony_ci#define  SET_P_FLAG  0x01
28262306a36Sopenharmony_ci#define  CFG_CMPLT   0x03
28362306a36Sopenharmony_ci#define  DOM_MSTR    0x0F
28462306a36Sopenharmony_ci#define  SYNC_PTRN   0x1F
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci#define  ID_0_7      0x18
28762306a36Sopenharmony_ci#define  ID_8_F      0x11
28862306a36Sopenharmony_ci#define  MISC_CODE   0x14
28962306a36Sopenharmony_ci#define  CLR_P_FLAG  0x18
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci#define  INIT_SELTD  0x01
29262306a36Sopenharmony_ci#define  LEVEL2_TAR  0x02
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_cienum scam_id_st { ID0, ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, ID9, ID10, ID11,
29562306a36Sopenharmony_ci	    ID12,
29662306a36Sopenharmony_ci	ID13, ID14, ID15, ID_UNUSED, ID_UNASSIGNED, ID_ASSIGNED, LEGACY,
29762306a36Sopenharmony_ci	CLR_PRIORITY, NO_ID_AVAIL
29862306a36Sopenharmony_ci};
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_citypedef struct SCCBscam_info {
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	unsigned char id_string[ID_STRING_LENGTH];
30362306a36Sopenharmony_ci	enum scam_id_st state;
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci} SCCBSCAM_INFO;
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci#define  SMIDENT                 0x80
30962306a36Sopenharmony_ci#define  DISC_PRIV               0x40
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci#define  SM8BIT                  0x00
31262306a36Sopenharmony_ci#define  SM16BIT                 0x01
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci#define  SIX_BYTE_CMD            0x06
31562306a36Sopenharmony_ci#define  TWELVE_BYTE_CMD         0x0C
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci#define  ASYNC                   0x00
31862306a36Sopenharmony_ci#define  MAX_OFFSET              0x0F	/* Maxbyteoffset for Sync Xfers */
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci#define  EEPROM_WD_CNT     256
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci#define  EEPROM_CHECK_SUM  0
32362306a36Sopenharmony_ci#define  FW_SIGNATURE      2
32462306a36Sopenharmony_ci#define  MODEL_NUMB_0      4
32562306a36Sopenharmony_ci#define  MODEL_NUMB_2      6
32662306a36Sopenharmony_ci#define  MODEL_NUMB_4      8
32762306a36Sopenharmony_ci#define  SYSTEM_CONFIG     16
32862306a36Sopenharmony_ci#define  SCSI_CONFIG       17
32962306a36Sopenharmony_ci#define  BIOS_CONFIG       18
33062306a36Sopenharmony_ci#define  SCAM_CONFIG       20
33162306a36Sopenharmony_ci#define  ADAPTER_SCSI_ID   24
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci#define  IGNORE_B_SCAN     32
33462306a36Sopenharmony_ci#define  SEND_START_ENA    34
33562306a36Sopenharmony_ci#define  DEVICE_ENABLE     36
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci#define  SYNC_RATE_TBL     38
33862306a36Sopenharmony_ci#define  SYNC_RATE_TBL01   38
33962306a36Sopenharmony_ci#define  SYNC_RATE_TBL23   40
34062306a36Sopenharmony_ci#define  SYNC_RATE_TBL45   42
34162306a36Sopenharmony_ci#define  SYNC_RATE_TBL67   44
34262306a36Sopenharmony_ci#define  SYNC_RATE_TBL89   46
34362306a36Sopenharmony_ci#define  SYNC_RATE_TBLab   48
34462306a36Sopenharmony_ci#define  SYNC_RATE_TBLcd   50
34562306a36Sopenharmony_ci#define  SYNC_RATE_TBLef   52
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci#define  EE_SCAMBASE      256
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci#define  SCAM_ENABLED   BIT(2)
35062306a36Sopenharmony_ci#define  SCAM_LEVEL2    BIT(3)
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci#define	RENEGO_ENA		BIT(10)
35362306a36Sopenharmony_ci#define	CONNIO_ENA		BIT(11)
35462306a36Sopenharmony_ci#define  GREEN_PC_ENA   BIT(12)
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci#define  AUTO_RATE_00   00
35762306a36Sopenharmony_ci#define  AUTO_RATE_05   01
35862306a36Sopenharmony_ci#define  AUTO_RATE_10   02
35962306a36Sopenharmony_ci#define  AUTO_RATE_20   03
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci#define  WIDE_NEGO_BIT     BIT(7)
36262306a36Sopenharmony_ci#define  DISC_ENABLE_BIT   BIT(6)
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci#define  hp_vendor_id_0       0x00	/* LSB */
36562306a36Sopenharmony_ci#define  ORION_VEND_0   0x4B
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci#define  hp_vendor_id_1       0x01	/* MSB */
36862306a36Sopenharmony_ci#define  ORION_VEND_1   0x10
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci#define  hp_device_id_0       0x02	/* LSB */
37162306a36Sopenharmony_ci#define  ORION_DEV_0    0x30
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci#define  hp_device_id_1       0x03	/* MSB */
37462306a36Sopenharmony_ci#define  ORION_DEV_1    0x81
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	/* Sub Vendor ID and Sub Device ID only available in
37762306a36Sopenharmony_ci	   Harpoon Version 2 and higher */
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci#define  hp_sub_device_id_0   0x06	/* LSB */
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci#define  hp_semaphore         0x0C
38262306a36Sopenharmony_ci#define SCCB_MGR_ACTIVE    BIT(0)
38362306a36Sopenharmony_ci#define TICKLE_ME          BIT(1)
38462306a36Sopenharmony_ci#define SCCB_MGR_PRESENT   BIT(3)
38562306a36Sopenharmony_ci#define BIOS_IN_USE        BIT(4)
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci#define  hp_sys_ctrl          0x0F
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci#define  STOP_CLK          BIT(0)	/*Turn off BusMaster Clock */
39062306a36Sopenharmony_ci#define  DRVR_RST          BIT(1)	/*Firmware Reset to 80C15 chip */
39162306a36Sopenharmony_ci#define  HALT_MACH         BIT(3)	/*Halt State Machine      */
39262306a36Sopenharmony_ci#define  HARD_ABORT        BIT(4)	/*Hard Abort              */
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci#define  hp_host_blk_cnt      0x13
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci#define  XFER_BLK64        0x06	/*     1 1 0 64 byte per block */
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci#define  BM_THRESHOLD      0x40	/* PCI mode can only xfer 16 bytes */
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci#define  hp_int_mask          0x17
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci#define  INT_CMD_COMPL     BIT(0)	/* DMA command complete   */
40362306a36Sopenharmony_ci#define  INT_EXT_STATUS    BIT(1)	/* Extended Status Set    */
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci#define  hp_xfer_cnt_lo       0x18
40662306a36Sopenharmony_ci#define  hp_xfer_cnt_hi       0x1A
40762306a36Sopenharmony_ci#define  hp_xfer_cmd          0x1B
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci#define  XFER_HOST_DMA     0x00	/*     0 0 0 Transfer Host -> DMA */
41062306a36Sopenharmony_ci#define  XFER_DMA_HOST     0x01	/*     0 0 1 Transfer DMA  -> Host */
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci#define  XFER_HOST_AUTO    0x00	/*     0 0 Auto Transfer Size   */
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci#define  XFER_DMA_8BIT     0x20	/*     0 1 8 BIT  Transfer Size */
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci#define  DISABLE_INT       BIT(7)	/*Do not interrupt at end of cmd. */
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci#define  HOST_WRT_CMD      ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
41962306a36Sopenharmony_ci#define  HOST_RD_CMD       ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci#define  hp_host_addr_lo      0x1C
42262306a36Sopenharmony_ci#define  hp_host_addr_hmi     0x1E
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci#define  hp_ee_ctrl           0x22
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci#define  EXT_ARB_ACK       BIT(7)
42762306a36Sopenharmony_ci#define  SCSI_TERM_ENA_H   BIT(6)	/* SCSI high byte terminator */
42862306a36Sopenharmony_ci#define  SEE_MS            BIT(5)
42962306a36Sopenharmony_ci#define  SEE_CS            BIT(3)
43062306a36Sopenharmony_ci#define  SEE_CLK           BIT(2)
43162306a36Sopenharmony_ci#define  SEE_DO            BIT(1)
43262306a36Sopenharmony_ci#define  SEE_DI            BIT(0)
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci#define  EE_READ           0x06
43562306a36Sopenharmony_ci#define  EE_WRITE          0x05
43662306a36Sopenharmony_ci#define  EWEN              0x04
43762306a36Sopenharmony_ci#define  EWEN_ADDR         0x03C0
43862306a36Sopenharmony_ci#define  EWDS              0x04
43962306a36Sopenharmony_ci#define  EWDS_ADDR         0x0000
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci#define  hp_bm_ctrl           0x26
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci#define  SCSI_TERM_ENA_L   BIT(0)	/*Enable/Disable external terminators */
44462306a36Sopenharmony_ci#define  FLUSH_XFER_CNTR   BIT(1)	/*Flush transfer counter */
44562306a36Sopenharmony_ci#define  FORCE1_XFER       BIT(5)	/*Always xfer one byte in byte mode */
44662306a36Sopenharmony_ci#define  FAST_SINGLE       BIT(6)	/*?? */
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci#define  BMCTRL_DEFAULT    (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci#define  hp_sg_addr           0x28
45162306a36Sopenharmony_ci#define  hp_page_ctrl         0x29
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci#define  SCATTER_EN        BIT(0)
45462306a36Sopenharmony_ci#define  SGRAM_ARAM        BIT(1)
45562306a36Sopenharmony_ci#define  G_INT_DISABLE     BIT(3)	/* Enable/Disable all Interrupts */
45662306a36Sopenharmony_ci#define  NARROW_SCSI_CARD  BIT(4)	/* NARROW/WIDE SCSI config pin */
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci#define  hp_pci_stat_cfg      0x2D
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci#define  REC_MASTER_ABORT  BIT(5)	/*received Master abort */
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci#define  hp_rev_num           0x33
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci#define  hp_stack_data        0x34
46562306a36Sopenharmony_ci#define  hp_stack_addr        0x35
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci#define  hp_ext_status        0x36
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci#define  BM_FORCE_OFF      BIT(0)	/*Bus Master is forced to get off */
47062306a36Sopenharmony_ci#define  PCI_TGT_ABORT     BIT(0)	/*PCI bus master transaction aborted */
47162306a36Sopenharmony_ci#define  PCI_DEV_TMOUT     BIT(1)	/*PCI Device Time out */
47262306a36Sopenharmony_ci#define  CMD_ABORTED       BIT(4)	/*Command aborted */
47362306a36Sopenharmony_ci#define  BM_PARITY_ERR     BIT(5)	/*parity error on data received   */
47462306a36Sopenharmony_ci#define  PIO_OVERRUN       BIT(6)	/*Slave data overrun */
47562306a36Sopenharmony_ci#define  BM_CMD_BUSY       BIT(7)	/*Bus master transfer command busy */
47662306a36Sopenharmony_ci#define  BAD_EXT_STATUS    (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \
47762306a36Sopenharmony_ci                                  BM_PARITY_ERR | PIO_OVERRUN)
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci#define  hp_int_status        0x37
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci#define  EXT_STATUS_ON     BIT(1)	/*Extended status is valid */
48262306a36Sopenharmony_ci#define  SCSI_INTERRUPT    BIT(2)	/*Global indication of a SCSI int. */
48362306a36Sopenharmony_ci#define  INT_ASSERTED      BIT(5)	/* */
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci#define  hp_fifo_cnt          0x38
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci#define  hp_intena		 0x40
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci#define  RESET		 BIT(7)
49062306a36Sopenharmony_ci#define  PROG_HLT		 BIT(6)
49162306a36Sopenharmony_ci#define  PARITY		 BIT(5)
49262306a36Sopenharmony_ci#define  FIFO		 BIT(4)
49362306a36Sopenharmony_ci#define  SEL		 BIT(3)
49462306a36Sopenharmony_ci#define  SCAM_SEL		 BIT(2)
49562306a36Sopenharmony_ci#define  RSEL		 BIT(1)
49662306a36Sopenharmony_ci#define  TIMEOUT		 BIT(0)
49762306a36Sopenharmony_ci#define  BUS_FREE		 BIT(15)
49862306a36Sopenharmony_ci#define  XFER_CNT_0	 BIT(14)
49962306a36Sopenharmony_ci#define  PHASE		 BIT(13)
50062306a36Sopenharmony_ci#define  IUNKWN		 BIT(12)
50162306a36Sopenharmony_ci#define  ICMD_COMP	 BIT(11)
50262306a36Sopenharmony_ci#define  ITICKLE		 BIT(10)
50362306a36Sopenharmony_ci#define  IDO_STRT		 BIT(9)
50462306a36Sopenharmony_ci#define  ITAR_DISC	 BIT(8)
50562306a36Sopenharmony_ci#define  AUTO_INT		 (BIT(12)+BIT(11)+BIT(10)+BIT(9)+BIT(8))
50662306a36Sopenharmony_ci#define  CLR_ALL_INT	 0xFFFF
50762306a36Sopenharmony_ci#define  CLR_ALL_INT_1	 0xFF00
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci#define  hp_intstat		 0x42
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci#define  hp_scsisig           0x44
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci#define  SCSI_SEL          BIT(7)
51462306a36Sopenharmony_ci#define  SCSI_BSY          BIT(6)
51562306a36Sopenharmony_ci#define  SCSI_REQ          BIT(5)
51662306a36Sopenharmony_ci#define  SCSI_ACK          BIT(4)
51762306a36Sopenharmony_ci#define  SCSI_ATN          BIT(3)
51862306a36Sopenharmony_ci#define  SCSI_CD           BIT(2)
51962306a36Sopenharmony_ci#define  SCSI_MSG          BIT(1)
52062306a36Sopenharmony_ci#define  SCSI_IOBIT        BIT(0)
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci#define  S_SCSI_PHZ        (BIT(2)+BIT(1)+BIT(0))
52362306a36Sopenharmony_ci#define  S_MSGO_PH         (BIT(2)+BIT(1)       )
52462306a36Sopenharmony_ci#define  S_MSGI_PH         (BIT(2)+BIT(1)+BIT(0))
52562306a36Sopenharmony_ci#define  S_DATAI_PH        (              BIT(0))
52662306a36Sopenharmony_ci#define  S_DATAO_PH        0x00
52762306a36Sopenharmony_ci#define  S_ILL_PH          (       BIT(1)       )
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_ci#define  hp_scsictrl_0        0x45
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci#define  SEL_TAR           BIT(6)
53262306a36Sopenharmony_ci#define  ENA_ATN           BIT(4)
53362306a36Sopenharmony_ci#define  ENA_RESEL         BIT(2)
53462306a36Sopenharmony_ci#define  SCSI_RST          BIT(1)
53562306a36Sopenharmony_ci#define  ENA_SCAM_SEL      BIT(0)
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_ci#define  hp_portctrl_0        0x46
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci#define  SCSI_PORT         BIT(7)
54062306a36Sopenharmony_ci#define  SCSI_INBIT        BIT(6)
54162306a36Sopenharmony_ci#define  DMA_PORT          BIT(5)
54262306a36Sopenharmony_ci#define  DMA_RD            BIT(4)
54362306a36Sopenharmony_ci#define  HOST_PORT         BIT(3)
54462306a36Sopenharmony_ci#define  HOST_WRT          BIT(2)
54562306a36Sopenharmony_ci#define  SCSI_BUS_EN       BIT(1)
54662306a36Sopenharmony_ci#define  START_TO          BIT(0)
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci#define  hp_scsireset         0x47
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci#define  SCSI_INI          BIT(6)
55162306a36Sopenharmony_ci#define  SCAM_EN           BIT(5)
55262306a36Sopenharmony_ci#define  DMA_RESET         BIT(3)
55362306a36Sopenharmony_ci#define  HPSCSI_RESET      BIT(2)
55462306a36Sopenharmony_ci#define  PROG_RESET        BIT(1)
55562306a36Sopenharmony_ci#define  FIFO_CLR          BIT(0)
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci#define  hp_xfercnt_0         0x48
55862306a36Sopenharmony_ci#define  hp_xfercnt_2         0x4A
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci#define  hp_fifodata_0        0x4C
56162306a36Sopenharmony_ci#define  hp_addstat           0x4E
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ci#define  SCAM_TIMER        BIT(7)
56462306a36Sopenharmony_ci#define  SCSI_MODE8        BIT(3)
56562306a36Sopenharmony_ci#define  SCSI_PAR_ERR      BIT(0)
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci#define  hp_prgmcnt_0         0x4F
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ci#define  hp_selfid_0          0x50
57062306a36Sopenharmony_ci#define  hp_selfid_1          0x51
57162306a36Sopenharmony_ci#define  hp_arb_id            0x52
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci#define  hp_select_id         0x53
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci#define  hp_synctarg_base     0x54
57662306a36Sopenharmony_ci#define  hp_synctarg_12       0x54
57762306a36Sopenharmony_ci#define  hp_synctarg_13       0x55
57862306a36Sopenharmony_ci#define  hp_synctarg_14       0x56
57962306a36Sopenharmony_ci#define  hp_synctarg_15       0x57
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci#define  hp_synctarg_8        0x58
58262306a36Sopenharmony_ci#define  hp_synctarg_9        0x59
58362306a36Sopenharmony_ci#define  hp_synctarg_10       0x5A
58462306a36Sopenharmony_ci#define  hp_synctarg_11       0x5B
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci#define  hp_synctarg_4        0x5C
58762306a36Sopenharmony_ci#define  hp_synctarg_5        0x5D
58862306a36Sopenharmony_ci#define  hp_synctarg_6        0x5E
58962306a36Sopenharmony_ci#define  hp_synctarg_7        0x5F
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci#define  hp_synctarg_0        0x60
59262306a36Sopenharmony_ci#define  hp_synctarg_1        0x61
59362306a36Sopenharmony_ci#define  hp_synctarg_2        0x62
59462306a36Sopenharmony_ci#define  hp_synctarg_3        0x63
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci#define  NARROW_SCSI       BIT(4)
59762306a36Sopenharmony_ci#define  DEFAULT_OFFSET    0x0F
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci#define  hp_autostart_0       0x64
60062306a36Sopenharmony_ci#define  hp_autostart_1       0x65
60162306a36Sopenharmony_ci#define  hp_autostart_3       0x67
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci#define  AUTO_IMMED    BIT(5)
60462306a36Sopenharmony_ci#define  SELECT   BIT(6)
60562306a36Sopenharmony_ci#define  END_DATA (BIT(7)+BIT(6))
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci#define  hp_gp_reg_0          0x68
60862306a36Sopenharmony_ci#define  hp_gp_reg_1          0x69
60962306a36Sopenharmony_ci#define  hp_gp_reg_3          0x6B
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci#define  hp_seltimeout        0x6C
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci#define  TO_4ms            0x67	/* 3.9959ms */
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci#define  TO_5ms            0x03	/* 4.9152ms */
61662306a36Sopenharmony_ci#define  TO_10ms           0x07	/* 11.xxxms */
61762306a36Sopenharmony_ci#define  TO_250ms          0x99	/* 250.68ms */
61862306a36Sopenharmony_ci#define  TO_290ms          0xB1	/* 289.99ms */
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci#define  hp_clkctrl_0         0x6D
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci#define  PWR_DWN           BIT(6)
62362306a36Sopenharmony_ci#define  ACTdeassert       BIT(4)
62462306a36Sopenharmony_ci#define  CLK_40MHZ         (BIT(1) + BIT(0))
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_ci#define  CLKCTRL_DEFAULT   (ACTdeassert | CLK_40MHZ)
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci#define  hp_fiforead          0x6E
62962306a36Sopenharmony_ci#define  hp_fifowrite         0x6F
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci#define  hp_offsetctr         0x70
63262306a36Sopenharmony_ci#define  hp_xferstat          0x71
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ci#define  FIFO_EMPTY        BIT(6)
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci#define  hp_portctrl_1        0x72
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci#define  CHK_SCSI_P        BIT(3)
63962306a36Sopenharmony_ci#define  HOST_MODE8        BIT(0)
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci#define  hp_xfer_pad          0x73
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_ci#define  ID_UNLOCK         BIT(3)
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci#define  hp_scsidata_0        0x74
64662306a36Sopenharmony_ci#define  hp_scsidata_1        0x75
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci#define  hp_aramBase          0x80
64962306a36Sopenharmony_ci#define  BIOS_DATA_OFFSET     0x60
65062306a36Sopenharmony_ci#define  BIOS_RELATIVE_CARD   0x64
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci#define  AR3      (BIT(9) + BIT(8))
65362306a36Sopenharmony_ci#define  SDATA    BIT(10)
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ci#define  CRD_OP   BIT(11)	/* Cmp Reg. w/ Data */
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci#define  CRR_OP   BIT(12)	/* Cmp Reg. w. Reg. */
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci#define  CPE_OP   (BIT(14)+BIT(11))	/* Cmp SCSI phs & Branch EQ */
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ci#define  CPN_OP   (BIT(14)+BIT(12))	/* Cmp SCSI phs & Branch NOT EQ */
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_ci#define  ADATA_OUT   0x00
66462306a36Sopenharmony_ci#define  ADATA_IN    BIT(8)
66562306a36Sopenharmony_ci#define  ACOMMAND    BIT(10)
66662306a36Sopenharmony_ci#define  ASTATUS     (BIT(10)+BIT(8))
66762306a36Sopenharmony_ci#define  AMSG_OUT    (BIT(10)+BIT(9))
66862306a36Sopenharmony_ci#define  AMSG_IN     (BIT(10)+BIT(9)+BIT(8))
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci#define  BRH_OP   BIT(13)	/* Branch */
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_ci#define  ALWAYS   0x00
67362306a36Sopenharmony_ci#define  EQUAL    BIT(8)
67462306a36Sopenharmony_ci#define  NOT_EQ   BIT(9)
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci#define  TCB_OP   (BIT(13)+BIT(11))	/* Test condition & branch */
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_ci#define  FIFO_0      BIT(10)
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_ci#define  MPM_OP   BIT(15)	/* Match phase and move data */
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci#define  MRR_OP   BIT(14)	/* Move DReg. to Reg. */
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci#define  S_IDREG  (BIT(2)+BIT(1)+BIT(0))
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci#define  D_AR0    0x00
68762306a36Sopenharmony_ci#define  D_AR1    BIT(0)
68862306a36Sopenharmony_ci#define  D_BUCKET (BIT(2) + BIT(1) + BIT(0))
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci#define  RAT_OP      (BIT(14)+BIT(13)+BIT(11))
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_ci#define  SSI_OP      (BIT(15)+BIT(11))
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ci#define  SSI_ITAR_DISC	(ITAR_DISC >> 8)
69562306a36Sopenharmony_ci#define  SSI_IDO_STRT	(IDO_STRT >> 8)
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_ci#define  SSI_ICMD_COMP	(ICMD_COMP >> 8)
69862306a36Sopenharmony_ci#define  SSI_ITICKLE	(ITICKLE >> 8)
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci#define  SSI_IUNKWN	(IUNKWN >> 8)
70162306a36Sopenharmony_ci#define  SSI_INO_CC	(IUNKWN >> 8)
70262306a36Sopenharmony_ci#define  SSI_IRFAIL	(IUNKWN >> 8)
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci#define  NP    0x10		/*Next Phase */
70562306a36Sopenharmony_ci#define  NTCMD 0x02		/*Non- Tagged Command start */
70662306a36Sopenharmony_ci#define  CMDPZ 0x04		/*Command phase */
70762306a36Sopenharmony_ci#define  DINT  0x12		/*Data Out/In interrupt */
70862306a36Sopenharmony_ci#define  DI    0x13		/*Data Out */
70962306a36Sopenharmony_ci#define  DC    0x19		/*Disconnect Message */
71062306a36Sopenharmony_ci#define  ST    0x1D		/*Status Phase */
71162306a36Sopenharmony_ci#define  UNKNWN 0x24		/*Unknown bus action */
71262306a36Sopenharmony_ci#define  CC    0x25		/*Command Completion failure */
71362306a36Sopenharmony_ci#define  TICK  0x26		/*New target reselected us. */
71462306a36Sopenharmony_ci#define  SELCHK 0x28		/*Select & Check SCSI ID latch reg */
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci#define  ID_MSG_STRT    hp_aramBase + 0x00
71762306a36Sopenharmony_ci#define  NON_TAG_ID_MSG hp_aramBase + 0x06
71862306a36Sopenharmony_ci#define  CMD_STRT       hp_aramBase + 0x08
71962306a36Sopenharmony_ci#define  SYNC_MSGS      hp_aramBase + 0x08
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci#define  TAG_STRT          0x00
72262306a36Sopenharmony_ci#define  DISCONNECT_START  0x10/2
72362306a36Sopenharmony_ci#define  END_DATA_START    0x14/2
72462306a36Sopenharmony_ci#define  CMD_ONLY_STRT     CMDPZ/2
72562306a36Sopenharmony_ci#define  SELCHK_STRT     SELCHK/2
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci#define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
72862306a36Sopenharmony_ci/* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \
72962306a36Sopenharmony_ci                                 xfercnt <<= 16,\
73062306a36Sopenharmony_ci                                 xfercnt |= RDW_HARPOON((unsigned short)(port+hp_xfercnt_0)))
73162306a36Sopenharmony_ci */
73262306a36Sopenharmony_ci#define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (unsigned short)(addr & 0x0000FFFFL)),\
73362306a36Sopenharmony_ci         addr >>= 16,\
73462306a36Sopenharmony_ci         WRW_HARPOON((port+hp_host_addr_hmi), (unsigned short)(addr & 0x0000FFFFL)),\
73562306a36Sopenharmony_ci         WR_HARP32(port,hp_xfercnt_0,count),\
73662306a36Sopenharmony_ci         WRW_HARPOON((port+hp_xfer_cnt_lo), (unsigned short)(count & 0x0000FFFFL)),\
73762306a36Sopenharmony_ci         count >>= 16,\
73862306a36Sopenharmony_ci         WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_ci#define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
74162306a36Sopenharmony_ci                          WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_ci#define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
74462306a36Sopenharmony_ci                          WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci#define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\
74762306a36Sopenharmony_ci                        WR_HARPOON(port+hp_scsireset, 0x00))
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci#define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
75062306a36Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_ci#define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
75362306a36Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
75462306a36Sopenharmony_ci
75562306a36Sopenharmony_ci#define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
75662306a36Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
75762306a36Sopenharmony_ci
75862306a36Sopenharmony_ci#define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
75962306a36Sopenharmony_ci                             (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
76062306a36Sopenharmony_ci
76162306a36Sopenharmony_cistatic unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
76262306a36Sopenharmony_ci				 unsigned char syncFlag);
76362306a36Sopenharmony_cistatic void FPT_ssel(u32 port, unsigned char p_card);
76462306a36Sopenharmony_cistatic void FPT_sres(u32 port, unsigned char p_card,
76562306a36Sopenharmony_ci		     struct sccb_card *pCurrCard);
76662306a36Sopenharmony_cistatic void FPT_shandem(u32 port, unsigned char p_card,
76762306a36Sopenharmony_ci			struct sccb *pCurrSCCB);
76862306a36Sopenharmony_cistatic void FPT_stsyncn(u32 port, unsigned char p_card);
76962306a36Sopenharmony_cistatic void FPT_sisyncr(u32 port, unsigned char sync_pulse,
77062306a36Sopenharmony_ci			unsigned char offset);
77162306a36Sopenharmony_cistatic void FPT_sssyncv(u32 p_port, unsigned char p_id,
77262306a36Sopenharmony_ci			unsigned char p_sync_value,
77362306a36Sopenharmony_ci			struct sccb_mgr_tar_info *currTar_Info);
77462306a36Sopenharmony_cistatic void FPT_sresb(u32 port, unsigned char p_card);
77562306a36Sopenharmony_cistatic void FPT_sxfrp(u32 p_port, unsigned char p_card);
77662306a36Sopenharmony_cistatic void FPT_schkdd(u32 port, unsigned char p_card);
77762306a36Sopenharmony_cistatic unsigned char FPT_RdStack(u32 port, unsigned char index);
77862306a36Sopenharmony_cistatic void FPT_WrStack(u32 portBase, unsigned char index,
77962306a36Sopenharmony_ci			unsigned char data);
78062306a36Sopenharmony_cistatic unsigned char FPT_ChkIfChipInitialized(u32 ioPort);
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_cistatic void FPT_SendMsg(u32 port, unsigned char message);
78362306a36Sopenharmony_cistatic void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
78462306a36Sopenharmony_ci				   unsigned char error_code);
78562306a36Sopenharmony_ci
78662306a36Sopenharmony_cistatic void FPT_sinits(struct sccb *p_sccb, unsigned char p_card);
78762306a36Sopenharmony_cistatic void FPT_RNVRamData(struct nvram_info *pNvRamInfo);
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_cistatic unsigned char FPT_siwidn(u32 port, unsigned char p_card);
79062306a36Sopenharmony_cistatic void FPT_stwidn(u32 port, unsigned char p_card);
79162306a36Sopenharmony_cistatic void FPT_siwidr(u32 port, unsigned char width);
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_cistatic void FPT_queueSelectFail(struct sccb_card *pCurrCard,
79462306a36Sopenharmony_ci				unsigned char p_card);
79562306a36Sopenharmony_cistatic void FPT_queueDisconnect(struct sccb *p_SCCB, unsigned char p_card);
79662306a36Sopenharmony_cistatic void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
79762306a36Sopenharmony_ci				 struct sccb *p_SCCB, unsigned char p_card);
79862306a36Sopenharmony_cistatic void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
79962306a36Sopenharmony_ci				  unsigned char p_card);
80062306a36Sopenharmony_cistatic void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code);
80162306a36Sopenharmony_cistatic void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char card);
80262306a36Sopenharmony_cistatic unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
80362306a36Sopenharmony_ci				       unsigned char p_card);
80462306a36Sopenharmony_cistatic void FPT_utilUpdateResidual(struct sccb *p_SCCB);
80562306a36Sopenharmony_cistatic unsigned short FPT_CalcCrc16(unsigned char buffer[]);
80662306a36Sopenharmony_cistatic unsigned char FPT_CalcLrc(unsigned char buffer[]);
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_cistatic void FPT_Wait1Second(u32 p_port);
80962306a36Sopenharmony_cistatic void FPT_Wait(u32 p_port, unsigned char p_delay);
81062306a36Sopenharmony_cistatic void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode);
81162306a36Sopenharmony_cistatic void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
81262306a36Sopenharmony_ci			    unsigned short ee_addr);
81362306a36Sopenharmony_cistatic unsigned short FPT_utilEERead(u32 p_port,
81462306a36Sopenharmony_ci				     unsigned short ee_addr);
81562306a36Sopenharmony_cistatic unsigned short FPT_utilEEReadOrg(u32 p_port,
81662306a36Sopenharmony_ci					unsigned short ee_addr);
81762306a36Sopenharmony_cistatic void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
81862306a36Sopenharmony_ci				  unsigned short ee_addr);
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_cistatic void FPT_phaseDataOut(u32 port, unsigned char p_card);
82162306a36Sopenharmony_cistatic void FPT_phaseDataIn(u32 port, unsigned char p_card);
82262306a36Sopenharmony_cistatic void FPT_phaseCommand(u32 port, unsigned char p_card);
82362306a36Sopenharmony_cistatic void FPT_phaseStatus(u32 port, unsigned char p_card);
82462306a36Sopenharmony_cistatic void FPT_phaseMsgOut(u32 port, unsigned char p_card);
82562306a36Sopenharmony_cistatic void FPT_phaseMsgIn(u32 port, unsigned char p_card);
82662306a36Sopenharmony_cistatic void FPT_phaseIllegal(u32 port, unsigned char p_card);
82762306a36Sopenharmony_ci
82862306a36Sopenharmony_cistatic void FPT_phaseDecode(u32 port, unsigned char p_card);
82962306a36Sopenharmony_cistatic void FPT_phaseChkFifo(u32 port, unsigned char p_card);
83062306a36Sopenharmony_cistatic void FPT_phaseBusFree(u32 p_port, unsigned char p_card);
83162306a36Sopenharmony_ci
83262306a36Sopenharmony_cistatic void FPT_XbowInit(u32 port, unsigned char scamFlg);
83362306a36Sopenharmony_cistatic void FPT_BusMasterInit(u32 p_port);
83462306a36Sopenharmony_cistatic void FPT_DiagEEPROM(u32 p_port);
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_cistatic void FPT_dataXferProcessor(u32 port,
83762306a36Sopenharmony_ci				  struct sccb_card *pCurrCard);
83862306a36Sopenharmony_cistatic void FPT_busMstrSGDataXferStart(u32 port,
83962306a36Sopenharmony_ci				       struct sccb *pCurrSCCB);
84062306a36Sopenharmony_cistatic void FPT_busMstrDataXferStart(u32 port,
84162306a36Sopenharmony_ci				     struct sccb *pCurrSCCB);
84262306a36Sopenharmony_cistatic void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
84362306a36Sopenharmony_ci				  struct sccb *pCurrSCCB);
84462306a36Sopenharmony_cistatic void FPT_hostDataXferRestart(struct sccb *currSCCB);
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_cistatic unsigned char FPT_SccbMgr_bad_isr(u32 p_port,
84762306a36Sopenharmony_ci					 unsigned char p_card,
84862306a36Sopenharmony_ci					 struct sccb_card *pCurrCard,
84962306a36Sopenharmony_ci					 unsigned short p_int);
85062306a36Sopenharmony_ci
85162306a36Sopenharmony_cistatic void FPT_SccbMgrTableInitAll(void);
85262306a36Sopenharmony_cistatic void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
85362306a36Sopenharmony_ci				     unsigned char p_card);
85462306a36Sopenharmony_cistatic void FPT_SccbMgrTableInitTarget(unsigned char p_card,
85562306a36Sopenharmony_ci				       unsigned char target);
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_cistatic void FPT_scini(unsigned char p_card, unsigned char p_our_id,
85862306a36Sopenharmony_ci		      unsigned char p_power_up);
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_cistatic int FPT_scarb(u32 p_port, unsigned char p_sel_type);
86162306a36Sopenharmony_cistatic void FPT_scbusf(u32 p_port);
86262306a36Sopenharmony_cistatic void FPT_scsel(u32 p_port);
86362306a36Sopenharmony_cistatic void FPT_scasid(unsigned char p_card, u32 p_port);
86462306a36Sopenharmony_cistatic unsigned char FPT_scxferc(u32 p_port, unsigned char p_data);
86562306a36Sopenharmony_cistatic unsigned char FPT_scsendi(u32 p_port,
86662306a36Sopenharmony_ci				 unsigned char p_id_string[]);
86762306a36Sopenharmony_cistatic unsigned char FPT_sciso(u32 p_port,
86862306a36Sopenharmony_ci			       unsigned char p_id_string[]);
86962306a36Sopenharmony_cistatic void FPT_scwirod(u32 p_port, unsigned char p_data_bit);
87062306a36Sopenharmony_cistatic void FPT_scwiros(u32 p_port, unsigned char p_data_bit);
87162306a36Sopenharmony_cistatic unsigned char FPT_scvalq(unsigned char p_quintet);
87262306a36Sopenharmony_cistatic unsigned char FPT_scsell(u32 p_port, unsigned char targ_id);
87362306a36Sopenharmony_cistatic void FPT_scwtsel(u32 p_port);
87462306a36Sopenharmony_cistatic void FPT_inisci(unsigned char p_card, u32 p_port,
87562306a36Sopenharmony_ci		       unsigned char p_our_id);
87662306a36Sopenharmony_cistatic void FPT_scsavdi(unsigned char p_card, u32 p_port);
87762306a36Sopenharmony_cistatic unsigned char FPT_scmachid(unsigned char p_card,
87862306a36Sopenharmony_ci				  unsigned char p_id_string[]);
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_cistatic void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card);
88162306a36Sopenharmony_cistatic void FPT_autoLoadDefaultMap(u32 p_port);
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_cistatic struct sccb_mgr_tar_info FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] =
88462306a36Sopenharmony_ci    { {{0}} };
88562306a36Sopenharmony_cistatic struct sccb_card FPT_BL_Card[MAX_CARDS] = { {0} };
88662306a36Sopenharmony_cistatic SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { {{0}} };
88762306a36Sopenharmony_cistatic struct nvram_info FPT_nvRamInfo[MAX_MB_CARDS] = { {0} };
88862306a36Sopenharmony_ci
88962306a36Sopenharmony_cistatic unsigned char FPT_mbCards = 0;
89062306a36Sopenharmony_cistatic unsigned char FPT_scamHAString[] =
89162306a36Sopenharmony_ci    { 0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C',
89262306a36Sopenharmony_ci	' ', 'B', 'T', '-', '9', '3', '0',
89362306a36Sopenharmony_ci	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
89462306a36Sopenharmony_ci	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
89562306a36Sopenharmony_ci};
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_cistatic unsigned short FPT_default_intena = 0;
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_cistatic void (*FPT_s_PhaseTbl[8]) (u32, unsigned char) = {
90062306a36Sopenharmony_ci0};
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci/*---------------------------------------------------------------------
90362306a36Sopenharmony_ci *
90462306a36Sopenharmony_ci * Function: FlashPoint_ProbeHostAdapter
90562306a36Sopenharmony_ci *
90662306a36Sopenharmony_ci * Description: Setup and/or Search for cards and return info to caller.
90762306a36Sopenharmony_ci *
90862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_cistatic int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
91162306a36Sopenharmony_ci{
91262306a36Sopenharmony_ci	static unsigned char first_time = 1;
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	unsigned char i, j, id, ScamFlg;
91562306a36Sopenharmony_ci	unsigned short temp, temp2, temp3, temp4, temp5, temp6;
91662306a36Sopenharmony_ci	u32 ioport;
91762306a36Sopenharmony_ci	struct nvram_info *pCurrNvRam;
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_ci	ioport = pCardInfo->si_baseaddr;
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_ci	if (RD_HARPOON(ioport + hp_vendor_id_0) != ORION_VEND_0)
92262306a36Sopenharmony_ci		return (int)FAILURE;
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_ci	if ((RD_HARPOON(ioport + hp_vendor_id_1) != ORION_VEND_1))
92562306a36Sopenharmony_ci		return (int)FAILURE;
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_ci	if ((RD_HARPOON(ioport + hp_device_id_0) != ORION_DEV_0))
92862306a36Sopenharmony_ci		return (int)FAILURE;
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_ci	if ((RD_HARPOON(ioport + hp_device_id_1) != ORION_DEV_1))
93162306a36Sopenharmony_ci		return (int)FAILURE;
93262306a36Sopenharmony_ci
93362306a36Sopenharmony_ci	if (RD_HARPOON(ioport + hp_rev_num) != 0x0f) {
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci/* For new Harpoon then check for sub_device ID LSB
93662306a36Sopenharmony_ci   the bits(0-3) must be all ZERO for compatible with
93762306a36Sopenharmony_ci   current version of SCCBMgr, else skip this Harpoon
93862306a36Sopenharmony_ci	device. */
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_ci		if (RD_HARPOON(ioport + hp_sub_device_id_0) & 0x0f)
94162306a36Sopenharmony_ci			return (int)FAILURE;
94262306a36Sopenharmony_ci	}
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_ci	if (first_time) {
94562306a36Sopenharmony_ci		FPT_SccbMgrTableInitAll();
94662306a36Sopenharmony_ci		first_time = 0;
94762306a36Sopenharmony_ci		FPT_mbCards = 0;
94862306a36Sopenharmony_ci	}
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	if (FPT_RdStack(ioport, 0) != 0x00) {
95162306a36Sopenharmony_ci		if (FPT_ChkIfChipInitialized(ioport) == 0) {
95262306a36Sopenharmony_ci			pCurrNvRam = NULL;
95362306a36Sopenharmony_ci			WR_HARPOON(ioport + hp_semaphore, 0x00);
95462306a36Sopenharmony_ci			FPT_XbowInit(ioport, 0);	/*Must Init the SCSI before attempting */
95562306a36Sopenharmony_ci			FPT_DiagEEPROM(ioport);
95662306a36Sopenharmony_ci		} else {
95762306a36Sopenharmony_ci			if (FPT_mbCards < MAX_MB_CARDS) {
95862306a36Sopenharmony_ci				pCurrNvRam = &FPT_nvRamInfo[FPT_mbCards];
95962306a36Sopenharmony_ci				FPT_mbCards++;
96062306a36Sopenharmony_ci				pCurrNvRam->niBaseAddr = ioport;
96162306a36Sopenharmony_ci				FPT_RNVRamData(pCurrNvRam);
96262306a36Sopenharmony_ci			} else
96362306a36Sopenharmony_ci				return (int)FAILURE;
96462306a36Sopenharmony_ci		}
96562306a36Sopenharmony_ci	} else
96662306a36Sopenharmony_ci		pCurrNvRam = NULL;
96762306a36Sopenharmony_ci
96862306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
96962306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci	if (pCurrNvRam)
97262306a36Sopenharmony_ci		pCardInfo->si_id = pCurrNvRam->niAdapId;
97362306a36Sopenharmony_ci	else
97462306a36Sopenharmony_ci		pCardInfo->si_id =
97562306a36Sopenharmony_ci		    (unsigned
97662306a36Sopenharmony_ci		     char)(FPT_utilEERead(ioport,
97762306a36Sopenharmony_ci					  (ADAPTER_SCSI_ID /
97862306a36Sopenharmony_ci					   2)) & (unsigned char)0x0FF);
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_ci	pCardInfo->si_lun = 0x00;
98162306a36Sopenharmony_ci	pCardInfo->si_fw_revision = ORION_FW_REV;
98262306a36Sopenharmony_ci	temp2 = 0x0000;
98362306a36Sopenharmony_ci	temp3 = 0x0000;
98462306a36Sopenharmony_ci	temp4 = 0x0000;
98562306a36Sopenharmony_ci	temp5 = 0x0000;
98662306a36Sopenharmony_ci	temp6 = 0x0000;
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	for (id = 0; id < (16 / 2); id++) {
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci		if (pCurrNvRam) {
99162306a36Sopenharmony_ci			temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
99262306a36Sopenharmony_ci			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
99362306a36Sopenharmony_ci			    (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
99462306a36Sopenharmony_ci		} else
99562306a36Sopenharmony_ci			temp =
99662306a36Sopenharmony_ci			    FPT_utilEERead(ioport,
99762306a36Sopenharmony_ci					   (unsigned short)((SYNC_RATE_TBL / 2)
99862306a36Sopenharmony_ci							    + id));
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_ci		for (i = 0; i < 2; temp >>= 8, i++) {
100162306a36Sopenharmony_ci
100262306a36Sopenharmony_ci			temp2 >>= 1;
100362306a36Sopenharmony_ci			temp3 >>= 1;
100462306a36Sopenharmony_ci			temp4 >>= 1;
100562306a36Sopenharmony_ci			temp5 >>= 1;
100662306a36Sopenharmony_ci			temp6 >>= 1;
100762306a36Sopenharmony_ci			switch (temp & 0x3) {
100862306a36Sopenharmony_ci			case AUTO_RATE_20:	/* Synchronous, 20 mega-transfers/second */
100962306a36Sopenharmony_ci				temp6 |= 0x8000;
101062306a36Sopenharmony_ci				fallthrough;
101162306a36Sopenharmony_ci			case AUTO_RATE_10:	/* Synchronous, 10 mega-transfers/second */
101262306a36Sopenharmony_ci				temp5 |= 0x8000;
101362306a36Sopenharmony_ci				fallthrough;
101462306a36Sopenharmony_ci			case AUTO_RATE_05:	/* Synchronous, 5 mega-transfers/second */
101562306a36Sopenharmony_ci				temp2 |= 0x8000;
101662306a36Sopenharmony_ci				fallthrough;
101762306a36Sopenharmony_ci			case AUTO_RATE_00:	/* Asynchronous */
101862306a36Sopenharmony_ci				break;
101962306a36Sopenharmony_ci			}
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_ci			if (temp & DISC_ENABLE_BIT)
102262306a36Sopenharmony_ci				temp3 |= 0x8000;
102362306a36Sopenharmony_ci
102462306a36Sopenharmony_ci			if (temp & WIDE_NEGO_BIT)
102562306a36Sopenharmony_ci				temp4 |= 0x8000;
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci		}
102862306a36Sopenharmony_ci	}
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	pCardInfo->si_per_targ_init_sync = temp2;
103162306a36Sopenharmony_ci	pCardInfo->si_per_targ_no_disc = temp3;
103262306a36Sopenharmony_ci	pCardInfo->si_per_targ_wide_nego = temp4;
103362306a36Sopenharmony_ci	pCardInfo->si_per_targ_fast_nego = temp5;
103462306a36Sopenharmony_ci	pCardInfo->si_per_targ_ultra_nego = temp6;
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_ci	if (pCurrNvRam)
103762306a36Sopenharmony_ci		i = pCurrNvRam->niSysConf;
103862306a36Sopenharmony_ci	else
103962306a36Sopenharmony_ci		i = (unsigned
104062306a36Sopenharmony_ci		     char)(FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)));
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_ci	if (pCurrNvRam)
104362306a36Sopenharmony_ci		ScamFlg = pCurrNvRam->niScamConf;
104462306a36Sopenharmony_ci	else
104562306a36Sopenharmony_ci		ScamFlg =
104662306a36Sopenharmony_ci		    (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci	pCardInfo->si_mflags = 0x0000;
104962306a36Sopenharmony_ci
105062306a36Sopenharmony_ci	if (i & 0x01)
105162306a36Sopenharmony_ci		pCardInfo->si_mflags |= SCSI_PARITY_ENA;
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_ci	if (!(i & 0x02))
105462306a36Sopenharmony_ci		pCardInfo->si_mflags |= SOFT_RESET;
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_ci	if (i & 0x10)
105762306a36Sopenharmony_ci		pCardInfo->si_mflags |= EXTENDED_TRANSLATION;
105862306a36Sopenharmony_ci
105962306a36Sopenharmony_ci	if (ScamFlg & SCAM_ENABLED)
106062306a36Sopenharmony_ci		pCardInfo->si_mflags |= FLAG_SCAM_ENABLED;
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci	if (ScamFlg & SCAM_LEVEL2)
106362306a36Sopenharmony_ci		pCardInfo->si_mflags |= FLAG_SCAM_LEVEL2;
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
106662306a36Sopenharmony_ci	if (i & 0x04) {
106762306a36Sopenharmony_ci		j |= SCSI_TERM_ENA_L;
106862306a36Sopenharmony_ci	}
106962306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_bm_ctrl, j);
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
107262306a36Sopenharmony_ci	if (i & 0x08) {
107362306a36Sopenharmony_ci		j |= SCSI_TERM_ENA_H;
107462306a36Sopenharmony_ci	}
107562306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_ee_ctrl, j);
107662306a36Sopenharmony_ci
107762306a36Sopenharmony_ci	if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD))
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci		pCardInfo->si_mflags |= SUPPORT_16TAR_32LUN;
108062306a36Sopenharmony_ci
108162306a36Sopenharmony_ci	pCardInfo->si_card_family = HARPOON_FAMILY;
108262306a36Sopenharmony_ci	pCardInfo->si_bustype = BUSTYPE_PCI;
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci	if (pCurrNvRam) {
108562306a36Sopenharmony_ci		pCardInfo->si_card_model[0] = '9';
108662306a36Sopenharmony_ci		switch (pCurrNvRam->niModel & 0x0f) {
108762306a36Sopenharmony_ci		case MODEL_LT:
108862306a36Sopenharmony_ci			pCardInfo->si_card_model[1] = '3';
108962306a36Sopenharmony_ci			pCardInfo->si_card_model[2] = '0';
109062306a36Sopenharmony_ci			break;
109162306a36Sopenharmony_ci		case MODEL_LW:
109262306a36Sopenharmony_ci			pCardInfo->si_card_model[1] = '5';
109362306a36Sopenharmony_ci			pCardInfo->si_card_model[2] = '0';
109462306a36Sopenharmony_ci			break;
109562306a36Sopenharmony_ci		case MODEL_DL:
109662306a36Sopenharmony_ci			pCardInfo->si_card_model[1] = '3';
109762306a36Sopenharmony_ci			pCardInfo->si_card_model[2] = '2';
109862306a36Sopenharmony_ci			break;
109962306a36Sopenharmony_ci		case MODEL_DW:
110062306a36Sopenharmony_ci			pCardInfo->si_card_model[1] = '5';
110162306a36Sopenharmony_ci			pCardInfo->si_card_model[2] = '2';
110262306a36Sopenharmony_ci			break;
110362306a36Sopenharmony_ci		}
110462306a36Sopenharmony_ci	} else {
110562306a36Sopenharmony_ci		temp = FPT_utilEERead(ioport, (MODEL_NUMB_0 / 2));
110662306a36Sopenharmony_ci		pCardInfo->si_card_model[0] = (unsigned char)(temp >> 8);
110762306a36Sopenharmony_ci		temp = FPT_utilEERead(ioport, (MODEL_NUMB_2 / 2));
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci		pCardInfo->si_card_model[1] = (unsigned char)(temp & 0x00FF);
111062306a36Sopenharmony_ci		pCardInfo->si_card_model[2] = (unsigned char)(temp >> 8);
111162306a36Sopenharmony_ci	}
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_ci	if (pCardInfo->si_card_model[1] == '3') {
111462306a36Sopenharmony_ci		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
111562306a36Sopenharmony_ci			pCardInfo->si_mflags |= LOW_BYTE_TERM;
111662306a36Sopenharmony_ci	} else if (pCardInfo->si_card_model[2] == '0') {
111762306a36Sopenharmony_ci		temp = RD_HARPOON(ioport + hp_xfer_pad);
111862306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4)));
111962306a36Sopenharmony_ci		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
112062306a36Sopenharmony_ci			pCardInfo->si_mflags |= LOW_BYTE_TERM;
112162306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4)));
112262306a36Sopenharmony_ci		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
112362306a36Sopenharmony_ci			pCardInfo->si_mflags |= HIGH_BYTE_TERM;
112462306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, temp);
112562306a36Sopenharmony_ci	} else {
112662306a36Sopenharmony_ci		temp = RD_HARPOON(ioport + hp_ee_ctrl);
112762306a36Sopenharmony_ci		temp2 = RD_HARPOON(ioport + hp_xfer_pad);
112862306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_ee_ctrl, (temp | SEE_CS));
112962306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
113062306a36Sopenharmony_ci		temp3 = 0;
113162306a36Sopenharmony_ci		for (i = 0; i < 8; i++) {
113262306a36Sopenharmony_ci			temp3 <<= 1;
113362306a36Sopenharmony_ci			if (!(RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7)))
113462306a36Sopenharmony_ci				temp3 |= 1;
113562306a36Sopenharmony_ci			WR_HARPOON(ioport + hp_xfer_pad, (temp2 & ~BIT(4)));
113662306a36Sopenharmony_ci			WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
113762306a36Sopenharmony_ci		}
113862306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_ee_ctrl, temp);
113962306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_xfer_pad, temp2);
114062306a36Sopenharmony_ci		if (!(temp3 & BIT(7)))
114162306a36Sopenharmony_ci			pCardInfo->si_mflags |= LOW_BYTE_TERM;
114262306a36Sopenharmony_ci		if (!(temp3 & BIT(6)))
114362306a36Sopenharmony_ci			pCardInfo->si_mflags |= HIGH_BYTE_TERM;
114462306a36Sopenharmony_ci	}
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	ARAM_ACCESS(ioport);
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ci		pCardInfo->si_XlatInfo[i] =
115162306a36Sopenharmony_ci		    RD_HARPOON(ioport + hp_aramBase + BIOS_DATA_OFFSET + i);
115262306a36Sopenharmony_ci	}
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci	/* return with -1 if no sort, else return with
115562306a36Sopenharmony_ci	   logical card number sorted by BIOS (zero-based) */
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_ci	pCardInfo->si_relative_cardnum =
115862306a36Sopenharmony_ci	    (unsigned
115962306a36Sopenharmony_ci	     char)(RD_HARPOON(ioport + hp_aramBase + BIOS_RELATIVE_CARD) - 1);
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_ci	SGRAM_ACCESS(ioport);
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci	FPT_s_PhaseTbl[0] = FPT_phaseDataOut;
116462306a36Sopenharmony_ci	FPT_s_PhaseTbl[1] = FPT_phaseDataIn;
116562306a36Sopenharmony_ci	FPT_s_PhaseTbl[2] = FPT_phaseIllegal;
116662306a36Sopenharmony_ci	FPT_s_PhaseTbl[3] = FPT_phaseIllegal;
116762306a36Sopenharmony_ci	FPT_s_PhaseTbl[4] = FPT_phaseCommand;
116862306a36Sopenharmony_ci	FPT_s_PhaseTbl[5] = FPT_phaseStatus;
116962306a36Sopenharmony_ci	FPT_s_PhaseTbl[6] = FPT_phaseMsgOut;
117062306a36Sopenharmony_ci	FPT_s_PhaseTbl[7] = FPT_phaseMsgIn;
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci	pCardInfo->si_present = 0x01;
117362306a36Sopenharmony_ci
117462306a36Sopenharmony_ci	return 0;
117562306a36Sopenharmony_ci}
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ci/*---------------------------------------------------------------------
117862306a36Sopenharmony_ci *
117962306a36Sopenharmony_ci * Function: FlashPoint_HardwareResetHostAdapter
118062306a36Sopenharmony_ci *
118162306a36Sopenharmony_ci * Description: Setup adapter for normal operation (hard reset).
118262306a36Sopenharmony_ci *
118362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_cistatic void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
118662306a36Sopenharmony_ci							 *pCardInfo)
118762306a36Sopenharmony_ci{
118862306a36Sopenharmony_ci	struct sccb_card *CurrCard = NULL;
118962306a36Sopenharmony_ci	struct nvram_info *pCurrNvRam;
119062306a36Sopenharmony_ci	unsigned char i, j, thisCard, ScamFlg;
119162306a36Sopenharmony_ci	unsigned short temp, sync_bit_map, id;
119262306a36Sopenharmony_ci	u32 ioport;
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_ci	ioport = pCardInfo->si_baseaddr;
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci	for (thisCard = 0; thisCard <= MAX_CARDS; thisCard++) {
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_ci		if (thisCard == MAX_CARDS)
119962306a36Sopenharmony_ci			return (void *)FAILURE;
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_ci		if (FPT_BL_Card[thisCard].ioPort == ioport) {
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci			CurrCard = &FPT_BL_Card[thisCard];
120462306a36Sopenharmony_ci			FPT_SccbMgrTableInitCard(CurrCard, thisCard);
120562306a36Sopenharmony_ci			break;
120662306a36Sopenharmony_ci		}
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_ci		else if (FPT_BL_Card[thisCard].ioPort == 0x00) {
120962306a36Sopenharmony_ci
121062306a36Sopenharmony_ci			FPT_BL_Card[thisCard].ioPort = ioport;
121162306a36Sopenharmony_ci			CurrCard = &FPT_BL_Card[thisCard];
121262306a36Sopenharmony_ci
121362306a36Sopenharmony_ci			if (FPT_mbCards)
121462306a36Sopenharmony_ci				for (i = 0; i < FPT_mbCards; i++) {
121562306a36Sopenharmony_ci					if (CurrCard->ioPort ==
121662306a36Sopenharmony_ci					    FPT_nvRamInfo[i].niBaseAddr)
121762306a36Sopenharmony_ci						CurrCard->pNvRamInfo =
121862306a36Sopenharmony_ci						    &FPT_nvRamInfo[i];
121962306a36Sopenharmony_ci				}
122062306a36Sopenharmony_ci			FPT_SccbMgrTableInitCard(CurrCard, thisCard);
122162306a36Sopenharmony_ci			CurrCard->cardIndex = thisCard;
122262306a36Sopenharmony_ci			CurrCard->cardInfo = pCardInfo;
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci			break;
122562306a36Sopenharmony_ci		}
122662306a36Sopenharmony_ci	}
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci	pCurrNvRam = CurrCard->pNvRamInfo;
122962306a36Sopenharmony_ci
123062306a36Sopenharmony_ci	if (pCurrNvRam) {
123162306a36Sopenharmony_ci		ScamFlg = pCurrNvRam->niScamConf;
123262306a36Sopenharmony_ci	} else {
123362306a36Sopenharmony_ci		ScamFlg =
123462306a36Sopenharmony_ci		    (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
123562306a36Sopenharmony_ci	}
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci	FPT_BusMasterInit(ioport);
123862306a36Sopenharmony_ci	FPT_XbowInit(ioport, ScamFlg);
123962306a36Sopenharmony_ci
124062306a36Sopenharmony_ci	FPT_autoLoadDefaultMap(ioport);
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci	for (i = 0, id = 0x01; i != pCardInfo->si_id; i++, id <<= 1) {
124362306a36Sopenharmony_ci	}
124462306a36Sopenharmony_ci
124562306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_selfid_0, id);
124662306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_selfid_1, 0x00);
124762306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id);
124862306a36Sopenharmony_ci	CurrCard->ourId = pCardInfo->si_id;
124962306a36Sopenharmony_ci
125062306a36Sopenharmony_ci	i = (unsigned char)pCardInfo->si_mflags;
125162306a36Sopenharmony_ci	if (i & SCSI_PARITY_ENA)
125262306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P));
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
125562306a36Sopenharmony_ci	if (i & LOW_BYTE_TERM)
125662306a36Sopenharmony_ci		j |= SCSI_TERM_ENA_L;
125762306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_bm_ctrl, j);
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_ci	j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
126062306a36Sopenharmony_ci	if (i & HIGH_BYTE_TERM)
126162306a36Sopenharmony_ci		j |= SCSI_TERM_ENA_H;
126262306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_ee_ctrl, j);
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_ci	if (!(pCardInfo->si_mflags & SOFT_RESET)) {
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci		FPT_sresb(ioport, thisCard);
126762306a36Sopenharmony_ci
126862306a36Sopenharmony_ci		FPT_scini(thisCard, pCardInfo->si_id, 0);
126962306a36Sopenharmony_ci	}
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci	if (pCardInfo->si_mflags & POST_ALL_UNDERRRUNS)
127262306a36Sopenharmony_ci		CurrCard->globalFlags |= F_NO_FILTER;
127362306a36Sopenharmony_ci
127462306a36Sopenharmony_ci	if (pCurrNvRam) {
127562306a36Sopenharmony_ci		if (pCurrNvRam->niSysConf & 0x10)
127662306a36Sopenharmony_ci			CurrCard->globalFlags |= F_GREEN_PC;
127762306a36Sopenharmony_ci	} else {
127862306a36Sopenharmony_ci		if (FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)) & GREEN_PC_ENA)
127962306a36Sopenharmony_ci			CurrCard->globalFlags |= F_GREEN_PC;
128062306a36Sopenharmony_ci	}
128162306a36Sopenharmony_ci
128262306a36Sopenharmony_ci	/* Set global flag to indicate Re-Negotiation to be done on all
128362306a36Sopenharmony_ci	   ckeck condition */
128462306a36Sopenharmony_ci	if (pCurrNvRam) {
128562306a36Sopenharmony_ci		if (pCurrNvRam->niScsiConf & 0x04)
128662306a36Sopenharmony_ci			CurrCard->globalFlags |= F_DO_RENEGO;
128762306a36Sopenharmony_ci	} else {
128862306a36Sopenharmony_ci		if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & RENEGO_ENA)
128962306a36Sopenharmony_ci			CurrCard->globalFlags |= F_DO_RENEGO;
129062306a36Sopenharmony_ci	}
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_ci	if (pCurrNvRam) {
129362306a36Sopenharmony_ci		if (pCurrNvRam->niScsiConf & 0x08)
129462306a36Sopenharmony_ci			CurrCard->globalFlags |= F_CONLUN_IO;
129562306a36Sopenharmony_ci	} else {
129662306a36Sopenharmony_ci		if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & CONNIO_ENA)
129762306a36Sopenharmony_ci			CurrCard->globalFlags |= F_CONLUN_IO;
129862306a36Sopenharmony_ci	}
129962306a36Sopenharmony_ci
130062306a36Sopenharmony_ci	temp = pCardInfo->si_per_targ_no_disc;
130162306a36Sopenharmony_ci
130262306a36Sopenharmony_ci	for (i = 0, id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
130362306a36Sopenharmony_ci
130462306a36Sopenharmony_ci		if (temp & id)
130562306a36Sopenharmony_ci			FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
130662306a36Sopenharmony_ci	}
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci	sync_bit_map = 0x0001;
130962306a36Sopenharmony_ci
131062306a36Sopenharmony_ci	for (id = 0; id < (MAX_SCSI_TAR / 2); id++) {
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_ci		if (pCurrNvRam) {
131362306a36Sopenharmony_ci			temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
131462306a36Sopenharmony_ci			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
131562306a36Sopenharmony_ci			    (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
131662306a36Sopenharmony_ci		} else
131762306a36Sopenharmony_ci			temp =
131862306a36Sopenharmony_ci			    FPT_utilEERead(ioport,
131962306a36Sopenharmony_ci					   (unsigned short)((SYNC_RATE_TBL / 2)
132062306a36Sopenharmony_ci							    + id));
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci		for (i = 0; i < 2; temp >>= 8, i++) {
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_ci			if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
132762306a36Sopenharmony_ci							 i].TarEEValue =
132862306a36Sopenharmony_ci				    (unsigned char)temp;
132962306a36Sopenharmony_ci			}
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci			else {
133262306a36Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
133362306a36Sopenharmony_ci							 i].TarStatus |=
133462306a36Sopenharmony_ci				    SYNC_SUPPORTED;
133562306a36Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
133662306a36Sopenharmony_ci							 i].TarEEValue =
133762306a36Sopenharmony_ci				    (unsigned char)(temp & ~EE_SYNC_MASK);
133862306a36Sopenharmony_ci			}
133962306a36Sopenharmony_ci
134062306a36Sopenharmony_ci/*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
134162306a36Sopenharmony_ci            (id*2+i >= 8)){
134262306a36Sopenharmony_ci*/
134362306a36Sopenharmony_ci			if (pCardInfo->si_per_targ_wide_nego & sync_bit_map) {
134462306a36Sopenharmony_ci
134562306a36Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
134662306a36Sopenharmony_ci							 i].TarEEValue |=
134762306a36Sopenharmony_ci				    EE_WIDE_SCSI;
134862306a36Sopenharmony_ci
134962306a36Sopenharmony_ci			}
135062306a36Sopenharmony_ci
135162306a36Sopenharmony_ci			else {	/* NARROW SCSI */
135262306a36Sopenharmony_ci				FPT_sccbMgrTbl[thisCard][id * 2 +
135362306a36Sopenharmony_ci							 i].TarStatus |=
135462306a36Sopenharmony_ci				    WIDE_NEGOCIATED;
135562306a36Sopenharmony_ci			}
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_ci			sync_bit_map <<= 1;
135862306a36Sopenharmony_ci
135962306a36Sopenharmony_ci		}
136062306a36Sopenharmony_ci	}
136162306a36Sopenharmony_ci
136262306a36Sopenharmony_ci	WR_HARPOON((ioport + hp_semaphore),
136362306a36Sopenharmony_ci		   (unsigned char)(RD_HARPOON((ioport + hp_semaphore)) |
136462306a36Sopenharmony_ci				   SCCB_MGR_PRESENT));
136562306a36Sopenharmony_ci
136662306a36Sopenharmony_ci	return (void *)CurrCard;
136762306a36Sopenharmony_ci}
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_cistatic void FlashPoint_ReleaseHostAdapter(void *pCurrCard)
137062306a36Sopenharmony_ci{
137162306a36Sopenharmony_ci	unsigned char i;
137262306a36Sopenharmony_ci	u32 portBase;
137362306a36Sopenharmony_ci	u32 regOffset;
137462306a36Sopenharmony_ci	u32 scamData;
137562306a36Sopenharmony_ci	u32 *pScamTbl;
137662306a36Sopenharmony_ci	struct nvram_info *pCurrNvRam;
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_ci	pCurrNvRam = ((struct sccb_card *)pCurrCard)->pNvRamInfo;
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_ci	if (pCurrNvRam) {
138162306a36Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
138262306a36Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
138362306a36Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
138462306a36Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
138562306a36Sopenharmony_ci		FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
138662306a36Sopenharmony_ci
138762306a36Sopenharmony_ci		for (i = 0; i < MAX_SCSI_TAR / 2; i++)
138862306a36Sopenharmony_ci			FPT_WrStack(pCurrNvRam->niBaseAddr,
138962306a36Sopenharmony_ci				    (unsigned char)(i + 5),
139062306a36Sopenharmony_ci				    pCurrNvRam->niSyncTbl[i]);
139162306a36Sopenharmony_ci
139262306a36Sopenharmony_ci		portBase = pCurrNvRam->niBaseAddr;
139362306a36Sopenharmony_ci
139462306a36Sopenharmony_ci		for (i = 0; i < MAX_SCSI_TAR; i++) {
139562306a36Sopenharmony_ci			regOffset = hp_aramBase + 64 + i * 4;
139662306a36Sopenharmony_ci			pScamTbl = (u32 *)&pCurrNvRam->niScamTbl[i];
139762306a36Sopenharmony_ci			scamData = *pScamTbl;
139862306a36Sopenharmony_ci			WR_HARP32(portBase, regOffset, scamData);
139962306a36Sopenharmony_ci		}
140062306a36Sopenharmony_ci
140162306a36Sopenharmony_ci	} else {
140262306a36Sopenharmony_ci		FPT_WrStack(((struct sccb_card *)pCurrCard)->ioPort, 0, 0);
140362306a36Sopenharmony_ci	}
140462306a36Sopenharmony_ci}
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_cistatic void FPT_RNVRamData(struct nvram_info *pNvRamInfo)
140762306a36Sopenharmony_ci{
140862306a36Sopenharmony_ci	unsigned char i;
140962306a36Sopenharmony_ci	u32 portBase;
141062306a36Sopenharmony_ci	u32 regOffset;
141162306a36Sopenharmony_ci	u32 scamData;
141262306a36Sopenharmony_ci	u32 *pScamTbl;
141362306a36Sopenharmony_ci
141462306a36Sopenharmony_ci	pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0);
141562306a36Sopenharmony_ci	pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1);
141662306a36Sopenharmony_ci	pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2);
141762306a36Sopenharmony_ci	pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3);
141862306a36Sopenharmony_ci	pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4);
141962306a36Sopenharmony_ci
142062306a36Sopenharmony_ci	for (i = 0; i < MAX_SCSI_TAR / 2; i++)
142162306a36Sopenharmony_ci		pNvRamInfo->niSyncTbl[i] =
142262306a36Sopenharmony_ci		    FPT_RdStack(pNvRamInfo->niBaseAddr, (unsigned char)(i + 5));
142362306a36Sopenharmony_ci
142462306a36Sopenharmony_ci	portBase = pNvRamInfo->niBaseAddr;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	for (i = 0; i < MAX_SCSI_TAR; i++) {
142762306a36Sopenharmony_ci		regOffset = hp_aramBase + 64 + i * 4;
142862306a36Sopenharmony_ci		RD_HARP32(portBase, regOffset, scamData);
142962306a36Sopenharmony_ci		pScamTbl = (u32 *)&pNvRamInfo->niScamTbl[i];
143062306a36Sopenharmony_ci		*pScamTbl = scamData;
143162306a36Sopenharmony_ci	}
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci}
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_cistatic unsigned char FPT_RdStack(u32 portBase, unsigned char index)
143662306a36Sopenharmony_ci{
143762306a36Sopenharmony_ci	WR_HARPOON(portBase + hp_stack_addr, index);
143862306a36Sopenharmony_ci	return RD_HARPOON(portBase + hp_stack_data);
143962306a36Sopenharmony_ci}
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_cistatic void FPT_WrStack(u32 portBase, unsigned char index, unsigned char data)
144262306a36Sopenharmony_ci{
144362306a36Sopenharmony_ci	WR_HARPOON(portBase + hp_stack_addr, index);
144462306a36Sopenharmony_ci	WR_HARPOON(portBase + hp_stack_data, data);
144562306a36Sopenharmony_ci}
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_cistatic unsigned char FPT_ChkIfChipInitialized(u32 ioPort)
144862306a36Sopenharmony_ci{
144962306a36Sopenharmony_ci	if ((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4))
145062306a36Sopenharmony_ci		return 0;
145162306a36Sopenharmony_ci	if ((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
145262306a36Sopenharmony_ci	    != CLKCTRL_DEFAULT)
145362306a36Sopenharmony_ci		return 0;
145462306a36Sopenharmony_ci	if ((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
145562306a36Sopenharmony_ci	    (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
145662306a36Sopenharmony_ci		return 1;
145762306a36Sopenharmony_ci	return 0;
145862306a36Sopenharmony_ci
145962306a36Sopenharmony_ci}
146062306a36Sopenharmony_ci
146162306a36Sopenharmony_ci/*---------------------------------------------------------------------
146262306a36Sopenharmony_ci *
146362306a36Sopenharmony_ci * Function: FlashPoint_StartCCB
146462306a36Sopenharmony_ci *
146562306a36Sopenharmony_ci * Description: Start a command pointed to by p_Sccb. When the
146662306a36Sopenharmony_ci *              command is completed it will be returned via the
146762306a36Sopenharmony_ci *              callback function.
146862306a36Sopenharmony_ci *
146962306a36Sopenharmony_ci *---------------------------------------------------------------------*/
147062306a36Sopenharmony_cistatic void FlashPoint_StartCCB(void *curr_card, struct sccb *p_Sccb)
147162306a36Sopenharmony_ci{
147262306a36Sopenharmony_ci	u32 ioport;
147362306a36Sopenharmony_ci	unsigned char thisCard, lun;
147462306a36Sopenharmony_ci	struct sccb *pSaveSccb;
147562306a36Sopenharmony_ci	CALL_BK_FN callback;
147662306a36Sopenharmony_ci	struct sccb_card *pCurrCard = curr_card;
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ci	thisCard = pCurrCard->cardIndex;
147962306a36Sopenharmony_ci	ioport = pCurrCard->ioPort;
148062306a36Sopenharmony_ci
148162306a36Sopenharmony_ci	if ((p_Sccb->TargID >= MAX_SCSI_TAR) || (p_Sccb->Lun >= MAX_LUN)) {
148262306a36Sopenharmony_ci
148362306a36Sopenharmony_ci		p_Sccb->HostStatus = SCCB_COMPLETE;
148462306a36Sopenharmony_ci		p_Sccb->SccbStatus = SCCB_ERROR;
148562306a36Sopenharmony_ci		callback = (CALL_BK_FN) p_Sccb->SccbCallback;
148662306a36Sopenharmony_ci		if (callback)
148762306a36Sopenharmony_ci			callback(p_Sccb);
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci		return;
149062306a36Sopenharmony_ci	}
149162306a36Sopenharmony_ci
149262306a36Sopenharmony_ci	FPT_sinits(p_Sccb, thisCard);
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci	if (!pCurrCard->cmdCounter) {
149562306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_semaphore,
149662306a36Sopenharmony_ci			   (RD_HARPOON(ioport + hp_semaphore)
149762306a36Sopenharmony_ci			    | SCCB_MGR_ACTIVE));
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci		if (pCurrCard->globalFlags & F_GREEN_PC) {
150062306a36Sopenharmony_ci			WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
150162306a36Sopenharmony_ci			WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
150262306a36Sopenharmony_ci		}
150362306a36Sopenharmony_ci	}
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ci	pCurrCard->cmdCounter++;
150662306a36Sopenharmony_ci
150762306a36Sopenharmony_ci	if (RD_HARPOON(ioport + hp_semaphore) & BIOS_IN_USE) {
150862306a36Sopenharmony_ci
150962306a36Sopenharmony_ci		WR_HARPOON(ioport + hp_semaphore,
151062306a36Sopenharmony_ci			   (RD_HARPOON(ioport + hp_semaphore)
151162306a36Sopenharmony_ci			    | TICKLE_ME));
151262306a36Sopenharmony_ci		if (p_Sccb->OperationCode == RESET_COMMAND) {
151362306a36Sopenharmony_ci			pSaveSccb =
151462306a36Sopenharmony_ci			    pCurrCard->currentSCCB;
151562306a36Sopenharmony_ci			pCurrCard->currentSCCB = p_Sccb;
151662306a36Sopenharmony_ci			FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
151762306a36Sopenharmony_ci			pCurrCard->currentSCCB =
151862306a36Sopenharmony_ci			    pSaveSccb;
151962306a36Sopenharmony_ci		} else {
152062306a36Sopenharmony_ci			FPT_queueAddSccb(p_Sccb, thisCard);
152162306a36Sopenharmony_ci		}
152262306a36Sopenharmony_ci	}
152362306a36Sopenharmony_ci
152462306a36Sopenharmony_ci	else if ((RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
152562306a36Sopenharmony_ci
152662306a36Sopenharmony_ci		if (p_Sccb->OperationCode == RESET_COMMAND) {
152762306a36Sopenharmony_ci			pSaveSccb =
152862306a36Sopenharmony_ci			    pCurrCard->currentSCCB;
152962306a36Sopenharmony_ci			pCurrCard->currentSCCB = p_Sccb;
153062306a36Sopenharmony_ci			FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
153162306a36Sopenharmony_ci			pCurrCard->currentSCCB =
153262306a36Sopenharmony_ci			    pSaveSccb;
153362306a36Sopenharmony_ci		} else {
153462306a36Sopenharmony_ci			FPT_queueAddSccb(p_Sccb, thisCard);
153562306a36Sopenharmony_ci		}
153662306a36Sopenharmony_ci	}
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci	else {
153962306a36Sopenharmony_ci
154062306a36Sopenharmony_ci		MDISABLE_INT(ioport);
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci		if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
154362306a36Sopenharmony_ci		    ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].
154462306a36Sopenharmony_ci		      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
154562306a36Sopenharmony_ci			lun = p_Sccb->Lun;
154662306a36Sopenharmony_ci		else
154762306a36Sopenharmony_ci			lun = 0;
154862306a36Sopenharmony_ci		if ((pCurrCard->currentSCCB == NULL) &&
154962306a36Sopenharmony_ci		    (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0)
155062306a36Sopenharmony_ci		    && (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
155162306a36Sopenharmony_ci			== 0)) {
155262306a36Sopenharmony_ci
155362306a36Sopenharmony_ci			pCurrCard->currentSCCB = p_Sccb;
155462306a36Sopenharmony_ci			FPT_ssel(p_Sccb->SccbIOPort, thisCard);
155562306a36Sopenharmony_ci		}
155662306a36Sopenharmony_ci
155762306a36Sopenharmony_ci		else {
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci			if (p_Sccb->OperationCode == RESET_COMMAND) {
156062306a36Sopenharmony_ci				pSaveSccb = pCurrCard->currentSCCB;
156162306a36Sopenharmony_ci				pCurrCard->currentSCCB = p_Sccb;
156262306a36Sopenharmony_ci				FPT_queueSelectFail(&FPT_BL_Card[thisCard],
156362306a36Sopenharmony_ci						    thisCard);
156462306a36Sopenharmony_ci				pCurrCard->currentSCCB = pSaveSccb;
156562306a36Sopenharmony_ci			} else {
156662306a36Sopenharmony_ci				FPT_queueAddSccb(p_Sccb, thisCard);
156762306a36Sopenharmony_ci			}
156862306a36Sopenharmony_ci		}
156962306a36Sopenharmony_ci
157062306a36Sopenharmony_ci		MENABLE_INT(ioport);
157162306a36Sopenharmony_ci	}
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_ci}
157462306a36Sopenharmony_ci
157562306a36Sopenharmony_ci/*---------------------------------------------------------------------
157662306a36Sopenharmony_ci *
157762306a36Sopenharmony_ci * Function: FlashPoint_AbortCCB
157862306a36Sopenharmony_ci *
157962306a36Sopenharmony_ci * Description: Abort the command pointed to by p_Sccb.  When the
158062306a36Sopenharmony_ci *              command is completed it will be returned via the
158162306a36Sopenharmony_ci *              callback function.
158262306a36Sopenharmony_ci *
158362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
158462306a36Sopenharmony_cistatic int FlashPoint_AbortCCB(void *pCurrCard, struct sccb *p_Sccb)
158562306a36Sopenharmony_ci{
158662306a36Sopenharmony_ci	u32 ioport;
158762306a36Sopenharmony_ci
158862306a36Sopenharmony_ci	unsigned char thisCard;
158962306a36Sopenharmony_ci	CALL_BK_FN callback;
159062306a36Sopenharmony_ci	struct sccb *pSaveSCCB;
159162306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
159262306a36Sopenharmony_ci
159362306a36Sopenharmony_ci	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_ci	thisCard = ((struct sccb_card *)pCurrCard)->cardIndex;
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_ci	if (!(RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci		if (FPT_queueFindSccb(p_Sccb, thisCard)) {
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_ci			((struct sccb_card *)pCurrCard)->cmdCounter--;
160262306a36Sopenharmony_ci
160362306a36Sopenharmony_ci			if (!((struct sccb_card *)pCurrCard)->cmdCounter)
160462306a36Sopenharmony_ci				WR_HARPOON(ioport + hp_semaphore,
160562306a36Sopenharmony_ci					   (RD_HARPOON(ioport + hp_semaphore)
160662306a36Sopenharmony_ci					    & (unsigned
160762306a36Sopenharmony_ci					       char)(~(SCCB_MGR_ACTIVE |
160862306a36Sopenharmony_ci						       TICKLE_ME))));
160962306a36Sopenharmony_ci
161062306a36Sopenharmony_ci			p_Sccb->SccbStatus = SCCB_ABORT;
161162306a36Sopenharmony_ci			callback = p_Sccb->SccbCallback;
161262306a36Sopenharmony_ci			callback(p_Sccb);
161362306a36Sopenharmony_ci
161462306a36Sopenharmony_ci			return 0;
161562306a36Sopenharmony_ci		}
161662306a36Sopenharmony_ci
161762306a36Sopenharmony_ci		else {
161862306a36Sopenharmony_ci			if (((struct sccb_card *)pCurrCard)->currentSCCB ==
161962306a36Sopenharmony_ci			    p_Sccb) {
162062306a36Sopenharmony_ci				p_Sccb->SccbStatus = SCCB_ABORT;
162162306a36Sopenharmony_ci				return 0;
162262306a36Sopenharmony_ci
162362306a36Sopenharmony_ci			}
162462306a36Sopenharmony_ci
162562306a36Sopenharmony_ci			else {
162662306a36Sopenharmony_ci				if (p_Sccb->Sccb_tag) {
162762306a36Sopenharmony_ci					MDISABLE_INT(ioport);
162862306a36Sopenharmony_ci					if (((struct sccb_card *)pCurrCard)->
162962306a36Sopenharmony_ci					    discQ_Tbl[p_Sccb->Sccb_tag] ==
163062306a36Sopenharmony_ci					    p_Sccb) {
163162306a36Sopenharmony_ci						p_Sccb->SccbStatus = SCCB_ABORT;
163262306a36Sopenharmony_ci						p_Sccb->Sccb_scsistat =
163362306a36Sopenharmony_ci						    ABORT_ST;
163462306a36Sopenharmony_ci						p_Sccb->Sccb_scsimsg =
163562306a36Sopenharmony_ci						    ABORT_TASK;
163662306a36Sopenharmony_ci
163762306a36Sopenharmony_ci						if (((struct sccb_card *)
163862306a36Sopenharmony_ci						     pCurrCard)->currentSCCB ==
163962306a36Sopenharmony_ci						    NULL) {
164062306a36Sopenharmony_ci							((struct sccb_card *)
164162306a36Sopenharmony_ci							 pCurrCard)->
164262306a36Sopenharmony_ci					currentSCCB = p_Sccb;
164362306a36Sopenharmony_ci							FPT_ssel(ioport,
164462306a36Sopenharmony_ci								 thisCard);
164562306a36Sopenharmony_ci						} else {
164662306a36Sopenharmony_ci							pSaveSCCB =
164762306a36Sopenharmony_ci							    ((struct sccb_card
164862306a36Sopenharmony_ci							      *)pCurrCard)->
164962306a36Sopenharmony_ci							    currentSCCB;
165062306a36Sopenharmony_ci							((struct sccb_card *)
165162306a36Sopenharmony_ci							 pCurrCard)->
165262306a36Sopenharmony_ci					currentSCCB = p_Sccb;
165362306a36Sopenharmony_ci							FPT_queueSelectFail((struct sccb_card *)pCurrCard, thisCard);
165462306a36Sopenharmony_ci							((struct sccb_card *)
165562306a36Sopenharmony_ci							 pCurrCard)->
165662306a36Sopenharmony_ci					currentSCCB = pSaveSCCB;
165762306a36Sopenharmony_ci						}
165862306a36Sopenharmony_ci					}
165962306a36Sopenharmony_ci					MENABLE_INT(ioport);
166062306a36Sopenharmony_ci					return 0;
166162306a36Sopenharmony_ci				} else {
166262306a36Sopenharmony_ci					currTar_Info =
166362306a36Sopenharmony_ci					    &FPT_sccbMgrTbl[thisCard][p_Sccb->
166462306a36Sopenharmony_ci								      TargID];
166562306a36Sopenharmony_ci
166662306a36Sopenharmony_ci					if (FPT_BL_Card[thisCard].
166762306a36Sopenharmony_ci					    discQ_Tbl[currTar_Info->
166862306a36Sopenharmony_ci						      LunDiscQ_Idx[p_Sccb->Lun]]
166962306a36Sopenharmony_ci					    == p_Sccb) {
167062306a36Sopenharmony_ci						p_Sccb->SccbStatus = SCCB_ABORT;
167162306a36Sopenharmony_ci						return 0;
167262306a36Sopenharmony_ci					}
167362306a36Sopenharmony_ci				}
167462306a36Sopenharmony_ci			}
167562306a36Sopenharmony_ci		}
167662306a36Sopenharmony_ci	}
167762306a36Sopenharmony_ci	return -1;
167862306a36Sopenharmony_ci}
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci/*---------------------------------------------------------------------
168162306a36Sopenharmony_ci *
168262306a36Sopenharmony_ci * Function: FlashPoint_InterruptPending
168362306a36Sopenharmony_ci *
168462306a36Sopenharmony_ci * Description: Do a quick check to determine if there is a pending
168562306a36Sopenharmony_ci *              interrupt for this card and disable the IRQ Pin if so.
168662306a36Sopenharmony_ci *
168762306a36Sopenharmony_ci *---------------------------------------------------------------------*/
168862306a36Sopenharmony_cistatic unsigned char FlashPoint_InterruptPending(void *pCurrCard)
168962306a36Sopenharmony_ci{
169062306a36Sopenharmony_ci	u32 ioport;
169162306a36Sopenharmony_ci
169262306a36Sopenharmony_ci	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
169362306a36Sopenharmony_ci
169462306a36Sopenharmony_ci	if (RD_HARPOON(ioport + hp_int_status) & INT_ASSERTED) {
169562306a36Sopenharmony_ci		return 1;
169662306a36Sopenharmony_ci	}
169762306a36Sopenharmony_ci
169862306a36Sopenharmony_ci	else
169962306a36Sopenharmony_ci
170062306a36Sopenharmony_ci		return 0;
170162306a36Sopenharmony_ci}
170262306a36Sopenharmony_ci
170362306a36Sopenharmony_ci/*---------------------------------------------------------------------
170462306a36Sopenharmony_ci *
170562306a36Sopenharmony_ci * Function: FlashPoint_HandleInterrupt
170662306a36Sopenharmony_ci *
170762306a36Sopenharmony_ci * Description: This is our entry point when an interrupt is generated
170862306a36Sopenharmony_ci *              by the card and the upper level driver passes it on to
170962306a36Sopenharmony_ci *              us.
171062306a36Sopenharmony_ci *
171162306a36Sopenharmony_ci *---------------------------------------------------------------------*/
171262306a36Sopenharmony_cistatic int FlashPoint_HandleInterrupt(void *pcard)
171362306a36Sopenharmony_ci{
171462306a36Sopenharmony_ci	struct sccb *currSCCB;
171562306a36Sopenharmony_ci	unsigned char thisCard, result, bm_status;
171662306a36Sopenharmony_ci	unsigned short hp_int;
171762306a36Sopenharmony_ci	unsigned char i, target;
171862306a36Sopenharmony_ci	struct sccb_card *pCurrCard = pcard;
171962306a36Sopenharmony_ci	u32 ioport;
172062306a36Sopenharmony_ci
172162306a36Sopenharmony_ci	thisCard = pCurrCard->cardIndex;
172262306a36Sopenharmony_ci	ioport = pCurrCard->ioPort;
172362306a36Sopenharmony_ci
172462306a36Sopenharmony_ci	MDISABLE_INT(ioport);
172562306a36Sopenharmony_ci
172662306a36Sopenharmony_ci	if (RD_HARPOON(ioport + hp_int_status) & EXT_STATUS_ON)
172762306a36Sopenharmony_ci		bm_status = RD_HARPOON(ioport + hp_ext_status) &
172862306a36Sopenharmony_ci					(unsigned char)BAD_EXT_STATUS;
172962306a36Sopenharmony_ci	else
173062306a36Sopenharmony_ci		bm_status = 0;
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ci	WR_HARPOON(ioport + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
173362306a36Sopenharmony_ci
173462306a36Sopenharmony_ci	while ((hp_int = RDW_HARPOON((ioport + hp_intstat)) &
173562306a36Sopenharmony_ci				FPT_default_intena) | bm_status) {
173662306a36Sopenharmony_ci
173762306a36Sopenharmony_ci		currSCCB = pCurrCard->currentSCCB;
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_ci		if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
174062306a36Sopenharmony_ci			result =
174162306a36Sopenharmony_ci			    FPT_SccbMgr_bad_isr(ioport, thisCard, pCurrCard,
174262306a36Sopenharmony_ci						hp_int);
174362306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
174462306a36Sopenharmony_ci				    (FIFO | TIMEOUT | RESET | SCAM_SEL));
174562306a36Sopenharmony_ci			bm_status = 0;
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_ci			if (result) {
174862306a36Sopenharmony_ci
174962306a36Sopenharmony_ci				MENABLE_INT(ioport);
175062306a36Sopenharmony_ci				return result;
175162306a36Sopenharmony_ci			}
175262306a36Sopenharmony_ci		}
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_ci		else if (hp_int & ICMD_COMP) {
175562306a36Sopenharmony_ci
175662306a36Sopenharmony_ci			if (!(hp_int & BUS_FREE)) {
175762306a36Sopenharmony_ci				/* Wait for the BusFree before starting a new command.  We
175862306a36Sopenharmony_ci				   must also check for being reselected since the BusFree
175962306a36Sopenharmony_ci				   may not show up if another device reselects us in 1.5us or
176062306a36Sopenharmony_ci				   less.  SRR Wednesday, 3/8/1995.
176162306a36Sopenharmony_ci				 */
176262306a36Sopenharmony_ci				while (!
176362306a36Sopenharmony_ci				       (RDW_HARPOON((ioport + hp_intstat)) &
176462306a36Sopenharmony_ci					(BUS_FREE | RSEL))) ;
176562306a36Sopenharmony_ci			}
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
176862306a36Sopenharmony_ci
176962306a36Sopenharmony_ci				FPT_phaseChkFifo(ioport, thisCard);
177062306a36Sopenharmony_ci
177162306a36Sopenharmony_ci/*         WRW_HARPOON((ioport+hp_intstat),
177262306a36Sopenharmony_ci            (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
177362306a36Sopenharmony_ci         */
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), CLR_ALL_INT_1);
177662306a36Sopenharmony_ci
177762306a36Sopenharmony_ci			FPT_autoCmdCmplt(ioport, thisCard);
177862306a36Sopenharmony_ci
177962306a36Sopenharmony_ci		}
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ci		else if (hp_int & ITAR_DISC) {
178262306a36Sopenharmony_ci
178362306a36Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
178462306a36Sopenharmony_ci				FPT_phaseChkFifo(ioport, thisCard);
178562306a36Sopenharmony_ci
178662306a36Sopenharmony_ci			if (RD_HARPOON(ioport + hp_gp_reg_1) ==
178762306a36Sopenharmony_ci					SAVE_POINTERS) {
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci				WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
179062306a36Sopenharmony_ci				currSCCB->Sccb_XferState |= F_NO_DATA_YET;
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_ci				currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
179362306a36Sopenharmony_ci			}
179462306a36Sopenharmony_ci
179562306a36Sopenharmony_ci			currSCCB->Sccb_scsistat = DISCONNECT_ST;
179662306a36Sopenharmony_ci			FPT_queueDisconnect(currSCCB, thisCard);
179762306a36Sopenharmony_ci
179862306a36Sopenharmony_ci			/* Wait for the BusFree before starting a new command.  We
179962306a36Sopenharmony_ci			   must also check for being reselected since the BusFree
180062306a36Sopenharmony_ci			   may not show up if another device reselects us in 1.5us or
180162306a36Sopenharmony_ci			   less.  SRR Wednesday, 3/8/1995.
180262306a36Sopenharmony_ci			 */
180362306a36Sopenharmony_ci			while (!
180462306a36Sopenharmony_ci			       (RDW_HARPOON((ioport + hp_intstat)) &
180562306a36Sopenharmony_ci				(BUS_FREE | RSEL))
180662306a36Sopenharmony_ci			       && !((RDW_HARPOON((ioport + hp_intstat)) & PHASE)
180762306a36Sopenharmony_ci				    && RD_HARPOON((ioport + hp_scsisig)) ==
180862306a36Sopenharmony_ci				    (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG |
180962306a36Sopenharmony_ci				     SCSI_IOBIT))) ;
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci			/*
181262306a36Sopenharmony_ci			   The additional loop exit condition above detects a timing problem
181362306a36Sopenharmony_ci			   with the revision D/E harpoon chips.  The caller should reset the
181462306a36Sopenharmony_ci			   host adapter to recover when 0xFE is returned.
181562306a36Sopenharmony_ci			 */
181662306a36Sopenharmony_ci			if (!
181762306a36Sopenharmony_ci			    (RDW_HARPOON((ioport + hp_intstat)) &
181862306a36Sopenharmony_ci			     (BUS_FREE | RSEL))) {
181962306a36Sopenharmony_ci				MENABLE_INT(ioport);
182062306a36Sopenharmony_ci				return 0xFE;
182162306a36Sopenharmony_ci			}
182262306a36Sopenharmony_ci
182362306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
182462306a36Sopenharmony_ci				    (BUS_FREE | ITAR_DISC));
182562306a36Sopenharmony_ci
182662306a36Sopenharmony_ci			pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
182762306a36Sopenharmony_ci
182862306a36Sopenharmony_ci		}
182962306a36Sopenharmony_ci
183062306a36Sopenharmony_ci		else if (hp_int & RSEL) {
183162306a36Sopenharmony_ci
183262306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
183362306a36Sopenharmony_ci				    (PROG_HLT | RSEL | PHASE | BUS_FREE));
183462306a36Sopenharmony_ci
183562306a36Sopenharmony_ci			if (RDW_HARPOON((ioport + hp_intstat)) & ITAR_DISC) {
183662306a36Sopenharmony_ci				if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
183762306a36Sopenharmony_ci					FPT_phaseChkFifo(ioport, thisCard);
183862306a36Sopenharmony_ci
183962306a36Sopenharmony_ci				if (RD_HARPOON(ioport + hp_gp_reg_1) ==
184062306a36Sopenharmony_ci				    SAVE_POINTERS) {
184162306a36Sopenharmony_ci					WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
184262306a36Sopenharmony_ci					currSCCB->Sccb_XferState |=
184362306a36Sopenharmony_ci					    F_NO_DATA_YET;
184462306a36Sopenharmony_ci					currSCCB->Sccb_savedATC =
184562306a36Sopenharmony_ci					    currSCCB->Sccb_ATC;
184662306a36Sopenharmony_ci				}
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_ci				WRW_HARPOON((ioport + hp_intstat),
184962306a36Sopenharmony_ci					    (BUS_FREE | ITAR_DISC));
185062306a36Sopenharmony_ci				currSCCB->Sccb_scsistat = DISCONNECT_ST;
185162306a36Sopenharmony_ci				FPT_queueDisconnect(currSCCB, thisCard);
185262306a36Sopenharmony_ci			}
185362306a36Sopenharmony_ci
185462306a36Sopenharmony_ci			FPT_sres(ioport, thisCard, pCurrCard);
185562306a36Sopenharmony_ci			FPT_phaseDecode(ioport, thisCard);
185662306a36Sopenharmony_ci
185762306a36Sopenharmony_ci		}
185862306a36Sopenharmony_ci
185962306a36Sopenharmony_ci		else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE))) {
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
186262306a36Sopenharmony_ci				    (IDO_STRT | XFER_CNT_0));
186362306a36Sopenharmony_ci			FPT_phaseDecode(ioport, thisCard);
186462306a36Sopenharmony_ci
186562306a36Sopenharmony_ci		}
186662306a36Sopenharmony_ci
186762306a36Sopenharmony_ci		else if ((hp_int & IUNKWN) || (hp_int & PROG_HLT)) {
186862306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat),
186962306a36Sopenharmony_ci				    (PHASE | IUNKWN | PROG_HLT));
187062306a36Sopenharmony_ci			if ((RD_HARPOON(ioport + hp_prgmcnt_0) & (unsigned char)
187162306a36Sopenharmony_ci			     0x3f) < (unsigned char)SELCHK) {
187262306a36Sopenharmony_ci				FPT_phaseDecode(ioport, thisCard);
187362306a36Sopenharmony_ci			} else {
187462306a36Sopenharmony_ci				/* Harpoon problem some SCSI target device respond to selection
187562306a36Sopenharmony_ci				   with short BUSY pulse (<400ns) this will make the Harpoon is not able
187662306a36Sopenharmony_ci				   to latch the correct Target ID into reg. x53.
187762306a36Sopenharmony_ci				   The work around require to correct this reg. But when write to this
187862306a36Sopenharmony_ci				   reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
187962306a36Sopenharmony_ci				   need to read this reg first then restore it later. After update to 0x53 */
188062306a36Sopenharmony_ci
188162306a36Sopenharmony_ci				i = (unsigned
188262306a36Sopenharmony_ci				     char)(RD_HARPOON(ioport + hp_fifowrite));
188362306a36Sopenharmony_ci				target =
188462306a36Sopenharmony_ci				    (unsigned
188562306a36Sopenharmony_ci				     char)(RD_HARPOON(ioport + hp_gp_reg_3));
188662306a36Sopenharmony_ci				WR_HARPOON(ioport + hp_xfer_pad,
188762306a36Sopenharmony_ci					   (unsigned char)ID_UNLOCK);
188862306a36Sopenharmony_ci				WR_HARPOON(ioport + hp_select_id,
188962306a36Sopenharmony_ci					   (unsigned char)(target | target <<
189062306a36Sopenharmony_ci							   4));
189162306a36Sopenharmony_ci				WR_HARPOON(ioport + hp_xfer_pad,
189262306a36Sopenharmony_ci					   (unsigned char)0x00);
189362306a36Sopenharmony_ci				WR_HARPOON(ioport + hp_fifowrite, i);
189462306a36Sopenharmony_ci				WR_HARPOON(ioport + hp_autostart_3,
189562306a36Sopenharmony_ci					   (AUTO_IMMED + TAG_STRT));
189662306a36Sopenharmony_ci			}
189762306a36Sopenharmony_ci		}
189862306a36Sopenharmony_ci
189962306a36Sopenharmony_ci		else if (hp_int & XFER_CNT_0) {
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), XFER_CNT_0);
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci			FPT_schkdd(ioport, thisCard);
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_ci		}
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_ci		else if (hp_int & BUS_FREE) {
190862306a36Sopenharmony_ci
190962306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), BUS_FREE);
191062306a36Sopenharmony_ci
191162306a36Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci				FPT_hostDataXferAbort(ioport, thisCard,
191462306a36Sopenharmony_ci						      currSCCB);
191562306a36Sopenharmony_ci			}
191662306a36Sopenharmony_ci
191762306a36Sopenharmony_ci			FPT_phaseBusFree(ioport, thisCard);
191862306a36Sopenharmony_ci		}
191962306a36Sopenharmony_ci
192062306a36Sopenharmony_ci		else if (hp_int & ITICKLE) {
192162306a36Sopenharmony_ci
192262306a36Sopenharmony_ci			WRW_HARPOON((ioport + hp_intstat), ITICKLE);
192362306a36Sopenharmony_ci			pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
192462306a36Sopenharmony_ci		}
192562306a36Sopenharmony_ci
192662306a36Sopenharmony_ci		if (((struct sccb_card *)pCurrCard)->
192762306a36Sopenharmony_ci		    globalFlags & F_NEW_SCCB_CMD) {
192862306a36Sopenharmony_ci
192962306a36Sopenharmony_ci			pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
193062306a36Sopenharmony_ci
193162306a36Sopenharmony_ci			if (pCurrCard->currentSCCB == NULL)
193262306a36Sopenharmony_ci				FPT_queueSearchSelect(pCurrCard, thisCard);
193362306a36Sopenharmony_ci
193462306a36Sopenharmony_ci			if (pCurrCard->currentSCCB != NULL) {
193562306a36Sopenharmony_ci				pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
193662306a36Sopenharmony_ci				FPT_ssel(ioport, thisCard);
193762306a36Sopenharmony_ci			}
193862306a36Sopenharmony_ci
193962306a36Sopenharmony_ci			break;
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_ci		}
194262306a36Sopenharmony_ci
194362306a36Sopenharmony_ci	}			/*end while */
194462306a36Sopenharmony_ci
194562306a36Sopenharmony_ci	MENABLE_INT(ioport);
194662306a36Sopenharmony_ci
194762306a36Sopenharmony_ci	return 0;
194862306a36Sopenharmony_ci}
194962306a36Sopenharmony_ci
195062306a36Sopenharmony_ci/*---------------------------------------------------------------------
195162306a36Sopenharmony_ci *
195262306a36Sopenharmony_ci * Function: Sccb_bad_isr
195362306a36Sopenharmony_ci *
195462306a36Sopenharmony_ci * Description: Some type of interrupt has occurred which is slightly
195562306a36Sopenharmony_ci *              out of the ordinary.  We will now decode it fully, in
195662306a36Sopenharmony_ci *              this routine.  This is broken up in an attempt to save
195762306a36Sopenharmony_ci *              processing time.
195862306a36Sopenharmony_ci *
195962306a36Sopenharmony_ci *---------------------------------------------------------------------*/
196062306a36Sopenharmony_cistatic unsigned char FPT_SccbMgr_bad_isr(u32 p_port, unsigned char p_card,
196162306a36Sopenharmony_ci					 struct sccb_card *pCurrCard,
196262306a36Sopenharmony_ci					 unsigned short p_int)
196362306a36Sopenharmony_ci{
196462306a36Sopenharmony_ci	unsigned char temp, ScamFlg;
196562306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
196662306a36Sopenharmony_ci	struct nvram_info *pCurrNvRam;
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_ci	if (RD_HARPOON(p_port + hp_ext_status) &
196962306a36Sopenharmony_ci	    (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN)) {
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_ci		if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_ci			FPT_hostDataXferAbort(p_port, p_card,
197462306a36Sopenharmony_ci					      pCurrCard->currentSCCB);
197562306a36Sopenharmony_ci		}
197662306a36Sopenharmony_ci
197762306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_pci_stat_cfg) & REC_MASTER_ABORT)
197862306a36Sopenharmony_ci		{
197962306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_pci_stat_cfg,
198062306a36Sopenharmony_ci				   (RD_HARPOON(p_port + hp_pci_stat_cfg) &
198162306a36Sopenharmony_ci				    ~REC_MASTER_ABORT));
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_host_blk_cnt, 0x00);
198462306a36Sopenharmony_ci
198562306a36Sopenharmony_ci		}
198662306a36Sopenharmony_ci
198762306a36Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL) {
198862306a36Sopenharmony_ci
198962306a36Sopenharmony_ci			if (!pCurrCard->currentSCCB->HostStatus)
199062306a36Sopenharmony_ci				pCurrCard->currentSCCB->HostStatus =
199162306a36Sopenharmony_ci				    SCCB_BM_ERR;
199262306a36Sopenharmony_ci
199362306a36Sopenharmony_ci			FPT_sxfrp(p_port, p_card);
199462306a36Sopenharmony_ci
199562306a36Sopenharmony_ci			temp = (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
199662306a36Sopenharmony_ci					       (EXT_ARB_ACK | SCSI_TERM_ENA_H));
199762306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_ee_ctrl,
199862306a36Sopenharmony_ci				   ((unsigned char)temp | SEE_MS | SEE_CS));
199962306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_ee_ctrl, temp);
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci			if (!
200262306a36Sopenharmony_ci			    (RDW_HARPOON((p_port + hp_intstat)) &
200362306a36Sopenharmony_ci			     (BUS_FREE | RESET))) {
200462306a36Sopenharmony_ci				FPT_phaseDecode(p_port, p_card);
200562306a36Sopenharmony_ci			}
200662306a36Sopenharmony_ci		}
200762306a36Sopenharmony_ci	}
200862306a36Sopenharmony_ci
200962306a36Sopenharmony_ci	else if (p_int & RESET) {
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
201262306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
201362306a36Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL) {
201462306a36Sopenharmony_ci
201562306a36Sopenharmony_ci			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
201662306a36Sopenharmony_ci
201762306a36Sopenharmony_ci				FPT_hostDataXferAbort(p_port, p_card,
201862306a36Sopenharmony_ci						      pCurrCard->currentSCCB);
201962306a36Sopenharmony_ci		}
202062306a36Sopenharmony_ci
202162306a36Sopenharmony_ci		DISABLE_AUTO(p_port);
202262306a36Sopenharmony_ci
202362306a36Sopenharmony_ci		FPT_sresb(p_port, p_card);
202462306a36Sopenharmony_ci
202562306a36Sopenharmony_ci		while (RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST) {
202662306a36Sopenharmony_ci		}
202762306a36Sopenharmony_ci
202862306a36Sopenharmony_ci		pCurrNvRam = pCurrCard->pNvRamInfo;
202962306a36Sopenharmony_ci		if (pCurrNvRam) {
203062306a36Sopenharmony_ci			ScamFlg = pCurrNvRam->niScamConf;
203162306a36Sopenharmony_ci		} else {
203262306a36Sopenharmony_ci			ScamFlg =
203362306a36Sopenharmony_ci			    (unsigned char)FPT_utilEERead(p_port,
203462306a36Sopenharmony_ci							  SCAM_CONFIG / 2);
203562306a36Sopenharmony_ci		}
203662306a36Sopenharmony_ci
203762306a36Sopenharmony_ci		FPT_XbowInit(p_port, ScamFlg);
203862306a36Sopenharmony_ci
203962306a36Sopenharmony_ci		FPT_scini(p_card, pCurrCard->ourId, 0);
204062306a36Sopenharmony_ci
204162306a36Sopenharmony_ci		return 0xFF;
204262306a36Sopenharmony_ci	}
204362306a36Sopenharmony_ci
204462306a36Sopenharmony_ci	else if (p_int & FIFO) {
204562306a36Sopenharmony_ci
204662306a36Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat), FIFO);
204762306a36Sopenharmony_ci
204862306a36Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL)
204962306a36Sopenharmony_ci			FPT_sxfrp(p_port, p_card);
205062306a36Sopenharmony_ci	}
205162306a36Sopenharmony_ci
205262306a36Sopenharmony_ci	else if (p_int & TIMEOUT) {
205362306a36Sopenharmony_ci
205462306a36Sopenharmony_ci		DISABLE_AUTO(p_port);
205562306a36Sopenharmony_ci
205662306a36Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat),
205762306a36Sopenharmony_ci			    (PROG_HLT | TIMEOUT | SEL | BUS_FREE | PHASE |
205862306a36Sopenharmony_ci			     IUNKWN));
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_ci		pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
206162306a36Sopenharmony_ci
206262306a36Sopenharmony_ci		currTar_Info =
206362306a36Sopenharmony_ci		    &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
206462306a36Sopenharmony_ci		if ((pCurrCard->globalFlags & F_CONLUN_IO)
206562306a36Sopenharmony_ci		    && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
206662306a36Sopenharmony_ci			TAG_Q_TRYING))
206762306a36Sopenharmony_ci			currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] =
206862306a36Sopenharmony_ci			    0;
206962306a36Sopenharmony_ci		else
207062306a36Sopenharmony_ci			currTar_Info->TarLUNBusy[0] = 0;
207162306a36Sopenharmony_ci
207262306a36Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
207362306a36Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
207462306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
207562306a36Sopenharmony_ci		}
207662306a36Sopenharmony_ci
207762306a36Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
207862306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
207962306a36Sopenharmony_ci		}
208062306a36Sopenharmony_ci
208162306a36Sopenharmony_ci		FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,
208262306a36Sopenharmony_ci			    currTar_Info);
208362306a36Sopenharmony_ci
208462306a36Sopenharmony_ci		FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
208562306a36Sopenharmony_ci
208662306a36Sopenharmony_ci	}
208762306a36Sopenharmony_ci
208862306a36Sopenharmony_ci	else if (p_int & SCAM_SEL) {
208962306a36Sopenharmony_ci
209062306a36Sopenharmony_ci		FPT_scarb(p_port, LEVEL2_TAR);
209162306a36Sopenharmony_ci		FPT_scsel(p_port);
209262306a36Sopenharmony_ci		FPT_scasid(p_card, p_port);
209362306a36Sopenharmony_ci
209462306a36Sopenharmony_ci		FPT_scbusf(p_port);
209562306a36Sopenharmony_ci
209662306a36Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat), SCAM_SEL);
209762306a36Sopenharmony_ci	}
209862306a36Sopenharmony_ci
209962306a36Sopenharmony_ci	return 0x00;
210062306a36Sopenharmony_ci}
210162306a36Sopenharmony_ci
210262306a36Sopenharmony_ci/*---------------------------------------------------------------------
210362306a36Sopenharmony_ci *
210462306a36Sopenharmony_ci * Function: SccbMgrTableInit
210562306a36Sopenharmony_ci *
210662306a36Sopenharmony_ci * Description: Initialize all Sccb manager data structures.
210762306a36Sopenharmony_ci *
210862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
210962306a36Sopenharmony_ci
211062306a36Sopenharmony_cistatic void FPT_SccbMgrTableInitAll(void)
211162306a36Sopenharmony_ci{
211262306a36Sopenharmony_ci	unsigned char thisCard;
211362306a36Sopenharmony_ci
211462306a36Sopenharmony_ci	for (thisCard = 0; thisCard < MAX_CARDS; thisCard++) {
211562306a36Sopenharmony_ci		FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard], thisCard);
211662306a36Sopenharmony_ci
211762306a36Sopenharmony_ci		FPT_BL_Card[thisCard].ioPort = 0x00;
211862306a36Sopenharmony_ci		FPT_BL_Card[thisCard].cardInfo = NULL;
211962306a36Sopenharmony_ci		FPT_BL_Card[thisCard].cardIndex = 0xFF;
212062306a36Sopenharmony_ci		FPT_BL_Card[thisCard].ourId = 0x00;
212162306a36Sopenharmony_ci		FPT_BL_Card[thisCard].pNvRamInfo = NULL;
212262306a36Sopenharmony_ci	}
212362306a36Sopenharmony_ci}
212462306a36Sopenharmony_ci
212562306a36Sopenharmony_ci/*---------------------------------------------------------------------
212662306a36Sopenharmony_ci *
212762306a36Sopenharmony_ci * Function: SccbMgrTableInit
212862306a36Sopenharmony_ci *
212962306a36Sopenharmony_ci * Description: Initialize all Sccb manager data structures.
213062306a36Sopenharmony_ci *
213162306a36Sopenharmony_ci *---------------------------------------------------------------------*/
213262306a36Sopenharmony_ci
213362306a36Sopenharmony_cistatic void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
213462306a36Sopenharmony_ci				     unsigned char p_card)
213562306a36Sopenharmony_ci{
213662306a36Sopenharmony_ci	unsigned char scsiID, qtag;
213762306a36Sopenharmony_ci
213862306a36Sopenharmony_ci	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
213962306a36Sopenharmony_ci		FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
214062306a36Sopenharmony_ci	}
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_ci	for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
214362306a36Sopenharmony_ci		FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0;
214462306a36Sopenharmony_ci		FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
214562306a36Sopenharmony_ci		FPT_SccbMgrTableInitTarget(p_card, scsiID);
214662306a36Sopenharmony_ci	}
214762306a36Sopenharmony_ci
214862306a36Sopenharmony_ci	pCurrCard->scanIndex = 0x00;
214962306a36Sopenharmony_ci	pCurrCard->currentSCCB = NULL;
215062306a36Sopenharmony_ci	pCurrCard->globalFlags = 0x00;
215162306a36Sopenharmony_ci	pCurrCard->cmdCounter = 0x00;
215262306a36Sopenharmony_ci	pCurrCard->tagQ_Lst = 0x01;
215362306a36Sopenharmony_ci	pCurrCard->discQCount = 0;
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci}
215662306a36Sopenharmony_ci
215762306a36Sopenharmony_ci/*---------------------------------------------------------------------
215862306a36Sopenharmony_ci *
215962306a36Sopenharmony_ci * Function: SccbMgrTableInit
216062306a36Sopenharmony_ci *
216162306a36Sopenharmony_ci * Description: Initialize all Sccb manager data structures.
216262306a36Sopenharmony_ci *
216362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
216462306a36Sopenharmony_ci
216562306a36Sopenharmony_cistatic void FPT_SccbMgrTableInitTarget(unsigned char p_card,
216662306a36Sopenharmony_ci				       unsigned char target)
216762306a36Sopenharmony_ci{
216862306a36Sopenharmony_ci
216962306a36Sopenharmony_ci	unsigned char lun, qtag;
217062306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
217162306a36Sopenharmony_ci
217262306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][target];
217362306a36Sopenharmony_ci
217462306a36Sopenharmony_ci	currTar_Info->TarSelQ_Cnt = 0;
217562306a36Sopenharmony_ci	currTar_Info->TarSyncCtrl = 0;
217662306a36Sopenharmony_ci
217762306a36Sopenharmony_ci	currTar_Info->TarSelQ_Head = NULL;
217862306a36Sopenharmony_ci	currTar_Info->TarSelQ_Tail = NULL;
217962306a36Sopenharmony_ci	currTar_Info->TarTagQ_Cnt = 0;
218062306a36Sopenharmony_ci	currTar_Info->TarLUN_CA = 0;
218162306a36Sopenharmony_ci
218262306a36Sopenharmony_ci	for (lun = 0; lun < MAX_LUN; lun++) {
218362306a36Sopenharmony_ci		currTar_Info->TarLUNBusy[lun] = 0;
218462306a36Sopenharmony_ci		currTar_Info->LunDiscQ_Idx[lun] = 0;
218562306a36Sopenharmony_ci	}
218662306a36Sopenharmony_ci
218762306a36Sopenharmony_ci	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
218862306a36Sopenharmony_ci		if (FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL) {
218962306a36Sopenharmony_ci			if (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
219062306a36Sopenharmony_ci			    target) {
219162306a36Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
219262306a36Sopenharmony_ci				FPT_BL_Card[p_card].discQCount--;
219362306a36Sopenharmony_ci			}
219462306a36Sopenharmony_ci		}
219562306a36Sopenharmony_ci	}
219662306a36Sopenharmony_ci}
219762306a36Sopenharmony_ci
219862306a36Sopenharmony_ci/*---------------------------------------------------------------------
219962306a36Sopenharmony_ci *
220062306a36Sopenharmony_ci * Function: sfetm
220162306a36Sopenharmony_ci *
220262306a36Sopenharmony_ci * Description: Read in a message byte from the SCSI bus, and check
220362306a36Sopenharmony_ci *              for a parity error.
220462306a36Sopenharmony_ci *
220562306a36Sopenharmony_ci *---------------------------------------------------------------------*/
220662306a36Sopenharmony_ci
220762306a36Sopenharmony_cistatic unsigned char FPT_sfm(u32 port, struct sccb *pCurrSCCB)
220862306a36Sopenharmony_ci{
220962306a36Sopenharmony_ci	unsigned char message;
221062306a36Sopenharmony_ci	unsigned short TimeOutLoop;
221162306a36Sopenharmony_ci
221262306a36Sopenharmony_ci	TimeOutLoop = 0;
221362306a36Sopenharmony_ci	while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
221462306a36Sopenharmony_ci	       (TimeOutLoop++ < 20000)) {
221562306a36Sopenharmony_ci	}
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
221862306a36Sopenharmony_ci
221962306a36Sopenharmony_ci	message = RD_HARPOON(port + hp_scsidata_0);
222062306a36Sopenharmony_ci
222162306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, SCSI_ACK + S_MSGI_PH);
222262306a36Sopenharmony_ci
222362306a36Sopenharmony_ci	if (TimeOutLoop > 20000)
222462306a36Sopenharmony_ci		message = 0x00;	/* force message byte = 0 if Time Out on Req */
222562306a36Sopenharmony_ci
222662306a36Sopenharmony_ci	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
222762306a36Sopenharmony_ci	    (RD_HARPOON(port + hp_addstat) & SCSI_PAR_ERR)) {
222862306a36Sopenharmony_ci		WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
222962306a36Sopenharmony_ci		WR_HARPOON(port + hp_xferstat, 0);
223062306a36Sopenharmony_ci		WR_HARPOON(port + hp_fiforead, 0);
223162306a36Sopenharmony_ci		WR_HARPOON(port + hp_fifowrite, 0);
223262306a36Sopenharmony_ci		if (pCurrSCCB != NULL) {
223362306a36Sopenharmony_ci			pCurrSCCB->Sccb_scsimsg = MSG_PARITY_ERROR;
223462306a36Sopenharmony_ci		}
223562306a36Sopenharmony_ci		message = 0x00;
223662306a36Sopenharmony_ci		do {
223762306a36Sopenharmony_ci			ACCEPT_MSG_ATN(port);
223862306a36Sopenharmony_ci			TimeOutLoop = 0;
223962306a36Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
224062306a36Sopenharmony_ci			       (TimeOutLoop++ < 20000)) {
224162306a36Sopenharmony_ci			}
224262306a36Sopenharmony_ci			if (TimeOutLoop > 20000) {
224362306a36Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PARITY);
224462306a36Sopenharmony_ci				return message;
224562306a36Sopenharmony_ci			}
224662306a36Sopenharmony_ci			if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) !=
224762306a36Sopenharmony_ci			    S_MSGI_PH) {
224862306a36Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PARITY);
224962306a36Sopenharmony_ci				return message;
225062306a36Sopenharmony_ci			}
225162306a36Sopenharmony_ci			WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
225262306a36Sopenharmony_ci
225362306a36Sopenharmony_ci			RD_HARPOON(port + hp_scsidata_0);
225462306a36Sopenharmony_ci
225562306a36Sopenharmony_ci			WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
225662306a36Sopenharmony_ci
225762306a36Sopenharmony_ci		} while (1);
225862306a36Sopenharmony_ci
225962306a36Sopenharmony_ci	}
226062306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
226162306a36Sopenharmony_ci	WR_HARPOON(port + hp_xferstat, 0);
226262306a36Sopenharmony_ci	WR_HARPOON(port + hp_fiforead, 0);
226362306a36Sopenharmony_ci	WR_HARPOON(port + hp_fifowrite, 0);
226462306a36Sopenharmony_ci	return message;
226562306a36Sopenharmony_ci}
226662306a36Sopenharmony_ci
226762306a36Sopenharmony_ci/*---------------------------------------------------------------------
226862306a36Sopenharmony_ci *
226962306a36Sopenharmony_ci * Function: FPT_ssel
227062306a36Sopenharmony_ci *
227162306a36Sopenharmony_ci * Description: Load up automation and select target device.
227262306a36Sopenharmony_ci *
227362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
227462306a36Sopenharmony_ci
227562306a36Sopenharmony_cistatic void FPT_ssel(u32 port, unsigned char p_card)
227662306a36Sopenharmony_ci{
227762306a36Sopenharmony_ci
227862306a36Sopenharmony_ci	unsigned char auto_loaded, i, target, *theCCB;
227962306a36Sopenharmony_ci
228062306a36Sopenharmony_ci	u32 cdb_reg;
228162306a36Sopenharmony_ci	struct sccb_card *CurrCard;
228262306a36Sopenharmony_ci	struct sccb *currSCCB;
228362306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
228462306a36Sopenharmony_ci	unsigned char lastTag, lun;
228562306a36Sopenharmony_ci
228662306a36Sopenharmony_ci	CurrCard = &FPT_BL_Card[p_card];
228762306a36Sopenharmony_ci	currSCCB = CurrCard->currentSCCB;
228862306a36Sopenharmony_ci	target = currSCCB->TargID;
228962306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][target];
229062306a36Sopenharmony_ci	lastTag = CurrCard->tagQ_Lst;
229162306a36Sopenharmony_ci
229262306a36Sopenharmony_ci	ARAM_ACCESS(port);
229362306a36Sopenharmony_ci
229462306a36Sopenharmony_ci	if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
229562306a36Sopenharmony_ci		currSCCB->ControlByte &= ~F_USE_CMD_Q;
229662306a36Sopenharmony_ci
229762306a36Sopenharmony_ci	if (((CurrCard->globalFlags & F_CONLUN_IO) &&
229862306a36Sopenharmony_ci	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
229962306a36Sopenharmony_ci
230062306a36Sopenharmony_ci		lun = currSCCB->Lun;
230162306a36Sopenharmony_ci	else
230262306a36Sopenharmony_ci		lun = 0;
230362306a36Sopenharmony_ci
230462306a36Sopenharmony_ci	if (CurrCard->globalFlags & F_TAG_STARTED) {
230562306a36Sopenharmony_ci		if (!(currSCCB->ControlByte & F_USE_CMD_Q)) {
230662306a36Sopenharmony_ci			if ((currTar_Info->TarLUN_CA == 0)
230762306a36Sopenharmony_ci			    && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
230862306a36Sopenharmony_ci				== TAG_Q_TRYING)) {
230962306a36Sopenharmony_ci
231062306a36Sopenharmony_ci				if (currTar_Info->TarTagQ_Cnt != 0) {
231162306a36Sopenharmony_ci					currTar_Info->TarLUNBusy[lun] = 1;
231262306a36Sopenharmony_ci					FPT_queueSelectFail(CurrCard, p_card);
231362306a36Sopenharmony_ci					SGRAM_ACCESS(port);
231462306a36Sopenharmony_ci					return;
231562306a36Sopenharmony_ci				}
231662306a36Sopenharmony_ci
231762306a36Sopenharmony_ci				else {
231862306a36Sopenharmony_ci					currTar_Info->TarLUNBusy[lun] = 1;
231962306a36Sopenharmony_ci				}
232062306a36Sopenharmony_ci
232162306a36Sopenharmony_ci			}
232262306a36Sopenharmony_ci			/*End non-tagged */
232362306a36Sopenharmony_ci			else {
232462306a36Sopenharmony_ci				currTar_Info->TarLUNBusy[lun] = 1;
232562306a36Sopenharmony_ci			}
232662306a36Sopenharmony_ci
232762306a36Sopenharmony_ci		}
232862306a36Sopenharmony_ci		/*!Use cmd Q Tagged */
232962306a36Sopenharmony_ci		else {
233062306a36Sopenharmony_ci			if (currTar_Info->TarLUN_CA == 1) {
233162306a36Sopenharmony_ci				FPT_queueSelectFail(CurrCard, p_card);
233262306a36Sopenharmony_ci				SGRAM_ACCESS(port);
233362306a36Sopenharmony_ci				return;
233462306a36Sopenharmony_ci			}
233562306a36Sopenharmony_ci
233662306a36Sopenharmony_ci			currTar_Info->TarLUNBusy[lun] = 1;
233762306a36Sopenharmony_ci
233862306a36Sopenharmony_ci		}		/*else use cmd Q tagged */
233962306a36Sopenharmony_ci
234062306a36Sopenharmony_ci	}
234162306a36Sopenharmony_ci	/*if glob tagged started */
234262306a36Sopenharmony_ci	else {
234362306a36Sopenharmony_ci		currTar_Info->TarLUNBusy[lun] = 1;
234462306a36Sopenharmony_ci	}
234562306a36Sopenharmony_ci
234662306a36Sopenharmony_ci	if ((((CurrCard->globalFlags & F_CONLUN_IO) &&
234762306a36Sopenharmony_ci	      ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
234862306a36Sopenharmony_ci	     || (!(currSCCB->ControlByte & F_USE_CMD_Q)))) {
234962306a36Sopenharmony_ci		if (CurrCard->discQCount >= QUEUE_DEPTH) {
235062306a36Sopenharmony_ci			currTar_Info->TarLUNBusy[lun] = 1;
235162306a36Sopenharmony_ci			FPT_queueSelectFail(CurrCard, p_card);
235262306a36Sopenharmony_ci			SGRAM_ACCESS(port);
235362306a36Sopenharmony_ci			return;
235462306a36Sopenharmony_ci		}
235562306a36Sopenharmony_ci		for (i = 1; i < QUEUE_DEPTH; i++) {
235662306a36Sopenharmony_ci			if (++lastTag >= QUEUE_DEPTH)
235762306a36Sopenharmony_ci				lastTag = 1;
235862306a36Sopenharmony_ci			if (CurrCard->discQ_Tbl[lastTag] == NULL) {
235962306a36Sopenharmony_ci				CurrCard->tagQ_Lst = lastTag;
236062306a36Sopenharmony_ci				currTar_Info->LunDiscQ_Idx[lun] = lastTag;
236162306a36Sopenharmony_ci				CurrCard->discQ_Tbl[lastTag] = currSCCB;
236262306a36Sopenharmony_ci				CurrCard->discQCount++;
236362306a36Sopenharmony_ci				break;
236462306a36Sopenharmony_ci			}
236562306a36Sopenharmony_ci		}
236662306a36Sopenharmony_ci		if (i == QUEUE_DEPTH) {
236762306a36Sopenharmony_ci			currTar_Info->TarLUNBusy[lun] = 1;
236862306a36Sopenharmony_ci			FPT_queueSelectFail(CurrCard, p_card);
236962306a36Sopenharmony_ci			SGRAM_ACCESS(port);
237062306a36Sopenharmony_ci			return;
237162306a36Sopenharmony_ci		}
237262306a36Sopenharmony_ci	}
237362306a36Sopenharmony_ci
237462306a36Sopenharmony_ci	auto_loaded = 0;
237562306a36Sopenharmony_ci
237662306a36Sopenharmony_ci	WR_HARPOON(port + hp_select_id, target);
237762306a36Sopenharmony_ci	WR_HARPOON(port + hp_gp_reg_3, target);	/* Use by new automation logic */
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_ci	if (currSCCB->OperationCode == RESET_COMMAND) {
238062306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
238162306a36Sopenharmony_ci						   (currSCCB->
238262306a36Sopenharmony_ci						    Sccb_idmsg & ~DISC_PRIV)));
238362306a36Sopenharmony_ci
238462306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + NP);
238562306a36Sopenharmony_ci
238662306a36Sopenharmony_ci		currSCCB->Sccb_scsimsg = TARGET_RESET;
238762306a36Sopenharmony_ci
238862306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
238962306a36Sopenharmony_ci		auto_loaded = 1;
239062306a36Sopenharmony_ci		currSCCB->Sccb_scsistat = SELECT_BDR_ST;
239162306a36Sopenharmony_ci
239262306a36Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
239362306a36Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
239462306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
239562306a36Sopenharmony_ci		}
239662306a36Sopenharmony_ci
239762306a36Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
239862306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
239962306a36Sopenharmony_ci		}
240062306a36Sopenharmony_ci
240162306a36Sopenharmony_ci		FPT_sssyncv(port, target, NARROW_SCSI, currTar_Info);
240262306a36Sopenharmony_ci		FPT_SccbMgrTableInitTarget(p_card, target);
240362306a36Sopenharmony_ci
240462306a36Sopenharmony_ci	}
240562306a36Sopenharmony_ci
240662306a36Sopenharmony_ci	else if (currSCCB->Sccb_scsistat == ABORT_ST) {
240762306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
240862306a36Sopenharmony_ci						   (currSCCB->
240962306a36Sopenharmony_ci						    Sccb_idmsg & ~DISC_PRIV)));
241062306a36Sopenharmony_ci
241162306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
241262306a36Sopenharmony_ci
241362306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT +
241462306a36Sopenharmony_ci						     (((unsigned
241562306a36Sopenharmony_ci							char)(currSCCB->
241662306a36Sopenharmony_ci							      ControlByte &
241762306a36Sopenharmony_ci							      TAG_TYPE_MASK)
241862306a36Sopenharmony_ci						       >> 6) | (unsigned char)
241962306a36Sopenharmony_ci						      0x20)));
242062306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 2),
242162306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT + currSCCB->Sccb_tag));
242262306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 4), (BRH_OP + ALWAYS + NP));
242362306a36Sopenharmony_ci
242462306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
242562306a36Sopenharmony_ci		auto_loaded = 1;
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_ci	}
242862306a36Sopenharmony_ci
242962306a36Sopenharmony_ci	else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) {
243062306a36Sopenharmony_ci		auto_loaded = FPT_siwidn(port, p_card);
243162306a36Sopenharmony_ci		currSCCB->Sccb_scsistat = SELECT_WN_ST;
243262306a36Sopenharmony_ci	}
243362306a36Sopenharmony_ci
243462306a36Sopenharmony_ci	else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
243562306a36Sopenharmony_ci		   == SYNC_SUPPORTED)) {
243662306a36Sopenharmony_ci		auto_loaded = FPT_sisyncn(port, p_card, 0);
243762306a36Sopenharmony_ci		currSCCB->Sccb_scsistat = SELECT_SN_ST;
243862306a36Sopenharmony_ci	}
243962306a36Sopenharmony_ci
244062306a36Sopenharmony_ci	if (!auto_loaded) {
244162306a36Sopenharmony_ci
244262306a36Sopenharmony_ci		if (currSCCB->ControlByte & F_USE_CMD_Q) {
244362306a36Sopenharmony_ci
244462306a36Sopenharmony_ci			CurrCard->globalFlags |= F_TAG_STARTED;
244562306a36Sopenharmony_ci
244662306a36Sopenharmony_ci			if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
244762306a36Sopenharmony_ci			    == TAG_Q_REJECT) {
244862306a36Sopenharmony_ci				currSCCB->ControlByte &= ~F_USE_CMD_Q;
244962306a36Sopenharmony_ci
245062306a36Sopenharmony_ci				/* Fix up the start instruction with a jump to
245162306a36Sopenharmony_ci				   Non-Tag-CMD handling */
245262306a36Sopenharmony_ci				WRW_HARPOON((port + ID_MSG_STRT),
245362306a36Sopenharmony_ci					    BRH_OP + ALWAYS + NTCMD);
245462306a36Sopenharmony_ci
245562306a36Sopenharmony_ci				WRW_HARPOON((port + NON_TAG_ID_MSG),
245662306a36Sopenharmony_ci					    (MPM_OP + AMSG_OUT +
245762306a36Sopenharmony_ci					     currSCCB->Sccb_idmsg));
245862306a36Sopenharmony_ci
245962306a36Sopenharmony_ci				WR_HARPOON(port + hp_autostart_3,
246062306a36Sopenharmony_ci					   (SELECT + SELCHK_STRT));
246162306a36Sopenharmony_ci
246262306a36Sopenharmony_ci				/* Setup our STATE so we know what happened when
246362306a36Sopenharmony_ci				   the wheels fall off. */
246462306a36Sopenharmony_ci				currSCCB->Sccb_scsistat = SELECT_ST;
246562306a36Sopenharmony_ci
246662306a36Sopenharmony_ci				currTar_Info->TarLUNBusy[lun] = 1;
246762306a36Sopenharmony_ci			}
246862306a36Sopenharmony_ci
246962306a36Sopenharmony_ci			else {
247062306a36Sopenharmony_ci				WRW_HARPOON((port + ID_MSG_STRT),
247162306a36Sopenharmony_ci					    (MPM_OP + AMSG_OUT +
247262306a36Sopenharmony_ci					     currSCCB->Sccb_idmsg));
247362306a36Sopenharmony_ci
247462306a36Sopenharmony_ci				WRW_HARPOON((port + ID_MSG_STRT + 2),
247562306a36Sopenharmony_ci					    (MPM_OP + AMSG_OUT +
247662306a36Sopenharmony_ci					     (((unsigned char)(currSCCB->
247762306a36Sopenharmony_ci							       ControlByte &
247862306a36Sopenharmony_ci							       TAG_TYPE_MASK)
247962306a36Sopenharmony_ci					       >> 6) | (unsigned char)0x20)));
248062306a36Sopenharmony_ci
248162306a36Sopenharmony_ci				for (i = 1; i < QUEUE_DEPTH; i++) {
248262306a36Sopenharmony_ci					if (++lastTag >= QUEUE_DEPTH)
248362306a36Sopenharmony_ci						lastTag = 1;
248462306a36Sopenharmony_ci					if (CurrCard->discQ_Tbl[lastTag] ==
248562306a36Sopenharmony_ci					    NULL) {
248662306a36Sopenharmony_ci						WRW_HARPOON((port +
248762306a36Sopenharmony_ci							     ID_MSG_STRT + 6),
248862306a36Sopenharmony_ci							    (MPM_OP + AMSG_OUT +
248962306a36Sopenharmony_ci							     lastTag));
249062306a36Sopenharmony_ci						CurrCard->tagQ_Lst = lastTag;
249162306a36Sopenharmony_ci						currSCCB->Sccb_tag = lastTag;
249262306a36Sopenharmony_ci						CurrCard->discQ_Tbl[lastTag] =
249362306a36Sopenharmony_ci						    currSCCB;
249462306a36Sopenharmony_ci						CurrCard->discQCount++;
249562306a36Sopenharmony_ci						break;
249662306a36Sopenharmony_ci					}
249762306a36Sopenharmony_ci				}
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci				if (i == QUEUE_DEPTH) {
250062306a36Sopenharmony_ci					currTar_Info->TarLUNBusy[lun] = 1;
250162306a36Sopenharmony_ci					FPT_queueSelectFail(CurrCard, p_card);
250262306a36Sopenharmony_ci					SGRAM_ACCESS(port);
250362306a36Sopenharmony_ci					return;
250462306a36Sopenharmony_ci				}
250562306a36Sopenharmony_ci
250662306a36Sopenharmony_ci				currSCCB->Sccb_scsistat = SELECT_Q_ST;
250762306a36Sopenharmony_ci
250862306a36Sopenharmony_ci				WR_HARPOON(port + hp_autostart_3,
250962306a36Sopenharmony_ci					   (SELECT + SELCHK_STRT));
251062306a36Sopenharmony_ci			}
251162306a36Sopenharmony_ci		}
251262306a36Sopenharmony_ci
251362306a36Sopenharmony_ci		else {
251462306a36Sopenharmony_ci
251562306a36Sopenharmony_ci			WRW_HARPOON((port + ID_MSG_STRT),
251662306a36Sopenharmony_ci				    BRH_OP + ALWAYS + NTCMD);
251762306a36Sopenharmony_ci
251862306a36Sopenharmony_ci			WRW_HARPOON((port + NON_TAG_ID_MSG),
251962306a36Sopenharmony_ci				    (MPM_OP + AMSG_OUT + currSCCB->Sccb_idmsg));
252062306a36Sopenharmony_ci
252162306a36Sopenharmony_ci			currSCCB->Sccb_scsistat = SELECT_ST;
252262306a36Sopenharmony_ci
252362306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_3,
252462306a36Sopenharmony_ci				   (SELECT + SELCHK_STRT));
252562306a36Sopenharmony_ci		}
252662306a36Sopenharmony_ci
252762306a36Sopenharmony_ci		theCCB = (unsigned char *)&currSCCB->Cdb[0];
252862306a36Sopenharmony_ci
252962306a36Sopenharmony_ci		cdb_reg = port + CMD_STRT;
253062306a36Sopenharmony_ci
253162306a36Sopenharmony_ci		for (i = 0; i < currSCCB->CdbLength; i++) {
253262306a36Sopenharmony_ci			WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
253362306a36Sopenharmony_ci			cdb_reg += 2;
253462306a36Sopenharmony_ci			theCCB++;
253562306a36Sopenharmony_ci		}
253662306a36Sopenharmony_ci
253762306a36Sopenharmony_ci		if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
253862306a36Sopenharmony_ci			WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
253962306a36Sopenharmony_ci
254062306a36Sopenharmony_ci	}
254162306a36Sopenharmony_ci	/* auto_loaded */
254262306a36Sopenharmony_ci	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
254362306a36Sopenharmony_ci	WR_HARPOON(port + hp_xferstat, 0x00);
254462306a36Sopenharmony_ci
254562306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
254662306a36Sopenharmony_ci
254762306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT));
254862306a36Sopenharmony_ci
254962306a36Sopenharmony_ci	if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED)) {
255062306a36Sopenharmony_ci		WR_HARPOON(port + hp_scsictrl_0,
255162306a36Sopenharmony_ci			   (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
255262306a36Sopenharmony_ci	} else {
255362306a36Sopenharmony_ci
255462306a36Sopenharmony_ci/*      auto_loaded =  (RD_HARPOON(port+hp_autostart_3) & (unsigned char)0x1F);
255562306a36Sopenharmony_ci      auto_loaded |= AUTO_IMMED; */
255662306a36Sopenharmony_ci		auto_loaded = AUTO_IMMED;
255762306a36Sopenharmony_ci
255862306a36Sopenharmony_ci		DISABLE_AUTO(port);
255962306a36Sopenharmony_ci
256062306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, auto_loaded);
256162306a36Sopenharmony_ci	}
256262306a36Sopenharmony_ci
256362306a36Sopenharmony_ci	SGRAM_ACCESS(port);
256462306a36Sopenharmony_ci}
256562306a36Sopenharmony_ci
256662306a36Sopenharmony_ci/*---------------------------------------------------------------------
256762306a36Sopenharmony_ci *
256862306a36Sopenharmony_ci * Function: FPT_sres
256962306a36Sopenharmony_ci *
257062306a36Sopenharmony_ci * Description: Hookup the correct CCB and handle the incoming messages.
257162306a36Sopenharmony_ci *
257262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
257362306a36Sopenharmony_ci
257462306a36Sopenharmony_cistatic void FPT_sres(u32 port, unsigned char p_card,
257562306a36Sopenharmony_ci		     struct sccb_card *pCurrCard)
257662306a36Sopenharmony_ci{
257762306a36Sopenharmony_ci
257862306a36Sopenharmony_ci	unsigned char our_target, message, lun = 0, tag, msgRetryCount;
257962306a36Sopenharmony_ci
258062306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
258162306a36Sopenharmony_ci	struct sccb *currSCCB;
258262306a36Sopenharmony_ci
258362306a36Sopenharmony_ci	if (pCurrCard->currentSCCB != NULL) {
258462306a36Sopenharmony_ci		currTar_Info =
258562306a36Sopenharmony_ci		    &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
258662306a36Sopenharmony_ci		DISABLE_AUTO(port);
258762306a36Sopenharmony_ci
258862306a36Sopenharmony_ci		WR_HARPOON((port + hp_scsictrl_0), (ENA_RESEL | ENA_SCAM_SEL));
258962306a36Sopenharmony_ci
259062306a36Sopenharmony_ci		currSCCB = pCurrCard->currentSCCB;
259162306a36Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
259262306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
259362306a36Sopenharmony_ci			currSCCB->Sccb_scsistat = BUS_FREE_ST;
259462306a36Sopenharmony_ci		}
259562306a36Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
259662306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
259762306a36Sopenharmony_ci			currSCCB->Sccb_scsistat = BUS_FREE_ST;
259862306a36Sopenharmony_ci		}
259962306a36Sopenharmony_ci		if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
260062306a36Sopenharmony_ci		     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
260162306a36Sopenharmony_ci		      TAG_Q_TRYING))) {
260262306a36Sopenharmony_ci			currTar_Info->TarLUNBusy[currSCCB->Lun] = 0;
260362306a36Sopenharmony_ci			if (currSCCB->Sccb_scsistat != ABORT_ST) {
260462306a36Sopenharmony_ci				pCurrCard->discQCount--;
260562306a36Sopenharmony_ci				pCurrCard->discQ_Tbl[currTar_Info->
260662306a36Sopenharmony_ci						     LunDiscQ_Idx[currSCCB->
260762306a36Sopenharmony_ci								  Lun]]
260862306a36Sopenharmony_ci				    = NULL;
260962306a36Sopenharmony_ci			}
261062306a36Sopenharmony_ci		} else {
261162306a36Sopenharmony_ci			currTar_Info->TarLUNBusy[0] = 0;
261262306a36Sopenharmony_ci			if (currSCCB->Sccb_tag) {
261362306a36Sopenharmony_ci				if (currSCCB->Sccb_scsistat != ABORT_ST) {
261462306a36Sopenharmony_ci					pCurrCard->discQCount--;
261562306a36Sopenharmony_ci					pCurrCard->discQ_Tbl[currSCCB->
261662306a36Sopenharmony_ci							     Sccb_tag] = NULL;
261762306a36Sopenharmony_ci				}
261862306a36Sopenharmony_ci			} else {
261962306a36Sopenharmony_ci				if (currSCCB->Sccb_scsistat != ABORT_ST) {
262062306a36Sopenharmony_ci					pCurrCard->discQCount--;
262162306a36Sopenharmony_ci					pCurrCard->discQ_Tbl[currTar_Info->
262262306a36Sopenharmony_ci							     LunDiscQ_Idx[0]] =
262362306a36Sopenharmony_ci					    NULL;
262462306a36Sopenharmony_ci				}
262562306a36Sopenharmony_ci			}
262662306a36Sopenharmony_ci		}
262762306a36Sopenharmony_ci
262862306a36Sopenharmony_ci		FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
262962306a36Sopenharmony_ci	}
263062306a36Sopenharmony_ci
263162306a36Sopenharmony_ci	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
263262306a36Sopenharmony_ci
263362306a36Sopenharmony_ci	our_target = (unsigned char)(RD_HARPOON(port + hp_select_id) >> 4);
263462306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
263562306a36Sopenharmony_ci
263662306a36Sopenharmony_ci	msgRetryCount = 0;
263762306a36Sopenharmony_ci	do {
263862306a36Sopenharmony_ci
263962306a36Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
264062306a36Sopenharmony_ci		tag = 0;
264162306a36Sopenharmony_ci
264262306a36Sopenharmony_ci		while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
264362306a36Sopenharmony_ci			if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
264462306a36Sopenharmony_ci
264562306a36Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PHASE);
264662306a36Sopenharmony_ci				return;
264762306a36Sopenharmony_ci			}
264862306a36Sopenharmony_ci		}
264962306a36Sopenharmony_ci
265062306a36Sopenharmony_ci		WRW_HARPOON((port + hp_intstat), PHASE);
265162306a36Sopenharmony_ci		if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH) {
265262306a36Sopenharmony_ci
265362306a36Sopenharmony_ci			message = FPT_sfm(port, pCurrCard->currentSCCB);
265462306a36Sopenharmony_ci			if (message) {
265562306a36Sopenharmony_ci
265662306a36Sopenharmony_ci				if (message <= (0x80 | LUN_MASK)) {
265762306a36Sopenharmony_ci					lun = message & (unsigned char)LUN_MASK;
265862306a36Sopenharmony_ci
265962306a36Sopenharmony_ci					if ((currTar_Info->
266062306a36Sopenharmony_ci					     TarStatus & TAR_TAG_Q_MASK) ==
266162306a36Sopenharmony_ci					    TAG_Q_TRYING) {
266262306a36Sopenharmony_ci						if (currTar_Info->TarTagQ_Cnt !=
266362306a36Sopenharmony_ci						    0) {
266462306a36Sopenharmony_ci
266562306a36Sopenharmony_ci							if (!
266662306a36Sopenharmony_ci							    (currTar_Info->
266762306a36Sopenharmony_ci							     TarLUN_CA)) {
266862306a36Sopenharmony_ci								ACCEPT_MSG(port);	/*Release the ACK for ID msg. */
266962306a36Sopenharmony_ci
267062306a36Sopenharmony_ci								message =
267162306a36Sopenharmony_ci								    FPT_sfm
267262306a36Sopenharmony_ci								    (port,
267362306a36Sopenharmony_ci								     pCurrCard->
267462306a36Sopenharmony_ci								     currentSCCB);
267562306a36Sopenharmony_ci								if (message) {
267662306a36Sopenharmony_ci									ACCEPT_MSG
267762306a36Sopenharmony_ci									    (port);
267862306a36Sopenharmony_ci								}
267962306a36Sopenharmony_ci
268062306a36Sopenharmony_ci								else
268162306a36Sopenharmony_ci									message
268262306a36Sopenharmony_ci									    = 0;
268362306a36Sopenharmony_ci
268462306a36Sopenharmony_ci								if (message !=
268562306a36Sopenharmony_ci								    0) {
268662306a36Sopenharmony_ci									tag =
268762306a36Sopenharmony_ci									    FPT_sfm
268862306a36Sopenharmony_ci									    (port,
268962306a36Sopenharmony_ci									     pCurrCard->
269062306a36Sopenharmony_ci									     currentSCCB);
269162306a36Sopenharmony_ci
269262306a36Sopenharmony_ci									if (!
269362306a36Sopenharmony_ci									    (tag))
269462306a36Sopenharmony_ci										message
269562306a36Sopenharmony_ci										    =
269662306a36Sopenharmony_ci										    0;
269762306a36Sopenharmony_ci								}
269862306a36Sopenharmony_ci
269962306a36Sopenharmony_ci							}
270062306a36Sopenharmony_ci							/*C.A. exists! */
270162306a36Sopenharmony_ci						}
270262306a36Sopenharmony_ci						/*End Q cnt != 0 */
270362306a36Sopenharmony_ci					}
270462306a36Sopenharmony_ci					/*End Tag cmds supported! */
270562306a36Sopenharmony_ci				}
270662306a36Sopenharmony_ci				/*End valid ID message.  */
270762306a36Sopenharmony_ci				else {
270862306a36Sopenharmony_ci
270962306a36Sopenharmony_ci					ACCEPT_MSG_ATN(port);
271062306a36Sopenharmony_ci				}
271162306a36Sopenharmony_ci
271262306a36Sopenharmony_ci			}
271362306a36Sopenharmony_ci			/* End good id message. */
271462306a36Sopenharmony_ci			else {
271562306a36Sopenharmony_ci
271662306a36Sopenharmony_ci				message = 0;
271762306a36Sopenharmony_ci			}
271862306a36Sopenharmony_ci		} else {
271962306a36Sopenharmony_ci			ACCEPT_MSG_ATN(port);
272062306a36Sopenharmony_ci
272162306a36Sopenharmony_ci			while (!
272262306a36Sopenharmony_ci			       (RDW_HARPOON((port + hp_intstat)) &
272362306a36Sopenharmony_ci				(PHASE | RESET))
272462306a36Sopenharmony_ci			       && !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
272562306a36Sopenharmony_ci			       && (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
272662306a36Sopenharmony_ci
272762306a36Sopenharmony_ci			return;
272862306a36Sopenharmony_ci		}
272962306a36Sopenharmony_ci
273062306a36Sopenharmony_ci		if (message == 0) {
273162306a36Sopenharmony_ci			msgRetryCount++;
273262306a36Sopenharmony_ci			if (msgRetryCount == 1) {
273362306a36Sopenharmony_ci				FPT_SendMsg(port, MSG_PARITY_ERROR);
273462306a36Sopenharmony_ci			} else {
273562306a36Sopenharmony_ci				FPT_SendMsg(port, TARGET_RESET);
273662306a36Sopenharmony_ci
273762306a36Sopenharmony_ci				FPT_sssyncv(port, our_target, NARROW_SCSI,
273862306a36Sopenharmony_ci					    currTar_Info);
273962306a36Sopenharmony_ci
274062306a36Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][our_target].
274162306a36Sopenharmony_ci				    TarEEValue & EE_SYNC_MASK) {
274262306a36Sopenharmony_ci
274362306a36Sopenharmony_ci					FPT_sccbMgrTbl[p_card][our_target].
274462306a36Sopenharmony_ci					    TarStatus &= ~TAR_SYNC_MASK;
274562306a36Sopenharmony_ci
274662306a36Sopenharmony_ci				}
274762306a36Sopenharmony_ci
274862306a36Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][our_target].
274962306a36Sopenharmony_ci				    TarEEValue & EE_WIDE_SCSI) {
275062306a36Sopenharmony_ci
275162306a36Sopenharmony_ci					FPT_sccbMgrTbl[p_card][our_target].
275262306a36Sopenharmony_ci					    TarStatus &= ~TAR_WIDE_MASK;
275362306a36Sopenharmony_ci				}
275462306a36Sopenharmony_ci
275562306a36Sopenharmony_ci				FPT_queueFlushTargSccb(p_card, our_target,
275662306a36Sopenharmony_ci						       SCCB_COMPLETE);
275762306a36Sopenharmony_ci				FPT_SccbMgrTableInitTarget(p_card, our_target);
275862306a36Sopenharmony_ci				return;
275962306a36Sopenharmony_ci			}
276062306a36Sopenharmony_ci		}
276162306a36Sopenharmony_ci	} while (message == 0);
276262306a36Sopenharmony_ci
276362306a36Sopenharmony_ci	if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
276462306a36Sopenharmony_ci	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
276562306a36Sopenharmony_ci		currTar_Info->TarLUNBusy[lun] = 1;
276662306a36Sopenharmony_ci		pCurrCard->currentSCCB =
276762306a36Sopenharmony_ci		    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
276862306a36Sopenharmony_ci		if (pCurrCard->currentSCCB != NULL) {
276962306a36Sopenharmony_ci			ACCEPT_MSG(port);
277062306a36Sopenharmony_ci		} else {
277162306a36Sopenharmony_ci			ACCEPT_MSG_ATN(port);
277262306a36Sopenharmony_ci		}
277362306a36Sopenharmony_ci	} else {
277462306a36Sopenharmony_ci		currTar_Info->TarLUNBusy[0] = 1;
277562306a36Sopenharmony_ci
277662306a36Sopenharmony_ci		if (tag) {
277762306a36Sopenharmony_ci			if (pCurrCard->discQ_Tbl[tag] != NULL) {
277862306a36Sopenharmony_ci				pCurrCard->currentSCCB =
277962306a36Sopenharmony_ci				    pCurrCard->discQ_Tbl[tag];
278062306a36Sopenharmony_ci				currTar_Info->TarTagQ_Cnt--;
278162306a36Sopenharmony_ci				ACCEPT_MSG(port);
278262306a36Sopenharmony_ci			} else {
278362306a36Sopenharmony_ci				ACCEPT_MSG_ATN(port);
278462306a36Sopenharmony_ci			}
278562306a36Sopenharmony_ci		} else {
278662306a36Sopenharmony_ci			pCurrCard->currentSCCB =
278762306a36Sopenharmony_ci			    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
278862306a36Sopenharmony_ci			if (pCurrCard->currentSCCB != NULL) {
278962306a36Sopenharmony_ci				ACCEPT_MSG(port);
279062306a36Sopenharmony_ci			} else {
279162306a36Sopenharmony_ci				ACCEPT_MSG_ATN(port);
279262306a36Sopenharmony_ci			}
279362306a36Sopenharmony_ci		}
279462306a36Sopenharmony_ci	}
279562306a36Sopenharmony_ci
279662306a36Sopenharmony_ci	if (pCurrCard->currentSCCB != NULL) {
279762306a36Sopenharmony_ci		if (pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST) {
279862306a36Sopenharmony_ci			/* During Abort Tag command, the target could have got re-selected
279962306a36Sopenharmony_ci			   and completed the command. Check the select Q and remove the CCB
280062306a36Sopenharmony_ci			   if it is in the Select Q */
280162306a36Sopenharmony_ci			FPT_queueFindSccb(pCurrCard->currentSCCB, p_card);
280262306a36Sopenharmony_ci		}
280362306a36Sopenharmony_ci	}
280462306a36Sopenharmony_ci
280562306a36Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & (PHASE | RESET)) &&
280662306a36Sopenharmony_ci	       !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ) &&
280762306a36Sopenharmony_ci	       (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
280862306a36Sopenharmony_ci}
280962306a36Sopenharmony_ci
281062306a36Sopenharmony_cistatic void FPT_SendMsg(u32 port, unsigned char message)
281162306a36Sopenharmony_ci{
281262306a36Sopenharmony_ci	while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
281362306a36Sopenharmony_ci		if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
281462306a36Sopenharmony_ci
281562306a36Sopenharmony_ci			WRW_HARPOON((port + hp_intstat), PHASE);
281662306a36Sopenharmony_ci			return;
281762306a36Sopenharmony_ci		}
281862306a36Sopenharmony_ci	}
281962306a36Sopenharmony_ci
282062306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), PHASE);
282162306a36Sopenharmony_ci	if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH) {
282262306a36Sopenharmony_ci		WRW_HARPOON((port + hp_intstat),
282362306a36Sopenharmony_ci			    (BUS_FREE | PHASE | XFER_CNT_0));
282462306a36Sopenharmony_ci
282562306a36Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
282662306a36Sopenharmony_ci
282762306a36Sopenharmony_ci		WR_HARPOON(port + hp_scsidata_0, message);
282862306a36Sopenharmony_ci
282962306a36Sopenharmony_ci		WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
283062306a36Sopenharmony_ci
283162306a36Sopenharmony_ci		ACCEPT_MSG(port);
283262306a36Sopenharmony_ci
283362306a36Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, 0x00);
283462306a36Sopenharmony_ci
283562306a36Sopenharmony_ci		if ((message == ABORT_TASK_SET) || (message == TARGET_RESET) ||
283662306a36Sopenharmony_ci		    (message == ABORT_TASK)) {
283762306a36Sopenharmony_ci			while (!
283862306a36Sopenharmony_ci			       (RDW_HARPOON((port + hp_intstat)) &
283962306a36Sopenharmony_ci				(BUS_FREE | PHASE))) {
284062306a36Sopenharmony_ci			}
284162306a36Sopenharmony_ci
284262306a36Sopenharmony_ci			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
284362306a36Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), BUS_FREE);
284462306a36Sopenharmony_ci			}
284562306a36Sopenharmony_ci		}
284662306a36Sopenharmony_ci	}
284762306a36Sopenharmony_ci}
284862306a36Sopenharmony_ci
284962306a36Sopenharmony_ci/*---------------------------------------------------------------------
285062306a36Sopenharmony_ci *
285162306a36Sopenharmony_ci * Function: FPT_sdecm
285262306a36Sopenharmony_ci *
285362306a36Sopenharmony_ci * Description: Determine the proper response to the message from the
285462306a36Sopenharmony_ci *              target device.
285562306a36Sopenharmony_ci *
285662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
285762306a36Sopenharmony_cistatic void FPT_sdecm(unsigned char message, u32 port, unsigned char p_card)
285862306a36Sopenharmony_ci{
285962306a36Sopenharmony_ci	struct sccb *currSCCB;
286062306a36Sopenharmony_ci	struct sccb_card *CurrCard;
286162306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
286262306a36Sopenharmony_ci
286362306a36Sopenharmony_ci	CurrCard = &FPT_BL_Card[p_card];
286462306a36Sopenharmony_ci	currSCCB = CurrCard->currentSCCB;
286562306a36Sopenharmony_ci
286662306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
286762306a36Sopenharmony_ci
286862306a36Sopenharmony_ci	if (message == RESTORE_POINTERS) {
286962306a36Sopenharmony_ci		if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) {
287062306a36Sopenharmony_ci			currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
287162306a36Sopenharmony_ci
287262306a36Sopenharmony_ci			FPT_hostDataXferRestart(currSCCB);
287362306a36Sopenharmony_ci		}
287462306a36Sopenharmony_ci
287562306a36Sopenharmony_ci		ACCEPT_MSG(port);
287662306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
287762306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
287862306a36Sopenharmony_ci	}
287962306a36Sopenharmony_ci
288062306a36Sopenharmony_ci	else if (message == COMMAND_COMPLETE) {
288162306a36Sopenharmony_ci
288262306a36Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
288362306a36Sopenharmony_ci			currTar_Info->TarStatus &=
288462306a36Sopenharmony_ci			    ~(unsigned char)TAR_TAG_Q_MASK;
288562306a36Sopenharmony_ci			currTar_Info->TarStatus |= (unsigned char)TAG_Q_REJECT;
288662306a36Sopenharmony_ci		}
288762306a36Sopenharmony_ci
288862306a36Sopenharmony_ci		ACCEPT_MSG(port);
288962306a36Sopenharmony_ci
289062306a36Sopenharmony_ci	}
289162306a36Sopenharmony_ci
289262306a36Sopenharmony_ci	else if ((message == NOP) || (message >= IDENTIFY_BASE) ||
289362306a36Sopenharmony_ci		 (message == INITIATE_RECOVERY) ||
289462306a36Sopenharmony_ci		 (message == RELEASE_RECOVERY)) {
289562306a36Sopenharmony_ci
289662306a36Sopenharmony_ci		ACCEPT_MSG(port);
289762306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
289862306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
289962306a36Sopenharmony_ci	}
290062306a36Sopenharmony_ci
290162306a36Sopenharmony_ci	else if (message == MESSAGE_REJECT) {
290262306a36Sopenharmony_ci
290362306a36Sopenharmony_ci		if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
290462306a36Sopenharmony_ci		    (currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
290562306a36Sopenharmony_ci		    ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)
290662306a36Sopenharmony_ci		    || ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) ==
290762306a36Sopenharmony_ci			TAG_Q_TRYING))
290862306a36Sopenharmony_ci		{
290962306a36Sopenharmony_ci			WRW_HARPOON((port + hp_intstat), BUS_FREE);
291062306a36Sopenharmony_ci
291162306a36Sopenharmony_ci			ACCEPT_MSG(port);
291262306a36Sopenharmony_ci
291362306a36Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
291462306a36Sopenharmony_ci			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
291562306a36Sopenharmony_ci			{
291662306a36Sopenharmony_ci			}
291762306a36Sopenharmony_ci
291862306a36Sopenharmony_ci			if (currSCCB->Lun == 0x00) {
291962306a36Sopenharmony_ci				if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
292062306a36Sopenharmony_ci
292162306a36Sopenharmony_ci					currTar_Info->TarStatus |=
292262306a36Sopenharmony_ci					    (unsigned char)SYNC_SUPPORTED;
292362306a36Sopenharmony_ci
292462306a36Sopenharmony_ci					currTar_Info->TarEEValue &=
292562306a36Sopenharmony_ci					    ~EE_SYNC_MASK;
292662306a36Sopenharmony_ci				}
292762306a36Sopenharmony_ci
292862306a36Sopenharmony_ci				else if (currSCCB->Sccb_scsistat ==
292962306a36Sopenharmony_ci					  SELECT_WN_ST) {
293062306a36Sopenharmony_ci
293162306a36Sopenharmony_ci					currTar_Info->TarStatus =
293262306a36Sopenharmony_ci					    (currTar_Info->
293362306a36Sopenharmony_ci					     TarStatus & ~WIDE_ENABLED) |
293462306a36Sopenharmony_ci					    WIDE_NEGOCIATED;
293562306a36Sopenharmony_ci
293662306a36Sopenharmony_ci					currTar_Info->TarEEValue &=
293762306a36Sopenharmony_ci					    ~EE_WIDE_SCSI;
293862306a36Sopenharmony_ci
293962306a36Sopenharmony_ci				}
294062306a36Sopenharmony_ci
294162306a36Sopenharmony_ci				else if ((currTar_Info->
294262306a36Sopenharmony_ci					  TarStatus & TAR_TAG_Q_MASK) ==
294362306a36Sopenharmony_ci					 TAG_Q_TRYING) {
294462306a36Sopenharmony_ci					currTar_Info->TarStatus =
294562306a36Sopenharmony_ci					    (currTar_Info->
294662306a36Sopenharmony_ci					     TarStatus & ~(unsigned char)
294762306a36Sopenharmony_ci					     TAR_TAG_Q_MASK) | TAG_Q_REJECT;
294862306a36Sopenharmony_ci
294962306a36Sopenharmony_ci					currSCCB->ControlByte &= ~F_USE_CMD_Q;
295062306a36Sopenharmony_ci					CurrCard->discQCount--;
295162306a36Sopenharmony_ci					CurrCard->discQ_Tbl[currSCCB->
295262306a36Sopenharmony_ci							    Sccb_tag] = NULL;
295362306a36Sopenharmony_ci					currSCCB->Sccb_tag = 0x00;
295462306a36Sopenharmony_ci
295562306a36Sopenharmony_ci				}
295662306a36Sopenharmony_ci			}
295762306a36Sopenharmony_ci
295862306a36Sopenharmony_ci			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
295962306a36Sopenharmony_ci
296062306a36Sopenharmony_ci				if (currSCCB->Lun == 0x00) {
296162306a36Sopenharmony_ci					WRW_HARPOON((port + hp_intstat),
296262306a36Sopenharmony_ci						    BUS_FREE);
296362306a36Sopenharmony_ci					CurrCard->globalFlags |= F_NEW_SCCB_CMD;
296462306a36Sopenharmony_ci				}
296562306a36Sopenharmony_ci			}
296662306a36Sopenharmony_ci
296762306a36Sopenharmony_ci			else {
296862306a36Sopenharmony_ci
296962306a36Sopenharmony_ci				if ((CurrCard->globalFlags & F_CONLUN_IO) &&
297062306a36Sopenharmony_ci				    ((currTar_Info->
297162306a36Sopenharmony_ci				      TarStatus & TAR_TAG_Q_MASK) !=
297262306a36Sopenharmony_ci				     TAG_Q_TRYING))
297362306a36Sopenharmony_ci					currTar_Info->TarLUNBusy[currSCCB->
297462306a36Sopenharmony_ci								 Lun] = 1;
297562306a36Sopenharmony_ci				else
297662306a36Sopenharmony_ci					currTar_Info->TarLUNBusy[0] = 1;
297762306a36Sopenharmony_ci
297862306a36Sopenharmony_ci				currSCCB->ControlByte &=
297962306a36Sopenharmony_ci				    ~(unsigned char)F_USE_CMD_Q;
298062306a36Sopenharmony_ci
298162306a36Sopenharmony_ci				WR_HARPOON(port + hp_autostart_1,
298262306a36Sopenharmony_ci					   (AUTO_IMMED + DISCONNECT_START));
298362306a36Sopenharmony_ci
298462306a36Sopenharmony_ci			}
298562306a36Sopenharmony_ci		}
298662306a36Sopenharmony_ci
298762306a36Sopenharmony_ci		else {
298862306a36Sopenharmony_ci			ACCEPT_MSG(port);
298962306a36Sopenharmony_ci
299062306a36Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
299162306a36Sopenharmony_ci			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
299262306a36Sopenharmony_ci			{
299362306a36Sopenharmony_ci			}
299462306a36Sopenharmony_ci
299562306a36Sopenharmony_ci			if (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)) {
299662306a36Sopenharmony_ci				WR_HARPOON(port + hp_autostart_1,
299762306a36Sopenharmony_ci					   (AUTO_IMMED + DISCONNECT_START));
299862306a36Sopenharmony_ci			}
299962306a36Sopenharmony_ci		}
300062306a36Sopenharmony_ci	}
300162306a36Sopenharmony_ci
300262306a36Sopenharmony_ci	else if (message == EXTENDED_MESSAGE) {
300362306a36Sopenharmony_ci
300462306a36Sopenharmony_ci		ACCEPT_MSG(port);
300562306a36Sopenharmony_ci		FPT_shandem(port, p_card, currSCCB);
300662306a36Sopenharmony_ci	}
300762306a36Sopenharmony_ci
300862306a36Sopenharmony_ci	else if (message == IGNORE_WIDE_RESIDUE) {
300962306a36Sopenharmony_ci
301062306a36Sopenharmony_ci		ACCEPT_MSG(port);	/* ACK the RESIDUE MSG */
301162306a36Sopenharmony_ci
301262306a36Sopenharmony_ci		message = FPT_sfm(port, currSCCB);
301362306a36Sopenharmony_ci
301462306a36Sopenharmony_ci		if (currSCCB->Sccb_scsimsg != MSG_PARITY_ERROR)
301562306a36Sopenharmony_ci			ACCEPT_MSG(port);
301662306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
301762306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
301862306a36Sopenharmony_ci	}
301962306a36Sopenharmony_ci
302062306a36Sopenharmony_ci	else {
302162306a36Sopenharmony_ci
302262306a36Sopenharmony_ci		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
302362306a36Sopenharmony_ci		currSCCB->Sccb_scsimsg = MESSAGE_REJECT;
302462306a36Sopenharmony_ci
302562306a36Sopenharmony_ci		ACCEPT_MSG_ATN(port);
302662306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
302762306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
302862306a36Sopenharmony_ci	}
302962306a36Sopenharmony_ci}
303062306a36Sopenharmony_ci
303162306a36Sopenharmony_ci/*---------------------------------------------------------------------
303262306a36Sopenharmony_ci *
303362306a36Sopenharmony_ci * Function: FPT_shandem
303462306a36Sopenharmony_ci *
303562306a36Sopenharmony_ci * Description: Decide what to do with the extended message.
303662306a36Sopenharmony_ci *
303762306a36Sopenharmony_ci *---------------------------------------------------------------------*/
303862306a36Sopenharmony_cistatic void FPT_shandem(u32 port, unsigned char p_card, struct sccb *pCurrSCCB)
303962306a36Sopenharmony_ci{
304062306a36Sopenharmony_ci	unsigned char length, message;
304162306a36Sopenharmony_ci
304262306a36Sopenharmony_ci	length = FPT_sfm(port, pCurrSCCB);
304362306a36Sopenharmony_ci	if (length) {
304462306a36Sopenharmony_ci
304562306a36Sopenharmony_ci		ACCEPT_MSG(port);
304662306a36Sopenharmony_ci		message = FPT_sfm(port, pCurrSCCB);
304762306a36Sopenharmony_ci		if (message) {
304862306a36Sopenharmony_ci
304962306a36Sopenharmony_ci			if (message == EXTENDED_SDTR) {
305062306a36Sopenharmony_ci
305162306a36Sopenharmony_ci				if (length == 0x03) {
305262306a36Sopenharmony_ci
305362306a36Sopenharmony_ci					ACCEPT_MSG(port);
305462306a36Sopenharmony_ci					FPT_stsyncn(port, p_card);
305562306a36Sopenharmony_ci				} else {
305662306a36Sopenharmony_ci
305762306a36Sopenharmony_ci					pCurrSCCB->Sccb_scsimsg = MESSAGE_REJECT;
305862306a36Sopenharmony_ci					ACCEPT_MSG_ATN(port);
305962306a36Sopenharmony_ci				}
306062306a36Sopenharmony_ci			} else if (message == EXTENDED_WDTR) {
306162306a36Sopenharmony_ci
306262306a36Sopenharmony_ci				if (length == 0x02) {
306362306a36Sopenharmony_ci
306462306a36Sopenharmony_ci					ACCEPT_MSG(port);
306562306a36Sopenharmony_ci					FPT_stwidn(port, p_card);
306662306a36Sopenharmony_ci				} else {
306762306a36Sopenharmony_ci
306862306a36Sopenharmony_ci					pCurrSCCB->Sccb_scsimsg = MESSAGE_REJECT;
306962306a36Sopenharmony_ci					ACCEPT_MSG_ATN(port);
307062306a36Sopenharmony_ci
307162306a36Sopenharmony_ci					WR_HARPOON(port + hp_autostart_1,
307262306a36Sopenharmony_ci						   (AUTO_IMMED +
307362306a36Sopenharmony_ci						    DISCONNECT_START));
307462306a36Sopenharmony_ci				}
307562306a36Sopenharmony_ci			} else {
307662306a36Sopenharmony_ci
307762306a36Sopenharmony_ci				pCurrSCCB->Sccb_scsimsg = MESSAGE_REJECT;
307862306a36Sopenharmony_ci				ACCEPT_MSG_ATN(port);
307962306a36Sopenharmony_ci
308062306a36Sopenharmony_ci				WR_HARPOON(port + hp_autostart_1,
308162306a36Sopenharmony_ci					   (AUTO_IMMED + DISCONNECT_START));
308262306a36Sopenharmony_ci			}
308362306a36Sopenharmony_ci		} else {
308462306a36Sopenharmony_ci			if (pCurrSCCB->Sccb_scsimsg != MSG_PARITY_ERROR)
308562306a36Sopenharmony_ci				ACCEPT_MSG(port);
308662306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
308762306a36Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
308862306a36Sopenharmony_ci		}
308962306a36Sopenharmony_ci	} else {
309062306a36Sopenharmony_ci		if (pCurrSCCB->Sccb_scsimsg == MSG_PARITY_ERROR)
309162306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
309262306a36Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
309362306a36Sopenharmony_ci	}
309462306a36Sopenharmony_ci}
309562306a36Sopenharmony_ci
309662306a36Sopenharmony_ci/*---------------------------------------------------------------------
309762306a36Sopenharmony_ci *
309862306a36Sopenharmony_ci * Function: FPT_sisyncn
309962306a36Sopenharmony_ci *
310062306a36Sopenharmony_ci * Description: Read in a message byte from the SCSI bus, and check
310162306a36Sopenharmony_ci *              for a parity error.
310262306a36Sopenharmony_ci *
310362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
310462306a36Sopenharmony_ci
310562306a36Sopenharmony_cistatic unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
310662306a36Sopenharmony_ci				 unsigned char syncFlag)
310762306a36Sopenharmony_ci{
310862306a36Sopenharmony_ci	struct sccb *currSCCB;
310962306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
311062306a36Sopenharmony_ci
311162306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
311262306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
311362306a36Sopenharmony_ci
311462306a36Sopenharmony_ci	if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
311562306a36Sopenharmony_ci
311662306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT),
311762306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT +
311862306a36Sopenharmony_ci			     (currSCCB->
311962306a36Sopenharmony_ci			      Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
312062306a36Sopenharmony_ci
312162306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
312262306a36Sopenharmony_ci
312362306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 0),
312462306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT + EXTENDED_MESSAGE));
312562306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
312662306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 4),
312762306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT + EXTENDED_SDTR));
312862306a36Sopenharmony_ci
312962306a36Sopenharmony_ci		if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
313062306a36Sopenharmony_ci
313162306a36Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
313262306a36Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 12));
313362306a36Sopenharmony_ci
313462306a36Sopenharmony_ci		else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
313562306a36Sopenharmony_ci			 EE_SYNC_10MB)
313662306a36Sopenharmony_ci
313762306a36Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
313862306a36Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 25));
313962306a36Sopenharmony_ci
314062306a36Sopenharmony_ci		else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
314162306a36Sopenharmony_ci			 EE_SYNC_5MB)
314262306a36Sopenharmony_ci
314362306a36Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
314462306a36Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 50));
314562306a36Sopenharmony_ci
314662306a36Sopenharmony_ci		else
314762306a36Sopenharmony_ci			WRW_HARPOON((port + SYNC_MSGS + 6),
314862306a36Sopenharmony_ci				    (MPM_OP + AMSG_OUT + 00));
314962306a36Sopenharmony_ci
315062306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
315162306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 10),
315262306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT + DEFAULT_OFFSET));
315362306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
315462306a36Sopenharmony_ci
315562306a36Sopenharmony_ci		if (syncFlag == 0) {
315662306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_3,
315762306a36Sopenharmony_ci				   (SELECT + SELCHK_STRT));
315862306a36Sopenharmony_ci			currTar_Info->TarStatus =
315962306a36Sopenharmony_ci			    ((currTar_Info->
316062306a36Sopenharmony_ci			      TarStatus & ~(unsigned char)TAR_SYNC_MASK) |
316162306a36Sopenharmony_ci			     (unsigned char)SYNC_TRYING);
316262306a36Sopenharmony_ci		} else {
316362306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_3,
316462306a36Sopenharmony_ci				   (AUTO_IMMED + CMD_ONLY_STRT));
316562306a36Sopenharmony_ci		}
316662306a36Sopenharmony_ci
316762306a36Sopenharmony_ci		return 1;
316862306a36Sopenharmony_ci	}
316962306a36Sopenharmony_ci
317062306a36Sopenharmony_ci	else {
317162306a36Sopenharmony_ci
317262306a36Sopenharmony_ci		currTar_Info->TarStatus |= (unsigned char)SYNC_SUPPORTED;
317362306a36Sopenharmony_ci		currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
317462306a36Sopenharmony_ci		return 0;
317562306a36Sopenharmony_ci	}
317662306a36Sopenharmony_ci}
317762306a36Sopenharmony_ci
317862306a36Sopenharmony_ci/*---------------------------------------------------------------------
317962306a36Sopenharmony_ci *
318062306a36Sopenharmony_ci * Function: FPT_stsyncn
318162306a36Sopenharmony_ci *
318262306a36Sopenharmony_ci * Description: The has sent us a Sync Nego message so handle it as
318362306a36Sopenharmony_ci *              necessary.
318462306a36Sopenharmony_ci *
318562306a36Sopenharmony_ci *---------------------------------------------------------------------*/
318662306a36Sopenharmony_cistatic void FPT_stsyncn(u32 port, unsigned char p_card)
318762306a36Sopenharmony_ci{
318862306a36Sopenharmony_ci	unsigned char sync_msg, offset, sync_reg, our_sync_msg;
318962306a36Sopenharmony_ci	struct sccb *currSCCB;
319062306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
319162306a36Sopenharmony_ci
319262306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
319362306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
319462306a36Sopenharmony_ci
319562306a36Sopenharmony_ci	sync_msg = FPT_sfm(port, currSCCB);
319662306a36Sopenharmony_ci
319762306a36Sopenharmony_ci	if ((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == MSG_PARITY_ERROR)) {
319862306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
319962306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
320062306a36Sopenharmony_ci		return;
320162306a36Sopenharmony_ci	}
320262306a36Sopenharmony_ci
320362306a36Sopenharmony_ci	ACCEPT_MSG(port);
320462306a36Sopenharmony_ci
320562306a36Sopenharmony_ci	offset = FPT_sfm(port, currSCCB);
320662306a36Sopenharmony_ci
320762306a36Sopenharmony_ci	if ((offset == 0x00) && (currSCCB->Sccb_scsimsg == MSG_PARITY_ERROR)) {
320862306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
320962306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
321062306a36Sopenharmony_ci		return;
321162306a36Sopenharmony_ci	}
321262306a36Sopenharmony_ci
321362306a36Sopenharmony_ci	if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
321462306a36Sopenharmony_ci
321562306a36Sopenharmony_ci		our_sync_msg = 12;	/* Setup our Message to 20mb/s */
321662306a36Sopenharmony_ci
321762306a36Sopenharmony_ci	else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
321862306a36Sopenharmony_ci
321962306a36Sopenharmony_ci		our_sync_msg = 25;	/* Setup our Message to 10mb/s */
322062306a36Sopenharmony_ci
322162306a36Sopenharmony_ci	else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
322262306a36Sopenharmony_ci
322362306a36Sopenharmony_ci		our_sync_msg = 50;	/* Setup our Message to 5mb/s */
322462306a36Sopenharmony_ci	else
322562306a36Sopenharmony_ci
322662306a36Sopenharmony_ci		our_sync_msg = 0;	/* Message = Async */
322762306a36Sopenharmony_ci
322862306a36Sopenharmony_ci	if (sync_msg < our_sync_msg) {
322962306a36Sopenharmony_ci		sync_msg = our_sync_msg;	/*if faster, then set to max. */
323062306a36Sopenharmony_ci	}
323162306a36Sopenharmony_ci
323262306a36Sopenharmony_ci	if (offset == ASYNC)
323362306a36Sopenharmony_ci		sync_msg = ASYNC;
323462306a36Sopenharmony_ci
323562306a36Sopenharmony_ci	if (offset > MAX_OFFSET)
323662306a36Sopenharmony_ci		offset = MAX_OFFSET;
323762306a36Sopenharmony_ci
323862306a36Sopenharmony_ci	sync_reg = 0x00;
323962306a36Sopenharmony_ci
324062306a36Sopenharmony_ci	if (sync_msg > 12)
324162306a36Sopenharmony_ci
324262306a36Sopenharmony_ci		sync_reg = 0x20;	/* Use 10MB/s */
324362306a36Sopenharmony_ci
324462306a36Sopenharmony_ci	if (sync_msg > 25)
324562306a36Sopenharmony_ci
324662306a36Sopenharmony_ci		sync_reg = 0x40;	/* Use 6.6MB/s */
324762306a36Sopenharmony_ci
324862306a36Sopenharmony_ci	if (sync_msg > 38)
324962306a36Sopenharmony_ci
325062306a36Sopenharmony_ci		sync_reg = 0x60;	/* Use 5MB/s */
325162306a36Sopenharmony_ci
325262306a36Sopenharmony_ci	if (sync_msg > 50)
325362306a36Sopenharmony_ci
325462306a36Sopenharmony_ci		sync_reg = 0x80;	/* Use 4MB/s */
325562306a36Sopenharmony_ci
325662306a36Sopenharmony_ci	if (sync_msg > 62)
325762306a36Sopenharmony_ci
325862306a36Sopenharmony_ci		sync_reg = 0xA0;	/* Use 3.33MB/s */
325962306a36Sopenharmony_ci
326062306a36Sopenharmony_ci	if (sync_msg > 75)
326162306a36Sopenharmony_ci
326262306a36Sopenharmony_ci		sync_reg = 0xC0;	/* Use 2.85MB/s */
326362306a36Sopenharmony_ci
326462306a36Sopenharmony_ci	if (sync_msg > 87)
326562306a36Sopenharmony_ci
326662306a36Sopenharmony_ci		sync_reg = 0xE0;	/* Use 2.5MB/s */
326762306a36Sopenharmony_ci
326862306a36Sopenharmony_ci	if (sync_msg > 100) {
326962306a36Sopenharmony_ci
327062306a36Sopenharmony_ci		sync_reg = 0x00;	/* Use ASYNC */
327162306a36Sopenharmony_ci		offset = 0x00;
327262306a36Sopenharmony_ci	}
327362306a36Sopenharmony_ci
327462306a36Sopenharmony_ci	if (currTar_Info->TarStatus & WIDE_ENABLED)
327562306a36Sopenharmony_ci
327662306a36Sopenharmony_ci		sync_reg |= offset;
327762306a36Sopenharmony_ci
327862306a36Sopenharmony_ci	else
327962306a36Sopenharmony_ci
328062306a36Sopenharmony_ci		sync_reg |= (offset | NARROW_SCSI);
328162306a36Sopenharmony_ci
328262306a36Sopenharmony_ci	FPT_sssyncv(port, currSCCB->TargID, sync_reg, currTar_Info);
328362306a36Sopenharmony_ci
328462306a36Sopenharmony_ci	if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
328562306a36Sopenharmony_ci
328662306a36Sopenharmony_ci		ACCEPT_MSG(port);
328762306a36Sopenharmony_ci
328862306a36Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
328962306a36Sopenharmony_ci					    ~(unsigned char)TAR_SYNC_MASK) |
329062306a36Sopenharmony_ci					   (unsigned char)SYNC_SUPPORTED);
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
329362306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
329462306a36Sopenharmony_ci	}
329562306a36Sopenharmony_ci
329662306a36Sopenharmony_ci	else {
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_ci		ACCEPT_MSG_ATN(port);
329962306a36Sopenharmony_ci
330062306a36Sopenharmony_ci		FPT_sisyncr(port, sync_msg, offset);
330162306a36Sopenharmony_ci
330262306a36Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
330362306a36Sopenharmony_ci					    ~(unsigned char)TAR_SYNC_MASK) |
330462306a36Sopenharmony_ci					   (unsigned char)SYNC_SUPPORTED);
330562306a36Sopenharmony_ci	}
330662306a36Sopenharmony_ci}
330762306a36Sopenharmony_ci
330862306a36Sopenharmony_ci/*---------------------------------------------------------------------
330962306a36Sopenharmony_ci *
331062306a36Sopenharmony_ci * Function: FPT_sisyncr
331162306a36Sopenharmony_ci *
331262306a36Sopenharmony_ci * Description: Answer the targets sync message.
331362306a36Sopenharmony_ci *
331462306a36Sopenharmony_ci *---------------------------------------------------------------------*/
331562306a36Sopenharmony_cistatic void FPT_sisyncr(u32 port, unsigned char sync_pulse,
331662306a36Sopenharmony_ci			unsigned char offset)
331762306a36Sopenharmony_ci{
331862306a36Sopenharmony_ci	ARAM_ACCESS(port);
331962306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 0),
332062306a36Sopenharmony_ci		    (MPM_OP + AMSG_OUT + EXTENDED_MESSAGE));
332162306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
332262306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 4),
332362306a36Sopenharmony_ci		    (MPM_OP + AMSG_OUT + EXTENDED_SDTR));
332462306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 6), (MPM_OP + AMSG_OUT + sync_pulse));
332562306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
332662306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 10), (MPM_OP + AMSG_OUT + offset));
332762306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
332862306a36Sopenharmony_ci	SGRAM_ACCESS(port);
332962306a36Sopenharmony_ci
333062306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
333162306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
333262306a36Sopenharmony_ci
333362306a36Sopenharmony_ci	WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
333462306a36Sopenharmony_ci
333562306a36Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
333662306a36Sopenharmony_ci	}
333762306a36Sopenharmony_ci}
333862306a36Sopenharmony_ci
333962306a36Sopenharmony_ci/*---------------------------------------------------------------------
334062306a36Sopenharmony_ci *
334162306a36Sopenharmony_ci * Function: FPT_siwidn
334262306a36Sopenharmony_ci *
334362306a36Sopenharmony_ci * Description: Read in a message byte from the SCSI bus, and check
334462306a36Sopenharmony_ci *              for a parity error.
334562306a36Sopenharmony_ci *
334662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
334762306a36Sopenharmony_ci
334862306a36Sopenharmony_cistatic unsigned char FPT_siwidn(u32 port, unsigned char p_card)
334962306a36Sopenharmony_ci{
335062306a36Sopenharmony_ci	struct sccb *currSCCB;
335162306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
335262306a36Sopenharmony_ci
335362306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
335462306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
335562306a36Sopenharmony_ci
335662306a36Sopenharmony_ci	if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
335762306a36Sopenharmony_ci
335862306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT),
335962306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT +
336062306a36Sopenharmony_ci			     (currSCCB->
336162306a36Sopenharmony_ci			      Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
336262306a36Sopenharmony_ci
336362306a36Sopenharmony_ci		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
336462306a36Sopenharmony_ci
336562306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 0),
336662306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT + EXTENDED_MESSAGE));
336762306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
336862306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 4),
336962306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT + EXTENDED_WDTR));
337062306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
337162306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 8),
337262306a36Sopenharmony_ci			    (MPM_OP + AMSG_OUT + SM16BIT));
337362306a36Sopenharmony_ci		WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
337462306a36Sopenharmony_ci
337562306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
337662306a36Sopenharmony_ci
337762306a36Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
337862306a36Sopenharmony_ci					    ~(unsigned char)TAR_WIDE_MASK) |
337962306a36Sopenharmony_ci					   (unsigned char)WIDE_ENABLED);
338062306a36Sopenharmony_ci
338162306a36Sopenharmony_ci		return 1;
338262306a36Sopenharmony_ci	}
338362306a36Sopenharmony_ci
338462306a36Sopenharmony_ci	else {
338562306a36Sopenharmony_ci
338662306a36Sopenharmony_ci		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
338762306a36Sopenharmony_ci					    ~(unsigned char)TAR_WIDE_MASK) |
338862306a36Sopenharmony_ci					   WIDE_NEGOCIATED);
338962306a36Sopenharmony_ci
339062306a36Sopenharmony_ci		currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
339162306a36Sopenharmony_ci		return 0;
339262306a36Sopenharmony_ci	}
339362306a36Sopenharmony_ci}
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_ci/*---------------------------------------------------------------------
339662306a36Sopenharmony_ci *
339762306a36Sopenharmony_ci * Function: FPT_stwidn
339862306a36Sopenharmony_ci *
339962306a36Sopenharmony_ci * Description: The has sent us a Wide Nego message so handle it as
340062306a36Sopenharmony_ci *              necessary.
340162306a36Sopenharmony_ci *
340262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
340362306a36Sopenharmony_cistatic void FPT_stwidn(u32 port, unsigned char p_card)
340462306a36Sopenharmony_ci{
340562306a36Sopenharmony_ci	unsigned char width;
340662306a36Sopenharmony_ci	struct sccb *currSCCB;
340762306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
340862306a36Sopenharmony_ci
340962306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
341062306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
341162306a36Sopenharmony_ci
341262306a36Sopenharmony_ci	width = FPT_sfm(port, currSCCB);
341362306a36Sopenharmony_ci
341462306a36Sopenharmony_ci	if ((width == 0x00) && (currSCCB->Sccb_scsimsg == MSG_PARITY_ERROR)) {
341562306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
341662306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
341762306a36Sopenharmony_ci		return;
341862306a36Sopenharmony_ci	}
341962306a36Sopenharmony_ci
342062306a36Sopenharmony_ci	if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
342162306a36Sopenharmony_ci		width = 0;
342262306a36Sopenharmony_ci
342362306a36Sopenharmony_ci	if (width) {
342462306a36Sopenharmony_ci		currTar_Info->TarStatus |= WIDE_ENABLED;
342562306a36Sopenharmony_ci		width = 0;
342662306a36Sopenharmony_ci	} else {
342762306a36Sopenharmony_ci		width = NARROW_SCSI;
342862306a36Sopenharmony_ci		currTar_Info->TarStatus &= ~WIDE_ENABLED;
342962306a36Sopenharmony_ci	}
343062306a36Sopenharmony_ci
343162306a36Sopenharmony_ci	FPT_sssyncv(port, currSCCB->TargID, width, currTar_Info);
343262306a36Sopenharmony_ci
343362306a36Sopenharmony_ci	if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
343462306a36Sopenharmony_ci
343562306a36Sopenharmony_ci		currTar_Info->TarStatus |= WIDE_NEGOCIATED;
343662306a36Sopenharmony_ci
343762306a36Sopenharmony_ci		if (!
343862306a36Sopenharmony_ci		    ((currTar_Info->TarStatus & TAR_SYNC_MASK) ==
343962306a36Sopenharmony_ci		     SYNC_SUPPORTED)) {
344062306a36Sopenharmony_ci			ACCEPT_MSG_ATN(port);
344162306a36Sopenharmony_ci			ARAM_ACCESS(port);
344262306a36Sopenharmony_ci			FPT_sisyncn(port, p_card, 1);
344362306a36Sopenharmony_ci			currSCCB->Sccb_scsistat = SELECT_SN_ST;
344462306a36Sopenharmony_ci			SGRAM_ACCESS(port);
344562306a36Sopenharmony_ci		} else {
344662306a36Sopenharmony_ci			ACCEPT_MSG(port);
344762306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
344862306a36Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
344962306a36Sopenharmony_ci		}
345062306a36Sopenharmony_ci	}
345162306a36Sopenharmony_ci
345262306a36Sopenharmony_ci	else {
345362306a36Sopenharmony_ci
345462306a36Sopenharmony_ci		ACCEPT_MSG_ATN(port);
345562306a36Sopenharmony_ci
345662306a36Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
345762306a36Sopenharmony_ci			width = SM16BIT;
345862306a36Sopenharmony_ci		else
345962306a36Sopenharmony_ci			width = SM8BIT;
346062306a36Sopenharmony_ci
346162306a36Sopenharmony_ci		FPT_siwidr(port, width);
346262306a36Sopenharmony_ci
346362306a36Sopenharmony_ci		currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
346462306a36Sopenharmony_ci	}
346562306a36Sopenharmony_ci}
346662306a36Sopenharmony_ci
346762306a36Sopenharmony_ci/*---------------------------------------------------------------------
346862306a36Sopenharmony_ci *
346962306a36Sopenharmony_ci * Function: FPT_siwidr
347062306a36Sopenharmony_ci *
347162306a36Sopenharmony_ci * Description: Answer the targets Wide nego message.
347262306a36Sopenharmony_ci *
347362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
347462306a36Sopenharmony_cistatic void FPT_siwidr(u32 port, unsigned char width)
347562306a36Sopenharmony_ci{
347662306a36Sopenharmony_ci	ARAM_ACCESS(port);
347762306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 0),
347862306a36Sopenharmony_ci		    (MPM_OP + AMSG_OUT + EXTENDED_MESSAGE));
347962306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
348062306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 4),
348162306a36Sopenharmony_ci		    (MPM_OP + AMSG_OUT + EXTENDED_WDTR));
348262306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
348362306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 8), (MPM_OP + AMSG_OUT + width));
348462306a36Sopenharmony_ci	WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
348562306a36Sopenharmony_ci	SGRAM_ACCESS(port);
348662306a36Sopenharmony_ci
348762306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
348862306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
348962306a36Sopenharmony_ci
349062306a36Sopenharmony_ci	WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
349162306a36Sopenharmony_ci
349262306a36Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
349362306a36Sopenharmony_ci	}
349462306a36Sopenharmony_ci}
349562306a36Sopenharmony_ci
349662306a36Sopenharmony_ci/*---------------------------------------------------------------------
349762306a36Sopenharmony_ci *
349862306a36Sopenharmony_ci * Function: FPT_sssyncv
349962306a36Sopenharmony_ci *
350062306a36Sopenharmony_ci * Description: Write the desired value to the Sync Register for the
350162306a36Sopenharmony_ci *              ID specified.
350262306a36Sopenharmony_ci *
350362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
350462306a36Sopenharmony_cistatic void FPT_sssyncv(u32 p_port, unsigned char p_id,
350562306a36Sopenharmony_ci			unsigned char p_sync_value,
350662306a36Sopenharmony_ci			struct sccb_mgr_tar_info *currTar_Info)
350762306a36Sopenharmony_ci{
350862306a36Sopenharmony_ci	unsigned char index;
350962306a36Sopenharmony_ci
351062306a36Sopenharmony_ci	index = p_id;
351162306a36Sopenharmony_ci
351262306a36Sopenharmony_ci	switch (index) {
351362306a36Sopenharmony_ci
351462306a36Sopenharmony_ci	case 0:
351562306a36Sopenharmony_ci		index = 12;	/* hp_synctarg_0 */
351662306a36Sopenharmony_ci		break;
351762306a36Sopenharmony_ci	case 1:
351862306a36Sopenharmony_ci		index = 13;	/* hp_synctarg_1 */
351962306a36Sopenharmony_ci		break;
352062306a36Sopenharmony_ci	case 2:
352162306a36Sopenharmony_ci		index = 14;	/* hp_synctarg_2 */
352262306a36Sopenharmony_ci		break;
352362306a36Sopenharmony_ci	case 3:
352462306a36Sopenharmony_ci		index = 15;	/* hp_synctarg_3 */
352562306a36Sopenharmony_ci		break;
352662306a36Sopenharmony_ci	case 4:
352762306a36Sopenharmony_ci		index = 8;	/* hp_synctarg_4 */
352862306a36Sopenharmony_ci		break;
352962306a36Sopenharmony_ci	case 5:
353062306a36Sopenharmony_ci		index = 9;	/* hp_synctarg_5 */
353162306a36Sopenharmony_ci		break;
353262306a36Sopenharmony_ci	case 6:
353362306a36Sopenharmony_ci		index = 10;	/* hp_synctarg_6 */
353462306a36Sopenharmony_ci		break;
353562306a36Sopenharmony_ci	case 7:
353662306a36Sopenharmony_ci		index = 11;	/* hp_synctarg_7 */
353762306a36Sopenharmony_ci		break;
353862306a36Sopenharmony_ci	case 8:
353962306a36Sopenharmony_ci		index = 4;	/* hp_synctarg_8 */
354062306a36Sopenharmony_ci		break;
354162306a36Sopenharmony_ci	case 9:
354262306a36Sopenharmony_ci		index = 5;	/* hp_synctarg_9 */
354362306a36Sopenharmony_ci		break;
354462306a36Sopenharmony_ci	case 10:
354562306a36Sopenharmony_ci		index = 6;	/* hp_synctarg_10 */
354662306a36Sopenharmony_ci		break;
354762306a36Sopenharmony_ci	case 11:
354862306a36Sopenharmony_ci		index = 7;	/* hp_synctarg_11 */
354962306a36Sopenharmony_ci		break;
355062306a36Sopenharmony_ci	case 12:
355162306a36Sopenharmony_ci		index = 0;	/* hp_synctarg_12 */
355262306a36Sopenharmony_ci		break;
355362306a36Sopenharmony_ci	case 13:
355462306a36Sopenharmony_ci		index = 1;	/* hp_synctarg_13 */
355562306a36Sopenharmony_ci		break;
355662306a36Sopenharmony_ci	case 14:
355762306a36Sopenharmony_ci		index = 2;	/* hp_synctarg_14 */
355862306a36Sopenharmony_ci		break;
355962306a36Sopenharmony_ci	case 15:
356062306a36Sopenharmony_ci		index = 3;	/* hp_synctarg_15 */
356162306a36Sopenharmony_ci
356262306a36Sopenharmony_ci	}
356362306a36Sopenharmony_ci
356462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_synctarg_base + index, p_sync_value);
356562306a36Sopenharmony_ci
356662306a36Sopenharmony_ci	currTar_Info->TarSyncCtrl = p_sync_value;
356762306a36Sopenharmony_ci}
356862306a36Sopenharmony_ci
356962306a36Sopenharmony_ci/*---------------------------------------------------------------------
357062306a36Sopenharmony_ci *
357162306a36Sopenharmony_ci * Function: FPT_sresb
357262306a36Sopenharmony_ci *
357362306a36Sopenharmony_ci * Description: Reset the desired card's SCSI bus.
357462306a36Sopenharmony_ci *
357562306a36Sopenharmony_ci *---------------------------------------------------------------------*/
357662306a36Sopenharmony_cistatic void FPT_sresb(u32 port, unsigned char p_card)
357762306a36Sopenharmony_ci{
357862306a36Sopenharmony_ci	unsigned char scsiID, i;
357962306a36Sopenharmony_ci
358062306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
358162306a36Sopenharmony_ci
358262306a36Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl,
358362306a36Sopenharmony_ci		   (RD_HARPOON(port + hp_page_ctrl) | G_INT_DISABLE));
358462306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
358562306a36Sopenharmony_ci
358662306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsictrl_0, SCSI_RST);
358762306a36Sopenharmony_ci
358862306a36Sopenharmony_ci	scsiID = RD_HARPOON(port + hp_seltimeout);
358962306a36Sopenharmony_ci	WR_HARPOON(port + hp_seltimeout, TO_5ms);
359062306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), TIMEOUT);
359162306a36Sopenharmony_ci
359262306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT | START_TO));
359362306a36Sopenharmony_ci
359462306a36Sopenharmony_ci	while (!(RDW_HARPOON((port + hp_intstat)) & TIMEOUT)) {
359562306a36Sopenharmony_ci	}
359662306a36Sopenharmony_ci
359762306a36Sopenharmony_ci	WR_HARPOON(port + hp_seltimeout, scsiID);
359862306a36Sopenharmony_ci
359962306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
360062306a36Sopenharmony_ci
360162306a36Sopenharmony_ci	FPT_Wait(port, TO_5ms);
360262306a36Sopenharmony_ci
360362306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
360462306a36Sopenharmony_ci
360562306a36Sopenharmony_ci	WR_HARPOON(port + hp_int_mask, (RD_HARPOON(port + hp_int_mask) | 0x00));
360662306a36Sopenharmony_ci
360762306a36Sopenharmony_ci	for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
360862306a36Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
360962306a36Sopenharmony_ci
361062306a36Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
361162306a36Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
361262306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
361362306a36Sopenharmony_ci		}
361462306a36Sopenharmony_ci
361562306a36Sopenharmony_ci		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
361662306a36Sopenharmony_ci			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
361762306a36Sopenharmony_ci		}
361862306a36Sopenharmony_ci
361962306a36Sopenharmony_ci		FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
362062306a36Sopenharmony_ci
362162306a36Sopenharmony_ci		FPT_SccbMgrTableInitTarget(p_card, scsiID);
362262306a36Sopenharmony_ci	}
362362306a36Sopenharmony_ci
362462306a36Sopenharmony_ci	FPT_BL_Card[p_card].scanIndex = 0x00;
362562306a36Sopenharmony_ci	FPT_BL_Card[p_card].currentSCCB = NULL;
362662306a36Sopenharmony_ci	FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT
362762306a36Sopenharmony_ci					     | F_NEW_SCCB_CMD);
362862306a36Sopenharmony_ci	FPT_BL_Card[p_card].cmdCounter = 0x00;
362962306a36Sopenharmony_ci	FPT_BL_Card[p_card].discQCount = 0x00;
363062306a36Sopenharmony_ci	FPT_BL_Card[p_card].tagQ_Lst = 0x01;
363162306a36Sopenharmony_ci
363262306a36Sopenharmony_ci	for (i = 0; i < QUEUE_DEPTH; i++)
363362306a36Sopenharmony_ci		FPT_BL_Card[p_card].discQ_Tbl[i] = NULL;
363462306a36Sopenharmony_ci
363562306a36Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl,
363662306a36Sopenharmony_ci		   (RD_HARPOON(port + hp_page_ctrl) & ~G_INT_DISABLE));
363762306a36Sopenharmony_ci
363862306a36Sopenharmony_ci}
363962306a36Sopenharmony_ci
364062306a36Sopenharmony_ci/*---------------------------------------------------------------------
364162306a36Sopenharmony_ci *
364262306a36Sopenharmony_ci * Function: FPT_ssenss
364362306a36Sopenharmony_ci *
364462306a36Sopenharmony_ci * Description: Setup for the Auto Sense command.
364562306a36Sopenharmony_ci *
364662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
364762306a36Sopenharmony_cistatic void FPT_ssenss(struct sccb_card *pCurrCard)
364862306a36Sopenharmony_ci{
364962306a36Sopenharmony_ci	unsigned char i;
365062306a36Sopenharmony_ci	struct sccb *currSCCB;
365162306a36Sopenharmony_ci
365262306a36Sopenharmony_ci	currSCCB = pCurrCard->currentSCCB;
365362306a36Sopenharmony_ci
365462306a36Sopenharmony_ci	currSCCB->Save_CdbLen = currSCCB->CdbLength;
365562306a36Sopenharmony_ci
365662306a36Sopenharmony_ci	for (i = 0; i < 6; i++) {
365762306a36Sopenharmony_ci
365862306a36Sopenharmony_ci		currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
365962306a36Sopenharmony_ci	}
366062306a36Sopenharmony_ci
366162306a36Sopenharmony_ci	currSCCB->CdbLength = SIX_BYTE_CMD;
366262306a36Sopenharmony_ci	currSCCB->Cdb[0] = REQUEST_SENSE;
366362306a36Sopenharmony_ci	currSCCB->Cdb[1] = currSCCB->Cdb[1] & (unsigned char)0xE0;	/*Keep LUN. */
366462306a36Sopenharmony_ci	currSCCB->Cdb[2] = 0x00;
366562306a36Sopenharmony_ci	currSCCB->Cdb[3] = 0x00;
366662306a36Sopenharmony_ci	currSCCB->Cdb[4] = currSCCB->RequestSenseLength;
366762306a36Sopenharmony_ci	currSCCB->Cdb[5] = 0x00;
366862306a36Sopenharmony_ci
366962306a36Sopenharmony_ci	currSCCB->Sccb_XferCnt = (u32)currSCCB->RequestSenseLength;
367062306a36Sopenharmony_ci
367162306a36Sopenharmony_ci	currSCCB->Sccb_ATC = 0x00;
367262306a36Sopenharmony_ci
367362306a36Sopenharmony_ci	currSCCB->Sccb_XferState |= F_AUTO_SENSE;
367462306a36Sopenharmony_ci
367562306a36Sopenharmony_ci	currSCCB->Sccb_XferState &= ~F_SG_XFER;
367662306a36Sopenharmony_ci
367762306a36Sopenharmony_ci	currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(unsigned char)DISC_PRIV;
367862306a36Sopenharmony_ci
367962306a36Sopenharmony_ci	currSCCB->ControlByte = 0x00;
368062306a36Sopenharmony_ci
368162306a36Sopenharmony_ci	currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
368262306a36Sopenharmony_ci}
368362306a36Sopenharmony_ci
368462306a36Sopenharmony_ci/*---------------------------------------------------------------------
368562306a36Sopenharmony_ci *
368662306a36Sopenharmony_ci * Function: FPT_sxfrp
368762306a36Sopenharmony_ci *
368862306a36Sopenharmony_ci * Description: Transfer data into the bit bucket until the device
368962306a36Sopenharmony_ci *              decides to switch phase.
369062306a36Sopenharmony_ci *
369162306a36Sopenharmony_ci *---------------------------------------------------------------------*/
369262306a36Sopenharmony_ci
369362306a36Sopenharmony_cistatic void FPT_sxfrp(u32 p_port, unsigned char p_card)
369462306a36Sopenharmony_ci{
369562306a36Sopenharmony_ci	unsigned char curr_phz;
369662306a36Sopenharmony_ci
369762306a36Sopenharmony_ci	DISABLE_AUTO(p_port);
369862306a36Sopenharmony_ci
369962306a36Sopenharmony_ci	if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
370062306a36Sopenharmony_ci
370162306a36Sopenharmony_ci		FPT_hostDataXferAbort(p_port, p_card,
370262306a36Sopenharmony_ci				      FPT_BL_Card[p_card].currentSCCB);
370362306a36Sopenharmony_ci
370462306a36Sopenharmony_ci	}
370562306a36Sopenharmony_ci
370662306a36Sopenharmony_ci	/* If the Automation handled the end of the transfer then do not
370762306a36Sopenharmony_ci	   match the phase or we will get out of sync with the ISR.       */
370862306a36Sopenharmony_ci
370962306a36Sopenharmony_ci	if (RDW_HARPOON((p_port + hp_intstat)) &
371062306a36Sopenharmony_ci	    (BUS_FREE | XFER_CNT_0 | AUTO_INT))
371162306a36Sopenharmony_ci		return;
371262306a36Sopenharmony_ci
371362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_xfercnt_0, 0x00);
371462306a36Sopenharmony_ci
371562306a36Sopenharmony_ci	curr_phz = RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ;
371662306a36Sopenharmony_ci
371762306a36Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), XFER_CNT_0);
371862306a36Sopenharmony_ci
371962306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, curr_phz);
372062306a36Sopenharmony_ci
372162306a36Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET)) &&
372262306a36Sopenharmony_ci	       (curr_phz ==
372362306a36Sopenharmony_ci		(RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ)))
372462306a36Sopenharmony_ci	{
372562306a36Sopenharmony_ci		if (curr_phz & (unsigned char)SCSI_IOBIT) {
372662306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_portctrl_0,
372762306a36Sopenharmony_ci				   (SCSI_PORT | HOST_PORT | SCSI_INBIT));
372862306a36Sopenharmony_ci
372962306a36Sopenharmony_ci			if (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
373062306a36Sopenharmony_ci				RD_HARPOON(p_port + hp_fifodata_0);
373162306a36Sopenharmony_ci			}
373262306a36Sopenharmony_ci		} else {
373362306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_portctrl_0,
373462306a36Sopenharmony_ci				   (SCSI_PORT | HOST_PORT | HOST_WRT));
373562306a36Sopenharmony_ci			if (RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY) {
373662306a36Sopenharmony_ci				WR_HARPOON(p_port + hp_fifodata_0, 0xFA);
373762306a36Sopenharmony_ci			}
373862306a36Sopenharmony_ci		}
373962306a36Sopenharmony_ci	}			/* End of While loop for padding data I/O phase */
374062306a36Sopenharmony_ci
374162306a36Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
374262306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ)
374362306a36Sopenharmony_ci			break;
374462306a36Sopenharmony_ci	}
374562306a36Sopenharmony_ci
374662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0,
374762306a36Sopenharmony_ci		   (SCSI_PORT | HOST_PORT | SCSI_INBIT));
374862306a36Sopenharmony_ci	while (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
374962306a36Sopenharmony_ci		RD_HARPOON(p_port + hp_fifodata_0);
375062306a36Sopenharmony_ci	}
375162306a36Sopenharmony_ci
375262306a36Sopenharmony_ci	if (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
375362306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_autostart_0,
375462306a36Sopenharmony_ci			   (AUTO_IMMED + DISCONNECT_START));
375562306a36Sopenharmony_ci		while (!(RDW_HARPOON((p_port + hp_intstat)) & AUTO_INT)) {
375662306a36Sopenharmony_ci		}
375762306a36Sopenharmony_ci
375862306a36Sopenharmony_ci		if (RDW_HARPOON((p_port + hp_intstat)) &
375962306a36Sopenharmony_ci		    (ICMD_COMP | ITAR_DISC))
376062306a36Sopenharmony_ci			while (!
376162306a36Sopenharmony_ci			       (RDW_HARPOON((p_port + hp_intstat)) &
376262306a36Sopenharmony_ci				(BUS_FREE | RSEL))) ;
376362306a36Sopenharmony_ci	}
376462306a36Sopenharmony_ci}
376562306a36Sopenharmony_ci
376662306a36Sopenharmony_ci/*---------------------------------------------------------------------
376762306a36Sopenharmony_ci *
376862306a36Sopenharmony_ci * Function: FPT_schkdd
376962306a36Sopenharmony_ci *
377062306a36Sopenharmony_ci * Description: Make sure data has been flushed from both FIFOs and abort
377162306a36Sopenharmony_ci *              the operations if necessary.
377262306a36Sopenharmony_ci *
377362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
377462306a36Sopenharmony_ci
377562306a36Sopenharmony_cistatic void FPT_schkdd(u32 port, unsigned char p_card)
377662306a36Sopenharmony_ci{
377762306a36Sopenharmony_ci	unsigned short TimeOutLoop;
377862306a36Sopenharmony_ci	unsigned char sPhase;
377962306a36Sopenharmony_ci
378062306a36Sopenharmony_ci	struct sccb *currSCCB;
378162306a36Sopenharmony_ci
378262306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
378362306a36Sopenharmony_ci
378462306a36Sopenharmony_ci	if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
378562306a36Sopenharmony_ci	    (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
378662306a36Sopenharmony_ci		return;
378762306a36Sopenharmony_ci	}
378862306a36Sopenharmony_ci
378962306a36Sopenharmony_ci	if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT) {
379062306a36Sopenharmony_ci
379162306a36Sopenharmony_ci		currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - 1);
379262306a36Sopenharmony_ci
379362306a36Sopenharmony_ci		currSCCB->Sccb_XferCnt = 1;
379462306a36Sopenharmony_ci
379562306a36Sopenharmony_ci		currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
379662306a36Sopenharmony_ci		WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
379762306a36Sopenharmony_ci		WR_HARPOON(port + hp_xferstat, 0x00);
379862306a36Sopenharmony_ci	}
379962306a36Sopenharmony_ci
380062306a36Sopenharmony_ci	else {
380162306a36Sopenharmony_ci
380262306a36Sopenharmony_ci		currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
380362306a36Sopenharmony_ci
380462306a36Sopenharmony_ci		currSCCB->Sccb_XferCnt = 0;
380562306a36Sopenharmony_ci	}
380662306a36Sopenharmony_ci
380762306a36Sopenharmony_ci	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
380862306a36Sopenharmony_ci	    (currSCCB->HostStatus == SCCB_COMPLETE)) {
380962306a36Sopenharmony_ci
381062306a36Sopenharmony_ci		currSCCB->HostStatus = SCCB_PARITY_ERR;
381162306a36Sopenharmony_ci		WRW_HARPOON((port + hp_intstat), PARITY);
381262306a36Sopenharmony_ci	}
381362306a36Sopenharmony_ci
381462306a36Sopenharmony_ci	FPT_hostDataXferAbort(port, p_card, currSCCB);
381562306a36Sopenharmony_ci
381662306a36Sopenharmony_ci	while (RD_HARPOON(port + hp_scsisig) & SCSI_ACK) {
381762306a36Sopenharmony_ci	}
381862306a36Sopenharmony_ci
381962306a36Sopenharmony_ci	TimeOutLoop = 0;
382062306a36Sopenharmony_ci
382162306a36Sopenharmony_ci	while (RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY) {
382262306a36Sopenharmony_ci		if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
382362306a36Sopenharmony_ci			return;
382462306a36Sopenharmony_ci		}
382562306a36Sopenharmony_ci		if (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) {
382662306a36Sopenharmony_ci			break;
382762306a36Sopenharmony_ci		}
382862306a36Sopenharmony_ci		if (RDW_HARPOON((port + hp_intstat)) & RESET) {
382962306a36Sopenharmony_ci			return;
383062306a36Sopenharmony_ci		}
383162306a36Sopenharmony_ci		if ((RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
383262306a36Sopenharmony_ci		    || (TimeOutLoop++ > 0x3000))
383362306a36Sopenharmony_ci			break;
383462306a36Sopenharmony_ci	}
383562306a36Sopenharmony_ci
383662306a36Sopenharmony_ci	sPhase = RD_HARPOON(port + hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
383762306a36Sopenharmony_ci	if ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) ||
383862306a36Sopenharmony_ci	    (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) ||
383962306a36Sopenharmony_ci	    (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
384062306a36Sopenharmony_ci	    (sPhase == (SCSI_BSY | S_DATAI_PH))) {
384162306a36Sopenharmony_ci
384262306a36Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
384362306a36Sopenharmony_ci
384462306a36Sopenharmony_ci		if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED)) {
384562306a36Sopenharmony_ci			if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
384662306a36Sopenharmony_ci				FPT_phaseDataIn(port, p_card);
384762306a36Sopenharmony_ci			}
384862306a36Sopenharmony_ci
384962306a36Sopenharmony_ci			else {
385062306a36Sopenharmony_ci				FPT_phaseDataOut(port, p_card);
385162306a36Sopenharmony_ci			}
385262306a36Sopenharmony_ci		} else {
385362306a36Sopenharmony_ci			FPT_sxfrp(port, p_card);
385462306a36Sopenharmony_ci			if (!(RDW_HARPOON((port + hp_intstat)) &
385562306a36Sopenharmony_ci			      (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET))) {
385662306a36Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), AUTO_INT);
385762306a36Sopenharmony_ci				FPT_phaseDecode(port, p_card);
385862306a36Sopenharmony_ci			}
385962306a36Sopenharmony_ci		}
386062306a36Sopenharmony_ci
386162306a36Sopenharmony_ci	}
386262306a36Sopenharmony_ci
386362306a36Sopenharmony_ci	else {
386462306a36Sopenharmony_ci		WR_HARPOON(port + hp_portctrl_0, 0x00);
386562306a36Sopenharmony_ci	}
386662306a36Sopenharmony_ci}
386762306a36Sopenharmony_ci
386862306a36Sopenharmony_ci/*---------------------------------------------------------------------
386962306a36Sopenharmony_ci *
387062306a36Sopenharmony_ci * Function: FPT_sinits
387162306a36Sopenharmony_ci *
387262306a36Sopenharmony_ci * Description: Setup SCCB manager fields in this SCCB.
387362306a36Sopenharmony_ci *
387462306a36Sopenharmony_ci *---------------------------------------------------------------------*/
387562306a36Sopenharmony_ci
387662306a36Sopenharmony_cistatic void FPT_sinits(struct sccb *p_sccb, unsigned char p_card)
387762306a36Sopenharmony_ci{
387862306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
387962306a36Sopenharmony_ci
388062306a36Sopenharmony_ci	if ((p_sccb->TargID >= MAX_SCSI_TAR) || (p_sccb->Lun >= MAX_LUN)) {
388162306a36Sopenharmony_ci		return;
388262306a36Sopenharmony_ci	}
388362306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
388462306a36Sopenharmony_ci
388562306a36Sopenharmony_ci	p_sccb->Sccb_XferState = 0x00;
388662306a36Sopenharmony_ci	p_sccb->Sccb_XferCnt = p_sccb->DataLength;
388762306a36Sopenharmony_ci
388862306a36Sopenharmony_ci	if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
388962306a36Sopenharmony_ci	    (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
389062306a36Sopenharmony_ci
389162306a36Sopenharmony_ci		p_sccb->Sccb_SGoffset = 0;
389262306a36Sopenharmony_ci		p_sccb->Sccb_XferState = F_SG_XFER;
389362306a36Sopenharmony_ci		p_sccb->Sccb_XferCnt = 0x00;
389462306a36Sopenharmony_ci	}
389562306a36Sopenharmony_ci
389662306a36Sopenharmony_ci	if (p_sccb->DataLength == 0x00)
389762306a36Sopenharmony_ci
389862306a36Sopenharmony_ci		p_sccb->Sccb_XferState |= F_ALL_XFERRED;
389962306a36Sopenharmony_ci
390062306a36Sopenharmony_ci	if (p_sccb->ControlByte & F_USE_CMD_Q) {
390162306a36Sopenharmony_ci		if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
390262306a36Sopenharmony_ci			p_sccb->ControlByte &= ~F_USE_CMD_Q;
390362306a36Sopenharmony_ci
390462306a36Sopenharmony_ci		else
390562306a36Sopenharmony_ci			currTar_Info->TarStatus |= TAG_Q_TRYING;
390662306a36Sopenharmony_ci	}
390762306a36Sopenharmony_ci
390862306a36Sopenharmony_ci/*      For !single SCSI device in system  & device allow Disconnect
390962306a36Sopenharmony_ci	or command is tag_q type then send Cmd with Disconnect Enable
391062306a36Sopenharmony_ci	else send Cmd with Disconnect Disable */
391162306a36Sopenharmony_ci
391262306a36Sopenharmony_ci/*
391362306a36Sopenharmony_ci   if (((!(FPT_BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
391462306a36Sopenharmony_ci      (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
391562306a36Sopenharmony_ci      (currTar_Info->TarStatus & TAG_Q_TRYING)) {
391662306a36Sopenharmony_ci*/
391762306a36Sopenharmony_ci	if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
391862306a36Sopenharmony_ci	    (currTar_Info->TarStatus & TAG_Q_TRYING)) {
391962306a36Sopenharmony_ci		p_sccb->Sccb_idmsg = IDENTIFY(true, p_sccb->Lun);
392062306a36Sopenharmony_ci	} else {
392162306a36Sopenharmony_ci		p_sccb->Sccb_idmsg = IDENTIFY(false, p_sccb->Lun);
392262306a36Sopenharmony_ci	}
392362306a36Sopenharmony_ci
392462306a36Sopenharmony_ci	p_sccb->HostStatus = 0x00;
392562306a36Sopenharmony_ci	p_sccb->TargetStatus = 0x00;
392662306a36Sopenharmony_ci	p_sccb->Sccb_tag = 0x00;
392762306a36Sopenharmony_ci	p_sccb->Sccb_MGRFlags = 0x00;
392862306a36Sopenharmony_ci	p_sccb->Sccb_sgseg = 0x00;
392962306a36Sopenharmony_ci	p_sccb->Sccb_ATC = 0x00;
393062306a36Sopenharmony_ci	p_sccb->Sccb_savedATC = 0x00;
393162306a36Sopenharmony_ci/*
393262306a36Sopenharmony_ci   p_sccb->SccbVirtDataPtr    = 0x00;
393362306a36Sopenharmony_ci   p_sccb->Sccb_forwardlink   = NULL;
393462306a36Sopenharmony_ci   p_sccb->Sccb_backlink      = NULL;
393562306a36Sopenharmony_ci */
393662306a36Sopenharmony_ci	p_sccb->Sccb_scsistat = BUS_FREE_ST;
393762306a36Sopenharmony_ci	p_sccb->SccbStatus = SCCB_IN_PROCESS;
393862306a36Sopenharmony_ci	p_sccb->Sccb_scsimsg = NOP;
393962306a36Sopenharmony_ci
394062306a36Sopenharmony_ci}
394162306a36Sopenharmony_ci
394262306a36Sopenharmony_ci/*---------------------------------------------------------------------
394362306a36Sopenharmony_ci *
394462306a36Sopenharmony_ci * Function: Phase Decode
394562306a36Sopenharmony_ci *
394662306a36Sopenharmony_ci * Description: Determine the phase and call the appropriate function.
394762306a36Sopenharmony_ci *
394862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
394962306a36Sopenharmony_ci
395062306a36Sopenharmony_cistatic void FPT_phaseDecode(u32 p_port, unsigned char p_card)
395162306a36Sopenharmony_ci{
395262306a36Sopenharmony_ci	unsigned char phase_ref;
395362306a36Sopenharmony_ci	void (*phase) (u32, unsigned char);
395462306a36Sopenharmony_ci
395562306a36Sopenharmony_ci	DISABLE_AUTO(p_port);
395662306a36Sopenharmony_ci
395762306a36Sopenharmony_ci	phase_ref =
395862306a36Sopenharmony_ci	    (unsigned char)(RD_HARPOON(p_port + hp_scsisig) & S_SCSI_PHZ);
395962306a36Sopenharmony_ci
396062306a36Sopenharmony_ci	phase = FPT_s_PhaseTbl[phase_ref];
396162306a36Sopenharmony_ci
396262306a36Sopenharmony_ci	(*phase) (p_port, p_card);	/* Call the correct phase func */
396362306a36Sopenharmony_ci}
396462306a36Sopenharmony_ci
396562306a36Sopenharmony_ci/*---------------------------------------------------------------------
396662306a36Sopenharmony_ci *
396762306a36Sopenharmony_ci * Function: Data Out Phase
396862306a36Sopenharmony_ci *
396962306a36Sopenharmony_ci * Description: Start up both the BusMaster and Xbow.
397062306a36Sopenharmony_ci *
397162306a36Sopenharmony_ci *---------------------------------------------------------------------*/
397262306a36Sopenharmony_ci
397362306a36Sopenharmony_cistatic void FPT_phaseDataOut(u32 port, unsigned char p_card)
397462306a36Sopenharmony_ci{
397562306a36Sopenharmony_ci
397662306a36Sopenharmony_ci	struct sccb *currSCCB;
397762306a36Sopenharmony_ci
397862306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
397962306a36Sopenharmony_ci	if (currSCCB == NULL) {
398062306a36Sopenharmony_ci		return;		/* Exit if No SCCB record */
398162306a36Sopenharmony_ci	}
398262306a36Sopenharmony_ci
398362306a36Sopenharmony_ci	currSCCB->Sccb_scsistat = DATA_OUT_ST;
398462306a36Sopenharmony_ci	currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
398562306a36Sopenharmony_ci
398662306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
398762306a36Sopenharmony_ci
398862306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
398962306a36Sopenharmony_ci
399062306a36Sopenharmony_ci	WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
399162306a36Sopenharmony_ci
399262306a36Sopenharmony_ci	FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
399362306a36Sopenharmony_ci
399462306a36Sopenharmony_ci	if (currSCCB->Sccb_XferCnt == 0) {
399562306a36Sopenharmony_ci
399662306a36Sopenharmony_ci		if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
399762306a36Sopenharmony_ci		    (currSCCB->HostStatus == SCCB_COMPLETE))
399862306a36Sopenharmony_ci			currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
399962306a36Sopenharmony_ci
400062306a36Sopenharmony_ci		FPT_sxfrp(port, p_card);
400162306a36Sopenharmony_ci		if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
400262306a36Sopenharmony_ci			FPT_phaseDecode(port, p_card);
400362306a36Sopenharmony_ci	}
400462306a36Sopenharmony_ci}
400562306a36Sopenharmony_ci
400662306a36Sopenharmony_ci/*---------------------------------------------------------------------
400762306a36Sopenharmony_ci *
400862306a36Sopenharmony_ci * Function: Data In Phase
400962306a36Sopenharmony_ci *
401062306a36Sopenharmony_ci * Description: Startup the BusMaster and the XBOW.
401162306a36Sopenharmony_ci *
401262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
401362306a36Sopenharmony_ci
401462306a36Sopenharmony_cistatic void FPT_phaseDataIn(u32 port, unsigned char p_card)
401562306a36Sopenharmony_ci{
401662306a36Sopenharmony_ci
401762306a36Sopenharmony_ci	struct sccb *currSCCB;
401862306a36Sopenharmony_ci
401962306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
402062306a36Sopenharmony_ci
402162306a36Sopenharmony_ci	if (currSCCB == NULL) {
402262306a36Sopenharmony_ci		return;		/* Exit if No SCCB record */
402362306a36Sopenharmony_ci	}
402462306a36Sopenharmony_ci
402562306a36Sopenharmony_ci	currSCCB->Sccb_scsistat = DATA_IN_ST;
402662306a36Sopenharmony_ci	currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
402762306a36Sopenharmony_ci	currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
402862306a36Sopenharmony_ci
402962306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
403062306a36Sopenharmony_ci
403162306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
403262306a36Sopenharmony_ci
403362306a36Sopenharmony_ci	WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
403462306a36Sopenharmony_ci
403562306a36Sopenharmony_ci	FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
403662306a36Sopenharmony_ci
403762306a36Sopenharmony_ci	if (currSCCB->Sccb_XferCnt == 0) {
403862306a36Sopenharmony_ci
403962306a36Sopenharmony_ci		if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
404062306a36Sopenharmony_ci		    (currSCCB->HostStatus == SCCB_COMPLETE))
404162306a36Sopenharmony_ci			currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
404262306a36Sopenharmony_ci
404362306a36Sopenharmony_ci		FPT_sxfrp(port, p_card);
404462306a36Sopenharmony_ci		if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
404562306a36Sopenharmony_ci			FPT_phaseDecode(port, p_card);
404662306a36Sopenharmony_ci
404762306a36Sopenharmony_ci	}
404862306a36Sopenharmony_ci}
404962306a36Sopenharmony_ci
405062306a36Sopenharmony_ci/*---------------------------------------------------------------------
405162306a36Sopenharmony_ci *
405262306a36Sopenharmony_ci * Function: Command Phase
405362306a36Sopenharmony_ci *
405462306a36Sopenharmony_ci * Description: Load the CDB into the automation and start it up.
405562306a36Sopenharmony_ci *
405662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
405762306a36Sopenharmony_ci
405862306a36Sopenharmony_cistatic void FPT_phaseCommand(u32 p_port, unsigned char p_card)
405962306a36Sopenharmony_ci{
406062306a36Sopenharmony_ci	struct sccb *currSCCB;
406162306a36Sopenharmony_ci	u32 cdb_reg;
406262306a36Sopenharmony_ci	unsigned char i;
406362306a36Sopenharmony_ci
406462306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
406562306a36Sopenharmony_ci
406662306a36Sopenharmony_ci	if (currSCCB->OperationCode == RESET_COMMAND) {
406762306a36Sopenharmony_ci
406862306a36Sopenharmony_ci		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
406962306a36Sopenharmony_ci		currSCCB->CdbLength = SIX_BYTE_CMD;
407062306a36Sopenharmony_ci	}
407162306a36Sopenharmony_ci
407262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, 0x00);
407362306a36Sopenharmony_ci
407462306a36Sopenharmony_ci	ARAM_ACCESS(p_port);
407562306a36Sopenharmony_ci
407662306a36Sopenharmony_ci	cdb_reg = p_port + CMD_STRT;
407762306a36Sopenharmony_ci
407862306a36Sopenharmony_ci	for (i = 0; i < currSCCB->CdbLength; i++) {
407962306a36Sopenharmony_ci
408062306a36Sopenharmony_ci		if (currSCCB->OperationCode == RESET_COMMAND)
408162306a36Sopenharmony_ci
408262306a36Sopenharmony_ci			WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
408362306a36Sopenharmony_ci
408462306a36Sopenharmony_ci		else
408562306a36Sopenharmony_ci			WRW_HARPOON(cdb_reg,
408662306a36Sopenharmony_ci				    (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
408762306a36Sopenharmony_ci		cdb_reg += 2;
408862306a36Sopenharmony_ci	}
408962306a36Sopenharmony_ci
409062306a36Sopenharmony_ci	if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
409162306a36Sopenharmony_ci		WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
409262306a36Sopenharmony_ci
409362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, (SCSI_PORT));
409462306a36Sopenharmony_ci
409562306a36Sopenharmony_ci	currSCCB->Sccb_scsistat = COMMAND_ST;
409662306a36Sopenharmony_ci
409762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
409862306a36Sopenharmony_ci	SGRAM_ACCESS(p_port);
409962306a36Sopenharmony_ci}
410062306a36Sopenharmony_ci
410162306a36Sopenharmony_ci/*---------------------------------------------------------------------
410262306a36Sopenharmony_ci *
410362306a36Sopenharmony_ci * Function: Status phase
410462306a36Sopenharmony_ci *
410562306a36Sopenharmony_ci * Description: Bring in the status and command complete message bytes
410662306a36Sopenharmony_ci *
410762306a36Sopenharmony_ci *---------------------------------------------------------------------*/
410862306a36Sopenharmony_ci
410962306a36Sopenharmony_cistatic void FPT_phaseStatus(u32 port, unsigned char p_card)
411062306a36Sopenharmony_ci{
411162306a36Sopenharmony_ci	/* Start-up the automation to finish off this command and let the
411262306a36Sopenharmony_ci	   isr handle the interrupt for command complete when it comes in.
411362306a36Sopenharmony_ci	   We could wait here for the interrupt to be generated?
411462306a36Sopenharmony_ci	 */
411562306a36Sopenharmony_ci
411662306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, 0x00);
411762306a36Sopenharmony_ci
411862306a36Sopenharmony_ci	WR_HARPOON(port + hp_autostart_0, (AUTO_IMMED + END_DATA_START));
411962306a36Sopenharmony_ci}
412062306a36Sopenharmony_ci
412162306a36Sopenharmony_ci/*---------------------------------------------------------------------
412262306a36Sopenharmony_ci *
412362306a36Sopenharmony_ci * Function: Phase Message Out
412462306a36Sopenharmony_ci *
412562306a36Sopenharmony_ci * Description: Send out our message (if we have one) and handle whatever
412662306a36Sopenharmony_ci *              else is involed.
412762306a36Sopenharmony_ci *
412862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
412962306a36Sopenharmony_ci
413062306a36Sopenharmony_cistatic void FPT_phaseMsgOut(u32 port, unsigned char p_card)
413162306a36Sopenharmony_ci{
413262306a36Sopenharmony_ci	unsigned char message, scsiID;
413362306a36Sopenharmony_ci	struct sccb *currSCCB;
413462306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
413562306a36Sopenharmony_ci
413662306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
413762306a36Sopenharmony_ci
413862306a36Sopenharmony_ci	if (currSCCB != NULL) {
413962306a36Sopenharmony_ci
414062306a36Sopenharmony_ci		message = currSCCB->Sccb_scsimsg;
414162306a36Sopenharmony_ci		scsiID = currSCCB->TargID;
414262306a36Sopenharmony_ci
414362306a36Sopenharmony_ci		if (message == TARGET_RESET) {
414462306a36Sopenharmony_ci
414562306a36Sopenharmony_ci			currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
414662306a36Sopenharmony_ci			currTar_Info->TarSyncCtrl = 0;
414762306a36Sopenharmony_ci			FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
414862306a36Sopenharmony_ci
414962306a36Sopenharmony_ci			if (FPT_sccbMgrTbl[p_card][scsiID].
415062306a36Sopenharmony_ci			    TarEEValue & EE_SYNC_MASK) {
415162306a36Sopenharmony_ci
415262306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
415362306a36Sopenharmony_ci				    ~TAR_SYNC_MASK;
415462306a36Sopenharmony_ci
415562306a36Sopenharmony_ci			}
415662306a36Sopenharmony_ci
415762306a36Sopenharmony_ci			if (FPT_sccbMgrTbl[p_card][scsiID].
415862306a36Sopenharmony_ci			    TarEEValue & EE_WIDE_SCSI) {
415962306a36Sopenharmony_ci
416062306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
416162306a36Sopenharmony_ci				    ~TAR_WIDE_MASK;
416262306a36Sopenharmony_ci			}
416362306a36Sopenharmony_ci
416462306a36Sopenharmony_ci			FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
416562306a36Sopenharmony_ci			FPT_SccbMgrTableInitTarget(p_card, scsiID);
416662306a36Sopenharmony_ci		} else if (currSCCB->Sccb_scsistat == ABORT_ST) {
416762306a36Sopenharmony_ci			currSCCB->HostStatus = SCCB_COMPLETE;
416862306a36Sopenharmony_ci			if (FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] !=
416962306a36Sopenharmony_ci			    NULL) {
417062306a36Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
417162306a36Sopenharmony_ci							      Sccb_tag] = NULL;
417262306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
417362306a36Sopenharmony_ci			}
417462306a36Sopenharmony_ci
417562306a36Sopenharmony_ci		}
417662306a36Sopenharmony_ci
417762306a36Sopenharmony_ci		else if (currSCCB->Sccb_scsistat < COMMAND_ST) {
417862306a36Sopenharmony_ci
417962306a36Sopenharmony_ci			if (message == NOP) {
418062306a36Sopenharmony_ci				currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
418162306a36Sopenharmony_ci
418262306a36Sopenharmony_ci				FPT_ssel(port, p_card);
418362306a36Sopenharmony_ci				return;
418462306a36Sopenharmony_ci			}
418562306a36Sopenharmony_ci		} else {
418662306a36Sopenharmony_ci
418762306a36Sopenharmony_ci			if (message == ABORT_TASK_SET)
418862306a36Sopenharmony_ci
418962306a36Sopenharmony_ci				FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
419062306a36Sopenharmony_ci		}
419162306a36Sopenharmony_ci
419262306a36Sopenharmony_ci	} else {
419362306a36Sopenharmony_ci		message = ABORT_TASK_SET;
419462306a36Sopenharmony_ci	}
419562306a36Sopenharmony_ci
419662306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
419762306a36Sopenharmony_ci
419862306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
419962306a36Sopenharmony_ci
420062306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsidata_0, message);
420162306a36Sopenharmony_ci
420262306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
420362306a36Sopenharmony_ci
420462306a36Sopenharmony_ci	ACCEPT_MSG(port);
420562306a36Sopenharmony_ci
420662306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, 0x00);
420762306a36Sopenharmony_ci
420862306a36Sopenharmony_ci	if ((message == ABORT_TASK_SET) || (message == TARGET_RESET) ||
420962306a36Sopenharmony_ci	    (message == ABORT_TASK)) {
421062306a36Sopenharmony_ci
421162306a36Sopenharmony_ci		while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | PHASE))) {
421262306a36Sopenharmony_ci		}
421362306a36Sopenharmony_ci
421462306a36Sopenharmony_ci		if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
421562306a36Sopenharmony_ci			WRW_HARPOON((port + hp_intstat), BUS_FREE);
421662306a36Sopenharmony_ci
421762306a36Sopenharmony_ci			if (currSCCB != NULL) {
421862306a36Sopenharmony_ci
421962306a36Sopenharmony_ci				if ((FPT_BL_Card[p_card].
422062306a36Sopenharmony_ci				     globalFlags & F_CONLUN_IO)
422162306a36Sopenharmony_ci				    &&
422262306a36Sopenharmony_ci				    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
422362306a36Sopenharmony_ci				      TarStatus & TAR_TAG_Q_MASK) !=
422462306a36Sopenharmony_ci				     TAG_Q_TRYING))
422562306a36Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
422662306a36Sopenharmony_ci							       TargID].
422762306a36Sopenharmony_ci					    TarLUNBusy[currSCCB->Lun] = 0;
422862306a36Sopenharmony_ci				else
422962306a36Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
423062306a36Sopenharmony_ci							       TargID].
423162306a36Sopenharmony_ci					    TarLUNBusy[0] = 0;
423262306a36Sopenharmony_ci
423362306a36Sopenharmony_ci				FPT_queueCmdComplete(&FPT_BL_Card[p_card],
423462306a36Sopenharmony_ci						     currSCCB, p_card);
423562306a36Sopenharmony_ci			}
423662306a36Sopenharmony_ci
423762306a36Sopenharmony_ci			else {
423862306a36Sopenharmony_ci				FPT_BL_Card[p_card].globalFlags |=
423962306a36Sopenharmony_ci				    F_NEW_SCCB_CMD;
424062306a36Sopenharmony_ci			}
424162306a36Sopenharmony_ci		}
424262306a36Sopenharmony_ci
424362306a36Sopenharmony_ci		else {
424462306a36Sopenharmony_ci
424562306a36Sopenharmony_ci			FPT_sxfrp(port, p_card);
424662306a36Sopenharmony_ci		}
424762306a36Sopenharmony_ci	}
424862306a36Sopenharmony_ci
424962306a36Sopenharmony_ci	else {
425062306a36Sopenharmony_ci
425162306a36Sopenharmony_ci		if (message == MSG_PARITY_ERROR) {
425262306a36Sopenharmony_ci			currSCCB->Sccb_scsimsg = NOP;
425362306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
425462306a36Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
425562306a36Sopenharmony_ci		} else {
425662306a36Sopenharmony_ci			FPT_sxfrp(port, p_card);
425762306a36Sopenharmony_ci		}
425862306a36Sopenharmony_ci	}
425962306a36Sopenharmony_ci}
426062306a36Sopenharmony_ci
426162306a36Sopenharmony_ci/*---------------------------------------------------------------------
426262306a36Sopenharmony_ci *
426362306a36Sopenharmony_ci * Function: Message In phase
426462306a36Sopenharmony_ci *
426562306a36Sopenharmony_ci * Description: Bring in the message and determine what to do with it.
426662306a36Sopenharmony_ci *
426762306a36Sopenharmony_ci *---------------------------------------------------------------------*/
426862306a36Sopenharmony_ci
426962306a36Sopenharmony_cistatic void FPT_phaseMsgIn(u32 port, unsigned char p_card)
427062306a36Sopenharmony_ci{
427162306a36Sopenharmony_ci	unsigned char message;
427262306a36Sopenharmony_ci	struct sccb *currSCCB;
427362306a36Sopenharmony_ci
427462306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
427562306a36Sopenharmony_ci
427662306a36Sopenharmony_ci	if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
427762306a36Sopenharmony_ci
427862306a36Sopenharmony_ci		FPT_phaseChkFifo(port, p_card);
427962306a36Sopenharmony_ci	}
428062306a36Sopenharmony_ci
428162306a36Sopenharmony_ci	message = RD_HARPOON(port + hp_scsidata_0);
428262306a36Sopenharmony_ci	if ((message == DISCONNECT) || (message == SAVE_POINTERS)) {
428362306a36Sopenharmony_ci
428462306a36Sopenharmony_ci		WR_HARPOON(port + hp_autostart_1,
428562306a36Sopenharmony_ci			   (AUTO_IMMED + END_DATA_START));
428662306a36Sopenharmony_ci
428762306a36Sopenharmony_ci	}
428862306a36Sopenharmony_ci
428962306a36Sopenharmony_ci	else {
429062306a36Sopenharmony_ci
429162306a36Sopenharmony_ci		message = FPT_sfm(port, currSCCB);
429262306a36Sopenharmony_ci		if (message) {
429362306a36Sopenharmony_ci
429462306a36Sopenharmony_ci			FPT_sdecm(message, port, p_card);
429562306a36Sopenharmony_ci
429662306a36Sopenharmony_ci		} else {
429762306a36Sopenharmony_ci			if (currSCCB->Sccb_scsimsg != MSG_PARITY_ERROR)
429862306a36Sopenharmony_ci				ACCEPT_MSG(port);
429962306a36Sopenharmony_ci			WR_HARPOON(port + hp_autostart_1,
430062306a36Sopenharmony_ci				   (AUTO_IMMED + DISCONNECT_START));
430162306a36Sopenharmony_ci		}
430262306a36Sopenharmony_ci	}
430362306a36Sopenharmony_ci
430462306a36Sopenharmony_ci}
430562306a36Sopenharmony_ci
430662306a36Sopenharmony_ci/*---------------------------------------------------------------------
430762306a36Sopenharmony_ci *
430862306a36Sopenharmony_ci * Function: Illegal phase
430962306a36Sopenharmony_ci *
431062306a36Sopenharmony_ci * Description: Target switched to some illegal phase, so all we can do
431162306a36Sopenharmony_ci *              is report an error back to the host (if that is possible)
431262306a36Sopenharmony_ci *              and send an ABORT message to the misbehaving target.
431362306a36Sopenharmony_ci *
431462306a36Sopenharmony_ci *---------------------------------------------------------------------*/
431562306a36Sopenharmony_ci
431662306a36Sopenharmony_cistatic void FPT_phaseIllegal(u32 port, unsigned char p_card)
431762306a36Sopenharmony_ci{
431862306a36Sopenharmony_ci	struct sccb *currSCCB;
431962306a36Sopenharmony_ci
432062306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
432162306a36Sopenharmony_ci
432262306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, RD_HARPOON(port + hp_scsisig));
432362306a36Sopenharmony_ci	if (currSCCB != NULL) {
432462306a36Sopenharmony_ci
432562306a36Sopenharmony_ci		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
432662306a36Sopenharmony_ci		currSCCB->Sccb_scsistat = ABORT_ST;
432762306a36Sopenharmony_ci		currSCCB->Sccb_scsimsg = ABORT_TASK_SET;
432862306a36Sopenharmony_ci	}
432962306a36Sopenharmony_ci
433062306a36Sopenharmony_ci	ACCEPT_MSG_ATN(port);
433162306a36Sopenharmony_ci}
433262306a36Sopenharmony_ci
433362306a36Sopenharmony_ci/*---------------------------------------------------------------------
433462306a36Sopenharmony_ci *
433562306a36Sopenharmony_ci * Function: Phase Check FIFO
433662306a36Sopenharmony_ci *
433762306a36Sopenharmony_ci * Description: Make sure data has been flushed from both FIFOs and abort
433862306a36Sopenharmony_ci *              the operations if necessary.
433962306a36Sopenharmony_ci *
434062306a36Sopenharmony_ci *---------------------------------------------------------------------*/
434162306a36Sopenharmony_ci
434262306a36Sopenharmony_cistatic void FPT_phaseChkFifo(u32 port, unsigned char p_card)
434362306a36Sopenharmony_ci{
434462306a36Sopenharmony_ci	u32 xfercnt;
434562306a36Sopenharmony_ci	struct sccb *currSCCB;
434662306a36Sopenharmony_ci
434762306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
434862306a36Sopenharmony_ci
434962306a36Sopenharmony_ci	if (currSCCB->Sccb_scsistat == DATA_IN_ST) {
435062306a36Sopenharmony_ci
435162306a36Sopenharmony_ci		while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) &&
435262306a36Sopenharmony_ci		       (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)) {
435362306a36Sopenharmony_ci		}
435462306a36Sopenharmony_ci
435562306a36Sopenharmony_ci		if (!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) {
435662306a36Sopenharmony_ci			currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
435762306a36Sopenharmony_ci
435862306a36Sopenharmony_ci			currSCCB->Sccb_XferCnt = 0;
435962306a36Sopenharmony_ci
436062306a36Sopenharmony_ci			if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
436162306a36Sopenharmony_ci			    (currSCCB->HostStatus == SCCB_COMPLETE)) {
436262306a36Sopenharmony_ci				currSCCB->HostStatus = SCCB_PARITY_ERR;
436362306a36Sopenharmony_ci				WRW_HARPOON((port + hp_intstat), PARITY);
436462306a36Sopenharmony_ci			}
436562306a36Sopenharmony_ci
436662306a36Sopenharmony_ci			FPT_hostDataXferAbort(port, p_card, currSCCB);
436762306a36Sopenharmony_ci
436862306a36Sopenharmony_ci			FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
436962306a36Sopenharmony_ci
437062306a36Sopenharmony_ci			while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY))
437162306a36Sopenharmony_ci			       && (RD_HARPOON(port + hp_ext_status) &
437262306a36Sopenharmony_ci				   BM_CMD_BUSY)) {
437362306a36Sopenharmony_ci			}
437462306a36Sopenharmony_ci
437562306a36Sopenharmony_ci		}
437662306a36Sopenharmony_ci	}
437762306a36Sopenharmony_ci
437862306a36Sopenharmony_ci	/*End Data In specific code. */
437962306a36Sopenharmony_ci	GET_XFER_CNT(port, xfercnt);
438062306a36Sopenharmony_ci
438162306a36Sopenharmony_ci	WR_HARPOON(port + hp_xfercnt_0, 0x00);
438262306a36Sopenharmony_ci
438362306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_0, 0x00);
438462306a36Sopenharmony_ci
438562306a36Sopenharmony_ci	currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
438662306a36Sopenharmony_ci
438762306a36Sopenharmony_ci	currSCCB->Sccb_XferCnt = xfercnt;
438862306a36Sopenharmony_ci
438962306a36Sopenharmony_ci	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
439062306a36Sopenharmony_ci	    (currSCCB->HostStatus == SCCB_COMPLETE)) {
439162306a36Sopenharmony_ci
439262306a36Sopenharmony_ci		currSCCB->HostStatus = SCCB_PARITY_ERR;
439362306a36Sopenharmony_ci		WRW_HARPOON((port + hp_intstat), PARITY);
439462306a36Sopenharmony_ci	}
439562306a36Sopenharmony_ci
439662306a36Sopenharmony_ci	FPT_hostDataXferAbort(port, p_card, currSCCB);
439762306a36Sopenharmony_ci
439862306a36Sopenharmony_ci	WR_HARPOON(port + hp_fifowrite, 0x00);
439962306a36Sopenharmony_ci	WR_HARPOON(port + hp_fiforead, 0x00);
440062306a36Sopenharmony_ci	WR_HARPOON(port + hp_xferstat, 0x00);
440162306a36Sopenharmony_ci
440262306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
440362306a36Sopenharmony_ci}
440462306a36Sopenharmony_ci
440562306a36Sopenharmony_ci/*---------------------------------------------------------------------
440662306a36Sopenharmony_ci *
440762306a36Sopenharmony_ci * Function: Phase Bus Free
440862306a36Sopenharmony_ci *
440962306a36Sopenharmony_ci * Description: We just went bus free so figure out if it was
441062306a36Sopenharmony_ci *              because of command complete or from a disconnect.
441162306a36Sopenharmony_ci *
441262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
441362306a36Sopenharmony_cistatic void FPT_phaseBusFree(u32 port, unsigned char p_card)
441462306a36Sopenharmony_ci{
441562306a36Sopenharmony_ci	struct sccb *currSCCB;
441662306a36Sopenharmony_ci
441762306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
441862306a36Sopenharmony_ci
441962306a36Sopenharmony_ci	if (currSCCB != NULL) {
442062306a36Sopenharmony_ci
442162306a36Sopenharmony_ci		DISABLE_AUTO(port);
442262306a36Sopenharmony_ci
442362306a36Sopenharmony_ci		if (currSCCB->OperationCode == RESET_COMMAND) {
442462306a36Sopenharmony_ci
442562306a36Sopenharmony_ci			if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
442662306a36Sopenharmony_ci			    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
442762306a36Sopenharmony_ci			      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
442862306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
442962306a36Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 0;
443062306a36Sopenharmony_ci			else
443162306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
443262306a36Sopenharmony_ci				    TarLUNBusy[0] = 0;
443362306a36Sopenharmony_ci
443462306a36Sopenharmony_ci			FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
443562306a36Sopenharmony_ci					     p_card);
443662306a36Sopenharmony_ci
443762306a36Sopenharmony_ci			FPT_queueSearchSelect(&FPT_BL_Card[p_card], p_card);
443862306a36Sopenharmony_ci
443962306a36Sopenharmony_ci		}
444062306a36Sopenharmony_ci
444162306a36Sopenharmony_ci		else if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
444262306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
444362306a36Sopenharmony_ci			    (unsigned char)SYNC_SUPPORTED;
444462306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
444562306a36Sopenharmony_ci			    ~EE_SYNC_MASK;
444662306a36Sopenharmony_ci		}
444762306a36Sopenharmony_ci
444862306a36Sopenharmony_ci		else if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
444962306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
445062306a36Sopenharmony_ci			    (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
445162306a36Sopenharmony_ci			     TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
445262306a36Sopenharmony_ci
445362306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
445462306a36Sopenharmony_ci			    ~EE_WIDE_SCSI;
445562306a36Sopenharmony_ci		}
445662306a36Sopenharmony_ci
445762306a36Sopenharmony_ci		else if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
445862306a36Sopenharmony_ci			/* Make sure this is not a phony BUS_FREE.  If we were
445962306a36Sopenharmony_ci			   reselected or if BUSY is NOT on then this is a
446062306a36Sopenharmony_ci			   valid BUS FREE.  SRR Wednesday, 5/10/1995.     */
446162306a36Sopenharmony_ci
446262306a36Sopenharmony_ci			if ((!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ||
446362306a36Sopenharmony_ci			    (RDW_HARPOON((port + hp_intstat)) & RSEL)) {
446462306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
446562306a36Sopenharmony_ci				    TarStatus &= ~TAR_TAG_Q_MASK;
446662306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
446762306a36Sopenharmony_ci				    TarStatus |= TAG_Q_REJECT;
446862306a36Sopenharmony_ci			}
446962306a36Sopenharmony_ci
447062306a36Sopenharmony_ci			else {
447162306a36Sopenharmony_ci				return;
447262306a36Sopenharmony_ci			}
447362306a36Sopenharmony_ci		}
447462306a36Sopenharmony_ci
447562306a36Sopenharmony_ci		else {
447662306a36Sopenharmony_ci
447762306a36Sopenharmony_ci			currSCCB->Sccb_scsistat = BUS_FREE_ST;
447862306a36Sopenharmony_ci
447962306a36Sopenharmony_ci			if (!currSCCB->HostStatus) {
448062306a36Sopenharmony_ci				currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
448162306a36Sopenharmony_ci			}
448262306a36Sopenharmony_ci
448362306a36Sopenharmony_ci			if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
448462306a36Sopenharmony_ci			    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
448562306a36Sopenharmony_ci			      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
448662306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
448762306a36Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 0;
448862306a36Sopenharmony_ci			else
448962306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
449062306a36Sopenharmony_ci				    TarLUNBusy[0] = 0;
449162306a36Sopenharmony_ci
449262306a36Sopenharmony_ci			FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
449362306a36Sopenharmony_ci					     p_card);
449462306a36Sopenharmony_ci			return;
449562306a36Sopenharmony_ci		}
449662306a36Sopenharmony_ci
449762306a36Sopenharmony_ci		FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
449862306a36Sopenharmony_ci
449962306a36Sopenharmony_ci	}			/*end if !=null */
450062306a36Sopenharmony_ci}
450162306a36Sopenharmony_ci
450262306a36Sopenharmony_ci/*---------------------------------------------------------------------
450362306a36Sopenharmony_ci *
450462306a36Sopenharmony_ci * Function: Auto Load Default Map
450562306a36Sopenharmony_ci *
450662306a36Sopenharmony_ci * Description: Load the Automation RAM with the default map values.
450762306a36Sopenharmony_ci *
450862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
450962306a36Sopenharmony_cistatic void FPT_autoLoadDefaultMap(u32 p_port)
451062306a36Sopenharmony_ci{
451162306a36Sopenharmony_ci	u32 map_addr;
451262306a36Sopenharmony_ci
451362306a36Sopenharmony_ci	ARAM_ACCESS(p_port);
451462306a36Sopenharmony_ci	map_addr = p_port + hp_aramBase;
451562306a36Sopenharmony_ci
451662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0xC0));	/*ID MESSAGE */
451762306a36Sopenharmony_ci	map_addr += 2;
451862306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x20));	/*SIMPLE TAG QUEUEING MSG */
451962306a36Sopenharmony_ci	map_addr += 2;
452062306a36Sopenharmony_ci	WRW_HARPOON(map_addr, RAT_OP);	/*RESET ATTENTION */
452162306a36Sopenharmony_ci	map_addr += 2;
452262306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x00));	/*TAG ID MSG */
452362306a36Sopenharmony_ci	map_addr += 2;
452462306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 0 */
452562306a36Sopenharmony_ci	map_addr += 2;
452662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 1 */
452762306a36Sopenharmony_ci	map_addr += 2;
452862306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 2 */
452962306a36Sopenharmony_ci	map_addr += 2;
453062306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 3 */
453162306a36Sopenharmony_ci	map_addr += 2;
453262306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 4 */
453362306a36Sopenharmony_ci	map_addr += 2;
453462306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 5 */
453562306a36Sopenharmony_ci	map_addr += 2;
453662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 6 */
453762306a36Sopenharmony_ci	map_addr += 2;
453862306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 7 */
453962306a36Sopenharmony_ci	map_addr += 2;
454062306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 8 */
454162306a36Sopenharmony_ci	map_addr += 2;
454262306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 9 */
454362306a36Sopenharmony_ci	map_addr += 2;
454462306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 10 */
454562306a36Sopenharmony_ci	map_addr += 2;
454662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 11 */
454762306a36Sopenharmony_ci	map_addr += 2;
454862306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CPE_OP + ADATA_OUT + DINT));	/*JUMP IF DATA OUT */
454962306a36Sopenharmony_ci	map_addr += 2;
455062306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (TCB_OP + FIFO_0 + DI));	/*JUMP IF NO DATA IN FIFO */
455162306a36Sopenharmony_ci	map_addr += 2;		/*This means AYNC DATA IN */
455262306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_IDO_STRT));	/*STOP AND INTERRUPT */
455362306a36Sopenharmony_ci	map_addr += 2;
455462306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CPE_OP + ADATA_IN + DINT));	/*JUMP IF NOT DATA IN PHZ */
455562306a36Sopenharmony_ci	map_addr += 2;
455662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST));	/*IF NOT MSG IN CHECK 4 DATA IN */
455762306a36Sopenharmony_ci	map_addr += 2;
455862306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x02));	/*SAVE DATA PTR MSG? */
455962306a36Sopenharmony_ci	map_addr += 2;
456062306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + DC));	/*GO CHECK FOR DISCONNECT MSG */
456162306a36Sopenharmony_ci	map_addr += 2;
456262306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR1));	/*SAVE DATA PTRS MSG */
456362306a36Sopenharmony_ci	map_addr += 2;
456462306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST));	/*IF NOT MSG IN CHECK DATA IN */
456562306a36Sopenharmony_ci	map_addr += 2;
456662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x04));	/*DISCONNECT MSG? */
456762306a36Sopenharmony_ci	map_addr += 2;
456862306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + UNKNWN));	/*UKNKNOWN MSG */
456962306a36Sopenharmony_ci	map_addr += 2;
457062306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET));	/*XFER DISCONNECT MSG */
457162306a36Sopenharmony_ci	map_addr += 2;
457262306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_ITAR_DISC));	/*STOP AND INTERRUPT */
457362306a36Sopenharmony_ci	map_addr += 2;
457462306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + ASTATUS + UNKNWN));	/*JUMP IF NOT STATUS PHZ. */
457562306a36Sopenharmony_ci	map_addr += 2;
457662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR0));	/*GET STATUS BYTE */
457762306a36Sopenharmony_ci	map_addr += 2;
457862306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + CC));	/*ERROR IF NOT MSG IN PHZ */
457962306a36Sopenharmony_ci	map_addr += 2;
458062306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x00));	/*CHECK FOR CMD COMPLETE MSG. */
458162306a36Sopenharmony_ci	map_addr += 2;
458262306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + CC));	/*ERROR IF NOT CMD COMPLETE MSG. */
458362306a36Sopenharmony_ci	map_addr += 2;
458462306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET));	/*GET CMD COMPLETE MSG */
458562306a36Sopenharmony_ci	map_addr += 2;
458662306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_ICMD_COMP));	/*END OF COMMAND */
458762306a36Sopenharmony_ci	map_addr += 2;
458862306a36Sopenharmony_ci
458962306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_IUNKWN));	/*RECEIVED UNKNOWN MSG BYTE */
459062306a36Sopenharmony_ci	map_addr += 2;
459162306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC));	/*NO COMMAND COMPLETE AFTER STATUS */
459262306a36Sopenharmony_ci	map_addr += 2;
459362306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_ITICKLE));	/*BIOS Tickled the Mgr */
459462306a36Sopenharmony_ci	map_addr += 2;
459562306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_IRFAIL));	/*EXPECTED ID/TAG MESSAGES AND */
459662306a36Sopenharmony_ci	map_addr += 2;		/* DIDN'T GET ONE */
459762306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (CRR_OP + AR3 + S_IDREG));	/* comp SCSI SEL ID & AR3 */
459862306a36Sopenharmony_ci	map_addr += 2;
459962306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (BRH_OP + EQUAL + 0x00));	/*SEL ID OK then Conti. */
460062306a36Sopenharmony_ci	map_addr += 2;
460162306a36Sopenharmony_ci	WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC));	/*NO COMMAND COMPLETE AFTER STATUS */
460262306a36Sopenharmony_ci
460362306a36Sopenharmony_ci	SGRAM_ACCESS(p_port);
460462306a36Sopenharmony_ci}
460562306a36Sopenharmony_ci
460662306a36Sopenharmony_ci/*---------------------------------------------------------------------
460762306a36Sopenharmony_ci *
460862306a36Sopenharmony_ci * Function: Auto Command Complete
460962306a36Sopenharmony_ci *
461062306a36Sopenharmony_ci * Description: Post command back to host and find another command
461162306a36Sopenharmony_ci *              to execute.
461262306a36Sopenharmony_ci *
461362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
461462306a36Sopenharmony_ci
461562306a36Sopenharmony_cistatic void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card)
461662306a36Sopenharmony_ci{
461762306a36Sopenharmony_ci	struct sccb *currSCCB;
461862306a36Sopenharmony_ci	unsigned char status_byte;
461962306a36Sopenharmony_ci
462062306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
462162306a36Sopenharmony_ci
462262306a36Sopenharmony_ci	status_byte = RD_HARPOON(p_port + hp_gp_reg_0);
462362306a36Sopenharmony_ci
462462306a36Sopenharmony_ci	FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0;
462562306a36Sopenharmony_ci
462662306a36Sopenharmony_ci	if (status_byte != SAM_STAT_GOOD) {
462762306a36Sopenharmony_ci
462862306a36Sopenharmony_ci		if (status_byte == SAM_STAT_TASK_SET_FULL) {
462962306a36Sopenharmony_ci
463062306a36Sopenharmony_ci			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
463162306a36Sopenharmony_ci			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
463262306a36Sopenharmony_ci			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
463362306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
463462306a36Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 1;
463562306a36Sopenharmony_ci				if (FPT_BL_Card[p_card].discQCount != 0)
463662306a36Sopenharmony_ci					FPT_BL_Card[p_card].discQCount--;
463762306a36Sopenharmony_ci				FPT_BL_Card[p_card].
463862306a36Sopenharmony_ci				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
463962306a36Sopenharmony_ci					      [currSCCB->TargID].
464062306a36Sopenharmony_ci					      LunDiscQ_Idx[currSCCB->Lun]] =
464162306a36Sopenharmony_ci				    NULL;
464262306a36Sopenharmony_ci			} else {
464362306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
464462306a36Sopenharmony_ci				    TarLUNBusy[0] = 1;
464562306a36Sopenharmony_ci				if (currSCCB->Sccb_tag) {
464662306a36Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
464762306a36Sopenharmony_ci						FPT_BL_Card[p_card].
464862306a36Sopenharmony_ci						    discQCount--;
464962306a36Sopenharmony_ci					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
465062306a36Sopenharmony_ci								      Sccb_tag]
465162306a36Sopenharmony_ci					    = NULL;
465262306a36Sopenharmony_ci				} else {
465362306a36Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
465462306a36Sopenharmony_ci						FPT_BL_Card[p_card].
465562306a36Sopenharmony_ci						    discQCount--;
465662306a36Sopenharmony_ci					FPT_BL_Card[p_card].
465762306a36Sopenharmony_ci					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
465862306a36Sopenharmony_ci						      [currSCCB->TargID].
465962306a36Sopenharmony_ci						      LunDiscQ_Idx[0]] = NULL;
466062306a36Sopenharmony_ci				}
466162306a36Sopenharmony_ci			}
466262306a36Sopenharmony_ci
466362306a36Sopenharmony_ci			currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
466462306a36Sopenharmony_ci
466562306a36Sopenharmony_ci			FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
466662306a36Sopenharmony_ci
466762306a36Sopenharmony_ci			return;
466862306a36Sopenharmony_ci		}
466962306a36Sopenharmony_ci
467062306a36Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
467162306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
467262306a36Sopenharmony_ci			    (unsigned char)SYNC_SUPPORTED;
467362306a36Sopenharmony_ci
467462306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
467562306a36Sopenharmony_ci			    ~EE_SYNC_MASK;
467662306a36Sopenharmony_ci			FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
467762306a36Sopenharmony_ci
467862306a36Sopenharmony_ci			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
467962306a36Sopenharmony_ci			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
468062306a36Sopenharmony_ci			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
468162306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
468262306a36Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 1;
468362306a36Sopenharmony_ci				if (FPT_BL_Card[p_card].discQCount != 0)
468462306a36Sopenharmony_ci					FPT_BL_Card[p_card].discQCount--;
468562306a36Sopenharmony_ci				FPT_BL_Card[p_card].
468662306a36Sopenharmony_ci				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
468762306a36Sopenharmony_ci					      [currSCCB->TargID].
468862306a36Sopenharmony_ci					      LunDiscQ_Idx[currSCCB->Lun]] =
468962306a36Sopenharmony_ci				    NULL;
469062306a36Sopenharmony_ci			} else {
469162306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
469262306a36Sopenharmony_ci				    TarLUNBusy[0] = 1;
469362306a36Sopenharmony_ci				if (currSCCB->Sccb_tag) {
469462306a36Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
469562306a36Sopenharmony_ci						FPT_BL_Card[p_card].
469662306a36Sopenharmony_ci						    discQCount--;
469762306a36Sopenharmony_ci					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
469862306a36Sopenharmony_ci								      Sccb_tag]
469962306a36Sopenharmony_ci					    = NULL;
470062306a36Sopenharmony_ci				} else {
470162306a36Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
470262306a36Sopenharmony_ci						FPT_BL_Card[p_card].
470362306a36Sopenharmony_ci						    discQCount--;
470462306a36Sopenharmony_ci					FPT_BL_Card[p_card].
470562306a36Sopenharmony_ci					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
470662306a36Sopenharmony_ci						      [currSCCB->TargID].
470762306a36Sopenharmony_ci						      LunDiscQ_Idx[0]] = NULL;
470862306a36Sopenharmony_ci				}
470962306a36Sopenharmony_ci			}
471062306a36Sopenharmony_ci			return;
471162306a36Sopenharmony_ci
471262306a36Sopenharmony_ci		}
471362306a36Sopenharmony_ci
471462306a36Sopenharmony_ci		if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
471562306a36Sopenharmony_ci
471662306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
471762306a36Sopenharmony_ci			    (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
471862306a36Sopenharmony_ci			     TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
471962306a36Sopenharmony_ci
472062306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
472162306a36Sopenharmony_ci			    ~EE_WIDE_SCSI;
472262306a36Sopenharmony_ci			FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
472362306a36Sopenharmony_ci
472462306a36Sopenharmony_ci			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
472562306a36Sopenharmony_ci			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
472662306a36Sopenharmony_ci			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
472762306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
472862306a36Sopenharmony_ci				    TarLUNBusy[currSCCB->Lun] = 1;
472962306a36Sopenharmony_ci				if (FPT_BL_Card[p_card].discQCount != 0)
473062306a36Sopenharmony_ci					FPT_BL_Card[p_card].discQCount--;
473162306a36Sopenharmony_ci				FPT_BL_Card[p_card].
473262306a36Sopenharmony_ci				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
473362306a36Sopenharmony_ci					      [currSCCB->TargID].
473462306a36Sopenharmony_ci					      LunDiscQ_Idx[currSCCB->Lun]] =
473562306a36Sopenharmony_ci				    NULL;
473662306a36Sopenharmony_ci			} else {
473762306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
473862306a36Sopenharmony_ci				    TarLUNBusy[0] = 1;
473962306a36Sopenharmony_ci				if (currSCCB->Sccb_tag) {
474062306a36Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
474162306a36Sopenharmony_ci						FPT_BL_Card[p_card].
474262306a36Sopenharmony_ci						    discQCount--;
474362306a36Sopenharmony_ci					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
474462306a36Sopenharmony_ci								      Sccb_tag]
474562306a36Sopenharmony_ci					    = NULL;
474662306a36Sopenharmony_ci				} else {
474762306a36Sopenharmony_ci					if (FPT_BL_Card[p_card].discQCount != 0)
474862306a36Sopenharmony_ci						FPT_BL_Card[p_card].
474962306a36Sopenharmony_ci						    discQCount--;
475062306a36Sopenharmony_ci					FPT_BL_Card[p_card].
475162306a36Sopenharmony_ci					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
475262306a36Sopenharmony_ci						      [currSCCB->TargID].
475362306a36Sopenharmony_ci						      LunDiscQ_Idx[0]] = NULL;
475462306a36Sopenharmony_ci				}
475562306a36Sopenharmony_ci			}
475662306a36Sopenharmony_ci			return;
475762306a36Sopenharmony_ci
475862306a36Sopenharmony_ci		}
475962306a36Sopenharmony_ci
476062306a36Sopenharmony_ci		if (status_byte == SAM_STAT_CHECK_CONDITION) {
476162306a36Sopenharmony_ci			if (FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO) {
476262306a36Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
476362306a36Sopenharmony_ci				    TarEEValue & EE_SYNC_MASK) {
476462306a36Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
476562306a36Sopenharmony_ci							       TargID].
476662306a36Sopenharmony_ci					    TarStatus &= ~TAR_SYNC_MASK;
476762306a36Sopenharmony_ci				}
476862306a36Sopenharmony_ci				if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
476962306a36Sopenharmony_ci				    TarEEValue & EE_WIDE_SCSI) {
477062306a36Sopenharmony_ci					FPT_sccbMgrTbl[p_card][currSCCB->
477162306a36Sopenharmony_ci							       TargID].
477262306a36Sopenharmony_ci					    TarStatus &= ~TAR_WIDE_MASK;
477362306a36Sopenharmony_ci				}
477462306a36Sopenharmony_ci			}
477562306a36Sopenharmony_ci		}
477662306a36Sopenharmony_ci
477762306a36Sopenharmony_ci		if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
477862306a36Sopenharmony_ci
477962306a36Sopenharmony_ci			currSCCB->SccbStatus = SCCB_ERROR;
478062306a36Sopenharmony_ci			currSCCB->TargetStatus = status_byte;
478162306a36Sopenharmony_ci
478262306a36Sopenharmony_ci			if (status_byte == SAM_STAT_CHECK_CONDITION) {
478362306a36Sopenharmony_ci
478462306a36Sopenharmony_ci				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
478562306a36Sopenharmony_ci				    TarLUN_CA = 1;
478662306a36Sopenharmony_ci
478762306a36Sopenharmony_ci				if (currSCCB->RequestSenseLength !=
478862306a36Sopenharmony_ci				    NO_AUTO_REQUEST_SENSE) {
478962306a36Sopenharmony_ci
479062306a36Sopenharmony_ci					if (currSCCB->RequestSenseLength == 0)
479162306a36Sopenharmony_ci						currSCCB->RequestSenseLength =
479262306a36Sopenharmony_ci						    14;
479362306a36Sopenharmony_ci
479462306a36Sopenharmony_ci					FPT_ssenss(&FPT_BL_Card[p_card]);
479562306a36Sopenharmony_ci					FPT_BL_Card[p_card].globalFlags |=
479662306a36Sopenharmony_ci					    F_NEW_SCCB_CMD;
479762306a36Sopenharmony_ci
479862306a36Sopenharmony_ci					if (((FPT_BL_Card[p_card].
479962306a36Sopenharmony_ci					      globalFlags & F_CONLUN_IO)
480062306a36Sopenharmony_ci					     &&
480162306a36Sopenharmony_ci					     ((FPT_sccbMgrTbl[p_card]
480262306a36Sopenharmony_ci					       [currSCCB->TargID].
480362306a36Sopenharmony_ci					       TarStatus & TAR_TAG_Q_MASK) !=
480462306a36Sopenharmony_ci					      TAG_Q_TRYING))) {
480562306a36Sopenharmony_ci						FPT_sccbMgrTbl[p_card]
480662306a36Sopenharmony_ci						    [currSCCB->TargID].
480762306a36Sopenharmony_ci						    TarLUNBusy[currSCCB->Lun] =
480862306a36Sopenharmony_ci						    1;
480962306a36Sopenharmony_ci						if (FPT_BL_Card[p_card].
481062306a36Sopenharmony_ci						    discQCount != 0)
481162306a36Sopenharmony_ci							FPT_BL_Card[p_card].
481262306a36Sopenharmony_ci							    discQCount--;
481362306a36Sopenharmony_ci						FPT_BL_Card[p_card].
481462306a36Sopenharmony_ci						    discQ_Tbl[FPT_sccbMgrTbl
481562306a36Sopenharmony_ci							      [p_card]
481662306a36Sopenharmony_ci							      [currSCCB->
481762306a36Sopenharmony_ci							       TargID].
481862306a36Sopenharmony_ci							      LunDiscQ_Idx
481962306a36Sopenharmony_ci							      [currSCCB->Lun]] =
482062306a36Sopenharmony_ci						    NULL;
482162306a36Sopenharmony_ci					} else {
482262306a36Sopenharmony_ci						FPT_sccbMgrTbl[p_card]
482362306a36Sopenharmony_ci						    [currSCCB->TargID].
482462306a36Sopenharmony_ci						    TarLUNBusy[0] = 1;
482562306a36Sopenharmony_ci						if (currSCCB->Sccb_tag) {
482662306a36Sopenharmony_ci							if (FPT_BL_Card[p_card].
482762306a36Sopenharmony_ci							    discQCount != 0)
482862306a36Sopenharmony_ci								FPT_BL_Card
482962306a36Sopenharmony_ci								    [p_card].
483062306a36Sopenharmony_ci								    discQCount--;
483162306a36Sopenharmony_ci							FPT_BL_Card[p_card].
483262306a36Sopenharmony_ci							    discQ_Tbl[currSCCB->
483362306a36Sopenharmony_ci								      Sccb_tag]
483462306a36Sopenharmony_ci							    = NULL;
483562306a36Sopenharmony_ci						} else {
483662306a36Sopenharmony_ci							if (FPT_BL_Card[p_card].
483762306a36Sopenharmony_ci							    discQCount != 0)
483862306a36Sopenharmony_ci								FPT_BL_Card
483962306a36Sopenharmony_ci								    [p_card].
484062306a36Sopenharmony_ci								    discQCount--;
484162306a36Sopenharmony_ci							FPT_BL_Card[p_card].
484262306a36Sopenharmony_ci							    discQ_Tbl
484362306a36Sopenharmony_ci							    [FPT_sccbMgrTbl
484462306a36Sopenharmony_ci							     [p_card][currSCCB->
484562306a36Sopenharmony_ci								      TargID].
484662306a36Sopenharmony_ci							     LunDiscQ_Idx[0]] =
484762306a36Sopenharmony_ci							    NULL;
484862306a36Sopenharmony_ci						}
484962306a36Sopenharmony_ci					}
485062306a36Sopenharmony_ci					return;
485162306a36Sopenharmony_ci				}
485262306a36Sopenharmony_ci			}
485362306a36Sopenharmony_ci		}
485462306a36Sopenharmony_ci	}
485562306a36Sopenharmony_ci
485662306a36Sopenharmony_ci	if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
485762306a36Sopenharmony_ci	    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
485862306a36Sopenharmony_ci	      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
485962306a36Sopenharmony_ci		FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->
486062306a36Sopenharmony_ci								    Lun] = 0;
486162306a36Sopenharmony_ci	else
486262306a36Sopenharmony_ci		FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
486362306a36Sopenharmony_ci
486462306a36Sopenharmony_ci	FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
486562306a36Sopenharmony_ci}
486662306a36Sopenharmony_ci
486762306a36Sopenharmony_ci#define SHORT_WAIT   0x0000000F
486862306a36Sopenharmony_ci#define LONG_WAIT    0x0000FFFFL
486962306a36Sopenharmony_ci
487062306a36Sopenharmony_ci/*---------------------------------------------------------------------
487162306a36Sopenharmony_ci *
487262306a36Sopenharmony_ci * Function: Data Transfer Processor
487362306a36Sopenharmony_ci *
487462306a36Sopenharmony_ci * Description: This routine performs two tasks.
487562306a36Sopenharmony_ci *              (1) Start data transfer by calling HOST_DATA_XFER_START
487662306a36Sopenharmony_ci *              function.  Once data transfer is started, (2) Depends
487762306a36Sopenharmony_ci *              on the type of data transfer mode Scatter/Gather mode
487862306a36Sopenharmony_ci *              or NON Scatter/Gather mode.  In NON Scatter/Gather mode,
487962306a36Sopenharmony_ci *              this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
488062306a36Sopenharmony_ci *              data transfer done.  In Scatter/Gather mode, this routine
488162306a36Sopenharmony_ci *              checks bus master command complete and dual rank busy
488262306a36Sopenharmony_ci *              bit to keep chaining SC transfer command.  Similarly,
488362306a36Sopenharmony_ci *              in Scatter/Gather mode, it checks Sccb_MGRFlag
488462306a36Sopenharmony_ci *              (F_HOST_XFER_ACT bit) for data transfer done.
488562306a36Sopenharmony_ci *
488662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
488762306a36Sopenharmony_ci
488862306a36Sopenharmony_cistatic void FPT_dataXferProcessor(u32 port, struct sccb_card *pCurrCard)
488962306a36Sopenharmony_ci{
489062306a36Sopenharmony_ci	struct sccb *currSCCB;
489162306a36Sopenharmony_ci
489262306a36Sopenharmony_ci	currSCCB = pCurrCard->currentSCCB;
489362306a36Sopenharmony_ci
489462306a36Sopenharmony_ci	if (currSCCB->Sccb_XferState & F_SG_XFER) {
489562306a36Sopenharmony_ci		if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
489662306a36Sopenharmony_ci		{
489762306a36Sopenharmony_ci			currSCCB->Sccb_sgseg += (unsigned char)SG_BUF_CNT;
489862306a36Sopenharmony_ci			currSCCB->Sccb_SGoffset = 0x00;
489962306a36Sopenharmony_ci		}
490062306a36Sopenharmony_ci		pCurrCard->globalFlags |= F_HOST_XFER_ACT;
490162306a36Sopenharmony_ci
490262306a36Sopenharmony_ci		FPT_busMstrSGDataXferStart(port, currSCCB);
490362306a36Sopenharmony_ci	}
490462306a36Sopenharmony_ci
490562306a36Sopenharmony_ci	else {
490662306a36Sopenharmony_ci		if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) {
490762306a36Sopenharmony_ci			pCurrCard->globalFlags |= F_HOST_XFER_ACT;
490862306a36Sopenharmony_ci
490962306a36Sopenharmony_ci			FPT_busMstrDataXferStart(port, currSCCB);
491062306a36Sopenharmony_ci		}
491162306a36Sopenharmony_ci	}
491262306a36Sopenharmony_ci}
491362306a36Sopenharmony_ci
491462306a36Sopenharmony_ci/*---------------------------------------------------------------------
491562306a36Sopenharmony_ci *
491662306a36Sopenharmony_ci * Function: BusMaster Scatter Gather Data Transfer Start
491762306a36Sopenharmony_ci *
491862306a36Sopenharmony_ci * Description:
491962306a36Sopenharmony_ci *
492062306a36Sopenharmony_ci *---------------------------------------------------------------------*/
492162306a36Sopenharmony_cistatic void FPT_busMstrSGDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
492262306a36Sopenharmony_ci{
492362306a36Sopenharmony_ci	u32 count, addr, tmpSGCnt;
492462306a36Sopenharmony_ci	unsigned int sg_index;
492562306a36Sopenharmony_ci	unsigned char sg_count, i;
492662306a36Sopenharmony_ci	u32 reg_offset;
492762306a36Sopenharmony_ci	struct blogic_sg_seg *segp;
492862306a36Sopenharmony_ci
492962306a36Sopenharmony_ci	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)
493062306a36Sopenharmony_ci		count = ((u32)HOST_RD_CMD) << 24;
493162306a36Sopenharmony_ci	else
493262306a36Sopenharmony_ci		count = ((u32)HOST_WRT_CMD) << 24;
493362306a36Sopenharmony_ci
493462306a36Sopenharmony_ci	sg_count = 0;
493562306a36Sopenharmony_ci	tmpSGCnt = 0;
493662306a36Sopenharmony_ci	sg_index = pcurrSCCB->Sccb_sgseg;
493762306a36Sopenharmony_ci	reg_offset = hp_aramBase;
493862306a36Sopenharmony_ci
493962306a36Sopenharmony_ci	i = (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
494062306a36Sopenharmony_ci			    ~(SGRAM_ARAM | SCATTER_EN));
494162306a36Sopenharmony_ci
494262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl, i);
494362306a36Sopenharmony_ci
494462306a36Sopenharmony_ci	while ((sg_count < (unsigned char)SG_BUF_CNT) &&
494562306a36Sopenharmony_ci			((sg_index * (unsigned int)SG_ELEMENT_SIZE) <
494662306a36Sopenharmony_ci			pcurrSCCB->DataLength)) {
494762306a36Sopenharmony_ci
494862306a36Sopenharmony_ci		segp = (struct blogic_sg_seg *)(pcurrSCCB->DataPointer) +
494962306a36Sopenharmony_ci				sg_index;
495062306a36Sopenharmony_ci		tmpSGCnt += segp->segbytes;
495162306a36Sopenharmony_ci		count |= segp->segbytes;
495262306a36Sopenharmony_ci		addr = segp->segdata;
495362306a36Sopenharmony_ci
495462306a36Sopenharmony_ci		if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
495562306a36Sopenharmony_ci			addr +=
495662306a36Sopenharmony_ci			    ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
495762306a36Sopenharmony_ci			count =
495862306a36Sopenharmony_ci			    (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
495962306a36Sopenharmony_ci			tmpSGCnt = count & 0x00FFFFFFL;
496062306a36Sopenharmony_ci		}
496162306a36Sopenharmony_ci
496262306a36Sopenharmony_ci		WR_HARP32(p_port, reg_offset, addr);
496362306a36Sopenharmony_ci		reg_offset += 4;
496462306a36Sopenharmony_ci
496562306a36Sopenharmony_ci		WR_HARP32(p_port, reg_offset, count);
496662306a36Sopenharmony_ci		reg_offset += 4;
496762306a36Sopenharmony_ci
496862306a36Sopenharmony_ci		count &= 0xFF000000L;
496962306a36Sopenharmony_ci		sg_index++;
497062306a36Sopenharmony_ci		sg_count++;
497162306a36Sopenharmony_ci
497262306a36Sopenharmony_ci	}			/*End While */
497362306a36Sopenharmony_ci
497462306a36Sopenharmony_ci	pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
497562306a36Sopenharmony_ci
497662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_sg_addr, (sg_count << 4));
497762306a36Sopenharmony_ci
497862306a36Sopenharmony_ci	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
497962306a36Sopenharmony_ci
498062306a36Sopenharmony_ci		WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
498162306a36Sopenharmony_ci
498262306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
498362306a36Sopenharmony_ci			   (DMA_PORT | SCSI_PORT | SCSI_INBIT));
498462306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
498562306a36Sopenharmony_ci	}
498662306a36Sopenharmony_ci
498762306a36Sopenharmony_ci	else {
498862306a36Sopenharmony_ci
498962306a36Sopenharmony_ci		if ((!(RD_HARPOON(p_port + hp_synctarg_0) & NARROW_SCSI)) &&
499062306a36Sopenharmony_ci		    (tmpSGCnt & 0x000000001)) {
499162306a36Sopenharmony_ci
499262306a36Sopenharmony_ci			pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
499362306a36Sopenharmony_ci			tmpSGCnt--;
499462306a36Sopenharmony_ci		}
499562306a36Sopenharmony_ci
499662306a36Sopenharmony_ci		WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
499762306a36Sopenharmony_ci
499862306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
499962306a36Sopenharmony_ci			   (SCSI_PORT | DMA_PORT | DMA_RD));
500062306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
500162306a36Sopenharmony_ci	}
500262306a36Sopenharmony_ci
500362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl, (unsigned char)(i | SCATTER_EN));
500462306a36Sopenharmony_ci
500562306a36Sopenharmony_ci}
500662306a36Sopenharmony_ci
500762306a36Sopenharmony_ci/*---------------------------------------------------------------------
500862306a36Sopenharmony_ci *
500962306a36Sopenharmony_ci * Function: BusMaster Data Transfer Start
501062306a36Sopenharmony_ci *
501162306a36Sopenharmony_ci * Description:
501262306a36Sopenharmony_ci *
501362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
501462306a36Sopenharmony_cistatic void FPT_busMstrDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
501562306a36Sopenharmony_ci{
501662306a36Sopenharmony_ci	u32 addr, count;
501762306a36Sopenharmony_ci
501862306a36Sopenharmony_ci	if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
501962306a36Sopenharmony_ci
502062306a36Sopenharmony_ci		count = pcurrSCCB->Sccb_XferCnt;
502162306a36Sopenharmony_ci
502262306a36Sopenharmony_ci		addr = (u32)(unsigned long)pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
502362306a36Sopenharmony_ci	}
502462306a36Sopenharmony_ci
502562306a36Sopenharmony_ci	else {
502662306a36Sopenharmony_ci		addr = pcurrSCCB->SensePointer;
502762306a36Sopenharmony_ci		count = pcurrSCCB->RequestSenseLength;
502862306a36Sopenharmony_ci
502962306a36Sopenharmony_ci	}
503062306a36Sopenharmony_ci
503162306a36Sopenharmony_ci	HP_SETUP_ADDR_CNT(p_port, addr, count);
503262306a36Sopenharmony_ci
503362306a36Sopenharmony_ci	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
503462306a36Sopenharmony_ci
503562306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
503662306a36Sopenharmony_ci			   (DMA_PORT | SCSI_PORT | SCSI_INBIT));
503762306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
503862306a36Sopenharmony_ci
503962306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_xfer_cmd,
504062306a36Sopenharmony_ci			   (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
504162306a36Sopenharmony_ci	}
504262306a36Sopenharmony_ci
504362306a36Sopenharmony_ci	else {
504462306a36Sopenharmony_ci
504562306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_portctrl_0,
504662306a36Sopenharmony_ci			   (SCSI_PORT | DMA_PORT | DMA_RD));
504762306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
504862306a36Sopenharmony_ci
504962306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_xfer_cmd,
505062306a36Sopenharmony_ci			   (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
505162306a36Sopenharmony_ci
505262306a36Sopenharmony_ci	}
505362306a36Sopenharmony_ci}
505462306a36Sopenharmony_ci
505562306a36Sopenharmony_ci/*---------------------------------------------------------------------
505662306a36Sopenharmony_ci *
505762306a36Sopenharmony_ci * Function: BusMaster Timeout Handler
505862306a36Sopenharmony_ci *
505962306a36Sopenharmony_ci * Description: This function is called after a bus master command busy time
506062306a36Sopenharmony_ci *               out is detected.  This routines issue halt state machine
506162306a36Sopenharmony_ci *               with a software time out for command busy.  If command busy
506262306a36Sopenharmony_ci *               is still asserted at the end of the time out, it issues
506362306a36Sopenharmony_ci *               hard abort with another software time out.  It hard abort
506462306a36Sopenharmony_ci *               command busy is also time out, it'll just give up.
506562306a36Sopenharmony_ci *
506662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
506762306a36Sopenharmony_cistatic unsigned char FPT_busMstrTimeOut(u32 p_port)
506862306a36Sopenharmony_ci{
506962306a36Sopenharmony_ci	unsigned long timeout;
507062306a36Sopenharmony_ci
507162306a36Sopenharmony_ci	timeout = LONG_WAIT;
507262306a36Sopenharmony_ci
507362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_sys_ctrl, HALT_MACH);
507462306a36Sopenharmony_ci
507562306a36Sopenharmony_ci	while ((!(RD_HARPOON(p_port + hp_ext_status) & CMD_ABORTED))
507662306a36Sopenharmony_ci	       && timeout--) {
507762306a36Sopenharmony_ci	}
507862306a36Sopenharmony_ci
507962306a36Sopenharmony_ci	if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
508062306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_sys_ctrl, HARD_ABORT);
508162306a36Sopenharmony_ci
508262306a36Sopenharmony_ci		timeout = LONG_WAIT;
508362306a36Sopenharmony_ci		while ((RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY)
508462306a36Sopenharmony_ci		       && timeout--) {
508562306a36Sopenharmony_ci		}
508662306a36Sopenharmony_ci	}
508762306a36Sopenharmony_ci
508862306a36Sopenharmony_ci	RD_HARPOON(p_port + hp_int_status);	/*Clear command complete */
508962306a36Sopenharmony_ci
509062306a36Sopenharmony_ci	if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
509162306a36Sopenharmony_ci		return 1;
509262306a36Sopenharmony_ci	}
509362306a36Sopenharmony_ci
509462306a36Sopenharmony_ci	else {
509562306a36Sopenharmony_ci		return 0;
509662306a36Sopenharmony_ci	}
509762306a36Sopenharmony_ci}
509862306a36Sopenharmony_ci
509962306a36Sopenharmony_ci/*---------------------------------------------------------------------
510062306a36Sopenharmony_ci *
510162306a36Sopenharmony_ci * Function: Host Data Transfer Abort
510262306a36Sopenharmony_ci *
510362306a36Sopenharmony_ci * Description: Abort any in progress transfer.
510462306a36Sopenharmony_ci *
510562306a36Sopenharmony_ci *---------------------------------------------------------------------*/
510662306a36Sopenharmony_cistatic void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
510762306a36Sopenharmony_ci				  struct sccb *pCurrSCCB)
510862306a36Sopenharmony_ci{
510962306a36Sopenharmony_ci
511062306a36Sopenharmony_ci	unsigned long timeout;
511162306a36Sopenharmony_ci	unsigned long remain_cnt;
511262306a36Sopenharmony_ci	u32 sg_ptr;
511362306a36Sopenharmony_ci	struct blogic_sg_seg *segp;
511462306a36Sopenharmony_ci
511562306a36Sopenharmony_ci	FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
511662306a36Sopenharmony_ci
511762306a36Sopenharmony_ci	if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
511862306a36Sopenharmony_ci
511962306a36Sopenharmony_ci		if (!(RD_HARPOON(port + hp_int_status) & INT_CMD_COMPL)) {
512062306a36Sopenharmony_ci
512162306a36Sopenharmony_ci			WR_HARPOON(port + hp_bm_ctrl,
512262306a36Sopenharmony_ci				   (RD_HARPOON(port + hp_bm_ctrl) |
512362306a36Sopenharmony_ci				    FLUSH_XFER_CNTR));
512462306a36Sopenharmony_ci			timeout = LONG_WAIT;
512562306a36Sopenharmony_ci
512662306a36Sopenharmony_ci			while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
512762306a36Sopenharmony_ci			       && timeout--) {
512862306a36Sopenharmony_ci			}
512962306a36Sopenharmony_ci
513062306a36Sopenharmony_ci			WR_HARPOON(port + hp_bm_ctrl,
513162306a36Sopenharmony_ci				   (RD_HARPOON(port + hp_bm_ctrl) &
513262306a36Sopenharmony_ci				    ~FLUSH_XFER_CNTR));
513362306a36Sopenharmony_ci
513462306a36Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
513562306a36Sopenharmony_ci
513662306a36Sopenharmony_ci				if (FPT_busMstrTimeOut(port)) {
513762306a36Sopenharmony_ci
513862306a36Sopenharmony_ci					if (pCurrSCCB->HostStatus == 0x00)
513962306a36Sopenharmony_ci
514062306a36Sopenharmony_ci						pCurrSCCB->HostStatus =
514162306a36Sopenharmony_ci						    SCCB_BM_ERR;
514262306a36Sopenharmony_ci
514362306a36Sopenharmony_ci				}
514462306a36Sopenharmony_ci
514562306a36Sopenharmony_ci				if (RD_HARPOON(port + hp_int_status) &
514662306a36Sopenharmony_ci				    INT_EXT_STATUS)
514762306a36Sopenharmony_ci
514862306a36Sopenharmony_ci					if (RD_HARPOON(port + hp_ext_status) &
514962306a36Sopenharmony_ci					    BAD_EXT_STATUS)
515062306a36Sopenharmony_ci
515162306a36Sopenharmony_ci						if (pCurrSCCB->HostStatus ==
515262306a36Sopenharmony_ci						    0x00)
515362306a36Sopenharmony_ci						{
515462306a36Sopenharmony_ci							pCurrSCCB->HostStatus =
515562306a36Sopenharmony_ci							    SCCB_BM_ERR;
515662306a36Sopenharmony_ci						}
515762306a36Sopenharmony_ci			}
515862306a36Sopenharmony_ci		}
515962306a36Sopenharmony_ci	}
516062306a36Sopenharmony_ci
516162306a36Sopenharmony_ci	else if (pCurrSCCB->Sccb_XferCnt) {
516262306a36Sopenharmony_ci
516362306a36Sopenharmony_ci		if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
516462306a36Sopenharmony_ci
516562306a36Sopenharmony_ci			WR_HARPOON(port + hp_page_ctrl,
516662306a36Sopenharmony_ci				   (RD_HARPOON(port + hp_page_ctrl) &
516762306a36Sopenharmony_ci				    ~SCATTER_EN));
516862306a36Sopenharmony_ci
516962306a36Sopenharmony_ci			WR_HARPOON(port + hp_sg_addr, 0x00);
517062306a36Sopenharmony_ci
517162306a36Sopenharmony_ci			sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
517262306a36Sopenharmony_ci
517362306a36Sopenharmony_ci			if (sg_ptr >
517462306a36Sopenharmony_ci			    (unsigned int)(pCurrSCCB->DataLength /
517562306a36Sopenharmony_ci					   SG_ELEMENT_SIZE)) {
517662306a36Sopenharmony_ci
517762306a36Sopenharmony_ci				sg_ptr = (u32)(pCurrSCCB->DataLength /
517862306a36Sopenharmony_ci							SG_ELEMENT_SIZE);
517962306a36Sopenharmony_ci			}
518062306a36Sopenharmony_ci
518162306a36Sopenharmony_ci			remain_cnt = pCurrSCCB->Sccb_XferCnt;
518262306a36Sopenharmony_ci
518362306a36Sopenharmony_ci			while (remain_cnt < 0x01000000L) {
518462306a36Sopenharmony_ci
518562306a36Sopenharmony_ci				sg_ptr--;
518662306a36Sopenharmony_ci				segp = (struct blogic_sg_seg *)(pCurrSCCB->
518762306a36Sopenharmony_ci						DataPointer) + (sg_ptr * 2);
518862306a36Sopenharmony_ci				if (remain_cnt > (unsigned long)segp->segbytes)
518962306a36Sopenharmony_ci					remain_cnt -=
519062306a36Sopenharmony_ci						(unsigned long)segp->segbytes;
519162306a36Sopenharmony_ci				else
519262306a36Sopenharmony_ci					break;
519362306a36Sopenharmony_ci			}
519462306a36Sopenharmony_ci
519562306a36Sopenharmony_ci			if (remain_cnt < 0x01000000L) {
519662306a36Sopenharmony_ci
519762306a36Sopenharmony_ci				pCurrSCCB->Sccb_SGoffset = remain_cnt;
519862306a36Sopenharmony_ci
519962306a36Sopenharmony_ci				pCurrSCCB->Sccb_sgseg = (unsigned short)sg_ptr;
520062306a36Sopenharmony_ci
520162306a36Sopenharmony_ci				if ((unsigned long)(sg_ptr * SG_ELEMENT_SIZE) ==
520262306a36Sopenharmony_ci				    pCurrSCCB->DataLength && (remain_cnt == 0))
520362306a36Sopenharmony_ci
520462306a36Sopenharmony_ci					pCurrSCCB->Sccb_XferState |=
520562306a36Sopenharmony_ci					    F_ALL_XFERRED;
520662306a36Sopenharmony_ci			}
520762306a36Sopenharmony_ci
520862306a36Sopenharmony_ci			else {
520962306a36Sopenharmony_ci
521062306a36Sopenharmony_ci				if (pCurrSCCB->HostStatus == 0x00) {
521162306a36Sopenharmony_ci
521262306a36Sopenharmony_ci					pCurrSCCB->HostStatus =
521362306a36Sopenharmony_ci					    SCCB_GROSS_FW_ERR;
521462306a36Sopenharmony_ci				}
521562306a36Sopenharmony_ci			}
521662306a36Sopenharmony_ci		}
521762306a36Sopenharmony_ci
521862306a36Sopenharmony_ci		if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
521962306a36Sopenharmony_ci
522062306a36Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
522162306a36Sopenharmony_ci
522262306a36Sopenharmony_ci				FPT_busMstrTimeOut(port);
522362306a36Sopenharmony_ci			}
522462306a36Sopenharmony_ci
522562306a36Sopenharmony_ci			else {
522662306a36Sopenharmony_ci
522762306a36Sopenharmony_ci				if (RD_HARPOON(port + hp_int_status) &
522862306a36Sopenharmony_ci				    INT_EXT_STATUS) {
522962306a36Sopenharmony_ci
523062306a36Sopenharmony_ci					if (RD_HARPOON(port + hp_ext_status) &
523162306a36Sopenharmony_ci					    BAD_EXT_STATUS) {
523262306a36Sopenharmony_ci
523362306a36Sopenharmony_ci						if (pCurrSCCB->HostStatus ==
523462306a36Sopenharmony_ci						    0x00) {
523562306a36Sopenharmony_ci
523662306a36Sopenharmony_ci							pCurrSCCB->HostStatus =
523762306a36Sopenharmony_ci							    SCCB_BM_ERR;
523862306a36Sopenharmony_ci						}
523962306a36Sopenharmony_ci					}
524062306a36Sopenharmony_ci				}
524162306a36Sopenharmony_ci
524262306a36Sopenharmony_ci			}
524362306a36Sopenharmony_ci		}
524462306a36Sopenharmony_ci
524562306a36Sopenharmony_ci		else {
524662306a36Sopenharmony_ci
524762306a36Sopenharmony_ci			if ((RD_HARPOON(port + hp_fifo_cnt)) >= BM_THRESHOLD) {
524862306a36Sopenharmony_ci
524962306a36Sopenharmony_ci				timeout = SHORT_WAIT;
525062306a36Sopenharmony_ci
525162306a36Sopenharmony_ci				while ((RD_HARPOON(port + hp_ext_status) &
525262306a36Sopenharmony_ci					BM_CMD_BUSY)
525362306a36Sopenharmony_ci				       && ((RD_HARPOON(port + hp_fifo_cnt)) >=
525462306a36Sopenharmony_ci					   BM_THRESHOLD) && timeout--) {
525562306a36Sopenharmony_ci				}
525662306a36Sopenharmony_ci			}
525762306a36Sopenharmony_ci
525862306a36Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
525962306a36Sopenharmony_ci
526062306a36Sopenharmony_ci				WR_HARPOON(port + hp_bm_ctrl,
526162306a36Sopenharmony_ci					   (RD_HARPOON(port + hp_bm_ctrl) |
526262306a36Sopenharmony_ci					    FLUSH_XFER_CNTR));
526362306a36Sopenharmony_ci
526462306a36Sopenharmony_ci				timeout = LONG_WAIT;
526562306a36Sopenharmony_ci
526662306a36Sopenharmony_ci				while ((RD_HARPOON(port + hp_ext_status) &
526762306a36Sopenharmony_ci					BM_CMD_BUSY) && timeout--) {
526862306a36Sopenharmony_ci				}
526962306a36Sopenharmony_ci
527062306a36Sopenharmony_ci				WR_HARPOON(port + hp_bm_ctrl,
527162306a36Sopenharmony_ci					   (RD_HARPOON(port + hp_bm_ctrl) &
527262306a36Sopenharmony_ci					    ~FLUSH_XFER_CNTR));
527362306a36Sopenharmony_ci
527462306a36Sopenharmony_ci				if (RD_HARPOON(port + hp_ext_status) &
527562306a36Sopenharmony_ci				    BM_CMD_BUSY) {
527662306a36Sopenharmony_ci
527762306a36Sopenharmony_ci					if (pCurrSCCB->HostStatus == 0x00) {
527862306a36Sopenharmony_ci
527962306a36Sopenharmony_ci						pCurrSCCB->HostStatus =
528062306a36Sopenharmony_ci						    SCCB_BM_ERR;
528162306a36Sopenharmony_ci					}
528262306a36Sopenharmony_ci
528362306a36Sopenharmony_ci					FPT_busMstrTimeOut(port);
528462306a36Sopenharmony_ci				}
528562306a36Sopenharmony_ci			}
528662306a36Sopenharmony_ci
528762306a36Sopenharmony_ci			if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
528862306a36Sopenharmony_ci
528962306a36Sopenharmony_ci				if (RD_HARPOON(port + hp_ext_status) &
529062306a36Sopenharmony_ci				    BAD_EXT_STATUS) {
529162306a36Sopenharmony_ci
529262306a36Sopenharmony_ci					if (pCurrSCCB->HostStatus == 0x00) {
529362306a36Sopenharmony_ci
529462306a36Sopenharmony_ci						pCurrSCCB->HostStatus =
529562306a36Sopenharmony_ci						    SCCB_BM_ERR;
529662306a36Sopenharmony_ci					}
529762306a36Sopenharmony_ci				}
529862306a36Sopenharmony_ci			}
529962306a36Sopenharmony_ci		}
530062306a36Sopenharmony_ci
530162306a36Sopenharmony_ci	}
530262306a36Sopenharmony_ci
530362306a36Sopenharmony_ci	else {
530462306a36Sopenharmony_ci
530562306a36Sopenharmony_ci		if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
530662306a36Sopenharmony_ci
530762306a36Sopenharmony_ci			timeout = LONG_WAIT;
530862306a36Sopenharmony_ci
530962306a36Sopenharmony_ci			while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
531062306a36Sopenharmony_ci			       && timeout--) {
531162306a36Sopenharmony_ci			}
531262306a36Sopenharmony_ci
531362306a36Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
531462306a36Sopenharmony_ci
531562306a36Sopenharmony_ci				if (pCurrSCCB->HostStatus == 0x00) {
531662306a36Sopenharmony_ci
531762306a36Sopenharmony_ci					pCurrSCCB->HostStatus = SCCB_BM_ERR;
531862306a36Sopenharmony_ci				}
531962306a36Sopenharmony_ci
532062306a36Sopenharmony_ci				FPT_busMstrTimeOut(port);
532162306a36Sopenharmony_ci			}
532262306a36Sopenharmony_ci		}
532362306a36Sopenharmony_ci
532462306a36Sopenharmony_ci		if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
532562306a36Sopenharmony_ci
532662306a36Sopenharmony_ci			if (RD_HARPOON(port + hp_ext_status) & BAD_EXT_STATUS) {
532762306a36Sopenharmony_ci
532862306a36Sopenharmony_ci				if (pCurrSCCB->HostStatus == 0x00) {
532962306a36Sopenharmony_ci
533062306a36Sopenharmony_ci					pCurrSCCB->HostStatus = SCCB_BM_ERR;
533162306a36Sopenharmony_ci				}
533262306a36Sopenharmony_ci			}
533362306a36Sopenharmony_ci
533462306a36Sopenharmony_ci		}
533562306a36Sopenharmony_ci
533662306a36Sopenharmony_ci		if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
533762306a36Sopenharmony_ci
533862306a36Sopenharmony_ci			WR_HARPOON(port + hp_page_ctrl,
533962306a36Sopenharmony_ci				   (RD_HARPOON(port + hp_page_ctrl) &
534062306a36Sopenharmony_ci				    ~SCATTER_EN));
534162306a36Sopenharmony_ci
534262306a36Sopenharmony_ci			WR_HARPOON(port + hp_sg_addr, 0x00);
534362306a36Sopenharmony_ci
534462306a36Sopenharmony_ci			pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
534562306a36Sopenharmony_ci
534662306a36Sopenharmony_ci			pCurrSCCB->Sccb_SGoffset = 0x00;
534762306a36Sopenharmony_ci
534862306a36Sopenharmony_ci			if ((u32)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
534962306a36Sopenharmony_ci					pCurrSCCB->DataLength) {
535062306a36Sopenharmony_ci
535162306a36Sopenharmony_ci				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
535262306a36Sopenharmony_ci				pCurrSCCB->Sccb_sgseg =
535362306a36Sopenharmony_ci				    (unsigned short)(pCurrSCCB->DataLength /
535462306a36Sopenharmony_ci						     SG_ELEMENT_SIZE);
535562306a36Sopenharmony_ci			}
535662306a36Sopenharmony_ci		}
535762306a36Sopenharmony_ci
535862306a36Sopenharmony_ci		else {
535962306a36Sopenharmony_ci			if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
536062306a36Sopenharmony_ci				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
536162306a36Sopenharmony_ci		}
536262306a36Sopenharmony_ci	}
536362306a36Sopenharmony_ci
536462306a36Sopenharmony_ci	WR_HARPOON(port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
536562306a36Sopenharmony_ci}
536662306a36Sopenharmony_ci
536762306a36Sopenharmony_ci/*---------------------------------------------------------------------
536862306a36Sopenharmony_ci *
536962306a36Sopenharmony_ci * Function: Host Data Transfer Restart
537062306a36Sopenharmony_ci *
537162306a36Sopenharmony_ci * Description: Reset the available count due to a restore data
537262306a36Sopenharmony_ci *              pointers message.
537362306a36Sopenharmony_ci *
537462306a36Sopenharmony_ci *---------------------------------------------------------------------*/
537562306a36Sopenharmony_cistatic void FPT_hostDataXferRestart(struct sccb *currSCCB)
537662306a36Sopenharmony_ci{
537762306a36Sopenharmony_ci	unsigned long data_count;
537862306a36Sopenharmony_ci	unsigned int sg_index;
537962306a36Sopenharmony_ci	struct blogic_sg_seg *segp;
538062306a36Sopenharmony_ci
538162306a36Sopenharmony_ci	if (currSCCB->Sccb_XferState & F_SG_XFER) {
538262306a36Sopenharmony_ci
538362306a36Sopenharmony_ci		currSCCB->Sccb_XferCnt = 0;
538462306a36Sopenharmony_ci
538562306a36Sopenharmony_ci		sg_index = 0xffff;	/*Index by long words into sg list. */
538662306a36Sopenharmony_ci		data_count = 0;		/*Running count of SG xfer counts. */
538762306a36Sopenharmony_ci
538862306a36Sopenharmony_ci
538962306a36Sopenharmony_ci		while (data_count < currSCCB->Sccb_ATC) {
539062306a36Sopenharmony_ci
539162306a36Sopenharmony_ci			sg_index++;
539262306a36Sopenharmony_ci			segp = (struct blogic_sg_seg *)(currSCCB->DataPointer) +
539362306a36Sopenharmony_ci						(sg_index * 2);
539462306a36Sopenharmony_ci			data_count += segp->segbytes;
539562306a36Sopenharmony_ci		}
539662306a36Sopenharmony_ci
539762306a36Sopenharmony_ci		if (data_count == currSCCB->Sccb_ATC) {
539862306a36Sopenharmony_ci
539962306a36Sopenharmony_ci			currSCCB->Sccb_SGoffset = 0;
540062306a36Sopenharmony_ci			sg_index++;
540162306a36Sopenharmony_ci		}
540262306a36Sopenharmony_ci
540362306a36Sopenharmony_ci		else {
540462306a36Sopenharmony_ci			currSCCB->Sccb_SGoffset =
540562306a36Sopenharmony_ci			    data_count - currSCCB->Sccb_ATC;
540662306a36Sopenharmony_ci		}
540762306a36Sopenharmony_ci
540862306a36Sopenharmony_ci		currSCCB->Sccb_sgseg = (unsigned short)sg_index;
540962306a36Sopenharmony_ci	}
541062306a36Sopenharmony_ci
541162306a36Sopenharmony_ci	else {
541262306a36Sopenharmony_ci		currSCCB->Sccb_XferCnt =
541362306a36Sopenharmony_ci		    currSCCB->DataLength - currSCCB->Sccb_ATC;
541462306a36Sopenharmony_ci	}
541562306a36Sopenharmony_ci}
541662306a36Sopenharmony_ci
541762306a36Sopenharmony_ci/*---------------------------------------------------------------------
541862306a36Sopenharmony_ci *
541962306a36Sopenharmony_ci * Function: FPT_scini
542062306a36Sopenharmony_ci *
542162306a36Sopenharmony_ci * Description: Setup all data structures necessary for SCAM selection.
542262306a36Sopenharmony_ci *
542362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
542462306a36Sopenharmony_ci
542562306a36Sopenharmony_cistatic void FPT_scini(unsigned char p_card, unsigned char p_our_id,
542662306a36Sopenharmony_ci		      unsigned char p_power_up)
542762306a36Sopenharmony_ci{
542862306a36Sopenharmony_ci
542962306a36Sopenharmony_ci	unsigned char loser, assigned_id;
543062306a36Sopenharmony_ci	u32 p_port;
543162306a36Sopenharmony_ci
543262306a36Sopenharmony_ci	unsigned char i, k, ScamFlg;
543362306a36Sopenharmony_ci	struct sccb_card *currCard;
543462306a36Sopenharmony_ci	struct nvram_info *pCurrNvRam;
543562306a36Sopenharmony_ci
543662306a36Sopenharmony_ci	currCard = &FPT_BL_Card[p_card];
543762306a36Sopenharmony_ci	p_port = currCard->ioPort;
543862306a36Sopenharmony_ci	pCurrNvRam = currCard->pNvRamInfo;
543962306a36Sopenharmony_ci
544062306a36Sopenharmony_ci	if (pCurrNvRam) {
544162306a36Sopenharmony_ci		ScamFlg = pCurrNvRam->niScamConf;
544262306a36Sopenharmony_ci		i = pCurrNvRam->niSysConf;
544362306a36Sopenharmony_ci	} else {
544462306a36Sopenharmony_ci		ScamFlg =
544562306a36Sopenharmony_ci		    (unsigned char)FPT_utilEERead(p_port, SCAM_CONFIG / 2);
544662306a36Sopenharmony_ci		i = (unsigned
544762306a36Sopenharmony_ci		     char)(FPT_utilEERead(p_port, (SYSTEM_CONFIG / 2)));
544862306a36Sopenharmony_ci	}
544962306a36Sopenharmony_ci	if (!(i & 0x02))	/* check if reset bus in AutoSCSI parameter set */
545062306a36Sopenharmony_ci		return;
545162306a36Sopenharmony_ci
545262306a36Sopenharmony_ci	FPT_inisci(p_card, p_port, p_our_id);
545362306a36Sopenharmony_ci
545462306a36Sopenharmony_ci	/* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
545562306a36Sopenharmony_ci	   too slow to return to SCAM selection */
545662306a36Sopenharmony_ci
545762306a36Sopenharmony_ci	/* if (p_power_up)
545862306a36Sopenharmony_ci	   FPT_Wait1Second(p_port);
545962306a36Sopenharmony_ci	   else
546062306a36Sopenharmony_ci	   FPT_Wait(p_port, TO_250ms); */
546162306a36Sopenharmony_ci
546262306a36Sopenharmony_ci	FPT_Wait1Second(p_port);
546362306a36Sopenharmony_ci
546462306a36Sopenharmony_ci	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) {
546562306a36Sopenharmony_ci		while (!(FPT_scarb(p_port, INIT_SELTD))) {
546662306a36Sopenharmony_ci		}
546762306a36Sopenharmony_ci
546862306a36Sopenharmony_ci		FPT_scsel(p_port);
546962306a36Sopenharmony_ci
547062306a36Sopenharmony_ci		do {
547162306a36Sopenharmony_ci			FPT_scxferc(p_port, SYNC_PTRN);
547262306a36Sopenharmony_ci			FPT_scxferc(p_port, DOM_MSTR);
547362306a36Sopenharmony_ci			loser =
547462306a36Sopenharmony_ci			    FPT_scsendi(p_port,
547562306a36Sopenharmony_ci					&FPT_scamInfo[p_our_id].id_string[0]);
547662306a36Sopenharmony_ci		} while (loser == 0xFF);
547762306a36Sopenharmony_ci
547862306a36Sopenharmony_ci		FPT_scbusf(p_port);
547962306a36Sopenharmony_ci
548062306a36Sopenharmony_ci		if ((p_power_up) && (!loser)) {
548162306a36Sopenharmony_ci			FPT_sresb(p_port, p_card);
548262306a36Sopenharmony_ci			FPT_Wait(p_port, TO_250ms);
548362306a36Sopenharmony_ci
548462306a36Sopenharmony_ci			while (!(FPT_scarb(p_port, INIT_SELTD))) {
548562306a36Sopenharmony_ci			}
548662306a36Sopenharmony_ci
548762306a36Sopenharmony_ci			FPT_scsel(p_port);
548862306a36Sopenharmony_ci
548962306a36Sopenharmony_ci			do {
549062306a36Sopenharmony_ci				FPT_scxferc(p_port, SYNC_PTRN);
549162306a36Sopenharmony_ci				FPT_scxferc(p_port, DOM_MSTR);
549262306a36Sopenharmony_ci				loser =
549362306a36Sopenharmony_ci				    FPT_scsendi(p_port,
549462306a36Sopenharmony_ci						&FPT_scamInfo[p_our_id].
549562306a36Sopenharmony_ci						id_string[0]);
549662306a36Sopenharmony_ci			} while (loser == 0xFF);
549762306a36Sopenharmony_ci
549862306a36Sopenharmony_ci			FPT_scbusf(p_port);
549962306a36Sopenharmony_ci		}
550062306a36Sopenharmony_ci	}
550162306a36Sopenharmony_ci
550262306a36Sopenharmony_ci	else {
550362306a36Sopenharmony_ci		loser = 0;
550462306a36Sopenharmony_ci	}
550562306a36Sopenharmony_ci
550662306a36Sopenharmony_ci	if (!loser) {
550762306a36Sopenharmony_ci
550862306a36Sopenharmony_ci		FPT_scamInfo[p_our_id].state = ID_ASSIGNED;
550962306a36Sopenharmony_ci
551062306a36Sopenharmony_ci		if (ScamFlg & SCAM_ENABLED) {
551162306a36Sopenharmony_ci
551262306a36Sopenharmony_ci			for (i = 0; i < MAX_SCSI_TAR; i++) {
551362306a36Sopenharmony_ci				if ((FPT_scamInfo[i].state == ID_UNASSIGNED) ||
551462306a36Sopenharmony_ci				    (FPT_scamInfo[i].state == ID_UNUSED)) {
551562306a36Sopenharmony_ci					if (FPT_scsell(p_port, i)) {
551662306a36Sopenharmony_ci						FPT_scamInfo[i].state = LEGACY;
551762306a36Sopenharmony_ci						if ((FPT_scamInfo[i].
551862306a36Sopenharmony_ci						     id_string[0] != 0xFF)
551962306a36Sopenharmony_ci						    || (FPT_scamInfo[i].
552062306a36Sopenharmony_ci							id_string[1] != 0xFA)) {
552162306a36Sopenharmony_ci
552262306a36Sopenharmony_ci							FPT_scamInfo[i].
552362306a36Sopenharmony_ci							    id_string[0] = 0xFF;
552462306a36Sopenharmony_ci							FPT_scamInfo[i].
552562306a36Sopenharmony_ci							    id_string[1] = 0xFA;
552662306a36Sopenharmony_ci							if (pCurrNvRam == NULL)
552762306a36Sopenharmony_ci								currCard->
552862306a36Sopenharmony_ci								    globalFlags
552962306a36Sopenharmony_ci								    |=
553062306a36Sopenharmony_ci								    F_UPDATE_EEPROM;
553162306a36Sopenharmony_ci						}
553262306a36Sopenharmony_ci					}
553362306a36Sopenharmony_ci				}
553462306a36Sopenharmony_ci			}
553562306a36Sopenharmony_ci
553662306a36Sopenharmony_ci			FPT_sresb(p_port, p_card);
553762306a36Sopenharmony_ci			FPT_Wait1Second(p_port);
553862306a36Sopenharmony_ci			while (!(FPT_scarb(p_port, INIT_SELTD))) {
553962306a36Sopenharmony_ci			}
554062306a36Sopenharmony_ci			FPT_scsel(p_port);
554162306a36Sopenharmony_ci			FPT_scasid(p_card, p_port);
554262306a36Sopenharmony_ci		}
554362306a36Sopenharmony_ci
554462306a36Sopenharmony_ci	}
554562306a36Sopenharmony_ci
554662306a36Sopenharmony_ci	else if ((loser) && (ScamFlg & SCAM_ENABLED)) {
554762306a36Sopenharmony_ci		FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
554862306a36Sopenharmony_ci		assigned_id = 0;
554962306a36Sopenharmony_ci		FPT_scwtsel(p_port);
555062306a36Sopenharmony_ci
555162306a36Sopenharmony_ci		do {
555262306a36Sopenharmony_ci			while (FPT_scxferc(p_port, 0x00) != SYNC_PTRN) {
555362306a36Sopenharmony_ci			}
555462306a36Sopenharmony_ci
555562306a36Sopenharmony_ci			i = FPT_scxferc(p_port, 0x00);
555662306a36Sopenharmony_ci			if (i == ASSIGN_ID) {
555762306a36Sopenharmony_ci				if (!
555862306a36Sopenharmony_ci				    (FPT_scsendi
555962306a36Sopenharmony_ci				     (p_port,
556062306a36Sopenharmony_ci				      &FPT_scamInfo[p_our_id].id_string[0]))) {
556162306a36Sopenharmony_ci					i = FPT_scxferc(p_port, 0x00);
556262306a36Sopenharmony_ci					if (FPT_scvalq(i)) {
556362306a36Sopenharmony_ci						k = FPT_scxferc(p_port, 0x00);
556462306a36Sopenharmony_ci
556562306a36Sopenharmony_ci						if (FPT_scvalq(k)) {
556662306a36Sopenharmony_ci							currCard->ourId =
556762306a36Sopenharmony_ci							    ((unsigned char)(i
556862306a36Sopenharmony_ci									     <<
556962306a36Sopenharmony_ci									     3)
557062306a36Sopenharmony_ci							     +
557162306a36Sopenharmony_ci							     (k &
557262306a36Sopenharmony_ci							      (unsigned char)7))
557362306a36Sopenharmony_ci							    & (unsigned char)
557462306a36Sopenharmony_ci							    0x3F;
557562306a36Sopenharmony_ci							FPT_inisci(p_card,
557662306a36Sopenharmony_ci								   p_port,
557762306a36Sopenharmony_ci								   p_our_id);
557862306a36Sopenharmony_ci							FPT_scamInfo[currCard->
557962306a36Sopenharmony_ci								     ourId].
558062306a36Sopenharmony_ci							    state = ID_ASSIGNED;
558162306a36Sopenharmony_ci							FPT_scamInfo[currCard->
558262306a36Sopenharmony_ci								     ourId].
558362306a36Sopenharmony_ci							    id_string[0]
558462306a36Sopenharmony_ci							    = SLV_TYPE_CODE0;
558562306a36Sopenharmony_ci							assigned_id = 1;
558662306a36Sopenharmony_ci						}
558762306a36Sopenharmony_ci					}
558862306a36Sopenharmony_ci				}
558962306a36Sopenharmony_ci			}
559062306a36Sopenharmony_ci
559162306a36Sopenharmony_ci			else if (i == SET_P_FLAG) {
559262306a36Sopenharmony_ci				if (!(FPT_scsendi(p_port,
559362306a36Sopenharmony_ci						  &FPT_scamInfo[p_our_id].
559462306a36Sopenharmony_ci						  id_string[0])))
559562306a36Sopenharmony_ci					FPT_scamInfo[p_our_id].id_string[0] |=
559662306a36Sopenharmony_ci					    0x80;
559762306a36Sopenharmony_ci			}
559862306a36Sopenharmony_ci		} while (!assigned_id);
559962306a36Sopenharmony_ci
560062306a36Sopenharmony_ci		while (FPT_scxferc(p_port, 0x00) != CFG_CMPLT) {
560162306a36Sopenharmony_ci		}
560262306a36Sopenharmony_ci	}
560362306a36Sopenharmony_ci
560462306a36Sopenharmony_ci	if (ScamFlg & SCAM_ENABLED) {
560562306a36Sopenharmony_ci		FPT_scbusf(p_port);
560662306a36Sopenharmony_ci		if (currCard->globalFlags & F_UPDATE_EEPROM) {
560762306a36Sopenharmony_ci			FPT_scsavdi(p_card, p_port);
560862306a36Sopenharmony_ci			currCard->globalFlags &= ~F_UPDATE_EEPROM;
560962306a36Sopenharmony_ci		}
561062306a36Sopenharmony_ci	}
561162306a36Sopenharmony_ci
561262306a36Sopenharmony_ci/*
561362306a36Sopenharmony_ci   for (i=0,k=0; i < MAX_SCSI_TAR; i++)
561462306a36Sopenharmony_ci      {
561562306a36Sopenharmony_ci      if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
561662306a36Sopenharmony_ci         (FPT_scamInfo[i].state == LEGACY))
561762306a36Sopenharmony_ci         k++;
561862306a36Sopenharmony_ci      }
561962306a36Sopenharmony_ci
562062306a36Sopenharmony_ci   if (k==2)
562162306a36Sopenharmony_ci      currCard->globalFlags |= F_SINGLE_DEVICE;
562262306a36Sopenharmony_ci   else
562362306a36Sopenharmony_ci      currCard->globalFlags &= ~F_SINGLE_DEVICE;
562462306a36Sopenharmony_ci*/
562562306a36Sopenharmony_ci}
562662306a36Sopenharmony_ci
562762306a36Sopenharmony_ci/*---------------------------------------------------------------------
562862306a36Sopenharmony_ci *
562962306a36Sopenharmony_ci * Function: FPT_scarb
563062306a36Sopenharmony_ci *
563162306a36Sopenharmony_ci * Description: Gain control of the bus and wait SCAM select time (250ms)
563262306a36Sopenharmony_ci *
563362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
563462306a36Sopenharmony_ci
563562306a36Sopenharmony_cistatic int FPT_scarb(u32 p_port, unsigned char p_sel_type)
563662306a36Sopenharmony_ci{
563762306a36Sopenharmony_ci	if (p_sel_type == INIT_SELTD) {
563862306a36Sopenharmony_ci
563962306a36Sopenharmony_ci		while (RD_HARPOON(p_port + hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {
564062306a36Sopenharmony_ci		}
564162306a36Sopenharmony_ci
564262306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL)
564362306a36Sopenharmony_ci			return 0;
564462306a36Sopenharmony_ci
564562306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsidata_0) != 00)
564662306a36Sopenharmony_ci			return 0;
564762306a36Sopenharmony_ci
564862306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig,
564962306a36Sopenharmony_ci			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_BSY));
565062306a36Sopenharmony_ci
565162306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) {
565262306a36Sopenharmony_ci
565362306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_scsisig,
565462306a36Sopenharmony_ci				   (RD_HARPOON(p_port + hp_scsisig) &
565562306a36Sopenharmony_ci				    ~SCSI_BSY));
565662306a36Sopenharmony_ci			return 0;
565762306a36Sopenharmony_ci		}
565862306a36Sopenharmony_ci
565962306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_scsisig,
566062306a36Sopenharmony_ci			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_SEL));
566162306a36Sopenharmony_ci
566262306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsidata_0) != 00) {
566362306a36Sopenharmony_ci
566462306a36Sopenharmony_ci			WR_HARPOON(p_port + hp_scsisig,
566562306a36Sopenharmony_ci				   (RD_HARPOON(p_port + hp_scsisig) &
566662306a36Sopenharmony_ci				    ~(SCSI_BSY | SCSI_SEL)));
566762306a36Sopenharmony_ci			return 0;
566862306a36Sopenharmony_ci		}
566962306a36Sopenharmony_ci	}
567062306a36Sopenharmony_ci
567162306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
567262306a36Sopenharmony_ci					   & ~ACTdeassert));
567362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsireset, SCAM_EN);
567462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, 0x00);
567562306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_1, 0x00);
567662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, SCSI_BUS_EN);
567762306a36Sopenharmony_ci
567862306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig,
567962306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_scsisig) | SCSI_MSG));
568062306a36Sopenharmony_ci
568162306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, (RD_HARPOON(p_port + hp_scsisig)
568262306a36Sopenharmony_ci					 & ~SCSI_BSY));
568362306a36Sopenharmony_ci
568462306a36Sopenharmony_ci	FPT_Wait(p_port, TO_250ms);
568562306a36Sopenharmony_ci
568662306a36Sopenharmony_ci	return 1;
568762306a36Sopenharmony_ci}
568862306a36Sopenharmony_ci
568962306a36Sopenharmony_ci/*---------------------------------------------------------------------
569062306a36Sopenharmony_ci *
569162306a36Sopenharmony_ci * Function: FPT_scbusf
569262306a36Sopenharmony_ci *
569362306a36Sopenharmony_ci * Description: Release the SCSI bus and disable SCAM selection.
569462306a36Sopenharmony_ci *
569562306a36Sopenharmony_ci *---------------------------------------------------------------------*/
569662306a36Sopenharmony_ci
569762306a36Sopenharmony_cistatic void FPT_scbusf(u32 p_port)
569862306a36Sopenharmony_ci{
569962306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl,
570062306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
570162306a36Sopenharmony_ci
570262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, 0x00);
570362306a36Sopenharmony_ci
570462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, (RD_HARPOON(p_port + hp_portctrl_0)
570562306a36Sopenharmony_ci					    & ~SCSI_BUS_EN));
570662306a36Sopenharmony_ci
570762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, 0x00);
570862306a36Sopenharmony_ci
570962306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsireset, (RD_HARPOON(p_port + hp_scsireset)
571062306a36Sopenharmony_ci					   & ~SCAM_EN));
571162306a36Sopenharmony_ci
571262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
571362306a36Sopenharmony_ci					   | ACTdeassert));
571462306a36Sopenharmony_ci
571562306a36Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
571662306a36Sopenharmony_ci
571762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl,
571862306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_page_ctrl) & ~G_INT_DISABLE));
571962306a36Sopenharmony_ci}
572062306a36Sopenharmony_ci
572162306a36Sopenharmony_ci/*---------------------------------------------------------------------
572262306a36Sopenharmony_ci *
572362306a36Sopenharmony_ci * Function: FPT_scasid
572462306a36Sopenharmony_ci *
572562306a36Sopenharmony_ci * Description: Assign an ID to all the SCAM devices.
572662306a36Sopenharmony_ci *
572762306a36Sopenharmony_ci *---------------------------------------------------------------------*/
572862306a36Sopenharmony_ci
572962306a36Sopenharmony_cistatic void FPT_scasid(unsigned char p_card, u32 p_port)
573062306a36Sopenharmony_ci{
573162306a36Sopenharmony_ci	unsigned char temp_id_string[ID_STRING_LENGTH];
573262306a36Sopenharmony_ci
573362306a36Sopenharmony_ci	unsigned char i, k, scam_id;
573462306a36Sopenharmony_ci	unsigned char crcBytes[3];
573562306a36Sopenharmony_ci	struct nvram_info *pCurrNvRam;
573662306a36Sopenharmony_ci	unsigned short *pCrcBytes;
573762306a36Sopenharmony_ci
573862306a36Sopenharmony_ci	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
573962306a36Sopenharmony_ci
574062306a36Sopenharmony_ci	i = 0;
574162306a36Sopenharmony_ci
574262306a36Sopenharmony_ci	while (!i) {
574362306a36Sopenharmony_ci
574462306a36Sopenharmony_ci		for (k = 0; k < ID_STRING_LENGTH; k++) {
574562306a36Sopenharmony_ci			temp_id_string[k] = (unsigned char)0x00;
574662306a36Sopenharmony_ci		}
574762306a36Sopenharmony_ci
574862306a36Sopenharmony_ci		FPT_scxferc(p_port, SYNC_PTRN);
574962306a36Sopenharmony_ci		FPT_scxferc(p_port, ASSIGN_ID);
575062306a36Sopenharmony_ci
575162306a36Sopenharmony_ci		if (!(FPT_sciso(p_port, &temp_id_string[0]))) {
575262306a36Sopenharmony_ci			if (pCurrNvRam) {
575362306a36Sopenharmony_ci				pCrcBytes = (unsigned short *)&crcBytes[0];
575462306a36Sopenharmony_ci				*pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
575562306a36Sopenharmony_ci				crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
575662306a36Sopenharmony_ci				temp_id_string[1] = crcBytes[2];
575762306a36Sopenharmony_ci				temp_id_string[2] = crcBytes[0];
575862306a36Sopenharmony_ci				temp_id_string[3] = crcBytes[1];
575962306a36Sopenharmony_ci				for (k = 4; k < ID_STRING_LENGTH; k++)
576062306a36Sopenharmony_ci					temp_id_string[k] = (unsigned char)0x00;
576162306a36Sopenharmony_ci			}
576262306a36Sopenharmony_ci			i = FPT_scmachid(p_card, temp_id_string);
576362306a36Sopenharmony_ci
576462306a36Sopenharmony_ci			if (i == CLR_PRIORITY) {
576562306a36Sopenharmony_ci				FPT_scxferc(p_port, MISC_CODE);
576662306a36Sopenharmony_ci				FPT_scxferc(p_port, CLR_P_FLAG);
576762306a36Sopenharmony_ci				i = 0;	/*Not the last ID yet. */
576862306a36Sopenharmony_ci			}
576962306a36Sopenharmony_ci
577062306a36Sopenharmony_ci			else if (i != NO_ID_AVAIL) {
577162306a36Sopenharmony_ci				if (i < 8)
577262306a36Sopenharmony_ci					FPT_scxferc(p_port, ID_0_7);
577362306a36Sopenharmony_ci				else
577462306a36Sopenharmony_ci					FPT_scxferc(p_port, ID_8_F);
577562306a36Sopenharmony_ci
577662306a36Sopenharmony_ci				scam_id = (i & (unsigned char)0x07);
577762306a36Sopenharmony_ci
577862306a36Sopenharmony_ci				for (k = 1; k < 0x08; k <<= 1)
577962306a36Sopenharmony_ci					if (!(k & i))
578062306a36Sopenharmony_ci						scam_id += 0x08;	/*Count number of zeros in DB0-3. */
578162306a36Sopenharmony_ci
578262306a36Sopenharmony_ci				FPT_scxferc(p_port, scam_id);
578362306a36Sopenharmony_ci
578462306a36Sopenharmony_ci				i = 0;	/*Not the last ID yet. */
578562306a36Sopenharmony_ci			}
578662306a36Sopenharmony_ci		}
578762306a36Sopenharmony_ci
578862306a36Sopenharmony_ci		else {
578962306a36Sopenharmony_ci			i = 1;
579062306a36Sopenharmony_ci		}
579162306a36Sopenharmony_ci
579262306a36Sopenharmony_ci	}			/*End while */
579362306a36Sopenharmony_ci
579462306a36Sopenharmony_ci	FPT_scxferc(p_port, SYNC_PTRN);
579562306a36Sopenharmony_ci	FPT_scxferc(p_port, CFG_CMPLT);
579662306a36Sopenharmony_ci}
579762306a36Sopenharmony_ci
579862306a36Sopenharmony_ci/*---------------------------------------------------------------------
579962306a36Sopenharmony_ci *
580062306a36Sopenharmony_ci * Function: FPT_scsel
580162306a36Sopenharmony_ci *
580262306a36Sopenharmony_ci * Description: Select all the SCAM devices.
580362306a36Sopenharmony_ci *
580462306a36Sopenharmony_ci *---------------------------------------------------------------------*/
580562306a36Sopenharmony_ci
580662306a36Sopenharmony_cistatic void FPT_scsel(u32 p_port)
580762306a36Sopenharmony_ci{
580862306a36Sopenharmony_ci
580962306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, SCSI_SEL);
581062306a36Sopenharmony_ci	FPT_scwiros(p_port, SCSI_MSG);
581162306a36Sopenharmony_ci
581262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, (SCSI_SEL | SCSI_BSY));
581362306a36Sopenharmony_ci
581462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig,
581562306a36Sopenharmony_ci		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
581662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0,
581762306a36Sopenharmony_ci		   (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) |
581862306a36Sopenharmony_ci				   (unsigned char)(BIT(7) + BIT(6))));
581962306a36Sopenharmony_ci
582062306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
582162306a36Sopenharmony_ci	FPT_scwiros(p_port, SCSI_SEL);
582262306a36Sopenharmony_ci
582362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0,
582462306a36Sopenharmony_ci		   (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) &
582562306a36Sopenharmony_ci				   ~(unsigned char)BIT(6)));
582662306a36Sopenharmony_ci	FPT_scwirod(p_port, BIT(6));
582762306a36Sopenharmony_ci
582862306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsisig,
582962306a36Sopenharmony_ci		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
583062306a36Sopenharmony_ci}
583162306a36Sopenharmony_ci
583262306a36Sopenharmony_ci/*---------------------------------------------------------------------
583362306a36Sopenharmony_ci *
583462306a36Sopenharmony_ci * Function: FPT_scxferc
583562306a36Sopenharmony_ci *
583662306a36Sopenharmony_ci * Description: Handshake the p_data (DB4-0) across the bus.
583762306a36Sopenharmony_ci *
583862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
583962306a36Sopenharmony_ci
584062306a36Sopenharmony_cistatic unsigned char FPT_scxferc(u32 p_port, unsigned char p_data)
584162306a36Sopenharmony_ci{
584262306a36Sopenharmony_ci	unsigned char curr_data, ret_data;
584362306a36Sopenharmony_ci
584462306a36Sopenharmony_ci	curr_data = p_data | BIT(7) | BIT(5);	/*Start with DB7 & DB5 asserted. */
584562306a36Sopenharmony_ci
584662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
584762306a36Sopenharmony_ci
584862306a36Sopenharmony_ci	curr_data &= ~BIT(7);
584962306a36Sopenharmony_ci
585062306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
585162306a36Sopenharmony_ci
585262306a36Sopenharmony_ci	FPT_scwirod(p_port, BIT(7));	/*Wait for DB7 to be released. */
585362306a36Sopenharmony_ci	while (!(RD_HARPOON(p_port + hp_scsidata_0) & BIT(5))) ;
585462306a36Sopenharmony_ci
585562306a36Sopenharmony_ci	ret_data = (RD_HARPOON(p_port + hp_scsidata_0) & (unsigned char)0x1F);
585662306a36Sopenharmony_ci
585762306a36Sopenharmony_ci	curr_data |= BIT(6);
585862306a36Sopenharmony_ci
585962306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
586062306a36Sopenharmony_ci
586162306a36Sopenharmony_ci	curr_data &= ~BIT(5);
586262306a36Sopenharmony_ci
586362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
586462306a36Sopenharmony_ci
586562306a36Sopenharmony_ci	FPT_scwirod(p_port, BIT(5));	/*Wait for DB5 to be released. */
586662306a36Sopenharmony_ci
586762306a36Sopenharmony_ci	curr_data &= ~(BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0));	/*Release data bits */
586862306a36Sopenharmony_ci	curr_data |= BIT(7);
586962306a36Sopenharmony_ci
587062306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
587162306a36Sopenharmony_ci
587262306a36Sopenharmony_ci	curr_data &= ~BIT(6);
587362306a36Sopenharmony_ci
587462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
587562306a36Sopenharmony_ci
587662306a36Sopenharmony_ci	FPT_scwirod(p_port, BIT(6));	/*Wait for DB6 to be released. */
587762306a36Sopenharmony_ci
587862306a36Sopenharmony_ci	return ret_data;
587962306a36Sopenharmony_ci}
588062306a36Sopenharmony_ci
588162306a36Sopenharmony_ci/*---------------------------------------------------------------------
588262306a36Sopenharmony_ci *
588362306a36Sopenharmony_ci * Function: FPT_scsendi
588462306a36Sopenharmony_ci *
588562306a36Sopenharmony_ci * Description: Transfer our Identification string to determine if we
588662306a36Sopenharmony_ci *              will be the dominant master.
588762306a36Sopenharmony_ci *
588862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
588962306a36Sopenharmony_ci
589062306a36Sopenharmony_cistatic unsigned char FPT_scsendi(u32 p_port, unsigned char p_id_string[])
589162306a36Sopenharmony_ci{
589262306a36Sopenharmony_ci	unsigned char ret_data, byte_cnt, bit_cnt, defer;
589362306a36Sopenharmony_ci
589462306a36Sopenharmony_ci	defer = 0;
589562306a36Sopenharmony_ci
589662306a36Sopenharmony_ci	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
589762306a36Sopenharmony_ci
589862306a36Sopenharmony_ci		for (bit_cnt = 0x80; bit_cnt != 0; bit_cnt >>= 1) {
589962306a36Sopenharmony_ci
590062306a36Sopenharmony_ci			if (defer)
590162306a36Sopenharmony_ci				ret_data = FPT_scxferc(p_port, 00);
590262306a36Sopenharmony_ci
590362306a36Sopenharmony_ci			else if (p_id_string[byte_cnt] & bit_cnt)
590462306a36Sopenharmony_ci
590562306a36Sopenharmony_ci				ret_data = FPT_scxferc(p_port, 02);
590662306a36Sopenharmony_ci
590762306a36Sopenharmony_ci			else {
590862306a36Sopenharmony_ci
590962306a36Sopenharmony_ci				ret_data = FPT_scxferc(p_port, 01);
591062306a36Sopenharmony_ci				if (ret_data & 02)
591162306a36Sopenharmony_ci					defer = 1;
591262306a36Sopenharmony_ci			}
591362306a36Sopenharmony_ci
591462306a36Sopenharmony_ci			if ((ret_data & 0x1C) == 0x10)
591562306a36Sopenharmony_ci				return 0x00;	/*End of isolation stage, we won! */
591662306a36Sopenharmony_ci
591762306a36Sopenharmony_ci			if (ret_data & 0x1C)
591862306a36Sopenharmony_ci				return 0xFF;
591962306a36Sopenharmony_ci
592062306a36Sopenharmony_ci			if ((defer) && (!(ret_data & 0x1F)))
592162306a36Sopenharmony_ci				return 0x01;	/*End of isolation stage, we lost. */
592262306a36Sopenharmony_ci
592362306a36Sopenharmony_ci		}		/*bit loop */
592462306a36Sopenharmony_ci
592562306a36Sopenharmony_ci	}			/*byte loop */
592662306a36Sopenharmony_ci
592762306a36Sopenharmony_ci	if (defer)
592862306a36Sopenharmony_ci		return 0x01;	/*We lost */
592962306a36Sopenharmony_ci	else
593062306a36Sopenharmony_ci		return 0;	/*We WON! Yeeessss! */
593162306a36Sopenharmony_ci}
593262306a36Sopenharmony_ci
593362306a36Sopenharmony_ci/*---------------------------------------------------------------------
593462306a36Sopenharmony_ci *
593562306a36Sopenharmony_ci * Function: FPT_sciso
593662306a36Sopenharmony_ci *
593762306a36Sopenharmony_ci * Description: Transfer the Identification string.
593862306a36Sopenharmony_ci *
593962306a36Sopenharmony_ci *---------------------------------------------------------------------*/
594062306a36Sopenharmony_ci
594162306a36Sopenharmony_cistatic unsigned char FPT_sciso(u32 p_port, unsigned char p_id_string[])
594262306a36Sopenharmony_ci{
594362306a36Sopenharmony_ci	unsigned char ret_data, the_data, byte_cnt, bit_cnt;
594462306a36Sopenharmony_ci
594562306a36Sopenharmony_ci	the_data = 0;
594662306a36Sopenharmony_ci
594762306a36Sopenharmony_ci	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
594862306a36Sopenharmony_ci
594962306a36Sopenharmony_ci		for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
595062306a36Sopenharmony_ci
595162306a36Sopenharmony_ci			ret_data = FPT_scxferc(p_port, 0);
595262306a36Sopenharmony_ci
595362306a36Sopenharmony_ci			if (ret_data & 0xFC)
595462306a36Sopenharmony_ci				return 0xFF;
595562306a36Sopenharmony_ci
595662306a36Sopenharmony_ci			else {
595762306a36Sopenharmony_ci
595862306a36Sopenharmony_ci				the_data <<= 1;
595962306a36Sopenharmony_ci				if (ret_data & BIT(1)) {
596062306a36Sopenharmony_ci					the_data |= 1;
596162306a36Sopenharmony_ci				}
596262306a36Sopenharmony_ci			}
596362306a36Sopenharmony_ci
596462306a36Sopenharmony_ci			if ((ret_data & 0x1F) == 0) {
596562306a36Sopenharmony_ci/*
596662306a36Sopenharmony_ci				if(bit_cnt != 0 || bit_cnt != 8)
596762306a36Sopenharmony_ci				{
596862306a36Sopenharmony_ci					byte_cnt = 0;
596962306a36Sopenharmony_ci					bit_cnt = 0;
597062306a36Sopenharmony_ci					FPT_scxferc(p_port, SYNC_PTRN);
597162306a36Sopenharmony_ci					FPT_scxferc(p_port, ASSIGN_ID);
597262306a36Sopenharmony_ci					continue;
597362306a36Sopenharmony_ci				}
597462306a36Sopenharmony_ci*/
597562306a36Sopenharmony_ci				if (byte_cnt)
597662306a36Sopenharmony_ci					return 0x00;
597762306a36Sopenharmony_ci				else
597862306a36Sopenharmony_ci					return 0xFF;
597962306a36Sopenharmony_ci			}
598062306a36Sopenharmony_ci
598162306a36Sopenharmony_ci		}		/*bit loop */
598262306a36Sopenharmony_ci
598362306a36Sopenharmony_ci		p_id_string[byte_cnt] = the_data;
598462306a36Sopenharmony_ci
598562306a36Sopenharmony_ci	}			/*byte loop */
598662306a36Sopenharmony_ci
598762306a36Sopenharmony_ci	return 0;
598862306a36Sopenharmony_ci}
598962306a36Sopenharmony_ci
599062306a36Sopenharmony_ci/*---------------------------------------------------------------------
599162306a36Sopenharmony_ci *
599262306a36Sopenharmony_ci * Function: FPT_scwirod
599362306a36Sopenharmony_ci *
599462306a36Sopenharmony_ci * Description: Sample the SCSI data bus making sure the signal has been
599562306a36Sopenharmony_ci *              deasserted for the correct number of consecutive samples.
599662306a36Sopenharmony_ci *
599762306a36Sopenharmony_ci *---------------------------------------------------------------------*/
599862306a36Sopenharmony_ci
599962306a36Sopenharmony_cistatic void FPT_scwirod(u32 p_port, unsigned char p_data_bit)
600062306a36Sopenharmony_ci{
600162306a36Sopenharmony_ci	unsigned char i;
600262306a36Sopenharmony_ci
600362306a36Sopenharmony_ci	i = 0;
600462306a36Sopenharmony_ci	while (i < MAX_SCSI_TAR) {
600562306a36Sopenharmony_ci
600662306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsidata_0) & p_data_bit)
600762306a36Sopenharmony_ci
600862306a36Sopenharmony_ci			i = 0;
600962306a36Sopenharmony_ci
601062306a36Sopenharmony_ci		else
601162306a36Sopenharmony_ci
601262306a36Sopenharmony_ci			i++;
601362306a36Sopenharmony_ci
601462306a36Sopenharmony_ci	}
601562306a36Sopenharmony_ci}
601662306a36Sopenharmony_ci
601762306a36Sopenharmony_ci/*---------------------------------------------------------------------
601862306a36Sopenharmony_ci *
601962306a36Sopenharmony_ci * Function: FPT_scwiros
602062306a36Sopenharmony_ci *
602162306a36Sopenharmony_ci * Description: Sample the SCSI Signal lines making sure the signal has been
602262306a36Sopenharmony_ci *              deasserted for the correct number of consecutive samples.
602362306a36Sopenharmony_ci *
602462306a36Sopenharmony_ci *---------------------------------------------------------------------*/
602562306a36Sopenharmony_ci
602662306a36Sopenharmony_cistatic void FPT_scwiros(u32 p_port, unsigned char p_data_bit)
602762306a36Sopenharmony_ci{
602862306a36Sopenharmony_ci	unsigned char i;
602962306a36Sopenharmony_ci
603062306a36Sopenharmony_ci	i = 0;
603162306a36Sopenharmony_ci	while (i < MAX_SCSI_TAR) {
603262306a36Sopenharmony_ci
603362306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_scsisig) & p_data_bit)
603462306a36Sopenharmony_ci
603562306a36Sopenharmony_ci			i = 0;
603662306a36Sopenharmony_ci
603762306a36Sopenharmony_ci		else
603862306a36Sopenharmony_ci
603962306a36Sopenharmony_ci			i++;
604062306a36Sopenharmony_ci
604162306a36Sopenharmony_ci	}
604262306a36Sopenharmony_ci}
604362306a36Sopenharmony_ci
604462306a36Sopenharmony_ci/*---------------------------------------------------------------------
604562306a36Sopenharmony_ci *
604662306a36Sopenharmony_ci * Function: FPT_scvalq
604762306a36Sopenharmony_ci *
604862306a36Sopenharmony_ci * Description: Make sure we received a valid data byte.
604962306a36Sopenharmony_ci *
605062306a36Sopenharmony_ci *---------------------------------------------------------------------*/
605162306a36Sopenharmony_ci
605262306a36Sopenharmony_cistatic unsigned char FPT_scvalq(unsigned char p_quintet)
605362306a36Sopenharmony_ci{
605462306a36Sopenharmony_ci	unsigned char count;
605562306a36Sopenharmony_ci
605662306a36Sopenharmony_ci	for (count = 1; count < 0x08; count <<= 1) {
605762306a36Sopenharmony_ci		if (!(p_quintet & count))
605862306a36Sopenharmony_ci			p_quintet -= 0x80;
605962306a36Sopenharmony_ci	}
606062306a36Sopenharmony_ci
606162306a36Sopenharmony_ci	if (p_quintet & 0x18)
606262306a36Sopenharmony_ci		return 0;
606362306a36Sopenharmony_ci
606462306a36Sopenharmony_ci	else
606562306a36Sopenharmony_ci		return 1;
606662306a36Sopenharmony_ci}
606762306a36Sopenharmony_ci
606862306a36Sopenharmony_ci/*---------------------------------------------------------------------
606962306a36Sopenharmony_ci *
607062306a36Sopenharmony_ci * Function: FPT_scsell
607162306a36Sopenharmony_ci *
607262306a36Sopenharmony_ci * Description: Select the specified device ID using a selection timeout
607362306a36Sopenharmony_ci *              less than 4ms.  If somebody responds then it is a legacy
607462306a36Sopenharmony_ci *              drive and this ID must be marked as such.
607562306a36Sopenharmony_ci *
607662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
607762306a36Sopenharmony_ci
607862306a36Sopenharmony_cistatic unsigned char FPT_scsell(u32 p_port, unsigned char targ_id)
607962306a36Sopenharmony_ci{
608062306a36Sopenharmony_ci	unsigned long i;
608162306a36Sopenharmony_ci
608262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl,
608362306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
608462306a36Sopenharmony_ci
608562306a36Sopenharmony_ci	ARAM_ACCESS(p_port);
608662306a36Sopenharmony_ci
608762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_addstat,
608862306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_addstat) | SCAM_TIMER));
608962306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, TO_4ms);
609062306a36Sopenharmony_ci
609162306a36Sopenharmony_ci	for (i = p_port + CMD_STRT; i < p_port + CMD_STRT + 12; i += 2) {
609262306a36Sopenharmony_ci		WRW_HARPOON(i, (MPM_OP + ACOMMAND));
609362306a36Sopenharmony_ci	}
609462306a36Sopenharmony_ci	WRW_HARPOON(i, (BRH_OP + ALWAYS + NP));
609562306a36Sopenharmony_ci
609662306a36Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat),
609762306a36Sopenharmony_ci		    (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
609862306a36Sopenharmony_ci
609962306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_select_id, targ_id);
610062306a36Sopenharmony_ci
610162306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0, SCSI_PORT);
610262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_autostart_3, (SELECT | CMD_ONLY_STRT));
610362306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
610462306a36Sopenharmony_ci
610562306a36Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) &
610662306a36Sopenharmony_ci		 (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {
610762306a36Sopenharmony_ci	}
610862306a36Sopenharmony_ci
610962306a36Sopenharmony_ci	if (RDW_HARPOON((p_port + hp_intstat)) & RESET)
611062306a36Sopenharmony_ci		FPT_Wait(p_port, TO_250ms);
611162306a36Sopenharmony_ci
611262306a36Sopenharmony_ci	DISABLE_AUTO(p_port);
611362306a36Sopenharmony_ci
611462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_addstat,
611562306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_addstat) & ~SCAM_TIMER));
611662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, TO_290ms);
611762306a36Sopenharmony_ci
611862306a36Sopenharmony_ci	SGRAM_ACCESS(p_port);
611962306a36Sopenharmony_ci
612062306a36Sopenharmony_ci	if (RDW_HARPOON((p_port + hp_intstat)) & (RESET | TIMEOUT)) {
612162306a36Sopenharmony_ci
612262306a36Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat),
612362306a36Sopenharmony_ci			    (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
612462306a36Sopenharmony_ci
612562306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_page_ctrl,
612662306a36Sopenharmony_ci			   (RD_HARPOON(p_port + hp_page_ctrl) &
612762306a36Sopenharmony_ci			    ~G_INT_DISABLE));
612862306a36Sopenharmony_ci
612962306a36Sopenharmony_ci		return 0;	/*No legacy device */
613062306a36Sopenharmony_ci	}
613162306a36Sopenharmony_ci
613262306a36Sopenharmony_ci	else {
613362306a36Sopenharmony_ci
613462306a36Sopenharmony_ci		while (!(RDW_HARPOON((p_port + hp_intstat)) & BUS_FREE)) {
613562306a36Sopenharmony_ci			if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ) {
613662306a36Sopenharmony_ci				WR_HARPOON(p_port + hp_scsisig,
613762306a36Sopenharmony_ci					   (SCSI_ACK + S_ILL_PH));
613862306a36Sopenharmony_ci				ACCEPT_MSG(p_port);
613962306a36Sopenharmony_ci			}
614062306a36Sopenharmony_ci		}
614162306a36Sopenharmony_ci
614262306a36Sopenharmony_ci		WRW_HARPOON((p_port + hp_intstat), CLR_ALL_INT_1);
614362306a36Sopenharmony_ci
614462306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_page_ctrl,
614562306a36Sopenharmony_ci			   (RD_HARPOON(p_port + hp_page_ctrl) &
614662306a36Sopenharmony_ci			    ~G_INT_DISABLE));
614762306a36Sopenharmony_ci
614862306a36Sopenharmony_ci		return 1;	/*Found one of them oldies! */
614962306a36Sopenharmony_ci	}
615062306a36Sopenharmony_ci}
615162306a36Sopenharmony_ci
615262306a36Sopenharmony_ci/*---------------------------------------------------------------------
615362306a36Sopenharmony_ci *
615462306a36Sopenharmony_ci * Function: FPT_scwtsel
615562306a36Sopenharmony_ci *
615662306a36Sopenharmony_ci * Description: Wait to be selected by another SCAM initiator.
615762306a36Sopenharmony_ci *
615862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
615962306a36Sopenharmony_ci
616062306a36Sopenharmony_cistatic void FPT_scwtsel(u32 p_port)
616162306a36Sopenharmony_ci{
616262306a36Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) {
616362306a36Sopenharmony_ci	}
616462306a36Sopenharmony_ci}
616562306a36Sopenharmony_ci
616662306a36Sopenharmony_ci/*---------------------------------------------------------------------
616762306a36Sopenharmony_ci *
616862306a36Sopenharmony_ci * Function: FPT_inisci
616962306a36Sopenharmony_ci *
617062306a36Sopenharmony_ci * Description: Setup the data Structure with the info from the EEPROM.
617162306a36Sopenharmony_ci *
617262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
617362306a36Sopenharmony_ci
617462306a36Sopenharmony_cistatic void FPT_inisci(unsigned char p_card, u32 p_port, unsigned char p_our_id)
617562306a36Sopenharmony_ci{
617662306a36Sopenharmony_ci	unsigned char i, k, max_id;
617762306a36Sopenharmony_ci	unsigned short ee_data;
617862306a36Sopenharmony_ci	struct nvram_info *pCurrNvRam;
617962306a36Sopenharmony_ci
618062306a36Sopenharmony_ci	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
618162306a36Sopenharmony_ci
618262306a36Sopenharmony_ci	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
618362306a36Sopenharmony_ci		max_id = 0x08;
618462306a36Sopenharmony_ci
618562306a36Sopenharmony_ci	else
618662306a36Sopenharmony_ci		max_id = 0x10;
618762306a36Sopenharmony_ci
618862306a36Sopenharmony_ci	if (pCurrNvRam) {
618962306a36Sopenharmony_ci		for (i = 0; i < max_id; i++) {
619062306a36Sopenharmony_ci
619162306a36Sopenharmony_ci			for (k = 0; k < 4; k++)
619262306a36Sopenharmony_ci				FPT_scamInfo[i].id_string[k] =
619362306a36Sopenharmony_ci				    pCurrNvRam->niScamTbl[i][k];
619462306a36Sopenharmony_ci			for (k = 4; k < ID_STRING_LENGTH; k++)
619562306a36Sopenharmony_ci				FPT_scamInfo[i].id_string[k] =
619662306a36Sopenharmony_ci				    (unsigned char)0x00;
619762306a36Sopenharmony_ci
619862306a36Sopenharmony_ci			if (FPT_scamInfo[i].id_string[0] == 0x00)
619962306a36Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
620062306a36Sopenharmony_ci			else
620162306a36Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
620262306a36Sopenharmony_ci
620362306a36Sopenharmony_ci		}
620462306a36Sopenharmony_ci	} else {
620562306a36Sopenharmony_ci		for (i = 0; i < max_id; i++) {
620662306a36Sopenharmony_ci			for (k = 0; k < ID_STRING_LENGTH; k += 2) {
620762306a36Sopenharmony_ci				ee_data =
620862306a36Sopenharmony_ci				    FPT_utilEERead(p_port,
620962306a36Sopenharmony_ci						   (unsigned
621062306a36Sopenharmony_ci						    short)((EE_SCAMBASE / 2) +
621162306a36Sopenharmony_ci							   (unsigned short)(i *
621262306a36Sopenharmony_ci									    ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
621362306a36Sopenharmony_ci				FPT_scamInfo[i].id_string[k] =
621462306a36Sopenharmony_ci				    (unsigned char)ee_data;
621562306a36Sopenharmony_ci				ee_data >>= 8;
621662306a36Sopenharmony_ci				FPT_scamInfo[i].id_string[k + 1] =
621762306a36Sopenharmony_ci				    (unsigned char)ee_data;
621862306a36Sopenharmony_ci			}
621962306a36Sopenharmony_ci
622062306a36Sopenharmony_ci			if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
622162306a36Sopenharmony_ci			    (FPT_scamInfo[i].id_string[0] == 0xFF))
622262306a36Sopenharmony_ci
622362306a36Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
622462306a36Sopenharmony_ci
622562306a36Sopenharmony_ci			else
622662306a36Sopenharmony_ci				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
622762306a36Sopenharmony_ci
622862306a36Sopenharmony_ci		}
622962306a36Sopenharmony_ci	}
623062306a36Sopenharmony_ci	for (k = 0; k < ID_STRING_LENGTH; k++)
623162306a36Sopenharmony_ci		FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
623262306a36Sopenharmony_ci
623362306a36Sopenharmony_ci}
623462306a36Sopenharmony_ci
623562306a36Sopenharmony_ci/*---------------------------------------------------------------------
623662306a36Sopenharmony_ci *
623762306a36Sopenharmony_ci * Function: FPT_scmachid
623862306a36Sopenharmony_ci *
623962306a36Sopenharmony_ci * Description: Match the Device ID string with our values stored in
624062306a36Sopenharmony_ci *              the EEPROM.
624162306a36Sopenharmony_ci *
624262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
624362306a36Sopenharmony_ci
624462306a36Sopenharmony_cistatic unsigned char FPT_scmachid(unsigned char p_card,
624562306a36Sopenharmony_ci				  unsigned char p_id_string[])
624662306a36Sopenharmony_ci{
624762306a36Sopenharmony_ci
624862306a36Sopenharmony_ci	unsigned char i, k, match;
624962306a36Sopenharmony_ci
625062306a36Sopenharmony_ci	for (i = 0; i < MAX_SCSI_TAR; i++) {
625162306a36Sopenharmony_ci
625262306a36Sopenharmony_ci		match = 1;
625362306a36Sopenharmony_ci
625462306a36Sopenharmony_ci		for (k = 0; k < ID_STRING_LENGTH; k++) {
625562306a36Sopenharmony_ci			if (p_id_string[k] != FPT_scamInfo[i].id_string[k])
625662306a36Sopenharmony_ci				match = 0;
625762306a36Sopenharmony_ci		}
625862306a36Sopenharmony_ci
625962306a36Sopenharmony_ci		if (match) {
626062306a36Sopenharmony_ci			FPT_scamInfo[i].state = ID_ASSIGNED;
626162306a36Sopenharmony_ci			return i;
626262306a36Sopenharmony_ci		}
626362306a36Sopenharmony_ci
626462306a36Sopenharmony_ci	}
626562306a36Sopenharmony_ci
626662306a36Sopenharmony_ci	if (p_id_string[0] & BIT(5))
626762306a36Sopenharmony_ci		i = 8;
626862306a36Sopenharmony_ci	else
626962306a36Sopenharmony_ci		i = MAX_SCSI_TAR;
627062306a36Sopenharmony_ci
627162306a36Sopenharmony_ci	if (((p_id_string[0] & 0x06) == 0x02)
627262306a36Sopenharmony_ci	    || ((p_id_string[0] & 0x06) == 0x04))
627362306a36Sopenharmony_ci		match = p_id_string[1] & (unsigned char)0x1F;
627462306a36Sopenharmony_ci	else
627562306a36Sopenharmony_ci		match = 7;
627662306a36Sopenharmony_ci
627762306a36Sopenharmony_ci	while (i > 0) {
627862306a36Sopenharmony_ci		i--;
627962306a36Sopenharmony_ci
628062306a36Sopenharmony_ci		if (FPT_scamInfo[match].state == ID_UNUSED) {
628162306a36Sopenharmony_ci			for (k = 0; k < ID_STRING_LENGTH; k++) {
628262306a36Sopenharmony_ci				FPT_scamInfo[match].id_string[k] =
628362306a36Sopenharmony_ci				    p_id_string[k];
628462306a36Sopenharmony_ci			}
628562306a36Sopenharmony_ci
628662306a36Sopenharmony_ci			FPT_scamInfo[match].state = ID_ASSIGNED;
628762306a36Sopenharmony_ci
628862306a36Sopenharmony_ci			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
628962306a36Sopenharmony_ci				FPT_BL_Card[p_card].globalFlags |=
629062306a36Sopenharmony_ci				    F_UPDATE_EEPROM;
629162306a36Sopenharmony_ci			return match;
629262306a36Sopenharmony_ci
629362306a36Sopenharmony_ci		}
629462306a36Sopenharmony_ci
629562306a36Sopenharmony_ci		match--;
629662306a36Sopenharmony_ci
629762306a36Sopenharmony_ci		if (match == 0xFF) {
629862306a36Sopenharmony_ci			if (p_id_string[0] & BIT(5))
629962306a36Sopenharmony_ci				match = 7;
630062306a36Sopenharmony_ci			else
630162306a36Sopenharmony_ci				match = MAX_SCSI_TAR - 1;
630262306a36Sopenharmony_ci		}
630362306a36Sopenharmony_ci	}
630462306a36Sopenharmony_ci
630562306a36Sopenharmony_ci	if (p_id_string[0] & BIT(7)) {
630662306a36Sopenharmony_ci		return CLR_PRIORITY;
630762306a36Sopenharmony_ci	}
630862306a36Sopenharmony_ci
630962306a36Sopenharmony_ci	if (p_id_string[0] & BIT(5))
631062306a36Sopenharmony_ci		i = 8;
631162306a36Sopenharmony_ci	else
631262306a36Sopenharmony_ci		i = MAX_SCSI_TAR;
631362306a36Sopenharmony_ci
631462306a36Sopenharmony_ci	if (((p_id_string[0] & 0x06) == 0x02)
631562306a36Sopenharmony_ci	    || ((p_id_string[0] & 0x06) == 0x04))
631662306a36Sopenharmony_ci		match = p_id_string[1] & (unsigned char)0x1F;
631762306a36Sopenharmony_ci	else
631862306a36Sopenharmony_ci		match = 7;
631962306a36Sopenharmony_ci
632062306a36Sopenharmony_ci	while (i > 0) {
632162306a36Sopenharmony_ci
632262306a36Sopenharmony_ci		i--;
632362306a36Sopenharmony_ci
632462306a36Sopenharmony_ci		if (FPT_scamInfo[match].state == ID_UNASSIGNED) {
632562306a36Sopenharmony_ci			for (k = 0; k < ID_STRING_LENGTH; k++) {
632662306a36Sopenharmony_ci				FPT_scamInfo[match].id_string[k] =
632762306a36Sopenharmony_ci				    p_id_string[k];
632862306a36Sopenharmony_ci			}
632962306a36Sopenharmony_ci
633062306a36Sopenharmony_ci			FPT_scamInfo[match].id_string[0] |= BIT(7);
633162306a36Sopenharmony_ci			FPT_scamInfo[match].state = ID_ASSIGNED;
633262306a36Sopenharmony_ci			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
633362306a36Sopenharmony_ci				FPT_BL_Card[p_card].globalFlags |=
633462306a36Sopenharmony_ci				    F_UPDATE_EEPROM;
633562306a36Sopenharmony_ci			return match;
633662306a36Sopenharmony_ci
633762306a36Sopenharmony_ci		}
633862306a36Sopenharmony_ci
633962306a36Sopenharmony_ci		match--;
634062306a36Sopenharmony_ci
634162306a36Sopenharmony_ci		if (match == 0xFF) {
634262306a36Sopenharmony_ci			if (p_id_string[0] & BIT(5))
634362306a36Sopenharmony_ci				match = 7;
634462306a36Sopenharmony_ci			else
634562306a36Sopenharmony_ci				match = MAX_SCSI_TAR - 1;
634662306a36Sopenharmony_ci		}
634762306a36Sopenharmony_ci	}
634862306a36Sopenharmony_ci
634962306a36Sopenharmony_ci	return NO_ID_AVAIL;
635062306a36Sopenharmony_ci}
635162306a36Sopenharmony_ci
635262306a36Sopenharmony_ci/*---------------------------------------------------------------------
635362306a36Sopenharmony_ci *
635462306a36Sopenharmony_ci * Function: FPT_scsavdi
635562306a36Sopenharmony_ci *
635662306a36Sopenharmony_ci * Description: Save off the device SCAM ID strings.
635762306a36Sopenharmony_ci *
635862306a36Sopenharmony_ci *---------------------------------------------------------------------*/
635962306a36Sopenharmony_ci
636062306a36Sopenharmony_cistatic void FPT_scsavdi(unsigned char p_card, u32 p_port)
636162306a36Sopenharmony_ci{
636262306a36Sopenharmony_ci	unsigned char i, k, max_id;
636362306a36Sopenharmony_ci	unsigned short ee_data, sum_data;
636462306a36Sopenharmony_ci
636562306a36Sopenharmony_ci	sum_data = 0x0000;
636662306a36Sopenharmony_ci
636762306a36Sopenharmony_ci	for (i = 1; i < EE_SCAMBASE / 2; i++) {
636862306a36Sopenharmony_ci		sum_data += FPT_utilEERead(p_port, i);
636962306a36Sopenharmony_ci	}
637062306a36Sopenharmony_ci
637162306a36Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, 1);	/* Enable write access to the EEPROM */
637262306a36Sopenharmony_ci
637362306a36Sopenharmony_ci	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
637462306a36Sopenharmony_ci		max_id = 0x08;
637562306a36Sopenharmony_ci
637662306a36Sopenharmony_ci	else
637762306a36Sopenharmony_ci		max_id = 0x10;
637862306a36Sopenharmony_ci
637962306a36Sopenharmony_ci	for (i = 0; i < max_id; i++) {
638062306a36Sopenharmony_ci
638162306a36Sopenharmony_ci		for (k = 0; k < ID_STRING_LENGTH; k += 2) {
638262306a36Sopenharmony_ci			ee_data = FPT_scamInfo[i].id_string[k + 1];
638362306a36Sopenharmony_ci			ee_data <<= 8;
638462306a36Sopenharmony_ci			ee_data |= FPT_scamInfo[i].id_string[k];
638562306a36Sopenharmony_ci			sum_data += ee_data;
638662306a36Sopenharmony_ci			FPT_utilEEWrite(p_port, ee_data,
638762306a36Sopenharmony_ci					(unsigned short)((EE_SCAMBASE / 2) +
638862306a36Sopenharmony_ci							 (unsigned short)(i *
638962306a36Sopenharmony_ci									  ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
639062306a36Sopenharmony_ci		}
639162306a36Sopenharmony_ci	}
639262306a36Sopenharmony_ci
639362306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM / 2);
639462306a36Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, 0);	/* Turn off write access */
639562306a36Sopenharmony_ci}
639662306a36Sopenharmony_ci
639762306a36Sopenharmony_ci/*---------------------------------------------------------------------
639862306a36Sopenharmony_ci *
639962306a36Sopenharmony_ci * Function: FPT_XbowInit
640062306a36Sopenharmony_ci *
640162306a36Sopenharmony_ci * Description: Setup the Xbow for normal operation.
640262306a36Sopenharmony_ci *
640362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
640462306a36Sopenharmony_ci
640562306a36Sopenharmony_cistatic void FPT_XbowInit(u32 port, unsigned char ScamFlg)
640662306a36Sopenharmony_ci{
640762306a36Sopenharmony_ci	unsigned char i;
640862306a36Sopenharmony_ci
640962306a36Sopenharmony_ci	i = RD_HARPOON(port + hp_page_ctrl);
641062306a36Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl, (unsigned char)(i | G_INT_DISABLE));
641162306a36Sopenharmony_ci
641262306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsireset, 0x00);
641362306a36Sopenharmony_ci	WR_HARPOON(port + hp_portctrl_1, HOST_MODE8);
641462306a36Sopenharmony_ci
641562306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsireset, (DMA_RESET | HPSCSI_RESET | PROG_RESET |
641662306a36Sopenharmony_ci					 FIFO_CLR));
641762306a36Sopenharmony_ci
641862306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsireset, SCSI_INI);
641962306a36Sopenharmony_ci
642062306a36Sopenharmony_ci	WR_HARPOON(port + hp_clkctrl_0, CLKCTRL_DEFAULT);
642162306a36Sopenharmony_ci
642262306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsisig, 0x00);	/*  Clear any signals we might */
642362306a36Sopenharmony_ci	WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
642462306a36Sopenharmony_ci
642562306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
642662306a36Sopenharmony_ci
642762306a36Sopenharmony_ci	FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
642862306a36Sopenharmony_ci	    BUS_FREE | XFER_CNT_0 | AUTO_INT;
642962306a36Sopenharmony_ci
643062306a36Sopenharmony_ci	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
643162306a36Sopenharmony_ci		FPT_default_intena |= SCAM_SEL;
643262306a36Sopenharmony_ci
643362306a36Sopenharmony_ci	WRW_HARPOON((port + hp_intena), FPT_default_intena);
643462306a36Sopenharmony_ci
643562306a36Sopenharmony_ci	WR_HARPOON(port + hp_seltimeout, TO_290ms);
643662306a36Sopenharmony_ci
643762306a36Sopenharmony_ci	/* Turn on SCSI_MODE8 for narrow cards to fix the
643862306a36Sopenharmony_ci	   strapping issue with the DUAL CHANNEL card */
643962306a36Sopenharmony_ci	if (RD_HARPOON(port + hp_page_ctrl) & NARROW_SCSI_CARD)
644062306a36Sopenharmony_ci		WR_HARPOON(port + hp_addstat, SCSI_MODE8);
644162306a36Sopenharmony_ci
644262306a36Sopenharmony_ci	WR_HARPOON(port + hp_page_ctrl, i);
644362306a36Sopenharmony_ci
644462306a36Sopenharmony_ci}
644562306a36Sopenharmony_ci
644662306a36Sopenharmony_ci/*---------------------------------------------------------------------
644762306a36Sopenharmony_ci *
644862306a36Sopenharmony_ci * Function: FPT_BusMasterInit
644962306a36Sopenharmony_ci *
645062306a36Sopenharmony_ci * Description: Initialize the BusMaster for normal operations.
645162306a36Sopenharmony_ci *
645262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
645362306a36Sopenharmony_ci
645462306a36Sopenharmony_cistatic void FPT_BusMasterInit(u32 p_port)
645562306a36Sopenharmony_ci{
645662306a36Sopenharmony_ci
645762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_sys_ctrl, DRVR_RST);
645862306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
645962306a36Sopenharmony_ci
646062306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_host_blk_cnt, XFER_BLK64);
646162306a36Sopenharmony_ci
646262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_bm_ctrl, (BMCTRL_DEFAULT));
646362306a36Sopenharmony_ci
646462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (SCSI_TERM_ENA_H));
646562306a36Sopenharmony_ci
646662306a36Sopenharmony_ci	RD_HARPOON(p_port + hp_int_status);	/*Clear interrupts. */
646762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
646862306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_page_ctrl, (RD_HARPOON(p_port + hp_page_ctrl) &
646962306a36Sopenharmony_ci					   ~SCATTER_EN));
647062306a36Sopenharmony_ci}
647162306a36Sopenharmony_ci
647262306a36Sopenharmony_ci/*---------------------------------------------------------------------
647362306a36Sopenharmony_ci *
647462306a36Sopenharmony_ci * Function: FPT_DiagEEPROM
647562306a36Sopenharmony_ci *
647662306a36Sopenharmony_ci * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
647762306a36Sopenharmony_ci *              necessary.
647862306a36Sopenharmony_ci *
647962306a36Sopenharmony_ci *---------------------------------------------------------------------*/
648062306a36Sopenharmony_ci
648162306a36Sopenharmony_cistatic void FPT_DiagEEPROM(u32 p_port)
648262306a36Sopenharmony_ci{
648362306a36Sopenharmony_ci	unsigned short index, temp, max_wd_cnt;
648462306a36Sopenharmony_ci
648562306a36Sopenharmony_ci	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
648662306a36Sopenharmony_ci		max_wd_cnt = EEPROM_WD_CNT;
648762306a36Sopenharmony_ci	else
648862306a36Sopenharmony_ci		max_wd_cnt = EEPROM_WD_CNT * 2;
648962306a36Sopenharmony_ci
649062306a36Sopenharmony_ci	temp = FPT_utilEERead(p_port, FW_SIGNATURE / 2);
649162306a36Sopenharmony_ci
649262306a36Sopenharmony_ci	if (temp == 0x4641) {
649362306a36Sopenharmony_ci
649462306a36Sopenharmony_ci		for (index = 2; index < max_wd_cnt; index++) {
649562306a36Sopenharmony_ci
649662306a36Sopenharmony_ci			temp += FPT_utilEERead(p_port, index);
649762306a36Sopenharmony_ci
649862306a36Sopenharmony_ci		}
649962306a36Sopenharmony_ci
650062306a36Sopenharmony_ci		if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM / 2)) {
650162306a36Sopenharmony_ci
650262306a36Sopenharmony_ci			return;	/*EEPROM is Okay so return now! */
650362306a36Sopenharmony_ci		}
650462306a36Sopenharmony_ci	}
650562306a36Sopenharmony_ci
650662306a36Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, (unsigned char)1);
650762306a36Sopenharmony_ci
650862306a36Sopenharmony_ci	for (index = 0; index < max_wd_cnt; index++) {
650962306a36Sopenharmony_ci
651062306a36Sopenharmony_ci		FPT_utilEEWrite(p_port, 0x0000, index);
651162306a36Sopenharmony_ci	}
651262306a36Sopenharmony_ci
651362306a36Sopenharmony_ci	temp = 0;
651462306a36Sopenharmony_ci
651562306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE / 2);
651662306a36Sopenharmony_ci	temp += 0x4641;
651762306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0 / 2);
651862306a36Sopenharmony_ci	temp += 0x3920;
651962306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2 / 2);
652062306a36Sopenharmony_ci	temp += 0x3033;
652162306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4 / 2);
652262306a36Sopenharmony_ci	temp += 0x2020;
652362306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG / 2);
652462306a36Sopenharmony_ci	temp += 0x70D3;
652562306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG / 2);
652662306a36Sopenharmony_ci	temp += 0x0010;
652762306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG / 2);
652862306a36Sopenharmony_ci	temp += 0x0003;
652962306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID / 2);
653062306a36Sopenharmony_ci	temp += 0x0007;
653162306a36Sopenharmony_ci
653262306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN / 2);
653362306a36Sopenharmony_ci	temp += 0x0000;
653462306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA / 2);
653562306a36Sopenharmony_ci	temp += 0x0000;
653662306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE / 2);
653762306a36Sopenharmony_ci	temp += 0x0000;
653862306a36Sopenharmony_ci
653962306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01 / 2);
654062306a36Sopenharmony_ci	temp += 0x4242;
654162306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23 / 2);
654262306a36Sopenharmony_ci	temp += 0x4242;
654362306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45 / 2);
654462306a36Sopenharmony_ci	temp += 0x4242;
654562306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67 / 2);
654662306a36Sopenharmony_ci	temp += 0x4242;
654762306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89 / 2);
654862306a36Sopenharmony_ci	temp += 0x4242;
654962306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab / 2);
655062306a36Sopenharmony_ci	temp += 0x4242;
655162306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd / 2);
655262306a36Sopenharmony_ci	temp += 0x4242;
655362306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef / 2);
655462306a36Sopenharmony_ci	temp += 0x4242;
655562306a36Sopenharmony_ci
655662306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x6C46, 64 / 2);	/*PRODUCT ID */
655762306a36Sopenharmony_ci	temp += 0x6C46;
655862306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x7361, 66 / 2);	/* FlashPoint LT   */
655962306a36Sopenharmony_ci	temp += 0x7361;
656062306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5068, 68 / 2);
656162306a36Sopenharmony_ci	temp += 0x5068;
656262306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x696F, 70 / 2);
656362306a36Sopenharmony_ci	temp += 0x696F;
656462306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x746E, 72 / 2);
656562306a36Sopenharmony_ci	temp += 0x746E;
656662306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4C20, 74 / 2);
656762306a36Sopenharmony_ci	temp += 0x4C20;
656862306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2054, 76 / 2);
656962306a36Sopenharmony_ci	temp += 0x2054;
657062306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2020, 78 / 2);
657162306a36Sopenharmony_ci	temp += 0x2020;
657262306a36Sopenharmony_ci
657362306a36Sopenharmony_ci	index = ((EE_SCAMBASE / 2) + (7 * 16));
657462306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, (0x0700 + TYPE_CODE0), index);
657562306a36Sopenharmony_ci	temp += (0x0700 + TYPE_CODE0);
657662306a36Sopenharmony_ci	index++;
657762306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5542, index);	/*Vendor ID code */
657862306a36Sopenharmony_ci	temp += 0x5542;		/* BUSLOGIC      */
657962306a36Sopenharmony_ci	index++;
658062306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4C53, index);
658162306a36Sopenharmony_ci	temp += 0x4C53;
658262306a36Sopenharmony_ci	index++;
658362306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x474F, index);
658462306a36Sopenharmony_ci	temp += 0x474F;
658562306a36Sopenharmony_ci	index++;
658662306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4349, index);
658762306a36Sopenharmony_ci	temp += 0x4349;
658862306a36Sopenharmony_ci	index++;
658962306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5442, index);	/*Vendor unique code */
659062306a36Sopenharmony_ci	temp += 0x5442;		/* BT- 930           */
659162306a36Sopenharmony_ci	index++;
659262306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x202D, index);
659362306a36Sopenharmony_ci	temp += 0x202D;
659462306a36Sopenharmony_ci	index++;
659562306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3339, index);
659662306a36Sopenharmony_ci	temp += 0x3339;
659762306a36Sopenharmony_ci	index++;		/*Serial #          */
659862306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2030, index);	/* 01234567         */
659962306a36Sopenharmony_ci	temp += 0x2030;
660062306a36Sopenharmony_ci	index++;
660162306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5453, index);
660262306a36Sopenharmony_ci	temp += 0x5453;
660362306a36Sopenharmony_ci	index++;
660462306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x5645, index);
660562306a36Sopenharmony_ci	temp += 0x5645;
660662306a36Sopenharmony_ci	index++;
660762306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x2045, index);
660862306a36Sopenharmony_ci	temp += 0x2045;
660962306a36Sopenharmony_ci	index++;
661062306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x202F, index);
661162306a36Sopenharmony_ci	temp += 0x202F;
661262306a36Sopenharmony_ci	index++;
661362306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x4F4A, index);
661462306a36Sopenharmony_ci	temp += 0x4F4A;
661562306a36Sopenharmony_ci	index++;
661662306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x204E, index);
661762306a36Sopenharmony_ci	temp += 0x204E;
661862306a36Sopenharmony_ci	index++;
661962306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, 0x3539, index);
662062306a36Sopenharmony_ci	temp += 0x3539;
662162306a36Sopenharmony_ci
662262306a36Sopenharmony_ci	FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM / 2);
662362306a36Sopenharmony_ci
662462306a36Sopenharmony_ci	FPT_utilEEWriteOnOff(p_port, (unsigned char)0);
662562306a36Sopenharmony_ci
662662306a36Sopenharmony_ci}
662762306a36Sopenharmony_ci
662862306a36Sopenharmony_ci/*---------------------------------------------------------------------
662962306a36Sopenharmony_ci *
663062306a36Sopenharmony_ci * Function: Queue Search Select
663162306a36Sopenharmony_ci *
663262306a36Sopenharmony_ci * Description: Try to find a new command to execute.
663362306a36Sopenharmony_ci *
663462306a36Sopenharmony_ci *---------------------------------------------------------------------*/
663562306a36Sopenharmony_ci
663662306a36Sopenharmony_cistatic void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
663762306a36Sopenharmony_ci				  unsigned char p_card)
663862306a36Sopenharmony_ci{
663962306a36Sopenharmony_ci	unsigned char scan_ptr, lun;
664062306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
664162306a36Sopenharmony_ci	struct sccb *pOldSccb;
664262306a36Sopenharmony_ci
664362306a36Sopenharmony_ci	scan_ptr = pCurrCard->scanIndex;
664462306a36Sopenharmony_ci	do {
664562306a36Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
664662306a36Sopenharmony_ci		if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
664762306a36Sopenharmony_ci		    ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
664862306a36Sopenharmony_ci		     TAG_Q_TRYING)) {
664962306a36Sopenharmony_ci			if (currTar_Info->TarSelQ_Cnt != 0) {
665062306a36Sopenharmony_ci
665162306a36Sopenharmony_ci				scan_ptr++;
665262306a36Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR)
665362306a36Sopenharmony_ci					scan_ptr = 0;
665462306a36Sopenharmony_ci
665562306a36Sopenharmony_ci				for (lun = 0; lun < MAX_LUN; lun++) {
665662306a36Sopenharmony_ci					if (currTar_Info->TarLUNBusy[lun] == 0) {
665762306a36Sopenharmony_ci
665862306a36Sopenharmony_ci						pCurrCard->currentSCCB =
665962306a36Sopenharmony_ci						    currTar_Info->TarSelQ_Head;
666062306a36Sopenharmony_ci						pOldSccb = NULL;
666162306a36Sopenharmony_ci
666262306a36Sopenharmony_ci						while ((pCurrCard->
666362306a36Sopenharmony_ci							currentSCCB != NULL)
666462306a36Sopenharmony_ci						       && (lun !=
666562306a36Sopenharmony_ci							   pCurrCard->
666662306a36Sopenharmony_ci							   currentSCCB->Lun)) {
666762306a36Sopenharmony_ci							pOldSccb =
666862306a36Sopenharmony_ci							    pCurrCard->
666962306a36Sopenharmony_ci							    currentSCCB;
667062306a36Sopenharmony_ci							pCurrCard->currentSCCB =
667162306a36Sopenharmony_ci							    (struct sccb
667262306a36Sopenharmony_ci							     *)(pCurrCard->
667362306a36Sopenharmony_ci								currentSCCB)->
667462306a36Sopenharmony_ci							    Sccb_forwardlink;
667562306a36Sopenharmony_ci						}
667662306a36Sopenharmony_ci						if (pCurrCard->currentSCCB ==
667762306a36Sopenharmony_ci						    NULL)
667862306a36Sopenharmony_ci							continue;
667962306a36Sopenharmony_ci						if (pOldSccb != NULL) {
668062306a36Sopenharmony_ci							pOldSccb->
668162306a36Sopenharmony_ci							    Sccb_forwardlink =
668262306a36Sopenharmony_ci							    (struct sccb
668362306a36Sopenharmony_ci							     *)(pCurrCard->
668462306a36Sopenharmony_ci								currentSCCB)->
668562306a36Sopenharmony_ci							    Sccb_forwardlink;
668662306a36Sopenharmony_ci							pOldSccb->
668762306a36Sopenharmony_ci							    Sccb_backlink =
668862306a36Sopenharmony_ci							    (struct sccb
668962306a36Sopenharmony_ci							     *)(pCurrCard->
669062306a36Sopenharmony_ci								currentSCCB)->
669162306a36Sopenharmony_ci							    Sccb_backlink;
669262306a36Sopenharmony_ci							currTar_Info->
669362306a36Sopenharmony_ci							    TarSelQ_Cnt--;
669462306a36Sopenharmony_ci						} else {
669562306a36Sopenharmony_ci							currTar_Info->
669662306a36Sopenharmony_ci							    TarSelQ_Head =
669762306a36Sopenharmony_ci							    (struct sccb
669862306a36Sopenharmony_ci							     *)(pCurrCard->
669962306a36Sopenharmony_ci								currentSCCB)->
670062306a36Sopenharmony_ci							    Sccb_forwardlink;
670162306a36Sopenharmony_ci
670262306a36Sopenharmony_ci							if (currTar_Info->
670362306a36Sopenharmony_ci							    TarSelQ_Head ==
670462306a36Sopenharmony_ci							    NULL) {
670562306a36Sopenharmony_ci								currTar_Info->
670662306a36Sopenharmony_ci								    TarSelQ_Tail
670762306a36Sopenharmony_ci								    = NULL;
670862306a36Sopenharmony_ci								currTar_Info->
670962306a36Sopenharmony_ci								    TarSelQ_Cnt
671062306a36Sopenharmony_ci								    = 0;
671162306a36Sopenharmony_ci							} else {
671262306a36Sopenharmony_ci								currTar_Info->
671362306a36Sopenharmony_ci								    TarSelQ_Cnt--;
671462306a36Sopenharmony_ci								currTar_Info->
671562306a36Sopenharmony_ci								    TarSelQ_Head->
671662306a36Sopenharmony_ci								    Sccb_backlink
671762306a36Sopenharmony_ci								    =
671862306a36Sopenharmony_ci								    (struct sccb
671962306a36Sopenharmony_ci								     *)NULL;
672062306a36Sopenharmony_ci							}
672162306a36Sopenharmony_ci						}
672262306a36Sopenharmony_ci						pCurrCard->scanIndex = scan_ptr;
672362306a36Sopenharmony_ci
672462306a36Sopenharmony_ci						pCurrCard->globalFlags |=
672562306a36Sopenharmony_ci						    F_NEW_SCCB_CMD;
672662306a36Sopenharmony_ci
672762306a36Sopenharmony_ci						break;
672862306a36Sopenharmony_ci					}
672962306a36Sopenharmony_ci				}
673062306a36Sopenharmony_ci			}
673162306a36Sopenharmony_ci
673262306a36Sopenharmony_ci			else {
673362306a36Sopenharmony_ci				scan_ptr++;
673462306a36Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR) {
673562306a36Sopenharmony_ci					scan_ptr = 0;
673662306a36Sopenharmony_ci				}
673762306a36Sopenharmony_ci			}
673862306a36Sopenharmony_ci
673962306a36Sopenharmony_ci		} else {
674062306a36Sopenharmony_ci			if ((currTar_Info->TarSelQ_Cnt != 0) &&
674162306a36Sopenharmony_ci			    (currTar_Info->TarLUNBusy[0] == 0)) {
674262306a36Sopenharmony_ci
674362306a36Sopenharmony_ci				pCurrCard->currentSCCB =
674462306a36Sopenharmony_ci				    currTar_Info->TarSelQ_Head;
674562306a36Sopenharmony_ci
674662306a36Sopenharmony_ci				currTar_Info->TarSelQ_Head =
674762306a36Sopenharmony_ci				    (struct sccb *)(pCurrCard->currentSCCB)->
674862306a36Sopenharmony_ci				    Sccb_forwardlink;
674962306a36Sopenharmony_ci
675062306a36Sopenharmony_ci				if (currTar_Info->TarSelQ_Head == NULL) {
675162306a36Sopenharmony_ci					currTar_Info->TarSelQ_Tail = NULL;
675262306a36Sopenharmony_ci					currTar_Info->TarSelQ_Cnt = 0;
675362306a36Sopenharmony_ci				} else {
675462306a36Sopenharmony_ci					currTar_Info->TarSelQ_Cnt--;
675562306a36Sopenharmony_ci					currTar_Info->TarSelQ_Head->
675662306a36Sopenharmony_ci					    Sccb_backlink = (struct sccb *)NULL;
675762306a36Sopenharmony_ci				}
675862306a36Sopenharmony_ci
675962306a36Sopenharmony_ci				scan_ptr++;
676062306a36Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR)
676162306a36Sopenharmony_ci					scan_ptr = 0;
676262306a36Sopenharmony_ci
676362306a36Sopenharmony_ci				pCurrCard->scanIndex = scan_ptr;
676462306a36Sopenharmony_ci
676562306a36Sopenharmony_ci				pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
676662306a36Sopenharmony_ci
676762306a36Sopenharmony_ci				break;
676862306a36Sopenharmony_ci			}
676962306a36Sopenharmony_ci
677062306a36Sopenharmony_ci			else {
677162306a36Sopenharmony_ci				scan_ptr++;
677262306a36Sopenharmony_ci				if (scan_ptr == MAX_SCSI_TAR) {
677362306a36Sopenharmony_ci					scan_ptr = 0;
677462306a36Sopenharmony_ci				}
677562306a36Sopenharmony_ci			}
677662306a36Sopenharmony_ci		}
677762306a36Sopenharmony_ci	} while (scan_ptr != pCurrCard->scanIndex);
677862306a36Sopenharmony_ci}
677962306a36Sopenharmony_ci
678062306a36Sopenharmony_ci/*---------------------------------------------------------------------
678162306a36Sopenharmony_ci *
678262306a36Sopenharmony_ci * Function: Queue Select Fail
678362306a36Sopenharmony_ci *
678462306a36Sopenharmony_ci * Description: Add the current SCCB to the head of the Queue.
678562306a36Sopenharmony_ci *
678662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
678762306a36Sopenharmony_ci
678862306a36Sopenharmony_cistatic void FPT_queueSelectFail(struct sccb_card *pCurrCard,
678962306a36Sopenharmony_ci				unsigned char p_card)
679062306a36Sopenharmony_ci{
679162306a36Sopenharmony_ci	unsigned char thisTarg;
679262306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
679362306a36Sopenharmony_ci
679462306a36Sopenharmony_ci	if (pCurrCard->currentSCCB != NULL) {
679562306a36Sopenharmony_ci		thisTarg =
679662306a36Sopenharmony_ci		    (unsigned char)(((struct sccb *)(pCurrCard->currentSCCB))->
679762306a36Sopenharmony_ci				    TargID);
679862306a36Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
679962306a36Sopenharmony_ci
680062306a36Sopenharmony_ci		pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL;
680162306a36Sopenharmony_ci
680262306a36Sopenharmony_ci		pCurrCard->currentSCCB->Sccb_forwardlink =
680362306a36Sopenharmony_ci		    currTar_Info->TarSelQ_Head;
680462306a36Sopenharmony_ci
680562306a36Sopenharmony_ci		if (currTar_Info->TarSelQ_Cnt == 0) {
680662306a36Sopenharmony_ci			currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
680762306a36Sopenharmony_ci		}
680862306a36Sopenharmony_ci
680962306a36Sopenharmony_ci		else {
681062306a36Sopenharmony_ci			currTar_Info->TarSelQ_Head->Sccb_backlink =
681162306a36Sopenharmony_ci			    pCurrCard->currentSCCB;
681262306a36Sopenharmony_ci		}
681362306a36Sopenharmony_ci
681462306a36Sopenharmony_ci		currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
681562306a36Sopenharmony_ci
681662306a36Sopenharmony_ci		pCurrCard->currentSCCB = NULL;
681762306a36Sopenharmony_ci		currTar_Info->TarSelQ_Cnt++;
681862306a36Sopenharmony_ci	}
681962306a36Sopenharmony_ci}
682062306a36Sopenharmony_ci
682162306a36Sopenharmony_ci/*---------------------------------------------------------------------
682262306a36Sopenharmony_ci *
682362306a36Sopenharmony_ci * Function: Queue Command Complete
682462306a36Sopenharmony_ci *
682562306a36Sopenharmony_ci * Description: Call the callback function with the current SCCB.
682662306a36Sopenharmony_ci *
682762306a36Sopenharmony_ci *---------------------------------------------------------------------*/
682862306a36Sopenharmony_ci
682962306a36Sopenharmony_cistatic void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
683062306a36Sopenharmony_ci				 struct sccb *p_sccb, unsigned char p_card)
683162306a36Sopenharmony_ci{
683262306a36Sopenharmony_ci
683362306a36Sopenharmony_ci	unsigned char i, SCSIcmd;
683462306a36Sopenharmony_ci	CALL_BK_FN callback;
683562306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
683662306a36Sopenharmony_ci
683762306a36Sopenharmony_ci	SCSIcmd = p_sccb->Cdb[0];
683862306a36Sopenharmony_ci
683962306a36Sopenharmony_ci	if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
684062306a36Sopenharmony_ci
684162306a36Sopenharmony_ci		if ((p_sccb->
684262306a36Sopenharmony_ci		     ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN))
684362306a36Sopenharmony_ci		    && (p_sccb->HostStatus == SCCB_COMPLETE)
684462306a36Sopenharmony_ci		    && (p_sccb->TargetStatus != SAM_STAT_CHECK_CONDITION))
684562306a36Sopenharmony_ci
684662306a36Sopenharmony_ci			if ((SCSIcmd == READ_6) ||
684762306a36Sopenharmony_ci			    (SCSIcmd == WRITE_6) ||
684862306a36Sopenharmony_ci			    (SCSIcmd == READ_10) ||
684962306a36Sopenharmony_ci			    (SCSIcmd == WRITE_10) ||
685062306a36Sopenharmony_ci			    (SCSIcmd == WRITE_VERIFY) ||
685162306a36Sopenharmony_ci			    (SCSIcmd == START_STOP) ||
685262306a36Sopenharmony_ci			    (pCurrCard->globalFlags & F_NO_FILTER)
685362306a36Sopenharmony_ci			    )
685462306a36Sopenharmony_ci				p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
685562306a36Sopenharmony_ci	}
685662306a36Sopenharmony_ci
685762306a36Sopenharmony_ci	if (p_sccb->SccbStatus == SCCB_IN_PROCESS) {
685862306a36Sopenharmony_ci		if (p_sccb->HostStatus || p_sccb->TargetStatus)
685962306a36Sopenharmony_ci			p_sccb->SccbStatus = SCCB_ERROR;
686062306a36Sopenharmony_ci		else
686162306a36Sopenharmony_ci			p_sccb->SccbStatus = SCCB_SUCCESS;
686262306a36Sopenharmony_ci	}
686362306a36Sopenharmony_ci
686462306a36Sopenharmony_ci	if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
686562306a36Sopenharmony_ci
686662306a36Sopenharmony_ci		p_sccb->CdbLength = p_sccb->Save_CdbLen;
686762306a36Sopenharmony_ci		for (i = 0; i < 6; i++) {
686862306a36Sopenharmony_ci			p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
686962306a36Sopenharmony_ci		}
687062306a36Sopenharmony_ci	}
687162306a36Sopenharmony_ci
687262306a36Sopenharmony_ci	if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
687362306a36Sopenharmony_ci	    (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
687462306a36Sopenharmony_ci
687562306a36Sopenharmony_ci		FPT_utilUpdateResidual(p_sccb);
687662306a36Sopenharmony_ci	}
687762306a36Sopenharmony_ci
687862306a36Sopenharmony_ci	pCurrCard->cmdCounter--;
687962306a36Sopenharmony_ci	if (!pCurrCard->cmdCounter) {
688062306a36Sopenharmony_ci
688162306a36Sopenharmony_ci		if (pCurrCard->globalFlags & F_GREEN_PC) {
688262306a36Sopenharmony_ci			WR_HARPOON(pCurrCard->ioPort + hp_clkctrl_0,
688362306a36Sopenharmony_ci				   (PWR_DWN | CLKCTRL_DEFAULT));
688462306a36Sopenharmony_ci			WR_HARPOON(pCurrCard->ioPort + hp_sys_ctrl, STOP_CLK);
688562306a36Sopenharmony_ci		}
688662306a36Sopenharmony_ci
688762306a36Sopenharmony_ci		WR_HARPOON(pCurrCard->ioPort + hp_semaphore,
688862306a36Sopenharmony_ci			   (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) &
688962306a36Sopenharmony_ci			    ~SCCB_MGR_ACTIVE));
689062306a36Sopenharmony_ci
689162306a36Sopenharmony_ci	}
689262306a36Sopenharmony_ci
689362306a36Sopenharmony_ci	if (pCurrCard->discQCount != 0) {
689462306a36Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
689562306a36Sopenharmony_ci		if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
689662306a36Sopenharmony_ci		     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
689762306a36Sopenharmony_ci		      TAG_Q_TRYING))) {
689862306a36Sopenharmony_ci			pCurrCard->discQCount--;
689962306a36Sopenharmony_ci			pCurrCard->discQ_Tbl[currTar_Info->
690062306a36Sopenharmony_ci					     LunDiscQ_Idx[p_sccb->Lun]] = NULL;
690162306a36Sopenharmony_ci		} else {
690262306a36Sopenharmony_ci			if (p_sccb->Sccb_tag) {
690362306a36Sopenharmony_ci				pCurrCard->discQCount--;
690462306a36Sopenharmony_ci				pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
690562306a36Sopenharmony_ci			} else {
690662306a36Sopenharmony_ci				pCurrCard->discQCount--;
690762306a36Sopenharmony_ci				pCurrCard->discQ_Tbl[currTar_Info->
690862306a36Sopenharmony_ci						     LunDiscQ_Idx[0]] = NULL;
690962306a36Sopenharmony_ci			}
691062306a36Sopenharmony_ci		}
691162306a36Sopenharmony_ci
691262306a36Sopenharmony_ci	}
691362306a36Sopenharmony_ci
691462306a36Sopenharmony_ci	callback = (CALL_BK_FN) p_sccb->SccbCallback;
691562306a36Sopenharmony_ci	callback(p_sccb);
691662306a36Sopenharmony_ci	pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
691762306a36Sopenharmony_ci	pCurrCard->currentSCCB = NULL;
691862306a36Sopenharmony_ci}
691962306a36Sopenharmony_ci
692062306a36Sopenharmony_ci/*---------------------------------------------------------------------
692162306a36Sopenharmony_ci *
692262306a36Sopenharmony_ci * Function: Queue Disconnect
692362306a36Sopenharmony_ci *
692462306a36Sopenharmony_ci * Description: Add SCCB to our disconnect array.
692562306a36Sopenharmony_ci *
692662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
692762306a36Sopenharmony_cistatic void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card)
692862306a36Sopenharmony_ci{
692962306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
693062306a36Sopenharmony_ci
693162306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
693262306a36Sopenharmony_ci
693362306a36Sopenharmony_ci	if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
693462306a36Sopenharmony_ci	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
693562306a36Sopenharmony_ci		FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
693662306a36Sopenharmony_ci					      LunDiscQ_Idx[p_sccb->Lun]] =
693762306a36Sopenharmony_ci		    p_sccb;
693862306a36Sopenharmony_ci	} else {
693962306a36Sopenharmony_ci		if (p_sccb->Sccb_tag) {
694062306a36Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] =
694162306a36Sopenharmony_ci			    p_sccb;
694262306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] =
694362306a36Sopenharmony_ci			    0;
694462306a36Sopenharmony_ci			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
694562306a36Sopenharmony_ci		} else {
694662306a36Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
694762306a36Sopenharmony_ci						      LunDiscQ_Idx[0]] = p_sccb;
694862306a36Sopenharmony_ci		}
694962306a36Sopenharmony_ci	}
695062306a36Sopenharmony_ci	FPT_BL_Card[p_card].currentSCCB = NULL;
695162306a36Sopenharmony_ci}
695262306a36Sopenharmony_ci
695362306a36Sopenharmony_ci/*---------------------------------------------------------------------
695462306a36Sopenharmony_ci *
695562306a36Sopenharmony_ci * Function: Queue Flush SCCB
695662306a36Sopenharmony_ci *
695762306a36Sopenharmony_ci * Description: Flush all SCCB's back to the host driver for this target.
695862306a36Sopenharmony_ci *
695962306a36Sopenharmony_ci *---------------------------------------------------------------------*/
696062306a36Sopenharmony_ci
696162306a36Sopenharmony_cistatic void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code)
696262306a36Sopenharmony_ci{
696362306a36Sopenharmony_ci	unsigned char qtag, thisTarg;
696462306a36Sopenharmony_ci	struct sccb *currSCCB;
696562306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
696662306a36Sopenharmony_ci
696762306a36Sopenharmony_ci	currSCCB = FPT_BL_Card[p_card].currentSCCB;
696862306a36Sopenharmony_ci	if (currSCCB != NULL) {
696962306a36Sopenharmony_ci		thisTarg = (unsigned char)currSCCB->TargID;
697062306a36Sopenharmony_ci		currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
697162306a36Sopenharmony_ci
697262306a36Sopenharmony_ci		for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
697362306a36Sopenharmony_ci
697462306a36Sopenharmony_ci			if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
697562306a36Sopenharmony_ci			    (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
697662306a36Sopenharmony_ci			     thisTarg)) {
697762306a36Sopenharmony_ci
697862306a36Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[qtag]->
697962306a36Sopenharmony_ci				    HostStatus = (unsigned char)error_code;
698062306a36Sopenharmony_ci
698162306a36Sopenharmony_ci				FPT_queueCmdComplete(&FPT_BL_Card[p_card],
698262306a36Sopenharmony_ci						     FPT_BL_Card[p_card].
698362306a36Sopenharmony_ci						     discQ_Tbl[qtag], p_card);
698462306a36Sopenharmony_ci
698562306a36Sopenharmony_ci				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
698662306a36Sopenharmony_ci				currTar_Info->TarTagQ_Cnt--;
698762306a36Sopenharmony_ci
698862306a36Sopenharmony_ci			}
698962306a36Sopenharmony_ci		}
699062306a36Sopenharmony_ci	}
699162306a36Sopenharmony_ci
699262306a36Sopenharmony_ci}
699362306a36Sopenharmony_ci
699462306a36Sopenharmony_ci/*---------------------------------------------------------------------
699562306a36Sopenharmony_ci *
699662306a36Sopenharmony_ci * Function: Queue Flush Target SCCB
699762306a36Sopenharmony_ci *
699862306a36Sopenharmony_ci * Description: Flush all SCCB's back to the host driver for this target.
699962306a36Sopenharmony_ci *
700062306a36Sopenharmony_ci *---------------------------------------------------------------------*/
700162306a36Sopenharmony_ci
700262306a36Sopenharmony_cistatic void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
700362306a36Sopenharmony_ci				   unsigned char error_code)
700462306a36Sopenharmony_ci{
700562306a36Sopenharmony_ci	unsigned char qtag;
700662306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
700762306a36Sopenharmony_ci
700862306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
700962306a36Sopenharmony_ci
701062306a36Sopenharmony_ci	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
701162306a36Sopenharmony_ci
701262306a36Sopenharmony_ci		if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
701362306a36Sopenharmony_ci		    (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg)) {
701462306a36Sopenharmony_ci
701562306a36Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus =
701662306a36Sopenharmony_ci			    (unsigned char)error_code;
701762306a36Sopenharmony_ci
701862306a36Sopenharmony_ci			FPT_queueCmdComplete(&FPT_BL_Card[p_card],
701962306a36Sopenharmony_ci					     FPT_BL_Card[p_card].
702062306a36Sopenharmony_ci					     discQ_Tbl[qtag], p_card);
702162306a36Sopenharmony_ci
702262306a36Sopenharmony_ci			FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
702362306a36Sopenharmony_ci			currTar_Info->TarTagQ_Cnt--;
702462306a36Sopenharmony_ci
702562306a36Sopenharmony_ci		}
702662306a36Sopenharmony_ci	}
702762306a36Sopenharmony_ci
702862306a36Sopenharmony_ci}
702962306a36Sopenharmony_ci
703062306a36Sopenharmony_cistatic void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card)
703162306a36Sopenharmony_ci{
703262306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
703362306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
703462306a36Sopenharmony_ci
703562306a36Sopenharmony_ci	p_SCCB->Sccb_forwardlink = NULL;
703662306a36Sopenharmony_ci
703762306a36Sopenharmony_ci	p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
703862306a36Sopenharmony_ci
703962306a36Sopenharmony_ci	if (currTar_Info->TarSelQ_Cnt == 0) {
704062306a36Sopenharmony_ci
704162306a36Sopenharmony_ci		currTar_Info->TarSelQ_Head = p_SCCB;
704262306a36Sopenharmony_ci	}
704362306a36Sopenharmony_ci
704462306a36Sopenharmony_ci	else {
704562306a36Sopenharmony_ci
704662306a36Sopenharmony_ci		currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
704762306a36Sopenharmony_ci	}
704862306a36Sopenharmony_ci
704962306a36Sopenharmony_ci	currTar_Info->TarSelQ_Tail = p_SCCB;
705062306a36Sopenharmony_ci	currTar_Info->TarSelQ_Cnt++;
705162306a36Sopenharmony_ci}
705262306a36Sopenharmony_ci
705362306a36Sopenharmony_ci/*---------------------------------------------------------------------
705462306a36Sopenharmony_ci *
705562306a36Sopenharmony_ci * Function: Queue Find SCCB
705662306a36Sopenharmony_ci *
705762306a36Sopenharmony_ci * Description: Search the target select Queue for this SCCB, and
705862306a36Sopenharmony_ci *              remove it if found.
705962306a36Sopenharmony_ci *
706062306a36Sopenharmony_ci *---------------------------------------------------------------------*/
706162306a36Sopenharmony_ci
706262306a36Sopenharmony_cistatic unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
706362306a36Sopenharmony_ci				       unsigned char p_card)
706462306a36Sopenharmony_ci{
706562306a36Sopenharmony_ci	struct sccb *q_ptr;
706662306a36Sopenharmony_ci	struct sccb_mgr_tar_info *currTar_Info;
706762306a36Sopenharmony_ci
706862306a36Sopenharmony_ci	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
706962306a36Sopenharmony_ci
707062306a36Sopenharmony_ci	q_ptr = currTar_Info->TarSelQ_Head;
707162306a36Sopenharmony_ci
707262306a36Sopenharmony_ci	while (q_ptr != NULL) {
707362306a36Sopenharmony_ci
707462306a36Sopenharmony_ci		if (q_ptr == p_SCCB) {
707562306a36Sopenharmony_ci
707662306a36Sopenharmony_ci			if (currTar_Info->TarSelQ_Head == q_ptr) {
707762306a36Sopenharmony_ci
707862306a36Sopenharmony_ci				currTar_Info->TarSelQ_Head =
707962306a36Sopenharmony_ci				    q_ptr->Sccb_forwardlink;
708062306a36Sopenharmony_ci			}
708162306a36Sopenharmony_ci
708262306a36Sopenharmony_ci			if (currTar_Info->TarSelQ_Tail == q_ptr) {
708362306a36Sopenharmony_ci
708462306a36Sopenharmony_ci				currTar_Info->TarSelQ_Tail =
708562306a36Sopenharmony_ci				    q_ptr->Sccb_backlink;
708662306a36Sopenharmony_ci			}
708762306a36Sopenharmony_ci
708862306a36Sopenharmony_ci			if (q_ptr->Sccb_forwardlink != NULL) {
708962306a36Sopenharmony_ci				q_ptr->Sccb_forwardlink->Sccb_backlink =
709062306a36Sopenharmony_ci				    q_ptr->Sccb_backlink;
709162306a36Sopenharmony_ci			}
709262306a36Sopenharmony_ci
709362306a36Sopenharmony_ci			if (q_ptr->Sccb_backlink != NULL) {
709462306a36Sopenharmony_ci				q_ptr->Sccb_backlink->Sccb_forwardlink =
709562306a36Sopenharmony_ci				    q_ptr->Sccb_forwardlink;
709662306a36Sopenharmony_ci			}
709762306a36Sopenharmony_ci
709862306a36Sopenharmony_ci			currTar_Info->TarSelQ_Cnt--;
709962306a36Sopenharmony_ci
710062306a36Sopenharmony_ci			return 1;
710162306a36Sopenharmony_ci		}
710262306a36Sopenharmony_ci
710362306a36Sopenharmony_ci		else {
710462306a36Sopenharmony_ci			q_ptr = q_ptr->Sccb_forwardlink;
710562306a36Sopenharmony_ci		}
710662306a36Sopenharmony_ci	}
710762306a36Sopenharmony_ci
710862306a36Sopenharmony_ci	return 0;
710962306a36Sopenharmony_ci
711062306a36Sopenharmony_ci}
711162306a36Sopenharmony_ci
711262306a36Sopenharmony_ci/*---------------------------------------------------------------------
711362306a36Sopenharmony_ci *
711462306a36Sopenharmony_ci * Function: Utility Update Residual Count
711562306a36Sopenharmony_ci *
711662306a36Sopenharmony_ci * Description: Update the XferCnt to the remaining byte count.
711762306a36Sopenharmony_ci *              If we transferred all the data then just write zero.
711862306a36Sopenharmony_ci *              If Non-SG transfer then report Total Cnt - Actual Transfer
711962306a36Sopenharmony_ci *              Cnt.  For SG transfers add the count fields of all
712062306a36Sopenharmony_ci *              remaining SG elements, as well as any partial remaining
712162306a36Sopenharmony_ci *              element.
712262306a36Sopenharmony_ci *
712362306a36Sopenharmony_ci *---------------------------------------------------------------------*/
712462306a36Sopenharmony_ci
712562306a36Sopenharmony_cistatic void FPT_utilUpdateResidual(struct sccb *p_SCCB)
712662306a36Sopenharmony_ci{
712762306a36Sopenharmony_ci	unsigned long partial_cnt;
712862306a36Sopenharmony_ci	unsigned int sg_index;
712962306a36Sopenharmony_ci	struct blogic_sg_seg *segp;
713062306a36Sopenharmony_ci
713162306a36Sopenharmony_ci	if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
713262306a36Sopenharmony_ci
713362306a36Sopenharmony_ci		p_SCCB->DataLength = 0x0000;
713462306a36Sopenharmony_ci	}
713562306a36Sopenharmony_ci
713662306a36Sopenharmony_ci	else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
713762306a36Sopenharmony_ci
713862306a36Sopenharmony_ci		partial_cnt = 0x0000;
713962306a36Sopenharmony_ci
714062306a36Sopenharmony_ci		sg_index = p_SCCB->Sccb_sgseg;
714162306a36Sopenharmony_ci
714262306a36Sopenharmony_ci
714362306a36Sopenharmony_ci		if (p_SCCB->Sccb_SGoffset) {
714462306a36Sopenharmony_ci
714562306a36Sopenharmony_ci			partial_cnt = p_SCCB->Sccb_SGoffset;
714662306a36Sopenharmony_ci			sg_index++;
714762306a36Sopenharmony_ci		}
714862306a36Sopenharmony_ci
714962306a36Sopenharmony_ci		while (((unsigned long)sg_index *
715062306a36Sopenharmony_ci			(unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) {
715162306a36Sopenharmony_ci			segp = (struct blogic_sg_seg *)(p_SCCB->DataPointer) +
715262306a36Sopenharmony_ci					(sg_index * 2);
715362306a36Sopenharmony_ci			partial_cnt += segp->segbytes;
715462306a36Sopenharmony_ci			sg_index++;
715562306a36Sopenharmony_ci		}
715662306a36Sopenharmony_ci
715762306a36Sopenharmony_ci		p_SCCB->DataLength = partial_cnt;
715862306a36Sopenharmony_ci	}
715962306a36Sopenharmony_ci
716062306a36Sopenharmony_ci	else {
716162306a36Sopenharmony_ci
716262306a36Sopenharmony_ci		p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
716362306a36Sopenharmony_ci	}
716462306a36Sopenharmony_ci}
716562306a36Sopenharmony_ci
716662306a36Sopenharmony_ci/*---------------------------------------------------------------------
716762306a36Sopenharmony_ci *
716862306a36Sopenharmony_ci * Function: Wait 1 Second
716962306a36Sopenharmony_ci *
717062306a36Sopenharmony_ci * Description: Wait for 1 second.
717162306a36Sopenharmony_ci *
717262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
717362306a36Sopenharmony_ci
717462306a36Sopenharmony_cistatic void FPT_Wait1Second(u32 p_port)
717562306a36Sopenharmony_ci{
717662306a36Sopenharmony_ci	unsigned char i;
717762306a36Sopenharmony_ci
717862306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
717962306a36Sopenharmony_ci
718062306a36Sopenharmony_ci		FPT_Wait(p_port, TO_250ms);
718162306a36Sopenharmony_ci
718262306a36Sopenharmony_ci		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
718362306a36Sopenharmony_ci			break;
718462306a36Sopenharmony_ci
718562306a36Sopenharmony_ci		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
718662306a36Sopenharmony_ci			break;
718762306a36Sopenharmony_ci	}
718862306a36Sopenharmony_ci}
718962306a36Sopenharmony_ci
719062306a36Sopenharmony_ci/*---------------------------------------------------------------------
719162306a36Sopenharmony_ci *
719262306a36Sopenharmony_ci * Function: FPT_Wait
719362306a36Sopenharmony_ci *
719462306a36Sopenharmony_ci * Description: Wait the desired delay.
719562306a36Sopenharmony_ci *
719662306a36Sopenharmony_ci *---------------------------------------------------------------------*/
719762306a36Sopenharmony_ci
719862306a36Sopenharmony_cistatic void FPT_Wait(u32 p_port, unsigned char p_delay)
719962306a36Sopenharmony_ci{
720062306a36Sopenharmony_ci	unsigned char old_timer;
720162306a36Sopenharmony_ci	unsigned char green_flag;
720262306a36Sopenharmony_ci
720362306a36Sopenharmony_ci	old_timer = RD_HARPOON(p_port + hp_seltimeout);
720462306a36Sopenharmony_ci
720562306a36Sopenharmony_ci	green_flag = RD_HARPOON(p_port + hp_clkctrl_0);
720662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
720762306a36Sopenharmony_ci
720862306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, p_delay);
720962306a36Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
721062306a36Sopenharmony_ci	WRW_HARPOON((p_port + hp_intena), (FPT_default_intena & ~TIMEOUT));
721162306a36Sopenharmony_ci
721262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0,
721362306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_portctrl_0) | START_TO));
721462306a36Sopenharmony_ci
721562306a36Sopenharmony_ci	while (!(RDW_HARPOON((p_port + hp_intstat)) & TIMEOUT)) {
721662306a36Sopenharmony_ci
721762306a36Sopenharmony_ci		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
721862306a36Sopenharmony_ci			break;
721962306a36Sopenharmony_ci
722062306a36Sopenharmony_ci		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
722162306a36Sopenharmony_ci			break;
722262306a36Sopenharmony_ci	}
722362306a36Sopenharmony_ci
722462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_portctrl_0,
722562306a36Sopenharmony_ci		   (RD_HARPOON(p_port + hp_portctrl_0) & ~START_TO));
722662306a36Sopenharmony_ci
722762306a36Sopenharmony_ci	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
722862306a36Sopenharmony_ci	WRW_HARPOON((p_port + hp_intena), FPT_default_intena);
722962306a36Sopenharmony_ci
723062306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_clkctrl_0, green_flag);
723162306a36Sopenharmony_ci
723262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_seltimeout, old_timer);
723362306a36Sopenharmony_ci}
723462306a36Sopenharmony_ci
723562306a36Sopenharmony_ci/*---------------------------------------------------------------------
723662306a36Sopenharmony_ci *
723762306a36Sopenharmony_ci * Function: Enable/Disable Write to EEPROM
723862306a36Sopenharmony_ci *
723962306a36Sopenharmony_ci * Description: The EEPROM must first be enabled for writes
724062306a36Sopenharmony_ci *              A total of 9 clocks are needed.
724162306a36Sopenharmony_ci *
724262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
724362306a36Sopenharmony_ci
724462306a36Sopenharmony_cistatic void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode)
724562306a36Sopenharmony_ci{
724662306a36Sopenharmony_ci	unsigned char ee_value;
724762306a36Sopenharmony_ci
724862306a36Sopenharmony_ci	ee_value =
724962306a36Sopenharmony_ci	    (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
725062306a36Sopenharmony_ci			    (EXT_ARB_ACK | SCSI_TERM_ENA_H));
725162306a36Sopenharmony_ci
725262306a36Sopenharmony_ci	if (p_mode)
725362306a36Sopenharmony_ci
725462306a36Sopenharmony_ci		FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
725562306a36Sopenharmony_ci
725662306a36Sopenharmony_ci	else
725762306a36Sopenharmony_ci
725862306a36Sopenharmony_ci		FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
725962306a36Sopenharmony_ci
726062306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/*Turn off CS */
726162306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/*Turn off Master Select */
726262306a36Sopenharmony_ci}
726362306a36Sopenharmony_ci
726462306a36Sopenharmony_ci/*---------------------------------------------------------------------
726562306a36Sopenharmony_ci *
726662306a36Sopenharmony_ci * Function: Write EEPROM
726762306a36Sopenharmony_ci *
726862306a36Sopenharmony_ci * Description: Write a word to the EEPROM at the specified
726962306a36Sopenharmony_ci *              address.
727062306a36Sopenharmony_ci *
727162306a36Sopenharmony_ci *---------------------------------------------------------------------*/
727262306a36Sopenharmony_ci
727362306a36Sopenharmony_cistatic void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
727462306a36Sopenharmony_ci			    unsigned short ee_addr)
727562306a36Sopenharmony_ci{
727662306a36Sopenharmony_ci
727762306a36Sopenharmony_ci	unsigned char ee_value;
727862306a36Sopenharmony_ci	unsigned short i;
727962306a36Sopenharmony_ci
728062306a36Sopenharmony_ci	ee_value =
728162306a36Sopenharmony_ci	    (unsigned
728262306a36Sopenharmony_ci	     char)((RD_HARPOON(p_port + hp_ee_ctrl) &
728362306a36Sopenharmony_ci		    (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
728462306a36Sopenharmony_ci
728562306a36Sopenharmony_ci	FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
728662306a36Sopenharmony_ci
728762306a36Sopenharmony_ci	ee_value |= (SEE_MS + SEE_CS);
728862306a36Sopenharmony_ci
728962306a36Sopenharmony_ci	for (i = 0x8000; i != 0; i >>= 1) {
729062306a36Sopenharmony_ci
729162306a36Sopenharmony_ci		if (i & ee_data)
729262306a36Sopenharmony_ci			ee_value |= SEE_DO;
729362306a36Sopenharmony_ci		else
729462306a36Sopenharmony_ci			ee_value &= ~SEE_DO;
729562306a36Sopenharmony_ci
729662306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
729762306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
729862306a36Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
729962306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
730062306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
730162306a36Sopenharmony_ci		ee_value &= ~SEE_CLK;
730262306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
730362306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
730462306a36Sopenharmony_ci	}
730562306a36Sopenharmony_ci	ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
730662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));
730762306a36Sopenharmony_ci
730862306a36Sopenharmony_ci	FPT_Wait(p_port, TO_10ms);
730962306a36Sopenharmony_ci
731062306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS));	/* Set CS to EEPROM */
731162306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/* Turn off CS */
731262306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/* Turn off Master Select */
731362306a36Sopenharmony_ci}
731462306a36Sopenharmony_ci
731562306a36Sopenharmony_ci/*---------------------------------------------------------------------
731662306a36Sopenharmony_ci *
731762306a36Sopenharmony_ci * Function: Read EEPROM
731862306a36Sopenharmony_ci *
731962306a36Sopenharmony_ci * Description: Read a word from the EEPROM at the desired
732062306a36Sopenharmony_ci *              address.
732162306a36Sopenharmony_ci *
732262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
732362306a36Sopenharmony_ci
732462306a36Sopenharmony_cistatic unsigned short FPT_utilEERead(u32 p_port,
732562306a36Sopenharmony_ci				     unsigned short ee_addr)
732662306a36Sopenharmony_ci{
732762306a36Sopenharmony_ci	unsigned short i, ee_data1, ee_data2;
732862306a36Sopenharmony_ci
732962306a36Sopenharmony_ci	i = 0;
733062306a36Sopenharmony_ci	ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
733162306a36Sopenharmony_ci	do {
733262306a36Sopenharmony_ci		ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
733362306a36Sopenharmony_ci
733462306a36Sopenharmony_ci		if (ee_data1 == ee_data2)
733562306a36Sopenharmony_ci			return ee_data1;
733662306a36Sopenharmony_ci
733762306a36Sopenharmony_ci		ee_data1 = ee_data2;
733862306a36Sopenharmony_ci		i++;
733962306a36Sopenharmony_ci
734062306a36Sopenharmony_ci	} while (i < 4);
734162306a36Sopenharmony_ci
734262306a36Sopenharmony_ci	return ee_data1;
734362306a36Sopenharmony_ci}
734462306a36Sopenharmony_ci
734562306a36Sopenharmony_ci/*---------------------------------------------------------------------
734662306a36Sopenharmony_ci *
734762306a36Sopenharmony_ci * Function: Read EEPROM Original
734862306a36Sopenharmony_ci *
734962306a36Sopenharmony_ci * Description: Read a word from the EEPROM at the desired
735062306a36Sopenharmony_ci *              address.
735162306a36Sopenharmony_ci *
735262306a36Sopenharmony_ci *---------------------------------------------------------------------*/
735362306a36Sopenharmony_ci
735462306a36Sopenharmony_cistatic unsigned short FPT_utilEEReadOrg(u32 p_port, unsigned short ee_addr)
735562306a36Sopenharmony_ci{
735662306a36Sopenharmony_ci
735762306a36Sopenharmony_ci	unsigned char ee_value;
735862306a36Sopenharmony_ci	unsigned short i, ee_data;
735962306a36Sopenharmony_ci
736062306a36Sopenharmony_ci	ee_value =
736162306a36Sopenharmony_ci	    (unsigned
736262306a36Sopenharmony_ci	     char)((RD_HARPOON(p_port + hp_ee_ctrl) &
736362306a36Sopenharmony_ci		    (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
736462306a36Sopenharmony_ci
736562306a36Sopenharmony_ci	FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
736662306a36Sopenharmony_ci
736762306a36Sopenharmony_ci	ee_value |= (SEE_MS + SEE_CS);
736862306a36Sopenharmony_ci	ee_data = 0;
736962306a36Sopenharmony_ci
737062306a36Sopenharmony_ci	for (i = 1; i <= 16; i++) {
737162306a36Sopenharmony_ci
737262306a36Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
737362306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
737462306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
737562306a36Sopenharmony_ci		ee_value &= ~SEE_CLK;
737662306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
737762306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
737862306a36Sopenharmony_ci
737962306a36Sopenharmony_ci		ee_data <<= 1;
738062306a36Sopenharmony_ci
738162306a36Sopenharmony_ci		if (RD_HARPOON(p_port + hp_ee_ctrl) & SEE_DI)
738262306a36Sopenharmony_ci			ee_data |= 1;
738362306a36Sopenharmony_ci	}
738462306a36Sopenharmony_ci
738562306a36Sopenharmony_ci	ee_value &= ~(SEE_MS + SEE_CS);
738662306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/*Turn off CS */
738762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/*Turn off Master Select */
738862306a36Sopenharmony_ci
738962306a36Sopenharmony_ci	return ee_data;
739062306a36Sopenharmony_ci}
739162306a36Sopenharmony_ci
739262306a36Sopenharmony_ci/*---------------------------------------------------------------------
739362306a36Sopenharmony_ci *
739462306a36Sopenharmony_ci * Function: Send EE command and Address to the EEPROM
739562306a36Sopenharmony_ci *
739662306a36Sopenharmony_ci * Description: Transfers the correct command and sends the address
739762306a36Sopenharmony_ci *              to the eeprom.
739862306a36Sopenharmony_ci *
739962306a36Sopenharmony_ci *---------------------------------------------------------------------*/
740062306a36Sopenharmony_ci
740162306a36Sopenharmony_cistatic void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
740262306a36Sopenharmony_ci				  unsigned short ee_addr)
740362306a36Sopenharmony_ci{
740462306a36Sopenharmony_ci	unsigned char ee_value;
740562306a36Sopenharmony_ci	unsigned char narrow_flg;
740662306a36Sopenharmony_ci
740762306a36Sopenharmony_ci	unsigned short i;
740862306a36Sopenharmony_ci
740962306a36Sopenharmony_ci	narrow_flg =
741062306a36Sopenharmony_ci	    (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
741162306a36Sopenharmony_ci			    NARROW_SCSI_CARD);
741262306a36Sopenharmony_ci
741362306a36Sopenharmony_ci	ee_value = SEE_MS;
741462306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
741562306a36Sopenharmony_ci
741662306a36Sopenharmony_ci	ee_value |= SEE_CS;	/* Set CS to EEPROM */
741762306a36Sopenharmony_ci	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
741862306a36Sopenharmony_ci
741962306a36Sopenharmony_ci	for (i = 0x04; i != 0; i >>= 1) {
742062306a36Sopenharmony_ci
742162306a36Sopenharmony_ci		if (i & ee_cmd)
742262306a36Sopenharmony_ci			ee_value |= SEE_DO;
742362306a36Sopenharmony_ci		else
742462306a36Sopenharmony_ci			ee_value &= ~SEE_DO;
742562306a36Sopenharmony_ci
742662306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
742762306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
742862306a36Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
742962306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
743062306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
743162306a36Sopenharmony_ci		ee_value &= ~SEE_CLK;
743262306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
743362306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
743462306a36Sopenharmony_ci	}
743562306a36Sopenharmony_ci
743662306a36Sopenharmony_ci	if (narrow_flg)
743762306a36Sopenharmony_ci		i = 0x0080;
743862306a36Sopenharmony_ci
743962306a36Sopenharmony_ci	else
744062306a36Sopenharmony_ci		i = 0x0200;
744162306a36Sopenharmony_ci
744262306a36Sopenharmony_ci	while (i != 0) {
744362306a36Sopenharmony_ci
744462306a36Sopenharmony_ci		if (i & ee_addr)
744562306a36Sopenharmony_ci			ee_value |= SEE_DO;
744662306a36Sopenharmony_ci		else
744762306a36Sopenharmony_ci			ee_value &= ~SEE_DO;
744862306a36Sopenharmony_ci
744962306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
745062306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
745162306a36Sopenharmony_ci		ee_value |= SEE_CLK;	/* Clock  data! */
745262306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
745362306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
745462306a36Sopenharmony_ci		ee_value &= ~SEE_CLK;
745562306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
745662306a36Sopenharmony_ci		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
745762306a36Sopenharmony_ci
745862306a36Sopenharmony_ci		i >>= 1;
745962306a36Sopenharmony_ci	}
746062306a36Sopenharmony_ci}
746162306a36Sopenharmony_ci
746262306a36Sopenharmony_cistatic unsigned short FPT_CalcCrc16(unsigned char buffer[])
746362306a36Sopenharmony_ci{
746462306a36Sopenharmony_ci	unsigned short crc = 0;
746562306a36Sopenharmony_ci	int i, j;
746662306a36Sopenharmony_ci	unsigned short ch;
746762306a36Sopenharmony_ci	for (i = 0; i < ID_STRING_LENGTH; i++) {
746862306a36Sopenharmony_ci		ch = (unsigned short)buffer[i];
746962306a36Sopenharmony_ci		for (j = 0; j < 8; j++) {
747062306a36Sopenharmony_ci			if ((crc ^ ch) & 1)
747162306a36Sopenharmony_ci				crc = (crc >> 1) ^ CRCMASK;
747262306a36Sopenharmony_ci			else
747362306a36Sopenharmony_ci				crc >>= 1;
747462306a36Sopenharmony_ci			ch >>= 1;
747562306a36Sopenharmony_ci		}
747662306a36Sopenharmony_ci	}
747762306a36Sopenharmony_ci	return crc;
747862306a36Sopenharmony_ci}
747962306a36Sopenharmony_ci
748062306a36Sopenharmony_cistatic unsigned char FPT_CalcLrc(unsigned char buffer[])
748162306a36Sopenharmony_ci{
748262306a36Sopenharmony_ci	int i;
748362306a36Sopenharmony_ci	unsigned char lrc;
748462306a36Sopenharmony_ci	lrc = 0;
748562306a36Sopenharmony_ci	for (i = 0; i < ID_STRING_LENGTH; i++)
748662306a36Sopenharmony_ci		lrc ^= buffer[i];
748762306a36Sopenharmony_ci	return lrc;
748862306a36Sopenharmony_ci}
748962306a36Sopenharmony_ci
749062306a36Sopenharmony_ci/*
749162306a36Sopenharmony_ci  The following inline definitions avoid type conflicts.
749262306a36Sopenharmony_ci*/
749362306a36Sopenharmony_ci
749462306a36Sopenharmony_cistatic inline unsigned char
749562306a36Sopenharmony_ciFlashPoint__ProbeHostAdapter(struct fpoint_info *FlashPointInfo)
749662306a36Sopenharmony_ci{
749762306a36Sopenharmony_ci	return FlashPoint_ProbeHostAdapter((struct sccb_mgr_info *)
749862306a36Sopenharmony_ci					   FlashPointInfo);
749962306a36Sopenharmony_ci}
750062306a36Sopenharmony_ci
750162306a36Sopenharmony_cistatic inline void *
750262306a36Sopenharmony_ciFlashPoint__HardwareResetHostAdapter(struct fpoint_info *FlashPointInfo)
750362306a36Sopenharmony_ci{
750462306a36Sopenharmony_ci	return FlashPoint_HardwareResetHostAdapter((struct sccb_mgr_info *)
750562306a36Sopenharmony_ci						   FlashPointInfo);
750662306a36Sopenharmony_ci}
750762306a36Sopenharmony_ci
750862306a36Sopenharmony_cistatic inline void
750962306a36Sopenharmony_ciFlashPoint__ReleaseHostAdapter(void *CardHandle)
751062306a36Sopenharmony_ci{
751162306a36Sopenharmony_ci	FlashPoint_ReleaseHostAdapter(CardHandle);
751262306a36Sopenharmony_ci}
751362306a36Sopenharmony_ci
751462306a36Sopenharmony_cistatic inline void
751562306a36Sopenharmony_ciFlashPoint__StartCCB(void *CardHandle, struct blogic_ccb *CCB)
751662306a36Sopenharmony_ci{
751762306a36Sopenharmony_ci	FlashPoint_StartCCB(CardHandle, (struct sccb *)CCB);
751862306a36Sopenharmony_ci}
751962306a36Sopenharmony_ci
752062306a36Sopenharmony_cistatic inline void
752162306a36Sopenharmony_ciFlashPoint__AbortCCB(void *CardHandle, struct blogic_ccb *CCB)
752262306a36Sopenharmony_ci{
752362306a36Sopenharmony_ci	FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB);
752462306a36Sopenharmony_ci}
752562306a36Sopenharmony_ci
752662306a36Sopenharmony_cistatic inline bool
752762306a36Sopenharmony_ciFlashPoint__InterruptPending(void *CardHandle)
752862306a36Sopenharmony_ci{
752962306a36Sopenharmony_ci	return FlashPoint_InterruptPending(CardHandle);
753062306a36Sopenharmony_ci}
753162306a36Sopenharmony_ci
753262306a36Sopenharmony_cistatic inline int
753362306a36Sopenharmony_ciFlashPoint__HandleInterrupt(void *CardHandle)
753462306a36Sopenharmony_ci{
753562306a36Sopenharmony_ci	return FlashPoint_HandleInterrupt(CardHandle);
753662306a36Sopenharmony_ci}
753762306a36Sopenharmony_ci
753862306a36Sopenharmony_ci#define FlashPoint_ProbeHostAdapter	    FlashPoint__ProbeHostAdapter
753962306a36Sopenharmony_ci#define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
754062306a36Sopenharmony_ci#define FlashPoint_ReleaseHostAdapter	    FlashPoint__ReleaseHostAdapter
754162306a36Sopenharmony_ci#define FlashPoint_StartCCB		    FlashPoint__StartCCB
754262306a36Sopenharmony_ci#define FlashPoint_AbortCCB		    FlashPoint__AbortCCB
754362306a36Sopenharmony_ci#define FlashPoint_InterruptPending	    FlashPoint__InterruptPending
754462306a36Sopenharmony_ci#define FlashPoint_HandleInterrupt	    FlashPoint__HandleInterrupt
754562306a36Sopenharmony_ci
754662306a36Sopenharmony_ci#else				/* !CONFIG_SCSI_FLASHPOINT */
754762306a36Sopenharmony_ci
754862306a36Sopenharmony_ci/*
754962306a36Sopenharmony_ci  Define prototypes for the FlashPoint SCCB Manager Functions.
755062306a36Sopenharmony_ci*/
755162306a36Sopenharmony_ci
755262306a36Sopenharmony_ciextern unsigned char FlashPoint_ProbeHostAdapter(struct fpoint_info *);
755362306a36Sopenharmony_ciextern void *FlashPoint_HardwareResetHostAdapter(struct fpoint_info *);
755462306a36Sopenharmony_ciextern void FlashPoint_StartCCB(void *, struct blogic_ccb *);
755562306a36Sopenharmony_ciextern int FlashPoint_AbortCCB(void *, struct blogic_ccb *);
755662306a36Sopenharmony_ciextern bool FlashPoint_InterruptPending(void *);
755762306a36Sopenharmony_ciextern int FlashPoint_HandleInterrupt(void *);
755862306a36Sopenharmony_ciextern void FlashPoint_ReleaseHostAdapter(void *);
755962306a36Sopenharmony_ci
756062306a36Sopenharmony_ci#endif				/* CONFIG_SCSI_FLASHPOINT */
7561