aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-sbp2.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-04-10 18:11:20 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2007-04-11 18:18:57 -0400
commit12f26aa1b172a32604fedcb98d68c7aef268d6ad (patch)
treeefa6fff9b9ae825c7a99a97279f973e8966bad3b /drivers/firewire/fw-sbp2.c
parentfbb5423c1df99c846677480ce44588176352f7d9 (diff)
firewire: Only free ORBs that completed the initial transaction.
In some situations we can receive the ORB status write before we have received the ORB pointer write response. When this happens, we assume that the fw_transaction is finished and free the ORB struct containing the fw_transaction. This fix make the status write logic only accept status writes for ORBs where the initial ORB pointer write transaction finished. 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.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index a7525234c862..c1e93165efdb 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -293,7 +293,8 @@ sbp2_status_write(struct fw_card *card, struct fw_request *request,
293 spin_lock_irqsave(&card->lock, flags); 293 spin_lock_irqsave(&card->lock, flags);
294 list_for_each_entry(orb, &sd->orb_list, link) { 294 list_for_each_entry(orb, &sd->orb_list, link) {
295 if (status_get_orb_high(status) == 0 && 295 if (status_get_orb_high(status) == 0 &&
296 status_get_orb_low(status) == orb->request_bus) { 296 status_get_orb_low(status) == orb->request_bus &&
297 orb->rcode == RCODE_COMPLETE) {
297 list_del(&orb->link); 298 list_del(&orb->link);
298 break; 299 break;
299 } 300 }
@@ -968,6 +969,8 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done)
968 goto fail_alloc; 969 goto fail_alloc;
969 } 970 }
970 971
972 /* Initialize rcode to something not RCODE_COMPLETE. */
973 orb->base.rcode = -1;
971 orb->base.request_bus = 974 orb->base.request_bus =
972 dma_map_single(device->card->device, &orb->request, 975 dma_map_single(device->card->device, &orb->request,
973 sizeof orb->request, DMA_TO_DEVICE); 976 sizeof orb->request, DMA_TO_DEVICE);