The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

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

}

 

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