📄 cpqfctsstructs.h
字号:
// because of kernel memory allocation constraints!)typedef struct // we will allocate this dynamically{ FC_EXCHANGE fcExchange[ TACH_MAX_XID ];} FC_EXCHANGES;typedef struct{ char Name[64]; // name of controller ("HP Tachlite TL Rev2.0, 33MHz, 64bit bus") //PVOID pAdapterDevExt; // back pointer to device object/extension ULONG ChipType; // local numeric key for Tachyon Type / Rev. ULONG status; // our Driver - logical status TL_REGISTERS Registers; // reg addresses & host memory copies // FC-4 mapping of 'transaction' to X_IDs UCHAR LILPmap[32*4]; // Loop Position Map of ALPAs (late FC-AL only) FC_OPTIONS Options; // e.g. Target, Initiator, loopback... UCHAR highest_FCPH_ver; // FC-PH version limits UCHAR lowest_FCPH_ver; // FC-PH version limits FC_EXCHANGES *Exchanges; ULONG fcLsExchangeLRU; // Least Recently Used counter (Link Service) ULONG fcSestExchangeLRU; // Least Recently Used counter (FCP-SCSI) FC_LOGGEDIN_PORT fcPorts; // linked list of every FC port ever seen FCSTATS fcStats; // FC comm err counters // Host memory QUEUE pointers TachLiteERQ *ERQ; // Exchange Request Que TachyonIMQ *IMQ; // Inbound Message Que TachLiteSFQ *SFQ; // Single Frame Queue TachSEST *SEST; // SCSI Exchange State Table dma_addr_t exch_dma_handle; // these function pointers are for "generic" functions, which are // replaced with Host Bus Adapter types at // runtime. int (*CreateTachyonQues)( void* , int); int (*DestroyTachyonQues)( void* , int); int (*LaserControl)(void*, int ); // e.g. On/Off int (*ResetTachyon)(void*, int ); void (*FreezeTachyon)(void*, int ); void (*UnFreezeTachyon)(void*, int ); int (*InitializeTachyon)(void*, int, int ); int (*InitializeFrameManager)(void*, int ); int (*ProcessIMQEntry)(void*); int (*ReadWriteWWN)(void*, int ReadWrite); int (*ReadWriteNVRAM)(void*, void*, int ReadWrite);} TACHYON, *PTACHYON;void cpqfcTSClearLinkStatusCounters(TACHYON * fcChip);int CpqTsCreateTachLiteQues( void* pHBA, int opcode);int CpqTsDestroyTachLiteQues( void* , int);int CpqTsInitializeTachLite( void *pHBA, int opcode1, int opcode2);int CpqTsProcessIMQEntry(void* pHBA);int CpqTsResetTachLite(void *pHBA, int type);void CpqTsFreezeTachlite(void *pHBA, int type);void CpqTsUnFreezeTachlite(void *pHBA, int type);int CpqTsInitializeFrameManager(void *pHBA, int);int CpqTsLaserControl( void* addrBase, int opcode );int CpqTsReadWriteWWN(void*, int ReadWrite);int CpqTsReadWriteNVRAM(void*, void* data, int ReadWrite);void cpqfcTS_WorkTask( struct Scsi_Host *HostAdapter);void cpqfcTSWorkerThread( void *host);int cpqfcTS_GetNVRAM_data( UCHAR *wwnbuf, UCHAR *buf );ULONG cpqfcTS_ReadNVRAM( void* GPIOin, void* GPIOout , USHORT count, UCHAR *buf );BOOLEAN tl_write_i2c_nvram( void* GPIOin, void* GPIOout, USHORT startOffset, // e.g. 0x2f for WWN start USHORT count, UCHAR *buf );// define misc functions int cpqfcTSGetLPSM( PTACHYON fcChip, char cErrorString[]);int cpqfcTSDecodeGBICtype( PTACHYON fcChip, char cErrorString[]);void* fcMemManager( struct pci_dev *pdev, ALIGNED_MEM *dyn_mem_pair, ULONG n_alloc, ULONG ab, ULONG ulAlignedAddress, dma_addr_t *dma_handle);void BigEndianSwap( UCHAR *source, UCHAR *dest, USHORT cnt);//ULONG virt_to_phys( PVOID virtaddr ); // Linux interrupt handlervoid cpqfcTS_intr_handler( int irq,void *dev_id,struct pt_regs *regs);void cpqfcTSheartbeat( unsigned long ptr );// The biggest Q element we deal with is Aborts - we// need 4 bytes for x_ID, and a Scsi_Cmnd (~284 bytes)//#define LINKQ_ITEM_SIZE ((4+sizeof(Scsi_Cmnd)+3)/4)#define LINKQ_ITEM_SIZE (3*16)typedef struct{ ULONG Type; // e.g. LINKUP, SFQENTRY, PDISC, BLS_ABTS, ... ULONG ulBuff[ LINKQ_ITEM_SIZE ];} LINKQ_ITEM;#define FC_LINKQ_DEPTH TACH_MAX_XIDtypedef struct{ ULONG producer; ULONG consumer; // when producer equals consumer, Q empty LINKQ_ITEM Qitem[ FC_LINKQ_DEPTH ];} FC_LINK_QUE, *PFC_LINK_QUE; // DPC routines post to here on Inbound SCSI frames // User thread processes#define FC_SCSIQ_DEPTH 32typedef struct{ int Type; // e.g. SCSI ULONG ulBuff[ 3*16 ];} SCSIQ_ITEM;typedef struct{ ULONG producer; ULONG consumer; // when producer equals consumer, Q empty SCSIQ_ITEM Qitem[ FC_SCSIQ_DEPTH ];} FC_SCSI_QUE, *PFC_SCSI_QUE;#define DYNAMIC_ALLOCATIONS 4 // Tachyon aligned allocations: ERQ,IMQ,SFQ,SEST// Linux space allocated per HBA (chip state, etc.)typedef struct { struct Scsi_Host *HostAdapter; // back pointer to Linux Scsi struct TACHYON fcChip; // All Tachyon registers, Queues, functions ALIGNED_MEM dynamic_mem[DYNAMIC_ALLOCATIONS]; struct pci_dev *PciDev; dma_addr_t fcLQ_dma_handle; Scsi_Cmnd *LinkDnCmnd[CPQFCTS_REQ_QUEUE_LEN]; // collects Cmnds during LDn // (for Acceptable targets) Scsi_Cmnd *BoardLockCmnd[CPQFCTS_REQ_QUEUE_LEN]; // SEST was full Scsi_Cmnd *BadTargetCmnd[CPQFCTS_MAX_TARGET_ID]; // missing targets u_char HBAnum; // 0-based host number struct timer_list cpqfcTStimer; // FC utility timer for implicit // logouts, FC protocol timeouts, etc. int fcStatsTime; // Statistics delta reporting time struct task_struct *worker_thread; // our kernel thread int PortDiscDone; // set by SendLogins(), cleared by LDn struct semaphore *TachFrozen; struct semaphore *TYOBcomplete; // handshake for Tach outbound frames struct semaphore *fcQueReady; // FibreChannel work for our kernel thread struct semaphore *notify_wt; // synchronizes kernel thread kill struct semaphore *BoardLock; PFC_LINK_QUE fcLQ; // the WorkerThread operates on this spinlock_t hba_spinlock; // held/released by WorkerThread} CPQFCHBA;#define CPQ_SPINLOCK_HBA( x ) spin_lock(&x->hba_spinlock);#define CPQ_SPINUNLOCK_HBA(x) spin_unlock(&x->hba_spinlock);void cpqfcTSImplicitLogout( CPQFCHBA* cpqfcHBAdata, PFC_LOGGEDIN_PORT pFcPort);void cpqfcTSTerminateExchange( CPQFCHBA*, SCSI_NEXUS *target, int );PFC_LOGGEDIN_PORT fcPortLoggedIn( CPQFCHBA *cpqfcHBAdata, TachFCHDR_GCMND* fchs, BOOLEAN, BOOLEAN);void fcProcessLoggedIn( CPQFCHBA *cpqfcHBAdata, TachFCHDR_GCMND* fchs);ULONG cpqfcTSBuildExchange( CPQFCHBA *cpqfcHBAdata, ULONG type, // e.g. PLOGI TachFCHDR_GCMND* InFCHS, // incoming FCHS void *Data, // the CDB, scatter/gather, etc. LONG *ExchangeID ); // allocated exchange IDULONG cpqfcTSStartExchange( CPQFCHBA *cpqfcHBAdata, LONG ExchangeID );void cpqfcTSCompleteExchange( struct pci_dev *pcidev, PTACHYON fcChip, ULONG exchange_ID);PFC_LOGGEDIN_PORT fcFindLoggedInPort( PTACHYON fcChip, Scsi_Cmnd *Cmnd, // (We want the channel/target/lun Nexus from Cmnd) ULONG port_id, // search linked list for al_pa, or UCHAR wwn[8], // search linked list for WWN, or... PFC_LOGGEDIN_PORT *pLastLoggedInPort);void cpqfcTSPutLinkQue( CPQFCHBA *cpqfcHBAdata, int Type, void *QueContent);void fcPutScsiQue( CPQFCHBA *cpqfcHBAdata, int Type, void *QueContent);void fcLinkQReset( CPQFCHBA *);void fcScsiQReset( CPQFCHBA *);void fcSestReset( CPQFCHBA *);void cpqfc_pci_unmap(struct pci_dev *pcidev, Scsi_Cmnd *cmd, PTACHYON fcChip, ULONG x_ID);extern const UCHAR valid_al_pa[];extern const int number_of_al_pa;#define FCP_RESID_UNDER 0x80000#define FCP_RESID_OVER 0x40000#define FCP_SNS_LEN_VALID 0x20000#define FCP_RSP_LEN_VALID 0x10000// RSP_CODE definitions (dpANS Fibre Channel Protocol for SCSI, pg 34)#define FCP_DATA_LEN_NOT_BURST_LEN 0x1000000#define FCP_CMND_FIELD_INVALID 0x2000000#define FCP_DATA_RO_NOT_XRDY_RO 0x3000000#define FCP_TASKFUNCTION_NS 0x4000000#define FCP_TASKFUNCTION_FAIL 0x5000000// FCP-SCSI response status structtypedef struct // see "TachFCHDR_RSP" definition - 64 bytes{ __u32 reserved; __u32 reserved1; __u32 fcp_status; // field validity and SCSI status __u32 fcp_resid; __u32 fcp_sns_len; // length of FCP_SNS_INFO field __u32 fcp_rsp_len; // length of FCP_RSP_INFO field (expect 8) __u32 fcp_rsp_info; // 4 bytes of FCP protocol response information __u32 fcp_rsp_info2; // (4 more bytes, since most implementations use 8) __u8 fcp_sns_info[36]; // bytes for SCSI sense (ASC, ASCQ)} FCP_STATUS_RESPONSE, *PFCP_STATUS_RESPONSE;// Fabric State Change Registrationtypedef struct scrpl{ __u32 command; __u32 function;} SCR_PL;// Fabric Name Service Requesttypedef struct nsrpl{ __u32 CT_Rev; // (& IN_ID) WORD 0 __u32 FCS_Type; // WORD 1 __u32 Command_code; // WORD 2 __u32 reason_code; // WORD 3 __u32 FCP; // WORD 4 (lower byte) } NSR_PL;// "FC.H"#define MAX_RX_SIZE 0x800 // Max Receive Buffer Size is 2048#define MIN_RX_SIZE 0x100 // Min Size is 256, per FC-PLDA Spec#define MAX_TARGET_RXIDS SEST_DEPTH#define TARGET_RX_SIZE SEST_BUFFER_LENGTH#define CLASS_1 0x01#define CLASS_2 0x02#define CLASS_3 0x03#define FC_PH42 0x08#define FC_PH43 0x09#define FC_PH3 0x20#define RR_TOV 2 // Minimum Time for target to wait for // PDISC after a LIP.#define E_D_TOV 2 // Minimum Time to wait for Sequence // Completion.#define R_A_TOV 0 // Minimum Time for Target to wait // before reclaiming resources.//// R_CTL Field//// Routing Bits (31-28)//#define FC4_DEVICE_DATA 0x00000000#define EXT_LINK_DATA 0x20000000#define FC4_LINK_DATA 0x30000000#define VIDEO_DATA 0x40000000#define BASIC_LINK_DATA 0x80000000#define LINK_CONTROL 0xC0000000#define ROUTING_MASK 0xF0000000//// Information Bits (27-24)//#define UNCAT_INFORMATION 0x00000000#define SOLICITED_DATA 0x01000000#define UNSOLICITED_CONTROL 0x02000000#define SOLICITED_CONTROL 0x03000000#define UNSOLICITED_DATA 0x04000000#define DATA_DESCRIPTOR 0x05000000#define UNSOLICITED_COMMAND 0x06000000#define COMMAND_STATUS 0x07000000#define INFO_MASK 0x0F000000//// (Link Control Codes)//#define ACK_1 0x00000000#define ACK_0_OR_N 0x01000000#define P_RJT 0x02000000 #define F_RJT 0x03000000 #define P_BSY 0x04000000#define FABRIC_BUSY_TO_DF 0x05000000 // Fabric Busy to Data Frame#define FABRIC_BUSY_TO_LC 0x06000000 // Fabric Busy to Link Ctl Frame#define LINK_CREDIT_RESET 0x07000000//// (Link Service Command Codes)////#define LS_RJT 0x01000000 // LS Reject#define LS_ACC 0x02000000 // LS Accept#define LS_PLOGI 0x03000000 // N_PORT Login#define LS_FLOGI 0x04000000 // F_PORT Login#define LS_LOGO 0x05000000 // Logout#define LS_ABTX 0x06000000 // Abort Exchange#define LS_RCS 0x07000000 // Read Connection Status#define LS_RES 0x08000000 // Read Exchange Status#define LS_RSS 0x09000000 // Read Sequence Status#define LS_RSI 0x0A000000 // Request Seq Initiative
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -