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 the method implementations required to 61 * translate the SCSI test unit ready command. 62 */ 63 64 #if !defined(DISABLE_SATI_TEST_UNIT_READY) 65 66 #include <dev/isci/scil/sati_test_unit_ready.h> 67 #include <dev/isci/scil/sati_util.h> 68 #include <dev/isci/scil/sati_callbacks.h> 69 #include <dev/isci/scil/intel_ata.h> 70 #include <dev/isci/scil/intel_scsi.h> 71 72 /** 73 * @brief This method will translate the test unit ready SCSI command into 74 * an ATA CHECK POWER MODE command. 75 * For more information on the parameters passed to this method, 76 * please reference sati_translate_command(). 77 * 78 * @return Indicate if the command translation succeeded. 79 * @retval SCI_SUCCESS This is returned if the command translation was 80 * successful. 81 * @retval SATI_FAILURE_CHECK_RESPONSE_DATA This value is returned if the 82 * LBA field is not 0, the PMI bit is not 0. 83 */ 84 SATI_STATUS sati_test_unit_ready_translate_command( 85 SATI_TRANSLATOR_SEQUENCE_T * sequence, 86 void * scsi_io, 87 void * ata_io 88 ) 89 { 90 /** 91 * SAT dictates: 92 * - the device should be in a state to receive commands 93 * - a stopped device should cause sense data. 94 * - a format unit in progresss should cause sense data. 95 * - a self-test in progress should cause sense data. 96 * - a device fault occurred on previous request should cause sense data. 97 * - handling the removable media feature set isn't supported according to 98 * SAT specifications. 99 */ 100 if (sequence->device->state == SATI_DEVICE_STATE_STOPPED) 101 { 102 sati_scsi_sense_data_construct( 103 sequence, 104 scsi_io, 105 SCSI_STATUS_CHECK_CONDITION, 106 SCSI_SENSE_NOT_READY, 107 SCSI_ASC_INITIALIZING_COMMAND_REQUIRED, 108 SCSI_ASCQ_INITIALIZING_COMMAND_REQUIRED 109 ); 110 return SATI_FAILURE_CHECK_RESPONSE_DATA; 111 } 112 else if (sequence->device->state 113 == SATI_DEVICE_STATE_SELF_TEST_IN_PROGRESS) 114 { 115 sati_scsi_sense_data_construct( 116 sequence, 117 scsi_io, 118 SCSI_STATUS_CHECK_CONDITION, 119 SCSI_SENSE_NOT_READY, 120 SCSI_ASC_LUN_SELF_TEST_IN_PROGRESS, 121 SCSI_ASCQ_LUN_SELF_TEST_IN_PROGRESS 122 ); 123 return SATI_FAILURE_CHECK_RESPONSE_DATA; 124 } 125 else if (sequence->device->state 126 == SATI_DEVICE_STATE_FORMAT_UNIT_IN_PROGRESS) 127 { 128 sati_scsi_sense_data_construct( 129 sequence, 130 scsi_io, 131 SCSI_STATUS_CHECK_CONDITION, 132 SCSI_SENSE_NOT_READY, 133 SCSI_ASC_LUN_FORMAT_IN_PROGRESS, 134 SCSI_ASCQ_LUN_FORMAT_IN_PROGRESS 135 ); 136 return SATI_FAILURE_CHECK_RESPONSE_DATA; 137 } 138 139 // The CDB is properly formed and the device is ready. 140 sequence->type = SATI_SEQUENCE_TEST_UNIT_READY; 141 142 sati_ata_check_power_mode_construct(ata_io, sequence); 143 return SATI_SUCCESS; 144 } 145 146 /** 147 * @brief This method will translate the ATA CHECK POWER MODE register FIS 148 * response into an appropriate SCSI response. 149 * For more information on the parameters passed to this method, 150 * please reference sati_translate_response(). 151 * 152 * @return Indicate if the response translation succeeded. 153 * @retval SCI_SUCCESS This is returned if the data translation was 154 * successful. 155 */ 156 SATI_STATUS sati_test_unit_ready_translate_response( 157 SATI_TRANSLATOR_SEQUENCE_T * sequence, 158 void * scsi_io, 159 void * ata_io 160 ) 161 { 162 U8 * register_fis = sati_cb_get_d2h_register_fis_address(ata_io); 163 164 /** 165 * SAT dictates: 166 * - If the ATA CHECK POWER MODE command returns an error, then 167 * return sense data indicating the LOGICAL UNIT DOES NOT RESPONSE 168 * TO SELECTION. 169 * - All other cases are considered successful. 170 */ 171 if (sati_get_ata_status(register_fis) & ATA_STATUS_REG_ERROR_BIT) 172 { 173 sati_scsi_sense_data_construct( 174 sequence, 175 scsi_io, 176 SCSI_STATUS_CHECK_CONDITION, 177 SCSI_SENSE_NOT_READY, 178 SCSI_ASC_LUN_NOT_RESPOND_TO_SELECTION, 179 SCSI_ASCQ_LUN_NOT_RESPOND_TO_SELECTION 180 ); 181 return SATI_FAILURE_CHECK_RESPONSE_DATA; 182 } 183 184 return SATI_COMPLETE; 185 } 186 187 #endif // !defined(DISABLE_SATI_TEST_UNIT_READY) 188 189