1/*-
2 * This file is provided under a dual BSD/GPLv2 license.  When using or
3 * redistributing this file, you may do so under either license.
4 *
5 * GPL LICENSE SUMMARY
6 *
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21 * The full GNU General Public License is included in this distribution
22 * in the file called LICENSE.GPL.
23 *
24 * BSD LICENSE
25 *
26 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27 * All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 *
33 *   * Redistributions of source code must retain the above copyright
34 *     notice, this list of conditions and the following disclaimer.
35 *   * Redistributions in binary form must reproduce the above copyright
36 *     notice, this list of conditions and the following disclaimer in
37 *     the documentation and/or other materials provided with the
38 *     distribution.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 *
52 * $FreeBSD$
53 */
54#ifndef _SATI_TRANSLATOR_SEQUENCE_H_
55#define _SATI_TRANSLATOR_SEQUENCE_H_
56
57/**
58 * @file
59 * @brief This file contains all of the defintions for the SATI translator
60 *        sequence.  A translator sequence is simply a defintion for the
61 *        various sequences of commands that occur in this translator.
62 */
63
64#include <dev/isci/scil/sati_device.h>
65
66/**
67 * @enum _SATI_TRANSLATOR_SEQUENCE_TYPE
68 *
69 * @brief This enumeration defines the possible sequence types for the
70 *        translator.
71 */
72typedef enum _SATI_TRANSLATOR_SEQUENCE_TYPE
73{
74   // SCSI Primary Command (SPC) sequences.
75   SATI_SEQUENCE_REPORT_LUNS,
76   SATI_SEQUENCE_TEST_UNIT_READY,
77   SATI_SEQUENCE_INQUIRY_STANDARD,
78   SATI_SEQUENCE_INQUIRY_SUPPORTED_PAGES,
79   SATI_SEQUENCE_INQUIRY_SERIAL_NUMBER,
80   SATI_SEQUENCE_INQUIRY_DEVICE_ID,
81   SATI_SEQUENCE_INQUIRY_ATA_INFORMATION,
82   SATI_SEQUENCE_INQUIRY_BLOCK_DEVICE,
83   SATI_SEQUENCE_INQUIRY_EXECUTE_DEVICE_DIAG,
84   SATI_SEQUENCE_MODE_SENSE_6_CACHING,
85   SATI_SEQUENCE_MODE_SENSE_6_INFORMATIONAL_EXCP_CONTROL,
86   SATI_SEQUENCE_MODE_SENSE_6_READ_WRITE_ERROR,
87   SATI_SEQUENCE_MODE_SENSE_6_DISCONNECT_RECONNECT,
88   SATI_SEQUENCE_MODE_SENSE_6_CONTROL,
89   SATI_SEQUENCE_MODE_SENSE_6_POWER_CONDITION,
90   SATI_SEQUENCE_MODE_SENSE_6_ALL_PAGES,
91   SATI_SEQUENCE_MODE_SENSE_10_CACHING,
92   SATI_SEQUENCE_MODE_SENSE_10_INFORMATIONAL_EXCP_CONTROL,
93   SATI_SEQUENCE_MODE_SENSE_10_READ_WRITE_ERROR,
94   SATI_SEQUENCE_MODE_SENSE_10_DISCONNECT_RECONNECT,
95   SATI_SEQUENCE_MODE_SENSE_10_CONTROL,
96   SATI_SEQUENCE_MODE_SENSE_10_POWER_CONDITION,
97   SATI_SEQUENCE_MODE_SENSE_10_ALL_PAGES,
98   SATI_SEQUENCE_MODE_SELECT_MODE_PAGE_CACHING,
99   SATI_SEQUENCE_MODE_SELECT_MODE_POWER_CONDITION,
100   SATI_SEQUENCE_MODE_SELECT_MODE_INFORMATION_EXCEPT_CONTROL,
101
102      //Log Sense Sequences
103   SATI_SEQUENCE_LOG_SENSE_SELF_TEST_LOG_PAGE,
104   SATI_SEQUENCE_LOG_SENSE_EXTENDED_SELF_TEST_LOG_PAGE,
105   SATI_SEQUENCE_LOG_SENSE_SUPPORTED_LOG_PAGE,
106   SATI_SEQUENCE_LOG_SENSE_INFO_EXCEPTION_LOG_PAGE,
107
108   // SCSI Block Command (SBC) sequences.
109
110   SATI_SEQUENCE_READ_6,
111   SATI_SEQUENCE_READ_10,
112   SATI_SEQUENCE_READ_12,
113   SATI_SEQUENCE_READ_16,
114
115   SATI_SEQUENCE_READ_CAPACITY_10,
116   SATI_SEQUENCE_READ_CAPACITY_16,
117
118   SATI_SEQUENCE_SYNCHRONIZE_CACHE,
119
120   SATI_SEQUENCE_VERIFY_10,
121   SATI_SEQUENCE_VERIFY_12,
122   SATI_SEQUENCE_VERIFY_16,
123
124   SATI_SEQUENCE_WRITE_6,
125   SATI_SEQUENCE_WRITE_10,
126   SATI_SEQUENCE_WRITE_12,
127   SATI_SEQUENCE_WRITE_16,
128
129   SATI_SEQUENCE_WRITE_AND_VERIFY,
130
131   SATI_SEQUENCE_START_STOP_UNIT,
132
133   SATI_SEQUENCE_REASSIGN_BLOCKS,
134
135   // SCSI Task Requests sequences
136
137   SATI_SEQUENCE_LUN_RESET,
138   SATI_SEQUENCE_ABORT_TASK_SET,
139
140   SATI_SEQUENCE_REQUEST_SENSE_SMART_RETURN_STATUS,
141   SATI_SEQUENCE_REQUEST_SENSE_CHECK_POWER_MODE,
142
143   SATI_SEQUENCE_WRITE_LONG,
144
145   SATI_SEQUENCE_UNMAP,
146
147   SATI_SEQUENCE_ATA_PASSTHROUGH_12,
148   SATI_SEQUENCE_ATA_PASSTHROUGH_16,
149
150   SATI_SEQUENCE_READ_BUFFER,
151   SATI_SEQUENCE_WRITE_BUFFER,
152   SATI_SEQUENCE_WRITE_BUFFER_MICROCODE
153
154} SATI_TRANSLATOR_SEQUENCE_TYPE;
155
156#define SATI_SEQUENCE_TYPE_READ_MIN SATI_SEQUENCE_READ_6
157#define SATI_SEQUENCE_TYPE_READ_MAX SATI_SEQUENCE_READ_16
158
159/**
160 * @name SATI_SEQUENCE_STATES
161 *
162 * These constants depict the various state values associated with a
163 * translation sequence.
164 */
165/*@{*/
166#define SATI_SEQUENCE_STATE_INITIAL            0
167#define SATI_SEQUENCE_STATE_TRANSLATE_DATA     1
168#define SATI_SEQUENCE_STATE_AWAIT_RESPONSE     2
169#define SATI_SEQUENCE_STATE_FINAL              3
170#define SATI_SEQUENCE_STATE_INCOMPLETE         4
171#define SATI_SEQUENCE_STATE_READ_ERROR         5
172/*@}*/
173
174/**
175 * @name SATI_DATA_DIRECTIONS
176 *
177 * These constants depict the various types of data directions for a
178 * translation sequence.  Data can flow in/out (read/write) or no data at
179 * all.
180 */
181/*@{*/
182#define SATI_DATA_DIRECTION_NONE 0
183#define SATI_DATA_DIRECTION_IN   1
184#define SATI_DATA_DIRECTION_OUT  2
185/*@}*/
186
187/**
188 * @struct SATI_MODE_SELECT_PROCESSING_STATE
189 *
190 * @brief This structure contains all of the current processing states
191 *        for processing mode select 6 and 10 commands' parameter fields.
192 */
193typedef  struct SATI_MODE_SELECT_PROCESSING_STATE
194{
195   U8       * mode_pages;
196   U32      mode_page_offset;
197   U32      mode_pages_size;
198   U32      size_of_data_processed;
199   U32      total_ata_command_sent;
200   U32      ata_command_sent_for_cmp; // cmp: current mode page
201   BOOL     current_mode_page_processed;
202
203} SATI_MODE_SELECT_PROCESSING_STATE_T;
204
205
206enum SATI_REASSIGN_BLOCKS_ATA_COMMAND_STATUS
207{
208   SATI_REASSIGN_BLOCKS_READY_TO_SEND,
209   SATI_REASSIGN_BLOCKS_COMMAND_FAIL,
210   SATI_REASSIGN_BLOCKS_COMMAND_SUCCESS,
211};
212
213/**
214 * @struct SATI_REASSIGN_BLOCKS_PROCESSING_STATE
215 *
216 * @brief This structure contains all of the current processing states
217 *        for processing reassign block command's parameter fields.
218 */
219typedef struct SATI_REASSIGN_BLOCKS_PROCESSING_STATE
220{
221   U32      lba_offset;
222   U32      block_lists_size;
223   U8       lba_size;
224   U32      size_of_data_processed;
225   U32      ata_command_sent_for_current_lba;
226   BOOL     current_lba_processed;
227   enum     SATI_REASSIGN_BLOCKS_ATA_COMMAND_STATUS  ata_command_status;
228
229}SATI_REASSIGN_BLOCKS_PROCESSING_STATE_T;
230
231#define SATI_ATAPI_REQUEST_SENSE_CDB_LENGTH 12
232
233/**
234 * @struct SATI_ATAPI_DATA
235 *
236 * @brief The SATI_ATAPI_DATA structure is for sati atapi IO specific data.
237 */
238typedef struct SATI_ATAPI_DATA
239{
240  U8 request_sense_cdb[SATI_ATAPI_REQUEST_SENSE_CDB_LENGTH];
241} SATI_ATAPI_DATA_T;
242
243
244enum SATI_UNMAP_ATA_COMMAND_STATUS
245{
246   SATI_UNMAP_READY_TO_SEND,
247   SATI_UNMAP_COMMAND_FAIL,
248   SATI_UNMAP_COMMAND_SUCCESS,
249};
250
251/**
252 * @struct SATI_UNMAP_PROCESSING_STATE
253 *
254 * @brief This structure contains all of the current processing states
255 *        for processing unmap command data translation.
256 */
257typedef struct SATI_UNMAP_PROCESSING_STATE
258{
259   U32      max_unmap_block_descriptors;
260   U32      current_unmap_block_descriptor_index;
261   U32      current_lba_count;
262   SATI_LBA current_lba;
263   SATI_LBA next_lba;
264   U32      max_lba_range_entries;
265   void *   current_dsm_descriptor;
266   void *   virtual_unmap_buffer;
267   U32      physical_unmap_buffer_low;
268   U32      physical_unmap_buffer_high;
269   void *   unmap_buffer_sgl_pair;
270} SATI_UNMAP_PROCESSING_STATE_T;
271
272/**
273 * @struct SATI_TRANSLATOR_SEQUENCE
274 *
275 * @brief This structure contains all of the translation information
276 *        associated with a particular request.
277 */
278typedef struct SATI_TRANSLATOR_SEQUENCE
279{
280   /**
281    * This field contains the sequence type determined by the SATI.
282    */
283   U8 type;
284
285   /**
286    * This field indicates the current state for the sequence.
287    */
288   U8 state;
289
290   /**
291    * This field indicates the data direction (none, read, or write) for
292    * the translated request.
293    */
294   U8 data_direction;
295
296   /**
297    * This field contains the SATA/ATA protocol to be utilized during
298    * the IO transfer.
299    */
300   U8 protocol;
301
302   /**
303    * This field is utilized for sequences requiring data translation.
304    * It specifies the amount of data requested by the caller from the
305    * operation.  It's necessary, because at times the user requests less
306    * data than is available.  Thus, we need to avoid overrunning the
307    * buffer.
308    */
309   U32 allocation_length;
310
311   /**
312    * This field specifies the amount of data that will actually be
313    * transfered across the wire for this ATA request.
314    */
315   U32 ata_transfer_length;
316
317   /**
318   * This field specifies the amount of data bytes that have been
319   * set in a translation sequence. It will be incremented every time
320   * a data byte has been set by a sati translation.
321   */
322   U16 number_data_bytes_set;
323
324   /**
325   * This field indicates whether or not the sense response has been set
326   * by the translation sequence.
327   */
328   BOOL is_sense_response_set;
329
330   /**
331    * This field indicates whether or not the translation requires
332    * response translation.
333    */
334   BOOL is_translate_response_required;
335
336   /**
337    * This field specifies the remote device context for which this
338    * translator sequence is destined.
339    */
340   SATI_DEVICE_T * device;
341
342   /**
343    * This field is utilized to provide the translator with memory space
344    * required for translations that utilize multiple requests.
345    */
346   union {
347      U32 translated_command;
348      U32 move_sector_count;
349      U32 scratch;
350      SATI_REASSIGN_BLOCKS_PROCESSING_STATE_T   reassign_blocks_process_state;
351      SATI_MODE_SELECT_PROCESSING_STATE_T       process_state;
352      SATI_UNMAP_PROCESSING_STATE_T             unmap_process_state;
353      SATI_ATAPI_DATA_T                         sati_atapi_data;
354   } command_specific_data;
355
356} SATI_TRANSLATOR_SEQUENCE_T;
357
358
359
360#endif // _SATI_TRANSLATOR_SEQUENCE_H_
361
362