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驱动固件大小