📌 置頂: 請把任何比你弱勢的用路人當作你的至親對待。跟前車保持安全車距 (2秒以上)。

Qualcomm ath9k 驅動程式解析 (一) – 初始化過程

In

, ,

Tags:



by

以 linux-4.19-rc2 為例,平台為 TP-Link WDR4300。程式碼以 linux-4.19-rc2 為準,有特別標示者以 OpenWrt/LEDE 為準。

1. ath9k 驅動程式註冊點:ath9k/init.c#ath9k_init(void)

主要有三件事情,(1) 初始化 PCI 匯流排、(2) 初始化 AHB 匯流排、(3) 初始化 quirks:

2. 初始化 PCI 匯流排:ath9k/pci.c#ath_pci_init(void)

這邊傳入 struct pci_driver ath_pci_driver 當參數,ath_pci_driver 定義為:

struct pci_driver 本身定義了一些 PCI driver 的 method, 同時有 struct device_driver 給 device driver-model 使用 (The struct device_driver structure, which represents one driver capable of handling certain devices on a certain bus)

ath_pci_driver 傳入 pci_register_driver 後,就會進行 PCI 註冊的部份:

主要是初始化 device driver-model 中的 struct device_driver 的部份,可以看到初始化最重要的部份是 drv->driver.bus ,將 struct bus_type 設定為 pci_bus_type (struct bus_type 在 device driver-model 中代表著使用的 bus 型態,這邊是 PCI bus)。

struct device_driver 初始化完成後,傳入 device_register 進行驅動程式註冊:

接著進入各種 calling 最後調用 ath_pci_probe:bus_add_driver -> driver_attach -> __driver_attach -> driver_probe_device -> really_probe -> dev->bus->probe(dev) (pci_bus_type.probe -> pci_device_probe) -> __pci_device_probe -> pci_call_probe -> local_pci_probe -> pci_drv->probe (ath_pci_driver.probe -> ath_pci_probe) -> ath_pci_probe

其中大略分為以下幾項:(1) 設定 PCI 相關事物 (2) 初始化 ieee80211_hw、ath_softc (3) 初始化 ath9k 實體。

(1) 設定 PCI 相關事物:

(2) 初始化 ieee80211_hw、ath9k_softc

(3) 初始化 ath9k 實體

3. dmi_check_system

ref: https://www.fsl.cs.sunysb.edu/kernel-api/re748.html

driver 會需要因為不同的硬體而有不同的設定,在 Linux 之中,可以透過 quirks 來做設定。dmi_check_system 則是用來確認 system DMI (Desktop Management Information) 的函式。用途就是,會 iterate 過整個傳入的 blacklist,如果其中有對應到的 DMI 的話,就會觸發 blacklist 中的 callback 函數。

以 ath9k 為例,這個地方是用來設定不同的中斷方式,預設的中斷方式是 INTx,某些硬體 (這邊都是 dell 的硬體) 則會選擇使用 MSI:

至此 ath9k 完成初始化,將硬體註冊到了 mac80211 之中。


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.