ol_ath_soc_softc_t 创建流分析
ol_ath_soc_softc_t 创建流分析
__ol_ath_attach(void *hif_hdl, struct ol_attach_t *ol_cfg, osdev_t osdev, qdf_device_t qdf_dev)
{
// 注意这里在为net_device分配空间的时候会额外分配ol_ath_soc_softc_t大小
// 也就是 net_device 的私有数据是 ol_ath_soc_softc_t
struct net_device *dev = alloc_netdev(sizeof(struct ol_ath_soc_softc),ol_cfg->bus_type == BUS_TYPE_SIM ? "wifi-sim%d" : WIFI_DEV_NAME_SOC,
soc_netdev_setup);
// 正如上面所说,获取 net_device 的私有数据 即 ol_ath_soc_softc_t
ol_ath_soc_softc_t *soc = ath_netdev_priv(dev);
ol_if_offload_ops_attach(soc, target_type);
{
// 连接ops 这个ops实际就是wifi3.0.ko加载的时候 放到数组的即对应 wifi3_0_ops
/*
static struct ol_if_offload_ops wifi3_0_ops = {
.cdp_soc_attach = &ol_if_dp_soc_attach,
.cdp_soc_init = &ol_if_dp_soc_init,
.dbglog_attach = &diag_event_log_attach,
.dbglog_detach = &diag_event_log_detach,
.update_dp_stats = &ol_update_dp_stats,
};
*/
soc->ol_if_ops = ol_if_offload_ops_register[OL_WIFI_3_0];
}
soc->sc_osdev = osdev; // 这个是传进来的
soc->soc_attached = 0;
soc->sc_osdev->netdev = dev;
// 创建psoc
struct wlan_objmgr_psoc * psoc = wlan_objmgr_psoc_obj_create(ol_cfg->devid, WLAN_DEV_OL);
soc->psoc_obj = psoc;
// 得到tgt_psoc_info的句柄
tgt_psoc_info = wlan_psoc_get_tgt_if_handle(soc->psoc_obj);
//设置句柄内容
target_psoc_set_target_type(tgt_psoc_info, ol_cfg->target_type);
target_psoc_set_target_rev(tgt_psoc_info, ol_cfg->target_revision);
target_psoc_set_hif_hdl(tgt_psoc_info, hif_hdl);
target_psoc_set_feature_ptr(tgt_psoc_info, soc);
struct hif_softc *hif_scn = HIF_GET_SOFTC(hif_hdl);
target_psoc_set_device_mode(tgt_psoc_info, hif_get_conparam(hif_scn));
wlan_psoc_set_qdf_dev(psoc, qdf_dev);
soc->qdf_dev = qdf_dev;
qdf_dev->drv = osdev;
osdev->qdf_dev = soc->qdf_dev;
osdev->netdev = dev;
//下面是一些配置文件的解读和设置
ret = cfg_get_ini_file_name(target_type, &ini);
soc->vow_config = cfg_get(psoc, CFG_OL_VOW_CONFIG);
}
wlan_objmgr_psoc_obj_create 流程
struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
WLAN_DEV_TYPE dev_type)
{
//分配空间
struct wlan_objmgr_psoc *psoc = qdf_mem_malloc(sizeof(*psoc));
}