2017-10-07 244 views
0

我正在查看https://github.com/o11s/open80211s/tree/master/drivers/net/wireless/rtl818x/rtl8180的802.11 Realtek驅動程序代碼,但無法弄清楚內核如何知道要調用哪個驅動程序函數。Linux內核如何知道要調用哪個驅動程序函數?

例如,它如何知道它是否需要調用write_grf5101或rtl8225_write爲了傳輸數據報?

從rtl8225.c:

static void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data) 
{ 
... 
} 

從grf5101.c:

static void write_grf5101(struct ieee80211_hw *dev, u8 addr, u32 data) 
{ 
... 
} 
+0

在這裏發佈適當的代碼字段。如果不檢查外部資源,應該回答問題。 – bolov

+1

我已經添加了我所指的傳輸函數的代碼片段。 – charlesw

+1

根據該代碼,駕駛員選擇期間設置適當的功能[探測](https://github.com/o11s/open80211s/blob/master/drivers/net/wireless/rtl818x/rtl8180/dev.c#L1042)通過檢查一些讀取的值。 – Tsyvarev

回答

2

這兩個函數不是由內核本身調用。他們是靜態並駐留在相應的文件(可能是芯片專用文件)。此外,它們似乎不是在任何地方都用作回調

相反,你可以看到,例如,write_grf5101()used通過grf5101_rf_init()功能./drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c文件,該功能rtl818x_rf_ops結構set as a callback這反過來,你可能明白了,是一些有點像比較通用驅動程序內的實體。例如,該變量grf5101_rf_ops(這是struct rtl818x_rf_ops類型)是set as a callback table通過./drivers/net/wireless/realtek/rtl818x/rtl8180/dev.crtl8180_probe()功能。最後,後者rtl8180_probe()struct pci_driver,正如你可能會看到類型的rtl8180_driver變量set as a callback,是某種類似內核本身(所有PCI設備與struct pci_driver註冊自己)保持的接口。下面的行module_pci_driver(rtl8180_driver);在這個特定的情況下執行這種註冊。

所以,問題是,「內核」不知道(也可能不應該)對這種微小的靜態輔助程序。取而代之的是,內核需要一個PCI設備描述結構,而這個結構反過來將被用來連接特定設備。一種典型的驅動器,但是,可以具有(常常具有)其內部回調結構 - 通常芯片特定的(在情況下,當驅動器被設計以某種類似的設備的家庭的服務於多個芯片) - 這在轉向將指向位於相應的.c文件中的芯片專用功能。內部函數可能會使用這樣的助手(如rtl8225_write()write_grf5101()),在這種情況下,與內核無關。他們只是一些小芯片特定的幫手。

相關問題