static void ar9170_usb_irq_completed(struct urb *urb) { struct ar9170_usb *aru = urb->context; switch (urb->status) { /* everything is fine */ case 0: break; /* disconnect */ case -ENOENT: case -ECONNRESET: case -ENODEV: case -ESHUTDOWN: goto free; default: goto resubmit; } ar9170_handle_command_response(&aru->common, urb->transfer_buffer, urb->actual_length); resubmit: usb_anchor_urb(urb, &aru->rx_submitted); if (usb_submit_urb(urb, GFP_ATOMIC)) { usb_unanchor_urb(urb); goto free; } return; free: usb_free_coherent(aru->udev, 64, urb->transfer_buffer, urb->transfer_dma); }
void ar9170_control_in_transfer_done( usb_add_t add, uhd_trans_status_t status, uint16_t nb_transfered ) { #if USB_WRAPPER_DEBUG int i; #endif bool reschedule_flag = false; uint8_t* buffer = NULL; switch (status) { case UHD_TRANS_NOERROR: #if USB_WRAPPER_DEBUG_DEEP printf("Control IN success.\n"); #endif reschedule_flag = true; #if USB_WRAPPER_DEBUG_DEEP printf("Number of bytes transfered: %u.\n",(unsigned int)nb_transfered); for (i=0; i<nb_transfered; i++) { printf("%02x ", ctrl_in_buffer[i]); } printf(" \n"); #endif buffer = (uint8_t*)malloc(nb_transfered); // TODO Must be freed later memcpy(buffer, ctrl_in_buffer, nb_transfered); memset(ctrl_in_buffer, 0, INTR_ENDPOINT_MAX_SIZE); break; case UHD_TRANS_DISCONNECT: printf("ERROR: Interrupt IN disconnect error.\n"); break; case UHD_TRANS_CRC: case UHD_TRANS_DT_MISMATCH: case UHD_TRANS_PIDFAILURE: printf("ERROR: Control IN CRC / MISMATCH / PIDFAILURE error.\n"); break; case UHD_TRANS_STALL: printf("ERROR: Control IN STALL error.\n"); break; case UHD_TRANS_NOTRESPONDING: printf("ERROR: Control IN Not Responding error.\n"); break; case UHD_TRANS_TIMEOUT: #if USB_WRAPPER_DEBUG printf("Control IN has timed-out. \n"); #endif reschedule_flag = true; break; default: printf("ERROR: Unrecognized status: %d.\n",status); } if (reschedule_flag) { #if USB_WRAPPER_DEBUG_DEEP printf("DEBUG: Rescheduling listening on the Control endpoint.\n"); #endif ar9170_listen_on_ctrl_in(); } if (status == UHD_TRANS_NOERROR) { struct ar9170* ar = ar9170_get_device(); ar9170_handle_command_response(ar, buffer, (uint32_t)nb_transfered); } }