}
 }
 
-static unsigned long cudbg_mem_region_size(struct cudbg_init *pdbg_init,
-                                          struct cudbg_error *cudbg_err,
-                                          u8 mem_type)
+static int cudbg_mem_region_size(struct cudbg_init *pdbg_init,
+                                struct cudbg_error *cudbg_err,
+                                u8 mem_type, unsigned long *region_size)
 {
        struct adapter *padap = pdbg_init->adap;
        struct cudbg_meminfo mem_info;
 
        memset(&mem_info, 0, sizeof(struct cudbg_meminfo));
        rc = cudbg_fill_meminfo(padap, &mem_info);
-       if (rc)
+       if (rc) {
+               cudbg_err->sys_err = rc;
                return rc;
+       }
 
        cudbg_t4_fwcache(pdbg_init, cudbg_err);
        rc = cudbg_meminfo_get_mem_index(padap, &mem_info, mem_type, &mc_idx);
-       if (rc)
+       if (rc) {
+               cudbg_err->sys_err = rc;
                return rc;
+       }
+
+       if (region_size)
+               *region_size = mem_info.avail[mc_idx].limit -
+                              mem_info.avail[mc_idx].base;
 
-       return mem_info.avail[mc_idx].limit - mem_info.avail[mc_idx].base;
+       return 0;
 }
 
 static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init,
                                    struct cudbg_error *cudbg_err,
                                    u8 mem_type)
 {
-       unsigned long size = cudbg_mem_region_size(pdbg_init, cudbg_err, mem_type);
+       unsigned long size = 0;
+       int rc;
+
+       rc = cudbg_mem_region_size(pdbg_init, cudbg_err, mem_type, &size);
+       if (rc)
+               return rc;
 
        return cudbg_read_fw_mem(pdbg_init, dbg_buff, mem_type, size,
                                 cudbg_err);