diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 11b2aef3be8f..534913dd19ba 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -1669,6 +1669,8 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev, qdf_status = qdf_event_create(&vdev->wait_delete_comp); /* add this vdev into the pdev's list */ TAILQ_INSERT_TAIL(&pdev->vdev_list, vdev, vdev_list_elem); + if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam()) + pdev->monitor_vdev = vdev; ol_txrx_dbg( "Created vdev %pK (%02x:%02x:%02x:%02x:%02x:%02x)\n", @@ -5144,6 +5146,23 @@ struct cdp_vdev *ol_txrx_get_vdev_from_vdev_id(uint8_t vdev_id) return (struct cdp_vdev *)vdev; } +/** + * ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev + * @ppdev: the physical device the virtual device belongs to + * + * Return: vdev handle + * NULL if not found. + */ +struct cdp_vdev *ol_txrx_get_mon_vdev_from_pdev(struct cdp_pdev *ppdev) +{ + struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; + + if (qdf_unlikely(!pdev)) + return NULL; + + return (struct cdp_vdev *)pdev->monitor_vdev; +} + /** * ol_txrx_set_wisa_mode() - set wisa mode * @vdev: vdev handle @@ -5480,6 +5499,7 @@ static struct cdp_cmn_ops ol_ops_cmn = { .txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr, .txrx_get_vdev_from_vdev_id = ol_txrx_wrapper_get_vdev_from_vdev_id, .txrx_get_ctrl_pdev_from_vdev = ol_txrx_get_ctrl_pdev_from_vdev, + .txrx_get_mon_vdev_from_pdev = ol_txrx_get_mon_vdev_from_pdev, .txrx_mgmt_send_ext = ol_txrx_mgmt_send_ext, .txrx_mgmt_tx_cb_set = ol_txrx_mgmt_tx_cb_set, .txrx_data_tx_cb_set = ol_txrx_data_tx_cb_set, diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h index 5cd6ef40d1a9..e98211a6ec8f 100644 --- a/core/dp/txrx/ol_txrx.h +++ b/core/dp/txrx/ol_txrx.h @@ -148,6 +148,15 @@ ol_txrx_dump_pkt(qdf_nbuf_t nbuf, uint32_t nbuf_paddr, int len); struct cdp_vdev *ol_txrx_get_vdev_from_vdev_id(uint8_t vdev_id); +/** + * ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev + * @ppdev: the physical device the virtual device belongs to + * + * Return: vdev handle + * NULL if not found. + */ +struct cdp_vdev *ol_txrx_get_mon_vdev_from_pdev(struct cdp_pdev *ppdev); + void *ol_txrx_find_peer_by_addr(struct cdp_pdev *pdev, uint8_t *peer_addr, uint8_t *peer_id); diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index b141f647f598..4bfe9c2b770d 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -650,6 +650,9 @@ struct ol_txrx_pdev_t { struct pktlog_dev_t *pl_dev; #endif /* #ifndef REMOVE_PKT_LOG */ + /* Monitor mode interface*/ + struct ol_txrx_vdev_t *monitor_vdev; + enum ol_sec_type sec_types[htt_num_sec_types]; /* standard frame type */ enum wlan_frm_fmt frame_format; diff --git a/core/hdd/src/wlan_hdd_rx_monitor.c b/core/hdd/src/wlan_hdd_rx_monitor.c index ff88f7accf26..cbc3acfe6757 100644 --- a/core/hdd/src/wlan_hdd_rx_monitor.c +++ b/core/hdd/src/wlan_hdd_rx_monitor.c @@ -121,11 +121,10 @@ int hdd_enable_monitor_mode(struct net_device *dev) { void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); - struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev); hdd_enter_dev(dev); return cdp_set_monitor_mode(soc, - (struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc, - (struct cdp_pdev *)pdev, adapter->session_id), false); + (struct cdp_vdev *)cdp_get_mon_vdev_from_pdev(soc, + (struct cdp_pdev *)pdev), false); } diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index a661344f9c2a..dc7450ddf582 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -2457,8 +2457,8 @@ int hdd_set_mon_rx_cb(struct net_device *dev) txrx_ops.rx.rx = hdd_mon_rx_packet_cbk; hdd_monitor_set_rx_monitor_cb(&txrx_ops, hdd_rx_monitor_callback); cdp_vdev_register(soc, - (struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc, - (struct cdp_pdev *)pdev, adapter->session_id), + (struct cdp_vdev *)cdp_get_mon_vdev_from_pdev(soc, + (struct cdp_pdev *)pdev), adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev, &txrx_ops); /* peer is created wma_vdev_attach->wma_create_peer */