|
@@ -778,7 +778,7 @@ static int ums_read_sector(struct ums *ums_dev,
|
|
|
ulong start, lbaint_t blkcnt, void *buf)
|
|
|
{
|
|
|
block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev;
|
|
|
- lbaint_t blkstart = start + ums_dev->offset;
|
|
|
+ lbaint_t blkstart = start + ums_dev->start_sector;
|
|
|
int dev_num = block_dev->dev;
|
|
|
|
|
|
return block_dev->block_read(dev_num, blkstart, blkcnt, buf);
|
|
@@ -788,30 +788,47 @@ static int ums_write_sector(struct ums *ums_dev,
|
|
|
ulong start, lbaint_t blkcnt, const void *buf)
|
|
|
{
|
|
|
block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev;
|
|
|
- lbaint_t blkstart = start + ums_dev->offset;
|
|
|
+ lbaint_t blkstart = start + ums_dev->start_sector;
|
|
|
int dev_num = block_dev->dev;
|
|
|
|
|
|
return block_dev->block_write(dev_num, blkstart, blkcnt, buf);
|
|
|
}
|
|
|
|
|
|
-static void ums_get_capacity(struct ums *ums_dev, long long int *capacity)
|
|
|
-{
|
|
|
- long long int tmp_capacity;
|
|
|
-
|
|
|
- tmp_capacity = (long long int)((ums_dev->offset + ums_dev->part_size)
|
|
|
- * SECTOR_SIZE);
|
|
|
- *capacity = ums_dev->mmc->capacity - tmp_capacity;
|
|
|
-}
|
|
|
-
|
|
|
static struct ums ums_dev = {
|
|
|
.read_sector = ums_read_sector,
|
|
|
.write_sector = ums_write_sector,
|
|
|
- .get_capacity = ums_get_capacity,
|
|
|
.name = "UMS disk",
|
|
|
- .offset = UMS_START_SECTOR,
|
|
|
- .part_size = UMS_NUM_SECTORS,
|
|
|
};
|
|
|
|
|
|
+static struct ums *ums_disk_init(struct mmc *mmc)
|
|
|
+{
|
|
|
+ uint64_t mmc_end_sector = mmc->capacity / SECTOR_SIZE;
|
|
|
+ uint64_t ums_end_sector = UMS_NUM_SECTORS + UMS_START_SECTOR;
|
|
|
+
|
|
|
+ if (!mmc_end_sector) {
|
|
|
+ error("MMC capacity is not valid");
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ ums_dev.mmc = mmc;
|
|
|
+
|
|
|
+ if (ums_end_sector <= mmc_end_sector) {
|
|
|
+ ums_dev.start_sector = UMS_START_SECTOR;
|
|
|
+ if (UMS_NUM_SECTORS)
|
|
|
+ ums_dev.num_sectors = UMS_NUM_SECTORS;
|
|
|
+ else
|
|
|
+ ums_dev.num_sectors = mmc_end_sector - UMS_START_SECTOR;
|
|
|
+ } else {
|
|
|
+ ums_dev.num_sectors = mmc_end_sector;
|
|
|
+ puts("UMS: defined bad disk parameters. Using default.\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("UMS: disk start sector: %#x, count: %#x\n",
|
|
|
+ ums_dev.start_sector, ums_dev.num_sectors);
|
|
|
+
|
|
|
+ return &ums_dev;
|
|
|
+}
|
|
|
+
|
|
|
struct ums *ums_init(unsigned int dev_num)
|
|
|
{
|
|
|
struct mmc *mmc = NULL;
|
|
@@ -820,8 +837,6 @@ struct ums *ums_init(unsigned int dev_num)
|
|
|
if (!mmc)
|
|
|
return NULL;
|
|
|
|
|
|
- ums_dev.mmc = mmc;
|
|
|
-
|
|
|
- return &ums_dev;
|
|
|
+ return ums_disk_init(mmc);
|
|
|
}
|
|
|
#endif
|