diff options
| -rw-r--r-- | drivers/base/firmware_class.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index b0be1d18fee2..c9c92b00fd55 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
| @@ -184,7 +184,7 @@ firmware_data_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
| 184 | struct device *dev = to_dev(kobj); | 184 | struct device *dev = to_dev(kobj); |
| 185 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); | 185 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
| 186 | struct firmware *fw; | 186 | struct firmware *fw; |
| 187 | ssize_t ret_count = count; | 187 | ssize_t ret_count; |
| 188 | 188 | ||
| 189 | mutex_lock(&fw_lock); | 189 | mutex_lock(&fw_lock); |
| 190 | fw = fw_priv->fw; | 190 | fw = fw_priv->fw; |
| @@ -192,14 +192,8 @@ firmware_data_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
| 192 | ret_count = -ENODEV; | 192 | ret_count = -ENODEV; |
| 193 | goto out; | 193 | goto out; |
| 194 | } | 194 | } |
| 195 | if (offset > fw->size) { | 195 | ret_count = memory_read_from_buffer(buffer, count, &offset, |
| 196 | ret_count = 0; | 196 | fw->data, fw->size); |
| 197 | goto out; | ||
| 198 | } | ||
| 199 | if (offset + ret_count > fw->size) | ||
| 200 | ret_count = fw->size - offset; | ||
| 201 | |||
| 202 | memcpy(buffer, fw->data + offset, ret_count); | ||
| 203 | out: | 197 | out: |
| 204 | mutex_unlock(&fw_lock); | 198 | mutex_unlock(&fw_lock); |
| 205 | return ret_count; | 199 | return ret_count; |
