Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/dev/video.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/dev/video.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.32.8.2 retrieving revision 1.33 diff -u -p -r1.32.8.2 -r1.33 --- src/sys/dev/video.c 2016/07/26 07:44:44 1.32.8.2 +++ src/sys/dev/video.c 2017/06/01 02:45:09 1.33 @@ -1,4 +1,4 @@ -/* $NetBSD: video.c,v 1.32.8.2 2016/07/26 07:44:44 pgoyette Exp $ */ +/* $NetBSD: video.c,v 1.33 2017/06/01 02:45:09 chs Exp $ */ /* * Copyright (c) 2008 Patrick Mahoney @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: video.c,v 1.32.8.2 2016/07/26 07:44:44 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: video.c,v 1.33 2017/06/01 02:45:09 chs Exp $"); #include "video.h" #if NVIDEO > 0 @@ -1611,7 +1611,7 @@ videoopen(dev_t dev, int flags, int ifmt DPRINTF(("videoopen\n")); - sc = device_private(device_lookup_acquire(&video_cd, VIDEOUNIT(dev))); + sc = device_private(device_lookup(&video_cd, VIDEOUNIT(dev))); if (sc == NULL) { DPRINTF(("videoopen: failed to get softc for unit %d\n", VIDEOUNIT(dev))); @@ -1620,7 +1620,6 @@ videoopen(dev_t dev, int flags, int ifmt if (sc->sc_dying) { DPRINTF(("videoopen: dying\n")); - device_release(sc->sc_dev); return EIO; } @@ -1630,10 +1629,8 @@ videoopen(dev_t dev, int flags, int ifmt flags, sc, sc->hw_dev)); hw = sc->hw_if; - if (hw == NULL) { - device_release(sc->sc_dev); + if (hw == NULL) return ENXIO; - } device_active(sc->sc_dev, DVA_SYSTEM); @@ -1641,10 +1638,8 @@ videoopen(dev_t dev, int flags, int ifmt if (hw->open != NULL) { err = hw->open(sc->hw_softc, flags); - if (err) { - device_release(sc->sc_dev); + if (err) return err; - } } /* set up input stream. TODO: check flags to determine if @@ -1653,12 +1648,9 @@ videoopen(dev_t dev, int flags, int ifmt if (hw->get_format != NULL) { err = hw->get_format(sc->hw_softc, &vs->vs_format); - if (err != 0) { - device_release(sc->sc_dev); + if (err != 0) return err; - } } - device_release(sc->sc_dev); return 0; } @@ -1669,17 +1661,15 @@ videoclose(dev_t dev, int flags, int ifm struct video_softc *sc; const struct video_hw_if *hw; - sc = device_private(device_lookup_acquire(&video_cd, VIDEOUNIT(dev))); + sc = device_private(device_lookup(&video_cd, VIDEOUNIT(dev))); if (sc == NULL) return ENXIO; DPRINTF(("videoclose: sc=%p\n", sc)); hw = sc->hw_if; - if (hw == NULL) { - device_release(sc->sc_dev); + if (hw == NULL) return ENXIO; - } device_active(sc->sc_dev, DVA_SYSTEM); @@ -1694,7 +1684,6 @@ videoclose(dev_t dev, int flags, int ifm sc->sc_open = 0; sc->sc_opencnt--; - device_release(sc->sc_dev); return 0; } @@ -1710,14 +1699,12 @@ videoread(dev_t dev, struct uio *uio, in size_t len; off_t offset; - sc = device_private(device_lookup_acquire(&video_cd, VIDEOUNIT(dev))); + sc = device_private(device_lookup(&video_cd, VIDEOUNIT(dev))); if (sc == NULL) return ENXIO; - if (sc->sc_dying) { - device_release(sc->sc_dev); + if (sc->sc_dying) return EIO; - } vs = &sc->sc_stream_in; @@ -1726,17 +1713,13 @@ videoread(dev_t dev, struct uio *uio, in err = video_stream_setup_bufs(vs, VIDEO_STREAM_METHOD_READ, VIDEO_NUM_BUFS); - if (err == 0) - err = video_stream_on(sc, vs->vs_type); - - if (err != 0) { - device_release(sc->sc_dev); + if (err != 0) return err; - } + err = video_stream_on(sc, vs->vs_type); + if (err != 0) return err; } else if (vs->vs_method != VIDEO_STREAM_METHOD_READ) { - device_release(sc->sc_dev); return EBUSY; } @@ -1746,7 +1729,6 @@ retry: if (SIMPLEQ_EMPTY(&vs->vs_egress)) { if (vs->vs_flags & O_NONBLOCK) { mutex_exit(&vs->vs_lock); - device_release(sc->sc_dev); return EAGAIN; } @@ -1756,7 +1738,6 @@ retry: &vs->vs_lock); if (err != 0) { mutex_exit(&vs->vs_lock); - device_release(sc->sc_dev); return EINTR; } } @@ -1781,10 +1762,8 @@ retry: if (scatter_io_init(&vs->vs_data, offset, len, &sio)) { err = scatter_io_uiomove(&sio, uio); - if (err == EFAULT) { - device_release(sc->sc_dev); + if (err == EFAULT) return EFAULT; - } vs->vs_bytesread += (len - sio.sio_resid); } else { DPRINTF(("video: invalid read\n")); @@ -1801,7 +1780,6 @@ retry: vs->vs_bytesread = 0; } - device_release(sc->sc_dev); return 0; } @@ -1883,23 +1861,19 @@ videoioctl(dev_t dev, u_long cmd, void * v4l2_std_id *stdid; enum v4l2_buf_type *typep; int *ip; - int error; #ifndef _LP64 struct v4l2_buffer bufspace; + int error; #endif - sc = device_private(device_lookup_acquire(&video_cd, VIDEOUNIT(dev))); + sc = device_private(device_lookup(&video_cd, VIDEOUNIT(dev))); - if (sc->sc_dying) { - device_release(sc->sc_dev); + if (sc->sc_dying) return EIO; - } hw = sc->hw_if; - if (hw == NULL) { - device_release(sc->sc_dev); + if (hw == NULL) return ENXIO; - } switch (cmd) { case VIDIOC_QUERYCAP: @@ -1922,164 +1896,128 @@ videoioctl(dev_t dev, u_long cmd, void * if (hw->set_audio != NULL && hw->get_audio != NULL && hw->enum_audio != NULL) cap->capabilities |= V4L2_CAP_AUDIO; - break; + return 0; case VIDIOC_ENUM_FMT: /* TODO: for now, just enumerate one default format */ fmtdesc = data; if (fmtdesc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - error = EINVAL; - else - error = video_enum_format(sc, fmtdesc); - break; + return EINVAL; + return video_enum_format(sc, fmtdesc); case VIDIOC_G_FMT: fmt = data; - error = video_get_format(sc, fmt); - break; + return video_get_format(sc, fmt); case VIDIOC_S_FMT: fmt = data; if ((flag & FWRITE) == 0) - error = EPERM; - else - error = video_set_format(sc, fmt); - break; + return EPERM; + return video_set_format(sc, fmt); case VIDIOC_TRY_FMT: fmt = data; - error = video_try_format(sc, fmt); - break; + return video_try_format(sc, fmt); case VIDIOC_ENUMSTD: std = data; - error = video_enum_standard(sc, std); - break; + return video_enum_standard(sc, std); case VIDIOC_G_STD: stdid = data; - error = video_get_standard(sc, stdid); - break; + return video_get_standard(sc, stdid); case VIDIOC_S_STD: stdid = data; if ((flag & FWRITE) == 0) - error = EPERM; - else - error = video_set_standard(sc, *stdid); - break; + return EPERM; + return video_set_standard(sc, *stdid); case VIDIOC_ENUMINPUT: input = data; - error = video_enum_input(sc, input); - break; + return video_enum_input(sc, input); case VIDIOC_G_INPUT: ip = data; - error = video_get_input(sc, ip); - break; + return video_get_input(sc, ip); case VIDIOC_S_INPUT: ip = data; if ((flag & FWRITE) == 0) - error = EPERM; - else - error = video_set_input(sc, *ip); - break; + return EPERM; + return video_set_input(sc, *ip); case VIDIOC_ENUMAUDIO: audio = data; - error = video_enum_audio(sc, audio); - break; + return video_enum_audio(sc, audio); case VIDIOC_G_AUDIO: audio = data; - error = video_get_audio(sc, audio); - break; + return video_get_audio(sc, audio); case VIDIOC_S_AUDIO: audio = data; if ((flag & FWRITE) == 0) - error = EPERM; - else - error = video_set_audio(sc, audio); - break; + return EPERM; + return video_set_audio(sc, audio); case VIDIOC_G_TUNER: tuner = data; - error = video_get_tuner(sc, tuner); - break; + return video_get_tuner(sc, tuner); case VIDIOC_S_TUNER: tuner = data; if ((flag & FWRITE) == 0) - error = EPERM; - else - error = video_set_tuner(sc, tuner); - break; + return EPERM; + return video_set_tuner(sc, tuner); case VIDIOC_G_FREQUENCY: freq = data; - error = video_get_frequency(sc, freq); - break; + return video_get_frequency(sc, freq); case VIDIOC_S_FREQUENCY: freq = data; if ((flag & FWRITE) == 0) - error = EPERM; - else - error = video_set_frequency(sc, freq); - break; + return EPERM; + return video_set_frequency(sc, freq); case VIDIOC_QUERYCTRL: query = data; - error = (video_query_control(sc, query)); - break; + return (video_query_control(sc, query)); case VIDIOC_G_CTRL: control = data; - error = (video_get_control(sc, control)); - break; + return (video_get_control(sc, control)); case VIDIOC_S_CTRL: control = data; if ((flag & FWRITE) == 0) - error = EPERM; - else - error = (video_set_control(sc, control)); - break; + return EPERM; + return (video_set_control(sc, control)); case VIDIOC_REQBUFS: reqbufs = data; - error = (video_request_bufs(sc, reqbufs)); - break; + return (video_request_bufs(sc, reqbufs)); case VIDIOC_QUERYBUF: buf = data; - error = video_query_buf(sc, buf); - break; + return video_query_buf(sc, buf); #ifndef _LP64 case VIDIOC_QUERYBUF50: buf50tobuf(data, buf = &bufspace); - if ((error = video_query_buf(sc, buf)) == 0) - buftobuf50(data, buf); - break; + if ((error = video_query_buf(sc, buf)) != 0) + return error; + buftobuf50(data, buf); + return 0; #endif case VIDIOC_QBUF: buf = data; - error = video_queue_buf(sc, buf); - break; + return video_queue_buf(sc, buf); #ifndef _LP64 case VIDIOC_QBUF50: buf50tobuf(data, buf = &bufspace); - error = video_queue_buf(sc, buf); - break; + return video_queue_buf(sc, buf); #endif case VIDIOC_DQBUF: buf = data; - error = video_dequeue_buf(sc, buf); - break; + return video_dequeue_buf(sc, buf); #ifndef _LP64 case VIDIOC_DQBUF50: buf50tobuf(data, buf = &bufspace); - if ((error = video_dequeue_buf(sc, buf)) == 0) - buftobuf50(data, buf); - break; + if ((error = video_dequeue_buf(sc, buf)) != 0) + return error; + buftobuf50(data, buf); + return 0; #endif case VIDIOC_STREAMON: typep = data; - error = video_stream_on(sc, *typep); - break; + return video_stream_on(sc, *typep); case VIDIOC_STREAMOFF: typep = data; - error = video_stream_off(sc, *typep); - break; + return video_stream_off(sc, *typep); default: DPRINTF(("videoioctl: invalid cmd %s (%lx)\n", video_ioctl_str(cmd), cmd)); - error = EINVAL; - break; + return EINVAL; } - device_release(sc->sc_dev); - return error; } #ifdef VIDEO_DEBUG @@ -2271,28 +2209,23 @@ videopoll(dev_t dev, int events, struct struct video_stream *vs; int err, revents = 0; - sc = device_private(device_lookup_acquire(&video_cd, VIDEOUNIT(dev))); + sc = device_private(device_lookup(&video_cd, VIDEOUNIT(dev))); vs = &sc->sc_stream_in; - if (sc->sc_dying) { - device_release(sc->sc_dev); + if (sc->sc_dying) return (POLLHUP); - } /* userspace has chosen read() method */ if (vs->vs_method == VIDEO_STREAM_METHOD_NONE) { err = video_stream_setup_bufs(vs, VIDEO_STREAM_METHOD_READ, VIDEO_NUM_BUFS); - if (err != 0) { - device_release(sc->sc_dev); + if (err != 0) return POLLERR; - } + err = video_stream_on(sc, vs->vs_type); - if (err != 0) { - device_release(sc->sc_dev); + if (err != 0) return POLLERR; - } } mutex_enter(&vs->vs_lock); @@ -2302,7 +2235,6 @@ videopoll(dev_t dev, int events, struct selrecord(l, &vs->vs_sel); mutex_exit(&vs->vs_lock); - device_release(sc->sc_dev); return (revents); } @@ -2312,19 +2244,15 @@ videommap(dev_t dev, off_t off, int prot { struct video_softc *sc; struct video_stream *vs; - paddr_t pa; + /* paddr_t pa; */ - sc = device_private(device_lookup_acquire(&video_cd, VIDEOUNIT(dev))); - if (sc->sc_dying) { - device_release(sc->sc_dev); + sc = device_lookup_private(&video_cd, VIDEOUNIT(dev)); + if (sc->sc_dying) return -1; - } vs = &sc->sc_stream_in; - pa = scatter_buf_map(&vs->vs_data, off); - device_release(sc->sc_dev); - return pa; + return scatter_buf_map(&vs->vs_data, off); } @@ -2448,15 +2376,7 @@ video_buffer_alloc(void) struct video_buffer *vb; vb = kmem_alloc(sizeof(*vb), KM_SLEEP); - if (vb == NULL) - return NULL; - vb->vb_buf = kmem_alloc(sizeof(*vb->vb_buf), KM_SLEEP); - if (vb->vb_buf == NULL) { - kmem_free(vb, sizeof(*vb)); - return NULL; - } - return vb; } @@ -2502,12 +2422,6 @@ video_stream_realloc_bufs(struct video_s if (nbufs > 0) { vs->vs_buf = kmem_alloc(sizeof(struct video_buffer *) * nbufs, KM_SLEEP); - if (vs->vs_buf == NULL) { - vs->vs_nbufs = oldnbufs; - vs->vs_buf = oldbuf; - - return ENOMEM; - } } else { vs->vs_buf = NULL; } @@ -2731,11 +2645,6 @@ scatter_buf_set_size(struct scatter_buf if (npages > 0) { sb->sb_page_ary = kmem_alloc(sizeof(uint8_t *) * npages, KM_SLEEP); - if (sb->sb_page_ary == NULL) { - sb->sb_npages = oldnpages; - sb->sb_page_ary = old_ary; - return ENOMEM; - } } else { sb->sb_page_ary = NULL; } @@ -2745,17 +2654,8 @@ scatter_buf_set_size(struct scatter_buf for (i = 0; i < minpages; ++i) sb->sb_page_ary[i] = old_ary[i]; /* allocate any new pages */ - for (; i < npages; ++i) { - sb->sb_page_ary[i] = pool_cache_get(sb->sb_pool, 0); - /* TODO: does pool_cache_get return NULL on - * ENOMEM? If so, we need to release or note - * the pages with did allocate - * successfully. */ - if (sb->sb_page_ary[i] == NULL) { - DPRINTF(("video: pool_cache_get ENOMEM\n")); - return ENOMEM; - } - } + for (; i < npages; ++i) + sb->sb_page_ary[i] = pool_cache_get(sb->sb_pool, PR_WAITOK); /* return any pages no longer needed */ for (; i < oldnpages; ++i) pool_cache_put(sb->sb_pool, old_ary[i]);