/* 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"); }
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; }