diff options
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, | |||
411 | orb->base.request_bus = | 411 | orb->base.request_bus = |
412 | dma_map_single(device->card->device, &orb->request, | 412 | dma_map_single(device->card->device, &orb->request, |
413 | sizeof orb->request, DMA_TO_DEVICE); | 413 | sizeof orb->request, DMA_TO_DEVICE); |
414 | if (orb->base.request_bus == 0) | 414 | if (dma_mapping_error(orb->base.request_bus)) |
415 | goto out; | 415 | goto out; |
416 | 416 | ||
417 | orb->response_bus = | 417 | orb->response_bus = |
418 | dma_map_single(device->card->device, &orb->response, | 418 | dma_map_single(device->card->device, &orb->response, |
419 | sizeof orb->response, DMA_FROM_DEVICE); | 419 | sizeof orb->response, DMA_FROM_DEVICE); |
420 | if (orb->response_bus == 0) | 420 | if (dma_mapping_error(orb->response_bus)) |
421 | goto out; | 421 | goto out; |
422 | 422 | ||
423 | orb->request.response.high = 0; | 423 | orb->request.response.high = 0; |
@@ -963,22 +963,20 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | |||
963 | * transfer direction not handled. */ | 963 | * transfer direction not handled. */ |
964 | if (cmd->sc_data_direction == DMA_BIDIRECTIONAL) { | 964 | if (cmd->sc_data_direction == DMA_BIDIRECTIONAL) { |
965 | fw_error("Cannot handle DMA_BIDIRECTIONAL - rejecting command"); | 965 | fw_error("Cannot handle DMA_BIDIRECTIONAL - rejecting command"); |
966 | cmd->result = DID_ERROR << 16; | 966 | goto fail_alloc; |
967 | done(cmd); | ||
968 | return 0; | ||
969 | } | 967 | } |
970 | 968 | ||
971 | orb = kzalloc(sizeof *orb, GFP_ATOMIC); | 969 | orb = kzalloc(sizeof *orb, GFP_ATOMIC); |
972 | if (orb == NULL) { | 970 | if (orb == NULL) { |
973 | fw_notify("failed to alloc orb\n"); | 971 | fw_notify("failed to alloc orb\n"); |
974 | cmd->result = DID_NO_CONNECT << 16; | 972 | goto fail_alloc; |
975 | done(cmd); | ||
976 | return 0; | ||
977 | } | 973 | } |
978 | 974 | ||
979 | orb->base.request_bus = | 975 | orb->base.request_bus = |
980 | dma_map_single(device->card->device, &orb->request, | 976 | dma_map_single(device->card->device, &orb->request, |
981 | sizeof orb->request, DMA_TO_DEVICE); | 977 | sizeof orb->request, DMA_TO_DEVICE); |
978 | if (dma_mapping_error(orb->base.request_bus)) | ||
979 | goto fail_mapping; | ||
982 | 980 | ||
983 | orb->unit = unit; | 981 | orb->unit = unit; |
984 | orb->done = done; | 982 | orb->done = done; |
@@ -1009,9 +1007,7 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | |||
1009 | * could we get the scsi or blk layer to do that by | 1007 | * could we get the scsi or blk layer to do that by |
1010 | * reporting our max supported block size? */ | 1008 | * reporting our max supported block size? */ |
1011 | fw_error("command > 64k\n"); | 1009 | fw_error("command > 64k\n"); |
1012 | cmd->result = DID_ERROR << 16; | 1010 | goto fail_bufflen; |
1013 | done(cmd); | ||
1014 | return 0; | ||
1015 | } else if (cmd->request_bufflen > 0) { | 1011 | } else if (cmd->request_bufflen > 0) { |
1016 | sbp2_command_orb_map_buffer(orb); | 1012 | sbp2_command_orb_map_buffer(orb); |
1017 | } | 1013 | } |
@@ -1028,6 +1024,16 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | |||
1028 | sd->command_block_agent_address + SBP2_ORB_POINTER); | 1024 | sd->command_block_agent_address + SBP2_ORB_POINTER); |
1029 | 1025 | ||
1030 | return 0; | 1026 | return 0; |
1027 | |||
1028 | fail_bufflen: | ||
1029 | dma_unmap_single(device->card->device, orb->base.request_bus, | ||
1030 | sizeof orb->request, DMA_TO_DEVICE); | ||
1031 | fail_mapping: | ||
1032 | kfree(orb); | ||
1033 | fail_alloc: | ||
1034 | cmd->result = DID_ERROR << 16; | ||
1035 | done(cmd); | ||
1036 | return 0; | ||
1031 | } | 1037 | } |
1032 | 1038 | ||
1033 | static int sbp2_scsi_slave_alloc(struct scsi_device *sdev) | 1039 | static int sbp2_scsi_slave_alloc(struct scsi_device *sdev) |