iop-adma: add a dummy read to flush next descriptor update
authorDan Williams <dan.j.williams@intel.com>
Tue, 11 Nov 2008 20:12:33 +0000 (13:12 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 11 Nov 2008 20:12:33 +0000 (13:12 -0700)
The current dummy read references the wrong address allowing the next
descriptor address update to linger in the store buffer and get passed
by an 'append' event.

This issue was uncovered by the change from strongly-ordered to device
memory for the adma registers.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/dma/iop-adma.c

index 71fba82462cb98372568a2f2da6c8c325e1a10d8..95f5a9466816cb01e1daedaaa5db5ca1b24be3a1 100644 (file)
@@ -411,6 +411,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
        int slot_cnt;
        int slots_per_op;
        dma_cookie_t cookie;
+       dma_addr_t next_dma;
 
        grp_start = sw_desc->group_head;
        slot_cnt = grp_start->slot_cnt;
@@ -425,11 +426,11 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
                         &old_chain_tail->chain_node);
 
        /* fix up the hardware chain */
-       iop_desc_set_next_desc(old_chain_tail, grp_start->async_tx.phys);
+       next_dma = grp_start->async_tx.phys;
+       iop_desc_set_next_desc(old_chain_tail, next_dma);
+       BUG_ON(iop_desc_get_next_desc(old_chain_tail) != next_dma); /* flush */
 
-       /* 1/ don't add pre-chained descriptors
-        * 2/ dummy read to flush next_desc write
-        */
+       /* check for pre-chained descriptors */
        BUG_ON(iop_desc_get_next_desc(sw_desc));
 
        /* increment the pending count by the number of slots