Commit fbb5423c authored by Kristian Høgsberg's avatar Kristian Høgsberg Committed by Stefan Richter

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: default avatarKristian Høgsberg <krh@redhat.com>
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent 053b3080
...@@ -764,8 +764,11 @@ static struct fw_driver sbp2_driver = { ...@@ -764,8 +764,11 @@ static struct fw_driver sbp2_driver = {
.id_table = sbp2_id_table, .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[0] = 0x70;
sense_data[1] = 0x0; sense_data[1] = 0x0;
sense_data[2] = sbp2_status[1]; 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,22 +786,19 @@ static unsigned int sbp2_status_to_sense_data(u8 * sbp2_status, u8 * sense_data)
sense_data[14] = sbp2_status[12]; sense_data[14] = sbp2_status[12];
sense_data[15] = sbp2_status[13]; sense_data[15] = sbp2_status[13];
switch (sbp2_status[0] & 0x3f) { sam_status = sbp2_status[0] & 0x3f;
case SAM_STAT_GOOD:
return DID_OK;
switch (sam_status) {
case SAM_STAT_GOOD:
case SAM_STAT_CHECK_CONDITION: 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_CONDITION_MET:
case SAM_STAT_BUSY:
case SAM_STAT_RESERVATION_CONFLICT: case SAM_STAT_RESERVATION_CONFLICT:
case SAM_STAT_COMMAND_TERMINATED: case SAM_STAT_COMMAND_TERMINATED:
return DID_OK << 16 | sam_status;
default: default:
return DID_ERROR; return DID_ERROR << 16;
} }
} }
...@@ -812,33 +812,31 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status) ...@@ -812,33 +812,31 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)
int result; int result;
if (status != NULL) { if (status != NULL) {
if (status_get_dead(*status)) { if (status_get_dead(*status))
fw_notify("agent died, issuing agent reset\n");
sbp2_agent_reset(unit); sbp2_agent_reset(unit);
}
switch (status_get_response(*status)) { switch (status_get_response(*status)) {
case SBP2_STATUS_REQUEST_COMPLETE: case SBP2_STATUS_REQUEST_COMPLETE:
result = DID_OK; result = DID_OK << 16;
break; break;
case SBP2_STATUS_TRANSPORT_FAILURE: case SBP2_STATUS_TRANSPORT_FAILURE:
result = DID_BUS_BUSY; result = DID_BUS_BUSY << 16;
break; break;
case SBP2_STATUS_ILLEGAL_REQUEST: case SBP2_STATUS_ILLEGAL_REQUEST:
case SBP2_STATUS_VENDOR_DEPENDENT: case SBP2_STATUS_VENDOR_DEPENDENT:
default: default:
result = DID_ERROR; result = DID_ERROR << 16;
break; 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), result = sbp2_status_to_sense_data(status_get_data(*status),
orb->cmd->sense_buffer); orb->cmd->sense_buffer);
} else { } else {
/* If the orb completes with status == NULL, something /* If the orb completes with status == NULL, something
* went wrong, typically a bus reset happened mid-orb * went wrong, typically a bus reset happened mid-orb
* or when sending the write (less likely). */ * 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, 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,9 +857,8 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)
sizeof orb->request_buffer_bus, sizeof orb->request_buffer_bus,
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
orb->cmd->result = result << 16; orb->cmd->result = result;
orb->done(orb->cmd); orb->done(orb->cmd);
kfree(orb); kfree(orb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment