LINUX.ORG.RU

Сообщения AndriAno

 

Разработка драйвера сетевой карты

Доброго времени суток всезнающий All.

Суть истории в следующем: пишу дравер сетевой карты для арм проца. Ввиду отсутствия pci шин пишу с использованием platform device (примеров работы с ним маловато, но вроде подразобрался).

В probe вызываю следующие функции

alloc_etherdev()
SET_NETDEV_DEV()
заполняю netdev->dev_addr
netdev->netdev_ops = &ip_mod_ops;
register_netdev(netdev);
netif_carrier_on(netdev);
netif_carrier_ok(netdev);

В итоге регистрируется драйвер и появляется в /sys/class/net и тд.

При запуске ifconfig выдает:
eth0      Link encap:Ethernet  HWaddr 1E:ED:19:27:1A:B3
          inet addr:192.168.0.109  Bcast:255.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11894 (11.6 KiB)  TX bytes:1690 (1.6 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

А при ifconfig -a:
eth0      Link encap:Ethernet  HWaddr 1E:ED:19:27:1A:B3
          inet addr:192.168.0.109  Bcast:255.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11894 (11.6 KiB)  TX bytes:1690 (1.6 KiB)

eth1      Link encap:Ethernet  HWaddr 0B:16:21:2C:37:42
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

тоесть как я понимаю, система его достаточно корректно видит в качестве сетевого устройства.

Далее и начинаются непонятки.
Пытаюсь перевести eth1 в активное состояние.
Для начала назначить адрес:

ip addr add 10.0.0.1/24 dev eth1

ifconfig -a
eth1      Link encap:Ethernet  HWaddr 0B:16:21:2C:37:42
          inet addr:10.0.0.1  Bcast:0.0.0.0  Mask:255.255.255.0
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

адрес вроде применился, но по ifconfig среди активных интерфейсов его нет.

пытаюсь поднимать дальше
ifconfig eth1 up

ifconfig: SIOCSIFFLAGS: Cannot assign requested address

и всё дальше никак.


при вызове ifconfig происходит вызов колбека на ndo_get_stats, в котором особо ничего не происходит

return &netdev->stats;

Насколько я понимаю должны быть вызовы колбеков на .open и ioctl но их я не вижу. Возможно надо еще както дополнительно сообщить системе что устройство активно(аналог вставленного кабеля Ethernet).
Кто что знает расскажите. Или ссылку дайте на чтото толковое кроме LDD, и /usr/src/linux

 , ,

AndriAno ()

ldd for network

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

 ,

AndriAno ()

Учет рабочего времени

Хочу найти софт для учета рабочего времени ,небольшого коллектива.
Пришел - ушел, обед.
Завести систему на сервере, с доступом через браузер.
В основном что находилось в поиске: законченные системы для крупных предприятий, с учетом времени на пропускной системе.

Может есть у кого подобное?

AndriAno ()

Проблемы с container_of()

В драйвере шины объявлена структура:

struct chld_device {
	int state;
	int base_addr;
	unsigned long length;
	struct resource res[32];
	u64 dma_mask;
	struct device dev; 
	struct cdev cdev;
};

При инициализации шины,происходит инициализация дочерних устройств,с заполнением base_addr, res, dev, cdev.
В дальнейшем подгружаю драйвер устройства в котором запускается .open. В нем уже исполняю:
int dev_open(struct inode *inode, struct file *filp){
	struct chld_device *icd = container_of(inode->i_cdev, struct chld_device,cdev);
	filp->private_data = icd;
}
В итоге вижу что корректные значения находятся только в cdev. Остальные элементы структуры chld_device содержат явно не то на что я рассчитывал. Или я не совсем понимаю как работает контейнер или одно из двух.
Подскажите в какую сторону копать дальше.

AndriAno ()

Драйвер виртуальной шины

Появилась необходимость написания драйвера для виртуальной шины. До этого написал только несколько драйверов для PCI. В процессе написания появилось несколько вопросов, в основном в моменте регистрации новых устройств(особенно нескольких одинаковых).
При инициализации драйвера происходит регистрация новой шины, а также регистрация корневого устройства(относительно моей шины). В результате получаю соответствующие записи в /sys/bus/pci и /sys/bus/my_bus.
И после этого в моей голове и возникает неразбериха. Необходимо зарегистрировать виртуальные устройства подключенные к моей шине. Вначале я вызывал device_register(&device->dev);, из функции шины вызываемой при инициализации драйвера устройства. Но это как я понял некорректно, и верным путем является перебор устройств при инициализации шины(как я понял при этом должны заполняться kobject).
И каким образом должен производиться правильный перебор устройств?
Где должна производиться проверка соответствия устройства и драйвера?
Кто(откуда) производит исполнение .match?
Каким образом вызывается .hotplug?
И еще несколько подобных вопросов.


PS. LDD и .../driver-model/*.txt читал, просветления не наступило.

AndriAno ()

Scatter/Gather

Занимаюсь написанием драйвера для самописной железки. Перодически появляются вопросы(newbie). Реализую работу DMA с использованием SG.

После чтения LDD3 и DMA-API-HOWTo осталоcь несколько непонятных моментов

dma_map_sg(dev,sglist,nents,direction)

Как я понял в этом месте происходит мапирование на реальные адреса шины, но функции необходимо подсунуть уже заренее подготовленный sglist. Рекомендуемый способ его создания в документации особо не указан.

После получения bus addres, существует ли стандарт на передачу структур с указанием адресов на устройство, или всё отдается на фантазию разработчика?

AndriAno ()

RSS подписка на новые темы