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>