Статья
Версия для печати
Обсудить на форуме
Linux kernel v2.6.24-х и ноутбук Toshiba A300-14S

Всем привет!
Я хочу рассказать о том, какая приключилась у этого ноутбука неприятность с сетевым адаптером и ядром Linux версии 2.6.24-х. Дело в том, что в этой модели компания Toshiba заменила привычный сетевой контроллер Realtek на Marvel. В общем, ничего страшного не произошло - контроллер нормальный, но "из коробки" он не работает. Можно воспользоваться драйвером с официального сайта, но он как-то странно себя ведет: вроде как находит устройство, предлагает установить или удалить драйвер, но в итоге инсталляция не проходит. Не очень долго покурсировав в Интернете, натыкаюсь на то, что в багтрекере ядра было небольшое обсуждение того, что в версии ядер 2.6.24-х нет информации о том, чтобы работать с неким device_id = 4355 . Там предлагалось исправить данную проблему путем правки исходных кодов ядра, что я и сделал.

Код: (Bash)
#lspci | grep 4355
Ethernet controller: Marvell Technology Group Ltd. Unknown device 4355 (rev 12)

Видим тот самый номер нашего сетевого устройства - 4355.
Идем в /путь-к-исходникам-ядра/driver/net, открываем на редактирование файл sky2.c и находим в нем вот такой массив идентификаторов поддерживаемых чипов:

Код: (C)
static const struct pci_device_id sky2_id_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, /* SK-9Sxx */
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, /* SK-9Exx */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) }, /* DGE-560T */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4001) }, /* DGE-550SX */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4B02) }, /* DGE-560SX */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4B03) }, /* DGE-550T */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) }, /* 88E8021 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) }, /* 88E8022 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) }, /* 88E8061 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4343) }, /* 88E8062 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4344) }, /* 88E8021 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4345) }, /* 88E8022 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4346) }, /* 88E8061 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4347) }, /* 88E8062 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4350) }, /* 88E8035 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4351) }, /* 88E8036 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4354) }, /* 88E8040 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4357) }, /* 88E8042 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x435A) }, /* 88E8048 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4360) }, /* 88E8052 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) }, /* 88E8050 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) }, /* 88E8053 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) }, /* 88E8055 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4364) }, /* 88E8056 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4365) }, /* 88E8070 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4366) }, /* 88EC036 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4367) }, /* 88EC032 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4368) }, /* 88EC034 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4369) }, /* 88EC042 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436A) }, /* 88E8058 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436B) }, /* 88E8071 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436C) }, /* 88E8072 */
{ 0 }
};

Убедимся, что нашего устройства 4355 в ней нет. Добавим в этот массив вот такую строку:

Код: (C)
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4355) }, /* 88E8040T */

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

В процессе написания статьи выяснилось, что две недели назад вышло ядро 2.6.26, где данный недостаток исправлен. Все равно надеюсь, что статья поможет кому-нибудь в будущем с решением подобной проблемы.

Ссылки по теме:
Максим Филатов aka McZim.
16.07.2008
Версия для печати
Обсудить на форуме