Пример #1
0
/* callback function from USB when async USB request has completed */
static void redrat3_handle_async(struct urb *urb, struct pt_regs *regs)
{
	struct redrat3_dev *rr3;

	if (!urb)
		return;

	rr3 = urb->context;
	if (!rr3) {
		pr_err("%s called with invalid context!\n", __func__);
		usb_unlink_urb(urb);
		return;
	}

	rr3_ftr(rr3->dev, "Entering %s\n", __func__);

	if (!rr3->det_enabled) {
		rr3_dbg(rr3->dev, "received a read callback but detector "
			"disabled - ignoring\n");
		return;
	}

	switch (urb->status) {
	case 0:
		redrat3_get_ir_data(rr3, urb->actual_length);
		break;

	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		usb_unlink_urb(urb);
		return;

	case -EPIPE:
	default:
		dev_warn(rr3->dev, "Error: urb status = %d\n", urb->status);
		rr3->bytes_read = 0;
		rr3->pktlen = 0;
		rr3->pkttype = 0;
		break;
	}

	if (!rr3->transmitting)
		redrat3_issue_async(rr3);
	else
		rr3_dbg(rr3->dev, "IR transmit in progress\n");
}
Пример #2
0
static void redrat3_handle_async(struct urb *urb, struct pt_regs *regs)
{
	struct redrat3_dev *rr3;
	int ret;

	if (!urb)
		return;

	rr3 = urb->context;
	if (!rr3) {
		pr_err("%s called with invalid context!\n", __func__);
		usb_unlink_urb(urb);
		return;
	}

	rr3_ftr(rr3->dev, "Entering %s\n", __func__);

	switch (urb->status) {
	case 0:
		ret = redrat3_get_ir_data(rr3, urb->actual_length);
		if (!ret) {
			/*                                */
			redrat3_issue_async(rr3);
		}
		break;

	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		usb_unlink_urb(urb);
		return;

	case -EPIPE:
	default:
		dev_warn(rr3->dev, "Error: urb status = %d\n", urb->status);
		rr3->bytes_read = 0;
		rr3->pktlen = 0;
		rr3->pkttype = 0;
		break;
	}
}
/* Enables the long range detector and starts async receive */
static int redrat3_enable_detector(struct redrat3_dev *rr3)
{
    struct device *dev = rr3->dev;
    u8 ret;

    rr3_ftr(dev, "Entering %s\n", __func__);

    ret = redrat3_send_cmd(RR3_RC_DET_ENABLE, rr3);
    if (ret != 0)
        dev_dbg(dev, "%s: unexpected ret of %d\n",
                __func__, ret);

    ret = redrat3_send_cmd(RR3_RC_DET_STATUS, rr3);
    if (ret != 1) {
        dev_err(dev, "%s: detector status: %d, should be 1\n",
                __func__, ret);
        return -EIO;
    }

    redrat3_issue_async(rr3);

    return 0;
}