^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) FlashPoint.c -- FlashPoint SCCB Manager for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) Linux compatibility. It was provided by BusLogic in the form of 16 separate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) source files, which would have unnecessarily cluttered the scsi directory, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) the individual files have been combined into this single file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) Copyright 1995-1996 by Mylex Corporation. All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) This file is available under both the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) and a BSD-style copyright; see LICENSE.FlashPoint for details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifdef CONFIG_SCSI_FLASHPOINT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define MAX_CARDS 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #undef BUSTYPE_PCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define CRCMASK 0xA001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define FAILURE 0xFFFFFFFFL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) typedef void (*CALL_BK_FN) (struct sccb *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct sccb_mgr_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) u32 si_baseaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) unsigned char si_present;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) unsigned char si_intvect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) unsigned char si_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) unsigned char si_lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) u16 si_fw_revision;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) u16 si_per_targ_init_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) u16 si_per_targ_fast_nego;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) u16 si_per_targ_ultra_nego;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u16 si_per_targ_no_disc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u16 si_per_targ_wide_nego;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u16 si_mflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) unsigned char si_card_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) unsigned char si_bustype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) unsigned char si_card_model[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) unsigned char si_relative_cardnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) unsigned char si_reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u32 si_OS_reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unsigned char si_XlatInfo[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u32 si_reserved2[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) u32 si_secondary_range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define SCSI_PARITY_ENA 0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define LOW_BYTE_TERM 0x0010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define HIGH_BYTE_TERM 0x0020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define BUSTYPE_PCI 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define SUPPORT_16TAR_32LUN 0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define SOFT_RESET 0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define EXTENDED_TRANSLATION 0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define POST_ALL_UNDERRRUNS 0x0040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define FLAG_SCAM_ENABLED 0x0080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define FLAG_SCAM_LEVEL2 0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define HARPOON_FAMILY 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* SCCB struct used for both SCCB and UCB manager compiles!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * The UCB Manager treats the SCCB as it's 'native hardware structure'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /*#pragma pack(1)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct sccb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) unsigned char OperationCode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) unsigned char ControlByte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unsigned char CdbLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) unsigned char RequestSenseLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u32 DataLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) void *DataPointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) unsigned char CcbRes[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned char HostStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) unsigned char TargetStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) unsigned char TargID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) unsigned char Lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) unsigned char Cdb[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned char CcbRes1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) unsigned char Reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u32 Reserved2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u32 SensePointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) CALL_BK_FN SccbCallback; /* VOID (*SccbCallback)(); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) u32 SccbIOPort; /* Identifies board base port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) unsigned char SccbStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) unsigned char SCCBRes2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) u16 SccbOSFlags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) u32 Sccb_XferCnt; /* actual transfer count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) u32 Sccb_ATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) u32 SccbVirtDataPtr; /* virtual addr for OS/2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) u32 Sccb_res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u16 Sccb_MGRFlags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) u16 Sccb_sgseg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) unsigned char Sccb_scsimsg; /* identify msg for selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) unsigned char Sccb_tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) unsigned char Sccb_scsistat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) unsigned char Sccb_idmsg; /* image of last msg in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct sccb *Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct sccb *Sccb_backlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) u32 Sccb_savedATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) unsigned char Save_Cdb[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) unsigned char Save_CdbLen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) unsigned char Sccb_XferState;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) u32 Sccb_SGoffset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #pragma pack()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define SCATTER_GATHER_COMMAND 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define RESIDUAL_COMMAND 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define RESIDUAL_SG_COMMAND 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define RESET_COMMAND 0x81
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define F_USE_CMD_Q 0x20 /*Inidcates TAGGED command. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define TAG_TYPE_MASK 0xC0 /*Type of tag msg to send. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define SCCB_DATA_XFER_OUT 0x10 /* Write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SCCB_DATA_XFER_IN 0x08 /* Read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define NO_AUTO_REQUEST_SENSE 0x01 /* No Request Sense Buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define BUS_FREE_ST 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SELECT_ST 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define SELECT_BDR_ST 2 /* Select w\ Bus Device Reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define SELECT_SN_ST 3 /* Select w\ Sync Nego */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define SELECT_WN_ST 4 /* Select w\ Wide Data Nego */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SELECT_Q_ST 5 /* Select w\ Tagged Q'ing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define COMMAND_ST 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define DATA_OUT_ST 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define DATA_IN_ST 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define DISCONNECT_ST 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define ABORT_ST 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define F_HOST_XFER_DIR 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define F_ALL_XFERRED 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define F_SG_XFER 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define F_AUTO_SENSE 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define F_ODD_BALL_CNT 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define F_NO_DATA_YET 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define F_STATUSLOADED 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define F_DEV_SELECTED 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define SCCB_COMPLETE 0x00 /* SCCB completed without error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SCCB_DATA_UNDER_RUN 0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define SCCB_SELECTION_TIMEOUT 0x11 /* Set SCSI selection timed out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define SCCB_DATA_OVER_RUN 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SCCB_PHASE_SEQUENCE_FAIL 0x14 /* Target bus phase sequence failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define SCCB_GROSS_FW_ERR 0x27 /* Major problem! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define SCCB_BM_ERR 0x30 /* BusMaster error. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define SCCB_PARITY_ERR 0x34 /* SCSI parity error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define SCCB_IN_PROCESS 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define SCCB_SUCCESS 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define SCCB_ABORT 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define SCCB_ERROR 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define ORION_FW_REV 3110
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define QUEUE_DEPTH 254+1 /*1 for Normal disconnect 32 for Q'ing. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define MAX_MB_CARDS 4 /* Max. no of cards suppoerted on Mother Board */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define MAX_SCSI_TAR 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define MAX_LUN 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define LUN_MASK 0x1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define SG_BUF_CNT 16 /*Number of prefetched elements. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define SG_ELEMENT_SIZE 8 /*Eight byte per element. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define RD_HARPOON(ioport) inb((u32)ioport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define RDW_HARPOON(ioport) inw((u32)ioport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define RD_HARP32(ioport,offset,data) (data = inl((u32)(ioport + offset)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define WR_HARPOON(ioport,val) outb((u8) val, (u32)ioport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define WRW_HARPOON(ioport,val) outw((u16)val, (u32)ioport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define WR_HARP32(ioport,offset,data) outl(data, (u32)(ioport + offset))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define TAR_SYNC_MASK (BIT(7)+BIT(6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define SYNC_TRYING BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define SYNC_SUPPORTED (BIT(7)+BIT(6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define TAR_WIDE_MASK (BIT(5)+BIT(4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) #define WIDE_ENABLED BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define WIDE_NEGOCIATED BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define TAR_TAG_Q_MASK (BIT(3)+BIT(2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define TAG_Q_TRYING BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define TAG_Q_REJECT BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define TAR_ALLOW_DISC BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define EE_SYNC_MASK (BIT(0)+BIT(1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #define EE_SYNC_5MB BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define EE_SYNC_10MB BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define EE_SYNC_20MB (BIT(0)+BIT(1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #define EE_WIDE_SCSI BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) struct sccb_mgr_tar_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct sccb *TarSelQ_Head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct sccb *TarSelQ_Tail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) unsigned char TarLUN_CA; /*Contingent Allgiance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) unsigned char TarTagQ_Cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) unsigned char TarSelQ_Cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) unsigned char TarStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) unsigned char TarEEValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) unsigned char TarSyncCtrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) unsigned char TarReserved[2]; /* for alignment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) unsigned char LunDiscQ_Idx[MAX_LUN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) unsigned char TarLUNBusy[MAX_LUN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct nvram_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) unsigned char niModel; /* Model No. of card */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) unsigned char niCardNo; /* Card no. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) u32 niBaseAddr; /* Port Address of card */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) unsigned char niSysConf; /* Adapter Configuration byte -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) Byte 16 of eeprom map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) unsigned char niScsiConf; /* SCSI Configuration byte -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) Byte 17 of eeprom map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) unsigned char niScamConf; /* SCAM Configuration byte -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) Byte 20 of eeprom map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) unsigned char niAdapId; /* Host Adapter ID -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) Byte 24 of eerpom map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) unsigned char niSyncTbl[MAX_SCSI_TAR / 2]; /* Sync/Wide byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) of targets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) unsigned char niScamTbl[MAX_SCSI_TAR][4]; /* Compressed Scam name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) string of Targets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) #define MODEL_LT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define MODEL_DL 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define MODEL_LW 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define MODEL_DW 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct sccb_card {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) struct sccb *currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) struct sccb_mgr_info *cardInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) u32 ioPort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) unsigned short cmdCounter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) unsigned char discQCount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) unsigned char tagQ_Lst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) unsigned char cardIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) unsigned char scanIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) unsigned char globalFlags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) unsigned char ourId;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct nvram_info *pNvRamInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) struct sccb *discQ_Tbl[QUEUE_DEPTH];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) #define F_TAG_STARTED 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) #define F_CONLUN_IO 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #define F_DO_RENEGO 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) #define F_NO_FILTER 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) #define F_GREEN_PC 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define F_HOST_XFER_ACT 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #define F_NEW_SCCB_CMD 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #define F_UPDATE_EEPROM 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) #define ID_STRING_LENGTH 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define TYPE_CODE0 0x63 /*Level2 Mstr (bits 7-6), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #define SLV_TYPE_CODE0 0xA3 /*Priority Bit set (bits 7-6), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) #define ASSIGN_ID 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #define SET_P_FLAG 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #define CFG_CMPLT 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #define DOM_MSTR 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #define SYNC_PTRN 0x1F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) #define ID_0_7 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #define ID_8_F 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #define MISC_CODE 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define CLR_P_FLAG 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define INIT_SELTD 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define LEVEL2_TAR 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) enum scam_id_st { ID0, ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, ID9, ID10, ID11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) ID12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) ID13, ID14, ID15, ID_UNUSED, ID_UNASSIGNED, ID_ASSIGNED, LEGACY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) CLR_PRIORITY, NO_ID_AVAIL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) typedef struct SCCBscam_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) unsigned char id_string[ID_STRING_LENGTH];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) enum scam_id_st state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) } SCCBSCAM_INFO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) #define SCSI_REQUEST_SENSE 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #define SCSI_READ 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #define SCSI_WRITE 0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) #define SCSI_START_STOP_UNIT 0x1B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #define SCSI_READ_EXTENDED 0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) #define SCSI_WRITE_EXTENDED 0x2A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #define SCSI_WRITE_AND_VERIFY 0x2E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #define SSGOOD 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) #define SSCHECK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #define SSQ_FULL 0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #define SMCMD_COMP 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) #define SMEXT 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #define SMSAVE_DATA_PTR 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) #define SMREST_DATA_PTR 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) #define SMDISC 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) #define SMABORT 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) #define SMREJECT 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) #define SMNO_OP 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) #define SMPARITY 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) #define SMDEV_RESET 0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) #define SMABORT_TAG 0x0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #define SMINIT_RECOVERY 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #define SMREL_RECOVERY 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) #define SMIDENT 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #define DISC_PRIV 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #define SMSYNC 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) #define SMWDTR 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #define SM8BIT 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define SM16BIT 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define SMIGNORWR 0x23 /* Ignore Wide Residue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #define SIX_BYTE_CMD 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define TWELVE_BYTE_CMD 0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define ASYNC 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define MAX_OFFSET 0x0F /* Maxbyteoffset for Sync Xfers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) #define EEPROM_WD_CNT 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define EEPROM_CHECK_SUM 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #define FW_SIGNATURE 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #define MODEL_NUMB_0 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define MODEL_NUMB_2 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define MODEL_NUMB_4 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) #define SYSTEM_CONFIG 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #define SCSI_CONFIG 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define BIOS_CONFIG 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) #define SCAM_CONFIG 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #define ADAPTER_SCSI_ID 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #define IGNORE_B_SCAN 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define SEND_START_ENA 34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define DEVICE_ENABLE 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #define SYNC_RATE_TBL 38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) #define SYNC_RATE_TBL01 38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) #define SYNC_RATE_TBL23 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) #define SYNC_RATE_TBL45 42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) #define SYNC_RATE_TBL67 44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) #define SYNC_RATE_TBL89 46
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #define SYNC_RATE_TBLab 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #define SYNC_RATE_TBLcd 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) #define SYNC_RATE_TBLef 52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #define EE_SCAMBASE 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) #define SCAM_ENABLED BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) #define SCAM_LEVEL2 BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #define RENEGO_ENA BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) #define CONNIO_ENA BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) #define GREEN_PC_ENA BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) #define AUTO_RATE_00 00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) #define AUTO_RATE_05 01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) #define AUTO_RATE_10 02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) #define AUTO_RATE_20 03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #define WIDE_NEGO_BIT BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #define DISC_ENABLE_BIT BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #define hp_vendor_id_0 0x00 /* LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #define ORION_VEND_0 0x4B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) #define hp_vendor_id_1 0x01 /* MSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) #define ORION_VEND_1 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) #define hp_device_id_0 0x02 /* LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) #define ORION_DEV_0 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) #define hp_device_id_1 0x03 /* MSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) #define ORION_DEV_1 0x81
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) /* Sub Vendor ID and Sub Device ID only available in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) Harpoon Version 2 and higher */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) #define hp_sub_device_id_0 0x06 /* LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) #define hp_semaphore 0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) #define SCCB_MGR_ACTIVE BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) #define TICKLE_ME BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) #define SCCB_MGR_PRESENT BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) #define BIOS_IN_USE BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) #define hp_sys_ctrl 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) #define STOP_CLK BIT(0) /*Turn off BusMaster Clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) #define DRVR_RST BIT(1) /*Firmware Reset to 80C15 chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) #define HALT_MACH BIT(3) /*Halt State Machine */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #define HARD_ABORT BIT(4) /*Hard Abort */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) #define hp_host_blk_cnt 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #define XFER_BLK64 0x06 /* 1 1 0 64 byte per block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) #define BM_THRESHOLD 0x40 /* PCI mode can only xfer 16 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) #define hp_int_mask 0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) #define INT_CMD_COMPL BIT(0) /* DMA command complete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) #define INT_EXT_STATUS BIT(1) /* Extended Status Set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) #define hp_xfer_cnt_lo 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) #define hp_xfer_cnt_hi 0x1A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) #define hp_xfer_cmd 0x1B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) #define XFER_HOST_DMA 0x00 /* 0 0 0 Transfer Host -> DMA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) #define XFER_DMA_HOST 0x01 /* 0 0 1 Transfer DMA -> Host */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) #define XFER_HOST_AUTO 0x00 /* 0 0 Auto Transfer Size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) #define XFER_DMA_8BIT 0x20 /* 0 1 8 BIT Transfer Size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) #define DISABLE_INT BIT(7) /*Do not interrupt at end of cmd. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) #define HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) #define HOST_RD_CMD ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) #define hp_host_addr_lo 0x1C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) #define hp_host_addr_hmi 0x1E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) #define hp_ee_ctrl 0x22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) #define EXT_ARB_ACK BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) #define SCSI_TERM_ENA_H BIT(6) /* SCSI high byte terminator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) #define SEE_MS BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) #define SEE_CS BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) #define SEE_CLK BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) #define SEE_DO BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) #define SEE_DI BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) #define EE_READ 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) #define EE_WRITE 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) #define EWEN 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) #define EWEN_ADDR 0x03C0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) #define EWDS 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) #define EWDS_ADDR 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) #define hp_bm_ctrl 0x26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) #define SCSI_TERM_ENA_L BIT(0) /*Enable/Disable external terminators */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) #define FLUSH_XFER_CNTR BIT(1) /*Flush transfer counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) #define FORCE1_XFER BIT(5) /*Always xfer one byte in byte mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) #define FAST_SINGLE BIT(6) /*?? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) #define BMCTRL_DEFAULT (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) #define hp_sg_addr 0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) #define hp_page_ctrl 0x29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) #define SCATTER_EN BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) #define SGRAM_ARAM BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) #define G_INT_DISABLE BIT(3) /* Enable/Disable all Interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) #define NARROW_SCSI_CARD BIT(4) /* NARROW/WIDE SCSI config pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) #define hp_pci_stat_cfg 0x2D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) #define REC_MASTER_ABORT BIT(5) /*received Master abort */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) #define hp_rev_num 0x33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) #define hp_stack_data 0x34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) #define hp_stack_addr 0x35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) #define hp_ext_status 0x36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) #define BM_FORCE_OFF BIT(0) /*Bus Master is forced to get off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) #define PCI_TGT_ABORT BIT(0) /*PCI bus master transaction aborted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) #define PCI_DEV_TMOUT BIT(1) /*PCI Device Time out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) #define CMD_ABORTED BIT(4) /*Command aborted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) #define BM_PARITY_ERR BIT(5) /*parity error on data received */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) #define PIO_OVERRUN BIT(6) /*Slave data overrun */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) #define BM_CMD_BUSY BIT(7) /*Bus master transfer command busy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) #define BAD_EXT_STATUS (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) BM_PARITY_ERR | PIO_OVERRUN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) #define hp_int_status 0x37
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) #define EXT_STATUS_ON BIT(1) /*Extended status is valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) #define SCSI_INTERRUPT BIT(2) /*Global indication of a SCSI int. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) #define INT_ASSERTED BIT(5) /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) #define hp_fifo_cnt 0x38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) #define hp_intena 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) #define RESET BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) #define PROG_HLT BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) #define PARITY BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) #define FIFO BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) #define SEL BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) #define SCAM_SEL BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) #define RSEL BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) #define TIMEOUT BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) #define BUS_FREE BIT(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) #define XFER_CNT_0 BIT(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) #define PHASE BIT(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) #define IUNKWN BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) #define ICMD_COMP BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) #define ITICKLE BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) #define IDO_STRT BIT(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) #define ITAR_DISC BIT(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) #define AUTO_INT (BIT(12)+BIT(11)+BIT(10)+BIT(9)+BIT(8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) #define CLR_ALL_INT 0xFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) #define CLR_ALL_INT_1 0xFF00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) #define hp_intstat 0x42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) #define hp_scsisig 0x44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) #define SCSI_SEL BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) #define SCSI_BSY BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) #define SCSI_REQ BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) #define SCSI_ACK BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) #define SCSI_ATN BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) #define SCSI_CD BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) #define SCSI_MSG BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) #define SCSI_IOBIT BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) #define S_SCSI_PHZ (BIT(2)+BIT(1)+BIT(0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) #define S_MSGO_PH (BIT(2)+BIT(1) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) #define S_MSGI_PH (BIT(2)+BIT(1)+BIT(0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) #define S_DATAI_PH ( BIT(0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) #define S_DATAO_PH 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) #define S_ILL_PH ( BIT(1) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) #define hp_scsictrl_0 0x45
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) #define SEL_TAR BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) #define ENA_ATN BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) #define ENA_RESEL BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) #define SCSI_RST BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) #define ENA_SCAM_SEL BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) #define hp_portctrl_0 0x46
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) #define SCSI_PORT BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #define SCSI_INBIT BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) #define DMA_PORT BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) #define DMA_RD BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) #define HOST_PORT BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) #define HOST_WRT BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) #define SCSI_BUS_EN BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) #define START_TO BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) #define hp_scsireset 0x47
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) #define SCSI_INI BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) #define SCAM_EN BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) #define DMA_RESET BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) #define HPSCSI_RESET BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) #define PROG_RESET BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) #define FIFO_CLR BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) #define hp_xfercnt_0 0x48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) #define hp_xfercnt_2 0x4A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) #define hp_fifodata_0 0x4C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) #define hp_addstat 0x4E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) #define SCAM_TIMER BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) #define SCSI_MODE8 BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) #define SCSI_PAR_ERR BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) #define hp_prgmcnt_0 0x4F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) #define hp_selfid_0 0x50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) #define hp_selfid_1 0x51
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) #define hp_arb_id 0x52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) #define hp_select_id 0x53
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) #define hp_synctarg_base 0x54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) #define hp_synctarg_12 0x54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) #define hp_synctarg_13 0x55
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) #define hp_synctarg_14 0x56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) #define hp_synctarg_15 0x57
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) #define hp_synctarg_8 0x58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) #define hp_synctarg_9 0x59
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) #define hp_synctarg_10 0x5A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) #define hp_synctarg_11 0x5B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) #define hp_synctarg_4 0x5C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) #define hp_synctarg_5 0x5D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) #define hp_synctarg_6 0x5E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) #define hp_synctarg_7 0x5F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) #define hp_synctarg_0 0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) #define hp_synctarg_1 0x61
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) #define hp_synctarg_2 0x62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) #define hp_synctarg_3 0x63
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) #define NARROW_SCSI BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) #define DEFAULT_OFFSET 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) #define hp_autostart_0 0x64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) #define hp_autostart_1 0x65
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) #define hp_autostart_3 0x67
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) #define AUTO_IMMED BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) #define SELECT BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) #define END_DATA (BIT(7)+BIT(6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) #define hp_gp_reg_0 0x68
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) #define hp_gp_reg_1 0x69
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) #define hp_gp_reg_3 0x6B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) #define hp_seltimeout 0x6C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) #define TO_4ms 0x67 /* 3.9959ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) #define TO_5ms 0x03 /* 4.9152ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) #define TO_10ms 0x07 /* 11.xxxms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) #define TO_250ms 0x99 /* 250.68ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) #define TO_290ms 0xB1 /* 289.99ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) #define hp_clkctrl_0 0x6D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) #define PWR_DWN BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) #define ACTdeassert BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) #define CLK_40MHZ (BIT(1) + BIT(0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) #define CLKCTRL_DEFAULT (ACTdeassert | CLK_40MHZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) #define hp_fiforead 0x6E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) #define hp_fifowrite 0x6F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) #define hp_offsetctr 0x70
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) #define hp_xferstat 0x71
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) #define FIFO_EMPTY BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) #define hp_portctrl_1 0x72
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) #define CHK_SCSI_P BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) #define HOST_MODE8 BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) #define hp_xfer_pad 0x73
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) #define ID_UNLOCK BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) #define hp_scsidata_0 0x74
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) #define hp_scsidata_1 0x75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) #define hp_aramBase 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) #define BIOS_DATA_OFFSET 0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) #define BIOS_RELATIVE_CARD 0x64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) #define AR3 (BIT(9) + BIT(8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) #define SDATA BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) #define CRD_OP BIT(11) /* Cmp Reg. w/ Data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) #define CRR_OP BIT(12) /* Cmp Reg. w. Reg. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) #define CPE_OP (BIT(14)+BIT(11)) /* Cmp SCSI phs & Branch EQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) #define CPN_OP (BIT(14)+BIT(12)) /* Cmp SCSI phs & Branch NOT EQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) #define ADATA_OUT 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) #define ADATA_IN BIT(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) #define ACOMMAND BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) #define ASTATUS (BIT(10)+BIT(8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) #define AMSG_OUT (BIT(10)+BIT(9))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) #define AMSG_IN (BIT(10)+BIT(9)+BIT(8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) #define BRH_OP BIT(13) /* Branch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) #define ALWAYS 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) #define EQUAL BIT(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) #define NOT_EQ BIT(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) #define TCB_OP (BIT(13)+BIT(11)) /* Test condition & branch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) #define FIFO_0 BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) #define MPM_OP BIT(15) /* Match phase and move data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) #define MRR_OP BIT(14) /* Move DReg. to Reg. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) #define S_IDREG (BIT(2)+BIT(1)+BIT(0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) #define D_AR0 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) #define D_AR1 BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) #define D_BUCKET (BIT(2) + BIT(1) + BIT(0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) #define RAT_OP (BIT(14)+BIT(13)+BIT(11))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) #define SSI_OP (BIT(15)+BIT(11))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) #define SSI_ITAR_DISC (ITAR_DISC >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) #define SSI_IDO_STRT (IDO_STRT >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) #define SSI_ICMD_COMP (ICMD_COMP >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) #define SSI_ITICKLE (ITICKLE >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) #define SSI_IUNKWN (IUNKWN >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) #define SSI_INO_CC (IUNKWN >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) #define SSI_IRFAIL (IUNKWN >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) #define NP 0x10 /*Next Phase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) #define NTCMD 0x02 /*Non- Tagged Command start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) #define CMDPZ 0x04 /*Command phase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) #define DINT 0x12 /*Data Out/In interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) #define DI 0x13 /*Data Out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) #define DC 0x19 /*Disconnect Message */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) #define ST 0x1D /*Status Phase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) #define UNKNWN 0x24 /*Unknown bus action */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) #define CC 0x25 /*Command Completion failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) #define TICK 0x26 /*New target reselected us. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) #define SELCHK 0x28 /*Select & Check SCSI ID latch reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) #define ID_MSG_STRT hp_aramBase + 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) #define NON_TAG_ID_MSG hp_aramBase + 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) #define CMD_STRT hp_aramBase + 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) #define SYNC_MSGS hp_aramBase + 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) #define TAG_STRT 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) #define DISCONNECT_START 0x10/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) #define END_DATA_START 0x14/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) #define CMD_ONLY_STRT CMDPZ/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) #define SELCHK_STRT SELCHK/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) #define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) /* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) xfercnt <<= 16,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) xfercnt |= RDW_HARPOON((unsigned short)(port+hp_xfercnt_0)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (unsigned short)(addr & 0x0000FFFFL)),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) addr >>= 16,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) WRW_HARPOON((port+hp_host_addr_hmi), (unsigned short)(addr & 0x0000FFFFL)),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) WR_HARP32(port,hp_xfercnt_0,count),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) WRW_HARPOON((port+hp_xfer_cnt_lo), (unsigned short)(count & 0x0000FFFFL)),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) count >>= 16,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) #define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) #define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) #define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) WR_HARPOON(port+hp_scsireset, 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) #define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) #define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) #define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) #define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) static unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) unsigned char syncFlag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) static void FPT_ssel(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) static void FPT_sres(u32 port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) struct sccb_card *pCurrCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) static void FPT_shandem(u32 port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) struct sccb *pCurrSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) static void FPT_stsyncn(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) static void FPT_sisyncr(u32 port, unsigned char sync_pulse,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) unsigned char offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) static void FPT_sssyncv(u32 p_port, unsigned char p_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) unsigned char p_sync_value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) struct sccb_mgr_tar_info *currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) static void FPT_sresb(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) static void FPT_sxfrp(u32 p_port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) static void FPT_schkdd(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) static unsigned char FPT_RdStack(u32 port, unsigned char index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) static void FPT_WrStack(u32 portBase, unsigned char index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) unsigned char data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) static unsigned char FPT_ChkIfChipInitialized(u32 ioPort);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) static void FPT_SendMsg(u32 port, unsigned char message);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) unsigned char error_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) static void FPT_RNVRamData(struct nvram_info *pNvRamInfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) static unsigned char FPT_siwidn(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) static void FPT_stwidn(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) static void FPT_siwidr(u32 port, unsigned char width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) static void FPT_queueSelectFail(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) static void FPT_queueDisconnect(struct sccb *p_SCCB, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) static void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) struct sccb *p_SCCB, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) static void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) static void FPT_utilUpdateResidual(struct sccb *p_SCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) static unsigned short FPT_CalcCrc16(unsigned char buffer[]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) static unsigned char FPT_CalcLrc(unsigned char buffer[]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) static void FPT_Wait1Second(u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) static void FPT_Wait(u32 p_port, unsigned char p_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) static void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) static void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) unsigned short ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) static unsigned short FPT_utilEERead(u32 p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) unsigned short ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) static unsigned short FPT_utilEEReadOrg(u32 p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) unsigned short ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) static void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) unsigned short ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) static void FPT_phaseDataOut(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) static void FPT_phaseDataIn(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) static void FPT_phaseCommand(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) static void FPT_phaseStatus(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) static void FPT_phaseMsgOut(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) static void FPT_phaseMsgIn(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) static void FPT_phaseIllegal(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) static void FPT_phaseDecode(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) static void FPT_phaseChkFifo(u32 port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) static void FPT_phaseBusFree(u32 p_port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) static void FPT_XbowInit(u32 port, unsigned char scamFlg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) static void FPT_BusMasterInit(u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) static void FPT_DiagEEPROM(u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) static void FPT_dataXferProcessor(u32 port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) struct sccb_card *pCurrCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) static void FPT_busMstrSGDataXferStart(u32 port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct sccb *pCurrSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) static void FPT_busMstrDataXferStart(u32 port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) struct sccb *pCurrSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) static void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) struct sccb *pCurrSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) static void FPT_hostDataXferRestart(struct sccb *currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) static unsigned char FPT_SccbMgr_bad_isr(u32 p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) unsigned short p_int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) static void FPT_SccbMgrTableInitAll(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) static void FPT_SccbMgrTableInitTarget(unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) unsigned char target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) static void FPT_scini(unsigned char p_card, unsigned char p_our_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) unsigned char p_power_up);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) static int FPT_scarb(u32 p_port, unsigned char p_sel_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) static void FPT_scbusf(u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) static void FPT_scsel(u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) static void FPT_scasid(unsigned char p_card, u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) static unsigned char FPT_scxferc(u32 p_port, unsigned char p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) static unsigned char FPT_scsendi(u32 p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) unsigned char p_id_string[]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) static unsigned char FPT_sciso(u32 p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) unsigned char p_id_string[]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) static void FPT_scwirod(u32 p_port, unsigned char p_data_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) static void FPT_scwiros(u32 p_port, unsigned char p_data_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) static unsigned char FPT_scvalq(unsigned char p_quintet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) static unsigned char FPT_scsell(u32 p_port, unsigned char targ_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) static void FPT_scwtsel(u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) static void FPT_inisci(unsigned char p_card, u32 p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) unsigned char p_our_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) static void FPT_scsavdi(unsigned char p_card, u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) static unsigned char FPT_scmachid(unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) unsigned char p_id_string[]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) static void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) static void FPT_autoLoadDefaultMap(u32 p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) static struct sccb_mgr_tar_info FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) { {{0}} };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) static struct sccb_card FPT_BL_Card[MAX_CARDS] = { {0} };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) static SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { {{0}} };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) static struct nvram_info FPT_nvRamInfo[MAX_MB_CARDS] = { {0} };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) static unsigned char FPT_mbCards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) static unsigned char FPT_scamHAString[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) { 0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) ' ', 'B', 'T', '-', '9', '3', '0',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) static unsigned short FPT_default_intena = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) static void (*FPT_s_PhaseTbl[8]) (u32, unsigned char) = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) 0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * Function: FlashPoint_ProbeHostAdapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) * Description: Setup and/or Search for cards and return info to caller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) static unsigned char first_time = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) unsigned char i, j, id, ScamFlg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) unsigned short temp, temp2, temp3, temp4, temp5, temp6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) u32 ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) struct nvram_info *pCurrNvRam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) ioport = pCardInfo->si_baseaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) if (RD_HARPOON(ioport + hp_vendor_id_0) != ORION_VEND_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) return (int)FAILURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) if ((RD_HARPOON(ioport + hp_vendor_id_1) != ORION_VEND_1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) return (int)FAILURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) if ((RD_HARPOON(ioport + hp_device_id_0) != ORION_DEV_0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) return (int)FAILURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if ((RD_HARPOON(ioport + hp_device_id_1) != ORION_DEV_1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) return (int)FAILURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) if (RD_HARPOON(ioport + hp_rev_num) != 0x0f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) /* For new Harpoon then check for sub_device ID LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) the bits(0-3) must be all ZERO for compatible with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) current version of SCCBMgr, else skip this Harpoon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) device. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) if (RD_HARPOON(ioport + hp_sub_device_id_0) & 0x0f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) return (int)FAILURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) if (first_time) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) FPT_SccbMgrTableInitAll();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) first_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) FPT_mbCards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) if (FPT_RdStack(ioport, 0) != 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (FPT_ChkIfChipInitialized(ioport) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) pCurrNvRam = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) WR_HARPOON(ioport + hp_semaphore, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) FPT_XbowInit(ioport, 0); /*Must Init the SCSI before attempting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) FPT_DiagEEPROM(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) if (FPT_mbCards < MAX_MB_CARDS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) pCurrNvRam = &FPT_nvRamInfo[FPT_mbCards];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) FPT_mbCards++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) pCurrNvRam->niBaseAddr = ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) FPT_RNVRamData(pCurrNvRam);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) return (int)FAILURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) pCurrNvRam = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (pCurrNvRam)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) pCardInfo->si_id = pCurrNvRam->niAdapId;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) pCardInfo->si_id =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) char)(FPT_utilEERead(ioport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) (ADAPTER_SCSI_ID /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 2)) & (unsigned char)0x0FF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) pCardInfo->si_lun = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) pCardInfo->si_fw_revision = ORION_FW_REV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) temp2 = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) temp3 = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) temp4 = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) temp5 = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) temp6 = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) for (id = 0; id < (16 / 2); id++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) temp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) FPT_utilEERead(ioport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) (unsigned short)((SYNC_RATE_TBL / 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) + id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) for (i = 0; i < 2; temp >>= 8, i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) temp2 >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) temp3 >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) temp4 >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) temp5 >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) temp6 >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) switch (temp & 0x3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) case AUTO_RATE_20: /* Synchronous, 20 mega-transfers/second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) temp6 |= 0x8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) case AUTO_RATE_10: /* Synchronous, 10 mega-transfers/second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) temp5 |= 0x8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) case AUTO_RATE_05: /* Synchronous, 5 mega-transfers/second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) temp2 |= 0x8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) case AUTO_RATE_00: /* Asynchronous */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) if (temp & DISC_ENABLE_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) temp3 |= 0x8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (temp & WIDE_NEGO_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) temp4 |= 0x8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) pCardInfo->si_per_targ_init_sync = temp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) pCardInfo->si_per_targ_no_disc = temp3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) pCardInfo->si_per_targ_wide_nego = temp4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) pCardInfo->si_per_targ_fast_nego = temp5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) pCardInfo->si_per_targ_ultra_nego = temp6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) if (pCurrNvRam)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) i = pCurrNvRam->niSysConf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) i = (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) char)(FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) if (pCurrNvRam)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) ScamFlg = pCurrNvRam->niScamConf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) ScamFlg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) pCardInfo->si_mflags = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) if (i & 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) pCardInfo->si_mflags |= SCSI_PARITY_ENA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) if (!(i & 0x02))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) pCardInfo->si_mflags |= SOFT_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) if (i & 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) pCardInfo->si_mflags |= EXTENDED_TRANSLATION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) if (ScamFlg & SCAM_ENABLED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) pCardInfo->si_mflags |= FLAG_SCAM_ENABLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) if (ScamFlg & SCAM_LEVEL2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) pCardInfo->si_mflags |= FLAG_SCAM_LEVEL2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) if (i & 0x04) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) j |= SCSI_TERM_ENA_L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) WR_HARPOON(ioport + hp_bm_ctrl, j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) if (i & 0x08) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) j |= SCSI_TERM_ENA_H;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) WR_HARPOON(ioport + hp_ee_ctrl, j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) pCardInfo->si_mflags |= SUPPORT_16TAR_32LUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) pCardInfo->si_card_family = HARPOON_FAMILY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) pCardInfo->si_bustype = BUSTYPE_PCI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) pCardInfo->si_card_model[0] = '9';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) switch (pCurrNvRam->niModel & 0x0f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) case MODEL_LT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) pCardInfo->si_card_model[1] = '3';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) pCardInfo->si_card_model[2] = '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) case MODEL_LW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) pCardInfo->si_card_model[1] = '5';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) pCardInfo->si_card_model[2] = '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) case MODEL_DL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) pCardInfo->si_card_model[1] = '3';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) pCardInfo->si_card_model[2] = '2';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) case MODEL_DW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) pCardInfo->si_card_model[1] = '5';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) pCardInfo->si_card_model[2] = '2';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) temp = FPT_utilEERead(ioport, (MODEL_NUMB_0 / 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) pCardInfo->si_card_model[0] = (unsigned char)(temp >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) temp = FPT_utilEERead(ioport, (MODEL_NUMB_2 / 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) pCardInfo->si_card_model[1] = (unsigned char)(temp & 0x00FF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) pCardInfo->si_card_model[2] = (unsigned char)(temp >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) if (pCardInfo->si_card_model[1] == '3') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) pCardInfo->si_mflags |= LOW_BYTE_TERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) } else if (pCardInfo->si_card_model[2] == '0') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) temp = RD_HARPOON(ioport + hp_xfer_pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) pCardInfo->si_mflags |= LOW_BYTE_TERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) pCardInfo->si_mflags |= HIGH_BYTE_TERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) WR_HARPOON(ioport + hp_xfer_pad, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) temp = RD_HARPOON(ioport + hp_ee_ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) temp2 = RD_HARPOON(ioport + hp_xfer_pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) WR_HARPOON(ioport + hp_ee_ctrl, (temp | SEE_CS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) temp3 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) for (i = 0; i < 8; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) temp3 <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) if (!(RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) temp3 |= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) WR_HARPOON(ioport + hp_xfer_pad, (temp2 & ~BIT(4)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) WR_HARPOON(ioport + hp_ee_ctrl, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) WR_HARPOON(ioport + hp_xfer_pad, temp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) if (!(temp3 & BIT(7)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) pCardInfo->si_mflags |= LOW_BYTE_TERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) if (!(temp3 & BIT(6)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) pCardInfo->si_mflags |= HIGH_BYTE_TERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) ARAM_ACCESS(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) pCardInfo->si_XlatInfo[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) RD_HARPOON(ioport + hp_aramBase + BIOS_DATA_OFFSET + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) /* return with -1 if no sort, else return with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) logical card number sorted by BIOS (zero-based) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) pCardInfo->si_relative_cardnum =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) char)(RD_HARPOON(ioport + hp_aramBase + BIOS_RELATIVE_CARD) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) SGRAM_ACCESS(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) FPT_s_PhaseTbl[0] = FPT_phaseDataOut;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) FPT_s_PhaseTbl[1] = FPT_phaseDataIn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) FPT_s_PhaseTbl[2] = FPT_phaseIllegal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) FPT_s_PhaseTbl[3] = FPT_phaseIllegal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) FPT_s_PhaseTbl[4] = FPT_phaseCommand;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) FPT_s_PhaseTbl[5] = FPT_phaseStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) FPT_s_PhaseTbl[6] = FPT_phaseMsgOut;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) FPT_s_PhaseTbl[7] = FPT_phaseMsgIn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) pCardInfo->si_present = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) * Function: FlashPoint_HardwareResetHostAdapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * Description: Setup adapter for normal operation (hard reset).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) *pCardInfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) struct sccb_card *CurrCard = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) struct nvram_info *pCurrNvRam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) unsigned char i, j, thisCard, ScamFlg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) unsigned short temp, sync_bit_map, id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) u32 ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) ioport = pCardInfo->si_baseaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) for (thisCard = 0; thisCard <= MAX_CARDS; thisCard++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) if (thisCard == MAX_CARDS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) return (void *)FAILURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) if (FPT_BL_Card[thisCard].ioPort == ioport) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) CurrCard = &FPT_BL_Card[thisCard];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) FPT_SccbMgrTableInitCard(CurrCard, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) else if (FPT_BL_Card[thisCard].ioPort == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) FPT_BL_Card[thisCard].ioPort = ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) CurrCard = &FPT_BL_Card[thisCard];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) if (FPT_mbCards)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) for (i = 0; i < FPT_mbCards; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) if (CurrCard->ioPort ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) FPT_nvRamInfo[i].niBaseAddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) CurrCard->pNvRamInfo =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) &FPT_nvRamInfo[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) FPT_SccbMgrTableInitCard(CurrCard, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) CurrCard->cardIndex = thisCard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) CurrCard->cardInfo = pCardInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) pCurrNvRam = CurrCard->pNvRamInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) ScamFlg = pCurrNvRam->niScamConf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) ScamFlg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) FPT_BusMasterInit(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) FPT_XbowInit(ioport, ScamFlg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) FPT_autoLoadDefaultMap(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) for (i = 0, id = 0x01; i != pCardInfo->si_id; i++, id <<= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) WR_HARPOON(ioport + hp_selfid_0, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) WR_HARPOON(ioport + hp_selfid_1, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) CurrCard->ourId = pCardInfo->si_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) i = (unsigned char)pCardInfo->si_mflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (i & SCSI_PARITY_ENA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) if (i & LOW_BYTE_TERM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) j |= SCSI_TERM_ENA_L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) WR_HARPOON(ioport + hp_bm_ctrl, j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (i & HIGH_BYTE_TERM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) j |= SCSI_TERM_ENA_H;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) WR_HARPOON(ioport + hp_ee_ctrl, j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) if (!(pCardInfo->si_mflags & SOFT_RESET)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) FPT_sresb(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) FPT_scini(thisCard, pCardInfo->si_id, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) if (pCardInfo->si_mflags & POST_ALL_UNDERRRUNS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) CurrCard->globalFlags |= F_NO_FILTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) if (pCurrNvRam->niSysConf & 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) CurrCard->globalFlags |= F_GREEN_PC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) if (FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)) & GREEN_PC_ENA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) CurrCard->globalFlags |= F_GREEN_PC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) /* Set global flag to indicate Re-Negotiation to be done on all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) ckeck condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) if (pCurrNvRam->niScsiConf & 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) CurrCard->globalFlags |= F_DO_RENEGO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & RENEGO_ENA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) CurrCard->globalFlags |= F_DO_RENEGO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) if (pCurrNvRam->niScsiConf & 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) CurrCard->globalFlags |= F_CONLUN_IO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & CONNIO_ENA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) CurrCard->globalFlags |= F_CONLUN_IO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) temp = pCardInfo->si_per_targ_no_disc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) for (i = 0, id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) if (temp & id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) sync_bit_map = 0x0001;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) for (id = 0; id < (MAX_SCSI_TAR / 2); id++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) temp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) FPT_utilEERead(ioport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) (unsigned short)((SYNC_RATE_TBL / 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) + id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) for (i = 0; i < 2; temp >>= 8, i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) FPT_sccbMgrTbl[thisCard][id * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) i].TarEEValue =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) (unsigned char)temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) FPT_sccbMgrTbl[thisCard][id * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) i].TarStatus |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) SYNC_SUPPORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) FPT_sccbMgrTbl[thisCard][id * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) i].TarEEValue =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) (unsigned char)(temp & ~EE_SYNC_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /* if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) (id*2+i >= 8)){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) if (pCardInfo->si_per_targ_wide_nego & sync_bit_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) FPT_sccbMgrTbl[thisCard][id * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) i].TarEEValue |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) EE_WIDE_SCSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) else { /* NARROW SCSI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) FPT_sccbMgrTbl[thisCard][id * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) i].TarStatus |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) WIDE_NEGOCIATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) sync_bit_map <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) WR_HARPOON((ioport + hp_semaphore),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) (unsigned char)(RD_HARPOON((ioport + hp_semaphore)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) SCCB_MGR_PRESENT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) return (void *)CurrCard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) static void FlashPoint_ReleaseHostAdapter(void *pCurrCard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) u32 portBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) u32 regOffset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) u32 scamData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) u32 *pScamTbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) struct nvram_info *pCurrNvRam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) pCurrNvRam = ((struct sccb_card *)pCurrCard)->pNvRamInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) for (i = 0; i < MAX_SCSI_TAR / 2; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) FPT_WrStack(pCurrNvRam->niBaseAddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) (unsigned char)(i + 5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) pCurrNvRam->niSyncTbl[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) portBase = pCurrNvRam->niBaseAddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) for (i = 0; i < MAX_SCSI_TAR; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) regOffset = hp_aramBase + 64 + i * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) pScamTbl = (u32 *)&pCurrNvRam->niScamTbl[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) scamData = *pScamTbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) WR_HARP32(portBase, regOffset, scamData);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) FPT_WrStack(((struct sccb_card *)pCurrCard)->ioPort, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) static void FPT_RNVRamData(struct nvram_info *pNvRamInfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) u32 portBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) u32 regOffset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) u32 scamData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) u32 *pScamTbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) for (i = 0; i < MAX_SCSI_TAR / 2; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) pNvRamInfo->niSyncTbl[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) FPT_RdStack(pNvRamInfo->niBaseAddr, (unsigned char)(i + 5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) portBase = pNvRamInfo->niBaseAddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) for (i = 0; i < MAX_SCSI_TAR; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) regOffset = hp_aramBase + 64 + i * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) RD_HARP32(portBase, regOffset, scamData);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) pScamTbl = (u32 *)&pNvRamInfo->niScamTbl[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) *pScamTbl = scamData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) static unsigned char FPT_RdStack(u32 portBase, unsigned char index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) WR_HARPOON(portBase + hp_stack_addr, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) return RD_HARPOON(portBase + hp_stack_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) static void FPT_WrStack(u32 portBase, unsigned char index, unsigned char data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) WR_HARPOON(portBase + hp_stack_addr, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) WR_HARPOON(portBase + hp_stack_data, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) static unsigned char FPT_ChkIfChipInitialized(u32 ioPort)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) if ((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if ((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) != CLKCTRL_DEFAULT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) if ((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) * Function: FlashPoint_StartCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) * Description: Start a command pointed to by p_Sccb. When the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) * command is completed it will be returned via the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) * callback function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) static void FlashPoint_StartCCB(void *curr_card, struct sccb *p_Sccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) u32 ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) unsigned char thisCard, lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) struct sccb *pSaveSccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) CALL_BK_FN callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) struct sccb_card *pCurrCard = curr_card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) thisCard = pCurrCard->cardIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) ioport = pCurrCard->ioPort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) if ((p_Sccb->TargID >= MAX_SCSI_TAR) || (p_Sccb->Lun >= MAX_LUN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) p_Sccb->HostStatus = SCCB_COMPLETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) p_Sccb->SccbStatus = SCCB_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) callback = (CALL_BK_FN) p_Sccb->SccbCallback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) if (callback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) callback(p_Sccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) FPT_sinits(p_Sccb, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) if (!pCurrCard->cmdCounter) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) WR_HARPOON(ioport + hp_semaphore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) (RD_HARPOON(ioport + hp_semaphore)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) | SCCB_MGR_ACTIVE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) if (pCurrCard->globalFlags & F_GREEN_PC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) pCurrCard->cmdCounter++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) if (RD_HARPOON(ioport + hp_semaphore) & BIOS_IN_USE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) WR_HARPOON(ioport + hp_semaphore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) (RD_HARPOON(ioport + hp_semaphore)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) | TICKLE_ME));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) if (p_Sccb->OperationCode == RESET_COMMAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) pSaveSccb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) pCurrCard->currentSCCB = p_Sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) pSaveSccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) FPT_queueAddSccb(p_Sccb, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) else if ((RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) if (p_Sccb->OperationCode == RESET_COMMAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) pSaveSccb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) pCurrCard->currentSCCB = p_Sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) pSaveSccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) FPT_queueAddSccb(p_Sccb, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) MDISABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) lun = p_Sccb->Lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) lun = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) if ((pCurrCard->currentSCCB == NULL) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) && (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) pCurrCard->currentSCCB = p_Sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) FPT_ssel(p_Sccb->SccbIOPort, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) if (p_Sccb->OperationCode == RESET_COMMAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) pSaveSccb = pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) pCurrCard->currentSCCB = p_Sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) FPT_queueSelectFail(&FPT_BL_Card[thisCard],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) pCurrCard->currentSCCB = pSaveSccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) FPT_queueAddSccb(p_Sccb, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) MENABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) * Function: FlashPoint_AbortCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) * Description: Abort the command pointed to by p_Sccb. When the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) * command is completed it will be returned via the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) * callback function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) static int FlashPoint_AbortCCB(void *pCurrCard, struct sccb *p_Sccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) u32 ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) unsigned char thisCard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) CALL_BK_FN callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) unsigned char TID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) struct sccb *pSaveSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) ioport = ((struct sccb_card *)pCurrCard)->ioPort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) thisCard = ((struct sccb_card *)pCurrCard)->cardIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) if (!(RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) if (FPT_queueFindSccb(p_Sccb, thisCard)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) ((struct sccb_card *)pCurrCard)->cmdCounter--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) if (!((struct sccb_card *)pCurrCard)->cmdCounter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) WR_HARPOON(ioport + hp_semaphore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) (RD_HARPOON(ioport + hp_semaphore)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) & (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) char)(~(SCCB_MGR_ACTIVE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) TICKLE_ME))));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) p_Sccb->SccbStatus = SCCB_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) callback = p_Sccb->SccbCallback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) callback(p_Sccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) if (((struct sccb_card *)pCurrCard)->currentSCCB ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) p_Sccb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) p_Sccb->SccbStatus = SCCB_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) TID = p_Sccb->TargID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) if (p_Sccb->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) MDISABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) if (((struct sccb_card *)pCurrCard)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) discQ_Tbl[p_Sccb->Sccb_tag] ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) p_Sccb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) p_Sccb->SccbStatus = SCCB_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) p_Sccb->Sccb_scsistat =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) ABORT_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) p_Sccb->Sccb_scsimsg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) SMABORT_TAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) if (((struct sccb_card *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) pCurrCard)->currentSCCB ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) ((struct sccb_card *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) pCurrCard)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) currentSCCB = p_Sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) FPT_ssel(ioport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) pSaveSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) ((struct sccb_card
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) *)pCurrCard)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) ((struct sccb_card *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) pCurrCard)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) currentSCCB = p_Sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) FPT_queueSelectFail((struct sccb_card *)pCurrCard, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) ((struct sccb_card *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) pCurrCard)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) currentSCCB = pSaveSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) MENABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) currTar_Info =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) &FPT_sccbMgrTbl[thisCard][p_Sccb->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) if (FPT_BL_Card[thisCard].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) discQ_Tbl[currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) LunDiscQ_Idx[p_Sccb->Lun]]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) == p_Sccb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) p_Sccb->SccbStatus = SCCB_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) * Function: FlashPoint_InterruptPending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) * Description: Do a quick check to determine if there is a pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) * interrupt for this card and disable the IRQ Pin if so.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) static unsigned char FlashPoint_InterruptPending(void *pCurrCard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) u32 ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) ioport = ((struct sccb_card *)pCurrCard)->ioPort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) if (RD_HARPOON(ioport + hp_int_status) & INT_ASSERTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) * Function: FlashPoint_HandleInterrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) * Description: This is our entry point when an interrupt is generated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) * by the card and the upper level driver passes it on to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) * us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) static int FlashPoint_HandleInterrupt(void *pcard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) unsigned char thisCard, result, bm_status, bm_int_st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) unsigned short hp_int;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) unsigned char i, target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) struct sccb_card *pCurrCard = pcard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) u32 ioport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) thisCard = pCurrCard->cardIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) ioport = pCurrCard->ioPort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) MDISABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) if ((bm_int_st = RD_HARPOON(ioport + hp_int_status)) & EXT_STATUS_ON)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) bm_status = RD_HARPOON(ioport + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) (unsigned char)BAD_EXT_STATUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) bm_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) WR_HARPOON(ioport + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) while ((hp_int = RDW_HARPOON((ioport + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) FPT_default_intena) | bm_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) currSCCB = pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) result =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) FPT_SccbMgr_bad_isr(ioport, thisCard, pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) hp_int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) WRW_HARPOON((ioport + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) (FIFO | TIMEOUT | RESET | SCAM_SEL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) bm_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) if (result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) MENABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) else if (hp_int & ICMD_COMP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) if (!(hp_int & BUS_FREE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) /* Wait for the BusFree before starting a new command. We
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) must also check for being reselected since the BusFree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) may not show up if another device reselects us in 1.5us or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) less. SRR Wednesday, 3/8/1995.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) while (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) (RDW_HARPOON((ioport + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) (BUS_FREE | RSEL))) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) FPT_phaseChkFifo(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) /* WRW_HARPOON((ioport+hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) WRW_HARPOON((ioport + hp_intstat), CLR_ALL_INT_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) FPT_autoCmdCmplt(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) else if (hp_int & ITAR_DISC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) FPT_phaseChkFifo(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) if (RD_HARPOON(ioport + hp_gp_reg_1) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) SMSAVE_DATA_PTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) currSCCB->Sccb_XferState |= F_NO_DATA_YET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) currSCCB->Sccb_scsistat = DISCONNECT_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) FPT_queueDisconnect(currSCCB, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) /* Wait for the BusFree before starting a new command. We
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) must also check for being reselected since the BusFree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) may not show up if another device reselects us in 1.5us or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) less. SRR Wednesday, 3/8/1995.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) while (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) (RDW_HARPOON((ioport + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) (BUS_FREE | RSEL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) && !((RDW_HARPOON((ioport + hp_intstat)) & PHASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) && RD_HARPOON((ioport + hp_scsisig)) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) SCSI_IOBIT))) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) The additional loop exit condition above detects a timing problem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) with the revision D/E harpoon chips. The caller should reset the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) host adapter to recover when 0xFE is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) if (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) (RDW_HARPOON((ioport + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) (BUS_FREE | RSEL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) MENABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) return 0xFE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) WRW_HARPOON((ioport + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) (BUS_FREE | ITAR_DISC));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) else if (hp_int & RSEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) WRW_HARPOON((ioport + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) (PROG_HLT | RSEL | PHASE | BUS_FREE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) if (RDW_HARPOON((ioport + hp_intstat)) & ITAR_DISC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) FPT_phaseChkFifo(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) if (RD_HARPOON(ioport + hp_gp_reg_1) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) SMSAVE_DATA_PTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) currSCCB->Sccb_XferState |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) F_NO_DATA_YET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) currSCCB->Sccb_savedATC =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) currSCCB->Sccb_ATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) WRW_HARPOON((ioport + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) (BUS_FREE | ITAR_DISC));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) currSCCB->Sccb_scsistat = DISCONNECT_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) FPT_queueDisconnect(currSCCB, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) FPT_sres(ioport, thisCard, pCurrCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) FPT_phaseDecode(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) WRW_HARPOON((ioport + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) (IDO_STRT | XFER_CNT_0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) FPT_phaseDecode(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) else if ((hp_int & IUNKWN) || (hp_int & PROG_HLT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) WRW_HARPOON((ioport + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) (PHASE | IUNKWN | PROG_HLT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) if ((RD_HARPOON(ioport + hp_prgmcnt_0) & (unsigned char)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) 0x3f) < (unsigned char)SELCHK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) FPT_phaseDecode(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) /* Harpoon problem some SCSI target device respond to selection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) with short BUSY pulse (<400ns) this will make the Harpoon is not able
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) to latch the correct Target ID into reg. x53.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) The work around require to correct this reg. But when write to this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) need to read this reg first then restore it later. After update to 0x53 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) i = (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) char)(RD_HARPOON(ioport + hp_fifowrite));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) target =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) char)(RD_HARPOON(ioport + hp_gp_reg_3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) WR_HARPOON(ioport + hp_xfer_pad,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) (unsigned char)ID_UNLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) WR_HARPOON(ioport + hp_select_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) (unsigned char)(target | target <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) WR_HARPOON(ioport + hp_xfer_pad,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) (unsigned char)0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) WR_HARPOON(ioport + hp_fifowrite, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) WR_HARPOON(ioport + hp_autostart_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) (AUTO_IMMED + TAG_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) else if (hp_int & XFER_CNT_0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) WRW_HARPOON((ioport + hp_intstat), XFER_CNT_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) FPT_schkdd(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) else if (hp_int & BUS_FREE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) WRW_HARPOON((ioport + hp_intstat), BUS_FREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) FPT_hostDataXferAbort(ioport, thisCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) FPT_phaseBusFree(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) else if (hp_int & ITICKLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) WRW_HARPOON((ioport + hp_intstat), ITICKLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) if (((struct sccb_card *)pCurrCard)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) globalFlags & F_NEW_SCCB_CMD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) if (pCurrCard->currentSCCB == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) FPT_queueSearchSelect(pCurrCard, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) FPT_ssel(ioport, thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) } /*end while */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) MENABLE_INT(ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) * Function: Sccb_bad_isr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) * Description: Some type of interrupt has occurred which is slightly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) * out of the ordinary. We will now decode it fully, in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) * this routine. This is broken up in an attempt to save
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) * processing time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) static unsigned char FPT_SccbMgr_bad_isr(u32 p_port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) unsigned short p_int)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) unsigned char temp, ScamFlg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) struct nvram_info *pCurrNvRam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) if (RD_HARPOON(p_port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) FPT_hostDataXferAbort(p_port, p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) pCurrCard->currentSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) if (RD_HARPOON(p_port + hp_pci_stat_cfg) & REC_MASTER_ABORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) WR_HARPOON(p_port + hp_pci_stat_cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) (RD_HARPOON(p_port + hp_pci_stat_cfg) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) ~REC_MASTER_ABORT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) WR_HARPOON(p_port + hp_host_blk_cnt, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) if (!pCurrCard->currentSCCB->HostStatus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) pCurrCard->currentSCCB->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) FPT_sxfrp(p_port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) temp = (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) (EXT_ARB_ACK | SCSI_TERM_ENA_H));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) WR_HARPOON(p_port + hp_ee_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) ((unsigned char)temp | SEE_MS | SEE_CS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) WR_HARPOON(p_port + hp_ee_ctrl, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) if (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) (RDW_HARPOON((p_port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) (BUS_FREE | RESET))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) FPT_phaseDecode(p_port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) else if (p_int & RESET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) FPT_hostDataXferAbort(p_port, p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) pCurrCard->currentSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) DISABLE_AUTO(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) FPT_sresb(p_port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) while (RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) pCurrNvRam = pCurrCard->pNvRamInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) ScamFlg = pCurrNvRam->niScamConf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) ScamFlg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) (unsigned char)FPT_utilEERead(p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) SCAM_CONFIG / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) FPT_XbowInit(p_port, ScamFlg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) FPT_scini(p_card, pCurrCard->ourId, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) return 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) else if (p_int & FIFO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) WRW_HARPOON((p_port + hp_intstat), FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) if (pCurrCard->currentSCCB != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) FPT_sxfrp(p_port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) else if (p_int & TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) DISABLE_AUTO(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) WRW_HARPOON((p_port + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) (PROG_HLT | TIMEOUT | SEL | BUS_FREE | PHASE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) IUNKWN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) currTar_Info =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) if ((pCurrCard->globalFlags & F_CONLUN_IO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) currTar_Info->TarLUNBusy[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) currTar_Info->TarSyncCtrl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) else if (p_int & SCAM_SEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) FPT_scarb(p_port, LEVEL2_TAR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) FPT_scsel(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) FPT_scasid(p_card, p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) FPT_scbusf(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) WRW_HARPOON((p_port + hp_intstat), SCAM_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) return 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) * Function: SccbMgrTableInit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) * Description: Initialize all Sccb manager data structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) static void FPT_SccbMgrTableInitAll(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) unsigned char thisCard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) for (thisCard = 0; thisCard < MAX_CARDS; thisCard++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard], thisCard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) FPT_BL_Card[thisCard].ioPort = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) FPT_BL_Card[thisCard].cardInfo = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) FPT_BL_Card[thisCard].cardIndex = 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) FPT_BL_Card[thisCard].ourId = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) FPT_BL_Card[thisCard].pNvRamInfo = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) * Function: SccbMgrTableInit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) * Description: Initialize all Sccb manager data structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) unsigned char scsiID, qtag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) FPT_SccbMgrTableInitTarget(p_card, scsiID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) pCurrCard->scanIndex = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) pCurrCard->currentSCCB = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) pCurrCard->globalFlags = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) pCurrCard->cmdCounter = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) pCurrCard->tagQ_Lst = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) pCurrCard->discQCount = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) * Function: SccbMgrTableInit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) * Description: Initialize all Sccb manager data structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) static void FPT_SccbMgrTableInitTarget(unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) unsigned char target)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) unsigned char lun, qtag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) currTar_Info = &FPT_sccbMgrTbl[p_card][target];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) currTar_Info->TarSelQ_Cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) currTar_Info->TarSyncCtrl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) currTar_Info->TarSelQ_Head = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) currTar_Info->TarSelQ_Tail = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) currTar_Info->TarTagQ_Cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) currTar_Info->TarLUN_CA = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) for (lun = 0; lun < MAX_LUN; lun++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) currTar_Info->TarLUNBusy[lun] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) currTar_Info->LunDiscQ_Idx[lun] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) if (FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) if (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) target) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) FPT_BL_Card[p_card].discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) * Function: sfetm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) * Description: Read in a message byte from the SCSI bus, and check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) * for a parity error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) static unsigned char FPT_sfm(u32 port, struct sccb *pCurrSCCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) unsigned char message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) unsigned short TimeOutLoop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) TimeOutLoop = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) (TimeOutLoop++ < 20000)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) message = RD_HARPOON(port + hp_scsidata_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) WR_HARPOON(port + hp_scsisig, SCSI_ACK + S_MSGI_PH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) if (TimeOutLoop > 20000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) message = 0x00; /* force message byte = 0 if Time Out on Req */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) (RD_HARPOON(port + hp_addstat) & SCSI_PAR_ERR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) WR_HARPOON(port + hp_xferstat, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) WR_HARPOON(port + hp_fiforead, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) WR_HARPOON(port + hp_fifowrite, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) if (pCurrSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) pCurrSCCB->Sccb_scsimsg = SMPARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) message = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) TimeOutLoop = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) (TimeOutLoop++ < 20000)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) if (TimeOutLoop > 20000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) WRW_HARPOON((port + hp_intstat), PARITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) return message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) S_MSGI_PH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) WRW_HARPOON((port + hp_intstat), PARITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) return message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) RD_HARPOON(port + hp_scsidata_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) } while (1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) WR_HARPOON(port + hp_xferstat, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) WR_HARPOON(port + hp_fiforead, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) WR_HARPOON(port + hp_fifowrite, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) return message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) * Function: FPT_ssel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) * Description: Load up automation and select target device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) static void FPT_ssel(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) unsigned char auto_loaded, i, target, *theCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) u32 cdb_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) struct sccb_card *CurrCard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) unsigned char lastTag, lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) CurrCard = &FPT_BL_Card[p_card];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) currSCCB = CurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) target = currSCCB->TargID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) currTar_Info = &FPT_sccbMgrTbl[p_card][target];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) lastTag = CurrCard->tagQ_Lst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) ARAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) currSCCB->ControlByte &= ~F_USE_CMD_Q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) if (((CurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) lun = currSCCB->Lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) lun = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) if (CurrCard->globalFlags & F_TAG_STARTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) if (!(currSCCB->ControlByte & F_USE_CMD_Q)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) if ((currTar_Info->TarLUN_CA == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) == TAG_Q_TRYING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) if (currTar_Info->TarTagQ_Cnt != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) FPT_queueSelectFail(CurrCard, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) /*End non-tagged */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) /*!Use cmd Q Tagged */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) if (currTar_Info->TarLUN_CA == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) FPT_queueSelectFail(CurrCard, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) } /*else use cmd Q tagged */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) /*if glob tagged started */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) if ((((CurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) || (!(currSCCB->ControlByte & F_USE_CMD_Q)))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) if (CurrCard->discQCount >= QUEUE_DEPTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) FPT_queueSelectFail(CurrCard, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) for (i = 1; i < QUEUE_DEPTH; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) if (++lastTag >= QUEUE_DEPTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) lastTag = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) if (CurrCard->discQ_Tbl[lastTag] == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) CurrCard->tagQ_Lst = lastTag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) currTar_Info->LunDiscQ_Idx[lun] = lastTag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) CurrCard->discQ_Tbl[lastTag] = currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) CurrCard->discQCount++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) if (i == QUEUE_DEPTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) FPT_queueSelectFail(CurrCard, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) auto_loaded = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) WR_HARPOON(port + hp_select_id, target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) WR_HARPOON(port + hp_gp_reg_3, target); /* Use by new automation logic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) if (currSCCB->OperationCode == RESET_COMMAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) (currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) Sccb_idmsg & ~DISC_PRIV)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + NP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) currSCCB->Sccb_scsimsg = SMDEV_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) auto_loaded = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) currSCCB->Sccb_scsistat = SELECT_BDR_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) currTar_Info->TarSyncCtrl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) FPT_sssyncv(port, target, NARROW_SCSI, currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) FPT_SccbMgrTableInitTarget(p_card, target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) else if (currSCCB->Sccb_scsistat == ABORT_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) (currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) Sccb_idmsg & ~DISC_PRIV)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) (((unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) char)(currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) ControlByte &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) TAG_TYPE_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) >> 6) | (unsigned char)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) 0x20)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) WRW_HARPOON((port + SYNC_MSGS + 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) (MPM_OP + AMSG_OUT + currSCCB->Sccb_tag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) WRW_HARPOON((port + SYNC_MSGS + 4), (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) auto_loaded = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) auto_loaded = FPT_siwidn(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) currSCCB->Sccb_scsistat = SELECT_WN_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) == SYNC_SUPPORTED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) auto_loaded = FPT_sisyncn(port, p_card, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) currSCCB->Sccb_scsistat = SELECT_SN_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) if (!auto_loaded) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) if (currSCCB->ControlByte & F_USE_CMD_Q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) CurrCard->globalFlags |= F_TAG_STARTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) == TAG_Q_REJECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) currSCCB->ControlByte &= ~F_USE_CMD_Q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) /* Fix up the start instruction with a jump to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) Non-Tag-CMD handling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) WRW_HARPOON((port + ID_MSG_STRT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) BRH_OP + ALWAYS + NTCMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) WRW_HARPOON((port + NON_TAG_ID_MSG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) currSCCB->Sccb_idmsg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) WR_HARPOON(port + hp_autostart_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) (SELECT + SELCHK_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) /* Setup our STATE so we know what happened when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) the wheels fall off. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) currSCCB->Sccb_scsistat = SELECT_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) WRW_HARPOON((port + ID_MSG_STRT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) currSCCB->Sccb_idmsg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) WRW_HARPOON((port + ID_MSG_STRT + 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) (((unsigned char)(currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) ControlByte &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) TAG_TYPE_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) >> 6) | (unsigned char)0x20)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) for (i = 1; i < QUEUE_DEPTH; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) if (++lastTag >= QUEUE_DEPTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) lastTag = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) if (CurrCard->discQ_Tbl[lastTag] ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) WRW_HARPOON((port +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) ID_MSG_STRT + 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) lastTag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) CurrCard->tagQ_Lst = lastTag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) currSCCB->Sccb_tag = lastTag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) CurrCard->discQ_Tbl[lastTag] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) CurrCard->discQCount++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) if (i == QUEUE_DEPTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) FPT_queueSelectFail(CurrCard, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) currSCCB->Sccb_scsistat = SELECT_Q_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) WR_HARPOON(port + hp_autostart_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) (SELECT + SELCHK_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) WRW_HARPOON((port + ID_MSG_STRT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) BRH_OP + ALWAYS + NTCMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) WRW_HARPOON((port + NON_TAG_ID_MSG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) (MPM_OP + AMSG_OUT + currSCCB->Sccb_idmsg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) currSCCB->Sccb_scsistat = SELECT_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) WR_HARPOON(port + hp_autostart_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) (SELECT + SELCHK_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) theCCB = (unsigned char *)&currSCCB->Cdb[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) cdb_reg = port + CMD_STRT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) for (i = 0; i < currSCCB->CdbLength; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) cdb_reg += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) theCCB++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) /* auto_loaded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) WR_HARPOON(port + hp_xferstat, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) WRW_HARPOON((port + hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) WR_HARPOON(port + hp_scsictrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) /* auto_loaded = (RD_HARPOON(port+hp_autostart_3) & (unsigned char)0x1F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) auto_loaded |= AUTO_IMMED; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) auto_loaded = AUTO_IMMED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) DISABLE_AUTO(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) WR_HARPOON(port + hp_autostart_3, auto_loaded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) * Function: FPT_sres
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) * Description: Hookup the correct CCB and handle the incoming messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) static void FPT_sres(u32 port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) struct sccb_card *pCurrCard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) unsigned char our_target, message, lun = 0, tag, msgRetryCount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) currTar_Info =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) DISABLE_AUTO(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) WR_HARPOON((port + hp_scsictrl_0), (ENA_RESEL | ENA_SCAM_SEL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) currSCCB = pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) currSCCB->Sccb_scsistat = BUS_FREE_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) currSCCB->Sccb_scsistat = BUS_FREE_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) currTar_Info->TarLUNBusy[currSCCB->Lun] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) if (currSCCB->Sccb_scsistat != ABORT_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) pCurrCard->discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) pCurrCard->discQ_Tbl[currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) LunDiscQ_Idx[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) Lun]]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) currTar_Info->TarLUNBusy[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) if (currSCCB->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) if (currSCCB->Sccb_scsistat != ABORT_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) pCurrCard->discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) pCurrCard->discQ_Tbl[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) Sccb_tag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) if (currSCCB->Sccb_scsistat != ABORT_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) pCurrCard->discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) pCurrCard->discQ_Tbl[currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) LunDiscQ_Idx[0]] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) our_target = (unsigned char)(RD_HARPOON(port + hp_select_id) >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) msgRetryCount = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) tag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) WRW_HARPOON((port + hp_intstat), PHASE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) WRW_HARPOON((port + hp_intstat), PHASE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) message = FPT_sfm(port, pCurrCard->currentSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) if (message) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) if (message <= (0x80 | LUN_MASK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) lun = message & (unsigned char)LUN_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) if ((currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) TarStatus & TAR_TAG_Q_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) TAG_Q_TRYING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) if (currTar_Info->TarTagQ_Cnt !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) if (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) (currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) TarLUN_CA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) ACCEPT_MSG(port); /*Release the ACK for ID msg. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) message =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) FPT_sfm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) (port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) currentSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) if (message) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) ACCEPT_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) (port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) if (message !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) tag =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) FPT_sfm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) (port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) currentSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) if (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) (tag))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) /*C.A. exists! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) /*End Q cnt != 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) /*End Tag cmds supported! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) /*End valid ID message. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) /* End good id message. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) message = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) while (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) (RDW_HARPOON((port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) (PHASE | RESET))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) && !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) && (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) if (message == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) msgRetryCount++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) if (msgRetryCount == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) FPT_SendMsg(port, SMPARITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) FPT_SendMsg(port, SMDEV_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) FPT_sssyncv(port, our_target, NARROW_SCSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) if (FPT_sccbMgrTbl[p_card][our_target].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) TarEEValue & EE_SYNC_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) FPT_sccbMgrTbl[p_card][our_target].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) TarStatus &= ~TAR_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) if (FPT_sccbMgrTbl[p_card][our_target].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) TarEEValue & EE_WIDE_SCSI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) FPT_sccbMgrTbl[p_card][our_target].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) TarStatus &= ~TAR_WIDE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) FPT_queueFlushTargSccb(p_card, our_target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) SCCB_COMPLETE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) FPT_SccbMgrTableInitTarget(p_card, our_target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) } while (message == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) currTar_Info->TarLUNBusy[lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) currTar_Info->TarLUNBusy[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) if (tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) if (pCurrCard->discQ_Tbl[tag] != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) pCurrCard->discQ_Tbl[tag];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) currTar_Info->TarTagQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) if (pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) /* During Abort Tag command, the target could have got re-selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) and completed the command. Check the select Q and remove the CCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) if it is in the Select Q */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) FPT_queueFindSccb(pCurrCard->currentSCCB, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) while (!(RDW_HARPOON((port + hp_intstat)) & (PHASE | RESET)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) static void FPT_SendMsg(u32 port, unsigned char message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) WRW_HARPOON((port + hp_intstat), PHASE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) WRW_HARPOON((port + hp_intstat), PHASE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) WRW_HARPOON((port + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) (BUS_FREE | PHASE | XFER_CNT_0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) WR_HARPOON(port + hp_scsidata_0, message);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) WR_HARPOON(port + hp_portctrl_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) if ((message == SMABORT) || (message == SMDEV_RESET) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) (message == SMABORT_TAG)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) while (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) (RDW_HARPOON((port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) (BUS_FREE | PHASE))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) WRW_HARPOON((port + hp_intstat), BUS_FREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) * Function: FPT_sdecm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) * Description: Determine the proper response to the message from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) * target device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) static void FPT_sdecm(unsigned char message, u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) struct sccb_card *CurrCard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) CurrCard = &FPT_BL_Card[p_card];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) currSCCB = CurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) if (message == SMREST_DATA_PTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) FPT_hostDataXferRestart(currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) else if (message == SMCMD_COMP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) currTar_Info->TarStatus &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) ~(unsigned char)TAR_TAG_Q_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) currTar_Info->TarStatus |= (unsigned char)TAG_Q_REJECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) else if ((message == SMNO_OP) || (message >= SMIDENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) else if (message == SMREJECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) (currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) || ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) WRW_HARPOON((port + hp_intstat), BUS_FREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) if (currSCCB->Lun == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) currTar_Info->TarStatus |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) (unsigned char)SYNC_SUPPORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) currTar_Info->TarEEValue &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) ~EE_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) else if (currSCCB->Sccb_scsistat ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) SELECT_WN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) currTar_Info->TarStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) (currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) TarStatus & ~WIDE_ENABLED) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) WIDE_NEGOCIATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) currTar_Info->TarEEValue &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) ~EE_WIDE_SCSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) else if ((currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) TarStatus & TAR_TAG_Q_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) TAG_Q_TRYING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) currTar_Info->TarStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) (currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) TarStatus & ~(unsigned char)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) TAR_TAG_Q_MASK) | TAG_Q_REJECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) currSCCB->ControlByte &= ~F_USE_CMD_Q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) CurrCard->discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) CurrCard->discQ_Tbl[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) Sccb_tag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) currSCCB->Sccb_tag = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) if (currSCCB->Lun == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) WRW_HARPOON((port + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) BUS_FREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) CurrCard->globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) if ((CurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) ((currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) TarStatus & TAR_TAG_Q_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) currTar_Info->TarLUNBusy[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) Lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) currTar_Info->TarLUNBusy[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) currSCCB->ControlByte &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) ~(unsigned char)F_USE_CMD_Q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) if (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) else if (message == SMEXT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) FPT_shandem(port, p_card, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) else if (message == SMIGNORWR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) ACCEPT_MSG(port); /* ACK the RESIDUE MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) message = FPT_sfm(port, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) if (currSCCB->Sccb_scsimsg != SMPARITY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) currSCCB->Sccb_scsimsg = SMREJECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) * Function: FPT_shandem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) * Description: Decide what to do with the extended message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) static void FPT_shandem(u32 port, unsigned char p_card, struct sccb *pCurrSCCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) unsigned char length, message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) length = FPT_sfm(port, pCurrSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) if (length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) message = FPT_sfm(port, pCurrSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) if (message) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) if (message == SMSYNC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) if (length == 0x03) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) FPT_stsyncn(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) pCurrSCCB->Sccb_scsimsg = SMREJECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) } else if (message == SMWDTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) if (length == 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) FPT_stwidn(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) pCurrSCCB->Sccb_scsimsg = SMREJECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) (AUTO_IMMED +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) pCurrSCCB->Sccb_scsimsg = SMREJECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) if (pCurrSCCB->Sccb_scsimsg != SMPARITY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) if (pCurrSCCB->Sccb_scsimsg == SMPARITY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) * Function: FPT_sisyncn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) * Description: Read in a message byte from the SCSI bus, and check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) * for a parity error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) static unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) unsigned char syncFlag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) WRW_HARPOON((port + ID_MSG_STRT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) (currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) WRW_HARPOON((port + SYNC_MSGS + 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) (MPM_OP + AMSG_OUT + SMEXT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) WRW_HARPOON((port + SYNC_MSGS + 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) (MPM_OP + AMSG_OUT + SMSYNC));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) WRW_HARPOON((port + SYNC_MSGS + 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) (MPM_OP + AMSG_OUT + 12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) EE_SYNC_10MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) WRW_HARPOON((port + SYNC_MSGS + 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) (MPM_OP + AMSG_OUT + 25));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) EE_SYNC_5MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) WRW_HARPOON((port + SYNC_MSGS + 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) (MPM_OP + AMSG_OUT + 50));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) WRW_HARPOON((port + SYNC_MSGS + 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) (MPM_OP + AMSG_OUT + 00));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) WRW_HARPOON((port + SYNC_MSGS + 10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) (MPM_OP + AMSG_OUT + DEFAULT_OFFSET));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) if (syncFlag == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) WR_HARPOON(port + hp_autostart_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) (SELECT + SELCHK_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) currTar_Info->TarStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) ((currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) TarStatus & ~(unsigned char)TAR_SYNC_MASK) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) (unsigned char)SYNC_TRYING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) WR_HARPOON(port + hp_autostart_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) (AUTO_IMMED + CMD_ONLY_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) currTar_Info->TarStatus |= (unsigned char)SYNC_SUPPORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) * Function: FPT_stsyncn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) * Description: The has sent us a Sync Nego message so handle it as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) * necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) static void FPT_stsyncn(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) unsigned char sync_msg, offset, sync_reg, our_sync_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) sync_msg = FPT_sfm(port, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) if ((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) offset = FPT_sfm(port, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) if ((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) our_sync_msg = 12; /* Setup our Message to 20mb/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) our_sync_msg = 25; /* Setup our Message to 10mb/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) our_sync_msg = 50; /* Setup our Message to 5mb/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) our_sync_msg = 0; /* Message = Async */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) if (sync_msg < our_sync_msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) sync_msg = our_sync_msg; /*if faster, then set to max. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) if (offset == ASYNC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) sync_msg = ASYNC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) if (offset > MAX_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) offset = MAX_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) sync_reg = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) if (sync_msg > 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) sync_reg = 0x20; /* Use 10MB/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) if (sync_msg > 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) sync_reg = 0x40; /* Use 6.6MB/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) if (sync_msg > 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) sync_reg = 0x60; /* Use 5MB/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) if (sync_msg > 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) sync_reg = 0x80; /* Use 4MB/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) if (sync_msg > 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) sync_reg = 0xA0; /* Use 3.33MB/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) if (sync_msg > 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) sync_reg = 0xC0; /* Use 2.85MB/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) if (sync_msg > 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) sync_reg = 0xE0; /* Use 2.5MB/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) if (sync_msg > 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) sync_reg = 0x00; /* Use ASYNC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) offset = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) if (currTar_Info->TarStatus & WIDE_ENABLED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) sync_reg |= offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) sync_reg |= (offset | NARROW_SCSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) FPT_sssyncv(port, currSCCB->TargID, sync_reg, currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) currTar_Info->TarStatus = ((currTar_Info->TarStatus &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) ~(unsigned char)TAR_SYNC_MASK) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) (unsigned char)SYNC_SUPPORTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) FPT_sisyncr(port, sync_msg, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) currTar_Info->TarStatus = ((currTar_Info->TarStatus &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) ~(unsigned char)TAR_SYNC_MASK) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) (unsigned char)SYNC_SUPPORTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) * Function: FPT_sisyncr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) * Description: Answer the targets sync message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) static void FPT_sisyncr(u32 port, unsigned char sync_pulse,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) unsigned char offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) ARAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMSYNC));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) WRW_HARPOON((port + SYNC_MSGS + 6), (MPM_OP + AMSG_OUT + sync_pulse));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) WRW_HARPOON((port + SYNC_MSGS + 10), (MPM_OP + AMSG_OUT + offset));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) * Function: FPT_siwidn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) * Description: Read in a message byte from the SCSI bus, and check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) * for a parity error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) static unsigned char FPT_siwidn(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) WRW_HARPOON((port + ID_MSG_STRT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) (MPM_OP + AMSG_OUT +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) (currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) WRW_HARPOON((port + SYNC_MSGS + 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) (MPM_OP + AMSG_OUT + SMEXT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) WRW_HARPOON((port + SYNC_MSGS + 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) (MPM_OP + AMSG_OUT + SMWDTR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) WRW_HARPOON((port + SYNC_MSGS + 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) (MPM_OP + AMSG_OUT + SM16BIT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) currTar_Info->TarStatus = ((currTar_Info->TarStatus &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) ~(unsigned char)TAR_WIDE_MASK) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) (unsigned char)WIDE_ENABLED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) currTar_Info->TarStatus = ((currTar_Info->TarStatus &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) ~(unsigned char)TAR_WIDE_MASK) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) WIDE_NEGOCIATED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) * Function: FPT_stwidn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) * Description: The has sent us a Wide Nego message so handle it as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) * necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) static void FPT_stwidn(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) unsigned char width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) width = FPT_sfm(port, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) if ((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) width = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) if (width) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) currTar_Info->TarStatus |= WIDE_ENABLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) width = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) width = NARROW_SCSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) currTar_Info->TarStatus &= ~WIDE_ENABLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) FPT_sssyncv(port, currSCCB->TargID, width, currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) currTar_Info->TarStatus |= WIDE_NEGOCIATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) if (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) ((currTar_Info->TarStatus & TAR_SYNC_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) SYNC_SUPPORTED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) ARAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) FPT_sisyncn(port, p_card, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) currSCCB->Sccb_scsistat = SELECT_SN_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) width = SM16BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) width = SM8BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) FPT_siwidr(port, width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) * Function: FPT_siwidr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) * Description: Answer the targets Wide nego message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) static void FPT_siwidr(u32 port, unsigned char width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) ARAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMWDTR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) WRW_HARPOON((port + SYNC_MSGS + 8), (MPM_OP + AMSG_OUT + width));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) SGRAM_ACCESS(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) * Function: FPT_sssyncv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) * Description: Write the desired value to the Sync Register for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) * ID specified.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) static void FPT_sssyncv(u32 p_port, unsigned char p_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) unsigned char p_sync_value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) struct sccb_mgr_tar_info *currTar_Info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) unsigned char index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) index = p_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) switch (index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) index = 12; /* hp_synctarg_0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) index = 13; /* hp_synctarg_1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) index = 14; /* hp_synctarg_2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) index = 15; /* hp_synctarg_3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) index = 8; /* hp_synctarg_4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) index = 9; /* hp_synctarg_5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) index = 10; /* hp_synctarg_6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) index = 11; /* hp_synctarg_7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) index = 4; /* hp_synctarg_8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) case 9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) index = 5; /* hp_synctarg_9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) index = 6; /* hp_synctarg_10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) case 11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) index = 7; /* hp_synctarg_11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) index = 0; /* hp_synctarg_12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) case 13:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) index = 1; /* hp_synctarg_13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) case 14:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) index = 2; /* hp_synctarg_14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) case 15:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) index = 3; /* hp_synctarg_15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) WR_HARPOON(p_port + hp_synctarg_base + index, p_sync_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) currTar_Info->TarSyncCtrl = p_sync_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) * Function: FPT_sresb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) * Description: Reset the desired card's SCSI bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) static void FPT_sresb(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) unsigned char scsiID, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) WR_HARPOON(port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) (RD_HARPOON(port + hp_page_ctrl) | G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) WR_HARPOON(port + hp_scsictrl_0, SCSI_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) scsiID = RD_HARPOON(port + hp_seltimeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) WR_HARPOON(port + hp_seltimeout, TO_5ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) WRW_HARPOON((port + hp_intstat), TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT | START_TO));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) while (!(RDW_HARPOON((port + hp_intstat)) & TIMEOUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) WR_HARPOON(port + hp_seltimeout, scsiID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) FPT_Wait(port, TO_5ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) WR_HARPOON(port + hp_int_mask, (RD_HARPOON(port + hp_int_mask) | 0x00));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) currTar_Info->TarSyncCtrl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) FPT_SccbMgrTableInitTarget(p_card, scsiID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) FPT_BL_Card[p_card].scanIndex = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) FPT_BL_Card[p_card].currentSCCB = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) | F_NEW_SCCB_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) FPT_BL_Card[p_card].cmdCounter = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) FPT_BL_Card[p_card].discQCount = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) FPT_BL_Card[p_card].tagQ_Lst = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659) for (i = 0; i < QUEUE_DEPTH; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) FPT_BL_Card[p_card].discQ_Tbl[i] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) WR_HARPOON(port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) (RD_HARPOON(port + hp_page_ctrl) & ~G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) * Function: FPT_ssenss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) * Description: Setup for the Auto Sense command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) static void FPT_ssenss(struct sccb_card *pCurrCard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) currSCCB = pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) currSCCB->Save_CdbLen = currSCCB->CdbLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) for (i = 0; i < 6; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) currSCCB->CdbLength = SIX_BYTE_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) currSCCB->Cdb[0] = SCSI_REQUEST_SENSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) currSCCB->Cdb[1] = currSCCB->Cdb[1] & (unsigned char)0xE0; /*Keep LUN. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) currSCCB->Cdb[2] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) currSCCB->Cdb[3] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) currSCCB->Cdb[4] = currSCCB->RequestSenseLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) currSCCB->Cdb[5] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) currSCCB->Sccb_XferCnt = (u32)currSCCB->RequestSenseLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) currSCCB->Sccb_ATC = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) currSCCB->Sccb_XferState |= F_AUTO_SENSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702) currSCCB->Sccb_XferState &= ~F_SG_XFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(unsigned char)DISC_PRIV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) currSCCB->ControlByte = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) * Function: FPT_sxfrp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) * Description: Transfer data into the bit bucket until the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) * decides to switch phase.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) static void FPT_sxfrp(u32 p_port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) unsigned char curr_phz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) DISABLE_AUTO(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) FPT_hostDataXferAbort(p_port, p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) FPT_BL_Card[p_card].currentSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) /* If the Automation handled the end of the transfer then do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) match the phase or we will get out of sync with the ISR. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) if (RDW_HARPOON((p_port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) (BUS_FREE | XFER_CNT_0 | AUTO_INT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) WR_HARPOON(p_port + hp_xfercnt_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) curr_phz = RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) WRW_HARPOON((p_port + hp_intstat), XFER_CNT_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) WR_HARPOON(p_port + hp_scsisig, curr_phz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) (curr_phz ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) (RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) if (curr_phz & (unsigned char)SCSI_IOBIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) (SCSI_PORT | HOST_PORT | SCSI_INBIT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) if (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) RD_HARPOON(p_port + hp_fifodata_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) (SCSI_PORT | HOST_PORT | HOST_WRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) if (RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) WR_HARPOON(p_port + hp_fifodata_0, 0xFA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) } /* End of While loop for padding data I/O phase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) (SCSI_PORT | HOST_PORT | SCSI_INBIT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) while (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) RD_HARPOON(p_port + hp_fifodata_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) if (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) WR_HARPOON(p_port + hp_autostart_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) while (!(RDW_HARPOON((p_port + hp_intstat)) & AUTO_INT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) if (RDW_HARPOON((p_port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) (ICMD_COMP | ITAR_DISC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) while (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) (RDW_HARPOON((p_port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) (BUS_FREE | RSEL))) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) * Function: FPT_schkdd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) * Description: Make sure data has been flushed from both FIFOs and abort
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) * the operations if necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) static void FPT_schkdd(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) unsigned short TimeOutLoop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) unsigned char sPhase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) currSCCB->Sccb_XferCnt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) WR_HARPOON(port + hp_xferstat, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) currSCCB->Sccb_XferCnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) (currSCCB->HostStatus == SCCB_COMPLETE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) currSCCB->HostStatus = SCCB_PARITY_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) WRW_HARPOON((port + hp_intstat), PARITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) FPT_hostDataXferAbort(port, p_card, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) while (RD_HARPOON(port + hp_scsisig) & SCSI_ACK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) TimeOutLoop = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) while (RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) if (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) if (RDW_HARPOON((port + hp_intstat)) & RESET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) if ((RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) || (TimeOutLoop++ > 0x3000))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) sPhase = RD_HARPOON(port + hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) if ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) (sPhase == (SCSI_BSY | S_DATAI_PH))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) FPT_phaseDataIn(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) FPT_phaseDataOut(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) FPT_sxfrp(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) if (!(RDW_HARPOON((port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) WRW_HARPOON((port + hp_intstat), AUTO_INT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) FPT_phaseDecode(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) WR_HARPOON(port + hp_portctrl_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) * Function: FPT_sinits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) * Description: Setup SCCB manager fields in this SCCB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) if ((p_sccb->TargID >= MAX_SCSI_TAR) || (p_sccb->Lun >= MAX_LUN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) p_sccb->Sccb_XferState = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) p_sccb->Sccb_XferCnt = p_sccb->DataLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915) if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) p_sccb->Sccb_SGoffset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) p_sccb->Sccb_XferState = F_SG_XFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) p_sccb->Sccb_XferCnt = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) if (p_sccb->DataLength == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) p_sccb->Sccb_XferState |= F_ALL_XFERRED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) if (p_sccb->ControlByte & F_USE_CMD_Q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) p_sccb->ControlByte &= ~F_USE_CMD_Q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) currTar_Info->TarStatus |= TAG_Q_TRYING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) /* For !single SCSI device in system & device allow Disconnect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) or command is tag_q type then send Cmd with Disconnect Enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) else send Cmd with Disconnect Disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) if (((!(FPT_BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) (currTar_Info->TarStatus & TAG_Q_TRYING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) (currTar_Info->TarStatus & TAG_Q_TRYING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) p_sccb->Sccb_idmsg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) (unsigned char)(SMIDENT | DISC_PRIV) | p_sccb->Lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) p_sccb->Sccb_idmsg = (unsigned char)SMIDENT | p_sccb->Lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) p_sccb->HostStatus = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) p_sccb->TargetStatus = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) p_sccb->Sccb_tag = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) p_sccb->Sccb_MGRFlags = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) p_sccb->Sccb_sgseg = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) p_sccb->Sccb_ATC = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) p_sccb->Sccb_savedATC = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) p_sccb->SccbVirtDataPtr = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) p_sccb->Sccb_forwardlink = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) p_sccb->Sccb_backlink = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) p_sccb->Sccb_scsistat = BUS_FREE_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) p_sccb->SccbStatus = SCCB_IN_PROCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) p_sccb->Sccb_scsimsg = SMNO_OP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) * Function: Phase Decode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) * Description: Determine the phase and call the appropriate function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) static void FPT_phaseDecode(u32 p_port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) unsigned char phase_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) void (*phase) (u32, unsigned char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) DISABLE_AUTO(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) phase_ref =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) (unsigned char)(RD_HARPOON(p_port + hp_scsisig) & S_SCSI_PHZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) phase = FPT_s_PhaseTbl[phase_ref];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) (*phase) (p_port, p_card); /* Call the correct phase func */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) * Function: Data Out Phase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) * Description: Start up both the BusMaster and Xbow.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) static void FPT_phaseDataOut(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) if (currSCCB == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) return; /* Exit if No SCCB record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) currSCCB->Sccb_scsistat = DATA_OUT_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) if (currSCCB->Sccb_XferCnt == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) (currSCCB->HostStatus == SCCB_COMPLETE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) FPT_sxfrp(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) FPT_phaseDecode(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) * Function: Data In Phase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) * Description: Startup the BusMaster and the XBOW.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) static void FPT_phaseDataIn(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) if (currSCCB == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) return; /* Exit if No SCCB record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) currSCCB->Sccb_scsistat = DATA_IN_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) if (currSCCB->Sccb_XferCnt == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) (currSCCB->HostStatus == SCCB_COMPLETE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) FPT_sxfrp(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) FPT_phaseDecode(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) * Function: Command Phase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) * Description: Load the CDB into the automation and start it up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) static void FPT_phaseCommand(u32 p_port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) u32 cdb_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) if (currSCCB->OperationCode == RESET_COMMAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) currSCCB->CdbLength = SIX_BYTE_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) WR_HARPOON(p_port + hp_scsisig, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) ARAM_ACCESS(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) cdb_reg = p_port + CMD_STRT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) for (i = 0; i < currSCCB->CdbLength; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) if (currSCCB->OperationCode == RESET_COMMAND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) WRW_HARPOON(cdb_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) cdb_reg += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122) WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) WR_HARPOON(p_port + hp_portctrl_0, (SCSI_PORT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) currSCCB->Sccb_scsistat = COMMAND_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) WR_HARPOON(p_port + hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) SGRAM_ACCESS(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) * Function: Status phase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) * Description: Bring in the status and command complete message bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140) static void FPT_phaseStatus(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) /* Start-up the automation to finish off this command and let the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) isr handle the interrupt for command complete when it comes in.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144) We could wait here for the interrupt to be generated?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147) WR_HARPOON(port + hp_scsisig, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) WR_HARPOON(port + hp_autostart_0, (AUTO_IMMED + END_DATA_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) * Function: Phase Message Out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156) * Description: Send out our message (if we have one) and handle whatever
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157) * else is involed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161) static void FPT_phaseMsgOut(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163) unsigned char message, scsiID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) if (currSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) message = currSCCB->Sccb_scsimsg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) scsiID = currSCCB->TargID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) if (message == SMDEV_RESET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176) currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) currTar_Info->TarSyncCtrl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180) if (FPT_sccbMgrTbl[p_card][scsiID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181) TarEEValue & EE_SYNC_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) ~TAR_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) if (FPT_sccbMgrTbl[p_card][scsiID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189) TarEEValue & EE_WIDE_SCSI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191) FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) ~TAR_WIDE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196) FPT_SccbMgrTableInitTarget(p_card, scsiID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197) } else if (currSCCB->Sccb_scsistat == ABORT_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) currSCCB->HostStatus = SCCB_COMPLETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) if (FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202) Sccb_tag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) else if (currSCCB->Sccb_scsistat < COMMAND_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) if (message == SMNO_OP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213) FPT_ssel(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) if (message == SMABORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220) FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224) message = SMABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227) WRW_HARPOON((port + hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) WR_HARPOON(port + hp_scsidata_0, message);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) WR_HARPOON(port + hp_portctrl_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239) if ((message == SMABORT) || (message == SMDEV_RESET) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) (message == SMABORT_TAG)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242) while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | PHASE))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245) if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) WRW_HARPOON((port + hp_intstat), BUS_FREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248) if (currSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) if ((FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251) globalFlags & F_CONLUN_IO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254) TarStatus & TAR_TAG_Q_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255) TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) FPT_sccbMgrTbl[p_card][currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) TarLUNBusy[currSCCB->Lun] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) FPT_sccbMgrTbl[p_card][currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261) TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262) TarLUNBusy[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264) FPT_queueCmdComplete(&FPT_BL_Card[p_card],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265) currSCCB, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269) FPT_BL_Card[p_card].globalFlags |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) FPT_sxfrp(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) if (message == SMPARITY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) currSCCB->Sccb_scsimsg = SMNO_OP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) FPT_sxfrp(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) * Function: Message In phase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) * Description: Bring in the message and determine what to do with it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) static void FPT_phaseMsgIn(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) unsigned char message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309) FPT_phaseChkFifo(port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312) message = RD_HARPOON(port + hp_scsidata_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313) if ((message == SMDISC) || (message == SMSAVE_DATA_PTR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) (AUTO_IMMED + END_DATA_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) message = FPT_sfm(port, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323) if (message) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325) FPT_sdecm(message, port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) if (currSCCB->Sccb_scsimsg != SMPARITY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) ACCEPT_MSG(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330) WR_HARPOON(port + hp_autostart_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) (AUTO_IMMED + DISCONNECT_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) * Function: Illegal phase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341) * Description: Target switched to some illegal phase, so all we can do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) * is report an error back to the host (if that is possible)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343) * and send an ABORT message to the misbehaving target.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) static void FPT_phaseIllegal(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353) WR_HARPOON(port + hp_scsisig, RD_HARPOON(port + hp_scsisig));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) if (currSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357) currSCCB->Sccb_scsistat = ABORT_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358) currSCCB->Sccb_scsimsg = SMABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361) ACCEPT_MSG_ATN(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) * Function: Phase Check FIFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) * Description: Make sure data has been flushed from both FIFOs and abort
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) * the operations if necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373) static void FPT_phaseChkFifo(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) u32 xfercnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) if (currSCCB->Sccb_scsistat == DATA_IN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382) while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) if (!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387) currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) currSCCB->Sccb_XferCnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392) (currSCCB->HostStatus == SCCB_COMPLETE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) currSCCB->HostStatus = SCCB_PARITY_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) WRW_HARPOON((port + hp_intstat), PARITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) FPT_hostDataXferAbort(port, p_card, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399) FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) && (RD_HARPOON(port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) BM_CMD_BUSY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409) /*End Data In specific code. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) GET_XFER_CNT(port, xfercnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) WR_HARPOON(port + hp_xfercnt_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) WR_HARPOON(port + hp_portctrl_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) currSCCB->Sccb_XferCnt = xfercnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) (currSCCB->HostStatus == SCCB_COMPLETE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) currSCCB->HostStatus = SCCB_PARITY_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) WRW_HARPOON((port + hp_intstat), PARITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) FPT_hostDataXferAbort(port, p_card, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) WR_HARPOON(port + hp_fifowrite, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) WR_HARPOON(port + hp_fiforead, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431) WR_HARPOON(port + hp_xferstat, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) * Function: Phase Bus Free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440) * Description: We just went bus free so figure out if it was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) * because of command complete or from a disconnect.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444) static void FPT_phaseBusFree(u32 port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450) if (currSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) DISABLE_AUTO(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454) if (currSCCB->OperationCode == RESET_COMMAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457) ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458) TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) TarLUNBusy[currSCCB->Lun] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463) TarLUNBusy[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466) p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) FPT_queueSearchSelect(&FPT_BL_Card[p_card], p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472) else if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474) (unsigned char)SYNC_SUPPORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) ~EE_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479) else if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482) TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) ~EE_WIDE_SCSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) else if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) /* Make sure this is not a phony BUS_FREE. If we were
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) reselected or if BUSY is NOT on then this is a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491) valid BUS FREE. SRR Wednesday, 5/10/1995. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493) if ((!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) (RDW_HARPOON((port + hp_intstat)) & RSEL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496) TarStatus &= ~TAR_TAG_Q_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) TarStatus |= TAG_Q_REJECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) currSCCB->Sccb_scsistat = BUS_FREE_ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) if (!currSCCB->HostStatus) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515) ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) TarLUNBusy[currSCCB->Lun] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521) TarLUNBusy[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528) FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) } /*end if !=null */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) * Function: Auto Load Default Map
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537) * Description: Load the Automation RAM with the defualt map values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540) static void FPT_autoLoadDefaultMap(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) u32 map_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) ARAM_ACCESS(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) map_addr = p_port + hp_aramBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0xC0)); /*ID MESSAGE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x20)); /*SIMPLE TAG QUEUEING MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551) WRW_HARPOON(map_addr, RAT_OP); /*RESET ATTENTION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553) WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x00)); /*TAG ID MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577) WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579) WRW_HARPOON(map_addr, (CPE_OP + ADATA_OUT + DINT)); /*JUMP IF DATA OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) WRW_HARPOON(map_addr, (TCB_OP + FIFO_0 + DI)); /*JUMP IF NO DATA IN FIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) map_addr += 2; /*This means AYNC DATA IN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583) WRW_HARPOON(map_addr, (SSI_OP + SSI_IDO_STRT)); /*STOP AND INTERRUPT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) WRW_HARPOON(map_addr, (CPE_OP + ADATA_IN + DINT)); /*JUMP IF NOT DATA IN PHZ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587) WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST)); /*IF NOT MSG IN CHECK 4 DATA IN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x02)); /*SAVE DATA PTR MSG? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + DC)); /*GO CHECK FOR DISCONNECT MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR1)); /*SAVE DATA PTRS MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595) WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST)); /*IF NOT MSG IN CHECK DATA IN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x04)); /*DISCONNECT MSG? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599) WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + UNKNWN)); /*UKNKNOWN MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET)); /*XFER DISCONNECT MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) WRW_HARPOON(map_addr, (SSI_OP + SSI_ITAR_DISC)); /*STOP AND INTERRUPT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605) WRW_HARPOON(map_addr, (CPN_OP + ASTATUS + UNKNWN)); /*JUMP IF NOT STATUS PHZ. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607) WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR0)); /*GET STATUS BYTE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + CC)); /*ERROR IF NOT MSG IN PHZ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x00)); /*CHECK FOR CMD COMPLETE MSG. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613) WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + CC)); /*ERROR IF NOT CMD COMPLETE MSG. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET)); /*GET CMD COMPLETE MSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) WRW_HARPOON(map_addr, (SSI_OP + SSI_ICMD_COMP)); /*END OF COMMAND */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620) WRW_HARPOON(map_addr, (SSI_OP + SSI_IUNKWN)); /*RECEIVED UNKNOWN MSG BYTE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622) WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) WRW_HARPOON(map_addr, (SSI_OP + SSI_ITICKLE)); /*BIOS Tickled the Mgr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) WRW_HARPOON(map_addr, (SSI_OP + SSI_IRFAIL)); /*EXPECTED ID/TAG MESSAGES AND */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627) map_addr += 2; /* DIDN'T GET ONE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628) WRW_HARPOON(map_addr, (CRR_OP + AR3 + S_IDREG)); /* comp SCSI SEL ID & AR3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630) WRW_HARPOON(map_addr, (BRH_OP + EQUAL + 0x00)); /*SEL ID OK then Conti. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) map_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634) SGRAM_ACCESS(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639) * Function: Auto Command Complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641) * Description: Post command back to host and find another command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642) * to execute.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646) static void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649) unsigned char status_byte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) status_byte = RD_HARPOON(p_port + hp_gp_reg_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) if (status_byte != SSGOOD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659) if (status_byte == SSQ_FULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662) ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665) TarLUNBusy[currSCCB->Lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) FPT_BL_Card[p_card].discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669) discQ_Tbl[FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) LunDiscQ_Idx[currSCCB->Lun]] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675) TarLUNBusy[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676) if (currSCCB->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) Sccb_tag]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688) discQ_Tbl[FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690) LunDiscQ_Idx[0]] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696) FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701) if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703) (unsigned char)SYNC_SUPPORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) ~EE_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709) if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) TarLUNBusy[currSCCB->Lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715) FPT_BL_Card[p_card].discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717) discQ_Tbl[FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719) LunDiscQ_Idx[currSCCB->Lun]] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723) TarLUNBusy[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724) if (currSCCB->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728) FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729) Sccb_tag]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736) discQ_Tbl[FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738) LunDiscQ_Idx[0]] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745) if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748) (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749) TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752) ~EE_WIDE_SCSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753) FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755) if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756) ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757) TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759) TarLUNBusy[currSCCB->Lun] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761) FPT_BL_Card[p_card].discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763) discQ_Tbl[FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765) LunDiscQ_Idx[currSCCB->Lun]] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769) TarLUNBusy[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770) if (currSCCB->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774) FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775) Sccb_tag]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778) if (FPT_BL_Card[p_card].discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782) discQ_Tbl[FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784) LunDiscQ_Idx[0]] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791) if (status_byte == SSCHECK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792) if (FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793) if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794) TarEEValue & EE_SYNC_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795) FPT_sccbMgrTbl[p_card][currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796) TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797) TarStatus &= ~TAR_SYNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799) if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800) TarEEValue & EE_WIDE_SCSI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801) FPT_sccbMgrTbl[p_card][currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802) TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803) TarStatus &= ~TAR_WIDE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808) if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) currSCCB->SccbStatus = SCCB_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811) currSCCB->TargetStatus = status_byte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813) if (status_byte == SSCHECK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815) FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816) TarLUN_CA = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) if (currSCCB->RequestSenseLength !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819) NO_AUTO_REQUEST_SENSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821) if (currSCCB->RequestSenseLength == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822) currSCCB->RequestSenseLength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) 14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825) FPT_ssenss(&FPT_BL_Card[p_card]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826) FPT_BL_Card[p_card].globalFlags |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827) F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829) if (((FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4830) globalFlags & F_CONLUN_IO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4831) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4832) ((FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4833) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4834) TarStatus & TAR_TAG_Q_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4835) TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4836) FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4837) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4838) TarLUNBusy[currSCCB->Lun] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4839) 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4840) if (FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4841) discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4842) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4843) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4844) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4845) discQ_Tbl[FPT_sccbMgrTbl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4846) [p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4847) [currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4848) TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4849) LunDiscQ_Idx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4850) [currSCCB->Lun]] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4851) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4852) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4853) FPT_sccbMgrTbl[p_card]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4854) [currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4855) TarLUNBusy[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4856) if (currSCCB->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4857) if (FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4858) discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4859) FPT_BL_Card
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4860) [p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4861) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4862) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4863) discQ_Tbl[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4864) Sccb_tag]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4865) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4866) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4867) if (FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4868) discQCount != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4869) FPT_BL_Card
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4870) [p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4871) discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4872) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4873) discQ_Tbl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4874) [FPT_sccbMgrTbl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4875) [p_card][currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4876) TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4877) LunDiscQ_Idx[0]] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4878) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4881) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4887) if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4888) ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4889) TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4890) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4891) Lun] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4892) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4893) FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4895) FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4898) #define SHORT_WAIT 0x0000000F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4899) #define LONG_WAIT 0x0000FFFFL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4901) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4902) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4903) * Function: Data Transfer Processor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4904) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4905) * Description: This routine performs two tasks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4906) * (1) Start data transfer by calling HOST_DATA_XFER_START
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4907) * function. Once data transfer is started, (2) Depends
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4908) * on the type of data transfer mode Scatter/Gather mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4909) * or NON Scatter/Gather mode. In NON Scatter/Gather mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4910) * this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4911) * data transfer done. In Scatter/Gather mode, this routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4912) * checks bus master command complete and dual rank busy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4913) * bit to keep chaining SC transfer command. Similarly,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4914) * in Scatter/Gather mode, it checks Sccb_MGRFlag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4915) * (F_HOST_XFER_ACT bit) for data transfer done.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4916) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4917) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4919) static void FPT_dataXferProcessor(u32 port, struct sccb_card *pCurrCard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4920) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4921) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4923) currSCCB = pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4925) if (currSCCB->Sccb_XferState & F_SG_XFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4926) if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4928) currSCCB->Sccb_sgseg += (unsigned char)SG_BUF_CNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4929) currSCCB->Sccb_SGoffset = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4931) pCurrCard->globalFlags |= F_HOST_XFER_ACT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4933) FPT_busMstrSGDataXferStart(port, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4936) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4937) if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4938) pCurrCard->globalFlags |= F_HOST_XFER_ACT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4940) FPT_busMstrDataXferStart(port, currSCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4945) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4946) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4947) * Function: BusMaster Scatter Gather Data Transfer Start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4948) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4949) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4950) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4951) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4952) static void FPT_busMstrSGDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4953) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4954) u32 count, addr, tmpSGCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4955) unsigned int sg_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4956) unsigned char sg_count, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4957) u32 reg_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4958) struct blogic_sg_seg *segp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4960) if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4961) count = ((u32)HOST_RD_CMD) << 24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4962) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4963) count = ((u32)HOST_WRT_CMD) << 24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4965) sg_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4966) tmpSGCnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4967) sg_index = pcurrSCCB->Sccb_sgseg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4968) reg_offset = hp_aramBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4970) i = (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4971) ~(SGRAM_ARAM | SCATTER_EN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4973) WR_HARPOON(p_port + hp_page_ctrl, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4975) while ((sg_count < (unsigned char)SG_BUF_CNT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4976) ((sg_index * (unsigned int)SG_ELEMENT_SIZE) <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4977) pcurrSCCB->DataLength)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4979) segp = (struct blogic_sg_seg *)(pcurrSCCB->DataPointer) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4980) sg_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4981) tmpSGCnt += segp->segbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4982) count |= segp->segbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4983) addr = segp->segdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4985) if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4986) addr +=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4987) ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4988) count =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4989) (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4990) tmpSGCnt = count & 0x00FFFFFFL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4991) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4993) WR_HARP32(p_port, reg_offset, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4994) reg_offset += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4996) WR_HARP32(p_port, reg_offset, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4997) reg_offset += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4999) count &= 0xFF000000L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5000) sg_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5001) sg_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5003) } /*End While */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5005) pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5007) WR_HARPOON(p_port + hp_sg_addr, (sg_count << 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5009) if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5011) WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5013) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5014) (DMA_PORT | SCSI_PORT | SCSI_INBIT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5015) WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5018) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5020) if ((!(RD_HARPOON(p_port + hp_synctarg_0) & NARROW_SCSI)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5021) (tmpSGCnt & 0x000000001)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5023) pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5024) tmpSGCnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5027) WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5029) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5030) (SCSI_PORT | DMA_PORT | DMA_RD));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5031) WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5034) WR_HARPOON(p_port + hp_page_ctrl, (unsigned char)(i | SCATTER_EN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5038) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5039) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5040) * Function: BusMaster Data Transfer Start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5041) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5042) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5043) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5044) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5045) static void FPT_busMstrDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5046) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5047) u32 addr, count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5049) if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5051) count = pcurrSCCB->Sccb_XferCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5053) addr = (u32)(unsigned long)pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5056) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5057) addr = pcurrSCCB->SensePointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5058) count = pcurrSCCB->RequestSenseLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5062) HP_SETUP_ADDR_CNT(p_port, addr, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5064) if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5066) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5067) (DMA_PORT | SCSI_PORT | SCSI_INBIT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5068) WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5070) WR_HARPOON(p_port + hp_xfer_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5071) (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5074) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5076) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5077) (SCSI_PORT | DMA_PORT | DMA_RD));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5078) WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5080) WR_HARPOON(p_port + hp_xfer_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5081) (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5086) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5087) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5088) * Function: BusMaster Timeout Handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5089) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5090) * Description: This function is called after a bus master command busy time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5091) * out is detected. This routines issue halt state machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5092) * with a software time out for command busy. If command busy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5093) * is still asserted at the end of the time out, it issues
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5094) * hard abort with another software time out. It hard abort
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5095) * command busy is also time out, it'll just give up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5096) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5097) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5098) static unsigned char FPT_busMstrTimeOut(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5099) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5100) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5102) timeout = LONG_WAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5104) WR_HARPOON(p_port + hp_sys_ctrl, HALT_MACH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5106) while ((!(RD_HARPOON(p_port + hp_ext_status) & CMD_ABORTED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5107) && timeout--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5110) if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5111) WR_HARPOON(p_port + hp_sys_ctrl, HARD_ABORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5113) timeout = LONG_WAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5114) while ((RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5115) && timeout--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5119) RD_HARPOON(p_port + hp_int_status); /*Clear command complete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5121) if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5122) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5125) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5126) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5130) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5131) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5132) * Function: Host Data Transfer Abort
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5134) * Description: Abort any in progress transfer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5135) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5136) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5137) static void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5138) struct sccb *pCurrSCCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5141) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5142) unsigned long remain_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5143) u32 sg_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5144) struct blogic_sg_seg *segp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5146) FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5148) if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5150) if (!(RD_HARPOON(port + hp_int_status) & INT_CMD_COMPL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5152) WR_HARPOON(port + hp_bm_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5153) (RD_HARPOON(port + hp_bm_ctrl) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5154) FLUSH_XFER_CNTR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5155) timeout = LONG_WAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5157) while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5158) && timeout--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5161) WR_HARPOON(port + hp_bm_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5162) (RD_HARPOON(port + hp_bm_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5163) ~FLUSH_XFER_CNTR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5165) if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5167) if (FPT_busMstrTimeOut(port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5169) if (pCurrSCCB->HostStatus == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5171) pCurrSCCB->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5172) SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5176) if (RD_HARPOON(port + hp_int_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5177) INT_EXT_STATUS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5179) if (RD_HARPOON(port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5180) BAD_EXT_STATUS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5182) if (pCurrSCCB->HostStatus ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5183) 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5185) pCurrSCCB->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5186) SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5192) else if (pCurrSCCB->Sccb_XferCnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5194) if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5196) WR_HARPOON(port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5197) (RD_HARPOON(port + hp_page_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5198) ~SCATTER_EN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5200) WR_HARPOON(port + hp_sg_addr, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5202) sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5204) if (sg_ptr >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5205) (unsigned int)(pCurrSCCB->DataLength /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5206) SG_ELEMENT_SIZE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5208) sg_ptr = (u32)(pCurrSCCB->DataLength /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5209) SG_ELEMENT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5212) remain_cnt = pCurrSCCB->Sccb_XferCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5214) while (remain_cnt < 0x01000000L) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5216) sg_ptr--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5217) segp = (struct blogic_sg_seg *)(pCurrSCCB->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5218) DataPointer) + (sg_ptr * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5219) if (remain_cnt > (unsigned long)segp->segbytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5220) remain_cnt -=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5221) (unsigned long)segp->segbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5222) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5223) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5226) if (remain_cnt < 0x01000000L) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5228) pCurrSCCB->Sccb_SGoffset = remain_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5230) pCurrSCCB->Sccb_sgseg = (unsigned short)sg_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5232) if ((unsigned long)(sg_ptr * SG_ELEMENT_SIZE) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5233) pCurrSCCB->DataLength && (remain_cnt == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5235) pCurrSCCB->Sccb_XferState |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5236) F_ALL_XFERRED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5239) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5241) if (pCurrSCCB->HostStatus == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5243) pCurrSCCB->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5244) SCCB_GROSS_FW_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5249) if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5251) if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5253) FPT_busMstrTimeOut(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5256) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5258) if (RD_HARPOON(port + hp_int_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5259) INT_EXT_STATUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5261) if (RD_HARPOON(port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5262) BAD_EXT_STATUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5264) if (pCurrSCCB->HostStatus ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5265) 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5267) pCurrSCCB->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5268) SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5276) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5278) if ((RD_HARPOON(port + hp_fifo_cnt)) >= BM_THRESHOLD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5280) timeout = SHORT_WAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5282) while ((RD_HARPOON(port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5283) BM_CMD_BUSY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5284) && ((RD_HARPOON(port + hp_fifo_cnt)) >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5285) BM_THRESHOLD) && timeout--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5289) if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5291) WR_HARPOON(port + hp_bm_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5292) (RD_HARPOON(port + hp_bm_ctrl) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5293) FLUSH_XFER_CNTR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5295) timeout = LONG_WAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5297) while ((RD_HARPOON(port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5298) BM_CMD_BUSY) && timeout--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5301) WR_HARPOON(port + hp_bm_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5302) (RD_HARPOON(port + hp_bm_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5303) ~FLUSH_XFER_CNTR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5305) if (RD_HARPOON(port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5306) BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5308) if (pCurrSCCB->HostStatus == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5310) pCurrSCCB->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5311) SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5314) FPT_busMstrTimeOut(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5318) if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5320) if (RD_HARPOON(port + hp_ext_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5321) BAD_EXT_STATUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5323) if (pCurrSCCB->HostStatus == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5325) pCurrSCCB->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5326) SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5334) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5336) if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5338) timeout = LONG_WAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5340) while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5341) && timeout--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5344) if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5346) if (pCurrSCCB->HostStatus == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5348) pCurrSCCB->HostStatus = SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5351) FPT_busMstrTimeOut(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5355) if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5357) if (RD_HARPOON(port + hp_ext_status) & BAD_EXT_STATUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5359) if (pCurrSCCB->HostStatus == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5361) pCurrSCCB->HostStatus = SCCB_BM_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5367) if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5369) WR_HARPOON(port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5370) (RD_HARPOON(port + hp_page_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5371) ~SCATTER_EN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5373) WR_HARPOON(port + hp_sg_addr, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5375) pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5377) pCurrSCCB->Sccb_SGoffset = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5379) if ((u32)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5380) pCurrSCCB->DataLength) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5382) pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5383) pCurrSCCB->Sccb_sgseg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5384) (unsigned short)(pCurrSCCB->DataLength /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5385) SG_ELEMENT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5389) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5390) if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5391) pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5395) WR_HARPOON(port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5398) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5399) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5400) * Function: Host Data Transfer Restart
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5401) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5402) * Description: Reset the available count due to a restore data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5403) * pointers message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5404) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5405) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5406) static void FPT_hostDataXferRestart(struct sccb *currSCCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5408) unsigned long data_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5409) unsigned int sg_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5410) struct blogic_sg_seg *segp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5412) if (currSCCB->Sccb_XferState & F_SG_XFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5414) currSCCB->Sccb_XferCnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5416) sg_index = 0xffff; /*Index by long words into sg list. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5417) data_count = 0; /*Running count of SG xfer counts. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5420) while (data_count < currSCCB->Sccb_ATC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5422) sg_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5423) segp = (struct blogic_sg_seg *)(currSCCB->DataPointer) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5424) (sg_index * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5425) data_count += segp->segbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5428) if (data_count == currSCCB->Sccb_ATC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5430) currSCCB->Sccb_SGoffset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5431) sg_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5434) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5435) currSCCB->Sccb_SGoffset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5436) data_count - currSCCB->Sccb_ATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5439) currSCCB->Sccb_sgseg = (unsigned short)sg_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5442) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5443) currSCCB->Sccb_XferCnt =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5444) currSCCB->DataLength - currSCCB->Sccb_ATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5448) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5449) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5450) * Function: FPT_scini
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5451) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5452) * Description: Setup all data structures necessary for SCAM selection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5453) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5454) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5456) static void FPT_scini(unsigned char p_card, unsigned char p_our_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5457) unsigned char p_power_up)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5460) unsigned char loser, assigned_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5461) u32 p_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5463) unsigned char i, k, ScamFlg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5464) struct sccb_card *currCard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5465) struct nvram_info *pCurrNvRam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5467) currCard = &FPT_BL_Card[p_card];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5468) p_port = currCard->ioPort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5469) pCurrNvRam = currCard->pNvRamInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5471) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5472) ScamFlg = pCurrNvRam->niScamConf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5473) i = pCurrNvRam->niSysConf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5474) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5475) ScamFlg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5476) (unsigned char)FPT_utilEERead(p_port, SCAM_CONFIG / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5477) i = (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5478) char)(FPT_utilEERead(p_port, (SYSTEM_CONFIG / 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5480) if (!(i & 0x02)) /* check if reset bus in AutoSCSI parameter set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5481) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5483) FPT_inisci(p_card, p_port, p_our_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5485) /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5486) too slow to return to SCAM selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5488) /* if (p_power_up)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5489) FPT_Wait1Second(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5490) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5491) FPT_Wait(p_port, TO_250ms); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5493) FPT_Wait1Second(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5495) if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5496) while (!(FPT_scarb(p_port, INIT_SELTD))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5499) FPT_scsel(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5501) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5502) FPT_scxferc(p_port, SYNC_PTRN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5503) FPT_scxferc(p_port, DOM_MSTR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5504) loser =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5505) FPT_scsendi(p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5506) &FPT_scamInfo[p_our_id].id_string[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5507) } while (loser == 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5509) FPT_scbusf(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5511) if ((p_power_up) && (!loser)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5512) FPT_sresb(p_port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5513) FPT_Wait(p_port, TO_250ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5515) while (!(FPT_scarb(p_port, INIT_SELTD))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5518) FPT_scsel(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5520) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5521) FPT_scxferc(p_port, SYNC_PTRN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5522) FPT_scxferc(p_port, DOM_MSTR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5523) loser =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5524) FPT_scsendi(p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5525) &FPT_scamInfo[p_our_id].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5526) id_string[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5527) } while (loser == 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5529) FPT_scbusf(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5533) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5534) loser = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5537) if (!loser) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5539) FPT_scamInfo[p_our_id].state = ID_ASSIGNED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5541) if (ScamFlg & SCAM_ENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5543) for (i = 0; i < MAX_SCSI_TAR; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5544) if ((FPT_scamInfo[i].state == ID_UNASSIGNED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5545) (FPT_scamInfo[i].state == ID_UNUSED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5546) if (FPT_scsell(p_port, i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5547) FPT_scamInfo[i].state = LEGACY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5548) if ((FPT_scamInfo[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5549) id_string[0] != 0xFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5550) || (FPT_scamInfo[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5551) id_string[1] != 0xFA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5553) FPT_scamInfo[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5554) id_string[0] = 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5555) FPT_scamInfo[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5556) id_string[1] = 0xFA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5557) if (pCurrNvRam == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5558) currCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5559) globalFlags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5560) |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5561) F_UPDATE_EEPROM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5567) FPT_sresb(p_port, p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5568) FPT_Wait1Second(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5569) while (!(FPT_scarb(p_port, INIT_SELTD))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5571) FPT_scsel(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5572) FPT_scasid(p_card, p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5577) else if ((loser) && (ScamFlg & SCAM_ENABLED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5578) FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5579) assigned_id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5580) FPT_scwtsel(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5582) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5583) while (FPT_scxferc(p_port, 0x00) != SYNC_PTRN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5586) i = FPT_scxferc(p_port, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5587) if (i == ASSIGN_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5588) if (!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5589) (FPT_scsendi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5590) (p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5591) &FPT_scamInfo[p_our_id].id_string[0]))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5592) i = FPT_scxferc(p_port, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5593) if (FPT_scvalq(i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5594) k = FPT_scxferc(p_port, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5596) if (FPT_scvalq(k)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5597) currCard->ourId =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5598) ((unsigned char)(i
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5599) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5600) 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5601) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5602) (k &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5603) (unsigned char)7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5604) & (unsigned char)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5605) 0x3F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5606) FPT_inisci(p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5607) p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5608) p_our_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5609) FPT_scamInfo[currCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5610) ourId].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5611) state = ID_ASSIGNED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5612) FPT_scamInfo[currCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5613) ourId].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5614) id_string[0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5615) = SLV_TYPE_CODE0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5616) assigned_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5622) else if (i == SET_P_FLAG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5623) if (!(FPT_scsendi(p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5624) &FPT_scamInfo[p_our_id].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5625) id_string[0])))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5626) FPT_scamInfo[p_our_id].id_string[0] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5627) 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5629) } while (!assigned_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5631) while (FPT_scxferc(p_port, 0x00) != CFG_CMPLT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5635) if (ScamFlg & SCAM_ENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5636) FPT_scbusf(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5637) if (currCard->globalFlags & F_UPDATE_EEPROM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5638) FPT_scsavdi(p_card, p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5639) currCard->globalFlags &= ~F_UPDATE_EEPROM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5643) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5644) for (i=0,k=0; i < MAX_SCSI_TAR; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5646) if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5647) (FPT_scamInfo[i].state == LEGACY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5648) k++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5651) if (k==2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5652) currCard->globalFlags |= F_SINGLE_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5653) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5654) currCard->globalFlags &= ~F_SINGLE_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5655) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5658) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5659) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5660) * Function: FPT_scarb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5661) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5662) * Description: Gain control of the bus and wait SCAM select time (250ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5663) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5664) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5666) static int FPT_scarb(u32 p_port, unsigned char p_sel_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5668) if (p_sel_type == INIT_SELTD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5670) while (RD_HARPOON(p_port + hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5673) if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5674) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5676) if (RD_HARPOON(p_port + hp_scsidata_0) != 00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5677) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5679) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5680) (RD_HARPOON(p_port + hp_scsisig) | SCSI_BSY));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5682) if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5684) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5685) (RD_HARPOON(p_port + hp_scsisig) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5686) ~SCSI_BSY));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5687) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5690) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5691) (RD_HARPOON(p_port + hp_scsisig) | SCSI_SEL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5693) if (RD_HARPOON(p_port + hp_scsidata_0) != 00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5695) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5696) (RD_HARPOON(p_port + hp_scsisig) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5697) ~(SCSI_BSY | SCSI_SEL)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5698) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5702) WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5703) & ~ACTdeassert));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5704) WR_HARPOON(p_port + hp_scsireset, SCAM_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5705) WR_HARPOON(p_port + hp_scsidata_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5706) WR_HARPOON(p_port + hp_scsidata_1, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5707) WR_HARPOON(p_port + hp_portctrl_0, SCSI_BUS_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5709) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5710) (RD_HARPOON(p_port + hp_scsisig) | SCSI_MSG));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5712) WR_HARPOON(p_port + hp_scsisig, (RD_HARPOON(p_port + hp_scsisig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5713) & ~SCSI_BSY));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5715) FPT_Wait(p_port, TO_250ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5717) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5720) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5721) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5722) * Function: FPT_scbusf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5723) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5724) * Description: Release the SCSI bus and disable SCAM selection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5725) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5726) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5728) static void FPT_scbusf(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5730) WR_HARPOON(p_port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5731) (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5733) WR_HARPOON(p_port + hp_scsidata_0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5735) WR_HARPOON(p_port + hp_portctrl_0, (RD_HARPOON(p_port + hp_portctrl_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5736) & ~SCSI_BUS_EN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5738) WR_HARPOON(p_port + hp_scsisig, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5740) WR_HARPOON(p_port + hp_scsireset, (RD_HARPOON(p_port + hp_scsireset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5741) & ~SCAM_EN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5743) WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5744) | ACTdeassert));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5746) WRW_HARPOON((p_port + hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5748) WR_HARPOON(p_port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5749) (RD_HARPOON(p_port + hp_page_ctrl) & ~G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5752) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5753) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5754) * Function: FPT_scasid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5755) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5756) * Description: Assign an ID to all the SCAM devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5757) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5758) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5760) static void FPT_scasid(unsigned char p_card, u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5761) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5762) unsigned char temp_id_string[ID_STRING_LENGTH];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5764) unsigned char i, k, scam_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5765) unsigned char crcBytes[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5766) struct nvram_info *pCurrNvRam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5767) unsigned short *pCrcBytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5769) pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5771) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5773) while (!i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5775) for (k = 0; k < ID_STRING_LENGTH; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5776) temp_id_string[k] = (unsigned char)0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5779) FPT_scxferc(p_port, SYNC_PTRN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5780) FPT_scxferc(p_port, ASSIGN_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5782) if (!(FPT_sciso(p_port, &temp_id_string[0]))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5783) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5784) pCrcBytes = (unsigned short *)&crcBytes[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5785) *pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5786) crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5787) temp_id_string[1] = crcBytes[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5788) temp_id_string[2] = crcBytes[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5789) temp_id_string[3] = crcBytes[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5790) for (k = 4; k < ID_STRING_LENGTH; k++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5791) temp_id_string[k] = (unsigned char)0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5793) i = FPT_scmachid(p_card, temp_id_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5795) if (i == CLR_PRIORITY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5796) FPT_scxferc(p_port, MISC_CODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5797) FPT_scxferc(p_port, CLR_P_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5798) i = 0; /*Not the last ID yet. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5799) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5801) else if (i != NO_ID_AVAIL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5802) if (i < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5803) FPT_scxferc(p_port, ID_0_7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5804) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5805) FPT_scxferc(p_port, ID_8_F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5807) scam_id = (i & (unsigned char)0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5809) for (k = 1; k < 0x08; k <<= 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5810) if (!(k & i))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5811) scam_id += 0x08; /*Count number of zeros in DB0-3. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5813) FPT_scxferc(p_port, scam_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5815) i = 0; /*Not the last ID yet. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5819) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5820) i = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5823) } /*End while */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5825) FPT_scxferc(p_port, SYNC_PTRN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5826) FPT_scxferc(p_port, CFG_CMPLT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5829) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5830) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5831) * Function: FPT_scsel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5832) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5833) * Description: Select all the SCAM devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5834) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5835) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5837) static void FPT_scsel(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5838) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5840) WR_HARPOON(p_port + hp_scsisig, SCSI_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5841) FPT_scwiros(p_port, SCSI_MSG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5843) WR_HARPOON(p_port + hp_scsisig, (SCSI_SEL | SCSI_BSY));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5845) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5846) (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5847) WR_HARPOON(p_port + hp_scsidata_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5848) (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5849) (unsigned char)(BIT(7) + BIT(6))));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5851) WR_HARPOON(p_port + hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5852) FPT_scwiros(p_port, SCSI_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5854) WR_HARPOON(p_port + hp_scsidata_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5855) (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5856) ~(unsigned char)BIT(6)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5857) FPT_scwirod(p_port, BIT(6));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5859) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5860) (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5863) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5864) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5865) * Function: FPT_scxferc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5866) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5867) * Description: Handshake the p_data (DB4-0) across the bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5868) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5869) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5871) static unsigned char FPT_scxferc(u32 p_port, unsigned char p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5872) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5873) unsigned char curr_data, ret_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5875) curr_data = p_data | BIT(7) | BIT(5); /*Start with DB7 & DB5 asserted. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5877) WR_HARPOON(p_port + hp_scsidata_0, curr_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5879) curr_data &= ~BIT(7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5881) WR_HARPOON(p_port + hp_scsidata_0, curr_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5883) FPT_scwirod(p_port, BIT(7)); /*Wait for DB7 to be released. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5884) while (!(RD_HARPOON(p_port + hp_scsidata_0) & BIT(5))) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5886) ret_data = (RD_HARPOON(p_port + hp_scsidata_0) & (unsigned char)0x1F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5888) curr_data |= BIT(6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5890) WR_HARPOON(p_port + hp_scsidata_0, curr_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5892) curr_data &= ~BIT(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5894) WR_HARPOON(p_port + hp_scsidata_0, curr_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5896) FPT_scwirod(p_port, BIT(5)); /*Wait for DB5 to be released. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5898) curr_data &= ~(BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)); /*Release data bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5899) curr_data |= BIT(7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5901) WR_HARPOON(p_port + hp_scsidata_0, curr_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5903) curr_data &= ~BIT(6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5905) WR_HARPOON(p_port + hp_scsidata_0, curr_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5907) FPT_scwirod(p_port, BIT(6)); /*Wait for DB6 to be released. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5909) return ret_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5912) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5913) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5914) * Function: FPT_scsendi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5915) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5916) * Description: Transfer our Identification string to determine if we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5917) * will be the dominant master.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5918) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5919) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5921) static unsigned char FPT_scsendi(u32 p_port, unsigned char p_id_string[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5923) unsigned char ret_data, byte_cnt, bit_cnt, defer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5925) defer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5927) for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5929) for (bit_cnt = 0x80; bit_cnt != 0; bit_cnt >>= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5931) if (defer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5932) ret_data = FPT_scxferc(p_port, 00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5934) else if (p_id_string[byte_cnt] & bit_cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5936) ret_data = FPT_scxferc(p_port, 02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5938) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5940) ret_data = FPT_scxferc(p_port, 01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5941) if (ret_data & 02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5942) defer = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5945) if ((ret_data & 0x1C) == 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5946) return 0x00; /*End of isolation stage, we won! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5948) if (ret_data & 0x1C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5949) return 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5951) if ((defer) && (!(ret_data & 0x1F)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5952) return 0x01; /*End of isolation stage, we lost. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5954) } /*bit loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5956) } /*byte loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5958) if (defer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5959) return 0x01; /*We lost */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5960) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5961) return 0; /*We WON! Yeeessss! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5964) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5965) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5966) * Function: FPT_sciso
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5967) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5968) * Description: Transfer the Identification string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5969) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5970) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5972) static unsigned char FPT_sciso(u32 p_port, unsigned char p_id_string[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5973) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5974) unsigned char ret_data, the_data, byte_cnt, bit_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5976) the_data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5978) for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5980) for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5982) ret_data = FPT_scxferc(p_port, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5984) if (ret_data & 0xFC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5985) return 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5987) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5989) the_data <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5990) if (ret_data & BIT(1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5991) the_data |= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5995) if ((ret_data & 0x1F) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5996) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5997) if(bit_cnt != 0 || bit_cnt != 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5998) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5999) byte_cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6000) bit_cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6001) FPT_scxferc(p_port, SYNC_PTRN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6002) FPT_scxferc(p_port, ASSIGN_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6003) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6004) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6005) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6006) if (byte_cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6007) return 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6008) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6009) return 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6012) } /*bit loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6014) p_id_string[byte_cnt] = the_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6016) } /*byte loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6018) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6021) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6022) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6023) * Function: FPT_scwirod
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6024) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6025) * Description: Sample the SCSI data bus making sure the signal has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6026) * deasserted for the correct number of consecutive samples.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6027) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6028) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6030) static void FPT_scwirod(u32 p_port, unsigned char p_data_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6031) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6032) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6034) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6035) while (i < MAX_SCSI_TAR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6037) if (RD_HARPOON(p_port + hp_scsidata_0) & p_data_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6039) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6041) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6043) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6046) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6048) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6049) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6050) * Function: FPT_scwiros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6051) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6052) * Description: Sample the SCSI Signal lines making sure the signal has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6053) * deasserted for the correct number of consecutive samples.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6054) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6055) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6057) static void FPT_scwiros(u32 p_port, unsigned char p_data_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6058) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6059) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6061) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6062) while (i < MAX_SCSI_TAR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6064) if (RD_HARPOON(p_port + hp_scsisig) & p_data_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6066) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6068) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6070) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6075) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6076) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6077) * Function: FPT_scvalq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6078) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6079) * Description: Make sure we received a valid data byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6080) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6081) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6083) static unsigned char FPT_scvalq(unsigned char p_quintet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6084) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6085) unsigned char count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6087) for (count = 1; count < 0x08; count <<= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6088) if (!(p_quintet & count))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6089) p_quintet -= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6092) if (p_quintet & 0x18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6093) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6095) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6096) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6099) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6100) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6101) * Function: FPT_scsell
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6102) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6103) * Description: Select the specified device ID using a selection timeout
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6104) * less than 4ms. If somebody responds then it is a legacy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6105) * drive and this ID must be marked as such.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6106) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6107) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6109) static unsigned char FPT_scsell(u32 p_port, unsigned char targ_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6111) unsigned long i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6113) WR_HARPOON(p_port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6114) (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6116) ARAM_ACCESS(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6118) WR_HARPOON(p_port + hp_addstat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6119) (RD_HARPOON(p_port + hp_addstat) | SCAM_TIMER));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6120) WR_HARPOON(p_port + hp_seltimeout, TO_4ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6122) for (i = p_port + CMD_STRT; i < p_port + CMD_STRT + 12; i += 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6123) WRW_HARPOON(i, (MPM_OP + ACOMMAND));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6125) WRW_HARPOON(i, (BRH_OP + ALWAYS + NP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6127) WRW_HARPOON((p_port + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6128) (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6130) WR_HARPOON(p_port + hp_select_id, targ_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6132) WR_HARPOON(p_port + hp_portctrl_0, SCSI_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6133) WR_HARPOON(p_port + hp_autostart_3, (SELECT | CMD_ONLY_STRT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6134) WR_HARPOON(p_port + hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6136) while (!(RDW_HARPOON((p_port + hp_intstat)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6137) (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6140) if (RDW_HARPOON((p_port + hp_intstat)) & RESET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6141) FPT_Wait(p_port, TO_250ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6143) DISABLE_AUTO(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6145) WR_HARPOON(p_port + hp_addstat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6146) (RD_HARPOON(p_port + hp_addstat) & ~SCAM_TIMER));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6147) WR_HARPOON(p_port + hp_seltimeout, TO_290ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6149) SGRAM_ACCESS(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6151) if (RDW_HARPOON((p_port + hp_intstat)) & (RESET | TIMEOUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6153) WRW_HARPOON((p_port + hp_intstat),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6154) (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6156) WR_HARPOON(p_port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6157) (RD_HARPOON(p_port + hp_page_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6158) ~G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6160) return 0; /*No legacy device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6163) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6165) while (!(RDW_HARPOON((p_port + hp_intstat)) & BUS_FREE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6166) if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6167) WR_HARPOON(p_port + hp_scsisig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6168) (SCSI_ACK + S_ILL_PH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6169) ACCEPT_MSG(p_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6173) WRW_HARPOON((p_port + hp_intstat), CLR_ALL_INT_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6175) WR_HARPOON(p_port + hp_page_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6176) (RD_HARPOON(p_port + hp_page_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6177) ~G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6179) return 1; /*Found one of them oldies! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6183) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6184) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6185) * Function: FPT_scwtsel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6186) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6187) * Description: Wait to be selected by another SCAM initiator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6188) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6189) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6191) static void FPT_scwtsel(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6193) while (!(RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6197) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6198) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6199) * Function: FPT_inisci
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6200) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6201) * Description: Setup the data Structure with the info from the EEPROM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6202) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6203) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6205) static void FPT_inisci(unsigned char p_card, u32 p_port, unsigned char p_our_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6207) unsigned char i, k, max_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6208) unsigned short ee_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6209) struct nvram_info *pCurrNvRam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6211) pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6213) if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6214) max_id = 0x08;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6216) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6217) max_id = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6219) if (pCurrNvRam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6220) for (i = 0; i < max_id; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6222) for (k = 0; k < 4; k++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6223) FPT_scamInfo[i].id_string[k] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6224) pCurrNvRam->niScamTbl[i][k];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6225) for (k = 4; k < ID_STRING_LENGTH; k++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6226) FPT_scamInfo[i].id_string[k] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6227) (unsigned char)0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6229) if (FPT_scamInfo[i].id_string[0] == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6230) FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6231) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6232) FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6235) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6236) for (i = 0; i < max_id; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6237) for (k = 0; k < ID_STRING_LENGTH; k += 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6238) ee_data =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6239) FPT_utilEERead(p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6240) (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6241) short)((EE_SCAMBASE / 2) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6242) (unsigned short)(i *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6243) ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6244) FPT_scamInfo[i].id_string[k] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6245) (unsigned char)ee_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6246) ee_data >>= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6247) FPT_scamInfo[i].id_string[k + 1] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6248) (unsigned char)ee_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6251) if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6252) (FPT_scamInfo[i].id_string[0] == 0xFF))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6254) FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6256) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6257) FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6261) for (k = 0; k < ID_STRING_LENGTH; k++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6262) FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6266) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6267) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6268) * Function: FPT_scmachid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6269) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6270) * Description: Match the Device ID string with our values stored in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6271) * the EEPROM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6272) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6273) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6275) static unsigned char FPT_scmachid(unsigned char p_card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6276) unsigned char p_id_string[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6279) unsigned char i, k, match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6281) for (i = 0; i < MAX_SCSI_TAR; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6283) match = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6285) for (k = 0; k < ID_STRING_LENGTH; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6286) if (p_id_string[k] != FPT_scamInfo[i].id_string[k])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6287) match = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6290) if (match) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6291) FPT_scamInfo[i].state = ID_ASSIGNED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6292) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6297) if (p_id_string[0] & BIT(5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6298) i = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6299) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6300) i = MAX_SCSI_TAR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6302) if (((p_id_string[0] & 0x06) == 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6303) || ((p_id_string[0] & 0x06) == 0x04))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6304) match = p_id_string[1] & (unsigned char)0x1F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6305) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6306) match = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6308) while (i > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6309) i--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6311) if (FPT_scamInfo[match].state == ID_UNUSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6312) for (k = 0; k < ID_STRING_LENGTH; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6313) FPT_scamInfo[match].id_string[k] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6314) p_id_string[k];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6317) FPT_scamInfo[match].state = ID_ASSIGNED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6319) if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6320) FPT_BL_Card[p_card].globalFlags |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6321) F_UPDATE_EEPROM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6322) return match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6326) match--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6328) if (match == 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6329) if (p_id_string[0] & BIT(5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6330) match = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6331) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6332) match = MAX_SCSI_TAR - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6336) if (p_id_string[0] & BIT(7)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6337) return CLR_PRIORITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6340) if (p_id_string[0] & BIT(5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6341) i = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6342) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6343) i = MAX_SCSI_TAR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6345) if (((p_id_string[0] & 0x06) == 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6346) || ((p_id_string[0] & 0x06) == 0x04))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6347) match = p_id_string[1] & (unsigned char)0x1F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6348) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6349) match = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6351) while (i > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6353) i--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6355) if (FPT_scamInfo[match].state == ID_UNASSIGNED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6356) for (k = 0; k < ID_STRING_LENGTH; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6357) FPT_scamInfo[match].id_string[k] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6358) p_id_string[k];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6361) FPT_scamInfo[match].id_string[0] |= BIT(7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6362) FPT_scamInfo[match].state = ID_ASSIGNED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6363) if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6364) FPT_BL_Card[p_card].globalFlags |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6365) F_UPDATE_EEPROM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6366) return match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6370) match--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6372) if (match == 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6373) if (p_id_string[0] & BIT(5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6374) match = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6375) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6376) match = MAX_SCSI_TAR - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6380) return NO_ID_AVAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6383) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6384) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6385) * Function: FPT_scsavdi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6386) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6387) * Description: Save off the device SCAM ID strings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6388) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6389) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6391) static void FPT_scsavdi(unsigned char p_card, u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6393) unsigned char i, k, max_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6394) unsigned short ee_data, sum_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6396) sum_data = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6398) for (i = 1; i < EE_SCAMBASE / 2; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6399) sum_data += FPT_utilEERead(p_port, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6402) FPT_utilEEWriteOnOff(p_port, 1); /* Enable write access to the EEPROM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6404) if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6405) max_id = 0x08;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6407) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6408) max_id = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6410) for (i = 0; i < max_id; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6412) for (k = 0; k < ID_STRING_LENGTH; k += 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6413) ee_data = FPT_scamInfo[i].id_string[k + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6414) ee_data <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6415) ee_data |= FPT_scamInfo[i].id_string[k];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6416) sum_data += ee_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6417) FPT_utilEEWrite(p_port, ee_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6418) (unsigned short)((EE_SCAMBASE / 2) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6419) (unsigned short)(i *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6420) ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6424) FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6425) FPT_utilEEWriteOnOff(p_port, 0); /* Turn off write access */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6428) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6429) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6430) * Function: FPT_XbowInit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6431) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6432) * Description: Setup the Xbow for normal operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6433) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6434) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6436) static void FPT_XbowInit(u32 port, unsigned char ScamFlg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6438) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6440) i = RD_HARPOON(port + hp_page_ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6441) WR_HARPOON(port + hp_page_ctrl, (unsigned char)(i | G_INT_DISABLE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6443) WR_HARPOON(port + hp_scsireset, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6444) WR_HARPOON(port + hp_portctrl_1, HOST_MODE8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6446) WR_HARPOON(port + hp_scsireset, (DMA_RESET | HPSCSI_RESET | PROG_RESET |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6447) FIFO_CLR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6449) WR_HARPOON(port + hp_scsireset, SCSI_INI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6451) WR_HARPOON(port + hp_clkctrl_0, CLKCTRL_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6453) WR_HARPOON(port + hp_scsisig, 0x00); /* Clear any signals we might */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6454) WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6456) WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6458) FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6459) BUS_FREE | XFER_CNT_0 | AUTO_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6461) if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6462) FPT_default_intena |= SCAM_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6464) WRW_HARPOON((port + hp_intena), FPT_default_intena);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6466) WR_HARPOON(port + hp_seltimeout, TO_290ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6468) /* Turn on SCSI_MODE8 for narrow cards to fix the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6469) strapping issue with the DUAL CHANNEL card */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6470) if (RD_HARPOON(port + hp_page_ctrl) & NARROW_SCSI_CARD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6471) WR_HARPOON(port + hp_addstat, SCSI_MODE8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6473) WR_HARPOON(port + hp_page_ctrl, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6477) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6478) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6479) * Function: FPT_BusMasterInit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6480) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6481) * Description: Initialize the BusMaster for normal operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6482) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6483) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6485) static void FPT_BusMasterInit(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6488) WR_HARPOON(p_port + hp_sys_ctrl, DRVR_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6489) WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6491) WR_HARPOON(p_port + hp_host_blk_cnt, XFER_BLK64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6493) WR_HARPOON(p_port + hp_bm_ctrl, (BMCTRL_DEFAULT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6495) WR_HARPOON(p_port + hp_ee_ctrl, (SCSI_TERM_ENA_H));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6497) RD_HARPOON(p_port + hp_int_status); /*Clear interrupts. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6498) WR_HARPOON(p_port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6499) WR_HARPOON(p_port + hp_page_ctrl, (RD_HARPOON(p_port + hp_page_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6500) ~SCATTER_EN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6503) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6504) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6505) * Function: FPT_DiagEEPROM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6506) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6507) * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6508) * necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6509) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6510) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6512) static void FPT_DiagEEPROM(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6514) unsigned short index, temp, max_wd_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6516) if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6517) max_wd_cnt = EEPROM_WD_CNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6518) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6519) max_wd_cnt = EEPROM_WD_CNT * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6521) temp = FPT_utilEERead(p_port, FW_SIGNATURE / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6523) if (temp == 0x4641) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6525) for (index = 2; index < max_wd_cnt; index++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6527) temp += FPT_utilEERead(p_port, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6531) if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM / 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6533) return; /*EEPROM is Okay so return now! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6537) FPT_utilEEWriteOnOff(p_port, (unsigned char)1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6539) for (index = 0; index < max_wd_cnt; index++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6541) FPT_utilEEWrite(p_port, 0x0000, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6544) temp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6546) FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6547) temp += 0x4641;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6548) FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6549) temp += 0x3920;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6550) FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6551) temp += 0x3033;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6552) FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6553) temp += 0x2020;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6554) FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6555) temp += 0x70D3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6556) FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6557) temp += 0x0010;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6558) FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6559) temp += 0x0003;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6560) FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6561) temp += 0x0007;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6563) FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6564) temp += 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6565) FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6566) temp += 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6567) FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6568) temp += 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6570) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6571) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6572) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6573) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6574) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6575) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6576) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6577) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6578) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6579) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6580) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6581) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6582) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6583) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6584) FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6585) temp += 0x4242;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6587) FPT_utilEEWrite(p_port, 0x6C46, 64 / 2); /*PRODUCT ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6588) temp += 0x6C46;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6589) FPT_utilEEWrite(p_port, 0x7361, 66 / 2); /* FlashPoint LT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6590) temp += 0x7361;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6591) FPT_utilEEWrite(p_port, 0x5068, 68 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6592) temp += 0x5068;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6593) FPT_utilEEWrite(p_port, 0x696F, 70 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6594) temp += 0x696F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6595) FPT_utilEEWrite(p_port, 0x746E, 72 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6596) temp += 0x746E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6597) FPT_utilEEWrite(p_port, 0x4C20, 74 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6598) temp += 0x4C20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6599) FPT_utilEEWrite(p_port, 0x2054, 76 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6600) temp += 0x2054;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6601) FPT_utilEEWrite(p_port, 0x2020, 78 / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6602) temp += 0x2020;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6604) index = ((EE_SCAMBASE / 2) + (7 * 16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6605) FPT_utilEEWrite(p_port, (0x0700 + TYPE_CODE0), index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6606) temp += (0x0700 + TYPE_CODE0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6607) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6608) FPT_utilEEWrite(p_port, 0x5542, index); /*Vendor ID code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6609) temp += 0x5542; /* BUSLOGIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6610) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6611) FPT_utilEEWrite(p_port, 0x4C53, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6612) temp += 0x4C53;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6613) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6614) FPT_utilEEWrite(p_port, 0x474F, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6615) temp += 0x474F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6616) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6617) FPT_utilEEWrite(p_port, 0x4349, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6618) temp += 0x4349;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6619) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6620) FPT_utilEEWrite(p_port, 0x5442, index); /*Vendor unique code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6621) temp += 0x5442; /* BT- 930 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6622) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6623) FPT_utilEEWrite(p_port, 0x202D, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6624) temp += 0x202D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6625) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6626) FPT_utilEEWrite(p_port, 0x3339, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6627) temp += 0x3339;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6628) index++; /*Serial # */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6629) FPT_utilEEWrite(p_port, 0x2030, index); /* 01234567 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6630) temp += 0x2030;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6631) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6632) FPT_utilEEWrite(p_port, 0x5453, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6633) temp += 0x5453;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6634) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6635) FPT_utilEEWrite(p_port, 0x5645, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6636) temp += 0x5645;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6637) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6638) FPT_utilEEWrite(p_port, 0x2045, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6639) temp += 0x2045;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6640) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6641) FPT_utilEEWrite(p_port, 0x202F, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6642) temp += 0x202F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6643) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6644) FPT_utilEEWrite(p_port, 0x4F4A, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6645) temp += 0x4F4A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6646) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6647) FPT_utilEEWrite(p_port, 0x204E, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6648) temp += 0x204E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6649) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6650) FPT_utilEEWrite(p_port, 0x3539, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6651) temp += 0x3539;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6653) FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6655) FPT_utilEEWriteOnOff(p_port, (unsigned char)0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6659) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6660) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6661) * Function: Queue Search Select
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6662) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6663) * Description: Try to find a new command to execute.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6664) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6665) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6667) static void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6668) unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6670) unsigned char scan_ptr, lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6671) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6672) struct sccb *pOldSccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6674) scan_ptr = pCurrCard->scanIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6675) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6676) currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6677) if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6678) ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6679) TAG_Q_TRYING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6680) if (currTar_Info->TarSelQ_Cnt != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6682) scan_ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6683) if (scan_ptr == MAX_SCSI_TAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6684) scan_ptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6686) for (lun = 0; lun < MAX_LUN; lun++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6687) if (currTar_Info->TarLUNBusy[lun] == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6689) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6690) currTar_Info->TarSelQ_Head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6691) pOldSccb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6693) while ((pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6694) currentSCCB != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6695) && (lun !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6696) pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6697) currentSCCB->Lun)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6698) pOldSccb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6699) pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6700) currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6701) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6702) (struct sccb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6703) *)(pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6704) currentSCCB)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6705) Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6707) if (pCurrCard->currentSCCB ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6708) NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6709) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6710) if (pOldSccb != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6711) pOldSccb->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6712) Sccb_forwardlink =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6713) (struct sccb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6714) *)(pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6715) currentSCCB)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6716) Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6717) pOldSccb->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6718) Sccb_backlink =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6719) (struct sccb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6720) *)(pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6721) currentSCCB)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6722) Sccb_backlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6723) currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6724) TarSelQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6725) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6726) currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6727) TarSelQ_Head =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6728) (struct sccb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6729) *)(pCurrCard->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6730) currentSCCB)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6731) Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6733) if (currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6734) TarSelQ_Head ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6735) NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6736) currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6737) TarSelQ_Tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6738) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6739) currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6740) TarSelQ_Cnt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6741) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6742) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6743) currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6744) TarSelQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6745) currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6746) TarSelQ_Head->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6747) Sccb_backlink
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6748) =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6749) (struct sccb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6750) *)NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6753) pCurrCard->scanIndex = scan_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6755) pCurrCard->globalFlags |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6756) F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6758) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6763) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6764) scan_ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6765) if (scan_ptr == MAX_SCSI_TAR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6766) scan_ptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6770) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6771) if ((currTar_Info->TarSelQ_Cnt != 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6772) (currTar_Info->TarLUNBusy[0] == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6774) pCurrCard->currentSCCB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6775) currTar_Info->TarSelQ_Head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6777) currTar_Info->TarSelQ_Head =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6778) (struct sccb *)(pCurrCard->currentSCCB)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6779) Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6781) if (currTar_Info->TarSelQ_Head == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6782) currTar_Info->TarSelQ_Tail = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6783) currTar_Info->TarSelQ_Cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6784) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6785) currTar_Info->TarSelQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6786) currTar_Info->TarSelQ_Head->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6787) Sccb_backlink = (struct sccb *)NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6790) scan_ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6791) if (scan_ptr == MAX_SCSI_TAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6792) scan_ptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6794) pCurrCard->scanIndex = scan_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6796) pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6798) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6799) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6801) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6802) scan_ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6803) if (scan_ptr == MAX_SCSI_TAR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6804) scan_ptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6808) } while (scan_ptr != pCurrCard->scanIndex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6811) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6812) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6813) * Function: Queue Select Fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6814) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6815) * Description: Add the current SCCB to the head of the Queue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6816) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6817) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6819) static void FPT_queueSelectFail(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6820) unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6821) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6822) unsigned char thisTarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6823) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6825) if (pCurrCard->currentSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6826) thisTarg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6827) (unsigned char)(((struct sccb *)(pCurrCard->currentSCCB))->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6828) TargID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6829) currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6831) pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6833) pCurrCard->currentSCCB->Sccb_forwardlink =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6834) currTar_Info->TarSelQ_Head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6836) if (currTar_Info->TarSelQ_Cnt == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6837) currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6840) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6841) currTar_Info->TarSelQ_Head->Sccb_backlink =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6842) pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6843) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6845) currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6847) pCurrCard->currentSCCB = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6848) currTar_Info->TarSelQ_Cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6852) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6853) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6854) * Function: Queue Command Complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6855) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6856) * Description: Call the callback function with the current SCCB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6857) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6858) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6860) static void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6861) struct sccb *p_sccb, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6862) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6864) unsigned char i, SCSIcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6865) CALL_BK_FN callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6866) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6868) SCSIcmd = p_sccb->Cdb[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6870) if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6872) if ((p_sccb->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6873) ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6874) && (p_sccb->HostStatus == SCCB_COMPLETE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6875) && (p_sccb->TargetStatus != SSCHECK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6877) if ((SCSIcmd == SCSI_READ) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6878) (SCSIcmd == SCSI_WRITE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6879) (SCSIcmd == SCSI_READ_EXTENDED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6880) (SCSIcmd == SCSI_WRITE_EXTENDED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6881) (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6882) (SCSIcmd == SCSI_START_STOP_UNIT) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6883) (pCurrCard->globalFlags & F_NO_FILTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6884) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6885) p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6888) if (p_sccb->SccbStatus == SCCB_IN_PROCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6889) if (p_sccb->HostStatus || p_sccb->TargetStatus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6890) p_sccb->SccbStatus = SCCB_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6891) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6892) p_sccb->SccbStatus = SCCB_SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6895) if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6897) p_sccb->CdbLength = p_sccb->Save_CdbLen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6898) for (i = 0; i < 6; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6899) p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6903) if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6904) (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6906) FPT_utilUpdateResidual(p_sccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6909) pCurrCard->cmdCounter--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6910) if (!pCurrCard->cmdCounter) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6912) if (pCurrCard->globalFlags & F_GREEN_PC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6913) WR_HARPOON(pCurrCard->ioPort + hp_clkctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6914) (PWR_DWN | CLKCTRL_DEFAULT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6915) WR_HARPOON(pCurrCard->ioPort + hp_sys_ctrl, STOP_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6918) WR_HARPOON(pCurrCard->ioPort + hp_semaphore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6919) (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6920) ~SCCB_MGR_ACTIVE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6924) if (pCurrCard->discQCount != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6925) currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6926) if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6927) ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6928) TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6929) pCurrCard->discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6930) pCurrCard->discQ_Tbl[currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6931) LunDiscQ_Idx[p_sccb->Lun]] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6932) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6933) if (p_sccb->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6934) pCurrCard->discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6935) pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6936) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6937) pCurrCard->discQCount--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6938) pCurrCard->discQ_Tbl[currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6939) LunDiscQ_Idx[0]] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6945) callback = (CALL_BK_FN) p_sccb->SccbCallback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6946) callback(p_sccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6947) pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6948) pCurrCard->currentSCCB = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6951) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6952) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6953) * Function: Queue Disconnect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6954) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6955) * Description: Add SCCB to our disconnect array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6956) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6957) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6958) static void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6959) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6960) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6962) currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6964) if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6965) ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6966) FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6967) LunDiscQ_Idx[p_sccb->Lun]] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6968) p_sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6969) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6970) if (p_sccb->Sccb_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6971) FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6972) p_sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6973) FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6974) 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6975) FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6976) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6977) FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6978) LunDiscQ_Idx[0]] = p_sccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6981) FPT_BL_Card[p_card].currentSCCB = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6984) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6985) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6986) * Function: Queue Flush SCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6987) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6988) * Description: Flush all SCCB's back to the host driver for this target.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6989) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6990) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6992) static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6993) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6994) unsigned char qtag, thisTarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6995) struct sccb *currSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6996) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6998) currSCCB = FPT_BL_Card[p_card].currentSCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6999) if (currSCCB != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7000) thisTarg = (unsigned char)currSCCB->TargID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7001) currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7003) for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7005) if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7006) (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7007) thisTarg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7009) FPT_BL_Card[p_card].discQ_Tbl[qtag]->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7010) HostStatus = (unsigned char)error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7012) FPT_queueCmdComplete(&FPT_BL_Card[p_card],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7013) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7014) discQ_Tbl[qtag], p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7016) FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7017) currTar_Info->TarTagQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7023) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7025) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7026) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7027) * Function: Queue Flush Target SCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7028) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7029) * Description: Flush all SCCB's back to the host driver for this target.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7030) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7031) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7033) static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7034) unsigned char error_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7035) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7036) unsigned char qtag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7037) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7039) currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7041) for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7043) if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7044) (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7046) FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7047) (unsigned char)error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7049) FPT_queueCmdComplete(&FPT_BL_Card[p_card],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7050) FPT_BL_Card[p_card].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7051) discQ_Tbl[qtag], p_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7053) FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7054) currTar_Info->TarTagQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7061) static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7062) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7063) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7064) currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7066) p_SCCB->Sccb_forwardlink = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7068) p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7070) if (currTar_Info->TarSelQ_Cnt == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7072) currTar_Info->TarSelQ_Head = p_SCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7075) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7077) currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7080) currTar_Info->TarSelQ_Tail = p_SCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7081) currTar_Info->TarSelQ_Cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7082) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7084) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7085) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7086) * Function: Queue Find SCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7087) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7088) * Description: Search the target select Queue for this SCCB, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7089) * remove it if found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7090) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7091) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7093) static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7094) unsigned char p_card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7095) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7096) struct sccb *q_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7097) struct sccb_mgr_tar_info *currTar_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7099) currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7101) q_ptr = currTar_Info->TarSelQ_Head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7103) while (q_ptr != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7105) if (q_ptr == p_SCCB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7107) if (currTar_Info->TarSelQ_Head == q_ptr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7109) currTar_Info->TarSelQ_Head =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7110) q_ptr->Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7113) if (currTar_Info->TarSelQ_Tail == q_ptr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7115) currTar_Info->TarSelQ_Tail =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7116) q_ptr->Sccb_backlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7119) if (q_ptr->Sccb_forwardlink != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7120) q_ptr->Sccb_forwardlink->Sccb_backlink =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7121) q_ptr->Sccb_backlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7124) if (q_ptr->Sccb_backlink != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7125) q_ptr->Sccb_backlink->Sccb_forwardlink =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7126) q_ptr->Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7129) currTar_Info->TarSelQ_Cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7131) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7134) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7135) q_ptr = q_ptr->Sccb_forwardlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7139) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7143) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7144) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7145) * Function: Utility Update Residual Count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7146) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7147) * Description: Update the XferCnt to the remaining byte count.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7148) * If we transferred all the data then just write zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7149) * If Non-SG transfer then report Total Cnt - Actual Transfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7150) * Cnt. For SG transfers add the count fields of all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7151) * remaining SG elements, as well as any partial remaining
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7152) * element.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7153) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7154) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7156) static void FPT_utilUpdateResidual(struct sccb *p_SCCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7158) unsigned long partial_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7159) unsigned int sg_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7160) struct blogic_sg_seg *segp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7162) if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7164) p_SCCB->DataLength = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7167) else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7169) partial_cnt = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7171) sg_index = p_SCCB->Sccb_sgseg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7174) if (p_SCCB->Sccb_SGoffset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7176) partial_cnt = p_SCCB->Sccb_SGoffset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7177) sg_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7180) while (((unsigned long)sg_index *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7181) (unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7182) segp = (struct blogic_sg_seg *)(p_SCCB->DataPointer) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7183) (sg_index * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7184) partial_cnt += segp->segbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7185) sg_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7188) p_SCCB->DataLength = partial_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7191) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7193) p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7197) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7198) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7199) * Function: Wait 1 Second
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7200) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7201) * Description: Wait for 1 second.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7202) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7203) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7205) static void FPT_Wait1Second(u32 p_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7207) unsigned char i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7209) for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7211) FPT_Wait(p_port, TO_250ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7213) if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7214) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7216) if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7217) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7221) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7222) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7223) * Function: FPT_Wait
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7224) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7225) * Description: Wait the desired delay.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7226) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7227) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7229) static void FPT_Wait(u32 p_port, unsigned char p_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7231) unsigned char old_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7232) unsigned char green_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7234) old_timer = RD_HARPOON(p_port + hp_seltimeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7236) green_flag = RD_HARPOON(p_port + hp_clkctrl_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7237) WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7239) WR_HARPOON(p_port + hp_seltimeout, p_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7240) WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7241) WRW_HARPOON((p_port + hp_intena), (FPT_default_intena & ~TIMEOUT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7243) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7244) (RD_HARPOON(p_port + hp_portctrl_0) | START_TO));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7246) while (!(RDW_HARPOON((p_port + hp_intstat)) & TIMEOUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7248) if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7249) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7251) if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7255) WR_HARPOON(p_port + hp_portctrl_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7256) (RD_HARPOON(p_port + hp_portctrl_0) & ~START_TO));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7258) WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7259) WRW_HARPOON((p_port + hp_intena), FPT_default_intena);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7261) WR_HARPOON(p_port + hp_clkctrl_0, green_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7263) WR_HARPOON(p_port + hp_seltimeout, old_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7266) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7267) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7268) * Function: Enable/Disable Write to EEPROM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7269) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7270) * Description: The EEPROM must first be enabled for writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7271) * A total of 9 clocks are needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7272) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7273) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7275) static void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7276) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7277) unsigned char ee_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7279) ee_value =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7280) (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7281) (EXT_ARB_ACK | SCSI_TERM_ENA_H));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7283) if (p_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7285) FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7287) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7289) FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7291) WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7292) WR_HARPOON(p_port + hp_ee_ctrl, ee_value); /*Turn off Master Select */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7295) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7296) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7297) * Function: Write EEPROM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7298) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7299) * Description: Write a word to the EEPROM at the specified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7300) * address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7301) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7302) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7304) static void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7305) unsigned short ee_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7308) unsigned char ee_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7309) unsigned short i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7311) ee_value =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7312) (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7313) char)((RD_HARPOON(p_port + hp_ee_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7314) (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7316) FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7318) ee_value |= (SEE_MS + SEE_CS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7320) for (i = 0x8000; i != 0; i >>= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7322) if (i & ee_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7323) ee_value |= SEE_DO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7324) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7325) ee_value &= ~SEE_DO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7327) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7328) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7329) ee_value |= SEE_CLK; /* Clock data! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7330) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7331) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7332) ee_value &= ~SEE_CLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7333) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7334) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7336) ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7337) WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7339) FPT_Wait(p_port, TO_10ms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7341) WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7342) WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS)); /* Turn off CS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7343) WR_HARPOON(p_port + hp_ee_ctrl, ee_value); /* Turn off Master Select */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7346) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7347) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7348) * Function: Read EEPROM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7349) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7350) * Description: Read a word from the EEPROM at the desired
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7351) * address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7352) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7353) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7355) static unsigned short FPT_utilEERead(u32 p_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7356) unsigned short ee_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7358) unsigned short i, ee_data1, ee_data2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7360) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7361) ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7362) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7363) ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7365) if (ee_data1 == ee_data2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7366) return ee_data1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7368) ee_data1 = ee_data2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7369) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7371) } while (i < 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7373) return ee_data1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7376) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7377) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7378) * Function: Read EEPROM Original
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7379) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7380) * Description: Read a word from the EEPROM at the desired
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7381) * address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7382) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7383) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7385) static unsigned short FPT_utilEEReadOrg(u32 p_port, unsigned short ee_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7386) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7388) unsigned char ee_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7389) unsigned short i, ee_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7391) ee_value =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7392) (unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7393) char)((RD_HARPOON(p_port + hp_ee_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7394) (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7396) FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7398) ee_value |= (SEE_MS + SEE_CS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7399) ee_data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7401) for (i = 1; i <= 16; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7403) ee_value |= SEE_CLK; /* Clock data! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7404) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7405) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7406) ee_value &= ~SEE_CLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7407) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7408) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7410) ee_data <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7412) if (RD_HARPOON(p_port + hp_ee_ctrl) & SEE_DI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7413) ee_data |= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7416) ee_value &= ~(SEE_MS + SEE_CS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7417) WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7418) WR_HARPOON(p_port + hp_ee_ctrl, ee_value); /*Turn off Master Select */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7420) return ee_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7423) /*---------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7424) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7425) * Function: Send EE command and Address to the EEPROM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7426) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7427) * Description: Transfers the correct command and sends the address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7428) * to the eeprom.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7429) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7430) *---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7432) static void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7433) unsigned short ee_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7435) unsigned char ee_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7436) unsigned char narrow_flg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7438) unsigned short i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7440) narrow_flg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7441) (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7442) NARROW_SCSI_CARD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7444) ee_value = SEE_MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7445) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7447) ee_value |= SEE_CS; /* Set CS to EEPROM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7448) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7450) for (i = 0x04; i != 0; i >>= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7452) if (i & ee_cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7453) ee_value |= SEE_DO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7454) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7455) ee_value &= ~SEE_DO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7457) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7458) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7459) ee_value |= SEE_CLK; /* Clock data! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7460) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7461) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7462) ee_value &= ~SEE_CLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7463) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7464) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7467) if (narrow_flg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7468) i = 0x0080;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7470) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7471) i = 0x0200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7473) while (i != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7475) if (i & ee_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7476) ee_value |= SEE_DO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7477) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7478) ee_value &= ~SEE_DO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7480) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7481) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7482) ee_value |= SEE_CLK; /* Clock data! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7483) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7484) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7485) ee_value &= ~SEE_CLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7486) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7487) WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7489) i >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7493) static unsigned short FPT_CalcCrc16(unsigned char buffer[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7494) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7495) unsigned short crc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7496) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7497) unsigned short ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7498) for (i = 0; i < ID_STRING_LENGTH; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7499) ch = (unsigned short)buffer[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7500) for (j = 0; j < 8; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7501) if ((crc ^ ch) & 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7502) crc = (crc >> 1) ^ CRCMASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7503) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7504) crc >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7505) ch >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7508) return crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7511) static unsigned char FPT_CalcLrc(unsigned char buffer[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7513) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7514) unsigned char lrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7515) lrc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7516) for (i = 0; i < ID_STRING_LENGTH; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7517) lrc ^= buffer[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7518) return lrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7521) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7522) The following inline definitions avoid type conflicts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7523) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7525) static inline unsigned char
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7526) FlashPoint__ProbeHostAdapter(struct fpoint_info *FlashPointInfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7528) return FlashPoint_ProbeHostAdapter((struct sccb_mgr_info *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7529) FlashPointInfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7532) static inline void *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7533) FlashPoint__HardwareResetHostAdapter(struct fpoint_info *FlashPointInfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7534) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7535) return FlashPoint_HardwareResetHostAdapter((struct sccb_mgr_info *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7536) FlashPointInfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7539) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7540) FlashPoint__ReleaseHostAdapter(void *CardHandle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7542) FlashPoint_ReleaseHostAdapter(CardHandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7545) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7546) FlashPoint__StartCCB(void *CardHandle, struct blogic_ccb *CCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7548) FlashPoint_StartCCB(CardHandle, (struct sccb *)CCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7551) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7552) FlashPoint__AbortCCB(void *CardHandle, struct blogic_ccb *CCB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7554) FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7557) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7558) FlashPoint__InterruptPending(void *CardHandle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7559) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7560) return FlashPoint_InterruptPending(CardHandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7563) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7564) FlashPoint__HandleInterrupt(void *CardHandle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7565) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7566) return FlashPoint_HandleInterrupt(CardHandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7569) #define FlashPoint_ProbeHostAdapter FlashPoint__ProbeHostAdapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7570) #define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7571) #define FlashPoint_ReleaseHostAdapter FlashPoint__ReleaseHostAdapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7572) #define FlashPoint_StartCCB FlashPoint__StartCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7573) #define FlashPoint_AbortCCB FlashPoint__AbortCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7574) #define FlashPoint_InterruptPending FlashPoint__InterruptPending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7575) #define FlashPoint_HandleInterrupt FlashPoint__HandleInterrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7577) #else /* !CONFIG_SCSI_FLASHPOINT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7579) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7580) Define prototypes for the FlashPoint SCCB Manager Functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7581) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7583) extern unsigned char FlashPoint_ProbeHostAdapter(struct fpoint_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7584) extern void *FlashPoint_HardwareResetHostAdapter(struct fpoint_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7585) extern void FlashPoint_StartCCB(void *, struct blogic_ccb *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7586) extern int FlashPoint_AbortCCB(void *, struct blogic_ccb *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7587) extern bool FlashPoint_InterruptPending(void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7588) extern int FlashPoint_HandleInterrupt(void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7589) extern void FlashPoint_ReleaseHostAdapter(void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7591) #endif /* CONFIG_SCSI_FLASHPOINT */