ftdi_sio, and usb_serial->interface->dev->driver_data being null

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

 



Hi all,

I am trying to learn more about interfacing with FT232, and I started with ftdi_sio.c as a base, and my final goal is being able to interface with snd_pcm and ALSA (and I'm trying to use usbaudio functions as examples).

For that purpose, I am trying to build a module, where a modification of ftdi_sio.c is one object, and another .c file with corresponding ALSA functions is another object built into this module. Needless to say, I'm quite struggling to keep all the structs involved in mind :)

For now, I just want to come to the point where probe and disconnect work. I have tried to add additional commands to ftdi_sio_probe and ftdi_shutdown, so functions (my_extra_probe and my_extra_disconnect) in the other .c file get called.

Probe seems to work fine (i.e. a new card can be seen in cat /dev/sndstat), however, it is the disconnect I have a problem with. The problem is that in ftdi_sio_probe, after my_extra_probe, what corresponds to usb_serial->interface->dev->driver_data is a valid pointer -- however, whenever ftdi_shutdown is called, this ...->driver_data is always a null pointer (even if ftdi_open was never called). Unfortunately, the functions from usbaudio are using precisely this "property" to proceed with deregistering. Below is a snippet from these two functions:

---
/* Probe function to check for special devices */
static int ftdi_sio_probe(struct usb_serial *serial,
					const struct usb_device_id *id)
{
	struct snd_ftdi_audard_quirk *quirk =
				(struct snd_ftdi_audard_quirk *)id->driver_info;

	struct usb_interface *interface = serial->interface; // added
	int ret;
	...
	usb_set_serial_data(serial, (void *)id->driver_info);

	ret = my_extra_probe(interface, id);
dbg("%s: RET is %d ... (&interface->dev)->driver_data %p", __func__, ret, (&interface->dev)->driver_data);
	/*
	* Here (&interface->dev)->driver_data is an OK pointer,
	* same as the one traced from within my_extra_probe,
	* where it is set.
	*/
	return 0;
}

static void ftdi_shutdown(struct usb_serial *serial)
{
	struct usb_interface *interface = serial->interface; // added

dbg("%s - (&interface->dev)->driver_data %p", __func__, (&interface->dev)->driver_data);
	/*
	* Here (&interface->dev)->driver_data is NULL pointer,
	* which is a problem, because my_extra_disconnect needs it
	*/

	my_extra_disconnect(interface);
}
---

So these are the questions I have:

- Is there an easy/obvious reason, why this pointer is reset at _shutdown, that I'm missing?

- How could I debug this? Ideally, I'd like to put a watch on usb_serial->interface->dev->driver_data and see when it changes (and what changes it) - but its not even a variable :)

I have just learned that I could recompile a kernel and use something called kgdb, which needs two machines; I found http://linux-hacks.blogspot.com/2008/05/setting-up-kgdb-using-kvmqemu.html that uses a VM instead - but I'm afraid using a VM will mess up everything USB related. Any links to some resources related to this kind of debugging?

Thanks in advance for any answers,

Cheers!


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

  Powered by Linux