diff options
| author | Pierre Ossman <drzeus@drzeus.cx> | 2007-09-19 12:42:16 -0400 |
|---|---|---|
| committer | Pierre Ossman <drzeus@drzeus.cx> | 2007-09-23 15:28:01 -0400 |
| commit | 759bdc7af450404382e937c76722ae8736daef92 (patch) | |
| tree | 6c605ba19762d0d0a0afd42f2b4f5d1da99ad90a /drivers/mmc/core | |
| parent | f9996aee36921e8f1d499de1b2ea380855cf6d97 (diff) | |
sdio: store vendor strings
Store vendor strings found in CISTPL_VERS_1 so that function drivers
can access them.
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc/core')
| -rw-r--r-- | drivers/mmc/core/bus.c | 3 | ||||
| -rw-r--r-- | drivers/mmc/core/sdio_bus.c | 3 | ||||
| -rw-r--r-- | drivers/mmc/core/sdio_cis.c | 50 |
3 files changed, 55 insertions, 1 deletions
diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 1cc1171491..733ac95331 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c | |||
| @@ -187,6 +187,9 @@ static void mmc_release_card(struct device *dev) | |||
| 187 | 187 | ||
| 188 | sdio_free_common_cis(card); | 188 | sdio_free_common_cis(card); |
| 189 | 189 | ||
| 190 | if (card->info) | ||
| 191 | kfree(card->info); | ||
| 192 | |||
| 190 | kfree(card); | 193 | kfree(card); |
| 191 | } | 194 | } |
| 192 | 195 | ||
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index 683d917401..0713a8c71e 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c | |||
| @@ -211,6 +211,9 @@ static void sdio_release_func(struct device *dev) | |||
| 211 | 211 | ||
| 212 | sdio_free_func_cis(func); | 212 | sdio_free_func_cis(func); |
| 213 | 213 | ||
| 214 | if (func->info) | ||
| 215 | kfree(func->info); | ||
| 216 | |||
| 214 | kfree(func); | 217 | kfree(func); |
| 215 | } | 218 | } |
| 216 | 219 | ||
diff --git a/drivers/mmc/core/sdio_cis.c b/drivers/mmc/core/sdio_cis.c index 1d03f12bbb..d5e51b1c7b 100644 --- a/drivers/mmc/core/sdio_cis.c +++ b/drivers/mmc/core/sdio_cis.c | |||
| @@ -23,6 +23,54 @@ | |||
| 23 | #include "sdio_cis.h" | 23 | #include "sdio_cis.h" |
| 24 | #include "sdio_ops.h" | 24 | #include "sdio_ops.h" |
| 25 | 25 | ||
| 26 | static int cistpl_vers_1(struct mmc_card *card, struct sdio_func *func, | ||
| 27 | const unsigned char *buf, unsigned size) | ||
| 28 | { | ||
| 29 | unsigned i, nr_strings; | ||
| 30 | char **buffer, *string; | ||
| 31 | |||
| 32 | buf += 2; | ||
| 33 | size -= 2; | ||
| 34 | |||
| 35 | nr_strings = 0; | ||
| 36 | for (i = 0; i < size; i++) { | ||
| 37 | if (buf[i] == 0xff) | ||
| 38 | break; | ||
| 39 | if (buf[i] == 0) | ||
| 40 | nr_strings++; | ||
| 41 | } | ||
| 42 | |||
| 43 | if (buf[i-1] != '\0') { | ||
| 44 | printk(KERN_WARNING "SDIO: ignoring broken CISTPL_VERS_1\n"); | ||
| 45 | return 0; | ||
| 46 | } | ||
| 47 | |||
| 48 | size = i; | ||
| 49 | |||
| 50 | buffer = kzalloc(sizeof(char*) * nr_strings + size, GFP_KERNEL); | ||
| 51 | if (!buffer) | ||
| 52 | return -ENOMEM; | ||
| 53 | |||
| 54 | string = (char*)(buffer + nr_strings); | ||
| 55 | |||
| 56 | for (i = 0; i < nr_strings; i++) { | ||
| 57 | buffer[i] = string; | ||
| 58 | strcpy(string, buf); | ||
| 59 | string += strlen(string) + 1; | ||
| 60 | buf += strlen(buf) + 1; | ||
| 61 | } | ||
| 62 | |||
| 63 | if (func) { | ||
| 64 | func->num_info = nr_strings; | ||
| 65 | func->info = (const char**)buffer; | ||
| 66 | } else { | ||
| 67 | card->num_info = nr_strings; | ||
| 68 | card->info = (const char**)buffer; | ||
| 69 | } | ||
| 70 | |||
| 71 | return 0; | ||
| 72 | } | ||
| 73 | |||
| 26 | static int cistpl_manfid(struct mmc_card *card, struct sdio_func *func, | 74 | static int cistpl_manfid(struct mmc_card *card, struct sdio_func *func, |
| 27 | const unsigned char *buf, unsigned size) | 75 | const unsigned char *buf, unsigned size) |
| 28 | { | 76 | { |
| @@ -119,7 +167,7 @@ struct cis_tpl { | |||
| 119 | }; | 167 | }; |
| 120 | 168 | ||
| 121 | static const struct cis_tpl cis_tpl_list[] = { | 169 | static const struct cis_tpl cis_tpl_list[] = { |
| 122 | { 0x15, 3, /* cistpl_vers_1 */ }, | 170 | { 0x15, 3, cistpl_vers_1 }, |
| 123 | { 0x20, 4, cistpl_manfid }, | 171 | { 0x20, 4, cistpl_manfid }, |
| 124 | { 0x21, 2, /* cistpl_funcid */ }, | 172 | { 0x21, 2, /* cistpl_funcid */ }, |
| 125 | { 0x22, 0, cistpl_funce }, | 173 | { 0x22, 0, cistpl_funce }, |
