summaryrefslogtreecommitdiff
path: root/drivers/firewire/fw-sbp2.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-02-06 14:49:40 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2007-03-09 22:02:55 +0100
commit82eff9db7dc5d8f78898d5051975d14f48be2028 (patch)
tree4f65c617d165f90cee98d84373452b160be23349 /drivers/firewire/fw-sbp2.c
parent27a15e50fb87978d7e1e9f7b561f78692e0b1eb5 (diff)
downloadlwn-82eff9db7dc5d8f78898d5051975d14f48be2028.tar.gz
lwn-82eff9db7dc5d8f78898d5051975d14f48be2028.zip
firewire: Use dma_mapping_error() for checking for DMA mapping errors.
Pointed out by Pete Zaitcev. Signed-off-by: Kristian Høgsberg <krh@redhat.com> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-sbp2.c')
-rw-r--r--drivers/firewire/fw-sbp2.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index fa59e59766e1..2259e2225866 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -411,13 +411,13 @@ sbp2_send_management_orb(struct fw_unit *unit, int node_id, int generation,
orb->base.request_bus =
dma_map_single(device->card->device, &orb->request,
sizeof orb->request, DMA_TO_DEVICE);
- if (orb->base.request_bus == 0)
+ if (dma_mapping_error(orb->base.request_bus))
goto out;
orb->response_bus =
dma_map_single(device->card->device, &orb->response,
sizeof orb->response, DMA_FROM_DEVICE);
- if (orb->response_bus == 0)
+ if (dma_mapping_error(orb->response_bus))
goto out;
orb->request.response.high = 0;
@@ -963,22 +963,20 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done)
* transfer direction not handled. */
if (cmd->sc_data_direction == DMA_BIDIRECTIONAL) {
fw_error("Cannot handle DMA_BIDIRECTIONAL - rejecting command");
- cmd->result = DID_ERROR << 16;
- done(cmd);
- return 0;
+ goto fail_alloc;
}
orb = kzalloc(sizeof *orb, GFP_ATOMIC);
if (orb == NULL) {
fw_notify("failed to alloc orb\n");
- cmd->result = DID_NO_CONNECT << 16;
- done(cmd);
- return 0;
+ goto fail_alloc;
}
orb->base.request_bus =
dma_map_single(device->card->device, &orb->request,
sizeof orb->request, DMA_TO_DEVICE);
+ if (dma_mapping_error(orb->base.request_bus))
+ goto fail_mapping;
orb->unit = unit;
orb->done = done;
@@ -1009,9 +1007,7 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done)
* could we get the scsi or blk layer to do that by
* reporting our max supported block size? */
fw_error("command > 64k\n");
- cmd->result = DID_ERROR << 16;
- done(cmd);
- return 0;
+ goto fail_bufflen;
} else if (cmd->request_bufflen > 0) {
sbp2_command_orb_map_buffer(orb);
}
@@ -1028,6 +1024,16 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done)
sd->command_block_agent_address + SBP2_ORB_POINTER);
return 0;
+
+ fail_bufflen:
+ dma_unmap_single(device->card->device, orb->base.request_bus,
+ sizeof orb->request, DMA_TO_DEVICE);
+ fail_mapping:
+ kfree(orb);
+ fail_alloc:
+ cmd->result = DID_ERROR << 16;
+ done(cmd);
+ return 0;
}
static int sbp2_scsi_slave_alloc(struct scsi_device *sdev)