PERFORCE change 170842 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Nov 19 22:35:03 UTC 2009
http://p4web.freebsd.org/chv.cgi?CH=170842
Change 170842 by hselasky at hselasky_laptop001 on 2009/11/19 22:34:49
USB input:
- ATP patch from Rohit Grover:
- fixes some minor issues and
makes the control transfer
fully asynchronous
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/input/atp.c#2 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/input/atp.c#2 (text+ko) ====
@@ -341,6 +341,7 @@
enum {
ATP_INTR_DT,
+ ATP_RESET,
ATP_N_TRANSFER,
};
@@ -421,6 +422,7 @@
/* device initialization and shutdown */
static usb_error_t atp_req_get_report(struct usb_device *udev, void *data);
static int atp_set_device_mode(device_t dev, interface_mode mode);
+static void atp_reset_callback(struct usb_xfer *, usb_error_t);
static int atp_enable(struct atp_softc *sc);
static void atp_disable(struct atp_softc *sc);
static int atp_softc_populate(struct atp_softc *);
@@ -501,6 +503,40 @@
return (0);
}
+void
+atp_reset_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ usb_device_request_t req;
+ struct usb_page_cache *pc;
+ struct atp_softc *sc = usbd_xfer_softc(xfer);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_SETUP:
+ sc->sc_mode_bytes[0] = RAW_SENSOR_MODE;
+ req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+ req.bRequest = UR_SET_REPORT;
+ USETW2(req.wValue,
+ (uint8_t)0x03 /* type */, (uint8_t)0x00 /* id */);
+ USETW(req.wIndex, 0);
+ USETW(req.wLength, MODE_LENGTH);
+
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_in(pc, 0, &req, sizeof(req));
+ pc = usbd_xfer_get_frame(xfer, 1);
+ usbd_copy_in(pc, 0, sc->sc_mode_bytes, MODE_LENGTH);
+
+ usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
+ usbd_xfer_set_frame_len(xfer, 1, MODE_LENGTH);
+ usbd_xfer_set_frames(xfer, 2);
+ usbd_transfer_submit(xfer);
+ break;
+
+ case USB_ST_TRANSFERRED:
+ default:
+ break;
+ }
+}
+
static int
atp_enable(struct atp_softc *sc)
{
@@ -1515,6 +1551,14 @@
.bufsize = 0, /* use wMaxPacketSize */
.callback = &atp_intr,
},
+ [ATP_RESET] = {
+ .type = UE_CONTROL,
+ .endpoint = 0, /* Control pipe */
+ .direction = UE_DIR_ANY,
+ .bufsize = sizeof(struct usb_device_request) + MODE_LENGTH,
+ .callback = &atp_reset_callback,
+ .interval = 0, /* no pre-delay */
+ },
};
static int
@@ -1530,7 +1574,7 @@
return (ENXIO);
if (usbd_lookup_id_by_uaa(atp_devs, sizeof(atp_devs), uaa) == 0)
- return BUS_PROBE_SPECIFIC;
+ return 0;
else
return ENXIO;
}
@@ -1542,12 +1586,6 @@
struct usb_attach_arg *uaa = device_get_ivars(dev);
usb_error_t err;
- /* ensure that the probe was successful */
- if (uaa->driver_info >= ATP_N_DEV_PARAMS) {
- DPRINTF("device probe returned bad id: %lu\n",
- uaa->driver_info);
- return (ENXIO);
- }
DPRINTFN(ATP_LLEVEL_INFO, "sc=%p\n", sc);
sc->sc_dev = dev;
@@ -1626,7 +1664,6 @@
atp_detach(device_t dev)
{
struct atp_softc *sc;
- int err;
sc = device_get_softc(dev);
if (sc->sc_state & ATP_ENABLED) {
@@ -1641,12 +1678,6 @@
mtx_destroy(&sc->sc_mutex);
- err = atp_set_device_mode(dev, HID_MODE);
- if (err != 0) {
- DPRINTF("failed to reset mode to 'HID' (%d)\n", err);
- return (err);
- }
-
return (0);
}
@@ -1823,10 +1854,7 @@
if (sc->sc_idlecount >= ATP_IDLENESS_THRESHOLD) {
DPRINTFN(ATP_LLEVEL_INFO, "idle\n");
sc->sc_idlecount = 0;
-
- mtx_unlock(&sc->sc_mutex);
- atp_set_device_mode(sc->sc_dev,RAW_SENSOR_MODE);
- mtx_lock(&sc->sc_mutex);
+ usbd_transfer_start(sc->sc_xfer[ATP_RESET]);
}
} else {
sc->sc_idlecount = 0;
More information about the p4-projects
mailing list