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>
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index d7940db..a752523 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -764,8 +764,11 @@
 	.id_table = sbp2_id_table,
 };
 
-static unsigned int sbp2_status_to_sense_data(u8 * sbp2_status, u8 * sense_data)
+static unsigned int
+sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
 {
+	int sam_status;
+
 	sense_data[0] = 0x70;
 	sense_data[1] = 0x0;
 	sense_data[2] = sbp2_status[1];
@@ -783,22 +786,19 @@
 	sense_data[14] = sbp2_status[12];
 	sense_data[15] = sbp2_status[13];
 
-	switch (sbp2_status[0] & 0x3f) {
+	sam_status = sbp2_status[0] & 0x3f;
+
+	switch (sam_status) {
 	case SAM_STAT_GOOD:
-		return DID_OK;
-
 	case SAM_STAT_CHECK_CONDITION:
-		/* return CHECK_CONDITION << 1 | DID_OK << 16; */
-		return DID_OK;
-
-	case SAM_STAT_BUSY:
-		return DID_BUS_BUSY;
-
 	case SAM_STAT_CONDITION_MET:
+	case SAM_STAT_BUSY:
 	case SAM_STAT_RESERVATION_CONFLICT:
 	case SAM_STAT_COMMAND_TERMINATED:
+		return DID_OK << 16 | sam_status;
+
 	default:
-		return DID_ERROR;
+		return DID_ERROR << 16;
 	}
 }
 
@@ -812,33 +812,31 @@
 	int result;
 
 	if (status != NULL) {
-		if (status_get_dead(*status)) {
-			fw_notify("agent died, issuing agent reset\n");
+		if (status_get_dead(*status))
 			sbp2_agent_reset(unit);
-		}
 
 		switch (status_get_response(*status)) {
 		case SBP2_STATUS_REQUEST_COMPLETE:
-			result = DID_OK;
+			result = DID_OK << 16;
 			break;
 		case SBP2_STATUS_TRANSPORT_FAILURE:
-			result = DID_BUS_BUSY;
+			result = DID_BUS_BUSY << 16;
 			break;
 		case SBP2_STATUS_ILLEGAL_REQUEST:
 		case SBP2_STATUS_VENDOR_DEPENDENT:
 		default:
-			result = DID_ERROR;
+			result = DID_ERROR << 16;
 			break;
 		}
 
-		if (result == DID_OK && status_get_len(*status) > 1)
+		if (result == DID_OK << 16 && status_get_len(*status) > 1)
 			result = sbp2_status_to_sense_data(status_get_data(*status),
 							   orb->cmd->sense_buffer);
 	} else {
 		/* If the orb completes with status == NULL, something
 		 * went wrong, typically a bus reset happened mid-orb
 		 * or when sending the write (less likely). */
-		result = DID_BUS_BUSY;
+		result = DID_BUS_BUSY << 16;
 	}
 
 	dma_unmap_single(device->card->device, orb->base.request_bus,
@@ -859,9 +857,8 @@
 				 sizeof orb->request_buffer_bus,
 				 DMA_FROM_DEVICE);
 
-	orb->cmd->result = result << 16;
+	orb->cmd->result = result;
 	orb->done(orb->cmd);
-
 	kfree(orb);
 }