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 53 #include <sys/cdefs.h> 54 __FBSDID("$FreeBSD$"); 55 56 /** 57 * @file 58 * 59 * @brief This file contains all of the SCIF_SAS_IO_REQUEST object 60 * state entrance and exit method implementations. 61 */ 62 63 #include <dev/isci/scil/scic_controller.h> 64 65 #include <dev/isci/scil/scif_sas_io_request.h> 66 #include <dev/isci/scil/scif_sas_domain.h> 67 #include <dev/isci/scil/scif_sas_controller.h> 68 #include <dev/isci/scil/scif_sas_logger.h> 69 70 //****************************************************************************** 71 //* P R O T E C T E D M E T H O D S 72 //****************************************************************************** 73 74 /** 75 * @brief This method implements the actions taken when entering the 76 * INITIAL state. 77 * 78 * @param[in] object This parameter specifies the base object for which 79 * the state transition is occurring. This is cast into a 80 * SCIF_SAS_IO_REQUEST object in the method implementation. 81 * 82 * @return none 83 */ 84 static 85 void scif_sas_io_request_initial_state_enter( 86 SCI_BASE_OBJECT_T *object 87 ) 88 { 89 SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)object; 90 91 SET_STATE_HANDLER( 92 &fw_io->parent, 93 scif_sas_io_request_state_handler_table, 94 SCI_BASE_REQUEST_STATE_INITIAL 95 ); 96 97 // Initial state is a transitional state to the constructed state 98 sci_base_state_machine_change_state( 99 &fw_io->parent.parent.state_machine, SCI_BASE_REQUEST_STATE_CONSTRUCTED 100 ); 101 } 102 103 /** 104 * @brief This method implements the actions taken when entering the 105 * CONSTRUCTED state. 106 * 107 * @param[in] object This parameter specifies the base object for which 108 * the state transition is occurring. This is cast into a 109 * SCIF_SAS_IO_REQUEST object in the method implementation. 110 * 111 * @return none 112 */ 113 static 114 void scif_sas_io_request_constructed_state_enter( 115 SCI_BASE_OBJECT_T *object 116 ) 117 { 118 SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)object; 119 120 SET_STATE_HANDLER( 121 &fw_io->parent, 122 scif_sas_io_request_state_handler_table, 123 SCI_BASE_REQUEST_STATE_CONSTRUCTED 124 ); 125 } 126 127 /** 128 * @brief This method implements the actions taken when entering the 129 * STARTED state. 130 * 131 * @param[in] object This parameter specifies the base object for which 132 * the state transition is occurring. This is cast into a 133 * SCIF_SAS_IO_REQUEST object in the method implementation. 134 * 135 * @return none 136 */ 137 static 138 void scif_sas_io_request_started_state_enter( 139 SCI_BASE_OBJECT_T *object 140 ) 141 { 142 SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)object; 143 144 SET_STATE_HANDLER( 145 &fw_io->parent, 146 scif_sas_io_request_state_handler_table, 147 SCI_BASE_REQUEST_STATE_STARTED 148 ); 149 } 150 151 /** 152 * @brief This method implements the actions taken when entering the 153 * COMPLETED state. 154 * 155 * @param[in] object This parameter specifies the base object for which 156 * the state transition is occurring. This is cast into a 157 * SCIF_SAS_IO_REQUEST object in the method implementation. 158 * 159 * @return none 160 */ 161 static 162 void scif_sas_io_request_completed_state_enter( 163 SCI_BASE_OBJECT_T *object 164 ) 165 { 166 SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)object; 167 168 SET_STATE_HANDLER( 169 &fw_io->parent, 170 scif_sas_io_request_state_handler_table, 171 SCI_BASE_REQUEST_STATE_COMPLETED 172 ); 173 } 174 175 /** 176 * @brief This method implements the actions taken when entering the 177 * ABORTING state. 178 * 179 * @param[in] object This parameter specifies the base object for which 180 * the state transition is occurring. This is cast into a 181 * SCIF_SAS_IO_REQUEST object in the method implementation. 182 * 183 * @return none 184 */ 185 static 186 void scif_sas_io_request_aborting_state_enter( 187 SCI_BASE_OBJECT_T *object 188 ) 189 { 190 SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)object; 191 192 SCIF_LOG_WARNING(( 193 sci_base_object_get_logger(fw_io), 194 SCIF_LOG_OBJECT_IO_REQUEST | SCIF_LOG_OBJECT_TASK_MANAGEMENT, 195 "Domain:0x%x Device:0x%x IORequest:0x%x terminating\n", 196 fw_io->parent.device->domain, fw_io->parent.device, fw_io 197 )); 198 199 SET_STATE_HANDLER( 200 &fw_io->parent, 201 scif_sas_io_request_state_handler_table, 202 SCI_BASE_REQUEST_STATE_ABORTING 203 ); 204 205 fw_io->parent.status = scif_sas_request_terminate_start( 206 &fw_io->parent, fw_io->parent.core_object 207 ); 208 } 209 210 /** 211 * @brief This method implements the actions taken when exiting the 212 * ABORTING state. 213 * 214 * @param[in] object This parameter specifies the base object for which 215 * the state transition is occurring. This is cast into a 216 * SCIF_SAS_IO_REQUEST object in the method implementation. 217 * 218 * @return none 219 */ 220 static 221 void scif_sas_io_request_aborting_state_exit( 222 SCI_BASE_OBJECT_T *object 223 ) 224 { 225 SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T *)object; 226 scif_sas_request_terminate_complete(fw_request); 227 } 228 229 /** 230 * @brief This method implements the actions taken when entering the 231 * FINAL state. 232 * 233 * @param[in] object This parameter specifies the base object for which 234 * the state transition is occurring. This is cast into a 235 * SCIF_SAS_IO_REQUEST object in the method implementation. 236 * 237 * @return none 238 */ 239 static 240 void scif_sas_io_request_final_state_enter( 241 SCI_BASE_OBJECT_T *object 242 ) 243 { 244 SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)object; 245 246 SET_STATE_HANDLER( 247 &fw_io->parent, 248 scif_sas_io_request_state_handler_table, 249 SCI_BASE_REQUEST_STATE_FINAL 250 ); 251 } 252 253 SCI_BASE_STATE_T scif_sas_io_request_state_table[SCI_BASE_REQUEST_MAX_STATES] = 254 { 255 { 256 SCI_BASE_REQUEST_STATE_INITIAL, 257 scif_sas_io_request_initial_state_enter, 258 NULL 259 }, 260 { 261 SCI_BASE_REQUEST_STATE_CONSTRUCTED, 262 scif_sas_io_request_constructed_state_enter, 263 NULL 264 }, 265 { 266 SCI_BASE_REQUEST_STATE_STARTED, 267 scif_sas_io_request_started_state_enter, 268 NULL 269 }, 270 { 271 SCI_BASE_REQUEST_STATE_COMPLETED, 272 scif_sas_io_request_completed_state_enter, 273 NULL 274 }, 275 { 276 SCI_BASE_REQUEST_STATE_ABORTING, 277 scif_sas_io_request_aborting_state_enter, 278 scif_sas_io_request_aborting_state_exit 279 }, 280 { 281 SCI_BASE_REQUEST_STATE_FINAL, 282 scif_sas_io_request_final_state_enter, 283 NULL 284 }, 285 }; 286 287