URET uffs_InitDevice(uffs_Device *dev) { URET ret; ret = uffs_InitDeviceConfig(dev); if (ret != U_SUCC) return U_FAIL; if (dev->mem.init) { if (dev->mem.init(dev) != U_SUCC) { uffs_Perror(UFFS_MSG_SERIOUS, "Init memory allocator fail."); return U_FAIL; } } memset(&(dev->st), 0, sizeof(uffs_FlashStat)); uffs_DeviceInitLock(dev); uffs_BadBlockInit(dev); if (uffs_FlashInterfaceInit(dev) != U_SUCC) { uffs_Perror(UFFS_MSG_SERIOUS, "Can't initialize flash interface !"); goto fail; } uffs_Perror(UFFS_MSG_NOISY, "init page buf"); ret = uffs_BufInit(dev, dev->cfg.page_buffers, dev->cfg.dirty_pages); if (ret != U_SUCC) { uffs_Perror(UFFS_MSG_DEAD, "Initialize page buffers fail"); goto fail; } uffs_Perror(UFFS_MSG_NOISY, "init block info cache"); ret = uffs_BlockInfoInitCache(dev, dev->cfg.bc_caches); if (ret != U_SUCC) { uffs_Perror(UFFS_MSG_DEAD, "Initialize block info fail"); goto fail; } ret = uffs_TreeInit(dev); if (ret != U_SUCC) { uffs_Perror(UFFS_MSG_SERIOUS, "fail to init tree buffers"); goto fail; } ret = uffs_BuildTree(dev); if (ret != U_SUCC) { uffs_Perror(UFFS_MSG_SERIOUS, "fail to build tree"); goto fail; } return U_SUCC; fail: uffs_DeviceReleaseLock(dev); return U_FAIL; }
URET uffs_InitDevice(uffs_Device *dev) { URET ret; if (dev->mem.init) { if (dev->mem.init(dev) != U_SUCC) { uffs_Perror(UFFS_ERR_SERIOUS, "Init memory allocator fail."); return U_FAIL; } } memset(&(dev->st), 0, sizeof(uffs_FlashStat)); uffs_DeviceInitLock(dev); uffs_BadBlockInit(dev); if (uffs_FlashInterfaceInit(dev) != U_SUCC) { uffs_Perror(UFFS_ERR_SERIOUS, "Can't initialize flash interface !"); goto fail; } uffs_Perror(UFFS_ERR_NOISY, "init page buf"); ret = uffs_BufInit(dev, MAX_PAGE_BUFFERS, MAX_DIRTY_PAGES_IN_A_BLOCK); if (ret != U_SUCC) { uffs_Perror(UFFS_ERR_DEAD, "Initialize page buffers fail"); goto fail; } uffs_Perror(UFFS_ERR_NOISY, "init block info cache"); ret = uffs_BlockInfoInitCache(dev, MAX_CACHED_BLOCK_INFO); if (ret != U_SUCC) { uffs_Perror(UFFS_ERR_DEAD, "Initialize block info fail"); goto fail; } ret = uffs_TreeInit(dev); if (ret != U_SUCC) { uffs_Perror(UFFS_ERR_SERIOUS, "fail to init tree buffers"); goto fail; } ret = uffs_BuildTree(dev); if (ret != U_SUCC) { uffs_Perror(UFFS_ERR_SERIOUS, "fail to build tree"); goto fail; } return U_SUCC; fail: uffs_DeviceReleaseLock(dev); return U_FAIL; }
URET uffs_FormatDevice(uffs_Device *dev, UBOOL force) { u16 i, slot; URET ret = U_SUCC; if (dev == NULL) return U_FAIL; if (dev->ops == NULL) return U_FAIL; uffs_GlobalFsLockLock(); ret = uffs_BufFlushAll(dev); if (dev->ref_count > 1 && !force) { uffs_Perror(UFFS_MSG_NORMAL, "can't format when dev->ref_count = %d", dev->ref_count); ret = U_FAIL; } if (ret == U_SUCC && force) { uffs_DirEntryBufPutAll(dev); uffs_PutAllObjectBuf(dev); uffs_FdSignatureIncrease(); } if (ret == U_SUCC && uffs_BufIsAllFree(dev) == U_FALSE && !force) { uffs_Perror(UFFS_MSG_NORMAL, "some page still in used!"); ret = U_FAIL; } if (!force) { for (slot = 0; ret == U_SUCC && slot < dev->cfg.dirty_groups; slot++) { if (dev->buf.dirtyGroup[slot].count > 0) { uffs_Perror(UFFS_MSG_SERIOUS, "there still have dirty pages!"); ret = U_FAIL; } } } if (ret == U_SUCC) uffs_BufSetAllEmpty(dev); if (ret == U_SUCC && uffs_BlockInfoIsAllFree(dev) == U_FALSE && !force) { uffs_Perror(UFFS_MSG_NORMAL, "there still have block info cache ? fail to format"); ret = U_FAIL; } if (ret == U_SUCC) uffs_BlockInfoExpireAll(dev); for (i = dev->par.start; ret == U_SUCC && i <= dev->par.end; i++) { if (uffs_FlashIsBadBlock(dev, i) == U_FALSE) { uffs_FlashEraseBlock(dev, i); if (HAVE_BADBLOCK(dev)) uffs_BadBlockProcess(dev, NULL); } else { #ifdef CONFIG_ENABLE_BAD_BLOCK_VERIFY _ForceFormatAndCheckBlock(dev, i); #endif } } if (ret == U_SUCC && uffs_TreeRelease(dev) == U_FAIL) { ret = U_FAIL; } if (ret == U_SUCC && uffs_TreeInit(dev) == U_FAIL) { ret = U_FAIL; } if (ret == U_SUCC && uffs_BuildTree(dev) == U_FAIL) { ret = U_FAIL; } uffs_GlobalFsLockUnlock(); return ret; }