<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jackslab.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012%3A_insmod_failed_on_RMI_XLR_%282%29</id>
		<title>捉虫日记 0012: insmod failed on RMI XLR (2) - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012%3A_insmod_failed_on_RMI_XLR_%282%29"/>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;action=history"/>
		<updated>2026-09-11T05:16:44Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.19.2</generator>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=18575&amp;oldid=prev</id>
		<title>Comcat：/* Phenomenon */</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=18575&amp;oldid=prev"/>
				<updated>2025-12-04T03:39:03Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Phenomenon&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;←上一版本&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;2025年12月4日 (四) 03:39的版本&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第1行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第1行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Phenomenon &lt;/del&gt;==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Analysis &lt;/ins&gt;==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;根据前面的判断问题出在 PDC2xx IDE 驱动初始化时，于是一步步下去，加了一堆的跟踪 printk，Log 如下：&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;根据前面的判断问题出在 PDC2xx IDE 驱动初始化时，于是一步步下去，加了一堆的跟踪 printk，Log 如下：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=18574&amp;oldid=prev</id>
		<title>2025年12月4日 (四) 03:38 Comcat</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=18574&amp;oldid=prev"/>
				<updated>2025-12-04T03:38:15Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;←上一版本&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;2025年12月4日 (四) 03:38的版本&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第1行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第1行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;== Phenomenon ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;根据前面的判断问题出在 PDC2xx IDE 驱动初始化时，于是一步步下去，加了一堆的跟踪 printk，Log 如下：&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;根据前面的判断问题出在 PDC2xx IDE 驱动初始化时，于是一步步下去，加了一堆的跟踪 printk，Log 如下：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=18573&amp;oldid=prev</id>
		<title>Comcat：/* Solution */</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=18573&amp;oldid=prev"/>
				<updated>2025-12-04T03:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Solution&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;←上一版本&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;2025年12月4日 (四) 03:37的版本&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第758行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第758行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;== Reference ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;* [[GNU/Linux 内核移植捉虫笔记 (Linux Kernel Debug Notes)]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=2306&amp;oldid=prev</id>
		<title>Comcat：以“根据前面的判断问题出在 PDC2xx IDE 驱动初始化时，于是一步步下去，加了一堆的跟踪 printk，Log 如下：  &lt;pre&gt; bus: 'pci': add driver ...”为内容创建页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0012:_insmod_failed_on_RMI_XLR_(2)&amp;diff=2306&amp;oldid=prev"/>
				<updated>2014-05-19T09:22:39Z</updated>
		
		<summary type="html">&lt;p&gt;以“根据前面的判断问题出在 PDC2xx IDE 驱动初始化时，于是一步步下去，加了一堆的跟踪 printk，Log 如下：  &amp;lt;pre&amp;gt; bus: &amp;#039;pci&amp;#039;: add driver ...”为内容创建页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;根据前面的判断问题出在 PDC2xx IDE 驱动初始化时，于是一步步下去，加了一堆的跟踪 printk，Log 如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bus: 'pci': add driver Promise_IDE&lt;br /&gt;
[bus_add_driver: 662@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/bus.c]&lt;br /&gt;
[bus_add_driver: 679@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/bus.c]&lt;br /&gt;
[driver_attach: 300@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[bus_for_each_dev: 285@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/bus.c]&lt;br /&gt;
[bus_for_each_dev: 289@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/bus.c]&lt;br /&gt;
[bus_for_each_dev: 292@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/bus.c]&lt;br /&gt;
[__driver_attach: 271@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[__driver_attach: 274@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[__driver_attach: 276@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[driver_probe_device: 198@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[driver_probe_device: 201@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[driver_probe_device: 212@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[__driver_attach: 279@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[__driver_attach: 281@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[__driver_attach: 276@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[driver_probe_device: 198@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[driver_probe_device: 201@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
bus: 'pci': driver_probe_device: matched device 0000:00:01.0 with driver Promise_IDE&lt;br /&gt;
bus: 'pci': really_probe: probing driver Promise_IDE with device 0000:00:01.0&lt;br /&gt;
[really_probe: 110@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[really_probe: 118@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/base/dd.c]&lt;br /&gt;
[pdc202new_init_one: 838@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/pci/pdc202xx_new.c]&lt;br /&gt;
[pdc202new_init_one: 870@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/pci/pdc202xx_new.c]&lt;br /&gt;
[ide_pci_init_one: 548@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/setup-pci.c]&lt;br /&gt;
pdc202xx_new 0000:00:01.0: IDE controller (0x105a:0x4d69 rev 0x02)&lt;br /&gt;
556@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/setup-pci.c]&lt;br /&gt;
[ide_pci_init_one: 563@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/setup-pci.c]&lt;br /&gt;
[ide_pci_init_one: 570@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/setup-pci.c]&lt;br /&gt;
pdc202xx_new 0000:00:01.0: PLL input clock is 16671 kHz&lt;br /&gt;
pdc202xx_new 0000:00:01.0: 100% native mode on irq 24&lt;br /&gt;
[ide_pci_init_one: 575@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/setup-pci.c]&lt;br /&gt;
[ide_pci_init_one: 579@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/setup-pci.c]&lt;br /&gt;
[ide_host_register: 1643@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
[ide_host_register: 1655@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
ide2: DMA disabled&lt;br /&gt;
[ide_host_register: 1659@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
[ide_host_register: 1643@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
[ide_host_register: 1655@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
ide3: DMA disabled&lt;br /&gt;
[ide_host_register: 1659@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
[ide_host_register: 1666@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
[ide_host_register: 1673@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
Probing IDE interface ide2...&lt;br /&gt;
hde: Maxtor 6L200P0, ATA DISK drive&lt;br /&gt;
[ide_host_register: 1677@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
[ide_host_register: 1682@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
hde: host max PIO4 wanted PIO255(auto-tune) selected PIO4&lt;br /&gt;
[ide_host_register: 1685@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
[ide_host_register: 1673@/ubuntu/src/wrs.git/workspace/rmi_new/build/linux/drivers/ide/ide-probe.c]&lt;br /&gt;
Probing IDE interface ide3...&lt;br /&gt;
CPU 0 Unable to handle kernel paging request at virtual address 0000000000001ff8, epc == ffffffffc0001c20, ra == ffffffff80000008&lt;br /&gt;
Oops[#1]:&lt;br /&gt;
Cpu 0&lt;br /&gt;
$ 0   : 0000000000000000 0000000000000014 ffffffffc0001c20 ffffffffc0002038&lt;br /&gt;
$ 4   : a8000001273423c8 a800000123db3830 0000000000000000 ffffffffffff00fe&lt;br /&gt;
$ 8   : ffffffff83928020 0000000000000000 0000000000000000 0000000000000001&lt;br /&gt;
$12   : 0000000000000028 ffffffff834056e8 0000000000000000 ffffffff83898000&lt;br /&gt;
$16   : a8000001273423c8 00000000000000a1 a800000127342000 ffffffffc0002038&lt;br /&gt;
$20   : 0000000000000001 0000000000000040 0000000000000010 7ffffffffffff8f0&lt;br /&gt;
$24   : 0000000000000000 ffffffff83669bf8                                 &lt;br /&gt;
$28   : a800000123db0000 a800000123db3830 ffffffffffffffed ffffffff80000008&lt;br /&gt;
Hi    : 0000000000000000&lt;br /&gt;
Lo    : 0000000000000000&lt;br /&gt;
epc   : ffffffffc0001c20 phnx_tf_load+0x0/0x250 [pdc202xx_new]&lt;br /&gt;
    Not tainted&lt;br /&gt;
ra    : ffffffff80000008 0xffffffff80000008&lt;br /&gt;
Status: 1000dce3    KX SX UX KERNEL EXL IE&lt;br /&gt;
Cause : 00800008&lt;br /&gt;
BadVA : 0000000000001ff8&lt;br /&gt;
PrId : 000c0b04 (RMI Phoenix)&lt;br /&gt;
Modules linked in: pdc202xx_new(+)&lt;br /&gt;
Process insmod (pid: 2752, threadinfo=a800000123db0000, task=a800000124c03208, tls=00000000004a1470)&lt;br /&gt;
Stack : 0000000000000000 0000000000000000 0000400000000000 0000000000000000&lt;br /&gt;
        0000000000000000 ffffffff83461158 a8000001273423c8 ffffffff836810b8&lt;br /&gt;
        0000000000000000 0000000008000000 2000000000000000 0000000000000000&lt;br /&gt;
        0000000000000000 ffffffff83681550 0000000000000001 a800000127342330&lt;br /&gt;
        a800000127342330 a8000001273423c8 a800000127342000 0000000000000001&lt;br /&gt;
        0000000000000040 ffffffff83681704 0000000000000018 000000001000dce1&lt;br /&gt;
        a800000127342000 0000000000000008 0000000000000050 a800000124d79ad8&lt;br /&gt;
        a80000012612b7b0 ffffffff83865840 ffffffff8385e010 ffffffff837fc608&lt;br /&gt;
        ffffffff83800000 ffffffff83682ed0 a80000012612b028 ffffffffc0002148&lt;br /&gt;
        0000000000000001 a800000123db39b0 0000000000000018 a800000126c71278&lt;br /&gt;
        ...&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffffc0001c20&amp;gt;] phnx_tf_load+0x0/0x250 [pdc202xx_new]&lt;br /&gt;
[&amp;lt;ffffffff80000008&amp;gt;] 0xffffffff80000008&lt;br /&gt;
&lt;br /&gt;
Code: 8e030010 080006a9 a2020001 &amp;lt;67bdffd0&amp;gt; ffb30020 ffb20018 ffb00008 ffbf0028 ffb10010&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
多次尝试，一会在 phnx_tf_load() 里访问非法 VA，一会又在 phnx_set_irq() 中访问非法 VA，一会又在其他地方，但在 phnx_tf_load 和 phnx_set_irq 出现的概率最高，遂又仔细看了这两个函数的实现，并没发现有显著的失误处。郁闷至极。&lt;br /&gt;
&lt;br /&gt;
附 IDE 正常启动 Log:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Uniform Multi-Platform E-IDE driver&lt;br /&gt;
pdc202xx_new 0000:00:01.0: IDE controller (0x105a:0x4d69 rev 0x02)&lt;br /&gt;
pdc202xx_new 0000:00:01.0: PLL input clock is 16667 kHz&lt;br /&gt;
pdc202xx_new 0000:00:01.0: 100% native mode on irq 24&lt;br /&gt;
ide2: DMA disabled&lt;br /&gt;
ide3: DMA disabled&lt;br /&gt;
hde: Maxtor 6L200P0, ATA DISK drive&lt;br /&gt;
ide2 at 0x10000000-0x10000007,0x1000000a on irq 24&lt;br /&gt;
isa bounce pool size: 16 pages&lt;br /&gt;
ide3 at 0x10000010-0x10000017,0x1000001a on irq 24&lt;br /&gt;
hde: max request size: 512KiB&lt;br /&gt;
hde: 398297088 sectors (203928 MB) w/8192KiB Cache, CHS=24792/255/63&lt;br /&gt;
hde: cache flushes supported&lt;br /&gt;
hde: hde1&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2009.02.17 11:21&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
突然间想起 Cunbo 在 fix 这个 BSP 串口问题时，将 __raw_readb/writeb 改成 __raw_readl/writel 就 OK 了，很自然地联想起不知在什么地方看过 raza 上访问内存映射的 I/O 寄存器有一些对齐限制（事后证明是想当然）于是将用于 PCI I/O 读写的函数 rmi_ide_mm_outb() 的实现由 __raw_writeb() 改成了 __raw_writel() 一试居然可以 insmod 了。其原始实现为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void rmi_ide_mm_outb (u8 value, unsigned long port)&lt;br /&gt;
{&lt;br /&gt;
    __raw_writeb(value, pci_ide_phys_to_virt(port));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
总算找到 root cause 了，只是结论来得有点迟。上午都有些失去耐心了，还是要 orz。&lt;br /&gt;
&lt;br /&gt;
2009.02.17 13:21&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
乐极生悲了，不是 root casue，把 __raw_writeb 改成 __raw_writel 后 insmod 是可以了，硬盘却发现不了了，下午激动过头了，就没注意。&lt;br /&gt;
&lt;br /&gt;
奇怪的是为什么把字节写改成字 (32bit) 写，硬盘就发现不了了。&lt;br /&gt;
&lt;br /&gt;
这么一改，IDE 驱动就没真正工作，故而问题也就不出现了。&lt;br /&gt;
&lt;br /&gt;
2009.02.17 22:43&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
冷静了下，发现 IDE 驱动没法正常工作的原因在于：&lt;br /&gt;
&lt;br /&gt;
RMI XLR 下 __raw_writeb/l 函数定义为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define __raw_writeb(v,a)       (*(volatile unsigned char *)(a) = (v))&lt;br /&gt;
#define __raw_writel(v,a)       (*(volatile unsigned int   *)(a) = (v))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
比如原来是用 __raw_writeb(value, pci_ide_phys_to_virt(port)) 向地址 0x9000 0000 1000 0004 处写一个字节&lt;br /&gt;
直接改成 __raw_writel(value, pci_ide_phys_to_virt(port)) 后，是向同样的地址处写一个字，因为 value 是 u8 类型，*(volatile unsigned int   *)(a) = (v) 在大端上等于是将 value 写到 0x9000 0000 1000 0007 处了，原 0x9000 0000 1000 0004 处等于是写了个 0x00。也就是向 IDE 的 I/O 寄存器写错了值，发现不了硬盘也就自然了。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
明白了这一点，顺手就改成了：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void rmi_ide_mm_outb (u8 value, unsigned long port)&lt;br /&gt;
{&lt;br /&gt;
    __raw_writel(swab32((u32)value), pci_ide_phys_to_virt(port));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这下就更 COOL 了：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
......&lt;br /&gt;
Uniform Multi-Platform E-IDE driver&lt;br /&gt;
pdc202xx_new 0000:00:01.0: IDE controller (0x105a:0x4d69 rev 0x02)&lt;br /&gt;
pdc202xx_new 0000:00:01.0: PLL input clock is 16597 kHz&lt;br /&gt;
pdc202xx_new 0000:00:01.0: 100% native mode on irq 24&lt;br /&gt;
ide2: DMA disabled&lt;br /&gt;
ide3: DMA disabled&lt;br /&gt;
*********************************************&lt;br /&gt;
cpu_0 received a bus/cache error&lt;br /&gt;
*********************************************&lt;br /&gt;
Bridge: Phys Addr = 0x0000000000, Device_AERR = 0x00000000&lt;br /&gt;
Bridge: The devices reporting AERR are:&lt;br /&gt;
CPU: (XLR specific) Cache Error log = 0x0080000800000601, Phy Addr = 0x0010000008&lt;br /&gt;
CPU: epc = 0xffffffff836fcb68, errorepc = 0xffffffff8342938c, cacheerr = 0x00000000&lt;br /&gt;
Can not handle bus/cache error - Halting cpu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
看到这个 bus/cache error 是比较郁闷的，当初移植是，似乎在哪里看到对 RMI XLR 上的 bus/cache error 有个注释，找了下，确实有这么个注释：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
* On Phoenix, errors reported by bridge (like misconfigured BARS etc) are&lt;br /&gt;
* also reported as cache errors. Need to check if it is really a cache&lt;br /&gt;
* error or a &amp;quot;bus error&amp;quot; and take action appropriately.&lt;br /&gt;
* For now, treat it as a cache error&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对照内核对 cache error 异常的处理代码，又翻了下文档，对 Cache Error log 和 Phy Addr 进行了解析，实际上就是访问 0x0010000008 这个物理地址导致的。Cache Error log 的内容来自于 L1D_CACHE_ERROR_LOG 这个寄存器，细看了，没有记录太有价值的信息。&lt;br /&gt;
&lt;br /&gt;
代码里还有段注释：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /*&lt;br /&gt;
     * TODO: cache error on xlr could also be because of access to a physical&lt;br /&gt;
     * address region that is not mapped to any device in the bridge&lt;br /&gt;
     * We should detect that condition by reading the bridge registers and if&lt;br /&gt;
     * a process is doing the access, the process should be SEGFAULTED. If&lt;br /&gt;
     * kernel is doing it, all bets are off, so we should dump the stack and&lt;br /&gt;
     * die. For Now, just halt the cpu&lt;br /&gt;
    */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
百思不得其解，0x10000008 这个 PA 怎么就没有被映射。&lt;br /&gt;
&lt;br /&gt;
2009.02.17 23:53&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接昨天的分析，继续 rmi_ide_mm_outb() 的探索，怀疑是不是向相邻的 IDE I/O register 写了 0 值导致的 bus/cache error，于是：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void rmi_ide_mm_outb (u8 value, unsigned long port)&lt;br /&gt;
{&lt;br /&gt;
    u32 tmp = *(u32 *)(pci_ide_phys_to_virt(port));&lt;br /&gt;
    tmp &amp;amp;= 0x00ffffff;&lt;br /&gt;
    __raw_writel(tmp | swab32((u32)value), pci_ide_phys_to_virt(port));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
不太放心 toolchain，把指令 dump 出来看了下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0000000000000000 &amp;lt;rmi_ide_mm_outb&amp;gt;:&lt;br /&gt;
   0:   3c020000    lui v0,0x0&lt;br /&gt;
   4:   dc470000    ld a3,0(v0)&lt;br /&gt;
   8:   3c030000    lui v1,0x0&lt;br /&gt;
   c:   dc660000    ld a2,0(v1)&lt;br /&gt;
10:   00a7282f    dsubu   a1,a1,a3&lt;br /&gt;
14:   00c5302d    daddu   a2,a2,a1&lt;br /&gt;
18:   8cc30000    lw v1,0(a2)&lt;br /&gt;
1c:   3c0200ff    lui v0,0xff&lt;br /&gt;
20:   308400ff    andi    a0,a0,0xff&lt;br /&gt;
24:   3442ffff    ori v0,v0,0xffff&lt;br /&gt;
28:   00621824    and v1,v1,v0&lt;br /&gt;
2c:   00042600    sll a0,a0,0x18&lt;br /&gt;
30:   00641825    or v1,v1,a0&lt;br /&gt;
34:   acc30000    sw v1,0(a2)&lt;br /&gt;
38:   03e00008    jr ra&lt;br /&gt;
3c:   00000000    nop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
生成的指令没问题，一试，同样的现象：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Uniform Multi-Platform E-IDE driver&lt;br /&gt;
pdc202xx_new 0000:00:01.0: IDE controller (0x105a:0x4d69 rev 0x02)&lt;br /&gt;
pdc202xx_new 0000:00:01.0: PLL input clock is 16597 kHz&lt;br /&gt;
pdc202xx_new 0000:00:01.0: 100% native mode on irq 24&lt;br /&gt;
ide2: DMA disabled&lt;br /&gt;
ide3: DMA disabled&lt;br /&gt;
*********************************************&lt;br /&gt;
cpu_0 received a bus/cache error&lt;br /&gt;
*********************************************&lt;br /&gt;
Bridge: Phys Addr = 0x0000000000, Device_AERR = 0x00000000&lt;br /&gt;
Bridge: The devices reporting AERR are:&lt;br /&gt;
CPU: (XLR specific) Cache Error log = 0x0080000800000601, Phy Addr = 0x0010000008&lt;br /&gt;
CPU: epc = 0xffffffff836fcb68, errorepc = 0xffffffff8342938c, cacheerr = 0x00000000&lt;br /&gt;
Can not handle bus/cache error - Halting cpu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
不甘心，又试了个 64 bit 的：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void rmi_ide_mm_outb (u8 value, unsigned long port)&lt;br /&gt;
{&lt;br /&gt;
    uint64_t tmp = *(uint64_t *)(pci_ide_phys_to_virt(port));&lt;br /&gt;
    tmp &amp;amp;= 0x00ffffffffffffff;&lt;br /&gt;
    *(uint64_t *)(pci_ide_phys_to_virt(port)) = tmp | swab64((uint64_t)value);&lt;br /&gt;
    tmp = *(uint64_t *)(pci_ide_phys_to_virt(port));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ffffffff836fcb50 &amp;lt;rmi_ide_mm_outb&amp;gt;:&lt;br /&gt;
ffffffff836fcb50:   3c02838e    lui v0,0x838e&lt;br /&gt;
ffffffff836fcb54:   dc473360    ld a3,13152(v0)&lt;br /&gt;
ffffffff836fcb58:   3c038399    lui v1,0x8399&lt;br /&gt;
ffffffff836fcb5c:   dc662eb0    ld a2,11952(v1)&lt;br /&gt;
ffffffff836fcb60:   00a7282f    dsubu   a1,a1,a3&lt;br /&gt;
ffffffff836fcb64:   00c5302d    daddu   a2,a2,a1&lt;br /&gt;
ffffffff836fcb68:   24020001    li v0,1&lt;br /&gt;
ffffffff836fcb6c:   dcc30000    ld v1,0(a2)&lt;br /&gt;
ffffffff836fcb70:   308400ff    andi    a0,a0,0xff&lt;br /&gt;
ffffffff836fcb74:   0002163c    dsll32 v0,v0,0x18&lt;br /&gt;
ffffffff836fcb78:   00042600    sll a0,a0,0x18&lt;br /&gt;
ffffffff836fcb7c:   6442ffff    daddiu v0,v0,-1&lt;br /&gt;
ffffffff836fcb80:   00621824    and v1,v1,v0&lt;br /&gt;
ffffffff836fcb84:   0004203c    dsll32 a0,a0,0x0&lt;br /&gt;
ffffffff836fcb88:   00641825    or v1,v1,a0&lt;br /&gt;
ffffffff836fcb8c:   03e00008    jr ra&lt;br /&gt;
ffffffff836fcb90:   fcc30000    sd v1,0(a2)&lt;br /&gt;
ffffffff836fcb94:   00000000    nop&lt;br /&gt;
&lt;br /&gt;
Uniform Multi-Platform E-IDE driver&lt;br /&gt;
pdc202xx_new 0000:00:01.0: IDE controller (0x105a:0x4d69 rev 0x02)&lt;br /&gt;
*********************************************&lt;br /&gt;
cpu_0 received a bus/cache error&lt;br /&gt;
*********************************************&lt;br /&gt;
Bridge: Phys Addr = 0x0000000000, Device_AERR = 0x00000000&lt;br /&gt;
Bridge: The devices reporting AERR are:&lt;br /&gt;
CPU: (XLR specific) Cache Error log = 0x0080000800001a01, Phy Addr = 0x0010000030&lt;br /&gt;
CPU: epc = 0xffffffff836fcb6c, errorepc = 0xffffffff8342938c, cacheerr = 0x00000000&lt;br /&gt;
Can not handle bus/cache error - Halting cpu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2009.02.18 10:23&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
都没什么感觉了，随手就在 rmi_ide_mm_outb() 里把每次进来的地址打了出来：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rmi_atx_2-1:/root&amp;gt; insmod ./pdc202xx_new.ko&lt;br /&gt;
pdc202xx_new 0000:00:01.0: IDE controller (0x105a:0x4d69 rev 0x02)&lt;br /&gt;
ide_addr = 0x10000021&lt;br /&gt;
ide_addr = 0x10000029&lt;br /&gt;
ide_addr = 0x10000021&lt;br /&gt;
ide_addr = 0x10000021&lt;br /&gt;
ide_addr = 0x10000029&lt;br /&gt;
ide_addr = 0x10000029&lt;br /&gt;
ide_addr = 0x10000021&lt;br /&gt;
ide_addr = 0x10000023&lt;br /&gt;
pdc202xx_new 0000:00:01.0: PLL input clock is 13911 kHz&lt;br /&gt;
ide_addr = 0x10000029&lt;br /&gt;
ide_addr = 0x1000002b&lt;br /&gt;
ide_addr = 0x10000029&lt;br /&gt;
ide_addr = 0x1000002b&lt;br /&gt;
pdc202xx_new 0000:00:01.0: 100% native mode on irq 24&lt;br /&gt;
ide2: DMA disabled&lt;br /&gt;
ide3: DMA disabled&lt;br /&gt;
ide_addr = 0x10000006&lt;br /&gt;
*********************************************&lt;br /&gt;
cpu_16 received a bus/cache error&lt;br /&gt;
*********************************************&lt;br /&gt;
Bridge: Phys Addr = 0x0128000000, Device_AERR = 0x00000004&lt;br /&gt;
Bridge: The devices reporting AERR are:&lt;br /&gt;
    cpu 2&lt;br /&gt;
CPU: (XLR specific) Cache Error log = 0x0000000800000601, Phy Addr = 0x0010000008&lt;br /&gt;
CPU: epc = 0xffffffff836fb0e4, errorepc = 0xffffffff83428c3c, cacheerr = 0x00000000&lt;br /&gt;
Can not handle bus/cache error - Halting cpu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
看到是访问了 0x10000006 这个地方导致的，揣测这个地址不对：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void rmi_ide_mm_outb (u8 value, unsigned long port)&lt;br /&gt;
{&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; ide_addr = 0x%016lx\n&amp;quot;, pci_ide_phys_to_virt(port));&lt;br /&gt;
    if(pci_ide_phys_to_virt(port) &amp;lt; 0x9000000010000020)&lt;br /&gt;
    {&lt;br /&gt;
        dump_stack();&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    __flush_cache_all();&lt;br /&gt;
    u32 tmp = *(u32 *)(pci_ide_phys_to_virt(port));&lt;br /&gt;
    tmp &amp;amp;= 0x00ffffff;&lt;br /&gt;
    __raw_writel(tmp | swab32((u32)value), pci_ide_phys_to_virt(port));&lt;br /&gt;
}&lt;br /&gt;
pdc202xx_new 0000:00:01.0: IDE controller (0x105a:0x4d69 rev 0x02)&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x9000000010000021&lt;br /&gt;
ide_addr = 0x9000000010000023&lt;br /&gt;
pdc202xx_new 0000:00:01.0: PLL input clock is 14018 kHz&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x900000001000002b&lt;br /&gt;
ide_addr = 0x9000000010000029&lt;br /&gt;
ide_addr = 0x900000001000002b&lt;br /&gt;
pdc202xx_new 0000:00:01.0: 100% native mode on irq 24&lt;br /&gt;
ide2: DMA disabled&lt;br /&gt;
ide3: DMA disabled&lt;br /&gt;
ide_addr = 0x9000000010000006&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340bad0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff8367ee18&amp;gt;] SELECT_DRIVE+0x60/0x70&lt;br /&gt;
[&amp;lt;ffffffff83683198&amp;gt;] ide_probe_port+0x148/0x740&lt;br /&gt;
[&amp;lt;ffffffff83684880&amp;gt;] ide_host_register+0x290/0x728&lt;br /&gt;
[&amp;lt;ffffffff83687554&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105b8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231d8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&lt;br /&gt;
ide_addr = 0x9000000010000006&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340bad0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff8367ee18&amp;gt;] SELECT_DRIVE+0x60/0x70&lt;br /&gt;
[&amp;lt;ffffffff83683198&amp;gt;] ide_probe_port+0x148/0x740&lt;br /&gt;
[&amp;lt;ffffffff83684880&amp;gt;] ide_host_register+0x290/0x728&lt;br /&gt;
[&amp;lt;ffffffff83687554&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105b8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231d8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&lt;br /&gt;
ide_addr = 0x900000001000000a&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340bad0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff836831ac&amp;gt;] ide_probe_port+0x15c/0x740&lt;br /&gt;
[&amp;lt;ffffffff83684880&amp;gt;] ide_host_register+0x290/0x728&lt;br /&gt;
[&amp;lt;ffffffff83687554&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105b8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231d8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&lt;br /&gt;
ide_addr = 0x900000001000001a&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340bad0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff836831ac&amp;gt;] ide_probe_port+0x15c/0x740&lt;br /&gt;
[&amp;lt;ffffffff83684880&amp;gt;] ide_host_register+0x290/0x728&lt;br /&gt;
[&amp;lt;ffffffff83687554&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105b8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231d8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&lt;br /&gt;
ide_addr = 0x9000000010000016&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340bad0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff8367ee18&amp;gt;] SELECT_DRIVE+0x60/0x70&lt;br /&gt;
[&amp;lt;ffffffff836831fc&amp;gt;] ide_probe_port+0x1ac/0x740&lt;br /&gt;
[&amp;lt;ffffffff83684880&amp;gt;] ide_host_register+0x290/0x728&lt;br /&gt;
[&amp;lt;ffffffff83687554&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105b8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231d8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
可以看到多次访问了低于 0x10000020 的地址，揣测失败。不知受了什么刺激，突然想起 bootloader 打出的该 IDE 控制器的 PCI I/O 段：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[pci {0x4d69:0x105a} {0x00:0x01:0x00}]&lt;br /&gt;
    BAR[0] 0x10000000:0x10000008 IO&lt;br /&gt;
    BAR[1] 0x10000008:0x1000000c IO&lt;br /&gt;
    BAR[2] 0x10000010:0x10000018 IO&lt;br /&gt;
    BAR[3] 0x10000018:0x1000001c IO&lt;br /&gt;
    BAR[4] 0x10000020:0x10000030 IO&lt;br /&gt;
    BAR[5] 0xd0000000:0xd0004000 Memory&lt;br /&gt;
    BAR[6] 0xd0004000:0xd0008000 ROM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
内核里的则为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rmi_atx_2-1:/root&amp;gt; cat /proc/ioports&lt;br /&gt;
10000000-100fffff : PHOENIX IO MEM&lt;br /&gt;
10000000-10000007 : pdc202xx_new&lt;br /&gt;
10000008-1000000b : pdc202xx_new&lt;br /&gt;
10000010-10000017 : pdc202xx_new&lt;br /&gt;
10000018-1000001b : pdc202xx_new&lt;br /&gt;
10000020-1000002f : pdc202xx_new&lt;br /&gt;
10000100-100001ff : 8139too&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因此 lw 0x900000001000000a 时就会超出 PA (BAR[1])，访问到没有映射的区域去了&lt;br /&gt;
&lt;br /&gt;
所以在这用 ld/lw 是不行的，肯定会出现 cache/bus error&lt;br /&gt;
&lt;br /&gt;
总算可以解释了一个一直让我头疼不已的现象，小高兴下。&lt;br /&gt;
&lt;br /&gt;
2009.02.18 11:13&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
中午出去小转了下，刚下的雪差不多都化了，盼了这么久的雪，走得太快。回来百无聊赖，继续盯 rmi_ide_mm_outb()，试了几次，突然就注意到这么一个 Log：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rmi_atx_2-1:/root&amp;gt; insmod ./pdc202xx_new.ko&lt;br /&gt;
ide_vaddr = 0x9000000010000021&lt;br /&gt;
ide_vaddr = 0x9000000010000021&lt;br /&gt;
ide_vaddr = 0x9000000010000029&lt;br /&gt;
ide_vaddr = 0x900000001000002b&lt;br /&gt;
ide_vaddr = 0x9000000010000006&lt;br /&gt;
ide_vaddr = 0x900000001000000a&lt;br /&gt;
ide_vaddr = 0x9000000010000006&lt;br /&gt;
ide_vaddr = 0x900000001000000a&lt;br /&gt;
ide_vaddr = 0x9000000010000006&lt;br /&gt;
ide_vaddr = 0x9000000010000006&lt;br /&gt;
ide_vaddr = 0x900000001000000a&lt;br /&gt;
ide_vaddr = 0x900000001000000a&lt;br /&gt;
ide_vaddr = 0x9000000010000001&lt;br /&gt;
ide_vaddr = 0x9000000010000007&lt;br /&gt;
ide_vaddr = 0x900000001000000a&lt;br /&gt;
ide_vaddr = 0x9000000010000001&lt;br /&gt;
ide_vaddr = 0x9000000010000002&lt;br /&gt;
ide_vaddr = 0x9000000010000007&lt;br /&gt;
ide_vaddr = 0x9000000000000001&lt;br /&gt;
ide_vaddr = 0x9000000000000003&lt;br /&gt;
ide_vaddr = 0x9000000000000001&lt;br /&gt;
ide_vaddr = 0x9000000000000003&lt;br /&gt;
ide_vaddr = 0x9000000000000001&lt;br /&gt;
ide_vaddr = 0x9000000000000003&lt;br /&gt;
ide_vaddr = 0x9000000010000016&lt;br /&gt;
ide_vaddr = 0x900000001000001a&lt;br /&gt;
ide_vaddr = 0x9000000010000016&lt;br /&gt;
ide_vaddr = 0x900000001000001a&lt;br /&gt;
ide_vaddr = 0x9000000010000016&lt;br /&gt;
ide_vaddr = 0x900000001000001a&lt;br /&gt;
ide_vaddr = 0x9000000010000016&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
出现这么一堆很怪的地址，这个地址映射到物理地址 0x1 和 0x3 处，这个地方正是 TLB refill handler 之所在，写这两个字节，等于就是改写了 TLB refill handler!&lt;br /&gt;
&lt;br /&gt;
一下子，当初的 workaround 是怎么可以的，为什么 insmod 会失败全清晰了，这个感觉太美妙了。&lt;br /&gt;
&lt;br /&gt;
是越来越接近 BOSS 了。&lt;br /&gt;
&lt;br /&gt;
2009.02.18 16:03&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
似乎搞定了这个问题，Log 之&lt;br /&gt;
&lt;br /&gt;
难道是出去晃悠了半天，与雪合一，境界提升了 :-)&lt;br /&gt;
&lt;br /&gt;
2009.02.19 17:17&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很自然的把 rmi_ide_mm_outb() 改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void rmi_ide_mm_outb (u8 value, unsigned long port)&lt;br /&gt;
{&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; port = 0x%016lx\n&amp;quot;, port);&lt;br /&gt;
    if(port &amp;lt; 0x10000000ULL)&lt;br /&gt;
    {  &lt;br /&gt;
        printk(&amp;quot;&amp;lt;0&amp;gt; illigal ide_vaddr = 0x%lx\n&amp;quot;, pci_ide_phys_to_virt(port));&lt;br /&gt;
        dump_stack();&lt;br /&gt;
    }&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; ide_vaddr = 0x%lx\n&amp;quot;, pci_ide_phys_to_virt(port));&lt;br /&gt;
    *(u8 *)(pci_ide_phys_to_virt(port)) = value;&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即当检测到写的地址不正常时，直接 dump_stack() ，这样就可以很容易定位是谁要写这么个地址的：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port = 0x0000000000000001&lt;br /&gt;
illigal ide_vaddr = 0x9000000000000001&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340baf0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff836fcfbc&amp;gt;] rmi_ide_mm_outb+0xb4/0xc0&lt;br /&gt;
[&amp;lt;ffffffff8368a6e8&amp;gt;] set_indexed_reg+0x50/0x78&lt;br /&gt;
[&amp;lt;ffffffff8368a7bc&amp;gt;] pdcnew_set_pio_mode+0xac/0xe0&lt;br /&gt;
[&amp;lt;ffffffff83681ea8&amp;gt;] ide_set_pio_mode+0xe0/0xe8&lt;br /&gt;
[&amp;lt;ffffffff83683954&amp;gt;] ide_port_tune_devices+0x1a4/0x1c8&lt;br /&gt;
[&amp;lt;ffffffff8368493c&amp;gt;] ide_host_register+0x32c/0x770&lt;br /&gt;
[&amp;lt;ffffffff836875bc&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105d8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231f8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&lt;br /&gt;
ide_vaddr = 0x9000000000000001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
port = 0x0000000000000003&lt;br /&gt;
illigal ide_vaddr = 0x9000000000000003&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340baf0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff836fcfbc&amp;gt;] rmi_ide_mm_outb+0xb4/0xc0&lt;br /&gt;
[&amp;lt;ffffffff8368a7bc&amp;gt;] pdcnew_set_pio_mode+0xac/0xe0&lt;br /&gt;
[&amp;lt;ffffffff83681ea8&amp;gt;] ide_set_pio_mode+0xe0/0xe8&lt;br /&gt;
[&amp;lt;ffffffff83683954&amp;gt;] ide_port_tune_devices+0x1a4/0x1c8&lt;br /&gt;
[&amp;lt;ffffffff8368493c&amp;gt;] ide_host_register+0x32c/0x770&lt;br /&gt;
[&amp;lt;ffffffff836875bc&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105d8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231f8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&lt;br /&gt;
ide_vaddr = 0x9000000000000003&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
可以看到主要是 IDE controller driver 初始化时，不知为什么在 set_indexed_reg() 和 pdcnew_set_pio_mode() 往物理地址 0x1 和 0x3 处各写了一个字节。&lt;br /&gt;
&lt;br /&gt;
set_indexed_reg() 实现为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
static void set_indexed_reg(ide_hwif_t *hwif, u8 index, u8 value)&lt;br /&gt;
{&lt;br /&gt;
    rmi_ide_mm_outb(index, hwif-&amp;gt;dma_base + 1);&lt;br /&gt;
    rmi_ide_mm_outb(value, hwif-&amp;gt;dma_base + 3);&lt;br /&gt;
    DBG(&amp;quot;index[%02X] value[%02X]\n&amp;quot;, index, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即其直接向 hwif-&amp;gt;dma_base + 1 和 hwif-&amp;gt;dma_base+3 处各写了两个字节，反推 hwif-&amp;gt;dma_base 为 0，这个很容易验证的：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
static void set_indexed_reg(ide_hwif_t *hwif, u8 index, u8 value)&lt;br /&gt;
{&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; set_indexed_reg: hwif-&amp;gt;name = %s\n&amp;quot;, hwif-&amp;gt;name);&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; hwif-&amp;gt;dma_base = 0x%p\n&amp;quot;, hwif-&amp;gt;dma_base);&lt;br /&gt;
    rmi_ide_mm_outb(index, hwif-&amp;gt;dma_base + 1);&lt;br /&gt;
    rmi_ide_mm_outb(value, hwif-&amp;gt;dma_base + 3);&lt;br /&gt;
    DBG(&amp;quot;index[%02X] value[%02X]\n&amp;quot;, index, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Log 就变为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set_indexed_reg: hwif-&amp;gt;name = ide2&lt;br /&gt;
hwif-&amp;gt;dma_base = 0x0000000000000000&lt;br /&gt;
port = 0x0000000000000001&lt;br /&gt;
illigal ide_vaddr = 0x9000000000000001&lt;br /&gt;
Call Trace:&lt;br /&gt;
[&amp;lt;ffffffff8340baf0&amp;gt;] dump_stack+0x8/0x38&lt;br /&gt;
[&amp;lt;ffffffff836fcfbc&amp;gt;] rmi_ide_mm_outb+0xb4/0xc0&lt;br /&gt;
[&amp;lt;ffffffff8368a6e8&amp;gt;] set_indexed_reg+0x50/0x78&lt;br /&gt;
[&amp;lt;ffffffff8368a7bc&amp;gt;] pdcnew_set_pio_mode+0xac/0xe0&lt;br /&gt;
[&amp;lt;ffffffff83681ea8&amp;gt;] ide_set_pio_mode+0xe0/0xe8&lt;br /&gt;
[&amp;lt;ffffffff83683954&amp;gt;] ide_port_tune_devices+0x1a4/0x1c8&lt;br /&gt;
[&amp;lt;ffffffff8368493c&amp;gt;] ide_host_register+0x32c/0x770&lt;br /&gt;
[&amp;lt;ffffffff836875bc&amp;gt;] ide_pci_init_one+0xdc/0x100&lt;br /&gt;
[&amp;lt;ffffffff83910dac&amp;gt;] ide_scan_pcibus+0x98/0x17c&lt;br /&gt;
[&amp;lt;ffffffff834105d8&amp;gt;] __kprobes_text_end+0x38/0x180&lt;br /&gt;
[&amp;lt;ffffffff838f8378&amp;gt;] kernel_init+0x250/0x2cc&lt;br /&gt;
[&amp;lt;ffffffff834231f8&amp;gt;] kernel_thread_helper+0x10/0x18&lt;br /&gt;
&lt;br /&gt;
ide_vaddr = 0x9000000000000001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很显然 dma_base 肯定不能为 0 的，于是遍寻 drivers/ide/ 下的初始化代码 grep -r &amp;quot;hwif-&amp;gt;dma_base\ =&amp;quot;，很容易就定位到 ide_init_port():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if (d-&amp;gt;init_dma)&lt;br /&gt;
            rc = d-&amp;gt;init_dma(hwif, d);&lt;br /&gt;
        else&lt;br /&gt;
            rc = ide_hwif_setup_dma(hwif, d);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在驱动未提供 init_dma 函数时，其使用 ide_hwif_setup_dma()，而这个函数实现为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d)&lt;br /&gt;
{&lt;br /&gt;
    struct pci_dev *dev = to_pci_dev(hwif-&amp;gt;dev);&lt;br /&gt;
&lt;br /&gt;
    if ((d-&amp;gt;host_flags &amp;amp; IDE_HFLAG_NO_AUTODMA) == 0 ||&lt;br /&gt;
        ((dev-&amp;gt;class &amp;gt;&amp;gt; 8) == PCI_CLASS_STORAGE_IDE &amp;amp;&amp;amp;&lt;br /&gt;
         (dev-&amp;gt;class &amp;amp; 0x80))) {&lt;br /&gt;
        unsigned long base = ide_pci_dma_base(hwif, d);&lt;br /&gt;
   &lt;br /&gt;
        if (base == 0)&lt;br /&gt;
            return -1;&lt;br /&gt;
&lt;br /&gt;
        hwif-&amp;gt;dma_base = base;&lt;br /&gt;
&lt;br /&gt;
        if (ide_pci_check_simplex(hwif, d) &amp;lt; 0)&lt;br /&gt;
            return -1;&lt;br /&gt;
&lt;br /&gt;
        if (ide_pci_set_master(dev, d-&amp;gt;name) &amp;lt; 0)&lt;br /&gt;
            return -1;&lt;br /&gt;
&lt;br /&gt;
        if (hwif-&amp;gt;host_flags &amp;amp; IDE_HFLAG_MMIO)&lt;br /&gt;
            printk(KERN_INFO &amp;quot;    %s: MMIO-DMA\n&amp;quot;, hwif-&amp;gt;name);&lt;br /&gt;
        else&lt;br /&gt;
            printk(KERN_INFO &amp;quot;    %s: BM-DMA at 0x%04lx-0x%04lx\n&amp;quot;,&lt;br /&gt;
                     hwif-&amp;gt;name, base, base + 7);&lt;br /&gt;
   &lt;br /&gt;
        hwif-&amp;gt;extra_base = base + (hwif-&amp;gt;channel ? 8 : 16);&lt;br /&gt;
&lt;br /&gt;
        if (ide_allocate_dma_engine(hwif))&lt;br /&gt;
            return -1;&lt;br /&gt;
&lt;br /&gt;
        hwif-&amp;gt;dma_ops = &amp;amp;sff_dma_ops;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d)&lt;br /&gt;
{&lt;br /&gt;
    struct pci_dev *dev = to_pci_dev(hwif-&amp;gt;dev);&lt;br /&gt;
    unsigned long dma_base = 0;&lt;br /&gt;
&lt;br /&gt;
    if (hwif-&amp;gt;host_flags &amp;amp; IDE_HFLAG_MMIO)&lt;br /&gt;
        return hwif-&amp;gt;dma_base;&lt;br /&gt;
&lt;br /&gt;
    if (hwif-&amp;gt;mate &amp;amp;&amp;amp; hwif-&amp;gt;mate-&amp;gt;dma_base) {&lt;br /&gt;
        dma_base = hwif-&amp;gt;mate-&amp;gt;dma_base - (hwif-&amp;gt;channel ? 0 : 8);&lt;br /&gt;
    } else {&lt;br /&gt;
        u8 baridx = (d-&amp;gt;host_flags &amp;amp; IDE_HFLAG_CS5520) ? 2 : 4;&lt;br /&gt;
&lt;br /&gt;
        dma_base = pci_resource_start(dev, baridx);&lt;br /&gt;
&lt;br /&gt;
        if (dma_base == 0) {&lt;br /&gt;
            printk(KERN_ERR &amp;quot;%s %s: DMA base is invalid\n&amp;quot;,&lt;br /&gt;
                d-&amp;gt;name, pci_name(dev));&lt;br /&gt;
            return 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (hwif-&amp;gt;channel)&lt;br /&gt;
        dma_base += 8;&lt;br /&gt;
&lt;br /&gt;
    return dma_base;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为驱动加了 IDE_HFLAG_MMIO 标志，故而其没有真正地为其计算 dma_base，直接返回就为 0 了！&lt;br /&gt;
&lt;br /&gt;
2009.02.20 22:58 补记&lt;br /&gt;
---------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Solution ==&lt;br /&gt;
&lt;br /&gt;
原因找到，解决就很容易了，要不实现一个简单的 init_dma()，要不将其条件编译也可：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef CONFIG_CPU_PHOENIX&lt;br /&gt;
    if (hwif-&amp;gt;host_flags &amp;amp; IDE_HFLAG_MMIO)&lt;br /&gt;
        return hwif-&amp;gt;dma_base;&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	</feed>