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

usb: dummy_hcd code simplification

Take handling of the control requests out from dummy_timer to a different
function.

Signed-off-by: Tatyana Brokhman <tlinder@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Tatyana Brokhman and committed by
Greg Kroah-Hartman
8be8a9d3 0eadcc09

+135 -116
+135 -116
drivers/usb/gadget/dummy_hcd.c
··· 1197 1197 #define Ep_Request (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT) 1198 1198 #define Ep_InRequest (Ep_Request | USB_DIR_IN) 1199 1199 1200 + 1201 + /** 1202 + * handle_control_request() - handles all control transfers 1203 + * @dum: pointer to dummy (the_controller) 1204 + * @urb: the urb request to handle 1205 + * @setup: pointer to the setup data for a USB device control 1206 + * request 1207 + * @status: pointer to request handling status 1208 + * 1209 + * Return 0 - if the request was handled 1210 + * 1 - if the request wasn't handles 1211 + * error code on error 1212 + */ 1213 + static int handle_control_request(struct dummy *dum, struct urb *urb, 1214 + struct usb_ctrlrequest *setup, 1215 + int *status) 1216 + { 1217 + struct dummy_ep *ep2; 1218 + int ret_val = 1; 1219 + unsigned w_index; 1220 + unsigned w_value; 1221 + 1222 + w_index = le16_to_cpu(setup->wIndex); 1223 + w_value = le16_to_cpu(setup->wValue); 1224 + switch (setup->bRequest) { 1225 + case USB_REQ_SET_ADDRESS: 1226 + if (setup->bRequestType != Dev_Request) 1227 + break; 1228 + dum->address = w_value; 1229 + *status = 0; 1230 + dev_dbg(udc_dev(dum), "set_address = %d\n", 1231 + w_value); 1232 + ret_val = 0; 1233 + break; 1234 + case USB_REQ_SET_FEATURE: 1235 + if (setup->bRequestType == Dev_Request) { 1236 + ret_val = 0; 1237 + switch (w_value) { 1238 + case USB_DEVICE_REMOTE_WAKEUP: 1239 + break; 1240 + case USB_DEVICE_B_HNP_ENABLE: 1241 + dum->gadget.b_hnp_enable = 1; 1242 + break; 1243 + case USB_DEVICE_A_HNP_SUPPORT: 1244 + dum->gadget.a_hnp_support = 1; 1245 + break; 1246 + case USB_DEVICE_A_ALT_HNP_SUPPORT: 1247 + dum->gadget.a_alt_hnp_support = 1; 1248 + break; 1249 + default: 1250 + ret_val = -EOPNOTSUPP; 1251 + } 1252 + if (ret_val == 0) { 1253 + dum->devstatus |= (1 << w_value); 1254 + *status = 0; 1255 + } 1256 + } else if (setup->bRequestType == Ep_Request) { 1257 + /* endpoint halt */ 1258 + ep2 = find_endpoint(dum, w_index); 1259 + if (!ep2 || ep2->ep.name == ep0name) { 1260 + ret_val = -EOPNOTSUPP; 1261 + break; 1262 + } 1263 + ep2->halted = 1; 1264 + ret_val = 0; 1265 + *status = 0; 1266 + } 1267 + break; 1268 + case USB_REQ_CLEAR_FEATURE: 1269 + if (setup->bRequestType == Dev_Request) { 1270 + ret_val = 0; 1271 + switch (w_value) { 1272 + case USB_DEVICE_REMOTE_WAKEUP: 1273 + w_value = USB_DEVICE_REMOTE_WAKEUP; 1274 + break; 1275 + default: 1276 + ret_val = -EOPNOTSUPP; 1277 + break; 1278 + } 1279 + if (ret_val == 0) { 1280 + dum->devstatus &= ~(1 << w_value); 1281 + *status = 0; 1282 + } 1283 + } else if (setup->bRequestType == Ep_Request) { 1284 + /* endpoint halt */ 1285 + ep2 = find_endpoint(dum, w_index); 1286 + if (!ep2) { 1287 + ret_val = -EOPNOTSUPP; 1288 + break; 1289 + } 1290 + if (!ep2->wedged) 1291 + ep2->halted = 0; 1292 + ret_val = 0; 1293 + *status = 0; 1294 + } 1295 + break; 1296 + case USB_REQ_GET_STATUS: 1297 + if (setup->bRequestType == Dev_InRequest 1298 + || setup->bRequestType == Intf_InRequest 1299 + || setup->bRequestType == Ep_InRequest) { 1300 + char *buf; 1301 + /* 1302 + * device: remote wakeup, selfpowered 1303 + * interface: nothing 1304 + * endpoint: halt 1305 + */ 1306 + buf = (char *)urb->transfer_buffer; 1307 + if (urb->transfer_buffer_length > 0) { 1308 + if (setup->bRequestType == Ep_InRequest) { 1309 + ep2 = find_endpoint(dum, w_index); 1310 + if (!ep2) { 1311 + ret_val = -EOPNOTSUPP; 1312 + break; 1313 + } 1314 + buf[0] = ep2->halted; 1315 + } else if (setup->bRequestType == 1316 + Dev_InRequest) { 1317 + buf[0] = (u8)dum->devstatus; 1318 + } else 1319 + buf[0] = 0; 1320 + } 1321 + if (urb->transfer_buffer_length > 1) 1322 + buf[1] = 0; 1323 + urb->actual_length = min_t(u32, 2, 1324 + urb->transfer_buffer_length); 1325 + ret_val = 0; 1326 + *status = 0; 1327 + } 1328 + break; 1329 + } 1330 + return ret_val; 1331 + } 1332 + 1200 1333 /* drive both sides of the transfers; looks like irq handlers to 1201 1334 * both drivers except the callbacks aren't in_irq(). 1202 1335 */ ··· 1432 1299 if (ep == &dum->ep [0] && ep->setup_stage) { 1433 1300 struct usb_ctrlrequest setup; 1434 1301 int value = 1; 1435 - struct dummy_ep *ep2; 1436 - unsigned w_index; 1437 - unsigned w_value; 1438 1302 1439 1303 setup = *(struct usb_ctrlrequest*) urb->setup_packet; 1440 - w_index = le16_to_cpu(setup.wIndex); 1441 - w_value = le16_to_cpu(setup.wValue); 1442 - 1443 1304 /* paranoia, in case of stale queued data */ 1444 1305 list_for_each_entry (req, &ep->queue, queue) { 1445 1306 list_del_init (&req->queue); ··· 1455 1328 ep->last_io = jiffies; 1456 1329 ep->setup_stage = 0; 1457 1330 ep->halted = 0; 1458 - switch (setup.bRequest) { 1459 - case USB_REQ_SET_ADDRESS: 1460 - if (setup.bRequestType != Dev_Request) 1461 - break; 1462 - dum->address = w_value; 1463 - status = 0; 1464 - dev_dbg (udc_dev(dum), "set_address = %d\n", 1465 - w_value); 1466 - value = 0; 1467 - break; 1468 - case USB_REQ_SET_FEATURE: 1469 - if (setup.bRequestType == Dev_Request) { 1470 - value = 0; 1471 - switch (w_value) { 1472 - case USB_DEVICE_REMOTE_WAKEUP: 1473 - break; 1474 - case USB_DEVICE_B_HNP_ENABLE: 1475 - dum->gadget.b_hnp_enable = 1; 1476 - break; 1477 - case USB_DEVICE_A_HNP_SUPPORT: 1478 - dum->gadget.a_hnp_support = 1; 1479 - break; 1480 - case USB_DEVICE_A_ALT_HNP_SUPPORT: 1481 - dum->gadget.a_alt_hnp_support 1482 - = 1; 1483 - break; 1484 - default: 1485 - value = -EOPNOTSUPP; 1486 - } 1487 - if (value == 0) { 1488 - dum->devstatus |= 1489 - (1 << w_value); 1490 - status = 0; 1491 - } 1492 1331 1493 - } else if (setup.bRequestType == Ep_Request) { 1494 - // endpoint halt 1495 - ep2 = find_endpoint (dum, w_index); 1496 - if (!ep2 || ep2->ep.name == ep0name) { 1497 - value = -EOPNOTSUPP; 1498 - break; 1499 - } 1500 - ep2->halted = 1; 1501 - value = 0; 1502 - status = 0; 1503 - } 1504 - break; 1505 - case USB_REQ_CLEAR_FEATURE: 1506 - if (setup.bRequestType == Dev_Request) { 1507 - switch (w_value) { 1508 - case USB_DEVICE_REMOTE_WAKEUP: 1509 - dum->devstatus &= ~(1 << 1510 - USB_DEVICE_REMOTE_WAKEUP); 1511 - value = 0; 1512 - status = 0; 1513 - break; 1514 - default: 1515 - value = -EOPNOTSUPP; 1516 - break; 1517 - } 1518 - } else if (setup.bRequestType == Ep_Request) { 1519 - // endpoint halt 1520 - ep2 = find_endpoint (dum, w_index); 1521 - if (!ep2) { 1522 - value = -EOPNOTSUPP; 1523 - break; 1524 - } 1525 - if (!ep2->wedged) 1526 - ep2->halted = 0; 1527 - value = 0; 1528 - status = 0; 1529 - } 1530 - break; 1531 - case USB_REQ_GET_STATUS: 1532 - if (setup.bRequestType == Dev_InRequest 1533 - || setup.bRequestType 1534 - == Intf_InRequest 1535 - || setup.bRequestType 1536 - == Ep_InRequest 1537 - ) { 1538 - char *buf; 1539 - 1540 - // device: remote wakeup, selfpowered 1541 - // interface: nothing 1542 - // endpoint: halt 1543 - buf = (char *)urb->transfer_buffer; 1544 - if (urb->transfer_buffer_length > 0) { 1545 - if (setup.bRequestType == 1546 - Ep_InRequest) { 1547 - ep2 = find_endpoint (dum, w_index); 1548 - if (!ep2) { 1549 - value = -EOPNOTSUPP; 1550 - break; 1551 - } 1552 - buf [0] = ep2->halted; 1553 - } else if (setup.bRequestType == 1554 - Dev_InRequest) { 1555 - buf [0] = (u8) 1556 - dum->devstatus; 1557 - } else 1558 - buf [0] = 0; 1559 - } 1560 - if (urb->transfer_buffer_length > 1) 1561 - buf [1] = 0; 1562 - urb->actual_length = min_t(u32, 2, 1563 - urb->transfer_buffer_length); 1564 - value = 0; 1565 - status = 0; 1566 - } 1567 - break; 1568 - } 1332 + value = handle_control_request(dum, urb, &setup, 1333 + &status); 1569 1334 1570 1335 /* gadget driver handles all other requests. block 1571 1336 * until setup() returns; no reentrancy issues etc.