struct bcom_ata_var *var;
        struct bcom_ata_inc *inc;
 
+       /* Prefetch breaks ATA DMA.  Turn it off for ATA DMA */
+       bcom_disable_prefetch();
+
        tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_ata_bd), 0);
        if (!tsk)
                return NULL;
 
        int task;
        phys_addr_t tdt_pa, ctx_pa, var_pa, fdt_pa;
        unsigned int tdt_size, ctx_size, var_size, fdt_size;
-       u16 regval;
 
        /* Allocate & clear SRAM zones for FDT, TDTs, contexts and vars/incs */
        tdt_size = BCOM_MAX_TASKS * sizeof(struct bcom_tdt);
        out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ALWAYS], BCOM_IPR_ALWAYS);
 
        /* Disable COMM Bus Prefetch on the original 5200; it's broken */
-       if ((mfspr(SPRN_SVR) & MPC5200_SVR_MASK) == MPC5200_SVR) {
-               regval = in_be16(&bcom_eng->regs->PtdCntrl);
-               out_be16(&bcom_eng->regs->PtdCntrl,  regval | 1);
-       }
+       if ((mfspr(SPRN_SVR) & MPC5200_SVR_MASK) == MPC5200_SVR)
+               bcom_disable_prefetch();
 
        /* Init lock */
        spin_lock_init(&bcom_eng->lock);
 
 
 #define TASK_ENABLE             0x8000
 
+/**
+ * bcom_disable_prefetch - Hook to disable bus prefetching
+ *
+ * ATA DMA and the original MPC5200 need this due to silicon bugs.  At the
+ * moment disabling prefetch is a one-way street.  There is no mechanism
+ * in place to turn prefetch back on after it has been disabled.  There is
+ * no reason it couldn't be done, it would just be more complex to implement.
+ */
+static inline void bcom_disable_prefetch(void)
+{
+       u16 regval;
+
+       regval = in_be16(&bcom_eng->regs->PtdCntrl);
+       out_be16(&bcom_eng->regs->PtdCntrl, regval | 1);
+};
+
 static inline void
 bcom_enable_task(int task)
 {