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_reset(struct isci_remote_device *idev)
397 struct sci_base_state_machine *sm = &idev->sm;
411 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
425 enum sci_status sci_remote_device_reset_complete(struct isci_remote_device *idev)
427 struct sci_base_state_machine *sm = &idev->sm;
431 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
440 enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev,
443 struct sci_base_state_machine *sm = &idev->sm;
445 struct isci_host *ihost = idev->owning_port->owning_controller;
456 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
482 if (ireq && ireq->target_device == idev) {
504 idev->not_ready_reason = SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
514 idev->not_ready_reason = SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
515 sci_change_state(&idev->sm, SCI_STP_DEV_NCQ_ERROR);
528 status = sci_io_request_frame_handler(idev->working_request, frame_index);
535 static bool is_remote_device_ready(struct isci_remote_device *idev)
538 struct sci_base_state_machine *sm = &idev->sm;
562 struct isci_remote_device *idev = _dev;
563 struct isci_request *ireq = idev->working_request;
568 enum sci_status sci_remote_device_event_handler(struct isci_remote_device *idev,
572 struct sci_base_state_machine *sm = &idev->sm;
579 status = sci_remote_node_context_event_handler(&idev->rnc, event_code);
586 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_NORMAL);
588 dev_dbg(scirdev_to_dev(idev),
590 __func__, idev, event_code,
591 is_remote_device_ready(idev)
599 dev_dbg(scirdev_to_dev(idev),
601 __func__, idev, event_code,
602 is_remote_device_ready(idev)
620 return sci_remote_node_context_resume(&idev->rnc,
622 idev);
633 status = sci_remote_node_context_resume(&idev->rnc, NULL, NULL);
639 static void sci_remote_device_start_request(struct isci_remote_device *idev,
643 struct isci_port *iport = idev->owning_port;
647 sci_port_complete_io(iport, idev, ireq);
649 kref_get(&idev->kref);
650 idev->started_request_count++;
655 struct isci_remote_device *idev,
658 struct sci_base_state_machine *sm = &idev->sm;
660 struct isci_port *iport = idev->owning_port;
673 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
682 status = sci_port_start_io(iport, idev, ireq);
686 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
704 status = sci_port_start_io(iport, idev, ireq);
708 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
719 idev->working_request = ireq;
729 status = sci_port_start_io(iport, idev, ireq);
733 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
745 status = sci_port_start_io(iport, idev, ireq);
749 status = sci_remote_node_context_start_io(&idev->rnc, ireq);
757 idev->working_request = ireq;
758 sci_change_state(&idev->sm, SCI_SMP_DEV_CMD);
768 sci_remote_device_start_request(idev, ireq, status);
773 struct isci_remote_device *idev,
782 status = sci_port_complete_io(iport, idev, ireq);
786 sci_remote_device_decrement_request_count(idev);
791 struct isci_remote_device *idev,
794 struct sci_base_state_machine *sm = &idev->sm;
796 struct isci_port *iport = idev->owning_port;
808 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
814 status = common_complete_io(iport, idev, ireq);
820 status = common_complete_io(iport, idev, ireq);
831 } else if (idev->started_request_count == 0)
835 status = common_complete_io(iport, idev, ireq);
841 status = common_complete_io(iport, idev, ireq);
845 if (idev->started_request_count == 0)
846 sci_remote_node_context_destruct(&idev->rnc,
848 idev);
853 dev_err(scirdev_to_dev(idev),
856 idev, ireq, status);
858 isci_put_device(idev);
865 struct isci_remote_device *idev = dev;
868 if (idev->working_request)
869 sci_controller_continue_io(idev->working_request);
873 struct isci_remote_device *idev,
876 struct sci_base_state_machine *sm = &idev->sm;
878 struct isci_port *iport = idev->owning_port;
892 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
900 status = sci_port_start_io(iport, idev, ireq);
912 idev->working_request = ireq;
922 sci_remote_device_suspend(idev,
925 status = sci_remote_node_context_start_task(&idev->rnc, ireq,
926 sci_remote_device_continue_request, idev);
929 sci_remote_device_start_request(idev, ireq, status);
936 status = sci_port_start_io(iport, idev, ireq);
941 status = sci_remote_node_context_start_task(&idev->rnc, ireq,
949 sci_remote_device_start_request(idev, ireq, status);
954 void sci_remote_device_post_request(struct isci_remote_device *idev, u32 request)
956 struct isci_port *iport = idev->owning_port;
962 idev->rnc.remote_node_index;
973 struct isci_remote_device *idev = _dev;
975 if (is_remote_device_ready(idev))
979 sci_change_state(&idev->sm, SCI_DEV_READY);
984 struct isci_remote_device *idev = _dev;
985 struct isci_host *ihost = idev->owning_port->owning_controller;
990 if (idev->sm.previous_state_id != SCI_STP_DEV_NCQ)
991 isci_remote_device_ready(ihost, idev);
996 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
999 sci_change_state(&idev->sm, SCI_DEV_STOPPED);
1004 * @idev: This parameter specifies the remote device to be destructed.
1015 static enum sci_status sci_remote_device_destruct(struct isci_remote_device *idev)
1017 struct sci_base_state_machine *sm = &idev->sm;
1022 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
1027 ihost = idev->owning_port->owning_controller;
1028 sci_controller_free_remote_node_context(ihost, idev,
1029 idev->rnc.remote_node_index);
1030 idev->rnc.remote_node_index = SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX;
1039 * @idev: This parameter specifies the remote device to be freed.
1042 static void isci_remote_device_deconstruct(struct isci_host *ihost, struct isci_remote_device *idev)
1045 "%s: isci_device = %p\n", __func__, idev);
1051 BUG_ON(idev->started_request_count > 0);
1053 sci_remote_device_destruct(idev);
1054 list_del_init(&idev->node);
1055 isci_put_device(idev);
1060 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1061 struct isci_host *ihost = idev->owning_port->owning_controller;
1067 prev_state = idev->sm.previous_state_id;
1069 isci_remote_device_deconstruct(ihost, idev);
1071 sci_controller_remote_device_stopped(ihost, idev);
1076 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1077 struct isci_host *ihost = idev->owning_port->owning_controller;
1079 isci_remote_device_not_ready(ihost, idev,
1085 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1086 struct isci_host *ihost = idev->owning_port->owning_controller;
1087 struct domain_device *dev = idev->domain_dev;
1090 sci_change_state(&idev->sm, SCI_STP_DEV_IDLE);
1092 sci_change_state(&idev->sm, SCI_SMP_DEV_IDLE);
1094 isci_remote_device_ready(ihost, idev);
1099 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1100 struct domain_device *dev = idev->domain_dev;
1103 struct isci_host *ihost = idev->owning_port->owning_controller;
1105 isci_remote_device_not_ready(ihost, idev,
1112 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1113 struct isci_host *ihost = idev->owning_port->owning_controller;
1116 "%s: isci_device = %p\n", __func__, idev);
1118 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_LINKHANG_DETECT);
1123 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1124 struct isci_host *ihost = idev->owning_port->owning_controller;
1127 "%s: isci_device = %p\n", __func__, idev);
1129 sci_remote_node_context_resume(&idev->rnc, NULL, NULL);
1134 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1136 idev->working_request = NULL;
1137 if (sci_remote_node_context_is_ready(&idev->rnc)) {
1141 sci_stp_remote_device_ready_idle_substate_resume_complete_handler(idev);
1143 sci_remote_node_context_resume(&idev->rnc,
1145 idev);
1151 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1152 struct isci_host *ihost = idev->owning_port->owning_controller;
1154 BUG_ON(idev->working_request == NULL);
1156 isci_remote_device_not_ready(ihost, idev,
1162 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1163 struct isci_host *ihost = idev->owning_port->owning_controller;
1165 if (idev->not_ready_reason == SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED)
1166 isci_remote_device_not_ready(ihost, idev,
1167 idev->not_ready_reason);
1172 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1173 struct isci_host *ihost = idev->owning_port->owning_controller;
1175 isci_remote_device_ready(ihost, idev);
1180 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1181 struct isci_host *ihost = idev->owning_port->owning_controller;
1183 BUG_ON(idev->working_request == NULL);
1185 isci_remote_device_not_ready(ihost, idev,
1191 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm);
1193 idev->working_request = NULL;
1241 * @idev: remote device to construct
1249 struct isci_remote_device *idev)
1251 idev->owning_port = iport;
1252 idev->started_request_count = 0;
1254 sci_init_sm(&idev->sm, sci_remote_device_state_table, SCI_DEV_INITIAL);
1256 sci_remote_node_context_construct(&idev->rnc,
1275 struct isci_remote_device *idev)
1280 sci_remote_device_construct(iport, idev);
1284 idev->device_port_width = hweight32(properties.phy_mask);
1287 idev,
1288 &idev->rnc.remote_node_index);
1293 idev->connection_rate = sci_port_get_max_allowed_speed(iport);
1311 struct isci_remote_device *idev)
1313 struct domain_device *dev = idev->domain_dev;
1316 sci_remote_device_construct(iport, idev);
1319 idev,
1320 &idev->rnc.remote_node_index);
1331 idev->connection_rate = min_t(u16, sci_port_get_max_allowed_speed(iport),
1335 idev->device_port_width = 1;
1341 struct isci_remote_device *idev,
1347 status = sci_remote_node_context_resume(&idev->rnc, cb_fn, cb_p);
1349 dev_dbg(scirdev_to_dev(idev), "%s: failed to resume: %d\n",
1356 struct isci_remote_device *idev = cbparam;
1357 struct isci_host *ihost = idev->owning_port->owning_controller;
1359 idev->abort_resume_cb;
1361 dev_dbg(scirdev_to_dev(idev), "%s: passing-along resume: %p\n",
1365 idev->abort_resume_cb = NULL;
1366 abort_resume_cb(idev->abort_resume_cbparam);
1368 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1374 struct isci_remote_device *idev)
1380 done = !test_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags)
1381 || test_bit(IDEV_STOP_PENDING, &idev->flags)
1382 || sci_remote_node_context_is_being_destroyed(&idev->rnc);
1390 struct isci_remote_device *idev)
1393 __func__, idev);
1397 isci_remote_device_test_resume_done(ihost, idev),
1401 "resume: %p\n", __func__, idev);
1403 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1406 __func__, idev);
1411 struct isci_remote_device *idev)
1421 idev->abort_resume_cb = idev->rnc.user_callback;
1422 idev->abort_resume_cbparam = idev->rnc.user_cookie;
1423 set_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1424 clear_bit(IDEV_ABORT_PATH_ACTIVE, &idev->flags);
1425 destroyed = sci_remote_node_context_is_being_destroyed(&idev->rnc);
1428 idev, isci_remote_device_resume_from_abort_complete,
1429 idev);
1432 isci_remote_device_wait_for_resume_from_abort(ihost, idev);
1434 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags);
1443 * @idev: This parameter specifies the device to be started.
1452 static enum sci_status sci_remote_device_start(struct isci_remote_device *idev,
1455 struct sci_base_state_machine *sm = &idev->sm;
1460 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
1465 status = sci_remote_device_resume(idev, remote_device_resume_done,
1466 idev);
1476 struct isci_remote_device *idev)
1479 struct domain_device *dev = idev->domain_dev;
1483 status = sci_remote_device_ea_construct(iport, idev);
1485 status = sci_remote_device_da_construct(iport, idev);
1495 status = sci_remote_device_start(idev, ISCI_REMOTE_DEVICE_START_TIMEOUT);
1516 struct isci_remote_device *idev;
1520 idev = &ihost->devices[i];
1521 if (!test_and_set_bit(IDEV_ALLOCATED, &idev->flags))
1529 if (WARN_ONCE(!list_empty(&idev->node), "found non-idle remote device\n"))
1532 return idev;
1537 struct isci_remote_device *idev = container_of(kref, typeof(*idev), kref);
1538 struct isci_host *ihost = idev->isci_port->isci_host;
1540 idev->domain_dev = NULL;
1541 idev->isci_port = NULL;
1542 clear_bit(IDEV_START_PENDING, &idev->flags);
1543 clear_bit(IDEV_STOP_PENDING, &idev->flags);
1544 clear_bit(IDEV_IO_READY, &idev->flags);
1545 clear_bit(IDEV_GONE, &idev->flags);
1547 clear_bit(IDEV_ALLOCATED, &idev->flags);
1555 * @idev: This parameter specifies the remote device.
1559 enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_remote_device *idev)
1565 "%s: isci_device = %p\n", __func__, idev);
1568 idev->domain_dev->lldd_dev = NULL; /* disable new lookups */
1569 set_bit(IDEV_GONE, &idev->flags);
1571 set_bit(IDEV_STOP_PENDING, &idev->flags);
1572 status = sci_remote_device_stop(idev, 50);
1579 wait_for_device_stop(ihost, idev);
1582 "%s: isci_device = %p, waiting done.\n", __func__, idev);
1595 struct isci_remote_device *idev = dev->lldd_dev;
1599 __func__, dev, idev, idev->isci_port);
1601 isci_remote_device_stop(ihost, idev);
1661 struct isci_remote_device *idev,
1669 set_bit(IDEV_ABORT_PATH_ACTIVE, &idev->flags);
1670 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_LINKHANG_DETECT);
1674 status = isci_remote_device_terminate_requests(ihost, idev, ireq);
1679 __func__, idev, status);
1686 struct isci_remote_device *idev)
1688 return sci_remote_node_context_is_safe_to_abort(&idev->rnc);
1692 struct isci_remote_device *idev)
1694 return sci_remote_device_terminate_reqs_checkabort(idev, 1);
1699 struct isci_remote_device *idev)
1705 status = sci_remote_device_reset_complete(idev);
1712 struct isci_remote_device *idev,
1715 if (dev_is_sata(idev->domain_dev)) {
1718 &idev->flags))
1721 &idev->flags))
1724 sci_port_set_hang_detection_timeout(idev->owning_port,