Linux内核是如何选择加载哪个固件版本的?

我从http://wireless.kernel.org/en/users/Drivers/iwlwifi#Firmware安装了我的网卡N-7260的最新固件。我正在使用内核版本为3.14.01的Ubuntu 14.04,该内核版本来自kernel's team ppa。这是我在/lib/firmware中拥有的固件列表:
$ ls /lib/firmware/*iwl*7260*
/lib/firmware/iwlwifi-7260-8.ucode  /lib/firmware/org.iwlwifi-7260-7.ucode
/lib/firmware/iwlwifi-7260-9.ucode  /lib/firmware/org.iwlwifi-7260-8.ucode

现在看起来版本9无法加载。如果我移除版本8,在启动时会看到以下信息:
sudo dmesg | grep iwl
[sudo] password for ozubu: 
[    6.121743] iwlwifi 0000:02:00.0: irq 62 for MSI/MSI-X
[    6.133208] iwlwifi 0000:02:00.0: Direct firmware load failed with error -2
[    6.133211] iwlwifi 0000:02:00.0: Falling back to user helper
[    6.311794] iwlwifi 0000:02:00.0: Direct firmware load failed with error -2
[    6.311799] iwlwifi 0000:02:00.0: Falling back to user helper
[    6.324940] iwlwifi 0000:02:00.0: request for firmware file 'iwlwifi-7260-7.ucode' failed.
[    6.324950] iwlwifi 0000:02:00.0: no suitable firmware found!

所以,我的问题是:
我该如何告诉Linux加载iwlwifi-7260-9.ucode
更新:
奇怪的是,根据dmesg显示,现在加载的固件版本是8。
$ sudo dmesg | grep iwl
[sudo] password for ozubu: 
[   18.970651] iwlwifi 0000:02:00.0: irq 62 for MSI/MSI-X
[   19.012648] iwlwifi 0000:02:00.0: loaded firmware version 22.24.8.0 op_mode iwlmvm
[   19.315472] iwlwifi 0000:02:00.0: Detected Intel(R) Wireless N 7260, REV=0x144
[   19.315899] iwlwifi 0000:02:00.0: L1 Disabled; Enabling L0S
[   19.316118] iwlwifi 0000:02:00.0: L1 Disabled; Enabling L0S
[   19.523132] ieee80211 phy0: Selected rate control algorithm 'iwl-mvm-rs'
[   23.100268] iwlwifi 0000:02:00.0: L1 Disabled; Enabling L0S
[   23.100484] iwlwifi 0000:02:00.0: L1 Disabled; Enabling L0S

据我所知,22.24.8.0是固件版本9。版本8为22.15.8.0。请参阅http://www.intel.com/support/wireless/wlan/sb/CS-034398.htm。 - jhasse
只是为了确认Pablo的发现,我的问题是在重新启动后不久SSH停止响应。在我将iwlwifi-7260-8.ucode固件安装到/lib/firmware并重新启动后,我已经成功地通过Wifi运行SSH而没有任何问题。我的系统是安装了14.04 LTS的Intel NUC。谢谢Pablo。 我是新来这个论坛的,所以我还不能投票,否则你会得到我的支持。 - user306737
使用14.04版本的操作系统,内核版本为3.13.0-36-generic,加载的固件版本为22.24.8.0,工作模式为iwlmvm,并且一切都运行正常(无论开机还是关机)。但是当我升级内核到3.16.*版本时,加载的固件版本变成了23.214.9.0,速度非常糟糕(开机时)并且速度只有原来的一半(关机时)。 - Tosho
@Tosho,嗯,这个芯片的固件真的很糟糕。我在使用这个芯片时遇到了各种问题。 - oz123
@Oz123 是的。但正如我所说的,22.24.8.0 的版本完美运行。我不确定问题是来自最新的固件还是内核3.16。 - Tosho
3个回答

所请求的固件版本写入驱动程序代码中。正如您所见,您正在使用的特定版本iwlwifi请求-7固件。它找不到并以错误结束。您可以在modinfo iwlwifi中看到这一点。
$ modinfo iwlwifi
filename:       /lib/modules/3.13.0-24-generic/kernel/drivers/net/wireless/iwlwifi/iwlwifi.ko
license:        GPL
author:         Copyright(c) 2003-2013 Intel Corporation <ilw@linux.intel.com>
version:        in-tree:
description:    Intel(R) Wireless WiFi driver for Linux
<snip>
firmware:       iwlwifi-7260-7.ucode

你的报告是什么?你试过备份后将-9固件重命名为-7吗?
我实际上相信,对于7260设备,modinfo建议使用-7,但驱动程序实际上使用-8。我不知道有任何需要-9的驱动程序版本。也许是内核版本3.15-xx。

嗨,我尝试了你的解决方案,但我仍然看到错误:Direct firmware load failed with error -2。另一个问题是,尽管该模块需要版本7,但它加载了版本8。请参见我的更新。 - oz123
请查看我的编辑。 - chili555
这里有一个错误报告 https://bugs.launchpad.net/ubuntu/+source/linux-firmware/+bug/1704799 - 希望你能下载缺失的固件并修复问题。 - zeroconf

我认为这取决于你的内核:
- 3.10+ 使用固件 -7 - 3.13+ 使用固件 -8 - 3.14.9+ 使用固件 -9 - 3.17+ 使用固件 -10
来源:http://wireless.kernel.org/en/users/Drivers/iwlwifi Ubuntu 14.04 是 3.13,所以加载 22.24.8.0。
Ubuntu 14.10 是 3.16,所以加载 25.228.9.0。
我可以连接两个版本,尽管第一个对我来说有些不稳定... speedtest.net 的下载速度是2-3Mbps,而第二个版本是25Mbps。具体情况可能因人而异。

4.4.0-21-generic 是用来做什么的? - Martin Thoma

一样...但是使用原始内核。
$ uname -a
Linux prato 3.13.0-30-generic #55-Ubuntu SMP Fri Jul 4 21:40:53 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$ modinfo iwlwifi | grep 7260
firmware:       iwlwifi-7260-7.ucode

但只有在我从http://wireless.kernel.org/en/users/Drivers/iwlwifi下载并安装7260-8后才能加载。
也许有人忘记在驱动程序信息中更改某些内容。我的安装中有-7和-9,很奇怪。
幸运的是,它与-8一起工作,甚至支持监控模式。
希望对你有所帮助!