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