diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/ssb/sprom.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/ssb/sprom.c')
-rw-r--r-- | drivers/ssb/sprom.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/ssb/sprom.c b/drivers/ssb/sprom.c index 8943015a3eef..f2f920fef10d 100644 --- a/drivers/ssb/sprom.c +++ b/drivers/ssb/sprom.c | |||
@@ -13,6 +13,9 @@ | |||
13 | 13 | ||
14 | #include "ssb_private.h" | 14 | #include "ssb_private.h" |
15 | 15 | ||
16 | #include <linux/ctype.h> | ||
17 | #include <linux/slab.h> | ||
18 | |||
16 | 19 | ||
17 | static const struct ssb_sprom *fallback_sprom; | 20 | static const struct ssb_sprom *fallback_sprom; |
18 | 21 | ||
@@ -33,17 +36,27 @@ static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len, | |||
33 | static int hex2sprom(u16 *sprom, const char *dump, size_t len, | 36 | static int hex2sprom(u16 *sprom, const char *dump, size_t len, |
34 | size_t sprom_size_words) | 37 | size_t sprom_size_words) |
35 | { | 38 | { |
36 | char tmp[5] = { 0 }; | 39 | char c, tmp[5] = { 0 }; |
37 | int cnt = 0; | 40 | int err, cnt = 0; |
38 | unsigned long parsed; | 41 | unsigned long parsed; |
39 | 42 | ||
40 | if (len < sprom_size_words * 2) | 43 | /* Strip whitespace at the end. */ |
44 | while (len) { | ||
45 | c = dump[len - 1]; | ||
46 | if (!isspace(c) && c != '\0') | ||
47 | break; | ||
48 | len--; | ||
49 | } | ||
50 | /* Length must match exactly. */ | ||
51 | if (len != sprom_size_words * 4) | ||
41 | return -EINVAL; | 52 | return -EINVAL; |
42 | 53 | ||
43 | while (cnt < sprom_size_words) { | 54 | while (cnt < sprom_size_words) { |
44 | memcpy(tmp, dump, 4); | 55 | memcpy(tmp, dump, 4); |
45 | dump += 4; | 56 | dump += 4; |
46 | parsed = simple_strtoul(tmp, NULL, 16); | 57 | err = strict_strtoul(tmp, 16, &parsed); |
58 | if (err) | ||
59 | return err; | ||
47 | sprom[cnt++] = swab16((u16)parsed); | 60 | sprom[cnt++] = swab16((u16)parsed); |
48 | } | 61 | } |
49 | 62 | ||
@@ -90,6 +103,7 @@ ssize_t ssb_attr_sprom_store(struct ssb_bus *bus, | |||
90 | u16 *sprom; | 103 | u16 *sprom; |
91 | int res = 0, err = -ENOMEM; | 104 | int res = 0, err = -ENOMEM; |
92 | size_t sprom_size_words = bus->sprom_size; | 105 | size_t sprom_size_words = bus->sprom_size; |
106 | struct ssb_freeze_context freeze; | ||
93 | 107 | ||
94 | sprom = kcalloc(bus->sprom_size, sizeof(u16), GFP_KERNEL); | 108 | sprom = kcalloc(bus->sprom_size, sizeof(u16), GFP_KERNEL); |
95 | if (!sprom) | 109 | if (!sprom) |
@@ -111,18 +125,13 @@ ssize_t ssb_attr_sprom_store(struct ssb_bus *bus, | |||
111 | err = -ERESTARTSYS; | 125 | err = -ERESTARTSYS; |
112 | if (mutex_lock_interruptible(&bus->sprom_mutex)) | 126 | if (mutex_lock_interruptible(&bus->sprom_mutex)) |
113 | goto out_kfree; | 127 | goto out_kfree; |
114 | err = ssb_devices_freeze(bus); | 128 | err = ssb_devices_freeze(bus, &freeze); |
115 | if (err == -EOPNOTSUPP) { | ||
116 | ssb_printk(KERN_ERR PFX "SPROM write: Could not freeze devices. " | ||
117 | "No suspend support. Is CONFIG_PM enabled?\n"); | ||
118 | goto out_unlock; | ||
119 | } | ||
120 | if (err) { | 129 | if (err) { |
121 | ssb_printk(KERN_ERR PFX "SPROM write: Could not freeze all devices\n"); | 130 | ssb_printk(KERN_ERR PFX "SPROM write: Could not freeze all devices\n"); |
122 | goto out_unlock; | 131 | goto out_unlock; |
123 | } | 132 | } |
124 | res = sprom_write(bus, sprom); | 133 | res = sprom_write(bus, sprom); |
125 | err = ssb_devices_thaw(bus); | 134 | err = ssb_devices_thaw(&freeze); |
126 | if (err) | 135 | if (err) |
127 | ssb_printk(KERN_ERR PFX "SPROM write: Could not thaw all devices\n"); | 136 | ssb_printk(KERN_ERR PFX "SPROM write: Could not thaw all devices\n"); |
128 | out_unlock: | 137 | out_unlock: |