aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/usb/as102/as102_fw.c28
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 }
154error: 159error:
160 kfree(fw_pkt);
155 return (errno == 0) ? total_read_bytes : errno; 161 return (errno == 0) ? total_read_bytes : errno;
156} 162}
157 163