Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Jul 2020 23:21:33 +0200
From:      Hans Petter Selasky <hps@selasky.org>
To:        "Brian Mcgovern (bmcgover)" <bmcgover@cisco.com>, "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: Question on structure of USB (specifically USB Serial) stack
Message-ID:  <c20edccb-616b-aedf-6a60-e4857341f2fb@selasky.org>
In-Reply-To: <BL0PR11MB34425EBBCF3E674E6A7766E1C57F0@BL0PR11MB3442.namprd11.prod.outlook.com>
References:  <BL0PR11MB34425EBBCF3E674E6A7766E1C57F0@BL0PR11MB3442.namprd11.prod.outlook.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2020-07-16 22:20, Brian Mcgovern (bmcgover) via freebsd-hackers wrote:
> All,
>    I'm doing some playing with the ucom code, and I'm down to a link in the data that I'm just not confident I've parsed the code correctly. In sys/dev/usb/serial/usb_serial.c,  specifically in ucom_attach_tty, I'm trying to get a reference to the usb_device structure for the device used elsewhere in the USB code. The specific devices I'm working with are USB->RJ 45 cables with a built in FTDI chip, in case this matters
> 
>    It appears that the ucom_super_softc and ucom_softc structures are available. From looking around the code, it appears the sc_parent field of ucom_softc is pointing back to the uftdi_softc structure in uftdi.c (for the uftdi case), so the path would be ucom_softc->sc_parent->sc_udev, but my concern is going through the void *, as it appears each of the devices that use ucom as the base have sc_udev in a different part of their structure, meaning I'm likely going to crash the system if I plan on it being an FTDI device, and its not. Is there a callback or a canonical mechanism for accessing this part of the structure given a starting point of the ucom_softc? Alternatively, are there any well defined attributes I can use to figure out what that void* is pointing to, or at least conditionalizing the code so I can dereference it correctly?

Hi,

Usually using void pointers this way works fine, as long as you are 
careful. There is also something called __containerof() which can be 
used to get the pointer to a structure based on the pointer to a 
structure inside that structure, thinking of the struct ucom_softc, 
which is type-safe.

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?c20edccb-616b-aedf-6a60-e4857341f2fb>