- Implemented abort on timeout of stuck in the firmware commands
[mirror/scst/.git] / qla2x00t / qla2x00-target / qla2x00t.h
1 /*
2  *  qla2x00t.h
3  *
4  *  Copyright (C) 2004 - 2009 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, 2, 0)
34 #define Q2T_VERSION_STRING "1.0.2"
35
36 #define Q2T_MAX_CDB_LEN             16
37 #define Q2T_TIMEOUT                 10  /* in seconds */
38 #define Q2T_MAX_HW_PENDING_TIME     60 /* in seconds */
39
40 /* Immediate notify status constants */
41 #define IMM_NTFY_LIP_RESET          0x000E
42 #define IMM_NTFY_IOCB_OVERFLOW      0x0016
43 #define IMM_NTFY_ABORT_TASK         0x0020
44 #define IMM_NTFY_PORT_LOGOUT        0x0029
45 #define IMM_NTFY_PORT_CONFIG        0x002A
46 #define IMM_NTFY_GLBL_TPRLO         0x002D
47 #define IMM_NTFY_GLBL_LOGO          0x002E
48 #define IMM_NTFY_RESOURCE           0x0034
49 #define IMM_NTFY_MSG_RX             0x0036
50
51 /* Immediate notify task flags */
52 #define IMM_NTFY_CLEAR_ACA          0x4000
53 #define IMM_NTFY_TARGET_RESET       0x2000
54 #define IMM_NTFY_LUN_RESET          0x1000
55 #define IMM_NTFY_CLEAR_TS           0x0400
56 #define IMM_NTFY_ABORT_TS           0x0200
57
58 /* Notify Acknowledge flags */
59 #define NOTIFY_ACK_RES_COUNT        BIT_8
60 #define NOTIFY_ACK_CLEAR_LIP_RESET  BIT_5
61 #define NOTIFY_ACK_TM_RESP_CODE_VALID BIT_4
62
63 /* Command's states */
64 #define Q2T_STATE_NEW               0   /* New command and SCST processing it */
65 #define Q2T_STATE_PROCESSED         1   /* SCST done processing */
66 #define Q2T_STATE_NEED_DATA         2   /* SCST needs data to continue */
67 #define Q2T_STATE_DATA_IN           3   /* Data arrived and SCST processing */
68                                         /* them */
69 #define Q2T_STATE_ABORTED           4   /* Command aborted */
70
71 /* Misc */
72 #define Q2T_NULL_HANDLE             0
73 #define Q2T_SKIP_HANDLE             (0xFFFFFFFE & ~CTIO_COMPLETION_HANDLE_MARK)
74 #define Q2T_BUSY_HANDLE             (0xFFFFFFFF & ~CTIO_COMPLETION_HANDLE_MARK)
75
76 /* ATIO task_codes fields */
77 #define ATIO_SIMPLE_QUEUE           0
78 #define ATIO_HEAD_OF_QUEUE          1
79 #define ATIO_ORDERED_QUEUE          2
80 #define ATIO_ACA_QUEUE              4
81 #define ATIO_UNTAGGED               5
82
83 /* TM failed response code, see FCP */
84 #define FC_TM_FAILED                0x5
85
86 #if (BITS_PER_LONG > 32) || defined(CONFIG_HIGHMEM64G)
87 #define pci_dma_lo32(a) (a & 0xffffffff)
88 #define pci_dma_hi32(a) ((((a) >> 16)>>16) & 0xffffffff)
89 #else
90 #define pci_dma_lo32(a) (a & 0xffffffff)
91 #define pci_dma_hi32(a) 0
92 #endif
93
94 /*
95  * Equivilant to IT Nexus (Initiator-Target)
96  */
97 struct q2t_sess {
98         struct list_head list;
99         struct scst_session *scst_sess;
100         struct q2t_tgt *tgt;
101         int loop_id;
102 };
103
104 struct q2t_cmd {
105         struct q2t_sess *sess;
106         struct scst_cmd *scst_cmd;
107         int state;
108         struct atio_entry atio;
109         dma_addr_t dma_handle;
110         uint32_t iocb_cnt;
111 };
112
113 struct q2t_tgt {
114         struct scst_tgt *scst_tgt;
115         scsi_qla_host_t *ha;
116         int datasegs_per_cmd, datasegs_per_cont;
117         /* Target's flags, serialized by ha->hardware_lock */
118         unsigned int tgt_shutdown:1;    /* The driver is being released */
119         unsigned int tgt_enable_64bit_addr:1; /* 64bit PCI addressing enabled */
120         wait_queue_head_t waitQ;
121         int notify_ack_expected;
122         int modify_lun_expected;
123         /* Count of sessions refering q2t_tgt, protected by hardware_lock */
124         int sess_count;
125         struct list_head sess_list;
126 };
127
128 struct q2t_mgmt_cmd {
129         struct q2t_sess *sess;
130         struct notify_entry notify_entry;
131 };
132
133 struct q2t_prm {
134         struct q2t_tgt *tgt;
135         uint16_t req_cnt;
136         uint16_t seg_cnt;
137         int sg_cnt;
138         struct scatterlist *sg;
139         int bufflen;
140         scst_data_direction data_direction;
141         uint16_t rq_result;
142         uint16_t scsi_status;
143         unsigned char *sense_buffer;
144         unsigned int sense_buffer_len;
145         int residual;
146         struct q2t_cmd *cmd;
147         struct ctio_common_entry *pkt;
148 };
149
150 /* ha->hardware_lock supposed to be held on entry (to protect tgt->sess_list) */
151 static inline struct q2t_sess *q2t_find_sess_by_lid(struct q2t_tgt *tgt,
152                                                     uint16_t lid)
153 {
154         struct q2t_sess *sess;
155         sBUG_ON(tgt == NULL);
156         list_for_each_entry(sess, &tgt->sess_list, list) {
157                 if (lid == sess->loop_id)
158                         return sess;
159         }
160
161         return NULL;
162 }
163
164 #endif /* __QLA2X00T_H */