Checkpatch warnings fixed
[mirror/scst/.git] / qla2x00t / qla2x00-target / qla2x00t.h
1 /*
2  *  qla2x00t.h
3  *
4  *  Copyright (C) 2004 - 2008 Vladislav Bolkhovitin <vst@vlnb.net>
5  *  Copyright (C) 2004 - 2005 Leonid Stoljar
6  *  Copyright (C) 2006 Nathaniel Clark <nate@misrule.us>
7  *
8  *  QLogic 2x00 SCSI target driver.
9  *
10  *  This program is free software; you can redistribute it and/or
11  *  modify it under the terms of the GNU General Public License
12  *  as published by the Free Software Foundation, version 2
13  *  of the License.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  *  GNU General Public License for more details.
19  */
20
21 #ifndef __QLA2X00T_H
22 #define __QLA2X00T_H
23
24 /* Sneaky hack to skip redefinitions from qla_dbg.h */
25 #define __QLA_DBG_H
26 #include <qla_def.h>
27 #include "qla2x_tgt_def.h"
28
29 #include <scst_debug.h>
30
31 /* Version numbers, the same as for the kernel */
32 #define Q2T_VERSION(a, b, c, d) (((a) << 030) + ((b) << 020) + (c) << 010 + (d))
33 #define Q2T_VERSION_CODE Q2T_VERSION(1, 0, 0, 0)
34 #define Q2T_VERSION_STRING "1.0.1"
35
36 #define Q2T_MAX_CDB_LEN             16
37 #define Q2T_TIMEOUT                 10  /* in seconds */
38
39 /* Immediate notify status constants */
40 #define IMM_NTFY_LIP_RESET          0x000E
41 #define IMM_NTFY_IOCB_OVERFLOW      0x0016
42 #define IMM_NTFY_ABORT_TASK         0x0020
43 #define IMM_NTFY_PORT_LOGOUT        0x0029
44 #define IMM_NTFY_PORT_CONFIG        0x002A
45 #define IMM_NTFY_GLBL_TPRLO         0x002D
46 #define IMM_NTFY_GLBL_LOGO          0x002E
47 #define IMM_NTFY_RESOURCE           0x0034
48 #define IMM_NTFY_MSG_RX             0x0036
49
50 /* Immediate notify task flags */
51 #define IMM_NTFY_CLEAR_ACA          0x4000
52 #define IMM_NTFY_TARGET_RESET       0x2000
53 #define IMM_NTFY_LUN_RESET          0x1000
54 #define IMM_NTFY_CLEAR_TS           0x0400
55 #define IMM_NTFY_ABORT_TS           0x0200
56
57 /* Notify Acknowledge flags */
58 #define NOTIFY_ACK_RES_COUNT        BIT_8
59 #define NOTIFY_ACK_CLEAR_LIP_RESET  BIT_5
60 #define NOTIFY_ACK_TM_RESP_CODE_VALID BIT_4
61
62 /* Command's states */
63 #define Q2T_STATE_NEW               0   /* New command and SCST processing it */
64 #define Q2T_STATE_PROCESSED         1   /* SCST done processing */
65 #define Q2T_STATE_NEED_DATA         2   /* SCST needs data to continue */
66 #define Q2T_STATE_DATA_IN           3   /* Data arrived and SCST processing */
67                                         /* them */
68 #define Q2T_STATE_ABORTED           4   /* Command aborted */
69
70 /* Misc */
71 #define Q2T_NULL_HANDLE             0
72 #define Q2T_SKIP_HANDLE             (0xFFFFFFFE & ~CTIO_COMPLETION_HANDLE_MARK)
73 #define Q2T_BUSY_HANDLE             (0xFFFFFFFF & ~CTIO_COMPLETION_HANDLE_MARK)
74
75 /* ATIO task_codes fields */
76 #define ATIO_SIMPLE_QUEUE           0
77 #define ATIO_HEAD_OF_QUEUE          1
78 #define ATIO_ORDERED_QUEUE          2
79 #define ATIO_ACA_QUEUE              4
80 #define ATIO_UNTAGGED               5
81
82 /* TM failed response code, see FCP */
83 #define FC_TM_FAILED                0x5
84
85 #if (BITS_PER_LONG > 32) || defined(CONFIG_HIGHMEM64G)
86 #define pci_dma_lo32(a) (a & 0xffffffff)
87 #define pci_dma_hi32(a) ((((a) >> 16)>>16) & 0xffffffff)
88 #else
89 #define pci_dma_lo32(a) (a & 0xffffffff)
90 #define pci_dma_hi32(a) 0
91 #endif
92
93 /*
94  * Equivilant to IT Nexus (Initiator-Target)
95  */
96 struct q2t_sess {
97         struct list_head list;
98         struct scst_session *scst_sess;
99         struct q2t_tgt *tgt;
100         int loop_id;
101 };
102
103 struct q2t_cmd {
104         struct q2t_sess *sess;
105         struct scst_cmd *scst_cmd;
106         int state;
107         struct atio_entry atio;
108         dma_addr_t dma_handle;
109         uint32_t iocb_cnt;
110 };
111
112 struct q2t_tgt {
113         struct scst_tgt *scst_tgt;
114         scsi_qla_host_t *ha;
115         int datasegs_per_cmd, datasegs_per_cont;
116         /* Target's flags, serialized by ha->hardware_lock */
117         unsigned int tgt_shutdown:1;    /* The driver is being released */
118         unsigned int tgt_enable_64bit_addr:1; /* 64bit PCI addressing enabled */
119         wait_queue_head_t waitQ;
120         int notify_ack_expected;
121         int modify_lun_expected;
122         /* Count of sessions refering q2t_tgt, protected by hardware_lock */
123         int sess_count;
124         struct list_head sess_list;
125 };
126
127 struct q2t_mgmt_cmd {
128         struct q2t_sess *sess;
129         struct notify_entry notify_entry;
130 };
131
132 struct q2t_prm {
133         struct q2t_tgt *tgt;
134         uint16_t req_cnt;
135         uint16_t seg_cnt;
136         int sg_cnt;
137         struct scatterlist *sg;
138         int bufflen;
139         scst_data_direction data_direction;
140         uint16_t rq_result;
141         uint16_t scsi_status;
142         unsigned char *sense_buffer;
143         unsigned int sense_buffer_len;
144         int residual;
145         struct q2t_cmd *cmd;
146         struct ctio_common_entry *pkt;
147 };
148
149 /* ha->hardware_lock supposed to be held on entry (to protect tgt->sess_list) */
150 static inline struct q2t_sess *q2t_find_sess_by_lid(struct q2t_tgt *tgt,
151                                                     uint16_t lid)
152 {
153         struct q2t_sess *sess;
154         sBUG_ON(tgt == NULL);
155         list_for_each_entry(sess, &tgt->sess_list, list) {
156                 if (lid == sess->loop_id)
157                         return sess;
158         }
159
160         return NULL;
161 }
162
163 #endif /* __QLA2X00T_H */