pl2303 (3)

昨晩のエントリはなんつーか微妙。昨晩はぼろぼろだったしねぇ。そもそも何故に usb_serial_register が起点になっているかが不明なんですが、って pl2303 の pl2303_init から呼び出されているのか。
ポイント高い関数呼び出しという意味では

  • usb_serial_register
  • usb_register

という二つの手続きを呼び出している模様。コールグラフ的なマンガを書いてみようか。

usb_serial_register

+- usb_disable
|
+- fixup_generic
|
+- list_add
|
+- usb_serial_bus_register -+- spin_lock_init
                            |
                            +- driver_register -+- driver_find
                                                |
                                                +- bus_add_driver
                                                |
                                                +- driver_add_groups

とりあえずここから先は別途確認。次は何だっけ。

usb_register

+- usb_register_driver -+- usb_disabled
                        |
                        +- spin_lock_init
                        |
                        +- driver_register-+- driver_find
                        |                  |
                        |                  +- bus_add_driver
                        |                  |
                        |                  +- driver_add_groups
                        |
                        +- usbfs_update_special
                        |
                        +- usb_create_newid_file

これってどっちも同じナニを渡してるのかと思ったら違いますな。

	retval = usb_serial_register(&pl2303_device);
	if (retval)
		goto failed_usb_serial_register;
	retval = usb_register(&pl2303_driver);
	if (retval)
		goto failed_usb_register;

ええとまず pl2303_device という変数は usb_serial_driver 構造体で、pl2303_driver という変数は usb_driver 構造体か。
ちなみに driver_register という手続きは device_driver 構造体を引数に取ります。

int driver_register(struct device_driver *drv)

usb_serial_register を経由して driver_register を呼び出す場合、usb_serial_driver 構造体の driver という属性を渡しておりますな。定義は以下 (一部のみ)。

static struct usb_serial_driver pl2303_device = {
	.driver = {
		.owner =	THIS_MODULE,
		.name =		"pl2303",
	},

えーと、usb_serial_driver 構造体の driver 属性の型はなにか、という以下。

struct usb_serial_driver {
	const char *description;
	const struct usb_device_id *id_table;
	char	num_ports;

	struct list_head	driver_list;
	struct device_driver	driver;

device_driver 構造体ですな。
ちなみに usb_register を経由して driver_register を呼び出すケイスでは以下なナニになっております。ちなみに new_driver は引数で渡された usb_driver 構造体な pl2303_driver になっております。

	new_driver->drvwrap.for_devices = 0;
	new_driver->drvwrap.driver.name = (char *) new_driver->name;
	new_driver->drvwrap.driver.bus = &usb_bus_type;
	new_driver->drvwrap.driver.probe = usb_probe_interface;
	new_driver->drvwrap.driver.remove = usb_unbind_interface;
	new_driver->drvwrap.driver.owner = owner;
	new_driver->drvwrap.driver.mod_name = mod_name;
	spin_lock_init(&new_driver->dynids.lock);
	INIT_LIST_HEAD(&new_driver->dynids.list);

	retval = driver_register(&new_driver->drvwrap.driver);

ええと、usb_driver 構造体の drvwrap というメンバは

	struct usbdrv_wrap drvwrap;

usbdrv_wrap 構造体でその driver なメンバが device_driver 構造体なのか。

struct usbdrv_wrap {
	struct device_driver driver;
	int for_devices;
};

という事で、driver_register という手続きが何をしてるか、という事になってくるんですが、それぞれの経路で最終的にそれぞれの経路でどーゆーデータになってるか、は確認必要だな。ちょい迷走気味。

一つめ

usb_serial_register から呼び出される経路

  • usb_serial_driver 型の pl2303_device という変数については
    • driver 属性がある
      • owner 属性には THIS_MODULE がセット
      • name 属性には "pl2303" がセット
    • usb_serial_bus_register 手続きにて上記 driver 属性が driver_register 手続きに渡されている

もう一つ

usb_register から呼び出される経路

  • usb_register_driver 手続きにおいて usb_driver 構造体の drvwrap 属性の driver 属性にいくつか値が設定されて driver_register が呼び出されている
    • driver.c の usb_register_driver 手続き

むーん

name な属性にはどちらも "pl2303" な値が格納されておる。忘れない内に掘削しておかねば、なんですが今日は続行不可能な用件が入っていたのを今更思い出してしまいましたorz