1. 程式人生 > >(5)高通AP10.4開發者指南——WLAN(1.5 WLAN驅動模組化的一些其他修改)

(5)高通AP10.4開發者指南——WLAN(1.5 WLAN驅動模組化的一些其他修改)

1.5 WLAN驅動模組化的一些其他修改

從QCA_Networking_2016.SPF.4.0版本開始,OL和DA驅動相互獨立,並新建了一個UMAC模組,作為通用層,並獨立於OL和DA的模組。
因為DA驅動已經獨立於“UMAC+OL”驅動結構,所以將UMAC和OL模組劃分成兩個不同的模組是必須的。

  • 將所有的OL檔案都放到一個新模組(qca_ol)中。這個模組將獨立於UMAC模組。
  • 建立一個獨立的UMAC模組,獨立於OL和DA模組。

區分Offload相關的檔案
當前的UMAC模組包含通用層,以及Offload的函式和檔案。

當前的Offload檔案
所有的Offload檔案在WLAN驅動的原始碼中,都放在了“offload”目錄中,這些檔案在一起組成一個新的“qca_ol”模組。

Kernel PCI/AHB介面檔案
在獨立的DA設備註冊過程中使用的PCI和AHB初始化檔案,都作為UMAC模組的一部分,被移到了新的qca_ol模組中。

獨立的UMAC模組
設定一個獨立的UMAC模組的目的,是可以將Offload和Direct-Attach之間的共通部分做到一個模組中,這樣Offload和Direct-Attach模組就可以獨立的使用這部分共通程式碼。同時,這樣做也能減少驅動的image大小。
由於所有的offload檔案移到了qca_ol模組中,所以由UMAC直接呼叫的offload函式,將被歸結到下面內容中:

  • OL引數函式,從UMAC中呼叫
  • OL函式通過“ic”指標訪問OL層
  • 在UMAC中的,並且是OL相關的函式
  • 獨立於OL的函式,但當前處在OL層。
  • OL和DA模組使用到的UMAC函式
  • NSS (WiFi OL)模組化

從UMAC呼叫的OL引數函式

用很多OL函式由UMAC直接呼叫,用於配置OL驅動的引數。
作為獨立的UMAC,不能直接呼叫OL層的函式,而是回撥的辦法,來訪問OL或DA層。
ic_vap_get_param不能用時,可以新增這個函式功能。
對於“set”函式,將使用“ic_vap_set_param”。
其他一些類似的函式:

ol_txrx_clear_rawmode_pkt_sim_stats
ol_txrx_host_stats_get
ol_tx_rst_tso_stats
ol_txrx_print_rawmode_pkt_sim_stats
ol_ath_set_vap_cts2self_prot_dtim_bcn
ol_tx_rst_sg_stats
ol_tx_print_sg_stats
ol_rst_rx_cksum_stats
ol_tx_print_tso_stats
ol_txrx_host_msdu_ttl_stats
ol_txrx_debug
ol_txrx_fw_stats_get
ol_ath_ucfg_reset_peer_mumimo_tx_count
ol_txrx_aggr_cfg
ol_rate_is_valid_basic
ol_ath_net80211_get_vap_stats
ol_txrx_host_me_stats
ol_txrx_fw_stats_cfg
ol_txrx_host_stats_clr
ol_print_rx_cksum_stats

OL函式通過傳遞“ic”指標來訪問OL層

所有UMAC訪問OL或DA層使用的函式,都應當以回撥的方式完成,比如使用“ic”函式指標。
任何繞過這種策略訪問OL或DA層的函式,都會被判斷出來。所以要麼通過“ic”指標來訪問,或者乾脆將整個模組都移到OL層。
通過以下步驟完成通過“ic”指標訪問。

  1. 新增一個“struct ieee80211com”結構體的函式指標。
  2. 在OL裝置attach時,註冊到OL函式中 (初始化函式指標) 。
  3. 需要訪問OL曾是,呼叫這個函式指標。

比如:

ol_ll_pdev_tx_lock
ol_ll_pdev_tx_unlock
ol_txrx_osif_vdev_register
ol_tx_tso_sg_process_skb
ol_ath_ucfg_get_peer_mumimo_tx_count
ol_net80211_set_mu_whtlist

在UMAC中的,並且是OL相關的函式
許多到OL層資料通路相關的函式,都在osif_umac檔案中,這是UMAC模組的一部分。這些檔案都是OL裝置相關的,所以會被移到offload模組。
比如:

osif_ol_ll_vap_hardstart
osif_ol_hadstart_vap_vow_debug
osif_deliver_data_ol

獨立於OL的函式,但當前處在OL層
有一些函式是處在OL層的,但卻和OL層沒什麼關係,這些可以作為通用部分和UMAC模組的一部分。這些函式可以移到UMAC模組。
比如:

transcap_nwifi_to_8023
dscp_tid_map

OL和DA模組使用到的UMAC函式
因為UMAC在OL或DA模組之前啟動,所以OL或DA模組需要的函式,需要開放出來。
在開發的階段1,建立了一個新的umac_exports.c檔案,用於開發一些必要的函式。

NSS (WiFi OL)模組化
osif_nss檔案將會是“umac”模組的一部分,但是osif_nss_wifiol相關的檔案,將被移到“qca_ol”模組中,因為這些是OL晶片組相關的。
這樣就增加了一個限制,“umac”不能直接呼叫osif_nss_wifiol函式,因為“umac”模組將在“qca_ol”前啟動。
為了避免這樣的限制,osif_nss_ol_pdev_attach函式呼叫時,將會攜帶一個函式陣列指標,這個函式指標陣列將會初始化成相應的osif_nss_wifiol函式。
下面這個nss_wifi_offload_funcs結構體,用於就是含有相應函式指標的陣列。這個結構體在osif_nss_ol_pdev_attach函式中,會被傳遞到ic->nss_funcs。

struct nss_wifi_offload_funcs nss_wifi_funcs = {
    osif_nss_ol_store_other_pdev_stavap,
    osif_nss_vdev_me_reset_snooplist,
    osif_nss_vdev_me_update_member_list,
    osif_nss_ol_vap_xmit,
    osif_nss_vdev_me_update_hifitlb,
    osif_nss_vdev_me_dump_denylist,
    osif_nss_vdev_me_add_deny_member,
    osif_nss_ol_vdev_set_cfg,
    osif_nss_vdev_process_mpsta_tx,
    osif_nss_ol_wifi_monitor_set_filter,
    osif_nss_vdev_get_nss_id,
    osif_nss_vdev_process_extap_tx,
    osif_nss_vdev_me_dump_snooplist,
    osif_nss_ol_vap_delete,
    osif_nss_vdev_me_add_member_list,
    osif_nss_vdev_vow_dbg_cfg,
    osif_nss_ol_enable_dbdc_process,
    osif_nss_vdev_get_nss_wifiol_ctx,
    osif_nss_vdev_me_delete_grp_list,
    osif_nss_vdev_me_create_grp_list,
    osif_nss_vdev_me_delete_deny_list,
    osif_nss_vdev_me_remove_member_list
};

“qcawifi.sh”指令碼的變化
qcawifi.sh指令碼用於安裝WLAN驅動模組,傳遞模組引數,它也同樣需要修改去使用這種模組化。

UMAC和OL模組之間的模組引數劃分

所有的模組引數但前都被傳遞到了UMAC模組。因為qca_ol和qca_da模組分開的關係,qcawifi.sh指令碼也應該做相應的變化,根據當前的模組傳遞引數。
下面是一些傳遞到相應模組的模組引數。

模組引數 模組名字
enableuartprint qca_ol.ko
enable_tx_tcp_cksum qca_ol.ko
vow_config qca_ol.ko
max_descs qca_ol.ko
qwrap_enable qca_ol.ko
max_peers qca_ol.ko
max_vdevs qca_ol.ko
sa_validate_sw qca_ol.ko
dfs_disable qca_ol.ko
frac qca_ol.ko
intval qca_ol.ko
ar900b_20_targ_clk qca_ol.ko
qca9888_20_targ_clk qca_ol.ko
otp_mod_param qca_ol.ko
cfg_iphdr_pad qca_ol.ko
emu_type qca_ol.ko
enable_smart_antenna qca_ol.ko
max_active_peers qca_ol.ko
low_mem_system qca_ol.ko
nss_wifi_olcfg qca_ol.ko
nss_wifi_ol_skip_nw_process qca_ol.ko
ol_scan_chanlist qca_ol.ko
fw_code_sign qca_ol.ko
testmode qca_ol.ko
lteu_support qca_ol.ko
bmi qca_ol.ko
wari qca_ol.ko
war1_allow_sleep qca_ol.ko
allocram_track_max qca_ol.ko
max_clients qca_ol.ko
max_vaps qca_ol.ko
fw_dump_options qca_ol.ko
enable_mesh_support qca_ol.ko
wmi_ring_size qca_ol.ko
ahbskip umac.ko
enable_mesh_peer_cap_update umac.ko
wifiposenable umac.ko
atf_mode umac.ko
atf_msdu_desc umac.ko
atf_peers umac.ko
atf_max_vdevs umac.ko
enable_pktlog_support umac.ko

模組啟動順序

WLAN驅動模組需要按照下面的順序啟動,這取決於互相的依賴。

asf
adf
ath_dfs
ath_spectral
umac
ath_hal
ath_rate_ahteros
hst_tx99
ath_dev
qca_da
qca_ol (這個模組可以在umac之後啟動)

qca_ol模組將啟動OL裝置,qca_da模組將啟動DA裝置。他們之間互相獨立,裝置的啟動順序,將取決於誰先被檢測到。這也會決定radio的名字。

WLAN驅動韌體大小
OL和DA晶片組,都使用的平臺。
這裡寫圖片描述

只使用OL晶片組的平臺。
這裡寫圖片描述

只使用DA晶片組的平臺。
這裡寫圖片描述

圖 1-12 WLAN驅動韌體大小