提交 1ab9dd09 编写于 作者: L Linus Torvalds

Merge git://git.infradead.org/mtd-2.6

* git://git.infradead.org/mtd-2.6:
  [MTD] Whitespace cleanup in SSFDC driver.
  [MTD] SSFDC translation layer minor cleanup
  [MTD] Fix dependencies with CONFIG_MTD=m
...@@ -101,7 +101,7 @@ config MTD_REDBOOT_PARTS_READONLY ...@@ -101,7 +101,7 @@ config MTD_REDBOOT_PARTS_READONLY
config MTD_CMDLINE_PARTS config MTD_CMDLINE_PARTS
bool "Command line partition table parsing" bool "Command line partition table parsing"
depends on MTD_PARTITIONS = "y" depends on MTD_PARTITIONS = "y" && MTD = "y"
---help--- ---help---
Allow generic configuration of the MTD partition tables via the kernel Allow generic configuration of the MTD partition tables via the kernel
command line. Multiple flash resources are supported for hardware where command line. Multiple flash resources are supported for hardware where
...@@ -264,7 +264,7 @@ config RFD_FTL ...@@ -264,7 +264,7 @@ config RFD_FTL
http://www.gensw.com/pages/prod/bios/rfd.htm http://www.gensw.com/pages/prod/bios/rfd.htm
config SSFDC config SSFDC
bool "NAND SSFDC (SmartMedia) read only translation layer" tristate "NAND SSFDC (SmartMedia) read only translation layer"
depends on MTD depends on MTD
default n default n
help help
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -29,7 +28,7 @@ struct ssfdcr_record { ...@@ -29,7 +28,7 @@ struct ssfdcr_record {
int cis_block; /* block n. containing CIS/IDI */ int cis_block; /* block n. containing CIS/IDI */
int erase_size; /* phys_block_size */ int erase_size; /* phys_block_size */
unsigned short *logic_block_map; /* all zones (max 8192 phys blocks on unsigned short *logic_block_map; /* all zones (max 8192 phys blocks on
the 128MB) */ the 128MiB) */
int map_len; /* n. phys_blocks on the card */ int map_len; /* n. phys_blocks on the card */
}; };
...@@ -43,11 +42,11 @@ struct ssfdcr_record { ...@@ -43,11 +42,11 @@ struct ssfdcr_record {
#define MAX_LOGIC_BLK_PER_ZONE 1000 #define MAX_LOGIC_BLK_PER_ZONE 1000
#define MAX_PHYS_BLK_PER_ZONE 1024 #define MAX_PHYS_BLK_PER_ZONE 1024
#define KB(x) ( (x) * 1024L ) #define KiB(x) ( (x) * 1024L )
#define MB(x) ( KB(x) * 1024L ) #define MiB(x) ( KiB(x) * 1024L )
/** CHS Table /** CHS Table
1MB 2MB 4MB 8MB 16MB 32MB 64MB 128MB 1MiB 2MiB 4MiB 8MiB 16MiB 32MiB 64MiB 128MiB
NCylinder 125 125 250 250 500 500 500 500 NCylinder 125 125 250 250 500 500 500 500
NHead 4 4 4 4 4 8 8 16 NHead 4 4 4 4 4 8 8 16
NSector 4 8 8 16 16 16 32 32 NSector 4 8 8 16 16 16 32 32
...@@ -64,14 +63,14 @@ typedef struct { ...@@ -64,14 +63,14 @@ typedef struct {
/* Must be ordered by size */ /* Must be ordered by size */
static const chs_entry_t chs_table[] = { static const chs_entry_t chs_table[] = {
{ MB( 1), 125, 4, 4 }, { MiB( 1), 125, 4, 4 },
{ MB( 2), 125, 4, 8 }, { MiB( 2), 125, 4, 8 },
{ MB( 4), 250, 4, 8 }, { MiB( 4), 250, 4, 8 },
{ MB( 8), 250, 4, 16 }, { MiB( 8), 250, 4, 16 },
{ MB( 16), 500, 4, 16 }, { MiB( 16), 500, 4, 16 },
{ MB( 32), 500, 8, 16 }, { MiB( 32), 500, 8, 16 },
{ MB( 64), 500, 8, 32 }, { MiB( 64), 500, 8, 32 },
{ MB(128), 500, 16, 32 }, { MiB(128), 500, 16, 32 },
{ 0 }, { 0 },
}; };
...@@ -109,25 +108,30 @@ static int get_valid_cis_sector(struct mtd_info *mtd) ...@@ -109,25 +108,30 @@ static int get_valid_cis_sector(struct mtd_info *mtd)
int ret, k, cis_sector; int ret, k, cis_sector;
size_t retlen; size_t retlen;
loff_t offset; loff_t offset;
uint8_t sect_buf[SECTOR_SIZE]; uint8_t *sect_buf;
cis_sector = -1;
sect_buf = kmalloc(SECTOR_SIZE, GFP_KERNEL);
if (!sect_buf)
goto out;
/* /*
* Look for CIS/IDI sector on the first GOOD block (give up after 4 bad * Look for CIS/IDI sector on the first GOOD block (give up after 4 bad
* blocks). If the first good block doesn't contain CIS number the flash * blocks). If the first good block doesn't contain CIS number the flash
* is not SSFDC formatted * is not SSFDC formatted
*/ */
cis_sector = -1;
for (k = 0, offset = 0; k < 4; k++, offset += mtd->erasesize) { for (k = 0, offset = 0; k < 4; k++, offset += mtd->erasesize) {
if (!mtd->block_isbad(mtd, offset)) { if (!mtd->block_isbad(mtd, offset)) {
ret = mtd->read(mtd, offset, SECTOR_SIZE, &retlen, ret = mtd->read(mtd, offset, SECTOR_SIZE, &retlen,
sect_buf); sect_buf);
/* CIS pattern match on the sector buffer */ /* CIS pattern match on the sector buffer */
if ( ret < 0 || retlen != SECTOR_SIZE ) { if (ret < 0 || retlen != SECTOR_SIZE) {
printk(KERN_WARNING printk(KERN_WARNING
"SSFDC_RO:can't read CIS/IDI sector\n"); "SSFDC_RO:can't read CIS/IDI sector\n");
} else if ( !memcmp(sect_buf, cis_numbers, } else if (!memcmp(sect_buf, cis_numbers,
sizeof(cis_numbers)) ) { sizeof(cis_numbers))) {
/* Found */ /* Found */
cis_sector = (int)(offset >> SECTOR_SHIFT); cis_sector = (int)(offset >> SECTOR_SHIFT);
} else { } else {
...@@ -140,6 +144,8 @@ static int get_valid_cis_sector(struct mtd_info *mtd) ...@@ -140,6 +144,8 @@ static int get_valid_cis_sector(struct mtd_info *mtd)
} }
} }
kfree(sect_buf);
out:
return cis_sector; return cis_sector;
} }
...@@ -227,7 +233,7 @@ static int get_logical_address(uint8_t *oob_buf) ...@@ -227,7 +233,7 @@ static int get_logical_address(uint8_t *oob_buf)
} }
} }
if ( !ok ) if (!ok)
block_address = -2; block_address = -2;
DEBUG(MTD_DEBUG_LEVEL3, "SSFDC_RO: get_logical_address() %d\n", DEBUG(MTD_DEBUG_LEVEL3, "SSFDC_RO: get_logical_address() %d\n",
...@@ -245,8 +251,8 @@ static int build_logical_block_map(struct ssfdcr_record *ssfdc) ...@@ -245,8 +251,8 @@ static int build_logical_block_map(struct ssfdcr_record *ssfdc)
struct mtd_info *mtd = ssfdc->mbd.mtd; struct mtd_info *mtd = ssfdc->mbd.mtd;
DEBUG(MTD_DEBUG_LEVEL1, "SSFDC_RO: build_block_map() nblks=%d (%luK)\n", DEBUG(MTD_DEBUG_LEVEL1, "SSFDC_RO: build_block_map() nblks=%d (%luK)\n",
ssfdc->map_len, (unsigned long)ssfdc->map_len * ssfdc->map_len,
ssfdc->erase_size / 1024 ); (unsigned long)ssfdc->map_len * ssfdc->erase_size / 1024);
/* Scan every physical block, skip CIS block */ /* Scan every physical block, skip CIS block */
for (phys_block = ssfdc->cis_block + 1; phys_block < ssfdc->map_len; for (phys_block = ssfdc->cis_block + 1; phys_block < ssfdc->map_len;
...@@ -323,20 +329,20 @@ static void ssfdcr_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) ...@@ -323,20 +329,20 @@ static void ssfdcr_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
/* Set geometry */ /* Set geometry */
ssfdc->heads = 16; ssfdc->heads = 16;
ssfdc->sectors = 32; ssfdc->sectors = 32;
get_chs( mtd->size, NULL, &ssfdc->heads, &ssfdc->sectors); get_chs(mtd->size, NULL, &ssfdc->heads, &ssfdc->sectors);
ssfdc->cylinders = (unsigned short)((mtd->size >> SECTOR_SHIFT) / ssfdc->cylinders = (unsigned short)((mtd->size >> SECTOR_SHIFT) /
((long)ssfdc->sectors * (long)ssfdc->heads)); ((long)ssfdc->sectors * (long)ssfdc->heads));
DEBUG(MTD_DEBUG_LEVEL1, "SSFDC_RO: using C:%d H:%d S:%d == %ld sects\n", DEBUG(MTD_DEBUG_LEVEL1, "SSFDC_RO: using C:%d H:%d S:%d == %ld sects\n",
ssfdc->cylinders, ssfdc->heads , ssfdc->sectors, ssfdc->cylinders, ssfdc->heads , ssfdc->sectors,
(long)ssfdc->cylinders * (long)ssfdc->heads * (long)ssfdc->cylinders * (long)ssfdc->heads *
(long)ssfdc->sectors ); (long)ssfdc->sectors);
ssfdc->mbd.size = (long)ssfdc->heads * (long)ssfdc->cylinders * ssfdc->mbd.size = (long)ssfdc->heads * (long)ssfdc->cylinders *
(long)ssfdc->sectors; (long)ssfdc->sectors;
/* Allocate logical block map */ /* Allocate logical block map */
ssfdc->logic_block_map = kmalloc( sizeof(ssfdc->logic_block_map[0]) * ssfdc->logic_block_map = kmalloc(sizeof(ssfdc->logic_block_map[0]) *
ssfdc->map_len, GFP_KERNEL); ssfdc->map_len, GFP_KERNEL);
if (!ssfdc->logic_block_map) { if (!ssfdc->logic_block_map) {
printk(KERN_WARNING printk(KERN_WARNING
...@@ -408,7 +414,7 @@ static int ssfdcr_readsect(struct mtd_blktrans_dev *dev, ...@@ -408,7 +414,7 @@ static int ssfdcr_readsect(struct mtd_blktrans_dev *dev,
"SSFDC_RO: ssfdcr_readsect() phys_sect_no=%lu\n", "SSFDC_RO: ssfdcr_readsect() phys_sect_no=%lu\n",
sect_no); sect_no);
if (read_physical_sector( ssfdc->mbd.mtd, buf, sect_no ) < 0) if (read_physical_sector(ssfdc->mbd.mtd, buf, sect_no) < 0)
return -EIO; return -EIO;
} else { } else {
memset(buf, 0xff, SECTOR_SIZE); memset(buf, 0xff, SECTOR_SIZE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册