/* TODO remove array */
        uint32_t *param_out = malloc(count * sizeof(uint32_t));
-       int i;
+       if (param_out == NULL) {
+               LOG_ERROR("Out of memory");
+               return ERROR_FAIL;
+       }
 
        int retval = ERROR_OK;
        int blocksize;
+       int hwordsread = 0;
        uint32_t param_in[2];
 
-       /*while (count > 0) */
-       {
+       while (count > 0) {
                blocksize = count;
                if (count > 0x400)
                        blocksize = 0x400;
                param_in[1] = blocksize;
 
                retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code,
-                       ARRAY_SIZE(param_in), param_in, count, param_out, 1);
+                       ARRAY_SIZE(param_in), param_in, blocksize, ¶m_out[hwordsread], 1);
+
+               if (retval != ERROR_OK)
+                       return retval;
 
-/*             count -= blocksize; */
-/*             addr += blocksize; */
+               count -= blocksize;
+               addr += blocksize*sizeof(uint16_t);
+               hwordsread += blocksize;
        }
 
-       for (i = 0; i < count; i++)
+       int i;
+       for (i = 0; i < hwordsread; i++)
                buf[i] = param_out[i];
 
        free(param_out);
-
        return retval;
 }
 
 
        /* TODO remove array */
        uint32_t *param_out = malloc(count * sizeof(uint32_t));
-       int i;
+       if (param_out == NULL) {
+               LOG_ERROR("Out of memory");
+               return ERROR_FAIL;
+       }
 
        int retval = ERROR_OK;
        int blocksize;
        uint32_t param_in[2];
+       int bytesread = 0;
 
-/*     while (count > 0) */
-       {
+       while (count > 0) {
                blocksize = count;
                if (count > 0x400)
                        blocksize = 0x400;
                param_in[1] = blocksize;
 
                retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code,
-                       ARRAY_SIZE(param_in), param_in, count, param_out, 1);
+                       ARRAY_SIZE(param_in), param_in, count, ¶m_out[bytesread], 1);
 
-/*             count -= blocksize; */
-/*             addr += blocksize; */
-       }
+               if (retval != ERROR_OK)
+                       return retval;
 
-       for (i = 0; i < count; i++)
+               count -= blocksize;
+               addr += blocksize;
+               bytesread += blocksize;
+       }
+       int i;
+       for (i = 0; i < bytesread; i++)
                buf[i] = param_out[i];
 
        free(param_out);
-
        return retval;
 }