5.2.1 Инициализация и закрытие устройства

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

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);

}

 

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