remote_device.c (53469B)
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 * * Neither the name of Intel Corporation nor the names of its 40 * contributors may be used to endorse or promote products derived 41 * from this software without specific prior written permission. 42 * 43 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 44 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 45 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 46 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 47 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 48 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 49 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 50 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 51 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 52 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 53 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 */ 55#include <scsi/sas.h> 56#include <linux/bitops.h> 57#include "isci.h" 58#include "port.h" 59#include "remote_device.h" 60#include "request.h" 61#include "remote_node_context.h" 62#include "scu_event_codes.h" 63#include "task.h" 64 65#undef C 66#define C(a) (#a) 67const char *dev_state_name(enum sci_remote_device_states state) 68{ 69 static const char * const strings[] = REMOTE_DEV_STATES; 70 71 return strings[state]; 72} 73#undef C 74 75enum sci_status sci_remote_device_suspend(struct isci_remote_device *idev, 76 enum sci_remote_node_suspension_reasons reason) 77{ 78 return sci_remote_node_context_suspend(&idev->rnc, reason, 79 SCI_SOFTWARE_SUSPEND_EXPECTED_EVENT); 80} 81 82/** 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 85 * waiting proccess. 86 * @ihost: our valid isci_host 87 * @idev: remote device 88 * 89 */ 90static void isci_remote_device_ready(struct isci_host *ihost, struct isci_remote_device *idev) 91{ 92 dev_dbg(&ihost->pdev->dev, 93 "%s: idev = %p\n", __func__, idev); 94 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)) 98 wake_up(&ihost->eventq); 99} 100 101static enum sci_status sci_remote_device_terminate_req( 102 struct isci_host *ihost, 103 struct isci_remote_device *idev, 104 int check_abort, 105 struct isci_request *ireq) 106{ 107 if (!test_bit(IREQ_ACTIVE, &ireq->flags) || 108 (ireq->target_device != idev) || 109 (check_abort && !test_bit(IREQ_PENDING_ABORT, &ireq->flags))) 110 return SCI_SUCCESS; 111 112 dev_dbg(&ihost->pdev->dev, 113 "%s: idev=%p; flags=%lx; req=%p; req target=%p\n", 114 __func__, idev, idev->flags, ireq, ireq->target_device); 115 116 set_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags); 117 118 return sci_controller_terminate_request(ihost, idev, ireq); 119} 120 121static enum sci_status sci_remote_device_terminate_reqs_checkabort( 122 struct isci_remote_device *idev, 123 int chk) 124{ 125 struct isci_host *ihost = idev->owning_port->owning_controller; 126 enum sci_status status = SCI_SUCCESS; 127 u32 i; 128 129 for (i = 0; i < SCI_MAX_IO_REQUESTS; i++) { 130 struct isci_request *ireq = ihost->reqs[i]; 131 enum sci_status s; 132 133 s = sci_remote_device_terminate_req(ihost, idev, chk, ireq); 134 if (s != SCI_SUCCESS) 135 status = s; 136 } 137 return status; 138} 139 140static bool isci_compare_suspendcount( 141 struct isci_remote_device *idev, 142 u32 localcount) 143{ 144 smp_rmb(); 145 146 /* Check for a change in the suspend count, or the RNC 147 * being destroyed. 148 */ 149 return (localcount != idev->rnc.suspend_count) 150 || sci_remote_node_context_is_being_destroyed(&idev->rnc); 151} 152 153static bool isci_check_reqterm( 154 struct isci_host *ihost, 155 struct isci_remote_device *idev, 156 struct isci_request *ireq, 157 u32 localcount) 158{ 159 unsigned long flags; 160 bool res; 161 162 spin_lock_irqsave(&ihost->scic_lock, flags); 163 res = isci_compare_suspendcount(idev, localcount) 164 && !test_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags); 165 spin_unlock_irqrestore(&ihost->scic_lock, flags); 166 167 return res; 168} 169 170static bool isci_check_devempty( 171 struct isci_host *ihost, 172 struct isci_remote_device *idev, 173 u32 localcount) 174{ 175 unsigned long flags; 176 bool res; 177 178 spin_lock_irqsave(&ihost->scic_lock, flags); 179 res = isci_compare_suspendcount(idev, localcount) 180 && idev->started_request_count == 0; 181 spin_unlock_irqrestore(&ihost->scic_lock, flags); 182 183 return res; 184} 185 186enum sci_status isci_remote_device_terminate_requests( 187 struct isci_host *ihost, 188 struct isci_remote_device *idev, 189 struct isci_request *ireq) 190{ 191 enum sci_status status = SCI_SUCCESS; 192 unsigned long flags; 193 u32 rnc_suspend_count; 194 195 spin_lock_irqsave(&ihost->scic_lock, flags); 196 197 if (isci_get_device(idev) == NULL) { 198 dev_dbg(&ihost->pdev->dev, "%s: failed isci_get_device(idev=%p)\n", 199 __func__, idev); 200 spin_unlock_irqrestore(&ihost->scic_lock, flags); 201 status = SCI_FAILURE; 202 } else { 203 /* If already suspended, don't wait for another suspension. */ 204 smp_rmb(); 205 rnc_suspend_count 206 = sci_remote_node_context_is_suspended(&idev->rnc) 207 ? 0 : idev->rnc.suspend_count; 208 209 dev_dbg(&ihost->pdev->dev, 210 "%s: idev=%p, ireq=%p; started_request_count=%d, " 211 "rnc_suspend_count=%d, rnc.suspend_count=%d" 212 "about to wait\n", 213 __func__, idev, ireq, idev->started_request_count, 214 rnc_suspend_count, idev->rnc.suspend_count); 215 216 #define MAX_SUSPEND_MSECS 10000 217 if (ireq) { 218 /* Terminate a specific TC. */ 219 set_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); 220 sci_remote_device_terminate_req(ihost, idev, 0, ireq); 221 spin_unlock_irqrestore(&ihost->scic_lock, flags); 222 if (!wait_event_timeout(ihost->eventq, 223 isci_check_reqterm(ihost, idev, ireq, 224 rnc_suspend_count), 225 msecs_to_jiffies(MAX_SUSPEND_MSECS))) { 226 227 dev_warn(&ihost->pdev->dev, "%s host%d timeout single\n", 228 __func__, ihost->id); 229 dev_dbg(&ihost->pdev->dev, 230 "%s: ******* Timeout waiting for " 231 "suspend; idev=%p, current state %s; " 232 "started_request_count=%d, flags=%lx\n\t" 233 "rnc_suspend_count=%d, rnc.suspend_count=%d " 234 "RNC: current state %s, current " 235 "suspend_type %x dest state %d;\n" 236 "ireq=%p, ireq->flags = %lx\n", 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, 244 ireq, ireq->flags); 245 } 246 spin_lock_irqsave(&ihost->scic_lock, flags); 247 clear_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags); 248 if (!test_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags)) 249 isci_free_tag(ihost, ireq->io_tag); 250 spin_unlock_irqrestore(&ihost->scic_lock, flags); 251 } else { 252 /* Terminate all TCs. */ 253 sci_remote_device_terminate_requests(idev); 254 spin_unlock_irqrestore(&ihost->scic_lock, flags); 255 if (!wait_event_timeout(ihost->eventq, 256 isci_check_devempty(ihost, idev, 257 rnc_suspend_count), 258 msecs_to_jiffies(MAX_SUSPEND_MSECS))) { 259 260 dev_warn(&ihost->pdev->dev, "%s host%d timeout all\n", 261 __func__, ihost->id); 262 dev_dbg(&ihost->pdev->dev, 263 "%s: ******* Timeout waiting for " 264 "suspend; idev=%p, current state %s; " 265 "started_request_count=%d, flags=%lx\n\t" 266 "rnc_suspend_count=%d, " 267 "RNC: current state %s, " 268 "rnc.suspend_count=%d, current " 269 "suspend_type %x dest state %d\n", 270 __func__, idev, 271 dev_state_name(idev->sm.current_state_id), 272 idev->started_request_count, idev->flags, 273 rnc_suspend_count, 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); 278 } 279 } 280 dev_dbg(&ihost->pdev->dev, "%s: idev=%p, wait done\n", 281 __func__, idev); 282 isci_put_device(idev); 283 } 284 return status; 285} 286 287/** 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 290* "ready_for_io") and signal the waiting proccess. 291* @ihost: This parameter specifies the isci host object. 292* @idev: This parameter specifies the remote device 293* @reason: Reason to switch on 294* 295* sci_lock is held on entrance to this function. 296*/ 297static void isci_remote_device_not_ready(struct isci_host *ihost, 298 struct isci_remote_device *idev, 299 u32 reason) 300{ 301 dev_dbg(&ihost->pdev->dev, 302 "%s: isci_device = %p; reason = %d\n", __func__, idev, reason); 303 304 switch (reason) { 305 case SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED: 306 set_bit(IDEV_IO_NCQERROR, &idev->flags); 307 308 /* Suspend the remote device so the I/O can be terminated. */ 309 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_NORMAL); 310 311 /* Kill all outstanding requests for the device. */ 312 sci_remote_device_terminate_requests(idev); 313 314 fallthrough; /* into the default case */ 315 default: 316 clear_bit(IDEV_IO_READY, &idev->flags); 317 break; 318 } 319} 320 321/* called once the remote node context is ready to be freed. 322 * The remote device can now report that its stop operation is complete. none 323 */ 324static void rnc_destruct_done(void *_dev) 325{ 326 struct isci_remote_device *idev = _dev; 327 328 BUG_ON(idev->started_request_count != 0); 329 sci_change_state(&idev->sm, SCI_DEV_STOPPED); 330} 331 332enum sci_status sci_remote_device_terminate_requests( 333 struct isci_remote_device *idev) 334{ 335 return sci_remote_device_terminate_reqs_checkabort(idev, 0); 336} 337 338enum sci_status sci_remote_device_stop(struct isci_remote_device *idev, 339 u32 timeout) 340{ 341 struct sci_base_state_machine *sm = &idev->sm; 342 enum sci_remote_device_states state = sm->current_state_id; 343 344 switch (state) { 345 case SCI_DEV_INITIAL: 346 case SCI_DEV_FAILED: 347 case SCI_DEV_FINAL: 348 default: 349 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 350 __func__, dev_state_name(state)); 351 return SCI_FAILURE_INVALID_STATE; 352 case SCI_DEV_STOPPED: 353 return SCI_SUCCESS; 354 case SCI_DEV_STARTING: 355 /* device not started so there had better be no requests */ 356 BUG_ON(idev->started_request_count != 0); 357 sci_remote_node_context_destruct(&idev->rnc, 358 rnc_destruct_done, idev); 359 /* Transition to the stopping state and wait for the 360 * remote node to complete being posted and invalidated. 361 */ 362 sci_change_state(sm, SCI_DEV_STOPPING); 363 return SCI_SUCCESS; 364 case SCI_DEV_READY: 365 case SCI_STP_DEV_IDLE: 366 case SCI_STP_DEV_CMD: 367 case SCI_STP_DEV_NCQ: 368 case SCI_STP_DEV_NCQ_ERROR: 369 case SCI_STP_DEV_AWAIT_RESET: 370 case SCI_SMP_DEV_IDLE: 371 case SCI_SMP_DEV_CMD: 372 sci_change_state(sm, SCI_DEV_STOPPING); 373 if (idev->started_request_count == 0) 374 sci_remote_node_context_destruct(&idev->rnc, 375 rnc_destruct_done, 376 idev); 377 else { 378 sci_remote_device_suspend( 379 idev, SCI_SW_SUSPEND_LINKHANG_DETECT); 380 sci_remote_device_terminate_requests(idev); 381 } 382 return SCI_SUCCESS; 383 case SCI_DEV_STOPPING: 384 /* All requests should have been terminated, but if there is an 385 * attempt to stop a device already in the stopping state, then 386 * try again to terminate. 387 */ 388 return sci_remote_device_terminate_requests(idev); 389 case SCI_DEV_RESETTING: 390 sci_change_state(sm, SCI_DEV_STOPPING); 391 return SCI_SUCCESS; 392 } 393} 394 395enum sci_status sci_remote_device_reset(struct isci_remote_device *idev) 396{ 397 struct sci_base_state_machine *sm = &idev->sm; 398 enum sci_remote_device_states state = sm->current_state_id; 399 400 switch (state) { 401 case SCI_DEV_INITIAL: 402 case SCI_DEV_STOPPED: 403 case SCI_DEV_STARTING: 404 case SCI_SMP_DEV_IDLE: 405 case SCI_SMP_DEV_CMD: 406 case SCI_DEV_STOPPING: 407 case SCI_DEV_FAILED: 408 case SCI_DEV_RESETTING: 409 case SCI_DEV_FINAL: 410 default: 411 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 412 __func__, dev_state_name(state)); 413 return SCI_FAILURE_INVALID_STATE; 414 case SCI_DEV_READY: 415 case SCI_STP_DEV_IDLE: 416 case SCI_STP_DEV_CMD: 417 case SCI_STP_DEV_NCQ: 418 case SCI_STP_DEV_NCQ_ERROR: 419 case SCI_STP_DEV_AWAIT_RESET: 420 sci_change_state(sm, SCI_DEV_RESETTING); 421 return SCI_SUCCESS; 422 } 423} 424 425enum sci_status sci_remote_device_reset_complete(struct isci_remote_device *idev) 426{ 427 struct sci_base_state_machine *sm = &idev->sm; 428 enum sci_remote_device_states state = sm->current_state_id; 429 430 if (state != SCI_DEV_RESETTING) { 431 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 432 __func__, dev_state_name(state)); 433 return SCI_FAILURE_INVALID_STATE; 434 } 435 436 sci_change_state(sm, SCI_DEV_READY); 437 return SCI_SUCCESS; 438} 439 440enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev, 441 u32 frame_index) 442{ 443 struct sci_base_state_machine *sm = &idev->sm; 444 enum sci_remote_device_states state = sm->current_state_id; 445 struct isci_host *ihost = idev->owning_port->owning_controller; 446 enum sci_status status; 447 448 switch (state) { 449 case SCI_DEV_INITIAL: 450 case SCI_DEV_STOPPED: 451 case SCI_DEV_STARTING: 452 case SCI_STP_DEV_IDLE: 453 case SCI_SMP_DEV_IDLE: 454 case SCI_DEV_FINAL: 455 default: 456 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 457 __func__, dev_state_name(state)); 458 /* Return the frame back to the controller */ 459 sci_controller_release_frame(ihost, frame_index); 460 return SCI_FAILURE_INVALID_STATE; 461 case SCI_DEV_READY: 462 case SCI_STP_DEV_NCQ_ERROR: 463 case SCI_STP_DEV_AWAIT_RESET: 464 case SCI_DEV_STOPPING: 465 case SCI_DEV_FAILED: 466 case SCI_DEV_RESETTING: { 467 struct isci_request *ireq; 468 struct ssp_frame_hdr hdr; 469 void *frame_header; 470 ssize_t word_cnt; 471 472 status = sci_unsolicited_frame_control_get_header(&ihost->uf_control, 473 frame_index, 474 &frame_header); 475 if (status != SCI_SUCCESS) 476 return status; 477 478 word_cnt = sizeof(hdr) / sizeof(u32); 479 sci_swab32_cpy(&hdr, frame_header, word_cnt); 480 481 ireq = sci_request_by_tag(ihost, be16_to_cpu(hdr.tag)); 482 if (ireq && ireq->target_device == idev) { 483 /* The IO request is now in charge of releasing the frame */ 484 status = sci_io_request_frame_handler(ireq, frame_index); 485 } else { 486 /* We could not map this tag to a valid IO 487 * request Just toss the frame and continue 488 */ 489 sci_controller_release_frame(ihost, frame_index); 490 } 491 break; 492 } 493 case SCI_STP_DEV_NCQ: { 494 struct dev_to_host_fis *hdr; 495 496 status = sci_unsolicited_frame_control_get_header(&ihost->uf_control, 497 frame_index, 498 (void **)&hdr); 499 if (status != SCI_SUCCESS) 500 return status; 501 502 if (hdr->fis_type == FIS_SETDEVBITS && 503 (hdr->status & ATA_ERR)) { 504 idev->not_ready_reason = SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED; 505 506 /* TODO Check sactive and complete associated IO if any. */ 507 sci_change_state(sm, SCI_STP_DEV_NCQ_ERROR); 508 } else if (hdr->fis_type == FIS_REGD2H && 509 (hdr->status & ATA_ERR)) { 510 /* 511 * Some devices return D2H FIS when an NCQ error is detected. 512 * Treat this like an SDB error FIS ready reason. 513 */ 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); 516 } else 517 status = SCI_FAILURE; 518 519 sci_controller_release_frame(ihost, frame_index); 520 break; 521 } 522 case SCI_STP_DEV_CMD: 523 case SCI_SMP_DEV_CMD: 524 /* The device does not process any UF received from the hardware while 525 * in this state. All unsolicited frames are forwarded to the io request 526 * object. 527 */ 528 status = sci_io_request_frame_handler(idev->working_request, frame_index); 529 break; 530 } 531 532 return status; 533} 534 535static bool is_remote_device_ready(struct isci_remote_device *idev) 536{ 537 538 struct sci_base_state_machine *sm = &idev->sm; 539 enum sci_remote_device_states state = sm->current_state_id; 540 541 switch (state) { 542 case SCI_DEV_READY: 543 case SCI_STP_DEV_IDLE: 544 case SCI_STP_DEV_CMD: 545 case SCI_STP_DEV_NCQ: 546 case SCI_STP_DEV_NCQ_ERROR: 547 case SCI_STP_DEV_AWAIT_RESET: 548 case SCI_SMP_DEV_IDLE: 549 case SCI_SMP_DEV_CMD: 550 return true; 551 default: 552 return false; 553 } 554} 555 556/* 557 * called once the remote node context has transisitioned to a ready 558 * state (after suspending RX and/or TX due to early D2H fis) 559 */ 560static void atapi_remote_device_resume_done(void *_dev) 561{ 562 struct isci_remote_device *idev = _dev; 563 struct isci_request *ireq = idev->working_request; 564 565 sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); 566} 567 568enum sci_status sci_remote_device_event_handler(struct isci_remote_device *idev, 569 u32 event_code) 570{ 571 enum sci_status status; 572 struct sci_base_state_machine *sm = &idev->sm; 573 enum sci_remote_device_states state = sm->current_state_id; 574 575 switch (scu_get_event_type(event_code)) { 576 case SCU_EVENT_TYPE_RNC_OPS_MISC: 577 case SCU_EVENT_TYPE_RNC_SUSPEND_TX: 578 case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: 579 status = sci_remote_node_context_event_handler(&idev->rnc, event_code); 580 break; 581 case SCU_EVENT_TYPE_PTX_SCHEDULE_EVENT: 582 if (scu_get_event_code(event_code) == SCU_EVENT_IT_NEXUS_TIMEOUT) { 583 status = SCI_SUCCESS; 584 585 /* Suspend the associated RNC */ 586 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_NORMAL); 587 588 dev_dbg(scirdev_to_dev(idev), 589 "%s: device: %p event code: %x: %s\n", 590 __func__, idev, event_code, 591 is_remote_device_ready(idev) 592 ? "I_T_Nexus_Timeout event" 593 : "I_T_Nexus_Timeout event in wrong state"); 594 595 break; 596 } 597 fallthrough; /* and treat as unhandled */ 598 default: 599 dev_dbg(scirdev_to_dev(idev), 600 "%s: device: %p event code: %x: %s\n", 601 __func__, idev, event_code, 602 is_remote_device_ready(idev) 603 ? "unexpected event" 604 : "unexpected event in wrong state"); 605 status = SCI_FAILURE_INVALID_STATE; 606 break; 607 } 608 609 if (status != SCI_SUCCESS) 610 return status; 611 612 /* Decode device-specific states that may require an RNC resume during 613 * normal operation. When the abort path is active, these resumes are 614 * managed when the abort path exits. 615 */ 616 if (state == SCI_STP_DEV_ATAPI_ERROR) { 617 /* For ATAPI error state resume the RNC right away. */ 618 if (scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX || 619 scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX) { 620 return sci_remote_node_context_resume(&idev->rnc, 621 atapi_remote_device_resume_done, 622 idev); 623 } 624 } 625 626 if (state == SCI_STP_DEV_IDLE) { 627 628 /* We pick up suspension events to handle specifically to this 629 * state. We resume the RNC right away. 630 */ 631 if (scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX || 632 scu_get_event_type(event_code) == SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX) 633 status = sci_remote_node_context_resume(&idev->rnc, NULL, NULL); 634 } 635 636 return status; 637} 638 639static void sci_remote_device_start_request(struct isci_remote_device *idev, 640 struct isci_request *ireq, 641 enum sci_status status) 642{ 643 struct isci_port *iport = idev->owning_port; 644 645 /* cleanup requests that failed after starting on the port */ 646 if (status != SCI_SUCCESS) 647 sci_port_complete_io(iport, idev, ireq); 648 else { 649 kref_get(&idev->kref); 650 idev->started_request_count++; 651 } 652} 653 654enum sci_status sci_remote_device_start_io(struct isci_host *ihost, 655 struct isci_remote_device *idev, 656 struct isci_request *ireq) 657{ 658 struct sci_base_state_machine *sm = &idev->sm; 659 enum sci_remote_device_states state = sm->current_state_id; 660 struct isci_port *iport = idev->owning_port; 661 enum sci_status status; 662 663 switch (state) { 664 case SCI_DEV_INITIAL: 665 case SCI_DEV_STOPPED: 666 case SCI_DEV_STARTING: 667 case SCI_STP_DEV_NCQ_ERROR: 668 case SCI_DEV_STOPPING: 669 case SCI_DEV_FAILED: 670 case SCI_DEV_RESETTING: 671 case SCI_DEV_FINAL: 672 default: 673 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 674 __func__, dev_state_name(state)); 675 return SCI_FAILURE_INVALID_STATE; 676 case SCI_DEV_READY: 677 /* attempt to start an io request for this device object. The remote 678 * device object will issue the start request for the io and if 679 * successful it will start the request for the port object then 680 * increment its own request count. 681 */ 682 status = sci_port_start_io(iport, idev, ireq); 683 if (status != SCI_SUCCESS) 684 return status; 685 686 status = sci_remote_node_context_start_io(&idev->rnc, ireq); 687 if (status != SCI_SUCCESS) 688 break; 689 690 status = sci_request_start(ireq); 691 break; 692 case SCI_STP_DEV_IDLE: { 693 /* handle the start io operation for a sata device that is in 694 * the command idle state. - Evalute the type of IO request to 695 * be started - If its an NCQ request change to NCQ substate - 696 * If its any other command change to the CMD substate 697 * 698 * If this is a softreset we may want to have a different 699 * substate. 700 */ 701 enum sci_remote_device_states new_state; 702 struct sas_task *task = isci_request_access_task(ireq); 703 704 status = sci_port_start_io(iport, idev, ireq); 705 if (status != SCI_SUCCESS) 706 return status; 707 708 status = sci_remote_node_context_start_io(&idev->rnc, ireq); 709 if (status != SCI_SUCCESS) 710 break; 711 712 status = sci_request_start(ireq); 713 if (status != SCI_SUCCESS) 714 break; 715 716 if (task->ata_task.use_ncq) 717 new_state = SCI_STP_DEV_NCQ; 718 else { 719 idev->working_request = ireq; 720 new_state = SCI_STP_DEV_CMD; 721 } 722 sci_change_state(sm, new_state); 723 break; 724 } 725 case SCI_STP_DEV_NCQ: { 726 struct sas_task *task = isci_request_access_task(ireq); 727 728 if (task->ata_task.use_ncq) { 729 status = sci_port_start_io(iport, idev, ireq); 730 if (status != SCI_SUCCESS) 731 return status; 732 733 status = sci_remote_node_context_start_io(&idev->rnc, ireq); 734 if (status != SCI_SUCCESS) 735 break; 736 737 status = sci_request_start(ireq); 738 } else 739 return SCI_FAILURE_INVALID_STATE; 740 break; 741 } 742 case SCI_STP_DEV_AWAIT_RESET: 743 return SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED; 744 case SCI_SMP_DEV_IDLE: 745 status = sci_port_start_io(iport, idev, ireq); 746 if (status != SCI_SUCCESS) 747 return status; 748 749 status = sci_remote_node_context_start_io(&idev->rnc, ireq); 750 if (status != SCI_SUCCESS) 751 break; 752 753 status = sci_request_start(ireq); 754 if (status != SCI_SUCCESS) 755 break; 756 757 idev->working_request = ireq; 758 sci_change_state(&idev->sm, SCI_SMP_DEV_CMD); 759 break; 760 case SCI_STP_DEV_CMD: 761 case SCI_SMP_DEV_CMD: 762 /* device is already handling a command it can not accept new commands 763 * until this one is complete. 764 */ 765 return SCI_FAILURE_INVALID_STATE; 766 } 767 768 sci_remote_device_start_request(idev, ireq, status); 769 return status; 770} 771 772static enum sci_status common_complete_io(struct isci_port *iport, 773 struct isci_remote_device *idev, 774 struct isci_request *ireq) 775{ 776 enum sci_status status; 777 778 status = sci_request_complete(ireq); 779 if (status != SCI_SUCCESS) 780 return status; 781 782 status = sci_port_complete_io(iport, idev, ireq); 783 if (status != SCI_SUCCESS) 784 return status; 785 786 sci_remote_device_decrement_request_count(idev); 787 return status; 788} 789 790enum sci_status sci_remote_device_complete_io(struct isci_host *ihost, 791 struct isci_remote_device *idev, 792 struct isci_request *ireq) 793{ 794 struct sci_base_state_machine *sm = &idev->sm; 795 enum sci_remote_device_states state = sm->current_state_id; 796 struct isci_port *iport = idev->owning_port; 797 enum sci_status status; 798 799 switch (state) { 800 case SCI_DEV_INITIAL: 801 case SCI_DEV_STOPPED: 802 case SCI_DEV_STARTING: 803 case SCI_STP_DEV_IDLE: 804 case SCI_SMP_DEV_IDLE: 805 case SCI_DEV_FAILED: 806 case SCI_DEV_FINAL: 807 default: 808 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 809 __func__, dev_state_name(state)); 810 return SCI_FAILURE_INVALID_STATE; 811 case SCI_DEV_READY: 812 case SCI_STP_DEV_AWAIT_RESET: 813 case SCI_DEV_RESETTING: 814 status = common_complete_io(iport, idev, ireq); 815 break; 816 case SCI_STP_DEV_CMD: 817 case SCI_STP_DEV_NCQ: 818 case SCI_STP_DEV_NCQ_ERROR: 819 case SCI_STP_DEV_ATAPI_ERROR: 820 status = common_complete_io(iport, idev, ireq); 821 if (status != SCI_SUCCESS) 822 break; 823 824 if (ireq->sci_status == SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED) { 825 /* This request causes hardware error, device needs to be Lun Reset. 826 * So here we force the state machine to IDLE state so the rest IOs 827 * can reach RNC state handler, these IOs will be completed by RNC with 828 * status of "DEVICE_RESET_REQUIRED", instead of "INVALID STATE". 829 */ 830 sci_change_state(sm, SCI_STP_DEV_AWAIT_RESET); 831 } else if (idev->started_request_count == 0) 832 sci_change_state(sm, SCI_STP_DEV_IDLE); 833 break; 834 case SCI_SMP_DEV_CMD: 835 status = common_complete_io(iport, idev, ireq); 836 if (status != SCI_SUCCESS) 837 break; 838 sci_change_state(sm, SCI_SMP_DEV_IDLE); 839 break; 840 case SCI_DEV_STOPPING: 841 status = common_complete_io(iport, idev, ireq); 842 if (status != SCI_SUCCESS) 843 break; 844 845 if (idev->started_request_count == 0) 846 sci_remote_node_context_destruct(&idev->rnc, 847 rnc_destruct_done, 848 idev); 849 break; 850 } 851 852 if (status != SCI_SUCCESS) 853 dev_err(scirdev_to_dev(idev), 854 "%s: Port:0x%p Device:0x%p Request:0x%p Status:0x%x " 855 "could not complete\n", __func__, iport, 856 idev, ireq, status); 857 else 858 isci_put_device(idev); 859 860 return status; 861} 862 863static void sci_remote_device_continue_request(void *dev) 864{ 865 struct isci_remote_device *idev = dev; 866 867 /* we need to check if this request is still valid to continue. */ 868 if (idev->working_request) 869 sci_controller_continue_io(idev->working_request); 870} 871 872enum sci_status sci_remote_device_start_task(struct isci_host *ihost, 873 struct isci_remote_device *idev, 874 struct isci_request *ireq) 875{ 876 struct sci_base_state_machine *sm = &idev->sm; 877 enum sci_remote_device_states state = sm->current_state_id; 878 struct isci_port *iport = idev->owning_port; 879 enum sci_status status; 880 881 switch (state) { 882 case SCI_DEV_INITIAL: 883 case SCI_DEV_STOPPED: 884 case SCI_DEV_STARTING: 885 case SCI_SMP_DEV_IDLE: 886 case SCI_SMP_DEV_CMD: 887 case SCI_DEV_STOPPING: 888 case SCI_DEV_FAILED: 889 case SCI_DEV_RESETTING: 890 case SCI_DEV_FINAL: 891 default: 892 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 893 __func__, dev_state_name(state)); 894 return SCI_FAILURE_INVALID_STATE; 895 case SCI_STP_DEV_IDLE: 896 case SCI_STP_DEV_CMD: 897 case SCI_STP_DEV_NCQ: 898 case SCI_STP_DEV_NCQ_ERROR: 899 case SCI_STP_DEV_AWAIT_RESET: 900 status = sci_port_start_io(iport, idev, ireq); 901 if (status != SCI_SUCCESS) 902 return status; 903 904 status = sci_request_start(ireq); 905 if (status != SCI_SUCCESS) 906 goto out; 907 908 /* Note: If the remote device state is not IDLE this will 909 * replace the request that probably resulted in the task 910 * management request. 911 */ 912 idev->working_request = ireq; 913 sci_change_state(sm, SCI_STP_DEV_CMD); 914 915 /* The remote node context must cleanup the TCi to NCQ mapping 916 * table. The only way to do this correctly is to either write 917 * to the TLCR register or to invalidate and repost the RNC. In 918 * either case the remote node context state machine will take 919 * the correct action when the remote node context is suspended 920 * and later resumed. 921 */ 922 sci_remote_device_suspend(idev, 923 SCI_SW_SUSPEND_LINKHANG_DETECT); 924 925 status = sci_remote_node_context_start_task(&idev->rnc, ireq, 926 sci_remote_device_continue_request, idev); 927 928 out: 929 sci_remote_device_start_request(idev, ireq, status); 930 /* We need to let the controller start request handler know that 931 * it can't post TC yet. We will provide a callback function to 932 * post TC when RNC gets resumed. 933 */ 934 return SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS; 935 case SCI_DEV_READY: 936 status = sci_port_start_io(iport, idev, ireq); 937 if (status != SCI_SUCCESS) 938 return status; 939 940 /* Resume the RNC as needed: */ 941 status = sci_remote_node_context_start_task(&idev->rnc, ireq, 942 NULL, NULL); 943 if (status != SCI_SUCCESS) 944 break; 945 946 status = sci_request_start(ireq); 947 break; 948 } 949 sci_remote_device_start_request(idev, ireq, status); 950 951 return status; 952} 953 954void sci_remote_device_post_request(struct isci_remote_device *idev, u32 request) 955{ 956 struct isci_port *iport = idev->owning_port; 957 u32 context; 958 959 context = request | 960 (ISCI_PEG << SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT) | 961 (iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT) | 962 idev->rnc.remote_node_index; 963 964 sci_controller_post_request(iport->owning_controller, context); 965} 966 967/* called once the remote node context has transisitioned to a 968 * ready state. This is the indication that the remote device object can also 969 * transition to ready. 970 */ 971static void remote_device_resume_done(void *_dev) 972{ 973 struct isci_remote_device *idev = _dev; 974 975 if (is_remote_device_ready(idev)) 976 return; 977 978 /* go 'ready' if we are not already in a ready state */ 979 sci_change_state(&idev->sm, SCI_DEV_READY); 980} 981 982static void sci_stp_remote_device_ready_idle_substate_resume_complete_handler(void *_dev) 983{ 984 struct isci_remote_device *idev = _dev; 985 struct isci_host *ihost = idev->owning_port->owning_controller; 986 987 /* For NCQ operation we do not issue a isci_remote_device_not_ready(). 988 * As a result, avoid sending the ready notification. 989 */ 990 if (idev->sm.previous_state_id != SCI_STP_DEV_NCQ) 991 isci_remote_device_ready(ihost, idev); 992} 993 994static void sci_remote_device_initial_state_enter(struct sci_base_state_machine *sm) 995{ 996 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 997 998 /* Initial state is a transitional state to the stopped state */ 999 sci_change_state(&idev->sm, SCI_DEV_STOPPED); 1000} 1001 1002/** 1003 * sci_remote_device_destruct() - free remote node context and destruct 1004 * @idev: This parameter specifies the remote device to be destructed. 1005 * 1006 * Remote device objects are a limited resource. As such, they must be 1007 * protected. Thus calls to construct and destruct are mutually exclusive and 1008 * non-reentrant. The return value shall indicate if the device was 1009 * successfully destructed or if some failure occurred. enum sci_status This value 1010 * is returned if the device is successfully destructed. 1011 * SCI_FAILURE_INVALID_REMOTE_DEVICE This value is returned if the supplied 1012 * device isn't valid (e.g. it's already been destoryed, the handle isn't 1013 * valid, etc.). 1014 */ 1015static enum sci_status sci_remote_device_destruct(struct isci_remote_device *idev) 1016{ 1017 struct sci_base_state_machine *sm = &idev->sm; 1018 enum sci_remote_device_states state = sm->current_state_id; 1019 struct isci_host *ihost; 1020 1021 if (state != SCI_DEV_STOPPED) { 1022 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 1023 __func__, dev_state_name(state)); 1024 return SCI_FAILURE_INVALID_STATE; 1025 } 1026 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; 1031 sci_change_state(sm, SCI_DEV_FINAL); 1032 1033 return SCI_SUCCESS; 1034} 1035 1036/** 1037 * isci_remote_device_deconstruct() - This function frees an isci_remote_device. 1038 * @ihost: This parameter specifies the isci host object. 1039 * @idev: This parameter specifies the remote device to be freed. 1040 * 1041 */ 1042static void isci_remote_device_deconstruct(struct isci_host *ihost, struct isci_remote_device *idev) 1043{ 1044 dev_dbg(&ihost->pdev->dev, 1045 "%s: isci_device = %p\n", __func__, idev); 1046 1047 /* There should not be any outstanding io's. All paths to 1048 * here should go through isci_remote_device_nuke_requests. 1049 * If we hit this condition, we will need a way to complete 1050 * io requests in process */ 1051 BUG_ON(idev->started_request_count > 0); 1052 1053 sci_remote_device_destruct(idev); 1054 list_del_init(&idev->node); 1055 isci_put_device(idev); 1056} 1057 1058static void sci_remote_device_stopped_state_enter(struct sci_base_state_machine *sm) 1059{ 1060 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1061 struct isci_host *ihost = idev->owning_port->owning_controller; 1062 u32 prev_state; 1063 1064 /* If we are entering from the stopping state let the SCI User know that 1065 * the stop operation has completed. 1066 */ 1067 prev_state = idev->sm.previous_state_id; 1068 if (prev_state == SCI_DEV_STOPPING) 1069 isci_remote_device_deconstruct(ihost, idev); 1070 1071 sci_controller_remote_device_stopped(ihost, idev); 1072} 1073 1074static void sci_remote_device_starting_state_enter(struct sci_base_state_machine *sm) 1075{ 1076 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1077 struct isci_host *ihost = idev->owning_port->owning_controller; 1078 1079 isci_remote_device_not_ready(ihost, idev, 1080 SCIC_REMOTE_DEVICE_NOT_READY_START_REQUESTED); 1081} 1082 1083static void sci_remote_device_ready_state_enter(struct sci_base_state_machine *sm) 1084{ 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; 1088 1089 if (dev->dev_type == SAS_SATA_DEV || (dev->tproto & SAS_PROTOCOL_SATA)) { 1090 sci_change_state(&idev->sm, SCI_STP_DEV_IDLE); 1091 } else if (dev_is_expander(dev->dev_type)) { 1092 sci_change_state(&idev->sm, SCI_SMP_DEV_IDLE); 1093 } else 1094 isci_remote_device_ready(ihost, idev); 1095} 1096 1097static void sci_remote_device_ready_state_exit(struct sci_base_state_machine *sm) 1098{ 1099 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1100 struct domain_device *dev = idev->domain_dev; 1101 1102 if (dev->dev_type == SAS_END_DEVICE) { 1103 struct isci_host *ihost = idev->owning_port->owning_controller; 1104 1105 isci_remote_device_not_ready(ihost, idev, 1106 SCIC_REMOTE_DEVICE_NOT_READY_STOP_REQUESTED); 1107 } 1108} 1109 1110static void sci_remote_device_resetting_state_enter(struct sci_base_state_machine *sm) 1111{ 1112 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1113 struct isci_host *ihost = idev->owning_port->owning_controller; 1114 1115 dev_dbg(&ihost->pdev->dev, 1116 "%s: isci_device = %p\n", __func__, idev); 1117 1118 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_LINKHANG_DETECT); 1119} 1120 1121static void sci_remote_device_resetting_state_exit(struct sci_base_state_machine *sm) 1122{ 1123 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1124 struct isci_host *ihost = idev->owning_port->owning_controller; 1125 1126 dev_dbg(&ihost->pdev->dev, 1127 "%s: isci_device = %p\n", __func__, idev); 1128 1129 sci_remote_node_context_resume(&idev->rnc, NULL, NULL); 1130} 1131 1132static void sci_stp_remote_device_ready_idle_substate_enter(struct sci_base_state_machine *sm) 1133{ 1134 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1135 1136 idev->working_request = NULL; 1137 if (sci_remote_node_context_is_ready(&idev->rnc)) { 1138 /* 1139 * Since the RNC is ready, it's alright to finish completion 1140 * processing (e.g. signal the remote device is ready). */ 1141 sci_stp_remote_device_ready_idle_substate_resume_complete_handler(idev); 1142 } else { 1143 sci_remote_node_context_resume(&idev->rnc, 1144 sci_stp_remote_device_ready_idle_substate_resume_complete_handler, 1145 idev); 1146 } 1147} 1148 1149static void sci_stp_remote_device_ready_cmd_substate_enter(struct sci_base_state_machine *sm) 1150{ 1151 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1152 struct isci_host *ihost = idev->owning_port->owning_controller; 1153 1154 BUG_ON(idev->working_request == NULL); 1155 1156 isci_remote_device_not_ready(ihost, idev, 1157 SCIC_REMOTE_DEVICE_NOT_READY_SATA_REQUEST_STARTED); 1158} 1159 1160static void sci_stp_remote_device_ready_ncq_error_substate_enter(struct sci_base_state_machine *sm) 1161{ 1162 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1163 struct isci_host *ihost = idev->owning_port->owning_controller; 1164 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); 1168} 1169 1170static void sci_smp_remote_device_ready_idle_substate_enter(struct sci_base_state_machine *sm) 1171{ 1172 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1173 struct isci_host *ihost = idev->owning_port->owning_controller; 1174 1175 isci_remote_device_ready(ihost, idev); 1176} 1177 1178static void sci_smp_remote_device_ready_cmd_substate_enter(struct sci_base_state_machine *sm) 1179{ 1180 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1181 struct isci_host *ihost = idev->owning_port->owning_controller; 1182 1183 BUG_ON(idev->working_request == NULL); 1184 1185 isci_remote_device_not_ready(ihost, idev, 1186 SCIC_REMOTE_DEVICE_NOT_READY_SMP_REQUEST_STARTED); 1187} 1188 1189static void sci_smp_remote_device_ready_cmd_substate_exit(struct sci_base_state_machine *sm) 1190{ 1191 struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); 1192 1193 idev->working_request = NULL; 1194} 1195 1196static const struct sci_base_state sci_remote_device_state_table[] = { 1197 [SCI_DEV_INITIAL] = { 1198 .enter_state = sci_remote_device_initial_state_enter, 1199 }, 1200 [SCI_DEV_STOPPED] = { 1201 .enter_state = sci_remote_device_stopped_state_enter, 1202 }, 1203 [SCI_DEV_STARTING] = { 1204 .enter_state = sci_remote_device_starting_state_enter, 1205 }, 1206 [SCI_DEV_READY] = { 1207 .enter_state = sci_remote_device_ready_state_enter, 1208 .exit_state = sci_remote_device_ready_state_exit 1209 }, 1210 [SCI_STP_DEV_IDLE] = { 1211 .enter_state = sci_stp_remote_device_ready_idle_substate_enter, 1212 }, 1213 [SCI_STP_DEV_CMD] = { 1214 .enter_state = sci_stp_remote_device_ready_cmd_substate_enter, 1215 }, 1216 [SCI_STP_DEV_NCQ] = { }, 1217 [SCI_STP_DEV_NCQ_ERROR] = { 1218 .enter_state = sci_stp_remote_device_ready_ncq_error_substate_enter, 1219 }, 1220 [SCI_STP_DEV_ATAPI_ERROR] = { }, 1221 [SCI_STP_DEV_AWAIT_RESET] = { }, 1222 [SCI_SMP_DEV_IDLE] = { 1223 .enter_state = sci_smp_remote_device_ready_idle_substate_enter, 1224 }, 1225 [SCI_SMP_DEV_CMD] = { 1226 .enter_state = sci_smp_remote_device_ready_cmd_substate_enter, 1227 .exit_state = sci_smp_remote_device_ready_cmd_substate_exit, 1228 }, 1229 [SCI_DEV_STOPPING] = { }, 1230 [SCI_DEV_FAILED] = { }, 1231 [SCI_DEV_RESETTING] = { 1232 .enter_state = sci_remote_device_resetting_state_enter, 1233 .exit_state = sci_remote_device_resetting_state_exit 1234 }, 1235 [SCI_DEV_FINAL] = { }, 1236}; 1237 1238/** 1239 * sci_remote_device_construct() - common construction 1240 * @iport: SAS/SATA port through which this device is accessed. 1241 * @idev: remote device to construct 1242 * 1243 * This routine just performs benign initialization and does not 1244 * allocate the remote_node_context which is left to 1245 * sci_remote_device_[de]a_construct(). sci_remote_device_destruct() 1246 * frees the remote_node_context(s) for the device. 1247 */ 1248static void sci_remote_device_construct(struct isci_port *iport, 1249 struct isci_remote_device *idev) 1250{ 1251 idev->owning_port = iport; 1252 idev->started_request_count = 0; 1253 1254 sci_init_sm(&idev->sm, sci_remote_device_state_table, SCI_DEV_INITIAL); 1255 1256 sci_remote_node_context_construct(&idev->rnc, 1257 SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX); 1258} 1259 1260/* 1261 * sci_remote_device_da_construct() - construct direct attached device. 1262 * 1263 * The information (e.g. IAF, Signature FIS, etc.) necessary to build 1264 * the device is known to the SCI Core since it is contained in the 1265 * sci_phy object. Remote node context(s) is/are a global resource 1266 * allocated by this routine, freed by sci_remote_device_destruct(). 1267 * 1268 * Returns: 1269 * SCI_FAILURE_DEVICE_EXISTS - device has already been constructed. 1270 * SCI_FAILURE_UNSUPPORTED_PROTOCOL - e.g. sas device attached to 1271 * sata-only controller instance. 1272 * SCI_FAILURE_INSUFFICIENT_RESOURCES - remote node contexts exhausted. 1273 */ 1274static enum sci_status sci_remote_device_da_construct(struct isci_port *iport, 1275 struct isci_remote_device *idev) 1276{ 1277 enum sci_status status; 1278 struct sci_port_properties properties; 1279 1280 sci_remote_device_construct(iport, idev); 1281 1282 sci_port_get_properties(iport, &properties); 1283 /* Get accurate port width from port's phy mask for a DA device. */ 1284 idev->device_port_width = hweight32(properties.phy_mask); 1285 1286 status = sci_controller_allocate_remote_node_context(iport->owning_controller, 1287 idev, 1288 &idev->rnc.remote_node_index); 1289 1290 if (status != SCI_SUCCESS) 1291 return status; 1292 1293 idev->connection_rate = sci_port_get_max_allowed_speed(iport); 1294 1295 return SCI_SUCCESS; 1296} 1297 1298/* 1299 * sci_remote_device_ea_construct() - construct expander attached device 1300 * 1301 * Remote node context(s) is/are a global resource allocated by this 1302 * routine, freed by sci_remote_device_destruct(). 1303 * 1304 * Returns: 1305 * SCI_FAILURE_DEVICE_EXISTS - device has already been constructed. 1306 * SCI_FAILURE_UNSUPPORTED_PROTOCOL - e.g. sas device attached to 1307 * sata-only controller instance. 1308 * SCI_FAILURE_INSUFFICIENT_RESOURCES - remote node contexts exhausted. 1309 */ 1310static enum sci_status sci_remote_device_ea_construct(struct isci_port *iport, 1311 struct isci_remote_device *idev) 1312{ 1313 struct domain_device *dev = idev->domain_dev; 1314 enum sci_status status; 1315 1316 sci_remote_device_construct(iport, idev); 1317 1318 status = sci_controller_allocate_remote_node_context(iport->owning_controller, 1319 idev, 1320 &idev->rnc.remote_node_index); 1321 if (status != SCI_SUCCESS) 1322 return status; 1323 1324 /* For SAS-2 the physical link rate is actually a logical link 1325 * rate that incorporates multiplexing. The SCU doesn't 1326 * incorporate multiplexing and for the purposes of the 1327 * connection the logical link rate is that same as the 1328 * physical. Furthermore, the SAS-2 and SAS-1.1 fields overlay 1329 * one another, so this code works for both situations. 1330 */ 1331 idev->connection_rate = min_t(u16, sci_port_get_max_allowed_speed(iport), 1332 dev->linkrate); 1333 1334 /* / @todo Should I assign the port width by reading all of the phys on the port? */ 1335 idev->device_port_width = 1; 1336 1337 return SCI_SUCCESS; 1338} 1339 1340enum sci_status sci_remote_device_resume( 1341 struct isci_remote_device *idev, 1342 scics_sds_remote_node_context_callback cb_fn, 1343 void *cb_p) 1344{ 1345 enum sci_status status; 1346 1347 status = sci_remote_node_context_resume(&idev->rnc, cb_fn, cb_p); 1348 if (status != SCI_SUCCESS) 1349 dev_dbg(scirdev_to_dev(idev), "%s: failed to resume: %d\n", 1350 __func__, status); 1351 return status; 1352} 1353 1354static void isci_remote_device_resume_from_abort_complete(void *cbparam) 1355{ 1356 struct isci_remote_device *idev = cbparam; 1357 struct isci_host *ihost = idev->owning_port->owning_controller; 1358 scics_sds_remote_node_context_callback abort_resume_cb = 1359 idev->abort_resume_cb; 1360 1361 dev_dbg(scirdev_to_dev(idev), "%s: passing-along resume: %p\n", 1362 __func__, abort_resume_cb); 1363 1364 if (abort_resume_cb != NULL) { 1365 idev->abort_resume_cb = NULL; 1366 abort_resume_cb(idev->abort_resume_cbparam); 1367 } 1368 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags); 1369 wake_up(&ihost->eventq); 1370} 1371 1372static bool isci_remote_device_test_resume_done( 1373 struct isci_host *ihost, 1374 struct isci_remote_device *idev) 1375{ 1376 unsigned long flags; 1377 bool done; 1378 1379 spin_lock_irqsave(&ihost->scic_lock, flags); 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); 1383 spin_unlock_irqrestore(&ihost->scic_lock, flags); 1384 1385 return done; 1386} 1387 1388static void isci_remote_device_wait_for_resume_from_abort( 1389 struct isci_host *ihost, 1390 struct isci_remote_device *idev) 1391{ 1392 dev_dbg(&ihost->pdev->dev, "%s: starting resume wait: %p\n", 1393 __func__, idev); 1394 1395 #define MAX_RESUME_MSECS 10000 1396 if (!wait_event_timeout(ihost->eventq, 1397 isci_remote_device_test_resume_done(ihost, idev), 1398 msecs_to_jiffies(MAX_RESUME_MSECS))) { 1399 1400 dev_warn(&ihost->pdev->dev, "%s: #### Timeout waiting for " 1401 "resume: %p\n", __func__, idev); 1402 } 1403 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags); 1404 1405 dev_dbg(&ihost->pdev->dev, "%s: resume wait done: %p\n", 1406 __func__, idev); 1407} 1408 1409enum sci_status isci_remote_device_resume_from_abort( 1410 struct isci_host *ihost, 1411 struct isci_remote_device *idev) 1412{ 1413 unsigned long flags; 1414 enum sci_status status = SCI_SUCCESS; 1415 int destroyed; 1416 1417 spin_lock_irqsave(&ihost->scic_lock, flags); 1418 /* Preserve any current resume callbacks, for instance from other 1419 * resumptions. 1420 */ 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); 1426 if (!destroyed) 1427 status = sci_remote_device_resume( 1428 idev, isci_remote_device_resume_from_abort_complete, 1429 idev); 1430 spin_unlock_irqrestore(&ihost->scic_lock, flags); 1431 if (!destroyed && (status == SCI_SUCCESS)) 1432 isci_remote_device_wait_for_resume_from_abort(ihost, idev); 1433 else 1434 clear_bit(IDEV_ABORT_PATH_RESUME_PENDING, &idev->flags); 1435 1436 return status; 1437} 1438 1439/** 1440 * sci_remote_device_start() - This method will start the supplied remote 1441 * device. This method enables normal IO requests to flow through to the 1442 * remote device. 1443 * @idev: This parameter specifies the device to be started. 1444 * @timeout: This parameter specifies the number of milliseconds in which the 1445 * start operation should complete. 1446 * 1447 * An indication of whether the device was successfully started. SCI_SUCCESS 1448 * This value is returned if the device was successfully started. 1449 * SCI_FAILURE_INVALID_PHY This value is returned if the user attempts to start 1450 * the device when there have been no phys added to it. 1451 */ 1452static enum sci_status sci_remote_device_start(struct isci_remote_device *idev, 1453 u32 timeout) 1454{ 1455 struct sci_base_state_machine *sm = &idev->sm; 1456 enum sci_remote_device_states state = sm->current_state_id; 1457 enum sci_status status; 1458 1459 if (state != SCI_DEV_STOPPED) { 1460 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n", 1461 __func__, dev_state_name(state)); 1462 return SCI_FAILURE_INVALID_STATE; 1463 } 1464 1465 status = sci_remote_device_resume(idev, remote_device_resume_done, 1466 idev); 1467 if (status != SCI_SUCCESS) 1468 return status; 1469 1470 sci_change_state(sm, SCI_DEV_STARTING); 1471 1472 return SCI_SUCCESS; 1473} 1474 1475static enum sci_status isci_remote_device_construct(struct isci_port *iport, 1476 struct isci_remote_device *idev) 1477{ 1478 struct isci_host *ihost = iport->isci_host; 1479 struct domain_device *dev = idev->domain_dev; 1480 enum sci_status status; 1481 1482 if (dev->parent && dev_is_expander(dev->parent->dev_type)) 1483 status = sci_remote_device_ea_construct(iport, idev); 1484 else 1485 status = sci_remote_device_da_construct(iport, idev); 1486 1487 if (status != SCI_SUCCESS) { 1488 dev_dbg(&ihost->pdev->dev, "%s: construct failed: %d\n", 1489 __func__, status); 1490 1491 return status; 1492 } 1493 1494 /* start the device. */ 1495 status = sci_remote_device_start(idev, ISCI_REMOTE_DEVICE_START_TIMEOUT); 1496 1497 if (status != SCI_SUCCESS) 1498 dev_warn(&ihost->pdev->dev, "remote device start failed: %d\n", 1499 status); 1500 1501 return status; 1502} 1503 1504/** 1505 * isci_remote_device_alloc() 1506 * This function builds the isci_remote_device when a libsas dev_found message 1507 * is received. 1508 * @ihost: This parameter specifies the isci host object. 1509 * @iport: This parameter specifies the isci_port connected to this device. 1510 * 1511 * pointer to new isci_remote_device. 1512 */ 1513static struct isci_remote_device * 1514isci_remote_device_alloc(struct isci_host *ihost, struct isci_port *iport) 1515{ 1516 struct isci_remote_device *idev; 1517 int i; 1518 1519 for (i = 0; i < SCI_MAX_REMOTE_DEVICES; i++) { 1520 idev = &ihost->devices[i]; 1521 if (!test_and_set_bit(IDEV_ALLOCATED, &idev->flags)) 1522 break; 1523 } 1524 1525 if (i >= SCI_MAX_REMOTE_DEVICES) { 1526 dev_warn(&ihost->pdev->dev, "%s: failed\n", __func__); 1527 return NULL; 1528 } 1529 if (WARN_ONCE(!list_empty(&idev->node), "found non-idle remote device\n")) 1530 return NULL; 1531 1532 return idev; 1533} 1534 1535void isci_remote_device_release(struct kref *kref) 1536{ 1537 struct isci_remote_device *idev = container_of(kref, typeof(*idev), kref); 1538 struct isci_host *ihost = idev->isci_port->isci_host; 1539 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); 1546 smp_mb__before_atomic(); 1547 clear_bit(IDEV_ALLOCATED, &idev->flags); 1548 wake_up(&ihost->eventq); 1549} 1550 1551/** 1552 * isci_remote_device_stop() - This function is called internally to stop the 1553 * remote device. 1554 * @ihost: This parameter specifies the isci host object. 1555 * @idev: This parameter specifies the remote device. 1556 * 1557 * The status of the ihost request to stop. 1558 */ 1559enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_remote_device *idev) 1560{ 1561 enum sci_status status; 1562 unsigned long flags; 1563 1564 dev_dbg(&ihost->pdev->dev, 1565 "%s: isci_device = %p\n", __func__, idev); 1566 1567 spin_lock_irqsave(&ihost->scic_lock, flags); 1568 idev->domain_dev->lldd_dev = NULL; /* disable new lookups */ 1569 set_bit(IDEV_GONE, &idev->flags); 1570 1571 set_bit(IDEV_STOP_PENDING, &idev->flags); 1572 status = sci_remote_device_stop(idev, 50); 1573 spin_unlock_irqrestore(&ihost->scic_lock, flags); 1574 1575 /* Wait for the stop complete callback. */ 1576 if (WARN_ONCE(status != SCI_SUCCESS, "failed to stop device\n")) 1577 /* nothing to wait for */; 1578 else 1579 wait_for_device_stop(ihost, idev); 1580 1581 dev_dbg(&ihost->pdev->dev, 1582 "%s: isci_device = %p, waiting done.\n", __func__, idev); 1583 1584 return status; 1585} 1586 1587/** 1588 * isci_remote_device_gone() - This function is called by libsas when a domain 1589 * device is removed. 1590 * @dev: This parameter specifies the libsas domain device. 1591 */ 1592void isci_remote_device_gone(struct domain_device *dev) 1593{ 1594 struct isci_host *ihost = dev_to_ihost(dev); 1595 struct isci_remote_device *idev = dev->lldd_dev; 1596 1597 dev_dbg(&ihost->pdev->dev, 1598 "%s: domain_device = %p, isci_device = %p, isci_port = %p\n", 1599 __func__, dev, idev, idev->isci_port); 1600 1601 isci_remote_device_stop(ihost, idev); 1602} 1603 1604 1605/** 1606 * isci_remote_device_found() - This function is called by libsas when a remote 1607 * device is discovered. A remote device object is created and started. the 1608 * function then sleeps until the sci core device started message is 1609 * received. 1610 * @dev: This parameter specifies the libsas domain device. 1611 * 1612 * status, zero indicates success. 1613 */ 1614int isci_remote_device_found(struct domain_device *dev) 1615{ 1616 struct isci_host *isci_host = dev_to_ihost(dev); 1617 struct isci_port *isci_port = dev->port->lldd_port; 1618 struct isci_remote_device *isci_device; 1619 enum sci_status status; 1620 1621 dev_dbg(&isci_host->pdev->dev, 1622 "%s: domain_device = %p\n", __func__, dev); 1623 1624 if (!isci_port) 1625 return -ENODEV; 1626 1627 isci_device = isci_remote_device_alloc(isci_host, isci_port); 1628 if (!isci_device) 1629 return -ENODEV; 1630 1631 kref_init(&isci_device->kref); 1632 INIT_LIST_HEAD(&isci_device->node); 1633 1634 spin_lock_irq(&isci_host->scic_lock); 1635 isci_device->domain_dev = dev; 1636 isci_device->isci_port = isci_port; 1637 list_add_tail(&isci_device->node, &isci_port->remote_dev_list); 1638 1639 set_bit(IDEV_START_PENDING, &isci_device->flags); 1640 status = isci_remote_device_construct(isci_port, isci_device); 1641 1642 dev_dbg(&isci_host->pdev->dev, 1643 "%s: isci_device = %p\n", 1644 __func__, isci_device); 1645 1646 if (status == SCI_SUCCESS) { 1647 /* device came up, advertise it to the world */ 1648 dev->lldd_dev = isci_device; 1649 } else 1650 isci_put_device(isci_device); 1651 spin_unlock_irq(&isci_host->scic_lock); 1652 1653 /* wait for the device ready callback. */ 1654 wait_for_device_start(isci_host, isci_device); 1655 1656 return status == SCI_SUCCESS ? 0 : -ENODEV; 1657} 1658 1659enum sci_status isci_remote_device_suspend_terminate( 1660 struct isci_host *ihost, 1661 struct isci_remote_device *idev, 1662 struct isci_request *ireq) 1663{ 1664 unsigned long flags; 1665 enum sci_status status; 1666 1667 /* Put the device into suspension. */ 1668 spin_lock_irqsave(&ihost->scic_lock, flags); 1669 set_bit(IDEV_ABORT_PATH_ACTIVE, &idev->flags); 1670 sci_remote_device_suspend(idev, SCI_SW_SUSPEND_LINKHANG_DETECT); 1671 spin_unlock_irqrestore(&ihost->scic_lock, flags); 1672 1673 /* Terminate and wait for the completions. */ 1674 status = isci_remote_device_terminate_requests(ihost, idev, ireq); 1675 if (status != SCI_SUCCESS) 1676 dev_dbg(&ihost->pdev->dev, 1677 "%s: isci_remote_device_terminate_requests(%p) " 1678 "returned %d!\n", 1679 __func__, idev, status); 1680 1681 /* NOTE: RNC resumption is left to the caller! */ 1682 return status; 1683} 1684 1685int isci_remote_device_is_safe_to_abort( 1686 struct isci_remote_device *idev) 1687{ 1688 return sci_remote_node_context_is_safe_to_abort(&idev->rnc); 1689} 1690 1691enum sci_status sci_remote_device_abort_requests_pending_abort( 1692 struct isci_remote_device *idev) 1693{ 1694 return sci_remote_device_terminate_reqs_checkabort(idev, 1); 1695} 1696 1697enum sci_status isci_remote_device_reset_complete( 1698 struct isci_host *ihost, 1699 struct isci_remote_device *idev) 1700{ 1701 unsigned long flags; 1702 enum sci_status status; 1703 1704 spin_lock_irqsave(&ihost->scic_lock, flags); 1705 status = sci_remote_device_reset_complete(idev); 1706 spin_unlock_irqrestore(&ihost->scic_lock, flags); 1707 1708 return status; 1709} 1710 1711void isci_dev_set_hang_detection_timeout( 1712 struct isci_remote_device *idev, 1713 u32 timeout) 1714{ 1715 if (dev_is_sata(idev->domain_dev)) { 1716 if (timeout) { 1717 if (test_and_set_bit(IDEV_RNC_LLHANG_ENABLED, 1718 &idev->flags)) 1719 return; /* Already enabled. */ 1720 } else if (!test_and_clear_bit(IDEV_RNC_LLHANG_ENABLED, 1721 &idev->flags)) 1722 return; /* Not enabled. */ 1723 1724 sci_port_set_hang_detection_timeout(idev->owning_port, 1725 timeout); 1726 } 1727}