LINUX.ORG.RU

MDIO, ethernet phy сотоварищи

 mdio, ,


0

1

Привет. Пишу драйвер для самодельной сетевой карты. В качестве микросхемы физического уровня выбрана SMSC LAN911x Internal PHY. Подскажите, где я могу посмотреть примеры кода, который осуществляет запись/чтение регистров через шину MDIO?



Последнее исправление: CYB3R (всего исправлений: 1)

cd /usr/src/linux-X.Y.Z/drivers/net/ethernet
find -name "*.[ch]" | xargs grep -E "mdio"
Dennis7
()
Ответ на: комментарий от hexdump01010101

ок, видим там такое:

static struct phy_driver lan911x_int_driver = {
	.phy_id		= 0x0007c0d0, /* OUI=0x00800f, Model#=0x0d */
	.phy_id_mask	= 0xfffffff0,
	.name		= "SMSC LAN911x Internal PHY",

	.features	= (PHY_BASIC_FEATURES | SUPPORTED_Pause
				| SUPPORTED_Asym_Pause),
	.flags		= PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,

	/* basic functions */
	.config_aneg	= genphy_config_aneg,
	.read_status	= genphy_read_status,
	.config_init	= lan911x_config_init,

	/* IRQ related */
	.ack_interrupt	= smsc_phy_ack_interrupt,
	.config_intr	= smsc_phy_config_intr,

	.suspend	= genphy_suspend,
	.resume		= genphy_resume,

	.driver		= { .owner = THIS_MODULE, }
};

как мне вызвать, например, функцию genphy_suspend?

betalor
() автор топика
Ответ на: комментарий от betalor

я, конечно, не особо в кернел девелопменте, но там же написано /* IRQ related */ не кажется ли тебе, что инициализированные ниже этого коментария указатели, это обработчики прерываний? зачем тебе их вызывать вручную?!

aol ★★★★★
()
Ответ на: комментарий от aol

betalor, а что мешает вызвать её как lan911x_int_driver.suspend(params);?

Вообще, она не предназначена, чтобы её вызывали напрямую. Драйвер устанавливает указатели suspend и resume на функции, которые вызываются ядром при переходе в ждущий режим и при выходе из него. В этих функциях драйвер может сохранять состояние устройства и восстанавливать его.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

я изначально подозревал, что эти функции не для прямого вызывания руками, и спросил автора оп, зачем он хочет странного. :)

aol ★★★★★
()
Ответ на: комментарий от gentoo_root

Перейти в ждущий режим, например

т.е. если нет возможности перейти в ждущий режим, руками вызвать эти функции нельзя?

betalor
() автор топика
Ответ на: комментарий от aol

затем, что у меня нет возможности перейти в ждущий режим.

betalor
() автор топика
Ответ на: комментарий от betalor

т.е. если нет возможности перейти в ждущий режим, руками вызвать эти функции нельзя?

А зачем вызывать руками функции, которые обрабатывают переход в ждущий режим, если этого перехода реально нет? Функцию genphy_suspend() можно вызвать и руками, она есть в заголовке <linux/phy.h>. Но она предназначена только для того, чтобы быть вызванной во время перехода в ждущий режим. Можно, например, в своём драйвере повесить на suspend другую функцию, а из неё вызвать genphy_suspend(), если нужно сделать что-то ещё. Вызывать же её не во время перехода в ждущий режим неправильно.

затем, что у меня нет возможности перейти в ждущий режим.

Тогда зачем её вообще вызывать?

gentoo_root ★★★★★
()
Ответ на: комментарий от aol

мешает то, что не знаю как получить указатель на структуру phy_device, который является параметром функций suspend и resume.

betalor
() автор топика
Ответ на: комментарий от betalor

Чтобы получить phy_device, нужно вызвать phy_connect(), в include/linux/phy.h.

Если используется OF/DeviceTree (PowerPC и новые ARM), то PHY нужно описать в dts, и использовать of_phy_connect() (include/linux/of_mdio.h).

Впрочем, может вам таки обратиться к специалистам? Такими темпами вы драйвер может и напишете, но боюсь к тому времени ваша железка уже морально устареет.

hexdump01010101
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.