Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: minor fixes for r8a66597 driver

This patch (as967) makes a few relatively minor changes to the
r8a66597 driver:

finish_request() does nothing but call done(), so merge the
two routines.

Detect and report -EOVERFLOW errors.

Fix the calculation that checks for short packets.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Alan Stern and committed by
Greg Kroah-Hartman
dfd1e537 af1c51fc

+19 -21
+19 -21
drivers/usb/host/r8a66597-hcd.c
··· 1109 1109 } 1110 1110 1111 1111 /* this function must be called with interrupt disabled */ 1112 - static void done(struct r8a66597 *r8a66597, struct r8a66597_td *td, 1113 - u16 pipenum, struct urb *urb) 1112 + static void finish_request(struct r8a66597 *r8a66597, struct r8a66597_td *td, 1113 + u16 pipenum, struct urb *urb) 1114 + __releases(r8a66597->lock) __acquires(r8a66597->lock) 1114 1115 { 1115 1116 int restart = 0; 1116 1117 struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); ··· 1152 1151 } 1153 1152 } 1154 1153 1155 - /* this function must be called with interrupt disabled */ 1156 - static void finish_request(struct r8a66597 *r8a66597, struct r8a66597_td *td, 1157 - u16 pipenum, struct urb *urb) 1158 - __releases(r8a66597->lock) __acquires(r8a66597->lock) 1159 - { 1160 - done(r8a66597, td, pipenum, urb); 1161 - } 1162 - 1163 1154 static void packet_read(struct r8a66597 *r8a66597, u16 pipenum) 1164 1155 { 1165 1156 u16 tmp; ··· 1160 1167 struct r8a66597_td *td = r8a66597_get_td(r8a66597, pipenum); 1161 1168 struct urb *urb; 1162 1169 int finish = 0; 1170 + int status = 0; 1163 1171 1164 1172 if (unlikely(!td)) 1165 1173 return; ··· 1179 1185 1180 1186 /* prepare parameters */ 1181 1187 rcv_len = tmp & DTLN; 1182 - bufsize = td->maxpacket; 1183 1188 if (usb_pipeisoc(urb->pipe)) { 1184 1189 buf = (u16 *)(urb->transfer_buffer + 1185 1190 urb->iso_frame_desc[td->iso_cnt].offset); ··· 1187 1194 buf = (void *)urb->transfer_buffer + urb->actual_length; 1188 1195 urb_len = urb->transfer_buffer_length - urb->actual_length; 1189 1196 } 1190 - if (rcv_len < bufsize) 1191 - size = min(rcv_len, urb_len); 1192 - else 1193 - size = min(bufsize, urb_len); 1197 + bufsize = min(urb_len, (int) td->maxpacket); 1198 + if (rcv_len <= bufsize) { 1199 + size = rcv_len; 1200 + } else { 1201 + size = bufsize; 1202 + status = -EOVERFLOW; 1203 + finish = 1; 1204 + } 1194 1205 1195 1206 /* update parameters */ 1196 1207 urb->actual_length += size; 1197 1208 if (rcv_len == 0) 1198 1209 td->zero_packet = 1; 1199 - if ((size % td->maxpacket) > 0) { 1210 + if (rcv_len < bufsize) { 1200 1211 td->short_packet = 1; 1201 1212 if (urb->transfer_buffer_length != urb->actual_length && 1202 1213 urb->transfer_flags & URB_SHORT_NOT_OK) 1203 - td->urb->status = -EREMOTEIO; 1214 + status = -EREMOTEIO; 1204 1215 } 1205 1216 if (usb_pipeisoc(urb->pipe)) { 1206 1217 urb->iso_frame_desc[td->iso_cnt].actual_length = size; 1207 - urb->iso_frame_desc[td->iso_cnt].status = 0; 1218 + urb->iso_frame_desc[td->iso_cnt].status = status; 1208 1219 td->iso_cnt++; 1220 + finish = 0; 1209 1221 } 1210 1222 1211 1223 /* check transfer finish */ ··· 1231 1233 1232 1234 if (finish && pipenum != 0) { 1233 1235 if (td->urb->status == -EINPROGRESS) 1234 - td->urb->status = 0; 1236 + td->urb->status = status; 1235 1237 finish_request(r8a66597, td, pipenum, urb); 1236 1238 } 1237 1239 } ··· 1805 1807 pipe_stop(r8a66597, td->pipe); 1806 1808 pipe_irq_disable(r8a66597, td->pipenum); 1807 1809 disable_irq_empty(r8a66597, td->pipenum); 1808 - done(r8a66597, td, td->pipenum, urb); 1810 + finish_request(r8a66597, td, td->pipenum, urb); 1809 1811 } 1810 1812 done: 1811 1813 spin_unlock_irqrestore(&r8a66597->lock, flags); ··· 1839 1841 td = r8a66597_get_td(r8a66597, pipenum); 1840 1842 if (td) 1841 1843 urb = td->urb; 1842 - done(r8a66597, td, pipenum, urb); 1844 + finish_request(r8a66597, td, pipenum, urb); 1843 1845 kfree(hep->hcpriv); 1844 1846 hep->hcpriv = NULL; 1845 1847 spin_unlock_irqrestore(&r8a66597->lock, flags);