2005-04-17 02:20:36 +04:00
/* fcp_impl.h: Generic SCSI on top of FC4 - our interface defines.
*
* Copyright ( C ) 1997 - 1999 Jakub Jelinek ( jj @ ultra . linux . cz )
* Copyright ( C ) 1998 Jirka Hanika ( geo @ ff . cuni . cz )
*/
# ifndef _FCP_SCSI_H
# define _FCP_SCSI_H
# include <linux/types.h>
# include "../scsi/scsi.h"
# include "fc.h"
# include "fcp.h"
# include "fc-al.h"
# include <asm/io.h>
# ifdef __sparc__
# include <asm/sbus.h>
# endif
/* 0 or 1 */
# define FCP_SCSI_USE_NEW_EH_CODE 0
# define FC_CLASS_OUTBOUND 0x01
# define FC_CLASS_INBOUND 0x02
# define FC_CLASS_SIMPLE 0x03
# define FC_CLASS_IO_WRITE 0x04
# define FC_CLASS_IO_READ 0x05
# define FC_CLASS_UNSOLICITED 0x06
# define FC_CLASS_OFFLINE 0x08
# define PROTO_OFFLINE 0x02
# define PROTO_REPORT_AL_MAP 0x03
# define PROTO_FORCE_LIP 0x06
struct _fc_channel ;
typedef struct fcp_cmnd {
struct fcp_cmnd * next ;
struct fcp_cmnd * prev ;
2006-10-11 01:41:42 +04:00
void ( * done ) ( struct scsi_cmnd * ) ;
2005-04-17 02:20:36 +04:00
unsigned short proto ;
unsigned short token ;
unsigned int did ;
/* FCP SCSI stuff */
dma_addr_t data ;
/* From now on this cannot be touched for proto == TYPE_SCSI_FCP */
fc_hdr fch ;
dma_addr_t cmd ;
dma_addr_t rsp ;
int cmdlen ;
int rsplen ;
int class ;
int datalen ;
/* This is just used as a verification during login */
struct _fc_channel * fc ;
void * ls ;
} fcp_cmnd ;
typedef struct {
unsigned int len ;
unsigned char list [ 0 ] ;
} fcp_posmap ;
typedef struct _fc_channel {
struct _fc_channel * next ;
int irq ;
int state ;
int sid ;
int did ;
char name [ 16 ] ;
void ( * fcp_register ) ( struct _fc_channel * , u8 , int ) ;
void ( * reset ) ( struct _fc_channel * ) ;
int ( * hw_enque ) ( struct _fc_channel * , fcp_cmnd * ) ;
fc_wwn wwn_node ;
fc_wwn wwn_nport ;
fc_wwn wwn_dest ;
common_svc_parm * common_svc ;
svc_parm * class_svcs ;
# ifdef __sparc__
struct sbus_dev * dev ;
# else
struct pci_dev * dev ;
# endif
struct module * module ;
/* FCP SCSI stuff */
short can_queue ;
short abort_count ;
int rsp_size ;
fcp_cmd * scsi_cmd_pool ;
char * scsi_rsp_pool ;
dma_addr_t dma_scsi_cmd , dma_scsi_rsp ;
long * scsi_bitmap ;
long scsi_bitmap_end ;
int scsi_free ;
2006-10-11 01:41:42 +04:00
int ( * encode_addr ) ( struct scsi_cmnd * , u16 * , struct _fc_channel * , fcp_cmnd * ) ;
2005-04-17 02:20:36 +04:00
fcp_cmnd * scsi_que ;
char scsi_name [ 4 ] ;
fcp_cmnd * * cmd_slots ;
int channels ;
int targets ;
long * ages ;
2006-10-11 01:41:42 +04:00
struct scsi_cmnd * rst_pkt ;
2005-04-17 02:20:36 +04:00
fcp_posmap * posmap ;
/* LOGIN stuff */
fcp_cmnd * login ;
void * ls ;
} fc_channel ;
extern fc_channel * fc_channels ;
# define FC_STATE_UNINITED 0
# define FC_STATE_ONLINE 1
# define FC_STATE_OFFLINE 2
# define FC_STATE_RESETING 3
# define FC_STATE_FPORT_OK 4
# define FC_STATE_MAYBEOFFLINE 5
# define FC_STATUS_OK 0
# define FC_STATUS_P_RJT 2
# define FC_STATUS_F_RJT 3
# define FC_STATUS_P_BSY 4
# define FC_STATUS_F_BSY 5
# define FC_STATUS_ERR_OFFLINE 0x11
# define FC_STATUS_TIMEOUT 0x12
# define FC_STATUS_ERR_OVERRUN 0x13
# define FC_STATUS_POINTTOPOINT 0x15
# define FC_STATUS_AL 0x16
# define FC_STATUS_UNKNOWN_CQ_TYPE 0x20
# define FC_STATUS_BAD_SEG_CNT 0x21
# define FC_STATUS_MAX_XCHG_EXCEEDED 0x22
# define FC_STATUS_BAD_XID 0x23
# define FC_STATUS_XCHG_BUSY 0x24
# define FC_STATUS_BAD_POOL_ID 0x25
# define FC_STATUS_INSUFFICIENT_CQES 0x26
# define FC_STATUS_ALLOC_FAIL 0x27
# define FC_STATUS_BAD_SID 0x28
# define FC_STATUS_NO_SEQ_INIT 0x29
# define FC_STATUS_TIMED_OUT -1
# define FC_STATUS_BAD_RSP -2
void fcp_queue_empty ( fc_channel * ) ;
int fcp_init ( fc_channel * ) ;
void fcp_release ( fc_channel * fc_chain , int count ) ;
void fcp_receive_solicited ( fc_channel * , int , int , int , fc_hdr * ) ;
void fcp_state_change ( fc_channel * , int ) ;
int fc_do_plogi ( fc_channel * , unsigned char , fc_wwn * , fc_wwn * ) ;
int fc_do_prli ( fc_channel * , unsigned char ) ;
# define for_each_fc_channel(fc) \
for ( fc = fc_channels ; fc ; fc = fc - > next )
# define for_each_online_fc_channel(fc) \
for_each_fc_channel ( fc ) \
if ( fc - > state = = FC_STATE_ONLINE )
2006-10-11 01:41:42 +04:00
int fcp_scsi_queuecommand ( struct scsi_cmnd * ,
void ( * done ) ( struct scsi_cmnd * ) ) ;
int fcp_scsi_abort ( struct scsi_cmnd * ) ;
int fcp_scsi_dev_reset ( struct scsi_cmnd * ) ;
int fcp_scsi_host_reset ( struct scsi_cmnd * ) ;
2005-04-17 02:20:36 +04:00
# endif /* !(_FCP_SCSI_H) */