FreeBSD/Linux Kernel Cross Reference
sys/dev/isci/scil/sati.c
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3 *
4 * This file is provided under a dual BSD/GPLv2 license. When using or
5 * redistributing this file, you may do so under either license.
6 *
7 * GPL LICENSE SUMMARY
8 *
9 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23 * The full GNU General Public License is included in this distribution
24 * in the file called LICENSE.GPL.
25 *
26 * BSD LICENSE
27 *
28 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29 * All rights reserved.
30 *
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
33 * are met:
34 *
35 * * Redistributions of source code must retain the above copyright
36 * notice, this list of conditions and the following disclaimer.
37 * * Redistributions in binary form must reproduce the above copyright
38 * notice, this list of conditions and the following disclaimer in
39 * the documentation and/or other materials provided with the
40 * distribution.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53 */
54
55 #include <sys/cdefs.h>
56 __FBSDID("$FreeBSD$");
57
58 /**
59 * @file
60 * @brief This file contains all of the method implementations that
61 * can be utilized by a user to perform SCSI-to-ATA Translation.
62 * SATI adheres to the www.t10.org SAT specification.
63 *
64 * For situations where compliance is not observed, the SATI will
65 * return an error indication (most likely INVALID FIELD IN CDB sense data).
66 */
67
68 #include <dev/isci/scil/sati.h>
69 #include <dev/isci/scil/sati_callbacks.h>
70 #include <dev/isci/scil/sati_util.h>
71 #include <dev/isci/scil/sati_report_luns.h>
72 #include <dev/isci/scil/sati_inquiry.h>
73 #include <dev/isci/scil/sati_mode_sense_6.h>
74 #include <dev/isci/scil/sati_mode_sense_10.h>
75 #include <dev/isci/scil/sati_mode_select.h>
76 #include <dev/isci/scil/sati_test_unit_ready.h>
77 #include <dev/isci/scil/sati_read_capacity.h>
78 #include <dev/isci/scil/sati_read.h>
79 #include <dev/isci/scil/sati_write.h>
80 #include <dev/isci/scil/sati_verify.h>
81 #include <dev/isci/scil/sati_synchronize_cache.h>
82 #include <dev/isci/scil/sati_lun_reset.h>
83 #include <dev/isci/scil/sati_start_stop_unit.h>
84 #include <dev/isci/scil/sati_request_sense.h>
85 #include <dev/isci/scil/sati_write_long.h>
86 #include <dev/isci/scil/sati_reassign_blocks.h>
87 #include <dev/isci/scil/sati_log_sense.h>
88 #include <dev/isci/scil/sati_abort_task_set.h>
89 #include <dev/isci/scil/sati_unmap.h>
90 #include <dev/isci/scil/sati_passthrough.h>
91 #include <dev/isci/scil/sati_write_and_verify.h>
92 #include <dev/isci/scil/sati_read_buffer.h>
93 #include <dev/isci/scil/sati_write_buffer.h>
94 #include <dev/isci/scil/intel_ata.h>
95 #include <dev/isci/scil/intel_scsi.h>
96 #include <dev/isci/scil/intel_sat.h>
97
98 //******************************************************************************
99 //* P R I V A T E M E T H O D S
100 //******************************************************************************
101
102 /**
103 * @brief This method performs the translation of ATA error register values
104 * into SCSI sense data.
105 * For more information on the parameter passed to this method please
106 * reference the sati_translate_response() method.
107 *
108 * @param[in] error This parameter specifies the contents of the ATA error
109 * register to be translated.
110 *
111 * @return none
112 */
113 void sati_translate_error(
114 SATI_TRANSLATOR_SEQUENCE_T * sequence,
115 void * scsi_io,
116 U8 error
117 )
118 {
119 if (error & ATA_ERROR_REG_NO_MEDIA_BIT)
120 {
121 sati_scsi_sense_data_construct(
122 sequence,
123 scsi_io,
124 SCSI_STATUS_CHECK_CONDITION,
125 SCSI_SENSE_NOT_READY,
126 SCSI_ASC_MEDIUM_NOT_PRESENT,
127 SCSI_ASCQ_MEDIUM_NOT_PRESENT
128 );
129 }
130 else if (error & ATA_ERROR_REG_MEDIA_CHANGE_BIT)
131 {
132 sati_scsi_sense_data_construct(
133 sequence,
134 scsi_io,
135 SCSI_STATUS_CHECK_CONDITION,
136 SCSI_SENSE_UNIT_ATTENTION,
137 SCSI_ASC_NOT_READY_TO_READY_CHANGE,
138 SCSI_ASCQ_NOT_READY_TO_READY_CHANGE
139 );
140 }
141 else if (error & ATA_ERROR_REG_MEDIA_CHANGE_REQUEST_BIT)
142 {
143 sati_scsi_sense_data_construct(
144 sequence,
145 scsi_io,
146 SCSI_STATUS_CHECK_CONDITION,
147 SCSI_SENSE_UNIT_ATTENTION,
148 SCSI_ASC_MEDIUM_REMOVAL_REQUEST,
149 SCSI_ASCQ_MEDIUM_REMOVAL_REQUEST
150 );
151 }
152 else if (error & ATA_ERROR_REG_ID_NOT_FOUND_BIT)
153 {
154 sati_scsi_sense_data_construct(
155 sequence,
156 scsi_io,
157 SCSI_STATUS_CHECK_CONDITION,
158 SCSI_SENSE_ILLEGAL_REQUEST,
159 SCSI_ASC_LBA_OUT_OF_RANGE,
160 SCSI_ASCQ_LBA_OUT_OF_RANGE
161 );
162 }
163 else if (error & ATA_ERROR_REG_UNCORRECTABLE_BIT)
164 {
165 //Mark the Sequence state as a read error so more sense data
166 //can be returned later
167 sequence->state = SATI_SEQUENCE_STATE_READ_ERROR;
168 sati_scsi_sense_data_construct(
169 sequence,
170 scsi_io,
171 SCSI_STATUS_CHECK_CONDITION,
172 SCSI_SENSE_MEDIUM_ERROR,
173 SCSI_ASC_UNRECOVERED_READ_ERROR,
174 SCSI_ASCQ_UNRECOVERED_READ_ERROR
175 );
176 }
177 else if ( (sequence->data_direction == SATI_DATA_DIRECTION_OUT)
178 && (error & ATA_ERROR_REG_WRITE_PROTECTED_BIT) )
179 {
180 sati_scsi_sense_data_construct(
181 sequence,
182 scsi_io,
183 SCSI_STATUS_CHECK_CONDITION,
184 SCSI_SENSE_DATA_PROTECT,
185 SCSI_ASC_WRITE_PROTECTED,
186 SCSI_ASCQ_WRITE_PROTECTED
187 );
188 }
189 else if (error & ATA_ERROR_REG_ICRC_BIT)
190 {
191 sati_scsi_sense_data_construct(
192 sequence,
193 scsi_io,
194 SCSI_STATUS_CHECK_CONDITION,
195 SCSI_SENSE_ABORTED_COMMAND,
196 SCSI_ASC_IU_CRC_ERROR_DETECTED,
197 SCSI_ASCQ_IU_CRC_ERROR_DETECTED
198 );
199 }
200 else // (error & ATA_ERROR_REG_ABORT_BIT)
201 {
202 // The ABORT bit has the lowest precedence of all errors.
203 // As a result, it is at the bottom of the conditional
204 // statement.
205 sati_scsi_sense_data_construct(
206 sequence,
207 scsi_io,
208 SCSI_STATUS_CHECK_CONDITION,
209 SCSI_SENSE_ABORTED_COMMAND,
210 SCSI_ASC_NO_ADDITIONAL_SENSE,
211 SCSI_ASCQ_NO_ADDITIONAL_SENSE
212 );
213 }
214 }
215
216 /**
217 * @brief This method translates the supplied ATA payload data into the
218 * corresponding SCSI data. This is necessary for SCSI commands
219 * that have well-defined payload data associated with them (e.g.
220 * READ CAPACITY).
221 *
222 * @param[in] sequence This parameter specifies the sequence
223 * data associated with the translation.
224 * @param[in] ata_io This parameter specifies the ATA payload
225 * buffer location and size to be translated.
226 * @param[out] scsi_output_data This parameter specifies the SCSI payload
227 * memory area into which the translator is to write.
228 *
229 * @return none
230 */
231 static
232 void sati_translate_data(
233 SATI_TRANSLATOR_SEQUENCE_T * sequence,
234 void * ata_input_data,
235 void * scsi_io
236 )
237 {
238 // Update the device capabilities in the odd/crazy event something changed.
239 sati_device_update_capabilities(
240 sequence->device, (ATA_IDENTIFY_DEVICE_DATA_T*) ata_input_data
241 );
242
243 // Look at the first byte to determine the SCSI command to translate.
244 switch (sequence->type)
245 {
246 #if !defined(DISABLE_SATI_INQUIRY)
247 case SATI_SEQUENCE_INQUIRY_STANDARD:
248 sati_inquiry_standard_translate_data(
249 sequence, ata_input_data, scsi_io
250 );
251 break;
252
253 case SATI_SEQUENCE_INQUIRY_SERIAL_NUMBER:
254 sati_inquiry_serial_number_translate_data(
255 sequence, ata_input_data, scsi_io
256 );
257 break;
258
259 case SATI_SEQUENCE_INQUIRY_DEVICE_ID:
260 sati_inquiry_device_id_translate_data(
261 sequence, ata_input_data, scsi_io
262 );
263 break;
264
265 case SATI_SEQUENCE_INQUIRY_BLOCK_DEVICE:
266 sati_inquiry_block_device_translate_data(
267 sequence, ata_input_data, scsi_io
268 );
269 break;
270
271 case SATI_SEQUENCE_INQUIRY_ATA_INFORMATION:
272 sati_inquiry_ata_information_translate_data(
273 sequence, ata_input_data, scsi_io
274 );
275 break;
276
277 #endif // !defined(DISABLE_SATI_INQUIRY)
278
279 #if !defined(DISABLE_SATI_READ_CAPACITY)
280 case SATI_SEQUENCE_READ_CAPACITY_10:
281 sati_read_capacity_10_translate_data(sequence, ata_input_data, scsi_io);
282 break;
283
284 case SATI_SEQUENCE_READ_CAPACITY_16:
285 sati_read_capacity_16_translate_data(sequence, ata_input_data, scsi_io);
286 break;
287 #endif // !defined(DISABLE_SATI_READ_CAPACITY)
288
289 #if !defined(DISABLE_SATI_MODE_SENSE)
290 case SATI_SEQUENCE_MODE_SENSE_6_CACHING:
291 sati_mode_sense_6_caching_translate_data(
292 sequence, ata_input_data, scsi_io
293 );
294 break;
295
296 case SATI_SEQUENCE_MODE_SENSE_6_INFORMATIONAL_EXCP_CONTROL:
297 sati_mode_sense_6_informational_excp_control_translate_data(
298 sequence, ata_input_data, scsi_io
299 );
300 break;
301
302 case SATI_SEQUENCE_MODE_SENSE_6_READ_WRITE_ERROR:
303 sati_mode_sense_6_read_write_error_translate_data(
304 sequence, ata_input_data, scsi_io
305 );
306 break;
307
308 case SATI_SEQUENCE_MODE_SENSE_6_DISCONNECT_RECONNECT:
309 sati_mode_sense_6_disconnect_reconnect_translate_data(
310 sequence, ata_input_data, scsi_io
311 );
312 break;
313
314 case SATI_SEQUENCE_MODE_SENSE_6_CONTROL:
315 sati_mode_sense_6_control_translate_data(
316 sequence, ata_input_data, scsi_io
317 );
318 break;
319
320 case SATI_SEQUENCE_MODE_SENSE_6_ALL_PAGES:
321 sati_mode_sense_6_all_pages_translate_data(
322 sequence, ata_input_data, scsi_io
323 );
324 break;
325
326 case SATI_SEQUENCE_MODE_SENSE_6_POWER_CONDITION:
327 sati_mode_sense_6_power_condition_translate_data(
328 sequence, ata_input_data, scsi_io
329 );
330 break;
331
332 case SATI_SEQUENCE_MODE_SENSE_10_POWER_CONDITION:
333 sati_mode_sense_10_power_condition_translate_data(
334 sequence, ata_input_data, scsi_io
335 );
336 break;
337
338 case SATI_SEQUENCE_MODE_SENSE_10_CACHING:
339 sati_mode_sense_10_caching_translate_data(
340 sequence, ata_input_data, scsi_io
341 );
342 break;
343
344 case SATI_SEQUENCE_MODE_SENSE_10_INFORMATIONAL_EXCP_CONTROL:
345 sati_mode_sense_10_informational_excp_control_translate_data(
346 sequence, ata_input_data, scsi_io
347 );
348 break;
349
350 case SATI_SEQUENCE_MODE_SENSE_10_READ_WRITE_ERROR:
351 sati_mode_sense_10_read_write_error_translate_data(
352 sequence, ata_input_data, scsi_io
353 );
354 break;
355
356 case SATI_SEQUENCE_MODE_SENSE_10_DISCONNECT_RECONNECT:
357 sati_mode_sense_10_disconnect_reconnect_translate_data(
358 sequence, ata_input_data, scsi_io
359 );
360 break;
361
362 case SATI_SEQUENCE_MODE_SENSE_10_CONTROL:
363 sati_mode_sense_10_control_translate_data(
364 sequence, ata_input_data, scsi_io
365 );
366 break;
367
368 case SATI_SEQUENCE_MODE_SENSE_10_ALL_PAGES:
369 sati_mode_sense_10_all_pages_translate_data(
370 sequence, ata_input_data, scsi_io
371 );
372 break;
373 #endif // !defined(DISABLE_SATI_MODE_SENSE)
374
375 default:
376 break;
377 }
378 }
379
380 //******************************************************************************
381 //* P U B L I C M E T H O D S
382 //******************************************************************************
383
384 SATI_STATUS sati_translate_command(
385 SATI_TRANSLATOR_SEQUENCE_T * sequence,
386 SATI_DEVICE_T * sati_device,
387 void * scsi_io,
388 void * ata_io
389 )
390 {
391 SATI_STATUS status = SATI_FAILURE;
392 U8 * cdb = sati_cb_get_cdb_address(scsi_io);
393
394 //No sense response has been set for the translation sequence yet
395 sequence->is_sense_response_set = FALSE;
396 // Default to no translation response required
397 sequence->is_translate_response_required = FALSE;
398 // Assign sati_device to sequence
399 sequence->device = sati_device;
400
401 /**
402 * Fail any I/O request with LUN != 0
403 */
404 if (sati_cb_get_lun(scsi_io) != 0)
405 {
406 sati_scsi_sense_data_construct(
407 sequence,
408 scsi_io,
409 SCSI_STATUS_CHECK_CONDITION,
410 SCSI_SENSE_ILLEGAL_REQUEST,
411 SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED,
412 0
413 );
414 return SATI_FAILURE_CHECK_RESPONSE_DATA;
415 }
416
417 /**
418 * SAT dictates:
419 * - the NACA bit in the control byte (last byte) must be 0
420 */
421 if ( (sati_get_cdb_byte(cdb, sati_cb_get_cdb_length(scsi_io) - 1)
422 & SCSI_CONTROL_BYTE_NACA_BIT_ENABLE))
423 {
424 sati_scsi_sense_data_construct(
425 sequence,
426 scsi_io,
427 SCSI_STATUS_CHECK_CONDITION,
428 SCSI_SENSE_ILLEGAL_REQUEST,
429 SCSI_ASC_INVALID_FIELD_IN_CDB,
430 SCSI_ASCQ_INVALID_FIELD_IN_CDB
431 );
432 return SATI_FAILURE_CHECK_RESPONSE_DATA;
433 }
434
435 /**
436 * Per SAT "Error and sense reporting" section. All subsequent IOs after
437 * a device fault should receive INTERNAL TARGET FAILURE sense data.
438 */
439 if (sati_device->state == SATI_DEVICE_STATE_DEVICE_FAULT_OCCURRED)
440 {
441 sati_scsi_sense_data_construct(
442 sequence,
443 scsi_io,
444 SCSI_STATUS_CHECK_CONDITION,
445 SCSI_SENSE_HARDWARE_ERROR,
446 SCSI_ASC_INTERNAL_TARGET_FAILURE,
447 SCSI_ASCQ_INTERNAL_TARGET_FAILURE
448 );
449 return SATI_FAILURE_CHECK_RESPONSE_DATA;
450 }
451
452 if(sequence->state == SATI_SEQUENCE_STATE_INITIAL)
453 {
454 sequence->command_specific_data.scratch = 0;
455 sequence->number_data_bytes_set = 0;
456 }
457
458
459 #ifdef SATI_TRANSPORT_SUPPORTS_SATA
460 {
461 U8 * register_fis = sati_cb_get_h2d_register_fis_address(ata_io);
462 sati_set_sata_command_flag(register_fis);
463 sati_set_sata_fis_type(register_fis, SATA_FIS_TYPE_REGH2D);
464 }
465 #endif // SATI_TRANSPORT_SUPPORTS_SATA
466
467 // Look at the first byte to determine the SCSI command to translate.
468 switch (sati_get_cdb_byte(cdb, 0))
469 {
470 #if !defined(DISABLE_SATI_REPORT_LUNS)
471 case SCSI_REPORT_LUNS:
472 status = sati_report_luns_translate_command(
473 sequence, scsi_io, ata_io
474 );
475 break;
476 #endif // !defined(DISABLE_SATI_REPORT_LUNS)
477
478 #if !defined(DISABLE_SATI_INQUIRY)
479 case SCSI_INQUIRY:
480 status = sati_inquiry_translate_command(
481 sequence, scsi_io, ata_io
482 );
483 break;
484 #endif // !defined(DISABLE_SATI_INQUIRY)
485
486 #if !defined(DISABLE_SATI_MODE_SENSE)
487 case SCSI_MODE_SENSE_6:
488 status = sati_mode_sense_6_translate_command(
489 sequence, scsi_io, ata_io
490 );
491 break;
492
493 case SCSI_MODE_SENSE_10:
494 status = sati_mode_sense_10_translate_command(
495 sequence, scsi_io, ata_io
496 );
497 break;
498 #endif // !defined(DISABLE_SATI_MODE_SENSE)
499
500 #if !defined(DISABLE_SATI_MODE_SELECT)
501 case SCSI_MODE_SELECT_6:
502 status = sati_mode_select_6_translate_command(
503 sequence, scsi_io, ata_io
504 );
505 break;
506
507 case SCSI_MODE_SELECT_10:
508 status = sati_mode_select_10_translate_command(
509 sequence, scsi_io, ata_io
510 );
511 break;
512 #endif // !defined(DISABLE_SATI_MODE_SELECT)
513
514 #if !defined(DISABLE_SATI_TEST_UNIT_READY)
515 case SCSI_TEST_UNIT_READY:
516 status = sati_test_unit_ready_translate_command(
517 sequence, scsi_io, ata_io
518 );
519 break;
520 #endif // !defined(DISABLE_SATI_TEST_UNIT_READY)
521
522 #if !defined(DISABLE_SATI_READ_CAPACITY)
523 case SCSI_READ_CAPACITY_10:
524 status = sati_read_capacity_10_translate_command(
525 sequence, scsi_io, ata_io
526 );
527 break;
528
529 case SCSI_SERVICE_ACTION_IN_16:
530 if ( (sati_get_cdb_byte(cdb, 1) & SCSI_SERVICE_ACTION_MASK)
531 == SCSI_SERVICE_ACTION_IN_CODES_READ_CAPACITY_16)
532 status = sati_read_capacity_16_translate_command(
533 sequence, scsi_io, ata_io
534 );
535 else
536 status = SATI_FAILURE_CHECK_RESPONSE_DATA;
537 break;
538 #endif // !defined(DISABLE_SATI_READ_CAPACITY)
539
540 #if !defined(DISABLE_SATI_REQUEST_SENSE)
541 case SCSI_REQUEST_SENSE:
542 status = sati_request_sense_translate_command(
543 sequence, scsi_io, ata_io
544 );
545 break;
546 #endif // !defined(DISABLE_SATI_REQUEST_SENSE)
547
548 case SCSI_READ_6:
549 status = sati_read_6_translate_command(sequence, scsi_io, ata_io);
550 break;
551
552 case SCSI_READ_10:
553 status = sati_read_10_translate_command(sequence, scsi_io, ata_io);
554 break;
555
556 case SCSI_READ_12:
557 status = sati_read_12_translate_command(sequence, scsi_io, ata_io);
558 break;
559
560 case SCSI_READ_16:
561 status = sati_read_16_translate_command(sequence, scsi_io, ata_io);
562 break;
563
564 case SCSI_WRITE_6:
565 status = sati_write_6_translate_command(sequence, scsi_io, ata_io);
566 break;
567
568 case SCSI_WRITE_10:
569 status = sati_write_10_translate_command(sequence, scsi_io, ata_io);
570 break;
571
572 case SCSI_WRITE_12:
573 status = sati_write_12_translate_command(sequence, scsi_io, ata_io);
574 break;
575
576 case SCSI_WRITE_16:
577 status = sati_write_16_translate_command(sequence, scsi_io, ata_io);
578 break;
579
580 #if !defined(DISABLE_SATI_VERIFY)
581 case SCSI_VERIFY_10:
582 status = sati_verify_10_translate_command(sequence, scsi_io, ata_io);
583 break;
584
585 case SCSI_VERIFY_12:
586 status = sati_verify_12_translate_command(sequence, scsi_io, ata_io);
587 break;
588
589 case SCSI_VERIFY_16:
590 status = sati_verify_16_translate_command(sequence, scsi_io, ata_io);
591 break;
592 #endif // !defined(DISABLE_SATI_VERIFY)
593
594 #if !defined(DISABLE_SATI_WRITE_AND_VERIFY) \
595 && !defined(DISABLE_SATI_VERIFY) \
596 && !defined(DISABLE_SATI_WRITE)
597
598 case SCSI_WRITE_AND_VERIFY_10:
599 status = sati_write_and_verify_10_translate_command(sequence, scsi_io, ata_io);
600 break;
601
602 case SCSI_WRITE_AND_VERIFY_12:
603 status = sati_write_and_verify_12_translate_command(sequence, scsi_io, ata_io);
604 break;
605
606 case SCSI_WRITE_AND_VERIFY_16:
607 status = sati_write_and_verify_16_translate_command(sequence, scsi_io, ata_io);
608 break;
609 #endif // !defined(DISABLE_SATI_WRITE_AND_VERIFY)
610 // && !defined(DISABLE_SATI_VERIFY)
611 // && !defined(DISABLE_SATI_WRITE)
612
613 #if !defined(DISABLE_SATI_REASSIGN_BLOCKS)
614 case SCSI_REASSIGN_BLOCKS:
615 status = sati_reassign_blocks_translate_command(sequence, scsi_io, ata_io);
616 break;
617 #endif // !defined(DISABLE_SATI_REASSIGN_BLOCKS)
618
619 #if !defined(DISABLE_SATI_SYNCHRONIZE_CACHE)
620 case SCSI_SYNCHRONIZE_CACHE_10:
621 case SCSI_SYNCHRONIZE_CACHE_16:
622 status = sati_synchronize_cache_translate_command(sequence, scsi_io, ata_io);
623 break;
624 #endif // !defined(DISABLE_SATI_SYNCHRONIZE_CACHE)
625
626 #if !defined(DISABLE_SATI_START_STOP_UNIT)
627 case SCSI_START_STOP_UNIT:
628 status = sati_start_stop_unit_translate_command(
629 sequence, scsi_io, ata_io
630 );
631 break;
632 #endif // !defined(DISABLE_SATI_START_STOP_UNIT)
633
634 #if !defined(DISABLE_SATI_WRITE_LONG)
635 case SCSI_WRITE_LONG_10:
636 case SCSI_WRITE_LONG_16:
637 status = sati_write_long_translate_command(sequence, scsi_io, ata_io);
638 break;
639 #endif // !defined(DISABLE_SATI_WRITE_LONG)
640
641 #if !defined(DISABLE_SATI_LOG_SENSE)
642 case SCSI_LOG_SENSE:
643 status = sati_log_sense_translate_command(sequence, scsi_io, ata_io);
644 break;
645 #endif // !defined(DISABLE_SATI_LOG_SENSE)
646
647 case SCSI_PERSISTENT_RESERVE_IN:
648 case SCSI_PERSISTENT_RESERVE_OUT:
649 //These commands are not supported by SATI
650 sati_scsi_sense_data_construct(
651 sequence,
652 scsi_io,
653 SCSI_STATUS_CHECK_CONDITION,
654 SCSI_SENSE_ILLEGAL_REQUEST,
655 SCSI_ASC_INVALID_COMMAND_OPERATION_CODE,
656 SCSI_ASCQ_INVALID_COMMAND_OPERATION_CODE
657 );
658 //returning status now to keep sense data set above
659 return SATI_FAILURE_CHECK_RESPONSE_DATA;
660 break;
661
662 #if !defined(DISABLE_SATI_UNMAP)
663 case SCSI_UNMAP:
664 status = sati_unmap_translate_command(sequence, scsi_io, ata_io);
665 break;
666 #endif // !defined(DISABLE_SATI_UNMAP)
667
668 #if !defined(DISABLE_SATI_ATA_PASSTHROUGH)
669 case SCSI_ATA_PASSTHRU_12:
670 status = sati_passthrough_12_translate_command(sequence, scsi_io, ata_io);
671 break;
672
673 case SCSI_ATA_PASSTHRU_16:
674 status = sati_passthrough_16_translate_command(sequence, scsi_io, ata_io);
675 break;
676
677 #endif // !define(DISABLE_SATI_ATA_PASSTHRU)
678
679 #if !defined(DISABLE_SATI_READ_BUFFER)
680 case SCSI_READ_BUFFER:
681 status = sati_read_buffer_translate_command(sequence, scsi_io, ata_io);
682 break;
683 #endif //!defined(DISABLE_SATI_READ_BUFFER)
684
685 #if !defined(DISABLE_SATI_WRITE_BUFFER)
686 case SCSI_WRITE_BUFFER:
687 status = sati_write_buffer_translate_command(sequence, scsi_io, ata_io);
688 break;
689 #endif //!defined(DISABLE_SATI_WRITE_BUFFER)
690 default:
691 status = SATI_FAILURE_CHECK_RESPONSE_DATA;
692 break;
693 }
694
695 if( (status == SATI_FAILURE_CHECK_RESPONSE_DATA) &&
696 !(sequence->is_sense_response_set) )
697 {
698 sati_scsi_sense_data_construct(
699 sequence,
700 scsi_io,
701 SCSI_STATUS_CHECK_CONDITION,
702 SCSI_SENSE_ILLEGAL_REQUEST,
703 SCSI_ASC_INVALID_FIELD_IN_CDB,
704 SCSI_ASCQ_INVALID_FIELD_IN_CDB
705 );
706 }
707 return status;
708 }
709
710 // -----------------------------------------------------------------------------
711
712 #if !defined(DISABLE_SATI_TASK_MANAGEMENT)
713 SATI_STATUS sati_translate_task_management(
714 SATI_TRANSLATOR_SEQUENCE_T * sequence,
715 SATI_DEVICE_T * sati_device,
716 void * scsi_task,
717 void * ata_io
718 )
719 {
720 SATI_STATUS status=SATI_FAILURE;
721 U8 task_function = sati_cb_get_task_function(scsi_task);
722
723 sequence->device = sati_device;
724
725 switch (task_function)
726 {
727 /**
728 * @todo We need to update the ABORT_TASK and ABORT_TASK_SET to be
729 * SAT compliant.
730 */
731 case SCSI_TASK_REQUEST_ABORT_TASK:
732 case SCSI_TASK_REQUEST_LOGICAL_UNIT_RESET:
733 status = sati_lun_reset_translate_command(sequence, scsi_task, ata_io);
734 break;
735
736 case SCSI_TASK_REQUEST_ABORT_TASK_SET:
737 #if !defined(DISABLE_SATI_ABORT_TASK_SET)
738 status = sati_abort_task_set_translate_command(sequence, scsi_task, ata_io);
739 #else
740 status = SATI_FAILURE;
741 #endif
742 break;
743 default:
744 status = SATI_FAILURE;
745 break;
746 }
747
748 return status;
749 }
750 #endif // !defined(DISABLE_SATI_TASK_MANAGEMENT)
751
752 // -----------------------------------------------------------------------------
753 #if !defined(DISABLE_SATI_INQUIRY) \
754 || !defined(DISABLE_SATI_READY_CAPACITY) \
755 || !defined(DISABLE_SATI_MODE_SENSE) \
756 || !defined(DISABLE_SATI_MODE_SELECT) \
757 || !defined(DISABLE_SATI_REASSIGN_BLOCKS) \
758 || !defined(DISABLE_SATI_START_STOP_UNIT) \
759 || !defined(DISABLE_SATI_REQUEST_SENSE) \
760 || !defined(DISABLE_SATI_WRITE_LONG) \
761 || !defined(DISABLE_SATI_LOG_SENSE) \
762 || !defined(DISABLE_SATI_UNMAP)
763
764 static
765 SATI_STATUS sati_check_data_io(
766 SATI_TRANSLATOR_SEQUENCE_T * sequence
767 )
768 {
769 if(sequence->state == SATI_SEQUENCE_STATE_INCOMPLETE)
770 {
771 return SATI_SEQUENCE_INCOMPLETE;
772 }
773 else if(sequence->number_data_bytes_set < sequence->allocation_length)
774 {
775 return SATI_COMPLETE_IO_DONE_EARLY;
776 }
777 else
778 {
779 return SATI_COMPLETE;
780 }
781 }
782 #endif // !defined(DISABLE_SATI_INQUIRY)
783 // || !defined(DISABLE_SATI_READY_CAPACITY)
784 // || !defined(DISABLE_SATI_MODE_SENSE)
785 // || !defined(DISABLE_SATI_MODE_SELECT)
786 // || !defined(DISABLE_SATI_REASSIGN_BLOCKS)
787 // || !defined(DISABLE_SATI_START_STOP_UNIT)
788 // || !defined(DISABLE_SATI_REQUEST_SENSE)
789 // || !defined(DISABLE_SATI_WRITE_LONG)
790 // || !defined(DISABLE_SATI_LOG_SENSE)
791 // || !defined(DISABLE_SATI_UNMAP)
792 // -----------------------------------------------------------------------------
793 SATI_STATUS sati_translate_command_response(
794 SATI_TRANSLATOR_SEQUENCE_T * sequence,
795 void * scsi_io,
796 void * ata_io
797 )
798 {
799 SATI_STATUS status = SATI_COMPLETE;
800 U8 * register_fis = sati_cb_get_d2h_register_fis_address(ata_io);
801 U8 ata_status;
802
803 /**
804 * If the device fault bit is set in the status register, then
805 * set the sense data and return.
806 */
807 ata_status = (U8) sati_get_ata_status(register_fis);
808 if (ata_status & ATA_STATUS_REG_DEVICE_FAULT_BIT)
809 {
810 sati_scsi_sense_data_construct(
811 sequence,
812 scsi_io,
813 SCSI_STATUS_CHECK_CONDITION,
814 SCSI_SENSE_HARDWARE_ERROR,
815 SCSI_ASC_INTERNAL_TARGET_FAILURE,
816 SCSI_ASCQ_INTERNAL_TARGET_FAILURE
817 );
818
819 sequence->device->state = SATI_DEVICE_STATE_DEVICE_FAULT_OCCURRED;
820
821 // Make sure that the terminate sequence is called to allow
822 // translation logic to perform any cleanup before the IO is completed.
823 sati_sequence_terminate(sequence,
824 scsi_io,
825 ata_io);
826
827 return SATI_FAILURE_CHECK_RESPONSE_DATA;
828 }
829
830 // Look at the sequence type to determine the response translation method
831 // to invoke.
832 switch (sequence->type)
833 {
834 #if !defined(DISABLE_SATI_TEST_UNIT_READY)
835 case SATI_SEQUENCE_TEST_UNIT_READY:
836 status = sati_test_unit_ready_translate_response(
837 sequence, scsi_io, ata_io
838 );
839 break;
840 #endif // !defined(DISABLE_SATI_TEST_UNIT_READY)
841
842 #if !defined(DISABLE_SATI_INQUIRY) \
843 || !defined(DISABLE_SATI_READY_CAPACITY) \
844 || !defined(DISABLE_SATI_MODE_SENSE)
845
846 case SATI_SEQUENCE_INQUIRY_EXECUTE_DEVICE_DIAG:
847
848 if (ata_status & ATA_STATUS_REG_ERROR_BIT)
849 {
850 U8 error = (U8) sati_get_ata_error(register_fis);
851 status = SATI_FAILURE_CHECK_RESPONSE_DATA;
852 sati_translate_error(sequence, scsi_io, error);
853 }
854 else
855 {
856 sati_inquiry_ata_information_finish_translation(
857 sequence,
858 scsi_io,
859 ata_io
860 );
861 status = sati_check_data_io(sequence);
862 }
863 break;
864
865 case SATI_SEQUENCE_INQUIRY_STANDARD:
866 case SATI_SEQUENCE_INQUIRY_SUPPORTED_PAGES:
867 case SATI_SEQUENCE_INQUIRY_SERIAL_NUMBER:
868 case SATI_SEQUENCE_INQUIRY_BLOCK_DEVICE:
869 case SATI_SEQUENCE_INQUIRY_ATA_INFORMATION:
870 case SATI_SEQUENCE_INQUIRY_DEVICE_ID:
871 case SATI_SEQUENCE_READ_CAPACITY_10:
872 case SATI_SEQUENCE_READ_CAPACITY_16:
873 case SATI_SEQUENCE_MODE_SENSE_6_CACHING:
874 case SATI_SEQUENCE_MODE_SENSE_6_INFORMATIONAL_EXCP_CONTROL:
875 case SATI_SEQUENCE_MODE_SENSE_6_READ_WRITE_ERROR:
876 case SATI_SEQUENCE_MODE_SENSE_6_DISCONNECT_RECONNECT:
877 case SATI_SEQUENCE_MODE_SENSE_6_CONTROL:
878 case SATI_SEQUENCE_MODE_SENSE_6_POWER_CONDITION:
879 case SATI_SEQUENCE_MODE_SENSE_6_ALL_PAGES:
880 case SATI_SEQUENCE_MODE_SENSE_10_CACHING:
881 case SATI_SEQUENCE_MODE_SENSE_10_INFORMATIONAL_EXCP_CONTROL:
882 case SATI_SEQUENCE_MODE_SENSE_10_READ_WRITE_ERROR:
883 case SATI_SEQUENCE_MODE_SENSE_10_CONTROL:
884 case SATI_SEQUENCE_MODE_SENSE_10_POWER_CONDITION:
885 case SATI_SEQUENCE_MODE_SENSE_10_DISCONNECT_RECONNECT:
886 case SATI_SEQUENCE_MODE_SENSE_10_ALL_PAGES:
887 // Did an error occur during the IO request?
888 if (ata_status & ATA_STATUS_REG_ERROR_BIT)
889 {
890 U8 error = (U8) sati_get_ata_error(register_fis);
891 status = SATI_FAILURE_CHECK_RESPONSE_DATA;
892 sati_translate_error(sequence, scsi_io, error);
893 }
894 else
895 {
896 void * ata_data = sati_cb_get_ata_data_address(ata_io);
897
898 if(ata_data == NULL)
899 {
900 status = SATI_FAILURE;
901 }
902 else
903 {
904 sati_translate_data(sequence, ata_data, scsi_io);
905 status = sati_check_data_io(sequence);
906 }
907 }
908 break;
909 #endif // !defined(DISABLE_SATI_INQUIRY)
910 // && !defined(DISABLE_SATI_READY_CAPACITY)
911 // && !defined(DISABLE_SATI_MODE_SENSE)
912
913 #if !defined(DISABLE_SATI_MODE_SELECT)
914 case SATI_SEQUENCE_MODE_SELECT_MODE_PAGE_CACHING:
915
916 status = sati_mode_select_translate_response(
917 sequence, scsi_io, ata_io
918 );
919 if(status == SATI_COMPLETE)
920 {
921 status = sati_check_data_io(sequence);
922 }
923 break;
924
925 case SATI_SEQUENCE_MODE_SELECT_MODE_POWER_CONDITION:
926 case SATI_SEQUENCE_MODE_SELECT_MODE_INFORMATION_EXCEPT_CONTROL:
927 // Did an error occur during the IO request?
928 if (ata_status & ATA_STATUS_REG_ERROR_BIT)
929 {
930 U8 error = (U8) sati_get_ata_error(register_fis);
931 status = SATI_FAILURE_CHECK_RESPONSE_DATA;
932 sati_translate_error(sequence, scsi_io, error);
933 }
934 else
935 {
936 status = sati_check_data_io(sequence);
937 }
938 break;
939 #endif // !defined(DISABLE_SATI_MODE_SELECT)
940
941 #if !defined(DISABLE_SATI_WRITE_AND_VERIFY)
942 case SATI_SEQUENCE_WRITE_AND_VERIFY:
943
944 if (ata_status & ATA_STATUS_REG_ERROR_BIT)
945 {
946 U8 error = (U8) sati_get_ata_error(register_fis);
947 sati_translate_error(sequence, scsi_io, error);
948
949 return SATI_FAILURE_CHECK_RESPONSE_DATA;
950 }
951 else
952 {
953 status = sati_write_and_verify_translate_response(
954 sequence,
955 scsi_io,
956 ata_io
957 );
958 }
959 break;
960 #endif // !defined(DISABLE_SATI_WRITE_AND_VERIFY)
961
962 case SATI_SEQUENCE_READ_6:
963 case SATI_SEQUENCE_READ_10:
964 case SATI_SEQUENCE_READ_12:
965 case SATI_SEQUENCE_READ_16:
966 case SATI_SEQUENCE_WRITE_6:
967 case SATI_SEQUENCE_WRITE_10:
968 case SATI_SEQUENCE_WRITE_12:
969 case SATI_SEQUENCE_WRITE_16:
970 case SATI_SEQUENCE_VERIFY_10:
971 case SATI_SEQUENCE_VERIFY_12:
972 case SATI_SEQUENCE_VERIFY_16:
973 case SATI_SEQUENCE_SYNCHRONIZE_CACHE:
974 if (ata_status & ATA_STATUS_REG_ERROR_BIT)
975 {
976 U8 error = (U8) sati_get_ata_error(register_fis);
977 status = SATI_FAILURE_CHECK_RESPONSE_DATA;
978 sati_translate_error(sequence, scsi_io, error);
979
980 if(sequence->state == SATI_SEQUENCE_STATE_READ_ERROR )
981 {
982 sati_scsi_read_error_sense_construct(
983 sequence,
984 scsi_io,
985 ata_io,
986 SCSI_STATUS_CHECK_CONDITION,
987 SCSI_SENSE_MEDIUM_ERROR,
988 SCSI_ASC_UNRECOVERED_READ_ERROR,
989 SCSI_ASCQ_UNRECOVERED_READ_ERROR
990 );
991 sequence->state = SATI_SEQUENCE_STATE_FINAL;
992 }
993 }
994 else
995 {
996 // We haven't satisified the transfer count from the original
997 // SCSI CDB. As a result, we need to re-issue the command
998 // with updated logical block address and transfer count.
999 if (sequence->command_specific_data.scratch)
1000 {
1001 /** @todo update the contents of the CDB directly? Should be
1002 * done during previous command translation?
1003 */
1004 status = SATI_SEQUENCE_INCOMPLETE;
1005 }
1006 }
1007 break;
1008
1009 #if !defined(DISABLE_SATI_READ_BUFFER)
1010 case SATI_SEQUENCE_READ_BUFFER:
1011 status = sati_read_buffer_translate_response(
1012 sequence, scsi_io, ata_io
1013 );
1014
1015 if(status == SATI_COMPLETE)
1016 {
1017 status = sati_check_data_io(sequence);
1018 }
1019 break;
1020 #endif //!defined(DISABLE_SATI_READ_BUFFER)
1021
1022 #if !defined(DISABLE_SATI_WRITE_BUFFER)
1023 case SATI_SEQUENCE_WRITE_BUFFER:
1024 case SATI_SEQUENCE_WRITE_BUFFER_MICROCODE:
1025 status = sati_write_buffer_translate_response(
1026 sequence, scsi_io, ata_io
1027 );
1028 break;
1029 #endif //!defined(DISABLE_SATI_WRITE_BUFFER)
1030
1031 #if !defined(DISABLE_SATI_REASSIGN_BLOCKS)
1032 case SATI_SEQUENCE_REASSIGN_BLOCKS:
1033 status = sati_reassign_blocks_translate_response(
1034 sequence, scsi_io, ata_io
1035 );
1036 if(status == SATI_COMPLETE)
1037 {
1038 status = sati_check_data_io(sequence);
1039 }
1040 break;
1041 #endif // !defined(DISABLE_SATI_REASSIGN_BLOCKS)
1042
1043 #if !defined(DISABLE_SATI_START_STOP_UNIT)
1044 case SATI_SEQUENCE_START_STOP_UNIT:
1045 status = sati_start_stop_unit_translate_response(
1046 sequence, scsi_io, ata_io
1047 );
1048 if(status == SATI_COMPLETE)
1049 {
1050 status = sati_check_data_io(sequence);
1051 }
1052 break;
1053 #endif // !defined(DISABLE_SATI_START_STOP_UNIT)
1054
1055 #if !defined(DISABLE_SATI_REQUEST_SENSE)
1056 case SATI_SEQUENCE_REQUEST_SENSE_SMART_RETURN_STATUS:
1057 case SATI_SEQUENCE_REQUEST_SENSE_CHECK_POWER_MODE:
1058 status = sati_request_sense_translate_response(
1059 sequence, scsi_io, ata_io
1060 );
1061 if(status == SATI_COMPLETE)
1062 {
1063 status = sati_check_data_io(sequence);
1064 }
1065 break;
1066 #endif // !defined(DISABLE_SATI_REQUEST_SENSE)
1067
1068 #if !defined(DISABLE_SATI_WRITE_LONG)
1069 case SATI_SEQUENCE_WRITE_LONG:
1070 status = sati_write_long_translate_response(
1071 sequence, scsi_io, ata_io
1072 );
1073 if(status == SATI_COMPLETE)
1074 {
1075 status = sati_check_data_io(sequence);
1076 }
1077 break;
1078 #endif // !defined(DISABLE_SATI_WRITE_LONG)
1079
1080 #if !defined(DISABLE_SATI_LOG_SENSE)
1081 case SATI_SEQUENCE_LOG_SENSE_SUPPORTED_LOG_PAGE:
1082 case SATI_SEQUENCE_LOG_SENSE_SELF_TEST_LOG_PAGE:
1083 case SATI_SEQUENCE_LOG_SENSE_EXTENDED_SELF_TEST_LOG_PAGE:
1084 case SATI_SEQUENCE_LOG_SENSE_INFO_EXCEPTION_LOG_PAGE:
1085 status = sati_log_sense_translate_response(
1086 sequence, scsi_io, ata_io
1087 );
1088 if(status == SATI_COMPLETE)
1089 {
1090 status = sati_check_data_io(sequence);
1091 }
1092 break;
1093 #endif // !defined(DISABLE_SATI_LOG_SENSE)
1094
1095 #if !defined(DISABLE_SATI_UNMAP)
1096 case SATI_SEQUENCE_UNMAP:
1097 status = sati_unmap_translate_response(
1098 sequence, scsi_io, ata_io
1099 );
1100 break;
1101 #endif // !defined(DISABLE_SATI_UNMAP)
1102
1103 #if !defined(DISABLE_SATI_ATA_PASSTHROUGH)
1104 case SATI_SEQUENCE_ATA_PASSTHROUGH_12:
1105 case SATI_SEQUENCE_ATA_PASSTHROUGH_16:
1106 status = sati_passthrough_translate_response(
1107 sequence, scsi_io, ata_io
1108 );
1109 break;
1110 #endif // !defined(DISABLE_SATI_ATA_PASSTHROUGH)
1111
1112 default:
1113 status = SATI_FAILURE_INVALID_SEQUENCE_TYPE;
1114 break;
1115 }
1116
1117 return status;
1118 }
1119
1120 // -----------------------------------------------------------------------------
1121
1122 #if !defined(DISABLE_SATI_TASK_MANAGEMENT)
1123 SATI_STATUS sati_translate_task_response(
1124 SATI_TRANSLATOR_SEQUENCE_T * sequence,
1125 void * scsi_io,
1126 void * ata_io
1127 )
1128 {
1129 SATI_STATUS status = SATI_FAILURE_CHECK_RESPONSE_DATA;
1130 U8 * register_fis = sati_cb_get_d2h_register_fis_address(ata_io);
1131 U8 ata_status;
1132
1133 /**
1134 * If the device fault bit is set in the status register, then
1135 * set the sense data and return.
1136 */
1137 ata_status = (U8) sati_get_ata_status(register_fis);
1138 if (ata_status & ATA_STATUS_REG_DEVICE_FAULT_BIT)
1139 {
1140 sati_scsi_response_data_construct(
1141 sequence,
1142 scsi_io,
1143 SCSI_TASK_MGMT_FUNC_FAILED
1144 );
1145 return SATI_FAILURE_CHECK_RESPONSE_DATA;
1146 }
1147
1148 // Look at the sequence type to determine the response translation method
1149 // to invoke.
1150 switch (sequence->type)
1151 {
1152 case SATI_SEQUENCE_LUN_RESET:
1153 if (ata_status & ATA_STATUS_REG_ERROR_BIT)
1154 {
1155 sati_scsi_response_data_construct(
1156 sequence, scsi_io, SCSI_TASK_MGMT_FUNC_FAILED);
1157 }
1158 else
1159 {
1160 sati_scsi_response_data_construct(
1161 sequence, scsi_io, SCSI_TASK_MGMT_FUNC_COMPLETE);
1162 }
1163
1164 status = SATI_COMPLETE;
1165 break;
1166
1167 #if !defined(DISABLE_SATI_ABORT_TASK_SET)
1168 case SATI_SEQUENCE_ABORT_TASK_SET:
1169 if (ata_status & ATA_STATUS_REG_ERROR_BIT)
1170 {
1171 sati_scsi_response_data_construct(
1172 sequence, scsi_io, SCSI_TASK_MGMT_FUNC_FAILED);
1173 }
1174 else
1175 {
1176 void * ata_data = sati_cb_get_ata_data_address(ata_io);
1177
1178 if(ata_data == NULL)
1179 {
1180 status = SATI_FAILURE;
1181 }
1182 else
1183 {
1184 status = sati_abort_task_set_translate_data(
1185 sequence,
1186 ata_data,
1187 scsi_io
1188 );
1189 }
1190 }
1191 break;
1192 #endif // !defined(DISABLE_SATI_ABORT_TASK_SET)
1193
1194 default:
1195 status = SATI_FAILURE_INVALID_SEQUENCE_TYPE;
1196 break;
1197 }
1198
1199 return status;
1200 }
1201 #endif // !defined(DISABLE_SATI_TASK_MANAGEMENT)
1202
1203 #if !defined(ENABLE_MINIMUM_MEMORY_MODE)
1204 U32 sati_get_sat_compliance_version(
1205 void
1206 )
1207 {
1208 return 2; // Compliant with SAT-2.
1209 }
1210
1211 U32 sati_get_sat_compliance_version_revision(
1212 void
1213 )
1214 {
1215 return 7; // Compliant with SAT-2 revision 7.
1216 }
1217
1218 #endif // !defined(ENABLE_MINIMUM_MEMORY_MODE)
1219
1220 U16 sati_get_number_data_bytes_set(
1221 SATI_TRANSLATOR_SEQUENCE_T * sequence
1222 )
1223 {
1224 return sequence->number_data_bytes_set;
1225 }
1226
1227 void sati_sequence_construct(
1228 SATI_TRANSLATOR_SEQUENCE_T * sequence
1229 )
1230 {
1231 sequence->state = SATI_SEQUENCE_STATE_INITIAL;
1232 }
1233
1234 void sati_sequence_terminate(
1235 SATI_TRANSLATOR_SEQUENCE_T * sequence,
1236 void * scsi_io,
1237 void * ata_io
1238 )
1239 {
1240 // Decode the sequence type to determine how to handle the termination
1241 // of the translation method.
1242 switch (sequence->type)
1243 {
1244 case SATI_SEQUENCE_UNMAP:
1245 sati_unmap_terminate(sequence,scsi_io,ata_io);
1246 break;
1247 }
1248 }
Cache object: eedde4a41f0b3622a117232177d112c6
|