Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
	}
}