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