目录
高通wifi驱动手册:
https://download.csdn.net/download/yudelian/87959574?spm=1001.2014.3001.5501
一、wiphy的理解:
当pci设备发现的时候,cfg80211 dev (wiphy)就会在radio 设备创建的时候注册,每个radio对应一个wiphy (在高通驱动的6.4.2.1)
二、 pSOC的理解:
struct hdd_context {
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
}
在高通驱动手册的(2.6 Object manager)
pSoc Object
pSoc object is created per physical device, It is allocated for each device probe/connect. It stores all device level information/object/capabilities, it also stores the device level user configurations. This is the core object, it maintains the information about underlying radio architecture (offload/DA), and number of supported radios.
这个的定义在:
vendor/qcom/opensource/wlan/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h
struct wlan_objmgr_psoc {
struct wlan_objmgr_psoc_regulatory soc_reg;
struct wlan_objmgr_psoc_nif soc_nif;
struct wlan_objmgr_psoc_objmgr soc_objmgr;
struct wlan_soc_southbound_cb soc_cb;
struct wlan_soc_timer soc_timer;
struct wlan_concurrency_info soc_concurrency; /*TODO */
void *soc_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
WLAN_OBJ_STATE obj_state;
struct target_psoc_info *tgt_if_handle;
void *dp_handle;
qdf_spinlock_t psoc_lock;
};
vendor/qcom/opensource/wlan/qcacld-3.0/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c
enum pmo_suspend_mode
ucfg_pmo_get_suspend_mode(struct wlan_objmgr_psoc *psoc)
{
struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc);
return pmo_psoc_ctx->psoc_cfg.suspend_mode;
}
vendor/qcom/opensource/wlan/qcacld-3.0/components/pmo/core/inc/wlan_pmo_objmgr.h
static inline struct pmo_psoc_priv_obj *
pmo_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
{
struct pmo_psoc_priv_obj *psoc_priv;
psoc_priv = pmo_psoc_get_priv_nolock(psoc);
return psoc_priv;
}
#define pmo_psoc_get_priv_nolock(psoc) \
wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_PMO)
enum wlan_umac_comp_id {
WLAN_UMAC_COMP_MLME = 0,
WLAN_UMAC_COMP_SCAN = 3,
WLAN_UMAC_COMP_PMO = 4,
}
vendor/qcom/opensource/wlan/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h
vendor/qcom/opensource/wlan/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c
void *wlan_objmgr_psoc_get_comp_private_obj(struct wlan_objmgr_psoc *psoc,
enum wlan_umac_comp_id id)
{
void *comp_private_obj; ....
comp_private_obj = psoc->soc_comp_priv_obj[id];
return comp_private_obj;
}
qdf_export_symbol(wlan_objmgr_psoc_get_comp_private_obj);
追上面的代码,主要为了一个ucfg_pmo_get_suspend_mode这个函数,将struct wlan_objmgr_psoc * 传入进去后,实际上是为了 拿到wlan_objmgr_psoc的 soc_comp_priv_obj成员,这个成员是 pmo_psoc_priv_obj *类型,然后拿到
下面的psoc_cfg的suspend_mode
/**
* struct pmo_psoc_priv_obj - psoc related data require for pmo
*/
struct pmo_psoc_priv_obj {
struct pmo_psoc_cfg psoc_cfg;
};
/**
* @deauth_enable: true when wake up on deauth is enabled else false
* @disassoc_enable: true when wake up on disassoc is enabled else false
* @wow_enable: enable wow with majic pattern match or pattern byte match
* @power_save_mode: power save mode for psoc
* @suspend_mode: suspend mode for psoc
*/
struct pmo_psoc_cfg {
bool deauth_enable;
bool disassoc_enable;
enum pmo_suspend_mode suspend_mode;
}
suspend_mode的设置
有可能设置的地方,记录下:
vendor/qcom/opensource/wlan/qcacld-3.0/components/pmo/core/src/wlan_pmo_main.c
static void wlan_pmo_init_cfg(struct wlan_objmgr_psoc *psoc,
struct pmo_psoc_cfg *psoc_cfg) {
psoc_cfg->suspend_mode = cfg_get(psoc, CFG_PMO_SUSPEND_MODE);
}
wifi配置的地方:
在高通驱动文档里的3.8
代码里的配置文件:
Android系统高通平台WIFI配置_Just_Paranoid的博客-CSDN博客
./device/qcom/msm8909/WCNSS_qcom_cfg.ini
在系统里的配置文件,暂时还没找到
WCNSS_qcom_cfg.ini 文件在手机路径:
/vendor/etc/wifi/WCNSS_qcom_cfg.ini
WCNSS_qcom_cfg.ini WIFI配置文件解析_二十岁了还没有去过星巴克的博客-CSDN博客
手机中 WiFi MAC address 保存在以下手机路径中:
sys/class/net/wlan0/address
vendor/qcom/opensource/wlan/qcacld-3.0/core/hdd/inc/wlan_hdd_misc.h
有个这个,但感觉没啥用的样子,毕竟配置文件在/vendor/etc/wifi/WCNSS_qcom_cfg.ini
#define WLAN_INI_FILE "wlan/qca_cld/" PREFIX "WCNSS_qcom_cfg.ini"
三、电源管理(power manager)
Linux电源管理 Suspend_linux standby_ll是个笨蛋的博客-CSDN博客
1、wlan driver ops的电源管理
vendor/qcom/opensource/wlan/qcacld-3.0/core/hdd/src/wlan_hdd_driver_ops.c
struct pld_driver_ops wlan_drv_ops = {
.probe = wlan_hdd_pld_probe,
.remove = wlan_hdd_pld_remove,
.idle_shutdown = wlan_hdd_pld_idle_shutdown,
.idle_restart = wlan_hdd_pld_idle_restart,
.shutdown = wlan_hdd_pld_shutdown,
.crash_shutdown = wlan_hdd_pld_crash_shutdown,
.suspend = wlan_hdd_pld_suspend,
.resume = wlan_hdd_pld_resume,
.suspend_noirq = wlan_hdd_pld_suspend_noirq,
.resume_noirq = wlan_hdd_pld_resume_noirq,
.reset_resume = wlan_hdd_pld_reset_resume,
#ifdef FEATURE_RUNTIME_PM
.runtime_suspend = wlan_hdd_pld_runtime_suspend,
.runtime_resume = wlan_hdd_pld_runtime_resume,
#endif
};
int wlan_hdd_register_driver(void)
{
return pld_register_driver(&wlan_drv_ops);
}
hdd_driver_load
wlan_hdd_register_driver
// Register driver to kernel
// vendor/qcom/opensource/wlan/qcacld-3.0/core/pld/src/pld_common.c
int pld_register_driver(struct pld_driver_ops *ops)
{
int ret = 0;
struct pld_context *pld_context;
ret = pld_pcie_register_driver();
}
2、register_pm_notifier
在linux内核中的定义:
kernel/msm-5.4/kernel/power/main.c
kernel/msm-5.4/include/linux/suspend.h
wlan_hdd_pld_probe (在wlan_drv_ops 操作函数的.probe)
hdd_soc_probe(__hdd_soc_probe)
hdd_context_create
register_pm_notifier(&hdd_ctx->pm_notifier);