static int ejtag_dma_read(mips_ejtag_t *ejtag_info, u32 addr, u32 *data)
 {
        u32 v;
-       u32 ctrl_reg;
+       u32 ejtag_ctrl;
        int   retries = RETRY_ATTEMPTS;
 
 begin_ejtag_dma_read:
 
        // Initiate DMA Read & set DSTRT
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
+       ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
 
        // Wait for DSTRT to Clear
        do {
-               ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-               mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       } while(ctrl_reg & EJTAG_CTRL_DSTRT);
+               ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl;
+               mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       } while(ejtag_ctrl & EJTAG_CTRL_DSTRT);
 
        // Read Data
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA, NULL);
 
        // Clear DMA & Check DERR
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       if (ctrl_reg  & EJTAG_CTRL_DERR)
+       ejtag_ctrl = ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       if (ejtag_ctrl  & EJTAG_CTRL_DERR)
        {
                if (retries--) {
                        printf("DMA Read Addr = %08x  Data = ERROR ON READ (retrying)\n", addr);
 static int ejtag_dma_read_h(mips_ejtag_t *ejtag_info, u32 addr, u16 *data)
 {
        u32 v;
-       u32 ctrl_reg;
+       u32 ejtag_ctrl;
        int   retries = RETRY_ATTEMPTS;
 
 begin_ejtag_dma_read_h:
 
        // Initiate DMA Read & set DSTRT
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_HALFWORD | EJTAG_CTRL_DSTRT | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
+       ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_HALFWORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
 
        // Wait for DSTRT to Clear
        do {
-               ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-               mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       } while(ctrl_reg & EJTAG_CTRL_DSTRT);
+               ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl;
+               mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       } while(ejtag_ctrl & EJTAG_CTRL_DSTRT);
 
        // Read Data
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA, NULL);
 
        // Clear DMA & Check DERR
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       if (ctrl_reg  & EJTAG_CTRL_DERR)
+       ejtag_ctrl = ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       if (ejtag_ctrl  & EJTAG_CTRL_DERR)
        {
                if (retries--) {
                        printf("DMA Read Addr = %08x  Data = ERROR ON READ (retrying)\n", addr);
 static int ejtag_dma_read_b(mips_ejtag_t *ejtag_info, u32 addr, u8 *data)
 {
        u32 v;
-       u32 ctrl_reg;
+       u32 ejtag_ctrl;
        int   retries = RETRY_ATTEMPTS;
 
 begin_ejtag_dma_read_b:
 
        // Initiate DMA Read & set DSTRT
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_BYTE | EJTAG_CTRL_DSTRT | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
+       ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_BYTE | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
 
        // Wait for DSTRT to Clear
        do {
-               ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-               mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       } while(ctrl_reg & EJTAG_CTRL_DSTRT);
+               ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl;
+               mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       } while(ejtag_ctrl & EJTAG_CTRL_DSTRT);
 
        // Read Data
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA, NULL);
 
        // Clear DMA & Check DERR
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       if (ctrl_reg  & EJTAG_CTRL_DERR)
+       ejtag_ctrl = ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       if (ejtag_ctrl  & EJTAG_CTRL_DERR)
        {
                if (retries--) {
                        printf("DMA Read Addr = %08x  Data = ERROR ON READ (retrying)\n", addr);
 static int ejtag_dma_write(mips_ejtag_t *ejtag_info, u32 addr, u32 data)
 {
        u32 v;
-       u32 ctrl_reg;
+       u32 ejtag_ctrl;
        int   retries = RETRY_ATTEMPTS;
 
 begin_ejtag_dma_write:
 
        // Initiate DMA Write & set DSTRT
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
+       ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
 
        // Wait for DSTRT to Clear
        do {
-               ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-               mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       } while(ctrl_reg & EJTAG_CTRL_DSTRT);
+               ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl;
+               mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       } while(ejtag_ctrl & EJTAG_CTRL_DSTRT);
 
        // Clear DMA & Check DERR
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       if (ctrl_reg  & EJTAG_CTRL_DERR)
+       ejtag_ctrl = ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       if (ejtag_ctrl  & EJTAG_CTRL_DERR)
        {
                if (retries--) {
                        printf("DMA Write Addr = %08x  Data = ERROR ON WRITE (retrying)\n", addr);
 static int ejtag_dma_write_h(mips_ejtag_t *ejtag_info, u32 addr, u32 data)
 {
        u32 v;
-       u32 ctrl_reg;
+       u32 ejtag_ctrl;
        int   retries = RETRY_ATTEMPTS;
 
 
 
        // Initiate DMA Write & set DSTRT
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_HALFWORD | EJTAG_CTRL_DSTRT | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
+       ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_HALFWORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
 
        // Wait for DSTRT to Clear
        do {
-               ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-               mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       } while(ctrl_reg & EJTAG_CTRL_DSTRT);
+               ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl;
+               mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       } while(ejtag_ctrl & EJTAG_CTRL_DSTRT);
 
        // Clear DMA & Check DERR
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       if (ctrl_reg  & EJTAG_CTRL_DERR)
+       ejtag_ctrl = ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       if (ejtag_ctrl  & EJTAG_CTRL_DERR)
        {
                if (retries--) {
                        printf("DMA Write Addr = %08x  Data = ERROR ON WRITE (retrying)\n", addr);
 static int ejtag_dma_write_b(mips_ejtag_t *ejtag_info, u32 addr, u32 data)
 {
        u32 v;
-       u32 ctrl_reg;
+       u32 ejtag_ctrl;
        int   retries = RETRY_ATTEMPTS;
 
 
 
        // Initiate DMA Write & set DSTRT
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_BYTE | EJTAG_CTRL_DSTRT | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
+       ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_BYTE | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
 
        // Wait for DSTRT to Clear
        do {
-               ctrl_reg = EJTAG_CTRL_DMAACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-               mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       } while(ctrl_reg & EJTAG_CTRL_DSTRT);
+               ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl;
+               mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       } while(ejtag_ctrl & EJTAG_CTRL_DSTRT);
 
        // Clear DMA & Check DERR
        mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-       ctrl_reg = EJTAG_CTRL_PROBEN | EJTAG_CTRL_PRACC;
-       mips_ejtag_drscan_32(ejtag_info, &ctrl_reg);
-       if (ctrl_reg  & EJTAG_CTRL_DERR)
+       ejtag_ctrl = ejtag_info->ejtag_ctrl;
+       mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
+       if (ejtag_ctrl  & EJTAG_CTRL_DERR)
        {
                if (retries--) {
                        printf("DMA Write Addr = %08x  Data = ERROR ON WRITE (retrying)\n", addr);
 
        while (1) 
        {
                mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
-               ejtag_ctrl = EJTAG_CTRL_ROCC | EJTAG_CTRL_PRACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_SETDEV;
+               ejtag_ctrl = ejtag_info->ejtag_ctrl;
                mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
                if (ejtag_ctrl & EJTAG_CTRL_PRACC)
                        break;
 
 static int mips32_pracc_exec_read(mips32_pracc_context *ctx, u32 address)
 {
+       mips_ejtag_t *ejtag_info = ctx->ejtag_info;
        int offset;
-       u32 ctrl, data;
+       u32 ejtag_ctrl, data;
 
        if ((address >= MIPS32_PRACC_PARAM_IN)
                && (address <= MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4))
        mips_ejtag_drscan_32(ctx->ejtag_info, &data);
 
        /* Clear the access pending bit (let the processor eat!) */
-       ctrl = EJTAG_CTRL_ROCC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_SETDEV;
+       ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC;
        mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL, NULL);
-       mips_ejtag_drscan_32(ctx->ejtag_info, &ctrl);
+       mips_ejtag_drscan_32(ctx->ejtag_info, &ejtag_ctrl);
        
        return ERROR_OK;
 }
 
 static int mips32_pracc_exec_write(mips32_pracc_context *ctx, u32 address)
 {
-       u32 ctrl,data;
+       u32 ejtag_ctrl,data;
        int offset;
+       mips_ejtag_t *ejtag_info = ctx->ejtag_info;
        
        mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA, NULL);
        mips_ejtag_drscan_32(ctx->ejtag_info, &data);
        
        /* Clear access pending bit */
-       ctrl = EJTAG_CTRL_ROCC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_SETDEV;
+       ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC;
        mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL, NULL);
-       mips_ejtag_drscan_32(ctx->ejtag_info, &ctrl);
+       mips_ejtag_drscan_32(ctx->ejtag_info, &ejtag_ctrl);
        
        if ((address >= MIPS32_PRACC_PARAM_IN)
                && (address <= MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4))
 
 int mips32_pracc_exec( mips_ejtag_t *ejtag_info, int code_len, u32 *code, int num_param_in, u32 *param_in, int num_param_out, u32 *param_out, int cycle)
 {
-       u32 ctrl;
+       u32 ejtag_ctrl;
        u32 address, data;
        mips32_pracc_context ctx;
        int retval;
        
        while (1)
        {
-               if ((retval = wait_for_pracc_rw(ejtag_info, &ctrl)) != ERROR_OK)
+               if ((retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl)) != ERROR_OK)
                        return retval;
                
                address = data = 0;
                mips_ejtag_drscan_32(ejtag_info, &address);
                
                /* Check for read or write */
-               if (ctrl & EJTAG_CTRL_PRNW)
+               if (ejtag_ctrl & EJTAG_CTRL_PRNW)
                {
                        if ((retval = mips32_pracc_exec_write(&ctx, address)) != ERROR_OK)
                                return retval;