Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329068
b: refs/heads/master
c: 95e6fb0
h: refs/heads/master
v: v3
  • Loading branch information
Richard Genoud authored and Artem Bityutskiy committed Sep 4, 2012
1 parent 69f1691 commit 0d67451
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 60a387dc5ed7cf7e5fe68a9078d71f4819f3a697
refs/heads/master: 95e6fb027e041641baed441fcbd27c2f082c760e
54 changes: 31 additions & 23 deletions trunk/drivers/mtd/ubi/build.c
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,34 @@ void ubi_free_internal_volumes(struct ubi_device *ubi)
}
}

static int get_bad_peb_limit(const struct ubi_device *ubi, int max_beb_per1024)
{
int limit, device_pebs;
uint64_t device_size;

if (!max_beb_per1024)
return 0;

/*
* Here we are using size of the entire flash chip and
* not just the MTD partition size because the maximum
* number of bad eraseblocks is a percentage of the
* whole device and bad eraseblocks are not fairly
* distributed over the flash chip. So the worst case
* is that all the bad eraseblocks of the chip are in
* the MTD partition we are attaching (ubi->mtd).
*/
device_size = mtd_get_device_size(ubi->mtd);
device_pebs = mtd_div_by_eb(device_size, ubi->mtd);
limit = mult_frac(device_pebs, max_beb_per1024, 1024);

/* Round it up */
if (mult_frac(limit, 1024, max_beb_per1024) < device_pebs)
limit += 1;

return limit;
}

/**
* io_init - initialize I/O sub-system for a given UBI device.
* @ubi: UBI device description object
Expand All @@ -582,6 +610,8 @@ void ubi_free_internal_volumes(struct ubi_device *ubi)
*/
static int io_init(struct ubi_device *ubi)
{
const int max_beb_per1024 = CONFIG_MTD_UBI_BEB_LIMIT;

if (ubi->mtd->numeraseregions != 0) {
/*
* Some flashes have several erase regions. Different regions
Expand Down Expand Up @@ -610,29 +640,7 @@ static int io_init(struct ubi_device *ubi)

if (mtd_can_have_bb(ubi->mtd)) {
ubi->bad_allowed = 1;
if (CONFIG_MTD_UBI_BEB_LIMIT > 0) {
int per1024 = CONFIG_MTD_UBI_BEB_LIMIT;
int limit, device_pebs;
uint64_t device_size;

/*
* Here we are using size of the entire flash chip and
* not just the MTD partition size because the maximum
* number of bad eraseblocks is a percentage of the
* whole device and bad eraseblocks are not fairly
* distributed over the flash chip. So the worst case
* is that all the bad eraseblocks of the chip are in
* the MTD partition we are attaching (ubi->mtd).
*/
device_size = mtd_get_device_size(ubi->mtd);
device_pebs = mtd_div_by_eb(device_size, ubi->mtd);
limit = mult_frac(device_pebs, per1024, 1024);

/* Round it up */
if (mult_frac(limit, 1024, per1024) < device_pebs)
limit += 1;
ubi->bad_peb_limit = limit;
}
ubi->bad_peb_limit = get_bad_peb_limit(ubi, max_beb_per1024);
}

if (ubi->mtd->type == MTD_NORFLASH) {
Expand Down

0 comments on commit 0d67451

Please sign in to comment.