Несколько других подробностей

Предыдущая  Содержание  Следующая V*D*V

Этот раздел охватывает несколько других вопросов, которые могут представлять интерес для авторов сетевых драйверов. В каждом случае мы просто стараемся направить вас в правильном направлении. Получение полной картины этого вопроса, вероятно, потребует затрат времени для рытья в исходниках ядра.

Поддержка интерфейса, не зависящего от среды передачи

Интерфейс, не зависящий от среды передачи (Media Independent Interface, или MII), является стандартом IEEE 802.3, описывающим, как трансивер Ethernet может взаимодействовать с сетевыми контроллерами; этому интерфейсу соответствуют многие продукты на рынке. Если вы пишете драйвер для MII-совместимого контроллера, ядро экспортирует универсальный уровень поддержки MII, который может сделать вашу жизнь легче.

 

Чтобы использовать универсальный уровень MII, вам следует подключить <linux/mii.h>. Вам необходимо заполнить структуру mii_if_info информацией о физическом идентификаторе трансивера, поддерживается ли на самом деле полный дуплекс и так далее. Также для структуры mii_if_info требуются два метода:

 

int (*mdio_read) (struct net_device *dev, int phy_id, int location);

void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val);

 

Как и следовало ожидать, эти методы должны реализовывать связь с вашим специфичным интерфейсом MII.

 

Универсальный код MII обеспечивает набор функций для запроса и изменения режима режим работы трансивера, многие из них предназначены для работы с утилитой ethtool (описанной в следующем разделе). Для подробности посмотрите <linux/mii.h> и drivers/net/mii.c.

Поддержка Ethtool

Ethtool является утилитой, разработанной, чтобы дать системным администраторам больше возможностей контроля по  управлению сетевыми интерфейсами. С помощью ethtool можно управлять различными параметрами интерфейса, включая скорость, тип носителя, дуплексная работа, установка кольца DMA, аппаратный подсчёт контрольной суммы, операция пробуждения по сети и так далее, но только если ethtool поддерживается драйвером. Ethtool может быть загружена с http://sf.net/projects/gkernel/.

 

Соответствующие декларации поддержки ethtool могут быть найдены в <linux/ethtool.h>. Основой является структура типа ethtool_ops, которая содержит полные 24 различных метода для поддержки ethtool. Большинство из этих методов являются относительно простыми; для подробностей смотрите <linux/ethtool.h>. Если ваш драйвер использует уровень MII, можно использовать mii_ethtool_gset и mii_ethtool_sset, чтобы реализовать методы get_settings и set_settings, соответственно.

 

Чтобы ethtool работала с вашим устройством, необходимо поместить указатель на вашу структуру ethtool_ops в структуру net_device. Для этой цели следует использовать макрос SET_ETHTOOL_OPS (определённый <linux/netdevice.h>). Обратите внимание, что ваши методы для ethtool могут быть вызваны даже когда интерфейс выключен.

Netpoll

"Netpoll" является сравнительно поздним (2.6.5) дополнением к сетевому стеку; его целью является позволить ядру посылать и получать пакеты в тех случаях, когда полная сетевая подсистема и подсистема ввода/вывода могут быть недоступны. Он используется для функций, подобных удаленным сетевым консолям и удаленной отладки ядра. Поддержка netpoll в драйвере в любом случае не является необходимой, но это может сделать ваше устройство более полезным в некоторых ситуациях. В большинстве случаев поддержка netpoll также является относительно простой.

 

Драйверы, поддерживающие netpoll, должны реализовать метод poll_controller. Его задача состоит сохранять всё, что может происходить на контроллере в отсутствие прерываний от устройства. Почти все методы poll_controller принимают следующую форму:

 

void my_poll_controller(struct net_device *dev)

{

    disable_device_interrupts(dev);

    call_interrupt_handler(dev->irq, dev, NULL);

    reenable_device_interrupts(dev);

}

 

Метод poll_controller, по сути, является просто моделированием прерываний от данного устройства.

Предыдущая  Содержание  Следующая