(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”指標訪問。
- 新增一個“struct ieee80211com”結構體的函式指標。
- 在OL裝置attach時,註冊到OL函式中 (初始化函式指標) 。
- 需要訪問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驅動韌體大小