164 строки
4.0 KiB
C
164 строки
4.0 KiB
C
/* 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) */
|