OpenBSD 无法加载据称支持的 WiFi USB 适配器的固件

OpenBSD 无法加载据称支持的 WiFi USB 适配器的固件

我最近买了一个Edimax EW-7811Un WiFi USB 适配器在亚马逊上。一些 OpenBSD 用户报告了它的成功,并且它被列为受其urtwn(4)支持手册页

我目前在华硕上网本上运行 OpenBSD 5.5 amd64(上周末下载)。正如预期的那样,无线适配器被识别为urtwn0,并且当我插入或移除它时,也会如此报告。我/etc/hostname.urtwn0按照手册页中的描述创建,内容如下:

nwid mynetwork
wpakey mykey
dhcp

其中mynetworkmykey分别是我的 Wifi 网络名称和密码。该网络实际上是 WPA2,这可能会导致其自身的问题,但操作系统似乎甚至无法加载固件。当我执行时sh /etc/netstart urtwn0,我得到以下输出:

urtwn0: failed loadfirmware of file urtwn-rt18192cfwT (error 2)
urtwn0: no link ............ sleeping

固件有可能损坏吗?这是我第一次使用适配器。更有可能的是,Edimax 是否更改了固件并破坏了 OpenBSD 当前的urtwn实现?也有可能,我只是犯了一个愚蠢的错误吗?

答案1

首先,您的hostname.urtwn0文件看起来不错,如果其中有错误,您会收到完全不同的错误消息。

该消息urtwn0: failed loadfirmware of file urtwn-rt18192cfwT (error 2) 表明固件未安装在正确的位置:

正如中所解释的loadfirmware(9),此函数返回errno样式错误代码:和errno(2)解释:

2 ENOENT No such file or directory.
    A component of a specified pathname did not exist, or the pathname
    was an empty string.

应该有一个文件/etc/firmware/urtwn-rt18192cfwT供驱动程序加载。1您很可能在树中找不到此文件。

1更多详情请见答案末尾


假设你有一些将盒子连接到互联网的方式:

尝试运行fw_update -v安装固件并确保文件位于正确的位置并且没有损坏。如果你幸运的话,这就是你需要做的。

如果失败,您可以尝试从以下位置安装固件包或端口(首先阅读此常见问题解答!)。我的本地镜像没有任何urtwn相关的软件包,因此您可能需要使用 ports 树。

按照中的说明设置端口树常见问题解答,然后make install以 root 身份运行/usr/ports/sysutils/firmware/urtwn


如果您无法将盒子连接到互联网:

固件可以从http://firmware.openbsd.org/firmware-dist/urtwn-1.1p0.tgz。从那里获取它,将其放在 USB 记忆棒上,然后将其复制到您的 OpenBSD 盒子中。提取存档并将文件移动urtwn-*/etc/firmware/.

如果这有效,那么最好fw_update -v在有网络连接后运行。这样,系统维护脚本将在必要时对固件进行监控和升级。


如果所有这些都没有帮助,您可能应该在邮件列表。如果你做好功课的话,那里的人通常都很友好并且乐于助人2

2驱动程序被多次提及[电子邮件受保护]。例如,有一些与 USB 相关的问题,请在发布之前检查是否有与您所看到的内容相关的内容。


添加:

我现在查看了源代码,获得此错误消息的唯一方法是从函数中的urtwn_load_firmware()atsys/dev/usb/if_urtwn.c2194

   /* Read firmware image from the filesystem. */
   if ((sc->chip & (URTWN_CHIP_UMC_A_CUT | URTWN_CHIP_92C)) ==
       URTWN_CHIP_UMC_A_CUT)
           name = "urtwn-rtl8192cfwU";
   else
           name = "urtwn-rtl8192cfwT";
   if ((error = loadfirmware(name, &fw, &len)) != 0) {
           printf("%s: failed loadfirmware of file %s (error %d)\n",
               sc->sc_dev.dv_xname, name, error);
           return (error);
   }

该函数loadfirmware()(在 中sys/dev/firmload.c)生成路径/etc/firmware/urtwn-rtl8192cfwT并尝试将该文件加载到 USB 适配器的内存中。由于找不到该文件,您会收到报告的错误消息。

相关内容