From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A6EA5C433E0 for ; Sun, 21 Jun 2020 00:59:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3EBC724754 for ; Sun, 21 Jun 2020 00:59:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=aeam.us header.i=@aeam.us header.b="criXavDo"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="oq/KNX6q" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728901AbgFUA7L (ORCPT ); Sat, 20 Jun 2020 20:59:11 -0400 Received: from wout3-smtp.messagingengine.com ([64.147.123.19]:32961 "EHLO wout3-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728531AbgFUA7L (ORCPT ); Sat, 20 Jun 2020 20:59:11 -0400 Received: from compute7.internal (compute7.nyi.internal [10.202.2.47]) by mailout.west.internal (Postfix) with ESMTP id CACB31902; Sat, 20 Jun 2020 20:59:09 -0400 (EDT) Received: from imap21 ([10.202.2.71]) by compute7.internal (MEProxy); Sat, 20 Jun 2020 20:59:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aeam.us; h= mime-version:message-id:in-reply-to:references:date:from:to:cc :subject:content-type; s=fm2; bh=qch85GwLhcggwFf8rGDXRrNH4rXfJp0 XnKRdXJRHvSw=; b=criXavDoHWzaUDnJ8VwjoH42BhDigWul4jbgfZdRFcYsFaQ mMVXqVFT3R2I/jZaHvBzWCLWGk0e9v30FaxgCQmt/gpolHsGgvZ3Lygh0/FIBBgd eg4vWHjpzAG+qpNkqeZsUXPQ8LrOGlo2W06Xl8GhhJTFz+Yw8VjohRUV1zRwW81w U60LAmvZRQ2RdsCaNuYzBMrxXvupShCF/kIGRdrDzSkHg4cNM2PjGMgaQvYWs1rT GjJT//j1EGE7+K0n+YHncMh37m2CvromuAejh9Rn0tUVC+U2EuK7EGAiLdWXifDh WdRz7snk4REhCYjtKoz6hZZvOGN4IP59nCmZBqQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=qch85G wLhcggwFf8rGDXRrNH4rXfJp0XnKRdXJRHvSw=; b=oq/KNX6q81mpMonv84HjEx EOovV5yv43OVMLn9aT9l+T6Bk7u69QQL0SYWncOHwnii+8GagsU1adjJsL4mMlT1 9+t7i1XfgtW+KOfRCZEFbVDsZseYe/rDFJjrFIGhnF9VepldsIkadzLyXtsp8hrT x9wDYsrvksZNTIN/CYt9KqRZl9nhBUsDmnZOhC81E27bQxOhHHq3OXv2OQi08NlZ M0k5eQQqmvLyK4njYpLiDsteezNpOfYkfdtoe6DTHrctP5hWDbG/bSC1XSADAhpI 89ETPxR++izG7FQn6YoskAcHLZjP3VM/StfZRiwfuK0ETug15w0BYULhAPpmXn5w == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduhedrudejledggeefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvffutgesthdtredtreertdenucfhrhhomhepfdfuihgu ucfuphhrhidfuceoshhiugesrggvrghmrdhusheqnecuggftrfgrthhtvghrnhepveeghf evveetteefteekjeejhedufffffffhuefflefhueffudefudeljeefuefgnecuvehluhhs thgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepshhiugesrggvrghmrd hush X-ME-Proxy: Received: by mailuser.nyi.internal (Postfix, from userid 501) id E982166007E; Sat, 20 Jun 2020 20:59:08 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.3.0-dev0-543-gda70334-fm-20200618.004-gda703345 Mime-Version: 1.0 Message-Id: In-Reply-To: <20200620142400.GA82155@rowland.harvard.edu> References: <30d7899b-9723-4698-bec2-aabfeeedde1b@www.fastmail.com> <20200620142400.GA82155@rowland.harvard.edu> Date: Sat, 20 Jun 2020 19:58:24 -0500 From: "Sid Spry" To: "Alan Stern" Cc: linux-usb@vger.kernel.org Subject: Re: Unable to use struct usb_endpoint_descriptor in FunctionFS Content-Type: text/plain Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org On Sat, Jun 20, 2020, at 9:24 AM, Alan Stern wrote: > On Fri, Jun 19, 2020 at 11:04:31PM -0500, Sid Spry wrote: > > Hello, I've figured out how to get my userspace driver code to enumerate for > > the host and send/receive from the device with bulk endpoints as demonstrated > > in ffs-test.c. I have successfully added another bulk endpoint, but issues > > arise when I try to add an isochronous endpoint. > > > > I've tracked the problem, I think, to the mere presence of the struct > > usb_endpoint_descriptor. Is anyone able to elucidate what I might be missing? > > > > The rejected set of descriptors follows. Note I set the usb_endpoint_descriptor > > struct to be a bulk endpoint; I expect the extra fields would be ignored. > > > > I can provide the full code if helpful. Superspeed descriptors commented out > > as I'm less familiar with USB3 and I found that the fs/hs/ss descriptor sets had > > to be equivalent. > > > > ``` > > static const struct { > > struct usb_functionfs_descs_head_v2 header; > > __le32 fs_count; > > __le32 hs_count; > > //__le32 ss_count; > > struct { > > struct usb_interface_descriptor intf; > > struct usb_endpoint_descriptor_no_audio sink; > > struct usb_endpoint_descriptor_no_audio source; > > struct usb_endpoint_descriptor iso_sink; > > } __attribute__((packed)) fs_descs, hs_descs; > > /*struct { > > struct usb_interface_descriptor intf; > > struct usb_endpoint_descriptor_no_audio sink; > > struct usb_ss_ep_comp_descriptor sink_comp; > > struct usb_endpoint_descriptor_no_audio source; > > struct usb_ss_ep_comp_descriptor source_comp; > > } ss_descs;*/ > > } __attribute__((packed)) descriptors = { > > .header = { > > .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2), > > .length = cpu_to_le32(sizeof descriptors), > > .flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC | > > FUNCTIONFS_HAS_HS_DESC), // | > > //FUNCTIONFS_HAS_SS_DESC), > > }, > > .fs_count = cpu_to_le32(4), > > .hs_count = cpu_to_le32(4), > > //.ss_count = cpu_to_le32(5), > > .fs_descs = { > > .intf = { > > .bLength = sizeof descriptors.fs_descs.intf, > > .bDescriptorType = USB_DT_INTERFACE, > > .bNumEndpoints = 2, > > This should be 3, not 2. > > Alan Stern > Thanks for catching this. However, that change does not solve the problem. It seems fs_count and hs_count supercede that number. I never used USB FS but if I had I probably would have noticed the dropped endpoint. With the fix you provided I still get "Invalid argument" when attempting to write the descriptors to ep0. If I change the struct to the _no_audio version then it works with no other changes. I appreciate the help, this is something I've been doing on/off for about ~6mo from the Linux side. Wasted about 2 years with proprietary MCU stuff. > > .bInterfaceClass = USB_CLASS_VENDOR_SPEC, > > .iInterface = 1, > > }, > > .sink = { > > .bLength = sizeof descriptors.fs_descs.sink, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 1 | USB_DIR_IN, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > /* .wMaxPacketSize = autoconfiguration (kernel) */ > > }, > > .source = { > > .bLength = sizeof descriptors.fs_descs.source, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 2 | USB_DIR_OUT, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > /* .wMaxPacketSize = autoconfiguration (kernel) */ > > }, > > .iso_sink = { > > .bLength = sizeof descriptors.fs_descs.iso_sink, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 3 | USB_DIR_OUT, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > }, > > }, > > .hs_descs = { > > .intf = { > > .bLength = sizeof descriptors.fs_descs.intf, > > .bDescriptorType = USB_DT_INTERFACE, > > .bNumEndpoints = 3, > > .bInterfaceClass = USB_CLASS_VENDOR_SPEC, > > .iInterface = 1, > > }, > > .sink = { > > .bLength = sizeof descriptors.hs_descs.sink, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 1 | USB_DIR_IN, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > .wMaxPacketSize = cpu_to_le16(512), > > }, > > .source = { > > .bLength = sizeof descriptors.hs_descs.iso_sink, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 2 | USB_DIR_OUT, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > .wMaxPacketSize = cpu_to_le16(512), > > .bInterval = 1, > > }, > > .iso_sink = { > > .bLength = sizeof descriptors.hs_descs.source, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 3 | USB_DIR_OUT, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > .wMaxPacketSize = cpu_to_le16(512), > > .bInterval = 1, > > }, > > > > }, > > /*.ss_descs = { > > .intf = { > > .bLength = sizeof descriptors.fs_descs.intf, > > .bDescriptorType = USB_DT_INTERFACE, > > .bNumEndpoints = 2, > > .bInterfaceClass = USB_CLASS_VENDOR_SPEC, > > .iInterface = 1, > > }, > > .sink = { > > .bLength = sizeof descriptors.hs_descs.sink, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 1 | USB_DIR_IN, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > .wMaxPacketSize = cpu_to_le16(1024), > > }, > > .sink_comp = { > > .bLength = USB_DT_SS_EP_COMP_SIZE, > > .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, > > .bMaxBurst = 0, > > .bmAttributes = 0, > > .wBytesPerInterval = 0, > > }, > > .source = { > > .bLength = sizeof descriptors.hs_descs.source, > > .bDescriptorType = USB_DT_ENDPOINT, > > .bEndpointAddress = 2 | USB_DIR_OUT, > > .bmAttributes = USB_ENDPOINT_XFER_BULK, > > .wMaxPacketSize = cpu_to_le16(1024), > > .bInterval = 1, > > }, > > .source_comp = { > > .bLength = USB_DT_SS_EP_COMP_SIZE, > > .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, > > .bMaxBurst = 0, > > .bmAttributes = 0, > > .wBytesPerInterval = 0, > > }, > > },*/ > > }; > > ``` > > > > Cheers! >