diff options
Diffstat (limited to 'drivers/scsi/qla1280.c')
-rw-r--r-- | drivers/scsi/qla1280.c | 387 |
1 files changed, 166 insertions, 221 deletions
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 5defe5ea5eda..8371d917a9a2 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
@@ -17,9 +17,12 @@ | |||
17 | * General Public License for more details. | 17 | * General Public License for more details. |
18 | * | 18 | * |
19 | ******************************************************************************/ | 19 | ******************************************************************************/ |
20 | #define QLA1280_VERSION "3.26" | 20 | #define QLA1280_VERSION "3.27" |
21 | /***************************************************************************** | 21 | /***************************************************************************** |
22 | Revision History: | 22 | Revision History: |
23 | Rev 3.27, February 10, 2009, Michael Reed | ||
24 | - General code cleanup. | ||
25 | - Improve error recovery. | ||
23 | Rev 3.26, January 16, 2006 Jes Sorensen | 26 | Rev 3.26, January 16, 2006 Jes Sorensen |
24 | - Ditch all < 2.6 support | 27 | - Ditch all < 2.6 support |
25 | Rev 3.25.1, February 10, 2005 Christoph Hellwig | 28 | Rev 3.25.1, February 10, 2005 Christoph Hellwig |
@@ -435,7 +438,6 @@ static int qla1280_mailbox_command(struct scsi_qla_host *, | |||
435 | uint8_t, uint16_t *); | 438 | uint8_t, uint16_t *); |
436 | static int qla1280_bus_reset(struct scsi_qla_host *, int); | 439 | static int qla1280_bus_reset(struct scsi_qla_host *, int); |
437 | static int qla1280_device_reset(struct scsi_qla_host *, int, int); | 440 | static int qla1280_device_reset(struct scsi_qla_host *, int, int); |
438 | static int qla1280_abort_device(struct scsi_qla_host *, int, int, int); | ||
439 | static int qla1280_abort_command(struct scsi_qla_host *, struct srb *, int); | 441 | static int qla1280_abort_command(struct scsi_qla_host *, struct srb *, int); |
440 | static int qla1280_abort_isp(struct scsi_qla_host *); | 442 | static int qla1280_abort_isp(struct scsi_qla_host *); |
441 | #ifdef QLA_64BIT_PTR | 443 | #ifdef QLA_64BIT_PTR |
@@ -698,7 +700,7 @@ qla1280_info(struct Scsi_Host *host) | |||
698 | } | 700 | } |
699 | 701 | ||
700 | /************************************************************************** | 702 | /************************************************************************** |
701 | * qla1200_queuecommand | 703 | * qla1280_queuecommand |
702 | * Queue a command to the controller. | 704 | * Queue a command to the controller. |
703 | * | 705 | * |
704 | * Note: | 706 | * Note: |
@@ -713,12 +715,14 @@ qla1280_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *)) | |||
713 | { | 715 | { |
714 | struct Scsi_Host *host = cmd->device->host; | 716 | struct Scsi_Host *host = cmd->device->host; |
715 | struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata; | 717 | struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata; |
716 | struct srb *sp = (struct srb *)&cmd->SCp; | 718 | struct srb *sp = (struct srb *)CMD_SP(cmd); |
717 | int status; | 719 | int status; |
718 | 720 | ||
719 | cmd->scsi_done = fn; | 721 | cmd->scsi_done = fn; |
720 | sp->cmd = cmd; | 722 | sp->cmd = cmd; |
721 | sp->flags = 0; | 723 | sp->flags = 0; |
724 | sp->wait = NULL; | ||
725 | CMD_HANDLE(cmd) = (unsigned char *)NULL; | ||
722 | 726 | ||
723 | qla1280_print_scsi_cmd(5, cmd); | 727 | qla1280_print_scsi_cmd(5, cmd); |
724 | 728 | ||
@@ -738,21 +742,11 @@ qla1280_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *)) | |||
738 | 742 | ||
739 | enum action { | 743 | enum action { |
740 | ABORT_COMMAND, | 744 | ABORT_COMMAND, |
741 | ABORT_DEVICE, | ||
742 | DEVICE_RESET, | 745 | DEVICE_RESET, |
743 | BUS_RESET, | 746 | BUS_RESET, |
744 | ADAPTER_RESET, | 747 | ADAPTER_RESET, |
745 | FAIL | ||
746 | }; | 748 | }; |
747 | 749 | ||
748 | /* timer action for error action processor */ | ||
749 | static void qla1280_error_wait_timeout(unsigned long __data) | ||
750 | { | ||
751 | struct scsi_cmnd *cmd = (struct scsi_cmnd *)__data; | ||
752 | struct srb *sp = (struct srb *)CMD_SP(cmd); | ||
753 | |||
754 | complete(sp->wait); | ||
755 | } | ||
756 | 750 | ||
757 | static void qla1280_mailbox_timeout(unsigned long __data) | 751 | static void qla1280_mailbox_timeout(unsigned long __data) |
758 | { | 752 | { |
@@ -767,8 +761,67 @@ static void qla1280_mailbox_timeout(unsigned long __data) | |||
767 | complete(ha->mailbox_wait); | 761 | complete(ha->mailbox_wait); |
768 | } | 762 | } |
769 | 763 | ||
764 | static int | ||
765 | _qla1280_wait_for_single_command(struct scsi_qla_host *ha, struct srb *sp, | ||
766 | struct completion *wait) | ||
767 | { | ||
768 | int status = FAILED; | ||
769 | struct scsi_cmnd *cmd = sp->cmd; | ||
770 | |||
771 | spin_unlock_irq(ha->host->host_lock); | ||
772 | wait_for_completion_timeout(wait, 4*HZ); | ||
773 | spin_lock_irq(ha->host->host_lock); | ||
774 | sp->wait = NULL; | ||
775 | if(CMD_HANDLE(cmd) == COMPLETED_HANDLE) { | ||
776 | status = SUCCESS; | ||
777 | (*cmd->scsi_done)(cmd); | ||
778 | } | ||
779 | return status; | ||
780 | } | ||
781 | |||
782 | static int | ||
783 | qla1280_wait_for_single_command(struct scsi_qla_host *ha, struct srb *sp) | ||
784 | { | ||
785 | DECLARE_COMPLETION_ONSTACK(wait); | ||
786 | |||
787 | sp->wait = &wait; | ||
788 | return _qla1280_wait_for_single_command(ha, sp, &wait); | ||
789 | } | ||
790 | |||
791 | static int | ||
792 | qla1280_wait_for_pending_commands(struct scsi_qla_host *ha, int bus, int target) | ||
793 | { | ||
794 | int cnt; | ||
795 | int status; | ||
796 | struct srb *sp; | ||
797 | struct scsi_cmnd *cmd; | ||
798 | |||
799 | status = SUCCESS; | ||
800 | |||
801 | /* | ||
802 | * Wait for all commands with the designated bus/target | ||
803 | * to be completed by the firmware | ||
804 | */ | ||
805 | for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { | ||
806 | sp = ha->outstanding_cmds[cnt]; | ||
807 | if (sp) { | ||
808 | cmd = sp->cmd; | ||
809 | |||
810 | if (bus >= 0 && SCSI_BUS_32(cmd) != bus) | ||
811 | continue; | ||
812 | if (target >= 0 && SCSI_TCN_32(cmd) != target) | ||
813 | continue; | ||
814 | |||
815 | status = qla1280_wait_for_single_command(ha, sp); | ||
816 | if (status == FAILED) | ||
817 | break; | ||
818 | } | ||
819 | } | ||
820 | return status; | ||
821 | } | ||
822 | |||
770 | /************************************************************************** | 823 | /************************************************************************** |
771 | * qla1200_error_action | 824 | * qla1280_error_action |
772 | * The function will attempt to perform a specified error action and | 825 | * The function will attempt to perform a specified error action and |
773 | * wait for the results (or time out). | 826 | * wait for the results (or time out). |
774 | * | 827 | * |
@@ -780,11 +833,6 @@ static void qla1280_mailbox_timeout(unsigned long __data) | |||
780 | * Returns: | 833 | * Returns: |
781 | * SUCCESS or FAILED | 834 | * SUCCESS or FAILED |
782 | * | 835 | * |
783 | * Note: | ||
784 | * Resetting the bus always succeeds - is has to, otherwise the | ||
785 | * kernel will panic! Try a surgical technique - sending a BUS | ||
786 | * DEVICE RESET message - on the offending target before pulling | ||
787 | * the SCSI bus reset line. | ||
788 | **************************************************************************/ | 836 | **************************************************************************/ |
789 | static int | 837 | static int |
790 | qla1280_error_action(struct scsi_cmnd *cmd, enum action action) | 838 | qla1280_error_action(struct scsi_cmnd *cmd, enum action action) |
@@ -792,13 +840,19 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) | |||
792 | struct scsi_qla_host *ha; | 840 | struct scsi_qla_host *ha; |
793 | int bus, target, lun; | 841 | int bus, target, lun; |
794 | struct srb *sp; | 842 | struct srb *sp; |
795 | uint16_t data; | 843 | int i, found; |
796 | unsigned char *handle; | 844 | int result=FAILED; |
797 | int result, i; | 845 | int wait_for_bus=-1; |
846 | int wait_for_target = -1; | ||
798 | DECLARE_COMPLETION_ONSTACK(wait); | 847 | DECLARE_COMPLETION_ONSTACK(wait); |
799 | struct timer_list timer; | 848 | |
849 | ENTER("qla1280_error_action"); | ||
800 | 850 | ||
801 | ha = (struct scsi_qla_host *)(CMD_HOST(cmd)->hostdata); | 851 | ha = (struct scsi_qla_host *)(CMD_HOST(cmd)->hostdata); |
852 | sp = (struct srb *)CMD_SP(cmd); | ||
853 | bus = SCSI_BUS_32(cmd); | ||
854 | target = SCSI_TCN_32(cmd); | ||
855 | lun = SCSI_LUN_32(cmd); | ||
802 | 856 | ||
803 | dprintk(4, "error_action %i, istatus 0x%04x\n", action, | 857 | dprintk(4, "error_action %i, istatus 0x%04x\n", action, |
804 | RD_REG_WORD(&ha->iobase->istatus)); | 858 | RD_REG_WORD(&ha->iobase->istatus)); |
@@ -807,99 +861,47 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) | |||
807 | RD_REG_WORD(&ha->iobase->host_cmd), | 861 | RD_REG_WORD(&ha->iobase->host_cmd), |
808 | RD_REG_WORD(&ha->iobase->ictrl), jiffies); | 862 | RD_REG_WORD(&ha->iobase->ictrl), jiffies); |
809 | 863 | ||
810 | ENTER("qla1280_error_action"); | ||
811 | if (qla1280_verbose) | 864 | if (qla1280_verbose) |
812 | printk(KERN_INFO "scsi(%li): Resetting Cmnd=0x%p, " | 865 | printk(KERN_INFO "scsi(%li): Resetting Cmnd=0x%p, " |
813 | "Handle=0x%p, action=0x%x\n", | 866 | "Handle=0x%p, action=0x%x\n", |
814 | ha->host_no, cmd, CMD_HANDLE(cmd), action); | 867 | ha->host_no, cmd, CMD_HANDLE(cmd), action); |
815 | 868 | ||
816 | if (cmd == NULL) { | ||
817 | printk(KERN_WARNING "(scsi?:?:?:?) Reset called with NULL " | ||
818 | "si_Cmnd pointer, failing.\n"); | ||
819 | LEAVE("qla1280_error_action"); | ||
820 | return FAILED; | ||
821 | } | ||
822 | |||
823 | ha = (struct scsi_qla_host *)cmd->device->host->hostdata; | ||
824 | sp = (struct srb *)CMD_SP(cmd); | ||
825 | handle = CMD_HANDLE(cmd); | ||
826 | |||
827 | /* Check for pending interrupts. */ | ||
828 | data = qla1280_debounce_register(&ha->iobase->istatus); | ||
829 | /* | ||
830 | * The io_request_lock is held when the reset handler is called, hence | ||
831 | * the interrupt handler cannot be running in parallel as it also | ||
832 | * grabs the lock. /Jes | ||
833 | */ | ||
834 | if (data & RISC_INT) | ||
835 | qla1280_isr(ha, &ha->done_q); | ||
836 | |||
837 | /* | 869 | /* |
838 | * Determine the suggested action that the mid-level driver wants | 870 | * Check to see if we have the command in the outstanding_cmds[] |
839 | * us to perform. | 871 | * array. If not then it must have completed before this error |
872 | * action was initiated. If the error_action isn't ABORT_COMMAND | ||
873 | * then the driver must proceed with the requested action. | ||
840 | */ | 874 | */ |
841 | if (handle == (unsigned char *)INVALID_HANDLE || handle == NULL) { | 875 | found = -1; |
842 | if(action == ABORT_COMMAND) { | 876 | for (i = 0; i < MAX_OUTSTANDING_COMMANDS; i++) { |
843 | /* we never got this command */ | 877 | if (sp == ha->outstanding_cmds[i]) { |
844 | printk(KERN_INFO "qla1280: Aborting a NULL handle\n"); | 878 | found = i; |
845 | return SUCCESS; /* no action - we don't have command */ | 879 | sp->wait = &wait; /* we'll wait for it to complete */ |
880 | break; | ||
846 | } | 881 | } |
847 | } else { | ||
848 | sp->wait = &wait; | ||
849 | } | 882 | } |
850 | 883 | ||
851 | bus = SCSI_BUS_32(cmd); | 884 | if (found < 0) { /* driver doesn't have command */ |
852 | target = SCSI_TCN_32(cmd); | 885 | result = SUCCESS; |
853 | lun = SCSI_LUN_32(cmd); | 886 | if (qla1280_verbose) { |
887 | printk(KERN_INFO | ||
888 | "scsi(%ld:%d:%d:%d): specified command has " | ||
889 | "already completed.\n", ha->host_no, bus, | ||
890 | target, lun); | ||
891 | } | ||
892 | } | ||
854 | 893 | ||
855 | /* Overloading result. Here it means the success or fail of the | ||
856 | * *issue* of the action. When we return from the routine, it must | ||
857 | * mean the actual success or fail of the action */ | ||
858 | result = FAILED; | ||
859 | switch (action) { | 894 | switch (action) { |
860 | case FAIL: | ||
861 | break; | ||
862 | 895 | ||
863 | case ABORT_COMMAND: | 896 | case ABORT_COMMAND: |
864 | if ((sp->flags & SRB_ABORT_PENDING)) { | 897 | dprintk(1, "qla1280: RISC aborting command\n"); |
865 | printk(KERN_WARNING | 898 | /* |
866 | "scsi(): Command has a pending abort " | 899 | * The abort might fail due to race when the host_lock |
867 | "message - ABORT_PENDING.\n"); | 900 | * is released to issue the abort. As such, we |
868 | /* This should technically be impossible since we | 901 | * don't bother to check the return status. |
869 | * now wait for abort completion */ | 902 | */ |
870 | break; | 903 | if (found >= 0) |
871 | } | 904 | qla1280_abort_command(ha, sp, found); |
872 | |||
873 | for (i = 0; i < MAX_OUTSTANDING_COMMANDS; i++) { | ||
874 | if (sp == ha->outstanding_cmds[i]) { | ||
875 | dprintk(1, "qla1280: RISC aborting command\n"); | ||
876 | if (qla1280_abort_command(ha, sp, i) == 0) | ||
877 | result = SUCCESS; | ||
878 | else { | ||
879 | /* | ||
880 | * Since we don't know what might | ||
881 | * have happend to the command, it | ||
882 | * is unsafe to remove it from the | ||
883 | * device's queue at this point. | ||
884 | * Wait and let the escalation | ||
885 | * process take care of it. | ||
886 | */ | ||
887 | printk(KERN_WARNING | ||
888 | "scsi(%li:%i:%i:%i): Unable" | ||
889 | " to abort command!\n", | ||
890 | ha->host_no, bus, target, lun); | ||
891 | } | ||
892 | } | ||
893 | } | ||
894 | break; | ||
895 | |||
896 | case ABORT_DEVICE: | ||
897 | if (qla1280_verbose) | ||
898 | printk(KERN_INFO | ||
899 | "scsi(%ld:%d:%d:%d): Queueing abort device " | ||
900 | "command.\n", ha->host_no, bus, target, lun); | ||
901 | if (qla1280_abort_device(ha, bus, target, lun) == 0) | ||
902 | result = SUCCESS; | ||
903 | break; | 905 | break; |
904 | 906 | ||
905 | case DEVICE_RESET: | 907 | case DEVICE_RESET: |
@@ -907,16 +909,21 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) | |||
907 | printk(KERN_INFO | 909 | printk(KERN_INFO |
908 | "scsi(%ld:%d:%d:%d): Queueing device reset " | 910 | "scsi(%ld:%d:%d:%d): Queueing device reset " |
909 | "command.\n", ha->host_no, bus, target, lun); | 911 | "command.\n", ha->host_no, bus, target, lun); |
910 | if (qla1280_device_reset(ha, bus, target) == 0) | 912 | if (qla1280_device_reset(ha, bus, target) == 0) { |
911 | result = SUCCESS; | 913 | /* issued device reset, set wait conditions */ |
914 | wait_for_bus = bus; | ||
915 | wait_for_target = target; | ||
916 | } | ||
912 | break; | 917 | break; |
913 | 918 | ||
914 | case BUS_RESET: | 919 | case BUS_RESET: |
915 | if (qla1280_verbose) | 920 | if (qla1280_verbose) |
916 | printk(KERN_INFO "qla1280(%ld:%d): Issued bus " | 921 | printk(KERN_INFO "qla1280(%ld:%d): Issued bus " |
917 | "reset.\n", ha->host_no, bus); | 922 | "reset.\n", ha->host_no, bus); |
918 | if (qla1280_bus_reset(ha, bus) == 0) | 923 | if (qla1280_bus_reset(ha, bus) == 0) { |
919 | result = SUCCESS; | 924 | /* issued bus reset, set wait conditions */ |
925 | wait_for_bus = bus; | ||
926 | } | ||
920 | break; | 927 | break; |
921 | 928 | ||
922 | case ADAPTER_RESET: | 929 | case ADAPTER_RESET: |
@@ -929,55 +936,48 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) | |||
929 | "continue automatically\n", ha->host_no); | 936 | "continue automatically\n", ha->host_no); |
930 | } | 937 | } |
931 | ha->flags.reset_active = 1; | 938 | ha->flags.reset_active = 1; |
932 | /* | 939 | |
933 | * We restarted all of the commands automatically, so the | 940 | if (qla1280_abort_isp(ha) != 0) { /* it's dead */ |
934 | * mid-level code can expect completions momentitarily. | 941 | result = FAILED; |
935 | */ | 942 | } |
936 | if (qla1280_abort_isp(ha) == 0) | ||
937 | result = SUCCESS; | ||
938 | 943 | ||
939 | ha->flags.reset_active = 0; | 944 | ha->flags.reset_active = 0; |
940 | } | 945 | } |
941 | 946 | ||
942 | if (!list_empty(&ha->done_q)) | 947 | /* |
943 | qla1280_done(ha); | 948 | * At this point, the host_lock has been released and retaken |
944 | 949 | * by the issuance of the mailbox command. | |
945 | /* If we didn't manage to issue the action, or we have no | 950 | * Wait for the command passed in by the mid-layer if it |
946 | * command to wait for, exit here */ | 951 | * was found by the driver. It might have been returned |
947 | if (result == FAILED || handle == NULL || | 952 | * between eh recovery steps, hence the check of the "found" |
948 | handle == (unsigned char *)INVALID_HANDLE) { | 953 | * variable. |
949 | /* | 954 | */ |
950 | * Clear completion queue to avoid qla1280_done() trying | ||
951 | * to complete the command at a later stage after we | ||
952 | * have exited the current context | ||
953 | */ | ||
954 | sp->wait = NULL; | ||
955 | goto leave; | ||
956 | } | ||
957 | 955 | ||
958 | /* set up a timer just in case we're really jammed */ | 956 | if (found >= 0) |
959 | init_timer(&timer); | 957 | result = _qla1280_wait_for_single_command(ha, sp, &wait); |
960 | timer.expires = jiffies + 4*HZ; | ||
961 | timer.data = (unsigned long)cmd; | ||
962 | timer.function = qla1280_error_wait_timeout; | ||
963 | add_timer(&timer); | ||
964 | 958 | ||
965 | /* wait for the action to complete (or the timer to expire) */ | 959 | if (action == ABORT_COMMAND && result != SUCCESS) { |
966 | spin_unlock_irq(ha->host->host_lock); | 960 | printk(KERN_WARNING |
967 | wait_for_completion(&wait); | 961 | "scsi(%li:%i:%i:%i): " |
968 | del_timer_sync(&timer); | 962 | "Unable to abort command!\n", |
969 | spin_lock_irq(ha->host->host_lock); | 963 | ha->host_no, bus, target, lun); |
970 | sp->wait = NULL; | 964 | } |
971 | 965 | ||
972 | /* the only action we might get a fail for is abort */ | 966 | /* |
973 | if (action == ABORT_COMMAND) { | 967 | * If the command passed in by the mid-layer has been |
974 | if(sp->flags & SRB_ABORTED) | 968 | * returned by the board, then wait for any additional |
975 | result = SUCCESS; | 969 | * commands which are supposed to complete based upon |
976 | else | 970 | * the error action. |
977 | result = FAILED; | 971 | * |
972 | * All commands are unconditionally returned during a | ||
973 | * call to qla1280_abort_isp(), ADAPTER_RESET. No need | ||
974 | * to wait for them. | ||
975 | */ | ||
976 | if (result == SUCCESS && wait_for_bus >= 0) { | ||
977 | result = qla1280_wait_for_pending_commands(ha, | ||
978 | wait_for_bus, wait_for_target); | ||
978 | } | 979 | } |
979 | 980 | ||
980 | leave: | ||
981 | dprintk(1, "RESET returning %d\n", result); | 981 | dprintk(1, "RESET returning %d\n", result); |
982 | 982 | ||
983 | LEAVE("qla1280_error_action"); | 983 | LEAVE("qla1280_error_action"); |
@@ -1280,13 +1280,12 @@ qla1280_done(struct scsi_qla_host *ha) | |||
1280 | switch ((CMD_RESULT(cmd) >> 16)) { | 1280 | switch ((CMD_RESULT(cmd) >> 16)) { |
1281 | case DID_RESET: | 1281 | case DID_RESET: |
1282 | /* Issue marker command. */ | 1282 | /* Issue marker command. */ |
1283 | qla1280_marker(ha, bus, target, 0, MK_SYNC_ID); | 1283 | if (!ha->flags.abort_isp_active) |
1284 | qla1280_marker(ha, bus, target, 0, MK_SYNC_ID); | ||
1284 | break; | 1285 | break; |
1285 | case DID_ABORT: | 1286 | case DID_ABORT: |
1286 | sp->flags &= ~SRB_ABORT_PENDING; | 1287 | sp->flags &= ~SRB_ABORT_PENDING; |
1287 | sp->flags |= SRB_ABORTED; | 1288 | sp->flags |= SRB_ABORTED; |
1288 | if (sp->flags & SRB_TIMEOUT) | ||
1289 | CMD_RESULT(sp->cmd) = DID_TIME_OUT << 16; | ||
1290 | break; | 1289 | break; |
1291 | default: | 1290 | default: |
1292 | break; | 1291 | break; |
@@ -1296,12 +1295,11 @@ qla1280_done(struct scsi_qla_host *ha) | |||
1296 | scsi_dma_unmap(cmd); | 1295 | scsi_dma_unmap(cmd); |
1297 | 1296 | ||
1298 | /* Call the mid-level driver interrupt handler */ | 1297 | /* Call the mid-level driver interrupt handler */ |
1299 | CMD_HANDLE(sp->cmd) = (unsigned char *)INVALID_HANDLE; | ||
1300 | ha->actthreads--; | 1298 | ha->actthreads--; |
1301 | 1299 | ||
1302 | (*(cmd)->scsi_done)(cmd); | 1300 | if (sp->wait == NULL) |
1303 | 1301 | (*(cmd)->scsi_done)(cmd); | |
1304 | if(sp->wait != NULL) | 1302 | else |
1305 | complete(sp->wait); | 1303 | complete(sp->wait); |
1306 | } | 1304 | } |
1307 | LEAVE("qla1280_done"); | 1305 | LEAVE("qla1280_done"); |
@@ -2417,9 +2415,6 @@ static int | |||
2417 | qla1280_mailbox_command(struct scsi_qla_host *ha, uint8_t mr, uint16_t *mb) | 2415 | qla1280_mailbox_command(struct scsi_qla_host *ha, uint8_t mr, uint16_t *mb) |
2418 | { | 2416 | { |
2419 | struct device_reg __iomem *reg = ha->iobase; | 2417 | struct device_reg __iomem *reg = ha->iobase; |
2420 | #if 0 | ||
2421 | LIST_HEAD(done_q); | ||
2422 | #endif | ||
2423 | int status = 0; | 2418 | int status = 0; |
2424 | int cnt; | 2419 | int cnt; |
2425 | uint16_t *optr, *iptr; | 2420 | uint16_t *optr, *iptr; |
@@ -2493,19 +2488,9 @@ qla1280_mailbox_command(struct scsi_qla_host *ha, uint8_t mr, uint16_t *mb) | |||
2493 | mr = MAILBOX_REGISTER_COUNT; | 2488 | mr = MAILBOX_REGISTER_COUNT; |
2494 | memcpy(optr, iptr, MAILBOX_REGISTER_COUNT * sizeof(uint16_t)); | 2489 | memcpy(optr, iptr, MAILBOX_REGISTER_COUNT * sizeof(uint16_t)); |
2495 | 2490 | ||
2496 | #if 0 | ||
2497 | /* Go check for any response interrupts pending. */ | ||
2498 | qla1280_isr(ha, &done_q); | ||
2499 | #endif | ||
2500 | |||
2501 | if (ha->flags.reset_marker) | 2491 | if (ha->flags.reset_marker) |
2502 | qla1280_rst_aen(ha); | 2492 | qla1280_rst_aen(ha); |
2503 | 2493 | ||
2504 | #if 0 | ||
2505 | if (!list_empty(&done_q)) | ||
2506 | qla1280_done(ha, &done_q); | ||
2507 | #endif | ||
2508 | |||
2509 | if (status) | 2494 | if (status) |
2510 | dprintk(2, "qla1280_mailbox_command: **** FAILED, mailbox0 = " | 2495 | dprintk(2, "qla1280_mailbox_command: **** FAILED, mailbox0 = " |
2511 | "0x%x ****\n", mb[0]); | 2496 | "0x%x ****\n", mb[0]); |
@@ -2641,41 +2626,6 @@ qla1280_device_reset(struct scsi_qla_host *ha, int bus, int target) | |||
2641 | } | 2626 | } |
2642 | 2627 | ||
2643 | /* | 2628 | /* |
2644 | * qla1280_abort_device | ||
2645 | * Issue an abort message to the device | ||
2646 | * | ||
2647 | * Input: | ||
2648 | * ha = adapter block pointer. | ||
2649 | * bus = SCSI BUS. | ||
2650 | * target = SCSI ID. | ||
2651 | * lun = SCSI LUN. | ||
2652 | * | ||
2653 | * Returns: | ||
2654 | * 0 = success | ||
2655 | */ | ||
2656 | static int | ||
2657 | qla1280_abort_device(struct scsi_qla_host *ha, int bus, int target, int lun) | ||
2658 | { | ||
2659 | uint16_t mb[MAILBOX_REGISTER_COUNT]; | ||
2660 | int status; | ||
2661 | |||
2662 | ENTER("qla1280_abort_device"); | ||
2663 | |||
2664 | mb[0] = MBC_ABORT_DEVICE; | ||
2665 | mb[1] = (bus ? target | BIT_7 : target) << 8 | lun; | ||
2666 | status = qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); | ||
2667 | |||
2668 | /* Issue marker command. */ | ||
2669 | qla1280_marker(ha, bus, target, lun, MK_SYNC_ID_LUN); | ||
2670 | |||
2671 | if (status) | ||
2672 | dprintk(2, "qla1280_abort_device: **** FAILED ****\n"); | ||
2673 | |||
2674 | LEAVE("qla1280_abort_device"); | ||
2675 | return status; | ||
2676 | } | ||
2677 | |||
2678 | /* | ||
2679 | * qla1280_abort_command | 2629 | * qla1280_abort_command |
2680 | * Abort command aborts a specified IOCB. | 2630 | * Abort command aborts a specified IOCB. |
2681 | * | 2631 | * |
@@ -2833,7 +2783,7 @@ qla1280_64bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) | |||
2833 | 2783 | ||
2834 | /* If room for request in request ring. */ | 2784 | /* If room for request in request ring. */ |
2835 | if ((req_cnt + 2) >= ha->req_q_cnt) { | 2785 | if ((req_cnt + 2) >= ha->req_q_cnt) { |
2836 | status = 1; | 2786 | status = SCSI_MLQUEUE_HOST_BUSY; |
2837 | dprintk(2, "qla1280_start_scsi: in-ptr=0x%x req_q_cnt=" | 2787 | dprintk(2, "qla1280_start_scsi: in-ptr=0x%x req_q_cnt=" |
2838 | "0x%xreq_cnt=0x%x", ha->req_ring_index, ha->req_q_cnt, | 2788 | "0x%xreq_cnt=0x%x", ha->req_ring_index, ha->req_q_cnt, |
2839 | req_cnt); | 2789 | req_cnt); |
@@ -2845,7 +2795,7 @@ qla1280_64bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) | |||
2845 | ha->outstanding_cmds[cnt] != NULL; cnt++); | 2795 | ha->outstanding_cmds[cnt] != NULL; cnt++); |
2846 | 2796 | ||
2847 | if (cnt >= MAX_OUTSTANDING_COMMANDS) { | 2797 | if (cnt >= MAX_OUTSTANDING_COMMANDS) { |
2848 | status = 1; | 2798 | status = SCSI_MLQUEUE_HOST_BUSY; |
2849 | dprintk(2, "qla1280_start_scsi: NO ROOM IN " | 2799 | dprintk(2, "qla1280_start_scsi: NO ROOM IN " |
2850 | "OUTSTANDING ARRAY, req_q_cnt=0x%x", ha->req_q_cnt); | 2800 | "OUTSTANDING ARRAY, req_q_cnt=0x%x", ha->req_q_cnt); |
2851 | goto out; | 2801 | goto out; |
@@ -3108,7 +3058,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) | |||
3108 | ha->req_q_cnt, seg_cnt); | 3058 | ha->req_q_cnt, seg_cnt); |
3109 | /* If room for request in request ring. */ | 3059 | /* If room for request in request ring. */ |
3110 | if ((req_cnt + 2) >= ha->req_q_cnt) { | 3060 | if ((req_cnt + 2) >= ha->req_q_cnt) { |
3111 | status = 1; | 3061 | status = SCSI_MLQUEUE_HOST_BUSY; |
3112 | dprintk(2, "qla1280_32bit_start_scsi: in-ptr=0x%x, " | 3062 | dprintk(2, "qla1280_32bit_start_scsi: in-ptr=0x%x, " |
3113 | "req_q_cnt=0x%x, req_cnt=0x%x", ha->req_ring_index, | 3063 | "req_q_cnt=0x%x, req_cnt=0x%x", ha->req_ring_index, |
3114 | ha->req_q_cnt, req_cnt); | 3064 | ha->req_q_cnt, req_cnt); |
@@ -3120,7 +3070,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) | |||
3120 | (ha->outstanding_cmds[cnt] != 0); cnt++) ; | 3070 | (ha->outstanding_cmds[cnt] != 0); cnt++) ; |
3121 | 3071 | ||
3122 | if (cnt >= MAX_OUTSTANDING_COMMANDS) { | 3072 | if (cnt >= MAX_OUTSTANDING_COMMANDS) { |
3123 | status = 1; | 3073 | status = SCSI_MLQUEUE_HOST_BUSY; |
3124 | dprintk(2, "qla1280_32bit_start_scsi: NO ROOM IN OUTSTANDING " | 3074 | dprintk(2, "qla1280_32bit_start_scsi: NO ROOM IN OUTSTANDING " |
3125 | "ARRAY, req_q_cnt=0x%x\n", ha->req_q_cnt); | 3075 | "ARRAY, req_q_cnt=0x%x\n", ha->req_q_cnt); |
3126 | goto out; | 3076 | goto out; |
@@ -3487,6 +3437,7 @@ qla1280_isr(struct scsi_qla_host *ha, struct list_head *done_q) | |||
3487 | 3437 | ||
3488 | /* Save ISP completion status */ | 3438 | /* Save ISP completion status */ |
3489 | CMD_RESULT(sp->cmd) = 0; | 3439 | CMD_RESULT(sp->cmd) = 0; |
3440 | CMD_HANDLE(sp->cmd) = COMPLETED_HANDLE; | ||
3490 | 3441 | ||
3491 | /* Place block on done queue */ | 3442 | /* Place block on done queue */ |
3492 | list_add_tail(&sp->list, done_q); | 3443 | list_add_tail(&sp->list, done_q); |
@@ -3495,7 +3446,7 @@ qla1280_isr(struct scsi_qla_host *ha, struct list_head *done_q) | |||
3495 | * If we get here we have a real problem! | 3446 | * If we get here we have a real problem! |
3496 | */ | 3447 | */ |
3497 | printk(KERN_WARNING | 3448 | printk(KERN_WARNING |
3498 | "qla1280: ISP invalid handle"); | 3449 | "qla1280: ISP invalid handle\n"); |
3499 | } | 3450 | } |
3500 | } | 3451 | } |
3501 | break; | 3452 | break; |
@@ -3753,6 +3704,8 @@ qla1280_status_entry(struct scsi_qla_host *ha, struct response *pkt, | |||
3753 | } | 3704 | } |
3754 | } | 3705 | } |
3755 | 3706 | ||
3707 | CMD_HANDLE(sp->cmd) = COMPLETED_HANDLE; | ||
3708 | |||
3756 | /* Place command on done queue. */ | 3709 | /* Place command on done queue. */ |
3757 | list_add_tail(&sp->list, done_q); | 3710 | list_add_tail(&sp->list, done_q); |
3758 | out: | 3711 | out: |
@@ -3808,6 +3761,8 @@ qla1280_error_entry(struct scsi_qla_host *ha, struct response *pkt, | |||
3808 | CMD_RESULT(sp->cmd) = DID_ERROR << 16; | 3761 | CMD_RESULT(sp->cmd) = DID_ERROR << 16; |
3809 | } | 3762 | } |
3810 | 3763 | ||
3764 | CMD_HANDLE(sp->cmd) = COMPLETED_HANDLE; | ||
3765 | |||
3811 | /* Place command on done queue. */ | 3766 | /* Place command on done queue. */ |
3812 | list_add_tail(&sp->list, done_q); | 3767 | list_add_tail(&sp->list, done_q); |
3813 | } | 3768 | } |
@@ -3858,19 +3813,16 @@ qla1280_abort_isp(struct scsi_qla_host *ha) | |||
3858 | struct scsi_cmnd *cmd; | 3813 | struct scsi_cmnd *cmd; |
3859 | sp = ha->outstanding_cmds[cnt]; | 3814 | sp = ha->outstanding_cmds[cnt]; |
3860 | if (sp) { | 3815 | if (sp) { |
3861 | |||
3862 | cmd = sp->cmd; | 3816 | cmd = sp->cmd; |
3863 | CMD_RESULT(cmd) = DID_RESET << 16; | 3817 | CMD_RESULT(cmd) = DID_RESET << 16; |
3864 | 3818 | CMD_HANDLE(cmd) = COMPLETED_HANDLE; | |
3865 | sp->cmd = NULL; | ||
3866 | ha->outstanding_cmds[cnt] = NULL; | 3819 | ha->outstanding_cmds[cnt] = NULL; |
3867 | 3820 | list_add_tail(&sp->list, &ha->done_q); | |
3868 | (*cmd->scsi_done)(cmd); | ||
3869 | |||
3870 | sp->flags = 0; | ||
3871 | } | 3821 | } |
3872 | } | 3822 | } |
3873 | 3823 | ||
3824 | qla1280_done(ha); | ||
3825 | |||
3874 | status = qla1280_load_firmware(ha); | 3826 | status = qla1280_load_firmware(ha); |
3875 | if (status) | 3827 | if (status) |
3876 | goto out; | 3828 | goto out; |
@@ -3955,13 +3907,6 @@ qla1280_check_for_dead_scsi_bus(struct scsi_qla_host *ha, unsigned int bus) | |||
3955 | 3907 | ||
3956 | if (scsi_control == SCSI_PHASE_INVALID) { | 3908 | if (scsi_control == SCSI_PHASE_INVALID) { |
3957 | ha->bus_settings[bus].scsi_bus_dead = 1; | 3909 | ha->bus_settings[bus].scsi_bus_dead = 1; |
3958 | #if 0 | ||
3959 | CMD_RESULT(cp) = DID_NO_CONNECT << 16; | ||
3960 | CMD_HANDLE(cp) = INVALID_HANDLE; | ||
3961 | /* ha->actthreads--; */ | ||
3962 | |||
3963 | (*(cp)->scsi_done)(cp); | ||
3964 | #endif | ||
3965 | return 1; /* bus is dead */ | 3910 | return 1; /* bus is dead */ |
3966 | } else { | 3911 | } else { |
3967 | ha->bus_settings[bus].scsi_bus_dead = 0; | 3912 | ha->bus_settings[bus].scsi_bus_dead = 0; |