Wifi

OpenBSD 未能載入據稱支持的 WiFi USB 適配器的韌體

  • July 17, 2014

我最近在亞馬遜上購買了Edimax EW-7811Un WiFi USB 適配器。urtwn(4)少數 OpenBSD 使用者報告說使用它取得了成功,並且它在其手冊頁中被列為受支持。

我目前正在華碩上網本上執行 OpenBSD 5.5 amd64(上週末下載)。正如預期的那樣,無線適配器被辨識為urtwn0,並且在我插入或移除它時報告為這樣。我/etc/hostname.urtwn0按照手冊頁中的描述創建,內容如下:

nwid mynetwork
wpakey mykey
dhcp

我的 Wifi 網路名稱和密碼分別在哪里mynetwork和是。mykey網路實際上是 WPA2,這可能會導致其自身的問題,但作業系統似乎甚至無法載入韌體。當我執行sh /etc/netstart urtwn0時,我得到以下輸出:

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

韌體是否可能已損壞?這是我第一次使用適配器。更有可能的是,Edimax 是否更改了韌體並破壞了 OpenBSD 目前的urtwn實現?也有可能,我只是犯了一個愚蠢的錯誤嗎?

首先要做的事情是:您的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相關的包,所以你可能需要使用埠樹。

按照常見問題解答中的說明設置埠樹,然後make install以 root 身份執行/usr/ports/sysutils/firmware/urtwn


如果您無法將您的盒子連接到網際網路:

韌體可以手動從 下載http://firmware.openbsd.org/firmware-dist/urtwn-1.1p0.tgz。從那裡獲取它,將它放在 U 盤上,然後將其複製到您的 OpenBSD 盒子中。提取存檔並將文件移動urtwn-*/etc/firmware/.

如果這可行,最好在fw_update -v有網路連接後執行。這樣,系統維護腳本將在必要時監控和升級韌體。


如果這一切都沒有幫助,您可能應該在郵件列表中詢問。如果您完成了家庭作業,那裡的人通常都很友好和樂於助人2。

2在misc@openbsd.org上多次提到該驅動程序。例如,有一些與 USB 相關的問題,請在發布之前檢查是否有任何與您看到的內容相關的內容。


添加:

我現在查看了原始碼,你可以得到這個錯誤消息的唯一方法是從函式urtwn_load_firmware()sys/dev/usb/if_urtwn.c,在行2194

  /* 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()(in sys/dev/firmload.c) 生成路徑/etc/firmware/urtwn-rtl8192cfwT並嘗試將該文件載入到 USB 適配器的記憶體中。由於它找不到該文件,因此您會收到您報告的錯誤消息。

引用自:https://unix.stackexchange.com/questions/144984