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

Configure Feed

Select the types of activity you want to include in your feed.

USB: gadget: net2280: implement set_wedge

This patch (as1132) implements the set_wedge() method for net2280.
This method is necessary for strict USBCV compliance in
g_file_storage.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: David Brownell <david-b@pacbell.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Alan Stern and committed by
Greg Kroah-Hartman
8066134f 851a526d

+35 -6
+34 -6
drivers/usb/gadget/net2280.c
··· 178 178 179 179 /* ep_reset() has already been called */ 180 180 ep->stopped = 0; 181 + ep->wedged = 0; 181 182 ep->out_overflow = 0; 182 183 183 184 /* set speed-dependent max packet; may kick in high bandwidth */ ··· 1219 1218 static int net2280_fifo_status (struct usb_ep *_ep); 1220 1219 1221 1220 static int 1222 - net2280_set_halt (struct usb_ep *_ep, int value) 1221 + net2280_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged) 1223 1222 { 1224 1223 struct net2280_ep *ep; 1225 1224 unsigned long flags; ··· 1240 1239 else if (ep->is_in && value && net2280_fifo_status (_ep) != 0) 1241 1240 retval = -EAGAIN; 1242 1241 else { 1243 - VDEBUG (ep->dev, "%s %s halt\n", _ep->name, 1244 - value ? "set" : "clear"); 1242 + VDEBUG (ep->dev, "%s %s %s\n", _ep->name, 1243 + value ? "set" : "clear", 1244 + wedged ? "wedge" : "halt"); 1245 1245 /* set/clear, then synch memory views with the device */ 1246 1246 if (value) { 1247 1247 if (ep->num == 0) 1248 1248 ep->dev->protocol_stall = 1; 1249 1249 else 1250 1250 set_halt (ep); 1251 - } else 1251 + if (wedged) 1252 + ep->wedged = 1; 1253 + } else { 1252 1254 clear_halt (ep); 1255 + ep->wedged = 0; 1256 + } 1253 1257 (void) readl (&ep->regs->ep_rsp); 1254 1258 } 1255 1259 spin_unlock_irqrestore (&ep->dev->lock, flags); 1256 1260 1257 1261 return retval; 1262 + } 1263 + 1264 + static int 1265 + net2280_set_halt(struct usb_ep *_ep, int value) 1266 + { 1267 + return net2280_set_halt_and_wedge(_ep, value, 0); 1268 + } 1269 + 1270 + static int 1271 + net2280_set_wedge(struct usb_ep *_ep) 1272 + { 1273 + if (!_ep || _ep->name == ep0name) 1274 + return -EINVAL; 1275 + return net2280_set_halt_and_wedge(_ep, 1, 1); 1258 1276 } 1259 1277 1260 1278 static int ··· 1322 1302 .dequeue = net2280_dequeue, 1323 1303 1324 1304 .set_halt = net2280_set_halt, 1305 + .set_wedge = net2280_set_wedge, 1325 1306 .fifo_status = net2280_fifo_status, 1326 1307 .fifo_flush = net2280_fifo_flush, 1327 1308 }; ··· 2431 2410 goto do_stall; 2432 2411 if ((e = get_ep_by_addr (dev, w_index)) == 0) 2433 2412 goto do_stall; 2434 - clear_halt (e); 2413 + if (e->wedged) { 2414 + VDEBUG(dev, "%s wedged, halt not cleared\n", 2415 + ep->ep.name); 2416 + } else { 2417 + VDEBUG(dev, "%s clear halt\n", ep->ep.name); 2418 + clear_halt(e); 2419 + } 2435 2420 allow_status (ep); 2436 - VDEBUG (dev, "%s clear halt\n", ep->ep.name); 2437 2421 goto next_endpoints; 2438 2422 } 2439 2423 break; ··· 2452 2426 || w_length != 0) 2453 2427 goto do_stall; 2454 2428 if ((e = get_ep_by_addr (dev, w_index)) == 0) 2429 + goto do_stall; 2430 + if (e->ep.name == ep0name) 2455 2431 goto do_stall; 2456 2432 set_halt (e); 2457 2433 allow_status (ep);
+1
drivers/usb/gadget/net2280.h
··· 109 109 in_fifo_validate : 1, 110 110 out_overflow : 1, 111 111 stopped : 1, 112 + wedged : 1, 112 113 is_in : 1, 113 114 is_iso : 1, 114 115 responded : 1;