diff options
author | Kristian Høgsberg <krh@redhat.com> | 2007-04-10 18:11:18 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-04-11 18:18:57 -0400 |
commit | fbb5423c1df99c846677480ce44588176352f7d9 (patch) | |
tree | 196ead368dea14ed169d99d5ba4d2a820579081b /drivers/firewire | |
parent | 053b30808f693b2e4bbef2955c2dad0fcacdb806 (diff) |
firewire: Forward SAM status codes to the scsi stack.
Or the SAM status codes from the device sense data into the
command error code.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire')
-rw-r--r-- | drivers/firewire/fw-sbp2.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index d7940db30a5b..a7525234c862 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
@@ -764,8 +764,11 @@ static struct fw_driver sbp2_driver = { | |||
764 | .id_table = sbp2_id_table, | 764 | .id_table = sbp2_id_table, |
765 | }; | 765 | }; |
766 | 766 | ||
767 | static unsigned int sbp2_status_to_sense_data(u8 * sbp2_status, u8 * sense_data) | 767 | static unsigned int |
768 | sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data) | ||
768 | { | 769 | { |
770 | int sam_status; | ||
771 | |||
769 | sense_data[0] = 0x70; | 772 | sense_data[0] = 0x70; |
770 | sense_data[1] = 0x0; | 773 | sense_data[1] = 0x0; |
771 | sense_data[2] = sbp2_status[1]; | 774 | sense_data[2] = sbp2_status[1]; |
@@ -783,22 +786,19 @@ static unsigned int sbp2_status_to_sense_data(u8 * sbp2_status, u8 * sense_data) | |||
783 | sense_data[14] = sbp2_status[12]; | 786 | sense_data[14] = sbp2_status[12]; |
784 | sense_data[15] = sbp2_status[13]; | 787 | sense_data[15] = sbp2_status[13]; |
785 | 788 | ||
786 | switch (sbp2_status[0] & 0x3f) { | 789 | sam_status = sbp2_status[0] & 0x3f; |
787 | case SAM_STAT_GOOD: | ||
788 | return DID_OK; | ||
789 | 790 | ||
791 | switch (sam_status) { | ||
792 | case SAM_STAT_GOOD: | ||
790 | case SAM_STAT_CHECK_CONDITION: | 793 | case SAM_STAT_CHECK_CONDITION: |
791 | /* return CHECK_CONDITION << 1 | DID_OK << 16; */ | ||
792 | return DID_OK; | ||
793 | |||
794 | case SAM_STAT_BUSY: | ||
795 | return DID_BUS_BUSY; | ||
796 | |||
797 | case SAM_STAT_CONDITION_MET: | 794 | case SAM_STAT_CONDITION_MET: |
795 | case SAM_STAT_BUSY: | ||
798 | case SAM_STAT_RESERVATION_CONFLICT: | 796 | case SAM_STAT_RESERVATION_CONFLICT: |
799 | case SAM_STAT_COMMAND_TERMINATED: | 797 | case SAM_STAT_COMMAND_TERMINATED: |
798 | return DID_OK << 16 | sam_status; | ||
799 | |||
800 | default: | 800 | default: |
801 | return DID_ERROR; | 801 | return DID_ERROR << 16; |
802 | } | 802 | } |
803 | } | 803 | } |
804 | 804 | ||
@@ -812,33 +812,31 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status) | |||
812 | int result; | 812 | int result; |
813 | 813 | ||
814 | if (status != NULL) { | 814 | if (status != NULL) { |
815 | if (status_get_dead(*status)) { | 815 | if (status_get_dead(*status)) |
816 | fw_notify("agent died, issuing agent reset\n"); | ||
817 | sbp2_agent_reset(unit); | 816 | sbp2_agent_reset(unit); |
818 | } | ||
819 | 817 | ||
820 | switch (status_get_response(*status)) { | 818 | switch (status_get_response(*status)) { |
821 | case SBP2_STATUS_REQUEST_COMPLETE: | 819 | case SBP2_STATUS_REQUEST_COMPLETE: |
822 | result = DID_OK; | 820 | result = DID_OK << 16; |
823 | break; | 821 | break; |
824 | case SBP2_STATUS_TRANSPORT_FAILURE: | 822 | case SBP2_STATUS_TRANSPORT_FAILURE: |
825 | result = DID_BUS_BUSY; | 823 | result = DID_BUS_BUSY << 16; |
826 | break; | 824 | break; |
827 | case SBP2_STATUS_ILLEGAL_REQUEST: | 825 | case SBP2_STATUS_ILLEGAL_REQUEST: |
828 | case SBP2_STATUS_VENDOR_DEPENDENT: | 826 | case SBP2_STATUS_VENDOR_DEPENDENT: |
829 | default: | 827 | default: |
830 | result = DID_ERROR; | 828 | result = DID_ERROR << 16; |
831 | break; | 829 | break; |
832 | } | 830 | } |
833 | 831 | ||
834 | if (result == DID_OK && status_get_len(*status) > 1) | 832 | if (result == DID_OK << 16 && status_get_len(*status) > 1) |
835 | result = sbp2_status_to_sense_data(status_get_data(*status), | 833 | result = sbp2_status_to_sense_data(status_get_data(*status), |
836 | orb->cmd->sense_buffer); | 834 | orb->cmd->sense_buffer); |
837 | } else { | 835 | } else { |
838 | /* If the orb completes with status == NULL, something | 836 | /* If the orb completes with status == NULL, something |
839 | * went wrong, typically a bus reset happened mid-orb | 837 | * went wrong, typically a bus reset happened mid-orb |
840 | * or when sending the write (less likely). */ | 838 | * or when sending the write (less likely). */ |
841 | result = DID_BUS_BUSY; | 839 | result = DID_BUS_BUSY << 16; |
842 | } | 840 | } |
843 | 841 | ||
844 | dma_unmap_single(device->card->device, orb->base.request_bus, | 842 | dma_unmap_single(device->card->device, orb->base.request_bus, |
@@ -859,9 +857,8 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status) | |||
859 | sizeof orb->request_buffer_bus, | 857 | sizeof orb->request_buffer_bus, |
860 | DMA_FROM_DEVICE); | 858 | DMA_FROM_DEVICE); |
861 | 859 | ||
862 | orb->cmd->result = result << 16; | 860 | orb->cmd->result = result; |
863 | orb->done(orb->cmd); | 861 | orb->done(orb->cmd); |
864 | |||
865 | kfree(orb); | 862 | kfree(orb); |
866 | } | 863 | } |
867 | 864 | ||