<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bappoy&#039;s blog &#187; drivers</title>
	<atom:link href="http://bappoy.pp.ru/tag/drivers/feed" rel="self" type="application/rss+xml" />
	<link>http://bappoy.pp.ru</link>
	<description>Линуксоид на велосипеде с моторчиком</description>
	<lastBuildDate>Mon, 06 Sep 2010 14:00:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Linux kernel: определение совместимости драйвера с устройством</title>
		<link>http://bappoy.pp.ru/2008/01/29/linux-hw-compat.html</link>
		<comments>http://bappoy.pp.ru/2008/01/29/linux-hw-compat.html#comments</comments>
		<pubDate>Tue, 29 Jan 2008 13:12:20 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/2008/01/29/linux-hw-compat/</guid>
		<description><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fbappoy.pp.ru%2F2008%2F01%2F29%2Flinux-hw-compat.html"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fbappoy.pp.ru%2F2008%2F01%2F29%2Flinux-hw-compat.html" height="61" width="51" /></a></div><p>Иногда бывает необходимо определить, поддерживает ли имеющийся драйвер некое устройство. Например, когда планируется установка новой сетевой карты на работающий сервер или запуск специально собранного ядра на сервере с новейшим RAID-контроллером.</p>
<p>Как обычно, имеется несколько способов решения.</p>
<p><strong>Способ первый: списки совместимости железа (HCL, hardware compatible lists).</strong></p>
<p>Если используется родное ядро дистрибутива, то достаточно зайти на сайт производителя используемого дистрибутива Linux и найти там Hardware Compatibility List. Ещё производители серверного железа пишут, с какими ОС совместимы их устройства и иногда даже выкладывают драйвера с исходниками. Если с производителем оборудования повезло, то можно просто скачать и собрать последнюю версию драйвера.</p>
<p>Можно обратиться к <a href="http://tldp.org/HOWTO/Hardware-HOWTO/">Linux Hardware Compatibility HOWTO</a>, но на данный момент (январь 2008) последняя дата обновления этого документа &#8212; 22 мая 2007 года, т.е. по меркам развития технологий очень давно. Ещё я не нашёл там ни одного контроллера Serial ATA, которые в последнее время очень распространены. Тем не менее, если интересующее вас устройство присутствует в этом документе, то оно наверняка поддерживается вашим ядром.</p>
<p>Существует несколько десятков сайтов, имеющих своей целью собрать абсолютно всю информацию о совместимости различного железа с Linux. Как правило, информация на таких сайтах добавляется посетителями и имеет формат &laquo;такая-то штука заработала под таким-то ядром в такой-то ОС после таких-то манипуляций с modprobe.conf&raquo; и может быть неверной или устаревшей. Примером такого сайта может являться <a href="http://www.linux-on-laptops.com/">Linux on laptops</a>, содержащий список ссылок на статьи и заметки на тему установки различных дистрибутивов Linux на ноутбуки.</p>
<p><strong>Способ второй:  ручная проверка PCI IDs.</strong></p>
<p>Вышеописанный метод гугления может лишь дать представление о том, поддерживается ли данное устройство вообще. Ответ на вопрос &laquo;поддерживается ли данный девайс данным ядром&raquo; можете дать только вы сами :)</p>
<p>Каждое устройство, подключаемое через шину PCI, имеет 8-байтный код, называемый PCI ID (и еще 8 байт, называемые Vendor ID, но нас они не интересуют). Первые четыре байта означают производителя, оставшиеся &#8212; собственно код устройства. Существует единый список известных кодов устройств <a href="http://pciids.sourceforge.net">http://pciids.sourceforge.net</a>, используемый, в частности, командой lspci для отображения читабельного писка установленного оборудования (однако факт включения устройства в этот список вовсе не означает, что оно поддерживается Linux&#8217;ом :))</p>
<p>Драйвера Linux &laquo;подцепляют&raquo; железо по его PCI ID; список совместимых с данным драйвером девайсов &laquo;зашит&raquo; в структуре pci_device_id,  Например, в драйвере sata_nv версии 0.09 из ядра 2.6.15 эта структура выглядит таким образом:</p>
<blockquote><p><code>static const struct pci_device_id nv_pci_tbl[] = {<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, NFORCE2 },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, NFORCE3 },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, NFORCE3 },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA,PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE&lt;&lt;8, 0xffff00, GENERIC },<br />
{ PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_RAID&lt;&lt;8, 0xffff00, GENERIC },<br />
{ 0, }<br />
};</code></p></blockquote>
<p>Поскольку драйвер sata_nv входит в состав ядра, то константы <code>PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA</code>, <code>PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA</code> и т.д. определены в файле <code>/usr/src/linux/include/linux/pci_ids.h</code>. Если же драйвер был скачан с сайта производителя, то необходимые константы могут быть переопределены в коде самого драйвера, grep вам в помощь :) Комбинируя значения этих констант со значением <code>PCI_VENDOR_ID_NVIDIA</code>, определённой в том же <code>pci_ids.h</code>, можно получить полный PCI ID устройства.</p>
<p>Эту же информацию можно извлечь из уже скомпилированного драйвера с помощью команды <code>modinfo sata_nv</code>, которая также выдаст список PCI IDs устройств, поддерживаемых данным драйвером. Есть еще файл <code>/lib/modules/`uname -r`/modules.pcimap</code>, содержащий сводную информацию о том, какие pci ids и vendor ids к какому модулю относятся, но в более подходящем для парсинга формате.Но в случае, если драйвер &laquo;вкомпилен&raquo; в ядро (например, в конфиге ядра (<code>/usr/src/linux/.config</code> или /proc/config.gz) указано <code>CONFIG_SCSI_SATA_NV=y</code>), то из скомпилированного ядра вытащить этот список очень проблематично . Хотя, наверно, как-то можно. Мне кажется, что проще залезть в исходники, надеясь, что в интересующей вас части они не изменились со времени последней компиляции.</p>
<p>Собственно определение совместимости драйвера с устройством состоит из двух этапов:</p>
<ol>
<li>выяснение PCI ID данного контроллера. Можно поискать его название, указанное в прилагаемой документации или на чипсете, в файле <code>/usr/share/hwinfo/pci.ids</code> (не забывайте его периодически обновлять с сайта <a href="http://pciids.sourceforge.net">http://pciids.sourceforge.net.</a>) или на сайте производителя устройства. Если устройство уже подключено, то поможет команда <code>lspci -nn</code></li>
<li>проверка вхождения этого PCI ID в драйвер. Тут можно либо лезть в исходники драйвера, как описано выше, либо воспользоваться командой <code>modinfo driver_name</code>.</li>
</ol>
<p>Однако следует помнить, что возможна ситуация, когда драйвер подцепляет устройство, но работает с ним некорректно. Тут уж ничего не попишешь, нужно искать решение в другом месте.</p>
<p>Бонус для тех, кто дочитал до этого места. Если у вас есть устройство, при загрузке оно почему-то не подцепляется автоматически и вы не знаете, какой драйвер с ним работает, вам поможет сервис <a href="http://kmuto.jp/debian/hcl">Debian GNU/Linux device driver check page</a> (никогда не устану ссылаться на эту страницу!). Он принимает вывод команды <code>lspci -n</code> и сообщает, какие драйвера подходят для имеющихся устройств. Можно просто указать PCI ID и это сработает.</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2008/01/29/linux-hw-compat.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
