Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */