Qualcomm ath9k 驅動程式解析 (二) – 幾個重要結構

ieee80211_local *local

用途

第一次出現在

ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops); 調用 ieee80211_alloc_hw_nm() 出現。

allocaed 在

在 allocate wiphy 時分配出來,可以從以下的圖解中看出:

嵌套了:

struct ath_softc

用途:driver 中封裝與 mac80211 層溝通的結構,用途廣泛。

allocated 在drivers/net/wireless/ath/ath9k/pci.c#L950, hw = ieee80211_alloc_hw(sizeof(sturct ath_softc), &ath9k_ops);

嵌套於struct ieee80211_hw -> void *priv

struct ath_node

 

用途:每個 station 在 ath9k 中會以 struct ath_node 表示。

allocate 在net/mac80211/sta_info.c#L312, sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp);

第一出現在 driver 中ath9k/main.c#L1512, struct ath_node *an = (struct ath_node *) sta->drv_priv;

嵌套於struct sta_info->struct ieee80211_sta sta->u8 drv_priv[0] __aligned(sizeof(void *))

code 追蹤:

 

struct ath_atx_tid

 

用途:於 driver 中描述 per station per tid tx queue 的結構。

allocated 在net/mac80211/sta_info.c#L367:sta_info_alloc,

初始化在drivers/net/wireless/ath/ath9k/xmit.c#L2884,將 ath_node 中所有的 tx queue 的 tid 都初始化一遍:

嵌套於struct txq_info-> struct ieee80211_txq txq-> u8 drv_priv[0] __aligned(sizeof(void *));

struct ath_txq

用途:用來描述 ath driver 內 txq 的結構,與 ath_atx_tid 的差別是,這邊是封包存放的地方。

allocated 在drivers/net/wireless/ath/ath9k/pci.c#L950, hw = ieee80211_alloc_hw(sizeof(sturct ath_softc), &ath9k_ops);

初始化在

嵌套在

  • struct ath_softc -> struct ath_tx tx -> struct ath_txq *txq_map[IEEE80211_NUM_ACSS](4 queues for difference ACs data, mapping to txq[ATH9K_NUM_TX_QUEUES])
  • struct ath_softc -> struct ath_tx tx -> struct ath_txq txq[ATH9K_NUM_TX_QUEUES];(10 hw queues, including ATH9K_TX_QUEUE_CAB/UAPSD/DATA…etc)
  • struct txq_info -> struct ieee80211_txq txq-> u8 drv_priv[0] (ath_atx_tid) -> struct ath_txq txq

struct ath_chanctx

用途:用於處理 channel context 的結構,用來支援 wireless multi-channel operation,預設沒有啟用該功能

allocated 在drivers/net/wireless/ath/ath9k/pci.c#L950, hw = ieee80211_alloc_hw(sizeof(sturct ath_softc), &ath9k_ops);

初始化在:

嵌套於struct ath_softc -> struct ath_chanctx chatctx[ATH9K_NUM_CHANCTX]

struct ath_hw

用途:於 driver 中封裝 ieee80211_hw 的結構,同時 common 也封裝在其中

allocated 在drivers/net/wireless/ath/ath9k/init.c#L660, ah = devm_kzalloc(sc->dev, sizeof(struct ath_hw), GFP_KERNEL);

初始化在:drivers/net/wireless/ath/ath9k/init.c#L660

嵌套於struct ath_softc -> struct ath_hw *sc_ah

struct ath_common

用途:多用於 debug message 使用,偶爾會使用其中的一些參數。ath 系列共用結構。

allocated 在drivers/net/wireless/ath/ath9k/init.c#L660, ah = devm_kzalloc(sc->dev, sizeof(struct ath_hw), GFP_KERNEL);

初始化在drivers/net/wireless/ath/ath9k/init.c#L675

嵌套於struct ath_softc -> struct ath_hw *sc_ah -> struct ath_common common




如果你覺得這篇文章不錯,歡迎打賞 IOTA:RFHEIVXVIZWJFXTZORZZRCMHZF9PSGFUFWAAKXTFNZE9JQUY9HFQREJYYSPSXDRLECKXCAQQDOMSMYJYDKPCKWXBKD

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料