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>
spin_lock_irqsave(&card->lock, flags);
list_for_each_entry(orb, &sd->orb_list, link) {
if (status_get_orb_high(status) == 0 &&
- status_get_orb_low(status) == orb->request_bus) {
+ status_get_orb_low(status) == orb->request_bus &&
+ orb->rcode == RCODE_COMPLETE) {
list_del(&orb->link);
break;
}
goto fail_alloc;
}
+ /* Initialize rcode to something not RCODE_COMPLETE. */
+ orb->base.rcode = -1;
orb->base.request_bus =
dma_map_single(device->card->device, &orb->request,
sizeof orb->request, DMA_TO_DEVICE);