Lines Matching refs:idev

75 enum sci_status sci_remote_device_suspend(struct isci_remote_device *idev,
78 return sci_remote_node_context_suspend(&idev->rnc, reason,
87 * @idev: remote device
90 static void isci_remote_device_ready(struct isci_host *ihost, struct isci_remote_device *idev)
93 "%s: idev = %p\n", __func__, idev);
95 clear_bit(IDEV_IO_NCQERROR, &idev->flags);
96 set_bit(IDEV_IO_READY, &idev->flags);
97 if (test_and_clear_bit(IDEV_START_PENDING, &idev->flags))
103 struct isci_remote_device *idev,
108 (ireq->target_device != idev) ||
113 "%s: idev=%p; flags=%lx; req=%p; req target=%p\n",
114 __func__, idev, idev->flags, ireq, ireq->target_device);
118 return sci_controller_terminate_request(ihost, idev, ireq);
122 struct isci_remote_device *idev,
125 struct isci_host *ihost = idev->owning_port->owning_controller;
133 s = sci_remote_device_terminate_req(ihost, idev, chk, ireq);
141 struct isci_remote_device *idev,
149 return (localcount != idev->rnc.suspend_count)
150 || sci_remote_node_context_is_being_destroyed(&idev->rnc);
155 struct isci_remote_device *idev,
163 res = isci_compare_suspendcount(idev, localcount)
172 struct isci_remote_device *idev,
179 res = isci_compare_suspendcount(idev, localcount)
180 && idev->started_request_count == 0;
188 struct isci_remote_device *idev,
197 if (isci_get_device(idev) == NULL) {
198 dev_dbg(&ihost->pdev->dev, "%s: failed isci_get_device(idev=%p)\n",
199 __func__, idev);
206 = sci_remote_node_context_is_suspended(&idev->rnc)
207 ? 0 : idev->rnc.suspend_count;
210 "%s: idev=%p, ireq=%p; started_request_count=%d, "
213 __func__, idev, ireq, idev->started_request_count,
214 rnc_suspend_count, idev->rnc.suspend_count);
220 sci_remote_device_terminate_req(ihost, idev, 0, ireq);
223 isci_check_reqterm(ihost, idev, ireq,
231 "suspend; idev=%p, current state %s; "
237 __func__, idev,
238 dev_state_name(idev->sm.current_state_id),
239 idev->started_request_count, idev->flags,
240 rnc_suspend_count, idev->rnc.suspend_count,
241 rnc_state_name(idev->rnc.sm.current_state_id),
242 idev->rnc.suspend_type,
243 idev->rnc.destination_state,
253 sci_remote_device_terminate_requests(idev);
256 isci_check_devempty(ihost, idev,
264 "suspend; idev=%p, current state %s; "
270 __func__, idev,
271 dev_state_name(idev->sm.current_state_id),
272 idev->started_request_count, idev->flags,
274 rnc_state_name(idev->rnc.sm.current_state_id),
275 idev->rnc.suspend_count,
276 idev->rnc.suspend_type,
277 idev->rnc.destination_state);
280 dev_dbg(&ihost->pdev->dev, "%s: idev=%p, wait done\n",
281 __func__, idev);
282 isci_put_device(idev);
292 * @idev: This parameter specifies the remote device
298 struct isci_remote_device *idev,
302 "%s: isci_device = %p; reason = %d\n", __func__, idev, reason);
306 set_bit(IDEV_IO_NCQERROR, &idev->flags);
309 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_NORMAL);
312 sci_remote_device_terminate_requests(idev);
316 clear_bit(IDEV_IO_READY, &idev->flags);
326 struct isci_remote_device *idev = _dev;
328 BUG_ON(idev->started_request_count != 0);
329 sci_change_state(&idev->sm, SCI_DEV_STOPPED);
333 struct isci_remote_device *idev)
335 return sci_remote_device_terminate_reqs_checkabort(idev, 0);
338 enum sci_status sci_remote_device_stop(struct isci_remote_device *idev,
341 struct sci_base_state_machine *sm = &idev->sm;
349 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
356 BUG_ON(idev->started_request_count != 0);
357 sci_remote_node_context_destruct(&idev->rnc,
358 rnc_destruct_done, idev);
373 if (idev->started_request_count == 0)
374 sci_remote_node_context_destruct(&idev->rnc,
376 idev);
379 idev, SCI_SW_SUSPEND_LINKHANG_DETECT);
380 sci_remote_device_terminate_requests(idev);
388 return sci_remote_device_terminate_requests(idev);
395 enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev,
398 struct sci_base_state_machine *sm = &idev->sm;
400 struct isci_host *ihost = idev->owning_port->owning_controller;
411 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
437 if (ireq && ireq->target_device == idev) {
459 idev->not_ready_reason = SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
469 idev->not_ready_reason = SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
470 sci_change_state(&idev->sm, SCI_STP_DEV_NCQ_ERROR);
483 status = sci_io_request_frame_handler(idev->working_request, frame_index);
490 static bool is_remote_device_ready(struct isci_remote_device *idev)
493 struct sci_base_state_machine *sm = &idev->sm;
517 struct isci_remote_device *idev = _dev;
518 struct isci_request *ireq = idev->working_request;
523 enum sci_status sci_remote_device_event_handler(struct isci_remote_device *idev,
527 struct sci_base_state_machine *sm = &idev->sm;
534 status = sci_remote_node_context_event_handler(&idev->rnc, event_code);
541 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_NORMAL);
543 dev_dbg(scirdev_to_dev(idev),
545 __func__, idev, event_code,
546 is_remote_device_ready(idev)
554 dev_dbg(scirdev_to_dev(idev),
556 __func__, idev, event_code,
557 is_remote_device_ready(idev)
575 return sci_remote_node_context_resume(&idev->rnc,
577 idev);
588 status = sci_remote_node_context_resume(&idev->rnc, NULL, NULL);
594 static void sci_remote_device_start_request(struct isci_remote_device *idev,
598 struct isci_port *iport = idev->owning_port;
602 sci_port_complete_io(iport, idev, ireq);
604 kref_get(&idev->kref);
605 idev->started_request_count++;
610 struct isci_remote_device *idev,
613 struct sci_base_state_machine *sm = &idev->sm;
615 struct isci_port *iport = idev->owning_port;
628 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
637 status = sci_port_start_io(iport, idev, ireq);
641 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
659 status = sci_port_start_io(iport, idev, ireq);
663 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
674 idev->working_request = ireq;
684 status = sci_port_start_io(iport, idev, ireq);
688 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
700 status = sci_port_start_io(iport, idev, ireq);
704 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
712 idev->working_request = ireq;
713 sci_change_state(&idev->sm, SCI_SMP_DEV_CMD);
723 sci_remote_device_start_request(idev, ireq, status);
728 struct isci_remote_device *idev,
737 status = sci_port_complete_io(iport, idev, ireq);
741 sci_remote_device_decrement_request_count(idev);
746 struct isci_remote_device *idev,
749 struct sci_base_state_machine *sm = &idev->sm;
751 struct isci_port *iport = idev->owning_port;
763 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
769 status = common_complete_io(iport, idev, ireq);
775 status = common_complete_io(iport, idev, ireq);
786 } else if (idev->started_request_count == 0)
790 status = common_complete_io(iport, idev, ireq);
796 status = common_complete_io(iport, idev, ireq);
800 if (idev->started_request_count == 0)
801 sci_remote_node_context_destruct(&idev->rnc,
803 idev);
808 dev_err(scirdev_to_dev(idev),
811 idev, ireq, status);
813 isci_put_device(idev);
820 struct isci_remote_device *idev = dev;
823 if (idev->working_request)
824 sci_controller_continue_io(idev->working_request);
828 struct isci_remote_device *idev,
831 struct sci_base_state_machine *sm = &idev->sm;
833 struct isci_port *iport = idev->owning_port;
847 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
855 status = sci_port_start_io(iport, idev, ireq);
867 idev->working_request = ireq;
877 sci_remote_device_suspend(idev,
880 status = sci_remote_node_context_start_task(&idev->rnc, ireq,
881 sci_remote_device_continue_request, idev);
884 sci_remote_device_start_request(idev, ireq, status);
891 status = sci_port_start_io(iport, idev, ireq);
896 status = sci_remote_node_context_start_task(&idev->rnc, ireq,
904 sci_remote_device_start_request(idev, ireq, status);
909 void sci_remote_device_post_request(struct isci_remote_device *idev, u32 request)
911 struct isci_port *iport = idev->owning_port;
917 idev->rnc.remote_node_index;
928 struct isci_remote_device *idev = _dev;
930 if (is_remote_device_ready(idev))
934 sci_change_state(&idev->sm, SCI_DEV_READY);
939 struct isci_remote_device *idev = _dev;
940 struct isci_host *ihost = idev->owning_port->owning_controller;
945 if (idev->sm.previous_state_id != SCI_STP_DEV_NCQ)
946 isci_remote_device_ready(ihost, idev);
951 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
954 sci_change_state(&idev->sm, SCI_DEV_STOPPED);
959 * @idev: This parameter specifies the remote device to be destructed.
970 static enum sci_status sci_remote_device_destruct(struct isci_remote_device *idev)
972 struct sci_base_state_machine *sm = &idev->sm;
977 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
982 ihost = idev->owning_port->owning_controller;
983 sci_controller_free_remote_node_context(ihost, idev,
984 idev->rnc.remote_node_index);
985 idev->rnc.remote_node_index = SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX;
994 * @idev: This parameter specifies the remote device to be freed.
997 static void isci_remote_device_deconstruct(struct isci_host *ihost, struct isci_remote_device *idev)
1000 "%s: isci_device = %p\n", __func__, idev);
1006 BUG_ON(idev->started_request_count > 0);
1008 sci_remote_device_destruct(idev);
1009 list_del_init(&idev->node);
1010 isci_put_device(idev);
1015 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1016 struct isci_host *ihost = idev->owning_port->owning_controller;
1022 prev_state = idev->sm.previous_state_id;
1024 isci_remote_device_deconstruct(ihost, idev);
1026 sci_controller_remote_device_stopped(ihost, idev);
1031 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1032 struct isci_host *ihost = idev->owning_port->owning_controller;
1034 isci_remote_device_not_ready(ihost, idev,
1040 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1041 struct isci_host *ihost = idev->owning_port->owning_controller;
1042 struct domain_device *dev = idev->domain_dev;
1045 sci_change_state(&idev->sm, SCI_STP_DEV_IDLE);
1047 sci_change_state(&idev->sm, SCI_SMP_DEV_IDLE);
1049 isci_remote_device_ready(ihost, idev);
1054 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1055 struct domain_device *dev = idev->domain_dev;
1058 struct isci_host *ihost = idev->owning_port->owning_controller;
1060 isci_remote_device_not_ready(ihost, idev,
1067 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1068 struct isci_host *ihost = idev->owning_port->owning_controller;
1071 "%s: isci_device = %p\n", __func__, idev);
1073 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_LINKHANG_DETECT);
1078 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1079 struct isci_host *ihost = idev->owning_port->owning_controller;
1082 "%s: isci_device = %p\n", __func__, idev);
1084 sci_remote_node_context_resume(&idev->rnc, NULL, NULL);
1089 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1091 idev->working_request = NULL;
1092 if (sci_remote_node_context_is_ready(&idev->rnc)) {
1096 sci_stp_remote_device_ready_idle_substate_resume_complete_handler(idev);
1098 sci_remote_node_context_resume(&idev->rnc,
1100 idev);
1106 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1107 struct isci_host *ihost = idev->owning_port->owning_controller;
1109 BUG_ON(idev->working_request == NULL);
1111 isci_remote_device_not_ready(ihost, idev,
1117 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1118 struct isci_host *ihost = idev->owning_port->owning_controller;
1120 if (idev->not_ready_reason == SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED)
1121 isci_remote_device_not_ready(ihost, idev,
1122 idev->not_ready_reason);
1127 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1128 struct isci_host *ihost = idev->owning_port->owning_controller;
1130 isci_remote_device_ready(ihost, idev);
1135 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1136 struct isci_host *ihost = idev->owning_port->owning_controller;
1138 BUG_ON(idev->working_request == NULL);
1140 isci_remote_device_not_ready(ihost, idev,
1146 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1148 idev->working_request = NULL;
1196 * @idev: remote device to construct
1204 struct isci_remote_device *idev)
1206 idev->owning_port = iport;
1207 idev->started_request_count = 0;
1209 sci_init_sm(&idev->sm, sci_remote_device_state_table, SCI_DEV_INITIAL);
1211 sci_remote_node_context_construct(&idev->rnc,
1230 struct isci_remote_device *idev)
1235 sci_remote_device_construct(iport, idev);
1239 idev->device_port_width = hweight32(properties.phy_mask);
1242 idev,
1243 &idev->rnc.remote_node_index);
1248 idev->connection_rate = sci_port_get_max_allowed_speed(iport);
1266 struct isci_remote_device *idev)
1268 struct domain_device *dev = idev->domain_dev;
1271 sci_remote_device_construct(iport, idev);
1274 idev,
1275 &idev->rnc.remote_node_index);
1286 idev->connection_rate = min_t(u16, sci_port_get_max_allowed_speed(iport),
1290 idev->device_port_width = 1;
1296 struct isci_remote_device *idev,
1302 status = sci_remote_node_context_resume(&idev->rnc, cb_fn, cb_p);
1304 dev_dbg(scirdev_to_dev(idev), "%s: failed to resume: %d\n",
1311 struct isci_remote_device *idev = cbparam;
1312 struct isci_host *ihost = idev->owning_port->owning_controller;
1314 idev->abort_resume_cb;
1316 dev_dbg(scirdev_to_dev(idev), "%s: passing-along resume: %p\n",
1320 idev->abort_resume_cb = NULL;
1321 abort_resume_cb(idev->abort_resume_cbparam);
1323 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1329 struct isci_remote_device *idev)
1335 done = !test_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags)
1336 || test_bit(IDEV_STOP_PENDING, &idev->flags)
1337 || sci_remote_node_context_is_being_destroyed(&idev->rnc);
1345 struct isci_remote_device *idev)
1348 __func__, idev);
1352 isci_remote_device_test_resume_done(ihost, idev),
1356 "resume: %p\n", __func__, idev);
1358 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1361 __func__, idev);
1366 struct isci_remote_device *idev)
1376 idev->abort_resume_cb = idev->rnc.user_callback;
1377 idev->abort_resume_cbparam = idev->rnc.user_cookie;
1378 set_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1379 clear_bit(IDEV_ABORT_PATH_ACTIVE, &idev->flags);
1380 destroyed = sci_remote_node_context_is_being_destroyed(&idev->rnc);
1383 idev, isci_remote_device_resume_from_abort_complete,
1384 idev);
1387 isci_remote_device_wait_for_resume_from_abort(ihost, idev);
1389 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1398 * @idev: This parameter specifies the device to be started.
1407 static enum sci_status sci_remote_device_start(struct isci_remote_device *idev,
1410 struct sci_base_state_machine *sm = &idev->sm;
1415 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
1420 status = sci_remote_device_resume(idev, remote_device_resume_done,
1421 idev);
1431 struct isci_remote_device *idev)
1434 struct domain_device *dev = idev->domain_dev;
1438 status = sci_remote_device_ea_construct(iport, idev);
1440 status = sci_remote_device_da_construct(iport, idev);
1450 status = sci_remote_device_start(idev, ISCI_REMOTE_DEVICE_START_TIMEOUT);
1471 struct isci_remote_device *idev;
1475 idev = &ihost->devices[i];
1476 if (!test_and_set_bit(IDEV_ALLOCATED, &idev->flags))
1484 if (WARN_ONCE(!list_empty(&idev->node), "found non-idle remote device\n"))
1487 return idev;
1492 struct isci_remote_device *idev = container_of(kref, typeof(*idev), kref);
1493 struct isci_host *ihost = idev->isci_port->isci_host;
1495 idev->domain_dev = NULL;
1496 idev->isci_port = NULL;
1497 clear_bit(IDEV_START_PENDING, &idev->flags);
1498 clear_bit(IDEV_STOP_PENDING, &idev->flags);
1499 clear_bit(IDEV_IO_READY, &idev->flags);
1500 clear_bit(IDEV_GONE, &idev->flags);
1502 clear_bit(IDEV_ALLOCATED, &idev->flags);
1510 * @idev: This parameter specifies the remote device.
1514 enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_remote_device *idev)
1520 "%s: isci_device = %p\n", __func__, idev);
1523 idev->domain_dev->lldd_dev = NULL; /* disable new lookups */
1524 set_bit(IDEV_GONE, &idev->flags);
1526 set_bit(IDEV_STOP_PENDING, &idev->flags);
1527 status = sci_remote_device_stop(idev, 50);
1534 wait_for_device_stop(ihost, idev);
1537 "%s: isci_device = %p, waiting done.\n", __func__, idev);
1550 struct isci_remote_device *idev = dev->lldd_dev;
1554 __func__, dev, idev, idev->isci_port);
1556 isci_remote_device_stop(ihost, idev);
1616 struct isci_remote_device *idev,
1624 set_bit(IDEV_ABORT_PATH_ACTIVE, &idev->flags);
1625 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_LINKHANG_DETECT);
1629 status = isci_remote_device_terminate_requests(ihost, idev, ireq);
1634 __func__, idev, status);
1641 struct isci_remote_device *idev)
1643 return sci_remote_node_context_is_safe_to_abort(&idev->rnc);
1647 struct isci_remote_device *idev)
1649 return sci_remote_device_terminate_reqs_checkabort(idev, 1);
1653 struct isci_remote_device *idev,
1656 if (dev_is_sata(idev->domain_dev)) {
1659 &idev->flags))
1662 &idev->flags))
1665 sci_port_set_hang_detection_timeout(idev->owning_port,