diff options
-rw-r--r-- | drivers/media/usb/as102/as102_fw.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/media/usb/as102/as102_fw.c b/drivers/media/usb/as102/as102_fw.c index 5a28ce3a1d49..38dbc128340d 100644 --- a/drivers/media/usb/as102/as102_fw.c +++ b/drivers/media/usb/as102/as102_fw.c | |||
@@ -101,18 +101,23 @@ static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, | |||
101 | unsigned char *cmd, | 101 | unsigned char *cmd, |
102 | const struct firmware *firmware) { | 102 | const struct firmware *firmware) { |
103 | 103 | ||
104 | struct as10x_fw_pkt_t fw_pkt; | 104 | struct as10x_fw_pkt_t *fw_pkt; |
105 | int total_read_bytes = 0, errno = 0; | 105 | int total_read_bytes = 0, errno = 0; |
106 | unsigned char addr_has_changed = 0; | 106 | unsigned char addr_has_changed = 0; |
107 | 107 | ||
108 | fw_pkt = kmalloc(sizeof(*fw_pkt), GFP_KERNEL); | ||
109 | if (!fw_pkt) | ||
110 | return -ENOMEM; | ||
111 | |||
112 | |||
108 | for (total_read_bytes = 0; total_read_bytes < firmware->size; ) { | 113 | for (total_read_bytes = 0; total_read_bytes < firmware->size; ) { |
109 | int read_bytes = 0, data_len = 0; | 114 | int read_bytes = 0, data_len = 0; |
110 | 115 | ||
111 | /* parse intel hex line */ | 116 | /* parse intel hex line */ |
112 | read_bytes = parse_hex_line( | 117 | read_bytes = parse_hex_line( |
113 | (u8 *) (firmware->data + total_read_bytes), | 118 | (u8 *) (firmware->data + total_read_bytes), |
114 | fw_pkt.raw.address, | 119 | fw_pkt->raw.address, |
115 | fw_pkt.raw.data, | 120 | fw_pkt->raw.data, |
116 | &data_len, | 121 | &data_len, |
117 | &addr_has_changed); | 122 | &addr_has_changed); |
118 | 123 | ||
@@ -122,28 +127,28 @@ static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, | |||
122 | /* detect the end of file */ | 127 | /* detect the end of file */ |
123 | total_read_bytes += read_bytes; | 128 | total_read_bytes += read_bytes; |
124 | if (total_read_bytes == firmware->size) { | 129 | if (total_read_bytes == firmware->size) { |
125 | fw_pkt.u.request[0] = 0x00; | 130 | fw_pkt->u.request[0] = 0x00; |
126 | fw_pkt.u.request[1] = 0x03; | 131 | fw_pkt->u.request[1] = 0x03; |
127 | 132 | ||
128 | /* send EOF command */ | 133 | /* send EOF command */ |
129 | errno = bus_adap->ops->upload_fw_pkt(bus_adap, | 134 | errno = bus_adap->ops->upload_fw_pkt(bus_adap, |
130 | (uint8_t *) | 135 | (uint8_t *) |
131 | &fw_pkt, 2, 0); | 136 | fw_pkt, 2, 0); |
132 | if (errno < 0) | 137 | if (errno < 0) |
133 | goto error; | 138 | goto error; |
134 | } else { | 139 | } else { |
135 | if (!addr_has_changed) { | 140 | if (!addr_has_changed) { |
136 | /* prepare command to send */ | 141 | /* prepare command to send */ |
137 | fw_pkt.u.request[0] = 0x00; | 142 | fw_pkt->u.request[0] = 0x00; |
138 | fw_pkt.u.request[1] = 0x01; | 143 | fw_pkt->u.request[1] = 0x01; |
139 | 144 | ||
140 | data_len += sizeof(fw_pkt.u.request); | 145 | data_len += sizeof(fw_pkt->u.request); |
141 | data_len += sizeof(fw_pkt.raw.address); | 146 | data_len += sizeof(fw_pkt->raw.address); |
142 | 147 | ||
143 | /* send cmd to device */ | 148 | /* send cmd to device */ |
144 | errno = bus_adap->ops->upload_fw_pkt(bus_adap, | 149 | errno = bus_adap->ops->upload_fw_pkt(bus_adap, |
145 | (uint8_t *) | 150 | (uint8_t *) |
146 | &fw_pkt, | 151 | fw_pkt, |
147 | data_len, | 152 | data_len, |
148 | 0); | 153 | 0); |
149 | if (errno < 0) | 154 | if (errno < 0) |
@@ -152,6 +157,7 @@ static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, | |||
152 | } | 157 | } |
153 | } | 158 | } |
154 | error: | 159 | error: |
160 | kfree(fw_pkt); | ||
155 | return (errno == 0) ? total_read_bytes : errno; | 161 | return (errno == 0) ? total_read_bytes : errno; |
156 | } | 162 | } |
157 | 163 | ||