1 /* fcp_impl.h: Generic SCSI on top of FC4 - our interface defines.
2 *
3 * Copyright (C) 1997-1999 Jakub Jelinek (jj@ultra.linux.cz)
4 * Copyright (C) 1998 Jirka Hanika (geo@ff.cuni.cz)
5 */
6
7 #ifndef _FCP_SCSI_H
8 #define _FCP_SCSI_H
9
10 #include <linux/types.h>
11 #include <linux/blk.h>
12 #include "../scsi/scsi.h"
13
14 #include "fc.h"
15 #include "fcp.h"
16 #include "fc-al.h"
17
18 #include <asm/io.h>
19 #ifdef __sparc__
20 #include <asm/sbus.h>
21 #endif
22
23 /* 0 or 1 */
24 #define FCP_SCSI_USE_NEW_EH_CODE 0
25
26 #define FC_CLASS_OUTBOUND 0x01
27 #define FC_CLASS_INBOUND 0x02
28 #define FC_CLASS_SIMPLE 0x03
29 #define FC_CLASS_IO_WRITE 0x04
30 #define FC_CLASS_IO_READ 0x05
31 #define FC_CLASS_UNSOLICITED 0x06
32 #define FC_CLASS_OFFLINE 0x08
33
34 #define PROTO_OFFLINE 0x02
35 #define PROTO_REPORT_AL_MAP 0x03
36 #define PROTO_FORCE_LIP 0x06
37
38 struct _fc_channel;
39
40 typedef struct fcp_cmnd {
41 struct fcp_cmnd *next;
42 struct fcp_cmnd *prev;
43 void (*done)(Scsi_Cmnd *);
44 unsigned short proto;
45 unsigned short token;
46 unsigned int did;
47 /* FCP SCSI stuff */
48 dma_addr_t data;
49 /* From now on this cannot be touched for proto == TYPE_SCSI_FCP */
50 fc_hdr fch;
51 dma_addr_t cmd;
52 dma_addr_t rsp;
53 int cmdlen;
54 int rsplen;
55 int class;
56 int datalen;
57 /* This is just used as a verification during login */
58 struct _fc_channel *fc;
59 void *ls;
60 } fcp_cmnd;
61
62 typedef struct {
63 unsigned int len;
64 unsigned char list[0];
65 } fcp_posmap;
66
67 typedef struct _fc_channel {
68 struct _fc_channel *next;
69 int irq;
70 int state;
71 int sid;
72 int did;
73 char name[16];
74 void (*fcp_register)(struct _fc_channel *, u8, int);
75 void (*reset)(struct _fc_channel *);
76 int (*hw_enque)(struct _fc_channel *, fcp_cmnd *);
77 fc_wwn wwn_node;
78 fc_wwn wwn_nport;
79 fc_wwn wwn_dest;
80 common_svc_parm *common_svc;
81 svc_parm *class_svcs;
82 #ifdef __sparc__
83 struct sbus_dev *dev;
84 #else
85 struct pci_dev *dev;
86 #endif
87 struct module *module;
88 /* FCP SCSI stuff */
89 short can_queue;
90 short abort_count;
91 int rsp_size;
92 fcp_cmd *scsi_cmd_pool;
93 char *scsi_rsp_pool;
94 dma_addr_t dma_scsi_cmd, dma_scsi_rsp;
95 long *scsi_bitmap;
96 long scsi_bitmap_end;
97 int scsi_free;
98 int (*encode_addr)(Scsi_Cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *);
99 fcp_cmnd *scsi_que;
100 char scsi_name[4];
101 fcp_cmnd **cmd_slots;
102 int channels;
103 int targets;
104 long *ages;
105 Scsi_Cmnd *rst_pkt;
106 fcp_posmap *posmap;
107 /* LOGIN stuff */
108 fcp_cmnd *login;
109 void *ls;
110 } fc_channel;
111
112 extern fc_channel *fc_channels;
113
114 #define FC_STATE_UNINITED 0
115 #define FC_STATE_ONLINE 1
116 #define FC_STATE_OFFLINE 2
117 #define FC_STATE_RESETING 3
118 #define FC_STATE_FPORT_OK 4
119 #define FC_STATE_MAYBEOFFLINE 5
120
121 #define FC_STATUS_OK 0
122 #define FC_STATUS_P_RJT 2
123 #define FC_STATUS_F_RJT 3
124 #define FC_STATUS_P_BSY 4
125 #define FC_STATUS_F_BSY 5
126 #define FC_STATUS_ERR_OFFLINE 0x11
127 #define FC_STATUS_TIMEOUT 0x12
128 #define FC_STATUS_ERR_OVERRUN 0x13
129 #define FC_STATUS_POINTTOPOINT 0x15
130 #define FC_STATUS_AL 0x16
131 #define FC_STATUS_UNKNOWN_CQ_TYPE 0x20
132 #define FC_STATUS_BAD_SEG_CNT 0x21
133 #define FC_STATUS_MAX_XCHG_EXCEEDED 0x22
134 #define FC_STATUS_BAD_XID 0x23
135 #define FC_STATUS_XCHG_BUSY 0x24
136 #define FC_STATUS_BAD_POOL_ID 0x25
137 #define FC_STATUS_INSUFFICIENT_CQES 0x26
138 #define FC_STATUS_ALLOC_FAIL 0x27
139 #define FC_STATUS_BAD_SID 0x28
140 #define FC_STATUS_NO_SEQ_INIT 0x29
141 #define FC_STATUS_TIMED_OUT -1
142 #define FC_STATUS_BAD_RSP -2
143
144 void fcp_queue_empty(fc_channel *);
145 int fcp_init(fc_channel *);
146 void fcp_release(fc_channel *fc_chain, int count);
147 void fcp_receive_solicited(fc_channel *, int, int, int, fc_hdr *);
148 void fcp_state_change(fc_channel *, int);
149 int fc_do_plogi(fc_channel *, unsigned char, fc_wwn *, fc_wwn *);
150 int fc_do_prli(fc_channel *, unsigned char);
151
152 #define for_each_fc_channel(fc) \
153 for (fc = fc_channels; fc; fc = fc->next)
154
155 #define for_each_online_fc_channel(fc) \
156 for_each_fc_channel(fc) \
157 if (fc->state == FC_STATE_ONLINE)
158
159 int fcp_scsi_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
160 int fcp_old_abort(Scsi_Cmnd *);
161 int fcp_scsi_abort(Scsi_Cmnd *);
162 int fcp_scsi_dev_reset(Scsi_Cmnd *);
163 int fcp_scsi_bus_reset(Scsi_Cmnd *);
164 int fcp_scsi_host_reset(Scsi_Cmnd *);
165
166 #endif /* !(_FCP_SCSI_H) */
167
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.