flashpoint.c

来自「linux 内核源代码」· C语言 代码 · 共 2,263 行 · 第 1/5 页

C
2,263
字号
/*  FlashPoint.c -- FlashPoint SCCB Manager for Linux  This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint  Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for  Linux compatibility.  It was provided by BusLogic in the form of 16 separate  source files, which would have unnecessarily cluttered the scsi directory, so  the individual files have been combined into this single file.  Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved  This file is available under both the GNU General Public License  and a BSD-style copyright; see LICENSE.FlashPoint for details.*/#ifndef CONFIG_SCSI_OMIT_FLASHPOINT#define MAX_CARDS	8#undef BUSTYPE_PCI#define CRCMASK	0xA001#define FAILURE         0xFFFFFFFFLstruct sccb;typedef void (*CALL_BK_FN) (struct sccb *);struct sccb_mgr_info {	unsigned long si_baseaddr;	unsigned char si_present;	unsigned char si_intvect;	unsigned char si_id;	unsigned char si_lun;	unsigned short si_fw_revision;	unsigned short si_per_targ_init_sync;	unsigned short si_per_targ_fast_nego;	unsigned short si_per_targ_ultra_nego;	unsigned short si_per_targ_no_disc;	unsigned short si_per_targ_wide_nego;	unsigned short si_flags;	unsigned char si_card_family;	unsigned char si_bustype;	unsigned char si_card_model[3];	unsigned char si_relative_cardnum;	unsigned char si_reserved[4];	unsigned long si_OS_reserved;	unsigned char si_XlatInfo[4];	unsigned long si_reserved2[5];	unsigned long si_secondary_range;};#define SCSI_PARITY_ENA		  0x0001#define LOW_BYTE_TERM		  0x0010#define HIGH_BYTE_TERM		  0x0020#define BUSTYPE_PCI	  0x3#define SUPPORT_16TAR_32LUN	  0x0002#define SOFT_RESET		  0x0004#define EXTENDED_TRANSLATION	  0x0008#define POST_ALL_UNDERRRUNS	  0x0040#define FLAG_SCAM_ENABLED	  0x0080#define FLAG_SCAM_LEVEL2	  0x0100#define HARPOON_FAMILY        0x02/* SCCB struct used for both SCCB and UCB manager compiles!  * The UCB Manager treats the SCCB as it's 'native hardware structure'  */#pragma pack(1)struct sccb {	unsigned char OperationCode;	unsigned char ControlByte;	unsigned char CdbLength;	unsigned char RequestSenseLength;	unsigned long DataLength;	unsigned long DataPointer;	unsigned char CcbRes[2];	unsigned char HostStatus;	unsigned char TargetStatus;	unsigned char TargID;	unsigned char Lun;	unsigned char Cdb[12];	unsigned char CcbRes1;	unsigned char Reserved1;	unsigned long Reserved2;	unsigned long SensePointer;	CALL_BK_FN SccbCallback;	/* VOID (*SccbCallback)(); */	unsigned long SccbIOPort;	/* Identifies board base port */	unsigned char SccbStatus;	unsigned char SCCBRes2;	unsigned short SccbOSFlags;	unsigned long Sccb_XferCnt;	/* actual transfer count */	unsigned long Sccb_ATC;	unsigned long SccbVirtDataPtr;	/* virtual addr for OS/2 */	unsigned long Sccb_res1;	unsigned short Sccb_MGRFlags;	unsigned short Sccb_sgseg;	unsigned char Sccb_scsimsg;	/* identify msg for selection */	unsigned char Sccb_tag;	unsigned char Sccb_scsistat;	unsigned char Sccb_idmsg;	/* image of last msg in */	struct sccb *Sccb_forwardlink;	struct sccb *Sccb_backlink;	unsigned long Sccb_savedATC;	unsigned char Save_Cdb[6];	unsigned char Save_CdbLen;	unsigned char Sccb_XferState;	unsigned long Sccb_SGoffset;};#pragma pack()#define SCATTER_GATHER_COMMAND    0x02#define RESIDUAL_COMMAND          0x03#define RESIDUAL_SG_COMMAND       0x04#define RESET_COMMAND             0x81#define F_USE_CMD_Q              0x20	/*Inidcates TAGGED command. */#define TAG_TYPE_MASK            0xC0	/*Type of tag msg to send. */#define SCCB_DATA_XFER_OUT       0x10	/* Write */#define SCCB_DATA_XFER_IN        0x08	/* Read */#define NO_AUTO_REQUEST_SENSE    0x01	/* No Request Sense Buffer */#define BUS_FREE_ST     0#define SELECT_ST       1#define SELECT_BDR_ST   2	/* Select w\ Bus Device Reset */#define SELECT_SN_ST    3	/* Select w\ Sync Nego */#define SELECT_WN_ST    4	/* Select w\ Wide Data Nego */#define SELECT_Q_ST     5	/* Select w\ Tagged Q'ing */#define COMMAND_ST      6#define DATA_OUT_ST     7#define DATA_IN_ST      8#define DISCONNECT_ST   9#define ABORT_ST        11#define F_HOST_XFER_DIR                0x01#define F_ALL_XFERRED                  0x02#define F_SG_XFER                      0x04#define F_AUTO_SENSE                   0x08#define F_ODD_BALL_CNT                 0x10#define F_NO_DATA_YET                  0x80#define F_STATUSLOADED                 0x01#define F_DEV_SELECTED                 0x04#define SCCB_COMPLETE               0x00	/* SCCB completed without error */#define SCCB_DATA_UNDER_RUN         0x0C#define SCCB_SELECTION_TIMEOUT      0x11	/* Set SCSI selection timed out */#define SCCB_DATA_OVER_RUN          0x12#define SCCB_PHASE_SEQUENCE_FAIL    0x14	/* Target bus phase sequence failure */#define SCCB_GROSS_FW_ERR           0x27	/* Major problem! */#define SCCB_BM_ERR                 0x30	/* BusMaster error. */#define SCCB_PARITY_ERR             0x34	/* SCSI parity error */#define SCCB_IN_PROCESS            0x00#define SCCB_SUCCESS               0x01#define SCCB_ABORT                 0x02#define SCCB_ERROR                 0x04#define  ORION_FW_REV      3110#define QUEUE_DEPTH     254+1	/*1 for Normal disconnect 32 for Q'ing. */#define	MAX_MB_CARDS	4	/* Max. no of cards suppoerted on Mother Board */#define MAX_SCSI_TAR    16#define MAX_LUN         32#define LUN_MASK			0x1f#define SG_BUF_CNT      16	/*Number of prefetched elements. */#define SG_ELEMENT_SIZE 8	/*Eight byte per element. */#define RD_HARPOON(ioport)          inb((u32)ioport)#define RDW_HARPOON(ioport)         inw((u32)ioport)#define RD_HARP32(ioport,offset,data) (data = inl((u32)(ioport + offset)))#define WR_HARPOON(ioport,val)      outb((u8) val, (u32)ioport)#define WRW_HARPOON(ioport,val)       outw((u16)val, (u32)ioport)#define WR_HARP32(ioport,offset,data)  outl(data, (u32)(ioport + offset))#define  TAR_SYNC_MASK     (BIT(7)+BIT(6))#define  SYNC_TRYING               BIT(6)#define  SYNC_SUPPORTED    (BIT(7)+BIT(6))#define  TAR_WIDE_MASK     (BIT(5)+BIT(4))#define  WIDE_ENABLED              BIT(4)#define  WIDE_NEGOCIATED   BIT(5)#define  TAR_TAG_Q_MASK    (BIT(3)+BIT(2))#define  TAG_Q_TRYING              BIT(2)#define  TAG_Q_REJECT      BIT(3)#define  TAR_ALLOW_DISC    BIT(0)#define  EE_SYNC_MASK      (BIT(0)+BIT(1))#define  EE_SYNC_5MB       BIT(0)#define  EE_SYNC_10MB      BIT(1)#define  EE_SYNC_20MB      (BIT(0)+BIT(1))#define  EE_WIDE_SCSI      BIT(7)struct sccb_mgr_tar_info {	struct sccb *TarSelQ_Head;	struct sccb *TarSelQ_Tail;	unsigned char TarLUN_CA;	/*Contingent Allgiance */	unsigned char TarTagQ_Cnt;	unsigned char TarSelQ_Cnt;	unsigned char TarStatus;	unsigned char TarEEValue;	unsigned char TarSyncCtrl;	unsigned char TarReserved[2];	/* for alignment */	unsigned char LunDiscQ_Idx[MAX_LUN];	unsigned char TarLUNBusy[MAX_LUN];};struct nvram_info {	unsigned char niModel;	/* Model No. of card */	unsigned char niCardNo;	/* Card no. */	unsigned long niBaseAddr;	/* Port Address of card */	unsigned char niSysConf;	/* Adapter Configuration byte - Byte 16 of eeprom map */	unsigned char niScsiConf;	/* SCSI Configuration byte - Byte 17 of eeprom map */	unsigned char niScamConf;	/* SCAM Configuration byte - Byte 20 of eeprom map */	unsigned char niAdapId;	/* Host Adapter ID - Byte 24 of eerpom map */	unsigned char niSyncTbl[MAX_SCSI_TAR / 2];	/* Sync/Wide byte of targets */	unsigned char niScamTbl[MAX_SCSI_TAR][4];	/* Compressed Scam name string of Targets */};#define	MODEL_LT		1#define	MODEL_DL		2#define	MODEL_LW		3#define	MODEL_DW		4struct sccb_card {	struct sccb *currentSCCB;	struct sccb_mgr_info *cardInfo;	unsigned long ioPort;	unsigned short cmdCounter;	unsigned char discQCount;	unsigned char tagQ_Lst;	unsigned char cardIndex;	unsigned char scanIndex;	unsigned char globalFlags;	unsigned char ourId;	struct nvram_info *pNvRamInfo;	struct sccb *discQ_Tbl[QUEUE_DEPTH];};#define F_TAG_STARTED		0x01#define F_CONLUN_IO			0x02#define F_DO_RENEGO			0x04#define F_NO_FILTER			0x08#define F_GREEN_PC			0x10#define F_HOST_XFER_ACT		0x20#define F_NEW_SCCB_CMD		0x40#define F_UPDATE_EEPROM		0x80#define  ID_STRING_LENGTH  32#define  TYPE_CODE0        0x63	/*Level2 Mstr (bits 7-6),  */#define  SLV_TYPE_CODE0    0xA3	/*Priority Bit set (bits 7-6),  */#define  ASSIGN_ID   0x00#define  SET_P_FLAG  0x01#define  CFG_CMPLT   0x03#define  DOM_MSTR    0x0F#define  SYNC_PTRN   0x1F#define  ID_0_7      0x18#define  ID_8_F      0x11#define  MISC_CODE   0x14#define  CLR_P_FLAG  0x18#define  INIT_SELTD  0x01#define  LEVEL2_TAR  0x02enum scam_id_st { ID0, ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, ID9, ID10, ID11,	    ID12,	ID13, ID14, ID15, ID_UNUSED, ID_UNASSIGNED, ID_ASSIGNED, LEGACY,	CLR_PRIORITY, NO_ID_AVAIL};typedef struct SCCBscam_info {	unsigned char id_string[ID_STRING_LENGTH];	enum scam_id_st state;} SCCBSCAM_INFO;#define  SCSI_REQUEST_SENSE      0x03#define  SCSI_READ               0x08#define  SCSI_WRITE              0x0A#define  SCSI_START_STOP_UNIT    0x1B#define  SCSI_READ_EXTENDED      0x28#define  SCSI_WRITE_EXTENDED     0x2A#define  SCSI_WRITE_AND_VERIFY   0x2E#define  SSGOOD                  0x00#define  SSCHECK                 0x02#define  SSQ_FULL                0x28#define  SMCMD_COMP              0x00#define  SMEXT                   0x01#define  SMSAVE_DATA_PTR         0x02#define  SMREST_DATA_PTR         0x03#define  SMDISC                  0x04#define  SMABORT                 0x06#define  SMREJECT                0x07#define  SMNO_OP                 0x08#define  SMPARITY                0x09#define  SMDEV_RESET             0x0C#define	SMABORT_TAG					0x0D#define	SMINIT_RECOVERY			0x0F#define	SMREL_RECOVERY				0x10#define  SMIDENT                 0x80#define  DISC_PRIV               0x40#define  SMSYNC                  0x01#define  SMWDTR                  0x03#define  SM8BIT                  0x00#define  SM16BIT                 0x01#define  SMIGNORWR               0x23	/* Ignore Wide Residue */#define  SIX_BYTE_CMD            0x06#define  TWELVE_BYTE_CMD         0x0C#define  ASYNC                   0x00#define  MAX_OFFSET              0x0F	/* Maxbyteoffset for Sync Xfers */#define  EEPROM_WD_CNT     256#define  EEPROM_CHECK_SUM  0#define  FW_SIGNATURE      2#define  MODEL_NUMB_0      4#define  MODEL_NUMB_2      6#define  MODEL_NUMB_4      8#define  SYSTEM_CONFIG     16#define  SCSI_CONFIG       17#define  BIOS_CONFIG       18#define  SCAM_CONFIG       20#define  ADAPTER_SCSI_ID   24#define  IGNORE_B_SCAN     32#define  SEND_START_ENA    34#define  DEVICE_ENABLE     36#define  SYNC_RATE_TBL     38#define  SYNC_RATE_TBL01   38#define  SYNC_RATE_TBL23   40#define  SYNC_RATE_TBL45   42#define  SYNC_RATE_TBL67   44#define  SYNC_RATE_TBL89   46#define  SYNC_RATE_TBLab   48#define  SYNC_RATE_TBLcd   50#define  SYNC_RATE_TBLef   52#define  EE_SCAMBASE      256#define  SCAM_ENABLED   BIT(2)#define  SCAM_LEVEL2    BIT(3)#define	RENEGO_ENA		BIT(10)#define	CONNIO_ENA		BIT(11)#define  GREEN_PC_ENA   BIT(12)#define  AUTO_RATE_00   00#define  AUTO_RATE_05   01#define  AUTO_RATE_10   02#define  AUTO_RATE_20   03#define  WIDE_NEGO_BIT     BIT(7)#define  DISC_ENABLE_BIT   BIT(6)#define  hp_vendor_id_0       0x00	/* LSB */#define  ORION_VEND_0   0x4B#define  hp_vendor_id_1       0x01	/* MSB */#define  ORION_VEND_1   0x10#define  hp_device_id_0       0x02	/* LSB */#define  ORION_DEV_0    0x30#define  hp_device_id_1       0x03	/* MSB */#define  ORION_DEV_1    0x81	/* Sub Vendor ID and Sub Device ID only available in	   Harpoon Version 2 and higher */#define  hp_sub_device_id_0   0x06	/* LSB */#define  hp_semaphore         0x0C#define SCCB_MGR_ACTIVE    BIT(0)#define TICKLE_ME          BIT(1)#define SCCB_MGR_PRESENT   BIT(3)#define BIOS_IN_USE        BIT(4)#define  hp_sys_ctrl          0x0F#define  STOP_CLK          BIT(0)	/*Turn off BusMaster Clock */#define  DRVR_RST          BIT(1)	/*Firmware Reset to 80C15 chip */#define  HALT_MACH         BIT(3)	/*Halt State Machine      */#define  HARD_ABORT        BIT(4)	/*Hard Abort              */#define  hp_host_blk_cnt      0x13#define  XFER_BLK64        0x06	/*     1 1 0 64 byte per block */#define  BM_THRESHOLD      0x40	/* PCI mode can only xfer 16 bytes */#define  hp_int_mask          0x17#define  INT_CMD_COMPL     BIT(0)	/* DMA command complete   */#define  INT_EXT_STATUS    BIT(1)	/* Extended Status Set    */#define  hp_xfer_cnt_lo       0x18#define  hp_xfer_cnt_hi       0x1A#define  hp_xfer_cmd          0x1B#define  XFER_HOST_DMA     0x00	/*     0 0 0 Transfer Host -> DMA */#define  XFER_DMA_HOST     0x01	/*     0 0 1 Transfer DMA  -> Host */#define  XFER_HOST_AUTO    0x00	/*     0 0 Auto Transfer Size   */#define  XFER_DMA_8BIT     0x20	/*     0 1 8 BIT  Transfer Size */#define  DISABLE_INT       BIT(7)	/*Do not interrupt at end of cmd. */#define  HOST_WRT_CMD      ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))#define  HOST_RD_CMD       ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))#define  hp_host_addr_lo      0x1C#define  hp_host_addr_hmi     0x1E#define  hp_ee_ctrl           0x22#define  EXT_ARB_ACK       BIT(7)#define  SCSI_TERM_ENA_H   BIT(6)	/* SCSI high byte terminator */#define  SEE_MS            BIT(5)#define  SEE_CS            BIT(3)#define  SEE_CLK           BIT(2)#define  SEE_DO            BIT(1)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?