5.2.1 Инициализация и закрытие устройства |
Предыдущая Содержание Следующая |
Linux поддерживает структуру net_device, объявленную в include/linux/netdevice.h. Эта управляющая структура включает в себя всю информацию, необходимую для данного устройства, от высокоуровневых деталей, таких как настройки драйвера и указатели на функции, предлагаемые драйвером, до низкоуровневых деталей, таких как дисциплина очереди и указатели протокола, используемые внутри ядра. В данном разделе объясняется использование драйвером этой структуры. Во время сборки ядра включите опции конфигурации CONFIG_NET, CONFIG_NETDEVICES и CONFIG_NET_ETHERNET. Есть два способа осуществления регистрации; один метод используется, когда сетевой драйвер загружен как модуль, а другой метод используется, когда сетевой драйвер компонуется как часть ядра. Ниже описаны оба метода. Когда драйвер устройства скомпонован напрямую с адресным пространством ядра, память для структуры struct net_device выделяется ядром. Драйвер должен предоставить процедуру зондирования, которая вызывается ядром во время запуска. Процедуры зондирования для различных аппаратных устройств содержит файл drivers/net/space.c; так что вам необходимо добавить сюда поддержку вашего сетевого устройства. Каждое сетевое устройство связано со своим уникальным списком зондирования, который связывает данное устройство с его архитектурой и шиной. После определения списка зондирования, функция зондирования добавляется в этот список так:
#ifdef TEST_HARDWARE {lxNWProbe, 0}, #endif
Во время инициализации устройства ядро вызывает функции зондирования. В нашем случае вызывается функция lxNWProbe; аргумент функции включает в себя struct net_device, которая инициализируется значениями по умолчанию, в том числе именем устройства. (* Сетевые устройства инициализируются по умолчанию именами от "eth0" до "eth7".) За заполнение остальных полей в структуре net_device отвечает функция зондирования. Мы предполагаем, что это единственная сетевая карта в системе и, следовательно, нет необходимости делать какую-либо аппаратную проверку. lxNWprobe показана в Распечатке 5.6. В случае, когда драйвер пишется в виде модуля ядра, память для структуры net_device выделяется модулем и регистрируется явным образом с помощью функции register_netdev. Эта функция присваивает устройству имя, вызывает функцию инициализации (в данном случае это lxNWprobe), добавляет его в цепочку сетевых устройств и уведомляет протоколы верхнего уровня, что появилось новое устройство.
#ifdef MODULE
static struct net_device lxNW_dev;
static int init_module(void) { dev->init = lxNWprobe;
register_netdev(dev); return 0; }
static void cleanup_module(void) { unregister_netdev(dev); }
module_init(init_module); module_exit(cleanup_module);
#endif
Функция открытия вызывается всякий раз, когда устройство переводится из состояния ВЫКЛЮЧЕНО (DOWN) во ВКЛЮЧЕНО (UP).
static int LXHWopen(struct net_device *dev) { RESET_NW(); INIT_NW();
/* Запуск передающей очереди устройства */ netif_start_queue(dev); }
Функция закрытия вызывается для перевода интерфейса из состояния ВКЛЮЧЕНО (UP) в ВЫКЛЮЧЕНО (DOWN).
static int LXHWclose(struct net_device *dev) { RESET_NW();
/* Остановка передающей очереди устройства */ netif_stop_queue(dev); }
|
Предыдущая Содержание Следующая |