| /* 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; | |
| void (*done)(Scsi_Cmnd *); | |
| 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; | |
| int (*encode_addr)(Scsi_Cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *); | |
| fcp_cmnd *scsi_que; | |
| char scsi_name[4]; | |
| fcp_cmnd **cmd_slots; | |
| int channels; | |
| int targets; | |
| long *ages; | |
| Scsi_Cmnd *rst_pkt; | |
| 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) | |
| int fcp_scsi_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); | |
| int fcp_scsi_abort(Scsi_Cmnd *); | |
| int fcp_scsi_dev_reset(Scsi_Cmnd *); | |
| int fcp_scsi_host_reset(Scsi_Cmnd *); | |
| #endif /* !(_FCP_SCSI_H) */ |