Question on structure of USB (specifically USB Serial) stack
Hans Petter Selasky
hps at selasky.org
Thu Jul 16 21:22:05 UTC 2020
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
More information about the freebsd-hackers
mailing list