static void qc_dload_task(unsigned long data) { struct dpram_link_device *dpld = (struct dpram_link_device *)data; dpld->udl_check.send_size += dpld->udl_param.size; dpld->udl_check.rest_size -= dpld->udl_param.size; dpld->udl_param.addr += dpld->udl_param.size; if (dpld->udl_check.send_size >= dpld->udl_check.total_size) { dpld->udl_check.copy_complete = 1; dpld->udl_param.tag = 0; return; } if (dpld->udl_check.rest_size < dpld->dpctl->max_boot_frame_size) dpld->udl_param.size = dpld->udl_check.rest_size; dpld->udl_param.count += 1; _qc_do_download(dpld, &dpld->udl_param); }
static void qc_dload_task(unsigned long data) { struct pld_link_device *pld = (struct pld_link_device *)data; pld->udl_check.send_size += pld->udl_param.size; pld->udl_check.rest_size -= pld->udl_param.size; pld->udl_param.addr += pld->udl_param.size; if (pld->udl_check.send_size >= pld->udl_check.total_size) { pld->udl_check.copy_complete = 1; pld->udl_param.tag = 0; return; } if (pld->udl_check.rest_size < pld->dpctl->max_boot_frame_size) pld->udl_param.size = pld->udl_check.rest_size; pld->udl_param.count += 1; _qc_do_download(pld, &pld->udl_param); }
static int _qc_download(struct dpram_link_device *dpld, void *arg, enum qc_dload_tag tag) { int retval = 0; int count = 0; int cnt_limit; unsigned char *img; struct dpram_udl_param param; retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); if (retval < 0) { mif_err("ERR! copy_from_user fail\n"); return -1; } img = vmalloc(param.size); if (!img) { mif_err("ERR! vmalloc fail\n"); return -1; } memset(img, 0, param.size); memcpy(img, param.addr, param.size); dpld->udl_check.total_size = param.size; dpld->udl_check.rest_size = param.size; dpld->udl_check.send_size = 0; dpld->udl_check.copy_complete = 0; dpld->udl_param.addr = img; dpld->udl_param.size = dpld->dpctl->max_boot_frame_size; if (tag == QC_DLOAD_TAG_NV) dpld->udl_param.count = 1; else dpld->udl_param.count = param.count; dpld->udl_param.tag = tag; if (dpld->udl_check.rest_size < dpld->dpctl->max_boot_frame_size) dpld->udl_param.size = dpld->udl_check.rest_size; /* Download image (binary or NV) */ _qc_do_download(dpld, &dpld->udl_param); /* Wait for completion */ if (tag == QC_DLOAD_TAG_NV) cnt_limit = 200; else cnt_limit = 1000; while (1) { if (dpld->udl_check.copy_complete) { dpld->udl_check.copy_complete = 0; retval = 0; break; } msleep(10); count++; if (count > cnt_limit) { dpld->udl_check.total_size = 0; dpld->udl_check.rest_size = 0; mif_err("ERR! count %d\n", count); retval = -1; break; } } vfree(img); return retval; }