Re: [PATCH v2 2/2] usb: gadget: uvc: limit isoc_sg to super speed gadgets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Morning Hans

On 18/07/2023 09:46, Hans Verkuil wrote:
Laurent, Dan,

On 24/01/2023 23:35, Michael Grzeschik wrote:
Gentle Ping!
Can one of you look at this series? I see that Dan was added as UVC Gadget maintainer
earlier this year, so perhaps Dan can look at this? And also other UVC Gadget patches
from Michael:

https://patchwork.linuxtv.org/project/linux-media/list/?submitter=545

Patchwork is messy: think several of the patches in that list are either superseded
or are already merged, but the status was never updated.


Sorry; I'll put some time aside and look at the list this week.


Thanks

Dan


Regards,

	Hans

On Fri, Nov 25, 2022 at 04:34:50PM +0100, Michael Grzeschik wrote:
When calling uvc_video_encode_isoc_sg the function is preparing the sg payload
by setting the sglist pointers of the videobuffer for the request. The usb
gadget driver then is parsing the sg list and uses each sg entry to send in one
urb to the host. Because of the unrelated buffer of the uvc header that buffer
has to be send separately in an extra sg entry.

When it comes to transfers with an limited payload (e.g. the maximum of 3kB for
high-speed) this extra payload handling is not justified. A simple memcpy of
the header and payload is usually faster and does not come with that extra
runtime overhead.

This patch is changing the uvc_video_encode_isoc_sg encode function only to be
used for super speed gadgets.

Cc: stable <stable@xxxxxxxxxx>
Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx>

---
v1 -> v2: - left the sg assignment in uvc_buffer_sg under the test for use_sg
          - rephrased the commit message

drivers/usb/gadget/function/uvc_queue.c | 3 +--
drivers/usb/gadget/function/uvc_video.c | 9 +++++++--
2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/gadget/function/uvc_queue.c b/drivers/usb/gadget/function/uvc_queue.c
index 0aa3d7e1f3cc32..0abb1763faf1b6 100644
--- a/drivers/usb/gadget/function/uvc_queue.c
+++ b/drivers/usb/gadget/function/uvc_queue.c
@@ -87,9 +87,8 @@ static int uvc_buffer_prepare(struct vb2_buffer *vb)
     if (queue->use_sg) {
         buf->sgt = vb2_dma_sg_plane_desc(vb, 0);
         buf->sg = buf->sgt->sgl;
-    } else {
-        buf->mem = vb2_plane_vaddr(vb, 0);
     }
+    buf->mem = vb2_plane_vaddr(vb, 0);
     buf->length = vb2_plane_size(vb, 0);
     if (vb->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
         buf->bytesused = 0;
diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c
index dd1c6b2ca7c6f3..b6ea600b011185 100644
--- a/drivers/usb/gadget/function/uvc_video.c
+++ b/drivers/usb/gadget/function/uvc_video.c
@@ -459,6 +459,9 @@ static void uvcg_video_pump(struct work_struct *work)
  */
int uvcg_video_enable(struct uvc_video *video, int enable)
{
+    struct uvc_device *uvc = video->uvc;
+    struct usb_composite_dev *cdev = uvc->func.config->cdev;
+    struct usb_gadget *gadget = cdev->gadget;
     unsigned int i;
     int ret;

@@ -490,9 +493,11 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
     if (video->max_payload_size) {
         video->encode = uvc_video_encode_bulk;
         video->payload_size = 0;
-    } else
-        video->encode = video->queue.use_sg ?
+    } else {
+        video->encode = (video->queue.use_sg &&
+                 !(gadget->speed <= USB_SPEED_HIGH)) ?
             uvc_video_encode_isoc_sg : uvc_video_encode_isoc;
+    }

     video->req_int_count = 0;

--
2.30.2




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux