diff options
Diffstat (limited to 'drivers/mtd/ssfdc.c')
-rw-r--r-- | drivers/mtd/ssfdc.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/drivers/mtd/ssfdc.c b/drivers/mtd/ssfdc.c index ddbf015f4119..cf60a5e87f19 100644 --- a/drivers/mtd/ssfdc.c +++ b/drivers/mtd/ssfdc.c | |||
@@ -10,7 +10,6 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/config.h> | ||
14 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
15 | #include <linux/module.h> | 14 | #include <linux/module.h> |
16 | #include <linux/init.h> | 15 | #include <linux/init.h> |
@@ -29,7 +28,7 @@ struct ssfdcr_record { | |||
29 | int cis_block; /* block n. containing CIS/IDI */ | 28 | int cis_block; /* block n. containing CIS/IDI */ |
30 | int erase_size; /* phys_block_size */ | 29 | int erase_size; /* phys_block_size */ |
31 | unsigned short *logic_block_map; /* all zones (max 8192 phys blocks on | 30 | unsigned short *logic_block_map; /* all zones (max 8192 phys blocks on |
32 | the 128MB) */ | 31 | the 128MiB) */ |
33 | int map_len; /* n. phys_blocks on the card */ | 32 | int map_len; /* n. phys_blocks on the card */ |
34 | }; | 33 | }; |
35 | 34 | ||
@@ -43,11 +42,11 @@ struct ssfdcr_record { | |||
43 | #define MAX_LOGIC_BLK_PER_ZONE 1000 | 42 | #define MAX_LOGIC_BLK_PER_ZONE 1000 |
44 | #define MAX_PHYS_BLK_PER_ZONE 1024 | 43 | #define MAX_PHYS_BLK_PER_ZONE 1024 |
45 | 44 | ||
46 | #define KB(x) ( (x) * 1024L ) | 45 | #define KiB(x) ( (x) * 1024L ) |
47 | #define MB(x) ( KB(x) * 1024L ) | 46 | #define MiB(x) ( KiB(x) * 1024L ) |
48 | 47 | ||
49 | /** CHS Table | 48 | /** CHS Table |
50 | 1MB 2MB 4MB 8MB 16MB 32MB 64MB 128MB | 49 | 1MiB 2MiB 4MiB 8MiB 16MiB 32MiB 64MiB 128MiB |
51 | NCylinder 125 125 250 250 500 500 500 500 | 50 | NCylinder 125 125 250 250 500 500 500 500 |
52 | NHead 4 4 4 4 4 8 8 16 | 51 | NHead 4 4 4 4 4 8 8 16 |
53 | NSector 4 8 8 16 16 16 32 32 | 52 | NSector 4 8 8 16 16 16 32 32 |
@@ -64,14 +63,14 @@ typedef struct { | |||
64 | 63 | ||
65 | /* Must be ordered by size */ | 64 | /* Must be ordered by size */ |
66 | static const chs_entry_t chs_table[] = { | 65 | static const chs_entry_t chs_table[] = { |
67 | { MB( 1), 125, 4, 4 }, | 66 | { MiB( 1), 125, 4, 4 }, |
68 | { MB( 2), 125, 4, 8 }, | 67 | { MiB( 2), 125, 4, 8 }, |
69 | { MB( 4), 250, 4, 8 }, | 68 | { MiB( 4), 250, 4, 8 }, |
70 | { MB( 8), 250, 4, 16 }, | 69 | { MiB( 8), 250, 4, 16 }, |
71 | { MB( 16), 500, 4, 16 }, | 70 | { MiB( 16), 500, 4, 16 }, |
72 | { MB( 32), 500, 8, 16 }, | 71 | { MiB( 32), 500, 8, 16 }, |
73 | { MB( 64), 500, 8, 32 }, | 72 | { MiB( 64), 500, 8, 32 }, |
74 | { MB(128), 500, 16, 32 }, | 73 | { MiB(128), 500, 16, 32 }, |
75 | { 0 }, | 74 | { 0 }, |
76 | }; | 75 | }; |
77 | 76 | ||
@@ -109,14 +108,19 @@ static int get_valid_cis_sector(struct mtd_info *mtd) | |||
109 | int ret, k, cis_sector; | 108 | int ret, k, cis_sector; |
110 | size_t retlen; | 109 | size_t retlen; |
111 | loff_t offset; | 110 | loff_t offset; |
112 | uint8_t sect_buf[SECTOR_SIZE]; | 111 | uint8_t *sect_buf; |
112 | |||
113 | cis_sector = -1; | ||
114 | |||
115 | sect_buf = kmalloc(SECTOR_SIZE, GFP_KERNEL); | ||
116 | if (!sect_buf) | ||
117 | goto out; | ||
113 | 118 | ||
114 | /* | 119 | /* |
115 | * Look for CIS/IDI sector on the first GOOD block (give up after 4 bad | 120 | * Look for CIS/IDI sector on the first GOOD block (give up after 4 bad |
116 | * blocks). If the first good block doesn't contain CIS number the flash | 121 | * blocks). If the first good block doesn't contain CIS number the flash |
117 | * is not SSFDC formatted | 122 | * is not SSFDC formatted |
118 | */ | 123 | */ |
119 | cis_sector = -1; | ||
120 | for (k = 0, offset = 0; k < 4; k++, offset += mtd->erasesize) { | 124 | for (k = 0, offset = 0; k < 4; k++, offset += mtd->erasesize) { |
121 | if (!mtd->block_isbad(mtd, offset)) { | 125 | if (!mtd->block_isbad(mtd, offset)) { |
122 | ret = mtd->read(mtd, offset, SECTOR_SIZE, &retlen, | 126 | ret = mtd->read(mtd, offset, SECTOR_SIZE, &retlen, |
@@ -140,6 +144,8 @@ static int get_valid_cis_sector(struct mtd_info *mtd) | |||
140 | } | 144 | } |
141 | } | 145 | } |
142 | 146 | ||
147 | kfree(sect_buf); | ||
148 | out: | ||
143 | return cis_sector; | 149 | return cis_sector; |
144 | } | 150 | } |
145 | 151 | ||