Lines Matching +full:enum +full:- +full:as +full:- +full:flags
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10 * it under the terms of version 2 of the GNU General Public License as
20 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
26 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
44 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
67 const char *dev_state_name(enum sci_remote_device_states state) in dev_state_name()
75 enum sci_status sci_remote_device_suspend(struct isci_remote_device *idev, in sci_remote_device_suspend()
76 enum sci_remote_node_suspension_reasons reason) in sci_remote_device_suspend()
78 return sci_remote_node_context_suspend(&idev->rnc, reason, in sci_remote_device_suspend()
83 * isci_remote_device_ready() - This function is called by the ihost when the
84 * remote device is ready. We mark the isci device as ready and signal the
92 dev_dbg(&ihost->pdev->dev, in isci_remote_device_ready()
95 clear_bit(IDEV_IO_NCQERROR, &idev->flags); in isci_remote_device_ready()
96 set_bit(IDEV_IO_READY, &idev->flags); in isci_remote_device_ready()
97 if (test_and_clear_bit(IDEV_START_PENDING, &idev->flags)) in isci_remote_device_ready()
98 wake_up(&ihost->eventq); in isci_remote_device_ready()
101 static enum sci_status sci_remote_device_terminate_req( in sci_remote_device_terminate_req()
107 if (!test_bit(IREQ_ACTIVE, &ireq->flags) || in sci_remote_device_terminate_req()
108 (ireq->target_device != idev) || in sci_remote_device_terminate_req()
109 (check_abort && !test_bit(IREQ_PENDING_ABORT, &ireq->flags))) in sci_remote_device_terminate_req()
112 dev_dbg(&ihost->pdev->dev, in sci_remote_device_terminate_req()
113 "%s: idev=%p; flags=%lx; req=%p; req target=%p\n", in sci_remote_device_terminate_req()
114 __func__, idev, idev->flags, ireq, ireq->target_device); in sci_remote_device_terminate_req()
116 set_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags); in sci_remote_device_terminate_req()
121 static enum sci_status sci_remote_device_terminate_reqs_checkabort( in sci_remote_device_terminate_reqs_checkabort()
125 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_terminate_reqs_checkabort()
126 enum sci_status status = SCI_SUCCESS; in sci_remote_device_terminate_reqs_checkabort()
130 struct isci_request *ireq = ihost->reqs[i]; in sci_remote_device_terminate_reqs_checkabort()
131 enum sci_status s; in sci_remote_device_terminate_reqs_checkabort()
149 return (localcount != idev->rnc.suspend_count) in isci_compare_suspendcount()
150 || sci_remote_node_context_is_being_destroyed(&idev->rnc); in isci_compare_suspendcount()
159 unsigned long flags; in isci_check_reqterm() local
162 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_check_reqterm()
164 && !test_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags); in isci_check_reqterm()
165 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_check_reqterm()
175 unsigned long flags; in isci_check_devempty() local
178 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_check_devempty()
180 && idev->started_request_count == 0; in isci_check_devempty()
181 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_check_devempty()
186 enum sci_status isci_remote_device_terminate_requests( in isci_remote_device_terminate_requests()
191 enum sci_status status = SCI_SUCCESS; in isci_remote_device_terminate_requests()
192 unsigned long flags; in isci_remote_device_terminate_requests() local
195 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_remote_device_terminate_requests()
198 dev_dbg(&ihost->pdev->dev, "%s: failed isci_get_device(idev=%p)\n", in isci_remote_device_terminate_requests()
200 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_terminate_requests()
206 = sci_remote_node_context_is_suspended(&idev->rnc) in isci_remote_device_terminate_requests()
207 ? 0 : idev->rnc.suspend_count; in isci_remote_device_terminate_requests()
209 dev_dbg(&ihost->pdev->dev, in isci_remote_device_terminate_requests()
213 __func__, idev, ireq, idev->started_request_count, in isci_remote_device_terminate_requests()
214 rnc_suspend_count, idev->rnc.suspend_count); in isci_remote_device_terminate_requests()
219 set_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); in isci_remote_device_terminate_requests()
221 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_terminate_requests()
222 if (!wait_event_timeout(ihost->eventq, in isci_remote_device_terminate_requests()
227 dev_warn(&ihost->pdev->dev, "%s host%d timeout single\n", in isci_remote_device_terminate_requests()
228 __func__, ihost->id); in isci_remote_device_terminate_requests()
229 dev_dbg(&ihost->pdev->dev, in isci_remote_device_terminate_requests()
232 "started_request_count=%d, flags=%lx\n\t" in isci_remote_device_terminate_requests()
236 "ireq=%p, ireq->flags = %lx\n", in isci_remote_device_terminate_requests()
238 dev_state_name(idev->sm.current_state_id), in isci_remote_device_terminate_requests()
239 idev->started_request_count, idev->flags, in isci_remote_device_terminate_requests()
240 rnc_suspend_count, idev->rnc.suspend_count, in isci_remote_device_terminate_requests()
241 rnc_state_name(idev->rnc.sm.current_state_id), in isci_remote_device_terminate_requests()
242 idev->rnc.suspend_type, in isci_remote_device_terminate_requests()
243 idev->rnc.destination_state, in isci_remote_device_terminate_requests()
244 ireq, ireq->flags); in isci_remote_device_terminate_requests()
246 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_remote_device_terminate_requests()
247 clear_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); in isci_remote_device_terminate_requests()
248 if (!test_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags)) in isci_remote_device_terminate_requests()
249 isci_free_tag(ihost, ireq->io_tag); in isci_remote_device_terminate_requests()
250 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_terminate_requests()
254 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_terminate_requests()
255 if (!wait_event_timeout(ihost->eventq, in isci_remote_device_terminate_requests()
260 dev_warn(&ihost->pdev->dev, "%s host%d timeout all\n", in isci_remote_device_terminate_requests()
261 __func__, ihost->id); in isci_remote_device_terminate_requests()
262 dev_dbg(&ihost->pdev->dev, in isci_remote_device_terminate_requests()
265 "started_request_count=%d, flags=%lx\n\t" in isci_remote_device_terminate_requests()
271 dev_state_name(idev->sm.current_state_id), in isci_remote_device_terminate_requests()
272 idev->started_request_count, idev->flags, in isci_remote_device_terminate_requests()
274 rnc_state_name(idev->rnc.sm.current_state_id), in isci_remote_device_terminate_requests()
275 idev->rnc.suspend_count, in isci_remote_device_terminate_requests()
276 idev->rnc.suspend_type, in isci_remote_device_terminate_requests()
277 idev->rnc.destination_state); in isci_remote_device_terminate_requests()
280 dev_dbg(&ihost->pdev->dev, "%s: idev=%p, wait done\n", in isci_remote_device_terminate_requests()
288 * isci_remote_device_not_ready() - This function is called by the ihost when
289 * the remote device is not ready. We mark the isci device as ready (not
301 dev_dbg(&ihost->pdev->dev, in isci_remote_device_not_ready()
306 set_bit(IDEV_IO_NCQERROR, &idev->flags); in isci_remote_device_not_ready()
316 clear_bit(IDEV_IO_READY, &idev->flags); in isci_remote_device_not_ready()
328 BUG_ON(idev->started_request_count != 0); in rnc_destruct_done()
329 sci_change_state(&idev->sm, SCI_DEV_STOPPED); in rnc_destruct_done()
332 enum sci_status sci_remote_device_terminate_requests( in sci_remote_device_terminate_requests()
338 enum sci_status sci_remote_device_stop(struct isci_remote_device *idev, in sci_remote_device_stop()
341 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_stop()
342 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_stop()
356 BUG_ON(idev->started_request_count != 0); in sci_remote_device_stop()
357 sci_remote_node_context_destruct(&idev->rnc, in sci_remote_device_stop()
373 if (idev->started_request_count == 0) in sci_remote_device_stop()
374 sci_remote_node_context_destruct(&idev->rnc, in sci_remote_device_stop()
395 enum sci_status sci_remote_device_reset(struct isci_remote_device *idev) in sci_remote_device_reset()
397 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_reset()
398 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_reset()
425 enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev, in sci_remote_device_frame_handler()
428 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_frame_handler()
429 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_frame_handler()
430 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_frame_handler()
431 enum sci_status status; in sci_remote_device_frame_handler()
457 status = sci_unsolicited_frame_control_get_header(&ihost->uf_control, in sci_remote_device_frame_handler()
467 if (ireq && ireq->target_device == idev) { in sci_remote_device_frame_handler()
481 status = sci_unsolicited_frame_control_get_header(&ihost->uf_control, in sci_remote_device_frame_handler()
487 if (hdr->fis_type == FIS_SETDEVBITS && in sci_remote_device_frame_handler()
488 (hdr->status & ATA_ERR)) { in sci_remote_device_frame_handler()
489 idev->not_ready_reason = SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED; in sci_remote_device_frame_handler()
493 } else if (hdr->fis_type == FIS_REGD2H && in sci_remote_device_frame_handler()
494 (hdr->status & ATA_ERR)) { in sci_remote_device_frame_handler()
499 idev->not_ready_reason = SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED; in sci_remote_device_frame_handler()
500 sci_change_state(&idev->sm, SCI_STP_DEV_NCQ_ERROR); in sci_remote_device_frame_handler()
513 status = sci_io_request_frame_handler(idev->working_request, frame_index); in sci_remote_device_frame_handler()
523 struct sci_base_state_machine *sm = &idev->sm; in is_remote_device_ready()
524 enum sci_remote_device_states state = sm->current_state_id; in is_remote_device_ready()
548 struct isci_request *ireq = idev->working_request; in atapi_remote_device_resume_done()
550 sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); in atapi_remote_device_resume_done()
553 enum sci_status sci_remote_device_event_handler(struct isci_remote_device *idev, in sci_remote_device_event_handler()
556 enum sci_status status; in sci_remote_device_event_handler()
557 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_event_handler()
558 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_event_handler()
564 status = sci_remote_node_context_event_handler(&idev->rnc, event_code); in sci_remote_device_event_handler()
582 fallthrough; /* and treat as unhandled */ in sci_remote_device_event_handler()
597 /* Decode device-specific states that may require an RNC resume during in sci_remote_device_event_handler()
605 return sci_remote_node_context_resume(&idev->rnc, in sci_remote_device_event_handler()
618 status = sci_remote_node_context_resume(&idev->rnc, NULL, NULL); in sci_remote_device_event_handler()
626 enum sci_status status) in sci_remote_device_start_request()
628 struct isci_port *iport = idev->owning_port; in sci_remote_device_start_request()
634 kref_get(&idev->kref); in sci_remote_device_start_request()
635 idev->started_request_count++; in sci_remote_device_start_request()
639 enum sci_status sci_remote_device_start_io(struct isci_host *ihost, in sci_remote_device_start_io()
643 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_start_io()
644 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_start_io()
645 struct isci_port *iport = idev->owning_port; in sci_remote_device_start_io()
646 enum sci_status status; in sci_remote_device_start_io()
671 status = sci_remote_node_context_start_io(&idev->rnc, ireq); in sci_remote_device_start_io()
679 * the command idle state. - Evalute the type of IO request to in sci_remote_device_start_io()
680 * be started - If its an NCQ request change to NCQ substate - in sci_remote_device_start_io()
686 enum sci_remote_device_states new_state; in sci_remote_device_start_io()
693 status = sci_remote_node_context_start_io(&idev->rnc, ireq); in sci_remote_device_start_io()
701 if (task->ata_task.use_ncq) in sci_remote_device_start_io()
704 idev->working_request = ireq; in sci_remote_device_start_io()
713 if (task->ata_task.use_ncq) { in sci_remote_device_start_io()
718 status = sci_remote_node_context_start_io(&idev->rnc, ireq); in sci_remote_device_start_io()
734 status = sci_remote_node_context_start_io(&idev->rnc, ireq); in sci_remote_device_start_io()
742 idev->working_request = ireq; in sci_remote_device_start_io()
743 sci_change_state(&idev->sm, SCI_SMP_DEV_CMD); in sci_remote_device_start_io()
757 static enum sci_status common_complete_io(struct isci_port *iport, in common_complete_io()
761 enum sci_status status; in common_complete_io()
775 enum sci_status sci_remote_device_complete_io(struct isci_host *ihost, in sci_remote_device_complete_io()
779 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_complete_io()
780 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_complete_io()
781 struct isci_port *iport = idev->owning_port; in sci_remote_device_complete_io()
782 enum sci_status status; in sci_remote_device_complete_io()
809 if (ireq->sci_status == SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED) { in sci_remote_device_complete_io()
816 } else if (idev->started_request_count == 0) in sci_remote_device_complete_io()
830 if (idev->started_request_count == 0) in sci_remote_device_complete_io()
831 sci_remote_node_context_destruct(&idev->rnc, in sci_remote_device_complete_io()
853 if (idev->working_request) in sci_remote_device_continue_request()
854 sci_controller_continue_io(idev->working_request); in sci_remote_device_continue_request()
857 enum sci_status sci_remote_device_start_task(struct isci_host *ihost, in sci_remote_device_start_task()
861 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_start_task()
862 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_start_task()
863 struct isci_port *iport = idev->owning_port; in sci_remote_device_start_task()
864 enum sci_status status; in sci_remote_device_start_task()
897 idev->working_request = ireq; in sci_remote_device_start_task()
910 status = sci_remote_node_context_start_task(&idev->rnc, ireq, in sci_remote_device_start_task()
925 /* Resume the RNC as needed: */ in sci_remote_device_start_task()
926 status = sci_remote_node_context_start_task(&idev->rnc, ireq, in sci_remote_device_start_task()
941 struct isci_port *iport = idev->owning_port; in sci_remote_device_post_request()
946 (iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT) | in sci_remote_device_post_request()
947 idev->rnc.remote_node_index; in sci_remote_device_post_request()
949 sci_controller_post_request(iport->owning_controller, context); in sci_remote_device_post_request()
964 sci_change_state(&idev->sm, SCI_DEV_READY); in remote_device_resume_done()
970 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_stp_remote_device_ready_idle_substate_resume_complete_handler()
973 * As a result, avoid sending the ready notification. in sci_stp_remote_device_ready_idle_substate_resume_complete_handler()
975 if (idev->sm.previous_state_id != SCI_STP_DEV_NCQ) in sci_stp_remote_device_ready_idle_substate_resume_complete_handler()
984 sci_change_state(&idev->sm, SCI_DEV_STOPPED); in sci_remote_device_initial_state_enter()
988 * sci_remote_device_destruct() - free remote node context and destruct
991 * Remote device objects are a limited resource. As such, they must be
993 * non-reentrant. The return value shall indicate if the device was
994 * successfully destructed or if some failure occurred. enum sci_status This value
1000 static enum sci_status sci_remote_device_destruct(struct isci_remote_device *idev) in sci_remote_device_destruct()
1002 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_destruct()
1003 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_destruct()
1012 ihost = idev->owning_port->owning_controller; in sci_remote_device_destruct()
1014 idev->rnc.remote_node_index); in sci_remote_device_destruct()
1015 idev->rnc.remote_node_index = SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX; in sci_remote_device_destruct()
1022 * isci_remote_device_deconstruct() - This function frees an isci_remote_device.
1029 dev_dbg(&ihost->pdev->dev, in isci_remote_device_deconstruct()
1036 BUG_ON(idev->started_request_count > 0); in isci_remote_device_deconstruct()
1039 list_del_init(&idev->node); in isci_remote_device_deconstruct()
1046 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_stopped_state_enter()
1052 prev_state = idev->sm.previous_state_id; in sci_remote_device_stopped_state_enter()
1062 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_starting_state_enter()
1071 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_ready_state_enter()
1072 struct domain_device *dev = idev->domain_dev; in sci_remote_device_ready_state_enter()
1074 if (dev->dev_type == SAS_SATA_DEV || (dev->tproto & SAS_PROTOCOL_SATA)) { in sci_remote_device_ready_state_enter()
1075 sci_change_state(&idev->sm, SCI_STP_DEV_IDLE); in sci_remote_device_ready_state_enter()
1076 } else if (dev_is_expander(dev->dev_type)) { in sci_remote_device_ready_state_enter()
1077 sci_change_state(&idev->sm, SCI_SMP_DEV_IDLE); in sci_remote_device_ready_state_enter()
1085 struct domain_device *dev = idev->domain_dev; in sci_remote_device_ready_state_exit()
1087 if (dev->dev_type == SAS_END_DEVICE) { in sci_remote_device_ready_state_exit()
1088 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_ready_state_exit()
1098 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_resetting_state_enter()
1100 dev_dbg(&ihost->pdev->dev, in sci_remote_device_resetting_state_enter()
1109 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_remote_device_resetting_state_exit()
1111 dev_dbg(&ihost->pdev->dev, in sci_remote_device_resetting_state_exit()
1114 sci_remote_node_context_resume(&idev->rnc, NULL, NULL); in sci_remote_device_resetting_state_exit()
1121 idev->working_request = NULL; in sci_stp_remote_device_ready_idle_substate_enter()
1122 if (sci_remote_node_context_is_ready(&idev->rnc)) { in sci_stp_remote_device_ready_idle_substate_enter()
1128 sci_remote_node_context_resume(&idev->rnc, in sci_stp_remote_device_ready_idle_substate_enter()
1137 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_stp_remote_device_ready_cmd_substate_enter()
1139 BUG_ON(idev->working_request == NULL); in sci_stp_remote_device_ready_cmd_substate_enter()
1148 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_stp_remote_device_ready_ncq_error_substate_enter()
1150 if (idev->not_ready_reason == SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED) in sci_stp_remote_device_ready_ncq_error_substate_enter()
1152 idev->not_ready_reason); in sci_stp_remote_device_ready_ncq_error_substate_enter()
1158 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_smp_remote_device_ready_idle_substate_enter()
1166 struct isci_host *ihost = idev->owning_port->owning_controller; in sci_smp_remote_device_ready_cmd_substate_enter()
1168 BUG_ON(idev->working_request == NULL); in sci_smp_remote_device_ready_cmd_substate_enter()
1178 idev->working_request = NULL; in sci_smp_remote_device_ready_cmd_substate_exit()
1224 * sci_remote_device_construct() - common construction
1236 idev->owning_port = iport; in sci_remote_device_construct()
1237 idev->started_request_count = 0; in sci_remote_device_construct()
1239 sci_init_sm(&idev->sm, sci_remote_device_state_table, SCI_DEV_INITIAL); in sci_remote_device_construct()
1241 sci_remote_node_context_construct(&idev->rnc, in sci_remote_device_construct()
1246 * sci_remote_device_da_construct() - construct direct attached device.
1254 * SCI_FAILURE_DEVICE_EXISTS - device has already been constructed.
1255 * SCI_FAILURE_UNSUPPORTED_PROTOCOL - e.g. sas device attached to
1256 * sata-only controller instance.
1257 * SCI_FAILURE_INSUFFICIENT_RESOURCES - remote node contexts exhausted.
1259 static enum sci_status sci_remote_device_da_construct(struct isci_port *iport, in sci_remote_device_da_construct()
1262 enum sci_status status; in sci_remote_device_da_construct()
1269 idev->device_port_width = hweight32(properties.phy_mask); in sci_remote_device_da_construct()
1271 status = sci_controller_allocate_remote_node_context(iport->owning_controller, in sci_remote_device_da_construct()
1273 &idev->rnc.remote_node_index); in sci_remote_device_da_construct()
1278 idev->connection_rate = sci_port_get_max_allowed_speed(iport); in sci_remote_device_da_construct()
1284 * sci_remote_device_ea_construct() - construct expander attached device
1290 * SCI_FAILURE_DEVICE_EXISTS - device has already been constructed.
1291 * SCI_FAILURE_UNSUPPORTED_PROTOCOL - e.g. sas device attached to
1292 * sata-only controller instance.
1293 * SCI_FAILURE_INSUFFICIENT_RESOURCES - remote node contexts exhausted.
1295 static enum sci_status sci_remote_device_ea_construct(struct isci_port *iport, in sci_remote_device_ea_construct()
1298 struct domain_device *dev = idev->domain_dev; in sci_remote_device_ea_construct()
1299 enum sci_status status; in sci_remote_device_ea_construct()
1303 status = sci_controller_allocate_remote_node_context(iport->owning_controller, in sci_remote_device_ea_construct()
1305 &idev->rnc.remote_node_index); in sci_remote_device_ea_construct()
1309 /* For SAS-2 the physical link rate is actually a logical link in sci_remote_device_ea_construct()
1312 * connection the logical link rate is that same as the in sci_remote_device_ea_construct()
1313 * physical. Furthermore, the SAS-2 and SAS-1.1 fields overlay in sci_remote_device_ea_construct()
1316 idev->connection_rate = min_t(u16, sci_port_get_max_allowed_speed(iport), in sci_remote_device_ea_construct()
1317 dev->linkrate); in sci_remote_device_ea_construct()
1320 idev->device_port_width = 1; in sci_remote_device_ea_construct()
1325 enum sci_status sci_remote_device_resume( in sci_remote_device_resume()
1330 enum sci_status status; in sci_remote_device_resume()
1332 status = sci_remote_node_context_resume(&idev->rnc, cb_fn, cb_p); in sci_remote_device_resume()
1342 struct isci_host *ihost = idev->owning_port->owning_controller; in isci_remote_device_resume_from_abort_complete()
1344 idev->abort_resume_cb; in isci_remote_device_resume_from_abort_complete()
1346 dev_dbg(scirdev_to_dev(idev), "%s: passing-along resume: %p\n", in isci_remote_device_resume_from_abort_complete()
1350 idev->abort_resume_cb = NULL; in isci_remote_device_resume_from_abort_complete()
1351 abort_resume_cb(idev->abort_resume_cbparam); in isci_remote_device_resume_from_abort_complete()
1353 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags); in isci_remote_device_resume_from_abort_complete()
1354 wake_up(&ihost->eventq); in isci_remote_device_resume_from_abort_complete()
1361 unsigned long flags; in isci_remote_device_test_resume_done() local
1364 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_remote_device_test_resume_done()
1365 done = !test_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags) in isci_remote_device_test_resume_done()
1366 || test_bit(IDEV_STOP_PENDING, &idev->flags) in isci_remote_device_test_resume_done()
1367 || sci_remote_node_context_is_being_destroyed(&idev->rnc); in isci_remote_device_test_resume_done()
1368 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_test_resume_done()
1377 dev_dbg(&ihost->pdev->dev, "%s: starting resume wait: %p\n", in isci_remote_device_wait_for_resume_from_abort()
1381 if (!wait_event_timeout(ihost->eventq, in isci_remote_device_wait_for_resume_from_abort()
1385 dev_warn(&ihost->pdev->dev, "%s: #### Timeout waiting for " in isci_remote_device_wait_for_resume_from_abort()
1388 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags); in isci_remote_device_wait_for_resume_from_abort()
1390 dev_dbg(&ihost->pdev->dev, "%s: resume wait done: %p\n", in isci_remote_device_wait_for_resume_from_abort()
1394 enum sci_status isci_remote_device_resume_from_abort( in isci_remote_device_resume_from_abort()
1398 unsigned long flags; in isci_remote_device_resume_from_abort() local
1399 enum sci_status status = SCI_SUCCESS; in isci_remote_device_resume_from_abort()
1402 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_remote_device_resume_from_abort()
1406 idev->abort_resume_cb = idev->rnc.user_callback; in isci_remote_device_resume_from_abort()
1407 idev->abort_resume_cbparam = idev->rnc.user_cookie; in isci_remote_device_resume_from_abort()
1408 set_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags); in isci_remote_device_resume_from_abort()
1409 clear_bit(IDEV_ABORT_PATH_ACTIVE, &idev->flags); in isci_remote_device_resume_from_abort()
1410 destroyed = sci_remote_node_context_is_being_destroyed(&idev->rnc); in isci_remote_device_resume_from_abort()
1415 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_resume_from_abort()
1419 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags); in isci_remote_device_resume_from_abort()
1425 * sci_remote_device_start() - This method will start the supplied remote
1437 static enum sci_status sci_remote_device_start(struct isci_remote_device *idev, in sci_remote_device_start()
1440 struct sci_base_state_machine *sm = &idev->sm; in sci_remote_device_start()
1441 enum sci_remote_device_states state = sm->current_state_id; in sci_remote_device_start()
1442 enum sci_status status; in sci_remote_device_start()
1460 static enum sci_status isci_remote_device_construct(struct isci_port *iport, in isci_remote_device_construct()
1463 struct isci_host *ihost = iport->isci_host; in isci_remote_device_construct()
1464 struct domain_device *dev = idev->domain_dev; in isci_remote_device_construct()
1465 enum sci_status status; in isci_remote_device_construct()
1467 if (dev->parent && dev_is_expander(dev->parent->dev_type)) in isci_remote_device_construct()
1473 dev_dbg(&ihost->pdev->dev, "%s: construct failed: %d\n", in isci_remote_device_construct()
1483 dev_warn(&ihost->pdev->dev, "remote device start failed: %d\n", in isci_remote_device_construct()
1505 idev = &ihost->devices[i]; in isci_remote_device_alloc()
1506 if (!test_and_set_bit(IDEV_ALLOCATED, &idev->flags)) in isci_remote_device_alloc()
1511 dev_warn(&ihost->pdev->dev, "%s: failed\n", __func__); in isci_remote_device_alloc()
1514 if (WARN_ONCE(!list_empty(&idev->node), "found non-idle remote device\n")) in isci_remote_device_alloc()
1523 struct isci_host *ihost = idev->isci_port->isci_host; in isci_remote_device_release()
1525 idev->domain_dev = NULL; in isci_remote_device_release()
1526 idev->isci_port = NULL; in isci_remote_device_release()
1527 clear_bit(IDEV_START_PENDING, &idev->flags); in isci_remote_device_release()
1528 clear_bit(IDEV_STOP_PENDING, &idev->flags); in isci_remote_device_release()
1529 clear_bit(IDEV_IO_READY, &idev->flags); in isci_remote_device_release()
1530 clear_bit(IDEV_GONE, &idev->flags); in isci_remote_device_release()
1532 clear_bit(IDEV_ALLOCATED, &idev->flags); in isci_remote_device_release()
1533 wake_up(&ihost->eventq); in isci_remote_device_release()
1537 * isci_remote_device_stop() - This function is called internally to stop the
1544 enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_remote_device *idev) in isci_remote_device_stop()
1546 enum sci_status status; in isci_remote_device_stop()
1547 unsigned long flags; in isci_remote_device_stop() local
1549 dev_dbg(&ihost->pdev->dev, in isci_remote_device_stop()
1552 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_remote_device_stop()
1553 idev->domain_dev->lldd_dev = NULL; /* disable new lookups */ in isci_remote_device_stop()
1554 set_bit(IDEV_GONE, &idev->flags); in isci_remote_device_stop()
1556 set_bit(IDEV_STOP_PENDING, &idev->flags); in isci_remote_device_stop()
1558 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_stop()
1566 dev_dbg(&ihost->pdev->dev, in isci_remote_device_stop()
1573 * isci_remote_device_gone() - This function is called by libsas when a domain
1580 struct isci_remote_device *idev = dev->lldd_dev; in isci_remote_device_gone()
1582 dev_dbg(&ihost->pdev->dev, in isci_remote_device_gone()
1584 __func__, dev, idev, idev->isci_port); in isci_remote_device_gone()
1591 * isci_remote_device_found() - This function is called by libsas when a remote
1602 struct isci_port *isci_port = dev->port->lldd_port; in isci_remote_device_found()
1604 enum sci_status status; in isci_remote_device_found()
1606 dev_dbg(&isci_host->pdev->dev, in isci_remote_device_found()
1610 return -ENODEV; in isci_remote_device_found()
1614 return -ENODEV; in isci_remote_device_found()
1616 kref_init(&isci_device->kref); in isci_remote_device_found()
1617 INIT_LIST_HEAD(&isci_device->node); in isci_remote_device_found()
1619 spin_lock_irq(&isci_host->scic_lock); in isci_remote_device_found()
1620 isci_device->domain_dev = dev; in isci_remote_device_found()
1621 isci_device->isci_port = isci_port; in isci_remote_device_found()
1622 list_add_tail(&isci_device->node, &isci_port->remote_dev_list); in isci_remote_device_found()
1624 set_bit(IDEV_START_PENDING, &isci_device->flags); in isci_remote_device_found()
1627 dev_dbg(&isci_host->pdev->dev, in isci_remote_device_found()
1633 dev->lldd_dev = isci_device; in isci_remote_device_found()
1636 spin_unlock_irq(&isci_host->scic_lock); in isci_remote_device_found()
1641 return status == SCI_SUCCESS ? 0 : -ENODEV; in isci_remote_device_found()
1644 enum sci_status isci_remote_device_suspend_terminate( in isci_remote_device_suspend_terminate()
1649 unsigned long flags; in isci_remote_device_suspend_terminate() local
1650 enum sci_status status; in isci_remote_device_suspend_terminate()
1653 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_remote_device_suspend_terminate()
1654 set_bit(IDEV_ABORT_PATH_ACTIVE, &idev->flags); in isci_remote_device_suspend_terminate()
1656 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_remote_device_suspend_terminate()
1661 dev_dbg(&ihost->pdev->dev, in isci_remote_device_suspend_terminate()
1673 return sci_remote_node_context_is_safe_to_abort(&idev->rnc); in isci_remote_device_is_safe_to_abort()
1676 enum sci_status sci_remote_device_abort_requests_pending_abort( in sci_remote_device_abort_requests_pending_abort()
1686 if (dev_is_sata(idev->domain_dev)) { in isci_dev_set_hang_detection_timeout()
1689 &idev->flags)) in isci_dev_set_hang_detection_timeout()
1692 &idev->flags)) in isci_dev_set_hang_detection_timeout()
1695 sci_port_set_hang_detection_timeout(idev->owning_port, in isci_dev_set_hang_detection_timeout()