PERFORCE change 106216 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sat Sep 16 11:36:26 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=106216
Change 106216 by hselasky at hselasky_mini_itx on 2006/09/16 18:35:25
Make "ums" use the new USB-cdev API. This saves some code. Also
parenthesis two unclear expressions, where "complement" and "and"
was involved.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/ums.c#12 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/ums.c#12 (text+ko) ====
@@ -84,12 +84,10 @@
#define UMS_BUT(i) ((i) < 3 ? (((i) + 2) % 3) : (i))
struct ums_softc {
+ struct usb_cdev sc_cdev;
struct mtx sc_mtx;
- struct usbd_ifqueue sc_rdq_free;
- struct usbd_ifqueue sc_rdq_used;
struct __callout sc_callout;
struct usbd_memory_wait sc_mem_wait;
- struct selinfo sc_read_sel;
struct hid_location sc_loc_x;
struct hid_location sc_loc_y;
struct hid_location sc_loc_z;
@@ -100,8 +98,6 @@
mousestatus_t sc_status;
struct usbd_xfer * sc_xfer[UMS_N_TRANSFER];
- void * sc_mem_ptr_1;
- struct cdev * sc_cdev_1;
u_int32_t sc_flags;
#define UMS_FLAG_X_AXIS 0x0001
@@ -109,31 +105,41 @@
#define UMS_FLAG_Z_AXIS 0x0004
#define UMS_FLAG_T_AXIS 0x0008
#define UMS_FLAG_SBU 0x0010 /* spurious button up events */
-#define UMS_FLAG_SELECT 0x0020 /* select is waiting */
-#define UMS_FLAG_INTR_STALL 0x0040 /* set if transfer error */
-#define UMS_FLAG_GONE 0x0080 /* device is gone */
-#define UMS_FLAG_RD_WUP 0x0100 /* device is waiting for wakeup */
-#define UMS_FLAG_RD_SLP 0x0200 /* device is sleeping */
-#define UMS_FLAG_CLOSING 0x0400 /* device is closing */
-#define UMS_FLAG_DEV_OPEN 0x0800 /* device is open */
+#define UMS_FLAG_INTR_STALL 0x0020 /* set if transfer error */
u_int8_t sc_buttons;
u_int8_t sc_iid;
- u_int8_t sc_wakeup_read; /* dummy */
- u_int8_t sc_wakeup_sync_1; /* dummy */
};
+static void
+ums_put_queue_timeout(void *__sc);
+
+static void
+ums_clear_stall_callback(struct usbd_xfer *xfer);
+
+static void
+ums_intr_callback(struct usbd_xfer *xfer);
+
static device_probe_t ums_probe;
static device_attach_t ums_attach;
static device_detach_t ums_detach;
-static d_close_t ums_close;
+
+static void
+ums_start_read(struct usb_cdev *cdev);
+
+static void
+ums_stop_read(struct usb_cdev *cdev);
+static int32_t
+ums_open(struct usb_cdev *cdev, int32_t fflags,
+ int32_t devtype, struct thread *td);
+static int32_t
+ums_ioctl(struct usb_cdev *cdev, u_long cmd, caddr_t addr,
+ int32_t fflags, struct thread *td);
static void
ums_put_queue(struct ums_softc *sc, int32_t dx, int32_t dy,
int32_t dz, int32_t dt, int32_t buttons);
-extern cdevsw_t ums_cdevsw;
-
static void
ums_put_queue_timeout(void *__sc)
{
@@ -283,7 +289,7 @@
if (sc->sc_flags & UMS_FLAG_INTR_STALL) {
usbd_transfer_start(sc->sc_xfer[1]);
} else {
- USBD_IF_POLL(&sc->sc_rdq_free, m);
+ USBD_IF_POLL(&(sc->sc_cdev.sc_rdq_free), m);
if (m) {
usbd_start_hardware(xfer);
@@ -366,18 +372,17 @@
struct usb_attach_arg *uaa = device_get_ivars(dev);
struct ums_softc *sc = device_get_softc(dev);
void *d_ptr = NULL;
+ const char * p_buf[2];
int32_t unit = device_get_unit(dev);
int32_t d_len;
int32_t isize;
u_int32_t flags;
- usbd_status err;
+ int32_t err;
u_int8_t i;
+ char buf_1[16];
DPRINTF(10, "sc=%p\n", sc);
- sc->sc_rdq_free.ifq_maxlen = UMS_IFQ_MAXLEN;
- sc->sc_rdq_used.ifq_maxlen = UMS_IFQ_MAXLEN;
-
usbd_set_desc(dev, uaa->device);
mtx_init(&(sc->sc_mtx), "ums lock", NULL, MTX_DEF|MTX_RECURSE);
@@ -385,14 +390,6 @@
__callout_init_mtx(&(sc->sc_callout),
&(sc->sc_mtx), CALLOUT_RETURNUNLOCKED);
- sc->sc_mem_ptr_1 =
- usbd_alloc_mbufs(M_DEVBUF, &(sc->sc_rdq_free),
- UMS_BUF_SIZE, UMS_IFQ_MAXLEN);
-
- if (sc->sc_mem_ptr_1 == NULL) {
- goto detach;
- }
-
err = usbd_transfer_setup(uaa->device, uaa->iface_index, sc->sc_xfer,
ums_config, UMS_N_TRANSFER, sc,
&(sc->sc_mtx), &(sc->sc_mem_wait));
@@ -481,6 +478,7 @@
}
free(d_ptr, M_TEMP);
+ d_ptr = NULL;
#ifdef USB_DEBUG
DPRINTF(0, "sc=%p\n", sc);
@@ -522,11 +520,25 @@
sc->sc_status.dy = 0;
sc->sc_status.dz = 0;
- sc->sc_cdev_1 = make_dev
- (&ums_cdevsw, unit, UID_ROOT, GID_OPERATOR, 0644, "ums%d", unit);
+ snprintf(buf_1, sizeof(buf_1), "ums%d", unit);
+
+ p_buf[0] = buf_1;
+ p_buf[1] = NULL;
+
+ sc->sc_cdev.sc_start_read = &ums_start_read;
+ sc->sc_cdev.sc_stop_read = &ums_stop_read;
+ sc->sc_cdev.sc_open = &ums_open;
+ sc->sc_cdev.sc_ioctl = &ums_ioctl;
+ sc->sc_cdev.sc_flags |= (USB_CDEV_FLAG_FWD_SHORT|
+ USB_CDEV_FLAG_WAKEUP_RD_IMMED|
+ USB_CDEV_FLAG_WAKEUP_WR_IMMED);
- if (sc->sc_cdev_1) {
- DEV2SC(sc->sc_cdev_1) = sc;
+ err = usb_cdev_attach(&(sc->sc_cdev), sc, &(sc->sc_mtx), p_buf,
+ UID_ROOT, GID_OPERATOR, 0644,
+ UMS_BUF_SIZE, UMS_IFQ_MAXLEN,
+ 1, 1 /* dummy write buffer */);
+ if (err) {
+ goto detach;
}
return 0;
@@ -546,31 +558,10 @@
DPRINTF(0, "sc=%p\n", sc);
- mtx_lock(&(sc->sc_mtx));
- sc->sc_flags |= UMS_FLAG_GONE;
- mtx_unlock(&(sc->sc_mtx));
-
- if (sc->sc_cdev_1) {
-
- ums_close(sc->sc_cdev_1, 0, 0, 0);
-
- DEV2SC(sc->sc_cdev_1) = NULL;
-
- destroy_dev(sc->sc_cdev_1);
- }
-
- mtx_lock(&(sc->sc_mtx));
-
- __callout_stop(&(sc->sc_callout));
+ usb_cdev_detach(&(sc->sc_cdev));
- mtx_unlock(&(sc->sc_mtx));
-
usbd_transfer_unsetup(sc->sc_xfer, UMS_N_TRANSFER);
- if (sc->sc_mem_ptr_1) {
- free(sc->sc_mem_ptr_1, M_DEVBUF);
- }
-
usbd_transfer_drain(&(sc->sc_mem_wait), &(sc->sc_mtx));
__callout_drain(&(sc->sc_callout));
@@ -580,6 +571,25 @@
return 0;
}
+static void
+ums_start_read(struct usb_cdev *cdev)
+{
+ struct ums_softc *sc = cdev->sc_priv_ptr;
+ usbd_transfer_start(sc->sc_xfer[0]);
+ return;
+}
+
+static void
+ums_stop_read(struct usb_cdev *cdev)
+{
+ struct ums_softc *sc = cdev->sc_priv_ptr;
+ usbd_transfer_stop(sc->sc_xfer[1]);
+ usbd_transfer_stop(sc->sc_xfer[0]);
+ __callout_stop(&(sc->sc_callout));
+ return;
+}
+
+
#if ((MOUSE_SYS_PACKETSIZE != 8) || \
(MOUSE_MSC_PACKETSIZE != 5))
#error "Software assumptions are not met. Please update code."
@@ -589,14 +599,10 @@
ums_put_queue(struct ums_softc *sc, int32_t dx, int32_t dy,
int32_t dz, int32_t dt, int32_t buttons)
{
- struct usbd_mbuf *m;
- u_int8_t *buf;
+ u_int8_t buf[8];
- USBD_IF_DEQUEUE(&sc->sc_rdq_free, m);
+ if (1) {
- if (m) {
- USBD_MBUF_RESET(m);
-
if (dx > 254) dx = 254;
if (dx < -256) dx = -256;
if (dy > 254) dy = 254;
@@ -606,11 +612,8 @@
if (dt > 126) dt = 126;
if (dt < -128) dt = -128;
- buf = m->cur_data_ptr;
- m->cur_data_len = sc->sc_mode.packetsize;
-
buf[0] = sc->sc_mode.syncmask[1];
- buf[0] |= ~buttons & MOUSE_MSC_BUTTONS;
+ buf[0] |= (~buttons) & MOUSE_MSC_BUTTONS;
buf[1] = dx >> 1;
buf[2] = dy >> 1;
buf[3] = dx - (dx >> 1);
@@ -619,21 +622,12 @@
if (sc->sc_mode.level == 1) {
buf[5] = dz >> 1;
buf[6] = dz - (dz >> 1);
- buf[7] = ((~buttons >> 3) & MOUSE_SYS_EXTBUTTONS);
+ buf[7] = (((~buttons) >> 3) & MOUSE_SYS_EXTBUTTONS);
}
- USBD_IF_ENQUEUE(&(sc->sc_rdq_used), m);
-
- if (sc->sc_flags & UMS_FLAG_RD_WUP) {
- sc->sc_flags &= ~UMS_FLAG_RD_WUP;
- wakeup(&(sc->sc_wakeup_read));
- }
+ usb_cdev_put_data(&(sc->sc_cdev), buf,
+ sc->sc_mode.packetsize, 1);
- if (sc->sc_flags & UMS_FLAG_SELECT) {
- sc->sc_flags &= ~UMS_FLAG_SELECT;
- selwakeup(&(sc->sc_read_sel));
- }
-
} else {
DPRINTF(0, "Buffer full, discarded packet\n");
}
@@ -641,47 +635,6 @@
return;
}
-static int
-ums_uiomove(struct ums_softc *sc, u_int32_t context_bit,
- void *cp, int n, struct uio *uio)
-{
- int error;
-
- sc->sc_flags |= context_bit;
-
- mtx_unlock(&(sc->sc_mtx));
-
- error = uiomove(cp, n, uio);
-
- mtx_lock(&(sc->sc_mtx));
-
- sc->sc_flags &= ~context_bit;
-
- if (sc->sc_flags & UMS_FLAG_CLOSING) {
- wakeup(&(sc->sc_wakeup_sync_1));
- error = EINTR;
- }
- return error;
-}
-
-static int
-ums_msleep(struct ums_softc *sc, u_int32_t context_bit, void *ident)
-{
- int error;
-
- sc->sc_flags |= context_bit;
-
- error = msleep(ident, &(sc->sc_mtx), PRIBIO|PCATCH, "ums_sleep", 0);
-
- sc->sc_flags &= ~context_bit;
-
- if (sc->sc_flags & UMS_FLAG_CLOSING) {
- wakeup(&(sc->sc_wakeup_sync_1));
- error = EINTR;
- }
- return error;
-}
-
static void
ums_reset_buf(struct ums_softc *sc)
{
@@ -690,10 +643,10 @@
/* reset read queue */
while(1) {
- USBD_IF_DEQUEUE(&(sc->sc_rdq_used), m);
+ USBD_IF_DEQUEUE(&(sc->sc_cdev.sc_rdq_used), m);
if (m) {
- USBD_IF_ENQUEUE(&(sc->sc_rdq_free), m);
+ USBD_IF_ENQUEUE(&(sc->sc_cdev.sc_rdq_free), m);
} else {
break;
}
@@ -701,32 +654,14 @@
return;
}
-static int
-ums_open(struct cdev *dev, int flag, int fmt, struct thread *td)
+static int32_t
+ums_open(struct usb_cdev *cdev, int32_t fflags,
+ int32_t devtype, struct thread *td)
{
- struct ums_softc *sc = DEV2SC(dev);
- int error = 0;
+ struct ums_softc *sc = cdev->sc_priv_ptr;
DPRINTF(1, "\n");
- if (sc == NULL) {
- return EIO;
- }
-
- mtx_lock(&(sc->sc_mtx));
-
- /* check flags */
-
- if (sc->sc_flags &
- (UMS_FLAG_DEV_OPEN|UMS_FLAG_GONE)) {
- error = EBUSY;
- goto done;
- }
-
- /* reset buffer */
-
- ums_reset_buf(sc);
-
/* reset status */
sc->sc_status.flags = 0;
@@ -737,215 +672,19 @@
sc->sc_status.dz = 0;
/* sc->sc_status.dt = 0; */
- /* start interrupt transfer */
-
- usbd_transfer_start(sc->sc_xfer[0]);
-
- sc->sc_flags |= UMS_FLAG_DEV_OPEN;
-
- done:
- mtx_unlock(&(sc->sc_mtx));
-
- return error;
-}
-
-static int
-ums_close(struct cdev *dev, int flag, int fmt, struct thread *td)
-{
- struct ums_softc *sc = DEV2SC(dev);
- int error;
-
- DPRINTF(1, "\n");
-
- if (sc == NULL) {
- return EIO;
- }
-
- mtx_lock(&(sc->sc_mtx));
-
- if (sc->sc_flags & UMS_FLAG_CLOSING) {
- goto done;
- }
-
- if (sc->sc_flags & UMS_FLAG_DEV_OPEN) {
-
- sc->sc_flags |= UMS_FLAG_CLOSING;
-
- /* stop transfers */
-
- if (sc->sc_xfer[0]) {
- usbd_transfer_stop(sc->sc_xfer[0]);
- }
-
- if (sc->sc_xfer[1]) {
- usbd_transfer_stop(sc->sc_xfer[1]);
- }
-
- /* stop callout */
-
- __callout_stop(&(sc->sc_callout));
-
- while (sc->sc_flags &
- (UMS_FLAG_RD_SLP|UMS_FLAG_RD_WUP)) {
-
- if (sc->sc_flags & UMS_FLAG_RD_WUP) {
- sc->sc_flags &= ~UMS_FLAG_RD_WUP;
- wakeup(&(sc->sc_wakeup_read));
- }
-
- error = msleep(&(sc->sc_wakeup_sync_1), &(sc->sc_mtx),
- PRIBIO, "ums_sync_1", 0);
- }
-
- if (sc->sc_flags & UMS_FLAG_SELECT) {
- sc->sc_flags &= ~UMS_FLAG_SELECT;
- selwakeup(&(sc->sc_read_sel));
- }
-
- sc->sc_flags &= ~(UMS_FLAG_DEV_OPEN|
- UMS_FLAG_CLOSING);
- }
-
- done:
- mtx_unlock(&(sc->sc_mtx));
-
- DPRINTF(0, "closed\n");
-
return 0;
}
-static int
-ums_read(struct cdev *dev, struct uio *uio, int flag)
+static int32_t
+ums_ioctl(struct usb_cdev *cdev, u_long cmd, caddr_t addr,
+ int32_t fflags, struct thread *td)
{
- struct ums_softc *sc = DEV2SC(dev);
- struct usbd_mbuf *m;
- int error = 0;
- int io_len;
-
- if (sc == NULL) {
- return EIO;
- }
-
- DPRINTF(1, "\n");
-
- mtx_lock(&(sc->sc_mtx));
-
- if (sc->sc_flags & (UMS_FLAG_CLOSING|UMS_FLAG_GONE|
- UMS_FLAG_RD_SLP)) {
- error = EIO;
- goto done;
- }
-
- while (uio->uio_resid) {
-
- USBD_IF_DEQUEUE(&(sc->sc_rdq_used), m);
-
- if (m == NULL) {
-
- /* start reader thread */
-
- usbd_transfer_start(sc->sc_xfer[0]);
-
- if (flag & O_NONBLOCK) {
- error = EWOULDBLOCK;
- goto done;
- }
-
- error = ums_msleep(sc, (UMS_FLAG_RD_SLP|UMS_FLAG_RD_WUP),
- &(sc->sc_wakeup_read));
- if (error) {
- break;
- } else {
- continue;
- }
- }
-
- io_len = min(m->cur_data_len, uio->uio_resid);
-
- DPRINTF(1, "transfer %d bytes from %p\n",
- io_len, m->cur_data_ptr);
-
- error = ums_uiomove(sc, UMS_FLAG_RD_SLP, m->cur_data_ptr,
- io_len, uio);
-
- m->cur_data_len -= io_len;
- m->cur_data_ptr += io_len;
-
- if (m->cur_data_len == 0) {
- USBD_IF_ENQUEUE(&sc->sc_rdq_free, m);
- } else {
- USBD_IF_PREPEND(&sc->sc_rdq_used, m);
- }
-
- if (error) {
- break;
- }
- }
-
- done:
- mtx_unlock(&(sc->sc_mtx));
-
- return error;
-}
-
-static int
-ums_poll(struct cdev *dev, int events, struct thread *td)
-{
- struct ums_softc *sc = DEV2SC(dev);
- struct usbd_mbuf *m;
- int32_t revents = 0;
-
- if (sc == NULL) {
- return POLLNVAL;
- }
-
- DPRINTF(1, "\n");
-
- mtx_lock(&(sc->sc_mtx));
-
- if (sc->sc_flags & (UMS_FLAG_CLOSING|UMS_FLAG_GONE)) {
- revents = POLLNVAL;
- goto done;
- }
-
- if (events & (POLLIN | POLLRDNORM)) {
-
- USBD_IF_POLL(&(sc->sc_rdq_used), m);
-
- if (m) {
- revents = events & (POLLIN | POLLRDNORM);
- } else {
- sc->sc_flags |= UMS_FLAG_SELECT;
- selrecord(td, &(sc->sc_read_sel));
- }
- }
-
- done:
- mtx_unlock(&(sc->sc_mtx));
-
- return revents;
-}
-
-static int
-ums_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td)
-{
- struct ums_softc *sc = DEV2SC(dev);
+ struct ums_softc *sc = cdev->sc_priv_ptr;
mousemode_t mode;
int error = 0;
- if (sc == NULL) {
- return EIO;
- }
-
DPRINTF(1, "\n");
- mtx_lock(&(sc->sc_mtx));
-
- if (sc->sc_flags & (UMS_FLAG_CLOSING|UMS_FLAG_GONE)) {
- error = EIO;
- goto done;
- }
-
switch(cmd) {
case MOUSE_GETHWINFO:
*(mousehw_t *)addr = sc->sc_hw;
@@ -1048,21 +787,9 @@
}
done:
- mtx_unlock(&(sc->sc_mtx));
-
return error;
}
-cdevsw_t ums_cdevsw = {
- .d_version = D_VERSION,
- .d_open = ums_open,
- .d_close = ums_close,
- .d_read = ums_read,
- .d_ioctl = ums_ioctl,
- .d_poll = ums_poll,
- .d_name = "ums",
-};
-
static devclass_t ums_devclass;
static device_method_t ums_methods[] = {
More information about the p4-projects
mailing list