diff options
author | Dan Williams <dan.j.williams@intel.com> | 2011-05-12 10:46:59 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2011-07-03 07:04:49 -0400 |
commit | 338e386d12c2440e39c987d35fda403d319a79a0 (patch) | |
tree | 912dec715b326319ed2631aa7dacad4e05d4a641 | |
parent | 6813820c7b892e1a5c2306808a5ccc8a27b7946d (diff) |
isci: unify rnc event handlers
Unify rnc event handlers and delete the state handler.
Reported-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | drivers/scsi/isci/remote_node_context.c | 365 | ||||
-rw-r--r-- | drivers/scsi/isci/remote_node_context.h | 16 |
2 files changed, 111 insertions, 270 deletions
diff --git a/drivers/scsi/isci/remote_node_context.c b/drivers/scsi/isci/remote_node_context.c index aef258b959f8..9f2407f0f5a6 100644 --- a/drivers/scsi/isci/remote_node_context.c +++ b/drivers/scsi/isci/remote_node_context.c | |||
@@ -299,21 +299,6 @@ static enum sci_status scic_sds_remote_node_context_default_start_task_handler( | |||
299 | return SCI_FAILURE; | 299 | return SCI_FAILURE; |
300 | } | 300 | } |
301 | 301 | ||
302 | static enum sci_status scic_sds_remote_node_context_default_event_handler( | ||
303 | struct scic_sds_remote_node_context *sci_rnc, | ||
304 | u32 event_code) | ||
305 | { | ||
306 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
307 | "%s: SCIC Remote Node Context 0x%p requested to process " | ||
308 | "event 0x%x while in wrong state %d\n", | ||
309 | __func__, | ||
310 | sci_rnc, | ||
311 | event_code, | ||
312 | sci_base_state_machine_get_state(&sci_rnc->state_machine)); | ||
313 | |||
314 | return SCI_FAILURE_INVALID_STATE; | ||
315 | } | ||
316 | |||
317 | /** | 302 | /** |
318 | * | 303 | * |
319 | * @sci_rnc: The rnc for which the task request is targeted. | 304 | * @sci_rnc: The rnc for which the task request is targeted. |
@@ -383,41 +368,6 @@ static enum sci_status scic_sds_remote_node_context_initial_state_resume_handler | |||
383 | return SCI_FAILURE_INVALID_STATE; | 368 | return SCI_FAILURE_INVALID_STATE; |
384 | } | 369 | } |
385 | 370 | ||
386 | /* --------------------------------------------------------------------------- */ | ||
387 | |||
388 | static enum sci_status scic_sds_remote_node_context_posting_state_event_handler( | ||
389 | struct scic_sds_remote_node_context *sci_rnc, | ||
390 | u32 event_code) | ||
391 | { | ||
392 | enum sci_status status; | ||
393 | |||
394 | switch (scu_get_event_code(event_code)) { | ||
395 | case SCU_EVENT_POST_RNC_COMPLETE: | ||
396 | status = SCI_SUCCESS; | ||
397 | |||
398 | sci_base_state_machine_change_state( | ||
399 | &sci_rnc->state_machine, | ||
400 | SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE | ||
401 | ); | ||
402 | break; | ||
403 | |||
404 | default: | ||
405 | status = SCI_FAILURE; | ||
406 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
407 | "%s: SCIC Remote Node Context 0x%p requested to " | ||
408 | "process unexpected event 0x%x while in posting " | ||
409 | "state\n", | ||
410 | __func__, | ||
411 | sci_rnc, | ||
412 | event_code); | ||
413 | break; | ||
414 | } | ||
415 | |||
416 | return status; | ||
417 | } | ||
418 | |||
419 | /* --------------------------------------------------------------------------- */ | ||
420 | |||
421 | static enum sci_status scic_sds_remote_node_context_invalidating_state_destruct_handler( | 371 | static enum sci_status scic_sds_remote_node_context_invalidating_state_destruct_handler( |
422 | struct scic_sds_remote_node_context *sci_rnc, | 372 | struct scic_sds_remote_node_context *sci_rnc, |
423 | scics_sds_remote_node_context_callback callback, | 373 | scics_sds_remote_node_context_callback callback, |
@@ -430,110 +380,6 @@ static enum sci_status scic_sds_remote_node_context_invalidating_state_destruct_ | |||
430 | return SCI_SUCCESS; | 380 | return SCI_SUCCESS; |
431 | } | 381 | } |
432 | 382 | ||
433 | static enum sci_status scic_sds_remote_node_context_invalidating_state_event_handler( | ||
434 | struct scic_sds_remote_node_context *sci_rnc, | ||
435 | u32 event_code) | ||
436 | { | ||
437 | enum sci_status status; | ||
438 | |||
439 | if (scu_get_event_code(event_code) == SCU_EVENT_POST_RNC_INVALIDATE_COMPLETE) { | ||
440 | status = SCI_SUCCESS; | ||
441 | |||
442 | if (sci_rnc->destination_state == SCIC_SDS_REMOTE_NODE_DESTINATION_STATE_FINAL) { | ||
443 | sci_base_state_machine_change_state( | ||
444 | &sci_rnc->state_machine, | ||
445 | SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE | ||
446 | ); | ||
447 | } else { | ||
448 | sci_base_state_machine_change_state( | ||
449 | &sci_rnc->state_machine, | ||
450 | SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE | ||
451 | ); | ||
452 | } | ||
453 | } else { | ||
454 | switch (scu_get_event_type(event_code)) { | ||
455 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX: | ||
456 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: | ||
457 | /* | ||
458 | * We really dont care if the hardware is going to suspend | ||
459 | * the device since it's being invalidated anyway */ | ||
460 | dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
461 | "%s: SCIC Remote Node Context 0x%p was " | ||
462 | "suspeneded by hardware while being " | ||
463 | "invalidated.\n", | ||
464 | __func__, | ||
465 | sci_rnc); | ||
466 | status = SCI_SUCCESS; | ||
467 | break; | ||
468 | |||
469 | default: | ||
470 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
471 | "%s: SCIC Remote Node Context 0x%p " | ||
472 | "requested to process event 0x%x while " | ||
473 | "in state %d.\n", | ||
474 | __func__, | ||
475 | sci_rnc, | ||
476 | event_code, | ||
477 | sci_base_state_machine_get_state( | ||
478 | &sci_rnc->state_machine)); | ||
479 | status = SCI_FAILURE; | ||
480 | break; | ||
481 | } | ||
482 | } | ||
483 | |||
484 | return status; | ||
485 | } | ||
486 | |||
487 | /* --------------------------------------------------------------------------- */ | ||
488 | |||
489 | |||
490 | static enum sci_status scic_sds_remote_node_context_resuming_state_event_handler( | ||
491 | struct scic_sds_remote_node_context *sci_rnc, | ||
492 | u32 event_code) | ||
493 | { | ||
494 | enum sci_status status; | ||
495 | |||
496 | if (scu_get_event_code(event_code) == SCU_EVENT_POST_RCN_RELEASE) { | ||
497 | status = SCI_SUCCESS; | ||
498 | |||
499 | sci_base_state_machine_change_state( | ||
500 | &sci_rnc->state_machine, | ||
501 | SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE | ||
502 | ); | ||
503 | } else { | ||
504 | switch (scu_get_event_type(event_code)) { | ||
505 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX: | ||
506 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: | ||
507 | /* | ||
508 | * We really dont care if the hardware is going to suspend | ||
509 | * the device since it's being resumed anyway */ | ||
510 | dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
511 | "%s: SCIC Remote Node Context 0x%p was " | ||
512 | "suspeneded by hardware while being resumed.\n", | ||
513 | __func__, | ||
514 | sci_rnc); | ||
515 | status = SCI_SUCCESS; | ||
516 | break; | ||
517 | |||
518 | default: | ||
519 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
520 | "%s: SCIC Remote Node Context 0x%p requested " | ||
521 | "to process event 0x%x while in state %d.\n", | ||
522 | __func__, | ||
523 | sci_rnc, | ||
524 | event_code, | ||
525 | sci_base_state_machine_get_state( | ||
526 | &sci_rnc->state_machine)); | ||
527 | status = SCI_FAILURE; | ||
528 | break; | ||
529 | } | ||
530 | } | ||
531 | |||
532 | return status; | ||
533 | } | ||
534 | |||
535 | /* --------------------------------------------------------------------------- */ | ||
536 | |||
537 | /** | 383 | /** |
538 | * | 384 | * |
539 | * @sci_rnc: The remote node context object being suspended. | 385 | * @sci_rnc: The remote node context object being suspended. |
@@ -582,53 +428,6 @@ static enum sci_status scic_sds_remote_node_context_ready_state_start_io_handler | |||
582 | return SCI_SUCCESS; | 428 | return SCI_SUCCESS; |
583 | } | 429 | } |
584 | 430 | ||
585 | |||
586 | static enum sci_status scic_sds_remote_node_context_ready_state_event_handler( | ||
587 | struct scic_sds_remote_node_context *sci_rnc, | ||
588 | u32 event_code) | ||
589 | { | ||
590 | enum sci_status status; | ||
591 | |||
592 | switch (scu_get_event_type(event_code)) { | ||
593 | case SCU_EVENT_TL_RNC_SUSPEND_TX: | ||
594 | sci_base_state_machine_change_state( | ||
595 | &sci_rnc->state_machine, | ||
596 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE | ||
597 | ); | ||
598 | |||
599 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
600 | status = SCI_SUCCESS; | ||
601 | break; | ||
602 | |||
603 | case SCU_EVENT_TL_RNC_SUSPEND_TX_RX: | ||
604 | sci_base_state_machine_change_state( | ||
605 | &sci_rnc->state_machine, | ||
606 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE | ||
607 | ); | ||
608 | |||
609 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
610 | status = SCI_SUCCESS; | ||
611 | break; | ||
612 | |||
613 | default: | ||
614 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
615 | "%s: SCIC Remote Node Context 0x%p requested to " | ||
616 | "process event 0x%x while in state %d.\n", | ||
617 | __func__, | ||
618 | sci_rnc, | ||
619 | event_code, | ||
620 | sci_base_state_machine_get_state( | ||
621 | &sci_rnc->state_machine)); | ||
622 | |||
623 | status = SCI_FAILURE; | ||
624 | break; | ||
625 | } | ||
626 | |||
627 | return status; | ||
628 | } | ||
629 | |||
630 | /* --------------------------------------------------------------------------- */ | ||
631 | |||
632 | static enum sci_status scic_sds_remote_node_context_tx_suspended_state_resume_handler( | 431 | static enum sci_status scic_sds_remote_node_context_tx_suspended_state_resume_handler( |
633 | struct scic_sds_remote_node_context *sci_rnc, | 432 | struct scic_sds_remote_node_context *sci_rnc, |
634 | scics_sds_remote_node_context_callback callback, | 433 | scics_sds_remote_node_context_callback callback, |
@@ -738,61 +537,13 @@ static enum sci_status scic_sds_remote_node_context_await_suspension_state_start | |||
738 | return SCI_SUCCESS; | 537 | return SCI_SUCCESS; |
739 | } | 538 | } |
740 | 539 | ||
741 | static enum sci_status scic_sds_remote_node_context_await_suspension_state_event_handler( | 540 | static struct scic_sds_remote_node_context_handlers scic_sds_remote_node_context_state_handler_table[] = { |
742 | struct scic_sds_remote_node_context *sci_rnc, | ||
743 | u32 event_code) | ||
744 | { | ||
745 | enum sci_status status; | ||
746 | |||
747 | switch (scu_get_event_type(event_code)) { | ||
748 | case SCU_EVENT_TL_RNC_SUSPEND_TX: | ||
749 | sci_base_state_machine_change_state( | ||
750 | &sci_rnc->state_machine, | ||
751 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE | ||
752 | ); | ||
753 | |||
754 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
755 | status = SCI_SUCCESS; | ||
756 | break; | ||
757 | |||
758 | case SCU_EVENT_TL_RNC_SUSPEND_TX_RX: | ||
759 | sci_base_state_machine_change_state( | ||
760 | &sci_rnc->state_machine, | ||
761 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE | ||
762 | ); | ||
763 | |||
764 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
765 | status = SCI_SUCCESS; | ||
766 | break; | ||
767 | |||
768 | default: | ||
769 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
770 | "%s: SCIC Remote Node Context 0x%p requested to " | ||
771 | "process event 0x%x while in state %d.\n", | ||
772 | __func__, | ||
773 | sci_rnc, | ||
774 | event_code, | ||
775 | sci_base_state_machine_get_state( | ||
776 | &sci_rnc->state_machine)); | ||
777 | |||
778 | status = SCI_FAILURE; | ||
779 | break; | ||
780 | } | ||
781 | |||
782 | return status; | ||
783 | } | ||
784 | |||
785 | /* --------------------------------------------------------------------------- */ | ||
786 | |||
787 | static struct scic_sds_remote_node_context_handlers | ||
788 | scic_sds_remote_node_context_state_handler_table[] = { | ||
789 | [SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE] = { | 541 | [SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE] = { |
790 | .destruct_handler = scic_sds_remote_node_context_default_destruct_handler, | 542 | .destruct_handler = scic_sds_remote_node_context_default_destruct_handler, |
791 | .suspend_handler = scic_sds_remote_node_context_default_suspend_handler, | 543 | .suspend_handler = scic_sds_remote_node_context_default_suspend_handler, |
792 | .resume_handler = scic_sds_remote_node_context_initial_state_resume_handler, | 544 | .resume_handler = scic_sds_remote_node_context_initial_state_resume_handler, |
793 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, | 545 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, |
794 | .start_task_handler = scic_sds_remote_node_context_default_start_task_handler, | 546 | .start_task_handler = scic_sds_remote_node_context_default_start_task_handler, |
795 | .event_handler = scic_sds_remote_node_context_default_event_handler | ||
796 | }, | 547 | }, |
797 | [SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE] = { | 548 | [SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE] = { |
798 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, | 549 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, |
@@ -800,7 +551,6 @@ scic_sds_remote_node_context_state_handler_table[] = { | |||
800 | .resume_handler = scic_sds_remote_node_context_continue_to_resume_handler, | 551 | .resume_handler = scic_sds_remote_node_context_continue_to_resume_handler, |
801 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, | 552 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, |
802 | .start_task_handler = scic_sds_remote_node_context_default_start_task_handler, | 553 | .start_task_handler = scic_sds_remote_node_context_default_start_task_handler, |
803 | .event_handler = scic_sds_remote_node_context_posting_state_event_handler | ||
804 | }, | 554 | }, |
805 | [SCIC_SDS_REMOTE_NODE_CONTEXT_INVALIDATING_STATE] = { | 555 | [SCIC_SDS_REMOTE_NODE_CONTEXT_INVALIDATING_STATE] = { |
806 | .destruct_handler = scic_sds_remote_node_context_invalidating_state_destruct_handler, | 556 | .destruct_handler = scic_sds_remote_node_context_invalidating_state_destruct_handler, |
@@ -808,7 +558,6 @@ scic_sds_remote_node_context_state_handler_table[] = { | |||
808 | .resume_handler = scic_sds_remote_node_context_continue_to_resume_handler, | 558 | .resume_handler = scic_sds_remote_node_context_continue_to_resume_handler, |
809 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, | 559 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, |
810 | .start_task_handler = scic_sds_remote_node_context_default_start_task_handler, | 560 | .start_task_handler = scic_sds_remote_node_context_default_start_task_handler, |
811 | .event_handler = scic_sds_remote_node_context_invalidating_state_event_handler | ||
812 | }, | 561 | }, |
813 | [SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE] = { | 562 | [SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE] = { |
814 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, | 563 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, |
@@ -816,7 +565,6 @@ scic_sds_remote_node_context_state_handler_table[] = { | |||
816 | .resume_handler = scic_sds_remote_node_context_continue_to_resume_handler, | 565 | .resume_handler = scic_sds_remote_node_context_continue_to_resume_handler, |
817 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, | 566 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, |
818 | .start_task_handler = scic_sds_remote_node_context_success_start_task_handler, | 567 | .start_task_handler = scic_sds_remote_node_context_success_start_task_handler, |
819 | .event_handler = scic_sds_remote_node_context_resuming_state_event_handler | ||
820 | }, | 568 | }, |
821 | [SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE] = { | 569 | [SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE] = { |
822 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, | 570 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, |
@@ -824,7 +572,6 @@ scic_sds_remote_node_context_state_handler_table[] = { | |||
824 | .resume_handler = scic_sds_remote_node_context_default_resume_handler, | 572 | .resume_handler = scic_sds_remote_node_context_default_resume_handler, |
825 | .start_io_handler = scic_sds_remote_node_context_ready_state_start_io_handler, | 573 | .start_io_handler = scic_sds_remote_node_context_ready_state_start_io_handler, |
826 | .start_task_handler = scic_sds_remote_node_context_success_start_task_handler, | 574 | .start_task_handler = scic_sds_remote_node_context_success_start_task_handler, |
827 | .event_handler = scic_sds_remote_node_context_ready_state_event_handler | ||
828 | }, | 575 | }, |
829 | [SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE] = { | 576 | [SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE] = { |
830 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, | 577 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, |
@@ -832,7 +579,6 @@ scic_sds_remote_node_context_state_handler_table[] = { | |||
832 | .resume_handler = scic_sds_remote_node_context_tx_suspended_state_resume_handler, | 579 | .resume_handler = scic_sds_remote_node_context_tx_suspended_state_resume_handler, |
833 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, | 580 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, |
834 | .start_task_handler = scic_sds_remote_node_context_suspended_start_task_handler, | 581 | .start_task_handler = scic_sds_remote_node_context_suspended_start_task_handler, |
835 | .event_handler = scic_sds_remote_node_context_default_event_handler | ||
836 | }, | 582 | }, |
837 | [SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE] = { | 583 | [SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE] = { |
838 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, | 584 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, |
@@ -840,7 +586,6 @@ scic_sds_remote_node_context_state_handler_table[] = { | |||
840 | .resume_handler = scic_sds_remote_node_context_tx_rx_suspended_state_resume_handler, | 586 | .resume_handler = scic_sds_remote_node_context_tx_rx_suspended_state_resume_handler, |
841 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, | 587 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, |
842 | .start_task_handler = scic_sds_remote_node_context_suspended_start_task_handler, | 588 | .start_task_handler = scic_sds_remote_node_context_suspended_start_task_handler, |
843 | .event_handler = scic_sds_remote_node_context_default_event_handler | ||
844 | }, | 589 | }, |
845 | [SCIC_SDS_REMOTE_NODE_CONTEXT_AWAIT_SUSPENSION_STATE] = { | 590 | [SCIC_SDS_REMOTE_NODE_CONTEXT_AWAIT_SUSPENSION_STATE] = { |
846 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, | 591 | .destruct_handler = scic_sds_remote_node_context_general_destruct_handler, |
@@ -848,7 +593,6 @@ scic_sds_remote_node_context_state_handler_table[] = { | |||
848 | .resume_handler = scic_sds_remote_node_context_await_suspension_state_resume_handler, | 593 | .resume_handler = scic_sds_remote_node_context_await_suspension_state_resume_handler, |
849 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, | 594 | .start_io_handler = scic_sds_remote_node_context_default_start_io_handler, |
850 | .start_task_handler = scic_sds_remote_node_context_await_suspension_state_start_task_handler, | 595 | .start_task_handler = scic_sds_remote_node_context_await_suspension_state_start_task_handler, |
851 | .event_handler = scic_sds_remote_node_context_await_suspension_state_event_handler | ||
852 | } | 596 | } |
853 | }; | 597 | }; |
854 | 598 | ||
@@ -1172,3 +916,110 @@ void scic_sds_remote_node_context_construct(struct scic_sds_remote_node_context | |||
1172 | 916 | ||
1173 | sci_base_state_machine_start(&rnc->state_machine); | 917 | sci_base_state_machine_start(&rnc->state_machine); |
1174 | } | 918 | } |
919 | |||
920 | enum sci_status scic_sds_remote_node_context_event_handler(struct scic_sds_remote_node_context *sci_rnc, | ||
921 | u32 event_code) | ||
922 | { | ||
923 | enum scis_sds_remote_node_context_states state; | ||
924 | |||
925 | state = sci_rnc->state_machine.current_state_id; | ||
926 | switch (state) { | ||
927 | case SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE: | ||
928 | switch (scu_get_event_code(event_code)) { | ||
929 | case SCU_EVENT_POST_RNC_COMPLETE: | ||
930 | sci_base_state_machine_change_state(&sci_rnc->state_machine, | ||
931 | SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE); | ||
932 | break; | ||
933 | default: | ||
934 | goto out; | ||
935 | } | ||
936 | break; | ||
937 | case SCIC_SDS_REMOTE_NODE_CONTEXT_INVALIDATING_STATE: | ||
938 | if (scu_get_event_code(event_code) == SCU_EVENT_POST_RNC_INVALIDATE_COMPLETE) { | ||
939 | if (sci_rnc->destination_state == SCIC_SDS_REMOTE_NODE_DESTINATION_STATE_FINAL) | ||
940 | state = SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE; | ||
941 | else | ||
942 | state = SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE; | ||
943 | sci_base_state_machine_change_state(&sci_rnc->state_machine, | ||
944 | state); | ||
945 | } else { | ||
946 | switch (scu_get_event_type(event_code)) { | ||
947 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX: | ||
948 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: | ||
949 | /* We really dont care if the hardware is going to suspend | ||
950 | * the device since it's being invalidated anyway */ | ||
951 | dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
952 | "%s: SCIC Remote Node Context 0x%p was " | ||
953 | "suspeneded by hardware while being " | ||
954 | "invalidated.\n", __func__, sci_rnc); | ||
955 | break; | ||
956 | default: | ||
957 | goto out; | ||
958 | } | ||
959 | } | ||
960 | break; | ||
961 | case SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE: | ||
962 | if (scu_get_event_code(event_code) == SCU_EVENT_POST_RCN_RELEASE) { | ||
963 | sci_base_state_machine_change_state(&sci_rnc->state_machine, | ||
964 | SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE); | ||
965 | } else { | ||
966 | switch (scu_get_event_type(event_code)) { | ||
967 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX: | ||
968 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: | ||
969 | /* We really dont care if the hardware is going to suspend | ||
970 | * the device since it's being resumed anyway */ | ||
971 | dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
972 | "%s: SCIC Remote Node Context 0x%p was " | ||
973 | "suspeneded by hardware while being resumed.\n", | ||
974 | __func__, sci_rnc); | ||
975 | break; | ||
976 | default: | ||
977 | goto out; | ||
978 | } | ||
979 | } | ||
980 | break; | ||
981 | case SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE: | ||
982 | switch (scu_get_event_type(event_code)) { | ||
983 | case SCU_EVENT_TL_RNC_SUSPEND_TX: | ||
984 | sci_base_state_machine_change_state(&sci_rnc->state_machine, | ||
985 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE); | ||
986 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
987 | break; | ||
988 | case SCU_EVENT_TL_RNC_SUSPEND_TX_RX: | ||
989 | sci_base_state_machine_change_state(&sci_rnc->state_machine, | ||
990 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE); | ||
991 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
992 | break; | ||
993 | default: | ||
994 | goto out; | ||
995 | } | ||
996 | break; | ||
997 | case SCIC_SDS_REMOTE_NODE_CONTEXT_AWAIT_SUSPENSION_STATE: | ||
998 | switch (scu_get_event_type(event_code)) { | ||
999 | case SCU_EVENT_TL_RNC_SUSPEND_TX: | ||
1000 | sci_base_state_machine_change_state(&sci_rnc->state_machine, | ||
1001 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE); | ||
1002 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
1003 | break; | ||
1004 | case SCU_EVENT_TL_RNC_SUSPEND_TX_RX: | ||
1005 | sci_base_state_machine_change_state(&sci_rnc->state_machine, | ||
1006 | SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE); | ||
1007 | sci_rnc->suspension_code = scu_get_event_specifier(event_code); | ||
1008 | break; | ||
1009 | default: | ||
1010 | goto out; | ||
1011 | } | ||
1012 | break; | ||
1013 | default: | ||
1014 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
1015 | "%s: invalid state %d\n", __func__, state); | ||
1016 | return SCI_FAILURE_INVALID_STATE; | ||
1017 | } | ||
1018 | return SCI_SUCCESS; | ||
1019 | |||
1020 | out: | ||
1021 | dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)), | ||
1022 | "%s: code: %#x state: %d\n", __func__, event_code, state); | ||
1023 | return SCI_FAILURE; | ||
1024 | |||
1025 | } | ||
diff --git a/drivers/scsi/isci/remote_node_context.h b/drivers/scsi/isci/remote_node_context.h index a763468fa74f..fb93f09d4df6 100644 --- a/drivers/scsi/isci/remote_node_context.h +++ b/drivers/scsi/isci/remote_node_context.h | |||
@@ -102,11 +102,6 @@ typedef enum sci_status (*scic_sds_remote_node_context_io_request)( | |||
102 | struct scic_sds_request *sci_req | 102 | struct scic_sds_request *sci_req |
103 | ); | 103 | ); |
104 | 104 | ||
105 | typedef enum sci_status (*scic_sds_remote_node_context_event_handler)( | ||
106 | struct scic_sds_remote_node_context *sci_rnc, | ||
107 | u32 event_code | ||
108 | ); | ||
109 | |||
110 | struct scic_sds_remote_node_context_handlers { | 105 | struct scic_sds_remote_node_context_handlers { |
111 | /** | 106 | /** |
112 | * This handle is invoked to stop the RNC. The callback is invoked when after | 107 | * This handle is invoked to stop the RNC. The callback is invoked when after |
@@ -138,12 +133,6 @@ struct scic_sds_remote_node_context_handlers { | |||
138 | * operation. | 133 | * operation. |
139 | */ | 134 | */ |
140 | scic_sds_remote_node_context_io_request start_task_handler; | 135 | scic_sds_remote_node_context_io_request start_task_handler; |
141 | |||
142 | /** | ||
143 | * This handler is invoked where there is an RNC event that must be processed. | ||
144 | */ | ||
145 | scic_sds_remote_node_context_event_handler event_handler; | ||
146 | |||
147 | }; | 136 | }; |
148 | 137 | ||
149 | /** | 138 | /** |
@@ -271,8 +260,9 @@ bool scic_sds_remote_node_context_is_ready( | |||
271 | #define scic_sds_remote_node_context_get_remote_node_index(rcn) \ | 260 | #define scic_sds_remote_node_context_get_remote_node_index(rcn) \ |
272 | ((rnc)->remote_node_index) | 261 | ((rnc)->remote_node_index) |
273 | 262 | ||
274 | #define scic_sds_remote_node_context_event_handler(rnc, event_code) \ | 263 | |
275 | ((rnc)->state_handlers->event_handler(rnc, event_code)) | 264 | enum sci_status scic_sds_remote_node_context_event_handler(struct scic_sds_remote_node_context *sci_rnc, |
265 | u32 event_code); | ||
276 | 266 | ||
277 | #define scic_sds_remote_node_context_resume(rnc, callback, parameter) \ | 267 | #define scic_sds_remote_node_context_resume(rnc, callback, parameter) \ |
278 | ((rnc)->state_handlers->resume_handler(rnc, callback, parameter)) | 268 | ((rnc)->state_handlers->resume_handler(rnc, callback, parameter)) |