diff options
author | Kristian Høgsberg <krh@redhat.com> | 2007-02-06 14:49:40 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-03-09 22:02:55 +0100 |
commit | 82eff9db7dc5d8f78898d5051975d14f48be2028 (patch) | |
tree | 4f65c617d165f90cee98d84373452b160be23349 /drivers/firewire/fw-sbp2.c | |
parent | 27a15e50fb87978d7e1e9f7b561f78692e0b1eb5 (diff) | |
download | lwn-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.c | 28 |
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) |