diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 228cfeb4e929..47f670523b30 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -18,7 +18,7 @@ #include #include -#include +#include "dp_htt.h" #define HTT_HTC_PKT_POOL_INIT_SIZE 64 @@ -288,7 +288,8 @@ int htt_srng_setup(void *htt_soc, int pdev_id, void *hal_srng, "%s: ring_type %d ring_id %d\n", __func__, hal_ring_type, srng_params.ring_id); QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "hp_addr 0x%x tp_addr 0x%x\n", hp_addr, tp_addr); + "hp_addr 0x%llx tp_addr 0x%llx\n", + (uint64_t)hp_addr, (uint64_t)tp_addr); QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "htt_ring_id %d\n", htt_ring_id); break; @@ -358,14 +359,13 @@ int htt_srng_setup(void *htt_soc, int pdev_id, void *hal_srng, HTT_SRING_SETUP_RING_SIZE_SET(*msg_word, (ring_entry_size * srng_params.num_entries)); if (htt_ring_type == HTT_SW_TO_HW_RING) - HTT_SRING_SETUP_RING_MISC_CFG_LOOPCOUNT_DISABLE_SET(*msg_word, - 1); - - HTT_SRING_SETUP_RING_MISC_CFG_MSI_SWAP_SET(*msg_word, + HTT_SRING_SETUP_RING_MISC_CFG_FLAG_LOOPCOUNT_DISABLE_SET( + *msg_word, 1); + HTT_SRING_SETUP_RING_MISC_CFG_FLAG_MSI_SWAP_SET(*msg_word, !!(srng_params.flags & HAL_SRNG_MSI_SWAP)); - HTT_SRING_SETUP_RING_MISC_CFG_TLV_SWAP_SET(*msg_word, + HTT_SRING_SETUP_RING_MISC_CFG_FLAG_TLV_SWAP_SET(*msg_word, !!(srng_params.flags & HAL_SRNG_DATA_TLV_SWAP)); - HTT_SRING_SETUP_RING_MISC_CFG_HOST_FW_SWAP_SET(*msg_word, + HTT_SRING_SETUP_RING_MISC_CFG_FLAG_HOST_FW_SWAP_SET(*msg_word, !!(srng_params.flags & HAL_SRNG_RING_PTR_SWAP)); /* word 4 */ diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index d28b910dadea..2b87ed432d50 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -61,5 +61,22 @@ extern void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer); extern void dp_peer_unref_delete(void *peer_handle); extern void dp_rx_discard(struct dp_vdev *vdev, struct dp_peer *peer, unsigned tid, qdf_nbuf_t msdu_list); - +extern void *dp_find_peer_by_addr(void *dev, + uint8_t *peer_mac_addr, uint8_t *peer_id); +QDF_STATUS dp_register_peer(void *pdev_handle, + struct ol_txrx_desc_type *sta_desc); +QDF_STATUS dp_clear_peer(void *pdev_handle, uint8_t local_id); +void *dp_find_peer_by_addr_and_vdev(void *pdev_handle, void *vdev, + uint8_t *peer_addr, uint8_t *local_id); +uint16_t dp_local_peer_id(void *peer); +void *dp_peer_find_by_local_id(void *pdev_handle, uint8_t local_id); +QDF_STATUS dp_peer_state_update(void *pdev_handle, uint8_t *peer_mac, + enum ol_txrx_peer_state state); +QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id); +void *dp_get_vdev_for_peer(void *peer); +uint8_t *dp_peer_get_peer_mac_addr(void *peer); +int dp_get_peer_state(void *peer_handle); +void dp_local_peer_id_pool_init(struct dp_pdev *pdev); +void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer); +void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer); #endif /* #ifndef _DP_INTERNAL_H_ */ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index bf3577c82ef5..16c416c481e4 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -27,7 +27,8 @@ #include "dp_types.h" #include "dp_internal.h" #include "dp_tx.h" -#include "wlan_cfg.h" +#include "dp_rx.h" +#include "../../wlan_cfg/wlan_cfg.h" /** * dp_setup_srng - Internal function to setup SRNG rings used by data path @@ -120,71 +121,6 @@ static void dp_srng_cleanup(struct dp_soc *soc, struct dp_srng *srng, /* TODO: Need this interface from HIF */ void *hif_get_hal_handle(void *hif_handle); -/* - * dp_soc_attach_wifi3() - Attach txrx SOC - * @osif_soc: Opaque SOC handle from OSIF/HDD - * @htc_handle: Opaque HTC handle - * @hif_handle: Opaque HIF handle - * @qdf_osdev: QDF device - * - * Return: DP SOC handle on success, NULL on failure - */ -void *dp_soc_attach_wifi3(void *osif_soc, void *hif_handle, - HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, - struct ol_if_ops *ol_ops) -{ - struct dp_soc *soc = qdf_mem_malloc(sizeof(*soc)); - - if (!soc) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: DP SOC memory allocation failed\n", __func__); - goto fail0; - } - - soc->osif_soc = osif_soc; - soc->osdev = qdf_osdev; - soc->ol_ops = ol_ops; - soc->hif_handle = hif_handle; - soc->hal_soc = hif_get_hal_handle(hif_handle); - soc->htt_handle = htt_soc_attach(soc, osif_soc, htc_handle, - soc->hal_soc, qdf_osdev); - if (soc->htt_handle == NULL) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: HTT attach failed\n", __func__); - goto fail1; - } - - soc->wlan_cfg_ctx = wlan_cfg_soc_attach(); - - if (!soc->wlan_cfg_ctx) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: wlan_cfg_soc_attach failed\n", __func__); - goto fail2; - } - - -#ifdef notyet - if (wdi_event_attach(soc)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: WDI event attach failed\n", __func__); - goto fail2; - } -#endif - - if (dp_soc_interrupt_attach(soc) != QDF_STATUS_SUCCESS) { - goto fail2; - } - - return (void *)soc; - -fail2: - htt_soc_detach(soc->htt_handle); -fail1: - qdf_mem_free(soc); -fail0: - return NULL; -} - /* * dp_service_srngs() - Top level interrupt handler for DP Ring interrupts * @dp_ctx: DP SOC handle @@ -209,6 +145,9 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) work_done = dp_tx_comp_handler(soc, ring, budget); budget -= work_done; + if (work_done) + DP_TRACE(INFO, "tx mask 0x%x ring %d, budget %d\n", + tx_mask, ring, budget); if (budget <= 0) goto budget_done; } @@ -221,10 +160,12 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) if (rx_mask & (1 << ring)) { work_done = dp_rx_process(soc, - soc->reo_dest_ring[ring].hal_srng, - budget); - + soc->reo_dest_ring[ring].hal_srng, + budget); budget -= work_done; + if (work_done) + DP_TRACE(INFO, "rx mask 0x%x ring %d, budget %d\n", + tx_mask, ring, budget); if (budget <= 0) goto budget_done; } @@ -317,6 +258,12 @@ QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc) for (i = 0; i < wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx); i++) { + int j = 0; + int ret = 0; + + /* Map of IRQ ids registered with one interrupt context */ + int irq_id_map[HIF_MAX_GRP_IRQ]; + int tx_mask = wlan_cfg_get_tx_ring_mask(soc->wlan_cfg_ctx, i); int rx_mask = @@ -331,12 +278,6 @@ QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc) num_irq = 0; - int j = 0; - int ret = 0; - - /* Map of IRQ ids registered with one interrupt context */ - int irq_id_map[HIF_MAX_GRP_IRQ]; - for (j = 0; j < HIF_MAX_GRP_IRQ; j++) { if (tx_mask & (1 << j)) { @@ -382,10 +323,13 @@ QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc) void dp_soc_interrupt_detach(void *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; + int i; - soc->intr_ctx[i].tx_ring_mask = 0; - soc->intr_ctx[i].rx_ring_mask = 0; - soc->intr_ctx[i].rx_mon_ring_mask = 0; + for (i = 0; i < wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx); i++) { + soc->intr_ctx[i].tx_ring_mask = 0; + soc->intr_ctx[i].rx_ring_mask = 0; + soc->intr_ctx[i].rx_mon_ring_mask = 0; + } } #endif @@ -631,8 +575,8 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc) soc->wbm_idle_scatter_buf_base_paddr, soc->wbm_idle_scatter_buf_base_vaddr, num_scatter_bufs, soc->wbm_idle_scatter_buf_size, - (uint32_t)(scatter_buf_ptr - (unsigned long)( - soc->wbm_idle_scatter_buf_base_vaddr[ + (uint32_t)(scatter_buf_ptr - + (uint8_t *)(soc->wbm_idle_scatter_buf_base_vaddr[ scatter_buf_num]))); } return 0; @@ -667,7 +611,7 @@ fail: /* * Free link descriptor pool that was setup HW */ -static void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc) +void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc) { int i; @@ -726,14 +670,6 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) if (soc->cmn_init_done) return 0; - soc->wlan_cfg_ctx = wlan_cfg_soc_attach(); - - if (!soc->wlan_cfg_ctx) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: wlan_cfg_soc_attach failed\n", __func__); - goto fail0; - } - if (dp_peer_find_attach(soc)) goto fail0; @@ -875,7 +811,7 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) goto fail1; } - + dp_soc_interrupt_attach(soc); /* Setup HW REO */ hal_reo_setup(soc->hal_soc); @@ -902,8 +838,8 @@ static void dp_pdev_detach_wifi3(void *txrx_pdev, int force); * * Return: DP PDEV handle on success, NULL on failure */ -void *dp_pdev_attach_wifi3(void *txrx_soc, void *ctrl_pdev, - HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, int pdev_id) +void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, + HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, uint8_t pdev_id) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; struct dp_pdev *pdev = qdf_mem_malloc(sizeof(*pdev)); @@ -1020,6 +956,15 @@ void *dp_pdev_attach_wifi3(void *txrx_soc, void *ctrl_pdev, goto fail1; } + /* Rx specific init */ + if (dp_rx_pdev_attach(pdev)) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: dp_rx_pdev_attach failed \n", __func__); + goto fail0; + } + + /* MCL */ + dp_local_peer_id_pool_init(pdev); return (void *)pdev; @@ -1050,6 +995,8 @@ static void dp_pdev_detach_wifi3(void *txrx_pdev, int force) WBM2SW_RELEASE, pdev->pdev_id); } + dp_rx_pdev_detach(pdev); + /* Setup per PDEV REO rings if configured */ if (wlan_cfg_per_pdev_rx_ring(soc->wlan_cfg_ctx)) { dp_srng_cleanup(soc, &soc->reo_dest_ring[pdev->pdev_id], @@ -1145,6 +1092,7 @@ void dp_soc_detach_wifi3(void *txrx_soc) dp_srng_cleanup(soc, &soc->reo_cmd_ring, REO_CMD, 0); dp_srng_cleanup(soc, &soc->reo_status_ring, REO_STATUS, 0); + qdf_spinlock_destroy(&soc->peer_ref_mutex); htt_soc_detach(soc->htt_handle); } @@ -1152,9 +1100,9 @@ void dp_soc_detach_wifi3(void *txrx_soc) * dp_soc_attach_target_wifi3() - SOC initialization in the target * @txrx_soc: Datapath SOC handle */ -int dp_soc_attach_target_wifi3(void *txrx_soc) +int dp_soc_attach_target_wifi3(struct cdp_soc_t *cdp_soc) { - struct dp_soc *soc = (struct dp_soc *)txrx_soc; + struct dp_soc *soc = (struct dp_soc *)cdp_soc; int i; htt_soc_attach_target(soc->htt_handle); @@ -1275,10 +1223,10 @@ void dp_vdev_register_wifi3(void *vdev_handle, void *osif_vdev, vdev->osif_proxy_arp = txrx_ops->proxy_arp; #endif #endif -#ifdef notyet /* TODO: Enable the following once Tx code is integrated */ txrx_ops->tx.tx = dp_tx_send; -#endif + + DP_TRACE(ERROR, "DP Vdev Register success"); } /* @@ -1371,6 +1319,7 @@ void *dp_peer_attach_wifi3(void *vdev_handle, uint8_t *peer_mac_addr) return NULL; /* failure */ qdf_mem_zero(peer, sizeof(struct dp_peer)); + qdf_spinlock_create(&peer->peer_info_lock); /* store provided params */ peer->vdev = vdev; @@ -1400,12 +1349,10 @@ void *dp_peer_attach_wifi3(void *vdev_handle, uint8_t *peer_mac_addr) /* TODO: See if hash based search is required */ dp_peer_find_hash_add(soc, peer); - if (soc->ol_ops->peer_set_default_routing) { - /* TODO: Check on the destination ring number to be passed - * to FW - */ - soc->ol_ops->peer_set_default_routing(soc->osif_soc, - peer->mac_addr.raw, peer->vdev->vdev_id, 0, 1); + if (soc->cdp_soc.ol_ops->peer_set_default_routing) { + /* TODO: Check on the destination ring number to be passed to FW */ + soc->cdp_soc.ol_ops->peer_set_default_routing(soc->osif_soc, peer->mac_addr.raw, + peer->vdev->vdev_id, 0, 1); } QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, @@ -1424,6 +1371,7 @@ void *dp_peer_attach_wifi3(void *vdev_handle, uint8_t *peer_mac_addr) vdev->vap_bss_peer = peer; } + dp_local_peer_id_alloc(pdev, peer); return (void *)peer; } @@ -1592,4 +1540,246 @@ void dp_peer_detach_wifi3(void *peer_handle) * reference, added by the PEER_MAP message. */ dp_peer_unref_delete(peer_handle); + dp_local_peer_id_free(peer->vdev->pdev, peer); + qdf_spinlock_destroy(&peer->peer_info_lock); +} + +/* + * dp_get_vdev_mac_addr_wifi3() – Detach txrx peer + * @peer_handle: Datapath peer handle + * + */ +uint8 *dp_get_vdev_mac_addr_wifi3(void *pvdev) +{ + struct dp_vdev *vdev = pvdev; + + return vdev->mac_addr.raw; +} + +/* + * dp_get_vdev_from_vdev_id_wifi3() – Detach txrx peer + * @peer_handle: Datapath peer handle + * + */ +void *dp_get_vdev_from_vdev_id_wifi3(void *dev, uint8_t vdev_id) +{ + struct dp_pdev *pdev = dev; + struct dp_vdev *vdev = NULL; + + if (qdf_unlikely(!pdev)) + return NULL; + + TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { + if (vdev->vdev_id == vdev_id) + break; + } + + return vdev; +} + +int dp_get_opmode(void *vdev_handle) +{ + struct dp_vdev *vdev = vdev_handle; + + return vdev->opmode; +} + +void *dp_get_ctrl_pdev_from_vdev_wifi3(void *pvdev) +{ + struct dp_vdev *vdev = pvdev; + struct dp_pdev *pdev = vdev->pdev; + + return (void *)pdev->wlan_cfg_ctx; +} + +static struct cdp_cmn_ops dp_ops_cmn = { + .txrx_soc_attach_target = dp_soc_attach_target_wifi3, + .txrx_vdev_attach = dp_vdev_attach_wifi3, + .txrx_vdev_detach = dp_vdev_detach_wifi3, + .txrx_pdev_attach = dp_pdev_attach_wifi3, + .txrx_pdev_detach = dp_pdev_detach_wifi3, + .txrx_peer_attach = dp_peer_attach_wifi3, + .txrx_peer_detach = dp_peer_detach_wifi3, + .txrx_vdev_register = dp_vdev_register_wifi3, + .txrx_soc_detach = dp_soc_detach_wifi3, + .txrx_get_vdev_mac_addr = dp_get_vdev_mac_addr_wifi3, + .txrx_get_vdev_from_vdev_id = dp_get_vdev_from_vdev_id_wifi3, + .txrx_get_ctrl_pdev_from_vdev = dp_get_ctrl_pdev_from_vdev_wifi3, + /* TODO: Add other functions */ +}; + +static struct cdp_ctrl_ops dp_ops_ctrl = { + .txrx_peer_authorize = dp_peer_authorize, + /* TODO: Add other functions */ +}; + +static struct cdp_me_ops dp_ops_me = { + /* TODO */ +}; + +static struct cdp_mon_ops dp_ops_mon = { + /* TODO */ +}; + +static struct cdp_host_stats_ops dp_ops_host_stats = { + /* TODO */ +}; + +static struct cdp_wds_ops dp_ops_wds = { + /* TODO */ +}; + +static struct cdp_raw_ops dp_ops_raw = { + /* TODO */ +}; + +#ifdef CONFIG_WIN +static struct cdp_pflow_ops dp_ops_pflow = { + /* TODO */ +}; +#endif /* CONFIG_WIN */ + +static struct cdp_misc_ops dp_ops_misc = { + .get_opmode = dp_get_opmode, +}; + +static struct cdp_flowctl_ops dp_ops_flowctl = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_lflowctl_ops dp_ops_l_flowctl = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_ipa_ops dp_ops_ipa = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_lro_ops dp_ops_lro = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_bus_ops dp_ops_bus = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_ocb_ops dp_ops_ocb = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + + +static struct cdp_throttle_ops dp_ops_throttle = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_mob_stats_ops dp_ops_mob_stats = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_cfg_ops dp_ops_cfg = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ +}; + +static struct cdp_peer_ops dp_ops_peer = { + .register_peer = dp_register_peer, + .clear_peer = dp_clear_peer, + .find_peer_by_addr = dp_find_peer_by_addr, + .find_peer_by_addr_and_vdev = dp_find_peer_by_addr_and_vdev, + .local_peer_id = dp_local_peer_id, + .peer_find_by_local_id = dp_peer_find_by_local_id, + .peer_state_update = dp_peer_state_update, + .get_vdevid = dp_get_vdevid, + .peer_get_peer_mac_addr = dp_peer_get_peer_mac_addr, + .get_vdev_for_peer = dp_get_vdev_for_peer, + .get_peer_state = dp_get_peer_state, +}; + +static struct cdp_ops dp_txrx_ops = { + .cmn_drv_ops = &dp_ops_cmn, + .ctrl_ops = &dp_ops_ctrl, + .me_ops = &dp_ops_me, + .mon_ops = &dp_ops_mon, + .host_stats_ops = &dp_ops_host_stats, + .wds_ops = &dp_ops_wds, + .raw_ops = &dp_ops_raw, +#ifdef CONFIG_WIN + .pflow_ops = &dp_ops_pflow, +#endif /* CONFIG_WIN */ + .misc_ops = &dp_ops_misc, + .cfg_ops = &dp_ops_cfg, + .flowctl_ops = &dp_ops_flowctl, + .l_flowctl_ops = &dp_ops_l_flowctl, + .ipa_ops = &dp_ops_ipa, + .lro_ops = &dp_ops_lro, + .bus_ops = &dp_ops_bus, + .ocb_ops = &dp_ops_ocb, + .peer_ops = &dp_ops_peer, + .throttle_ops = &dp_ops_throttle, + .mob_stats_ops = &dp_ops_mob_stats, +}; + +/* + * dp_soc_attach_wifi3() - Attach txrx SOC + * @osif_soc: Opaque SOC handle from OSIF/HDD + * @htc_handle: Opaque HTC handle + * @hif_handle: Opaque HIF handle + * @qdf_osdev: QDF device + * + * Return: DP SOC handle on success, NULL on failure + */ +void *dp_soc_attach_wifi3(void *osif_soc, void *hif_handle, + HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, + struct ol_if_ops *ol_ops) +{ + struct dp_soc *soc = qdf_mem_malloc(sizeof(*soc)); + + if (!soc) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: DP SOC memory allocation failed\n", __func__); + goto fail0; + } + + soc->cdp_soc.ops = &dp_txrx_ops; + soc->cdp_soc.ol_ops = ol_ops; + soc->osif_soc = osif_soc; + soc->osdev = qdf_osdev; + soc->hif_handle = hif_handle; + + soc->hal_soc = hif_get_hal_handle(hif_handle); + soc->htt_handle = htt_soc_attach(soc, osif_soc, htc_handle, + soc->hal_soc, qdf_osdev); + if (soc->htt_handle == NULL) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: HTT attach failed\n", __func__); + goto fail1; + } + + soc->wlan_cfg_ctx = wlan_cfg_soc_attach(); + if (!soc->wlan_cfg_ctx) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: wlan_cfg_soc_attach failed\n", __func__); + goto fail2; + } + qdf_spinlock_create(&soc->peer_ref_mutex); + +#ifdef notyet + if (wdi_event_attach(soc)) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: WDI event attach failed\n", __func__); + goto fail2; + } +#endif + + if (dp_soc_interrupt_attach(soc) != QDF_STATUS_SUCCESS) { + goto fail2; + } + + return (void *)soc; + +fail2: + htt_soc_detach(soc->htt_handle); +fail1: + qdf_mem_free(soc); +fail0: + return NULL; } diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 385b7a103743..1b7ecd1d974f 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -414,6 +414,31 @@ dp_peer_find_detach(struct dp_soc *soc) dp_peer_find_hash_detach(soc); } +/* + * dp_find_peer_by_addr - find peer instance by mac address + * @dev: physical device instance + * @peer_mac_addr: peer mac address + * @local_id: local id for the peer + * + * Return: peer instance pointer + */ +void *dp_find_peer_by_addr(void *dev, uint8_t *peer_mac_addr, + uint8_t *local_id) +{ + struct dp_pdev *pdev = dev; + struct dp_peer *peer; + + /* WAR, VDEV ID? TEMP 0 */ + peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0); + if (!peer) + return NULL; + + /* Multiple peer ids? How can know peer id? */ + *local_id = peer->local_id; + DP_TRACE(INFO, "%s: peer %p id %d", __func__, peer, *local_id); + return peer; +} + /* * dp_rx_tid_update_wifi3() – Update receive TID state * @peer: Datapath peer handle @@ -549,8 +574,8 @@ int dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid, hal_reo_qdesc_setup(soc->hal_soc, tid, ba_window_size, start_seq, hw_qdesc_vaddr, rx_tid->hw_qdesc_paddr, hal_pn_type); - if (soc->ol_ops->peer_rx_reorder_queue_setup) { - soc->ol_ops->peer_rx_reorder_queue_setup(soc->osif_soc, + if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) { + soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup(soc->osif_soc, peer->vdev->vdev_id, peer->mac_addr.raw, rx_tid->hw_qdesc_paddr, tid, tid); } @@ -560,7 +585,7 @@ int dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid, /* * Rx TID deletion callback to free memory allocated for HW queue descriptor */ -static void dp_rx_tid_delete_cb(struct dp_pdev *pdev, void *cb_ctxt, int status) +void dp_rx_tid_delete_cb(struct dp_pdev *pdev, void *cb_ctxt, int status) { struct dp_soc *soc = pdev->soc; struct dp_rx_tid *rx_tid = (struct dp_rx_tid *)cb_ctxt; @@ -692,7 +717,7 @@ int dp_addba_requestprocess_wifi3(void *peer_handle, uint8_t dialogtoken, rx_tid->ba_win_size = baparamset->buffersize; rx_tid->dialogtoken = dialogtoken; - rx_tid->statuscode = IEEE80211_STATUS_SUCCESS; + rx_tid->statuscode = QDF_STATUS_SUCCESS; rx_tid->ba_status = DP_RX_BA_ACTIVE; return 0; @@ -737,7 +762,7 @@ int dp_delba_process_wifi3(void *peer_handle, struct ieee80211_delba_parameterset *delbaparamset, uint16_t reasoncode) { struct dp_peer *peer = (struct dp_peer *)peer_handle; - uint16_t tid = delbaparamset->tid; + uint16_t tid = (uint16_t)delbaparamset->tid; struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; if (rx_tid->ba_status != DP_RX_BA_ACTIVE) @@ -799,7 +824,7 @@ dp_rx_sec_ind_handler(void *soc_handle, uint16_t peer_id, sec_type); sec_index = is_unicast ? dp_sec_ucast : dp_sec_mcast; peer->security[sec_index].sec_type = sec_type; -#if notyet /* TODO: See if this is required for defrag support */ +#ifdef notyet /* TODO: See if this is required for defrag support */ /* michael key only valid for TKIP, but for simplicity, * copy it anyway */ @@ -839,3 +864,305 @@ dp_rx_sec_ind_handler(void *soc_handle, uint16_t peer_id, */ } +/** + * dp_register_peer() - Register peer into physical device + * @pdev - data path device instance + * @sta_desc - peer description + * + * Register peer into physical device + * + * Return: QDF_STATUS_SUCCESS registration success + * QDF_STATUS_E_FAULT peer not found + */ +QDF_STATUS dp_register_peer(void *pdev_handle, + struct ol_txrx_desc_type *sta_desc) +{ + struct dp_peer *peer; + struct dp_pdev *pdev = pdev_handle; + + peer = dp_peer_find_by_local_id(pdev, sta_desc->sta_id); + if (!peer) + return QDF_STATUS_E_FAULT; + + qdf_spin_lock_bh(&peer->peer_info_lock); + peer->state = OL_TXRX_PEER_STATE_CONN; + qdf_spin_unlock_bh(&peer->peer_info_lock); + + return QDF_STATUS_SUCCESS; +} + +/** + * dp_clear_peer() - remove peer from physical device + * @pdev - data path device instance + * @sta_id - local peer id + * + * remove peer from physical device + * + * Return: QDF_STATUS_SUCCESS registration success + * QDF_STATUS_E_FAULT peer not found + */ +QDF_STATUS dp_clear_peer(void *pdev_handle, uint8_t local_id) +{ + struct dp_peer *peer; + struct dp_pdev *pdev = pdev_handle; + + peer = dp_peer_find_by_local_id(pdev, local_id); + if (!peer) + return QDF_STATUS_E_FAULT; + + qdf_spin_lock_bh(&peer->peer_info_lock); + peer->state = OL_TXRX_PEER_STATE_DISC; + qdf_spin_unlock_bh(&peer->peer_info_lock); + + return QDF_STATUS_SUCCESS; +} + +/** + * dp_find_peer_by_addr_and_vdev() - Find peer by peer mac address within vdev + * @pdev - data path device instance + * @vdev - virtual interface instance + * @peer_addr - peer mac address + * @peer_id - local peer id with target mac address + * + * Find peer by peer mac address within vdev + * + * Return: peer instance void pointer + * NULL cannot find target peer + */ +void *dp_find_peer_by_addr_and_vdev(void *pdev_handle, void *vdev, + uint8_t *peer_addr, uint8_t *local_id) +{ + struct dp_pdev *pdev = pdev_handle; + struct dp_peer *peer; + + DP_TRACE(INFO, "vdev %p peer_addr %p", vdev, peer_addr); + peer = dp_peer_find_hash_find(pdev->soc, peer_addr, 0); + DP_TRACE(INFO, "peer %p vdev %p", peer, vdev); + + if (!peer) + return NULL; + + if (peer->vdev != vdev) + return NULL; + + *local_id = peer->local_id; + + DP_TRACE(INFO, "peer %p vdev %p lcoal id %d", + peer, vdev, *local_id); + + return peer; +} + +/** + * dp_local_peer_id() - Find local peer id within peer instance + * @peer - peer instance + * + * Find local peer id within peer instance + * + * Return: local peer id + */ +uint16_t dp_local_peer_id(void *peer) +{ + return ((struct dp_peer *)peer)->local_id; +} + +/** + * dp_peer_find_by_local_id() - Find peer by local peer id + * @pdev - data path device instance + * @local_peer_id - local peer id want to find + * + * Find peer by local peer id within physical device + * + * Return: peer instance void pointer + * NULL cannot find target peer + */ +void *dp_peer_find_by_local_id(void *pdev_handle, uint8_t local_id) +{ + struct dp_peer *peer; + struct dp_pdev *pdev = pdev_handle; + + qdf_spin_lock_bh(&pdev->local_peer_ids.lock); + peer = pdev->local_peer_ids.map[local_id]; + qdf_spin_unlock_bh(&pdev->local_peer_ids.lock); + DP_TRACE(INFO, "peer %p lcoal id %d", + peer, local_id); + return peer; +} + +/** + * dp_peer_state_update() - update peer local state + * @pdev - data path device instance + * @peer_addr - peer mac address + * @state - new peer local state + * + * update peer local state + * + * Return: QDF_STATUS_SUCCESS registration success + */ +QDF_STATUS dp_peer_state_update(void *pdev_handle, uint8_t *peer_mac, + enum ol_txrx_peer_state state) +{ + struct dp_peer *peer; + struct dp_pdev *pdev = pdev_handle; + + peer = dp_peer_find_hash_find(pdev->soc, peer_mac, 0); + peer->state = state; + DP_TRACE(INFO, "peer %p state %d", + peer, peer->state); + return QDF_STATUS_SUCCESS; +} + +/** + * dp_get_vdevid() - Get virtaul interface id which peer registered + * @peer - peer instance + * @vdev_id - virtaul interface id which peer registered + * + * Get virtaul interface id which peer registered + * + * Return: QDF_STATUS_SUCCESS registration success + */ +QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id) +{ + struct dp_peer *peer = peer_handle; + + DP_TRACE(INFO, "peer %p vdev %p vdev id %d", + peer, peer->vdev, peer->vdev->vdev_id); + *vdev_id = peer->vdev->vdev_id; + return QDF_STATUS_SUCCESS; +} + +/** + * dp_get_vdev_for_peer() - Get virtual interface instance which peer belongs + * @peer - peer instance + * + * Get virtual interface instance which peer belongs + * + * Return: virtual interface instance pointer + * NULL in case cannot find + */ +void *dp_get_vdev_for_peer(void *peer_handle) +{ + struct dp_peer *peer = peer_handle; + + DP_TRACE(INFO, "peer %p vdev %p", peer, peer->vdev); + return (void *)peer->vdev; +} + +/** + * dp_peer_get_peer_mac_addr() - Get peer mac address + * @peer - peer instance + * + * Get peer mac address + * + * Return: peer mac address pointer + * NULL in case cannot find + */ +uint8_t *dp_peer_get_peer_mac_addr(void *peer_handle) +{ + struct dp_peer *peer = peer_handle; + uint8_t *mac; + + mac = peer->mac_addr.raw; + DP_TRACE(INFO, "peer %p mac 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", + peer, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return peer->mac_addr.raw; +} + +/** + * dp_get_peer_state() - Get local peer state + * @peer - peer instance + * + * Get local peer state + * + * Return: peer status + */ +int dp_get_peer_state(void *peer_handle) +{ + struct dp_peer *peer = peer_handle; + + DP_TRACE(INFO, "peer %p stats %d", peer, peer->state); + return peer->state; +} + +/** + * dp_local_peer_id_pool_init() - local peer id pool alloc for physical device + * @pdev - data path device instance + * + * local peer id pool alloc for physical device + * + * Return: none + */ +void dp_local_peer_id_pool_init(struct dp_pdev *pdev) +{ + int i; + + /* point the freelist to the first ID */ + pdev->local_peer_ids.freelist = 0; + + /* link each ID to the next one */ + for (i = 0; i < OL_TXRX_NUM_LOCAL_PEER_IDS; i++) { + pdev->local_peer_ids.pool[i] = i + 1; + pdev->local_peer_ids.map[i] = NULL; + } + + /* link the last ID to itself, to mark the end of the list */ + i = OL_TXRX_NUM_LOCAL_PEER_IDS; + pdev->local_peer_ids.pool[i] = i; + + qdf_spinlock_create(&pdev->local_peer_ids.lock); + DP_TRACE(INFO, "Peer pool init"); +} + +/** + * dp_local_peer_id_alloc() - allocate local peer id + * @pdev - data path device instance + * @peer - new peer instance + * + * allocate local peer id + * + * Return: none + */ +void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer) +{ + int i; + + qdf_spin_lock_bh(&pdev->local_peer_ids.lock); + i = pdev->local_peer_ids.freelist; + if (pdev->local_peer_ids.pool[i] == i) { + /* the list is empty, except for the list-end marker */ + peer->local_id = OL_TXRX_INVALID_LOCAL_PEER_ID; + } else { + /* take the head ID and advance the freelist */ + peer->local_id = i; + pdev->local_peer_ids.freelist = pdev->local_peer_ids.pool[i]; + pdev->local_peer_ids.map[i] = peer; + } + qdf_spin_unlock_bh(&pdev->local_peer_ids.lock); + DP_TRACE(INFO, "peer %p, local id %d", peer, peer->local_id); +} + +/** + * dp_local_peer_id_free() - remove local peer id + * @pdev - data path device instance + * @peer - peer instance should be removed + * + * remove local peer id + * + * Return: none + */ +void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer) +{ + int i = peer->local_id; + if ((i == OL_TXRX_INVALID_LOCAL_PEER_ID) || + (i >= OL_TXRX_NUM_LOCAL_PEER_IDS)) { + return; + } + + /* put this ID on the head of the freelist */ + qdf_spin_lock_bh(&pdev->local_peer_ids.lock); + pdev->local_peer_ids.pool[i] = pdev->local_peer_ids.freelist; + pdev->local_peer_ids.freelist = i; + pdev->local_peer_ids.map[i] = NULL; + qdf_spin_unlock_bh(&pdev->local_peer_ids.lock); +} + diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index b84746ed917c..29db47ee060e 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -252,7 +252,7 @@ dp_rx_link_desc_return(struct dp_soc *soc, void *ring_desc) */ QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s %d : " - "HAL RING Access For WBM Release SRNG Failed -- %lu\n", + "HAL RING Access For WBM Release SRNG Failed -- %p\n", __func__, __LINE__, wbm_rel_srng); goto done; } @@ -316,7 +316,7 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) * Ring Type / Ring Id combo */ QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING Access Failed -- %lu\n", + "%s %d : HAL RING Access Failed -- %p\n", __func__, __LINE__, hal_ring); goto done; } @@ -433,7 +433,7 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) * Ring Type / Ring Id combo */ QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING Access Failed -- %lu\n", + "%s %d : HAL RING Access Failed -- %p\n", __func__, __LINE__, hal_ring); goto done; } diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 73aa34f8bbf9..7df0183456e7 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -23,7 +23,7 @@ #include "hal_tx.h" #include "qdf_mem.h" #include "qdf_nbuf.h" -#include "wlan_cfg.h" +#include "../../wlan_cfg/wlan_cfg.h" #ifdef TX_CORE_ALIGNED_SEND #define DP_TX_GET_DESC_POOL_ID(vdev) qdf_get_cpu() @@ -312,7 +312,7 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev, * descriptor.For the direct buffer pointer case, HW requirement is that * descriptor should always point to a 8-byte aligned address. */ - align_pad = ((uint32_t) (qdf_nbuf_data(nbuf)) & 0x7); + align_pad = (uint8_t)((uintptr_t) (qdf_nbuf_data(nbuf)) & 0x7); tx_desc->pkt_offset = align_pad; /* @@ -493,8 +493,8 @@ QDF_STATUS dp_tx_hw_enqueue(struct dp_soc *soc, struct dp_vdev *vdev, hal_tx_desc_set_encap_type(hal_tx_desc_cached, tx_desc->tx_encap_type); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, - "%s length:%d , type = %d, dma_addr %p, offset %d\n", - __func__, length, type, dma_addr, tx_desc->pkt_offset); + "%s length:%d , type = %d, dma_addr %llx, offset %d\n", + __func__, length, type, (uint64_t)dma_addr, tx_desc->pkt_offset); if (tx_desc->flags & DP_TX_DESC_FLAG_TO_FW) hal_tx_desc_set_to_fw(hal_tx_desc_cached, 1); @@ -585,7 +585,7 @@ qdf_nbuf_t dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf, if (qdf_unlikely(hal_srng_access_start(soc->hal_soc, hal_srng))) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING Access Failed -- %lu\n", + "%s %d : HAL RING Access Failed -- %p\n", __func__, __LINE__, hal_srng); goto fail_return; } @@ -635,7 +635,7 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf, if (qdf_unlikely(hal_srng_access_start(soc->hal_soc, hal_srng))) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING Access Failed -- %lu\n", + "%s %d : HAL RING Access Failed -- %p\n", __func__, __LINE__, hal_srng); return nbuf; } @@ -1113,7 +1113,7 @@ uint32_t dp_tx_comp_handler(struct dp_soc *soc, uint32_t ring_id, if (qdf_unlikely(hal_srng_access_start(soc->hal_soc, hal_srng))) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING Access Failed -- %lu\n", + "%s %d : HAL RING Access Failed -- %p\n", __func__, __LINE__, hal_srng); return 0; } @@ -1330,8 +1330,8 @@ QDF_STATUS dp_tx_pdev_detach(struct dp_pdev *pdev) QDF_STATUS dp_tx_soc_detach(struct dp_soc *soc) { uint8_t num_pool; - uint8_t num_desc; - uint8_t num_ext_desc; + uint16_t num_desc; + uint16_t num_ext_desc; uint8_t i; num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); @@ -1361,7 +1361,7 @@ QDF_STATUS dp_tx_soc_detach(struct dp_soc *soc) } QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, - "%s MSDU Ext Desc Pool Free descs = %d\n", + "%s MSDU Ext Desc Pool %d Free descs = %d\n", __func__, num_pool, num_ext_desc); return QDF_STATUS_SUCCESS; @@ -1414,7 +1414,7 @@ QDF_STATUS dp_tx_soc_attach(struct dp_soc *soc) } QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, - "%s MSDU Ext Desc Alloc , descs = %d\n", + "%s MSDU Ext Desc Alloc %d, descs = %d\n", __func__, num_pool, num_ext_desc); /* Initialize descriptors in TCL Rings */ diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 00c7176eb38c..50dd7676e892 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -20,7 +20,7 @@ #include #include -#include +#include "dp_types.h" #define DP_STATS_ADD(x, y, z) #define DP_STATS_SUB(x, y, z) diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 957af65e687f..f695dace3219 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -42,8 +42,6 @@ #define DP_MAX_IRQ_PER_CONTEXT 12 #define DP_MAX_INTERRUPT_CONTEXTS 8 -#define MAX_TCL_DATA_RINGS 3 -#define MAX_TXDESC_POOLS 3 #define MAX_TX_HW_QUEUES 3 #define DP_MAX_INTERRUPT_CONTEXTS 8 @@ -73,6 +71,9 @@ union dp_rx_desc_list_elem_t; (_a)[5] == 0xff) +#define DP_TRACE(LVL, fmt, args ...) \ + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_##LVL, \ + "%s:%d: "fmt, __func__, __LINE__, ## args) /** * enum dp_tx_frm_type * @dp_tx_frm_std: Regular frame, no added header fragments @@ -228,19 +229,6 @@ struct dp_rx_tid { uint16_t statuscode; }; -struct ol_if_ops { - void (*peer_set_default_routing)(void *scn_handle, - uint8_t *peer_macaddr, uint8_t vdev_id, bool hash_based, - uint8_t ring_num); - int (*peer_rx_reorder_queue_setup)(void *ol_soc_handle, - uint8_t vdev_id, uint8_t *peer_mac, qdf_dma_addr_t hw_qdesc, - int tid, uint16_t queue_num); - int (*peer_rx_reorder_queue_remove)(void *ol_soc_handle, - uint8_t vdev_id, uint8_t *peer_macaddr, uint32_t tid_mask); - /* TODO: Add any other control path calls required to OL_IF/WMA layer */ -}; - - /* per interrupt context */ struct dp_intr { uint8_t tx_ring_mask; /* WBM Tx completion rings (0-2) @@ -255,11 +243,7 @@ struct dp_intr { /* SOC level structure for data path */ struct dp_soc { /* Common base structure - Should be the first member */ -#ifdef notyet /* TODO: dp_soc_cmn should be defined in cmn headers */ - struct dp_soc_cmn soc_cmn; -#endif - /* Callbacks to OL_IF layer */ - struct ol_if_ops *ol_ops; + struct cdp_soc_t cdp_soc; /* SoC/softc handle from OSIF layer */ void *osif_soc; @@ -319,6 +303,9 @@ struct dp_soc { union dp_rx_desc_list_elem_t *freelist; } rx_desc[MAX_RXDESC_POOLS]; + /* DP rx desc lock */ + DP_MUTEX_TYPE rx_desc_mutex[MAX_RXDESC_POOLS]; + /* HAL SOC handle */ void *hal_soc; @@ -512,6 +499,14 @@ struct dp_pdev { uint32_t num_tx_outstanding; uint32_t num_tx_exception; + + /* MCL specific local peer handle */ + struct { + uint8_t pool[OL_TXRX_NUM_LOCAL_PEER_IDS + 1]; + uint8_t freelist; + qdf_spinlock_t lock; + struct dp_peer *map[OL_TXRX_NUM_LOCAL_PEER_IDS]; + } local_peer_ids; /* TBD */ }; @@ -586,7 +581,7 @@ struct dp_vdev { /* rx filter related */ uint32_t drop_unenc; -#if notyet +#ifdef notyet privacy_exemption privacy_filters[MAX_PRIVACY_FILTERS]; uint32_t filters_num; #endif @@ -661,7 +656,7 @@ struct dp_peer { struct { enum htt_sec_type sec_type; -#if notyet /* TODO: See if this is required for defrag support */ +#ifdef notyet /* TODO: See if this is required for defrag support */ u_int32_t michael_key[2]; /* relevant for TKIP */ #endif } security[2]; /* 0 -> multicast, 1 -> unicast */ @@ -685,6 +680,10 @@ struct dp_peer { bss_peer:1, wapi:1; + /* MCL specific peer local id */ + uint16_t local_id; + enum ol_txrx_peer_state state; + qdf_spinlock_t peer_info_lock; /* TBD */ }; diff --git a/dp/wifi3.0/hal_rx.h b/dp/wifi3.0/hal_rx.h index 5e6f3dbbfb12..76bf2c9c122b 100644 --- a/dp/wifi3.0/hal_rx.h +++ b/dp/wifi3.0/hal_rx.h @@ -19,18 +19,7 @@ #ifndef _HAL_RX_H_ #define _HAL_RX_H_ -#include "reo_destination_ring.h" -#include "wbm_release_ring.h" -#include "rx_msdu_desc_info.h" - -#include "rx_mpdu_start.h" -#include "rx_mpdu_end.h" -#include "rx_msdu_start.h" -#include "rx_msdu_end.h" -#include "rx_attention.h" - -#include - +#include /** * enum hal_reo_error_code: Enum which encapsulates "reo_push_reason" diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index b968ab184178..6f517e8668c6 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -33,6 +33,9 @@ #include "qdf_types.h" #include "hal_internal.h" #include "hif_io32.h" +#include "rx_msdu_link.h" +#include "rx_reo_queue.h" +#include "rx_reo_queue_ext.h" /** * hal_attach - Initalize HAL layer diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index bfd2eedb829c..b3cb5a0e6133 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -32,12 +32,33 @@ #include "qdf_types.h" #include "qdf_lock.h" -#include "hw/reg_header/wcss/wcss_seq_hwiobase.h" -#include "hw/reg_header/wcss/wcss_seq_hwioreg.h" -#include "hw/data/common/sw_xml_headers.h" -#include "hw/data/datastruct/reo_destination_ring.h" -#include "hw/data/tlv_32/tcl_data_cmd.h" -#include "hw/data/common/tlv_hdr.h" +#include "qdf_mem.h" +#include "wcss_seq_hwiobase.h" +#include "tlv_hdr.h" +#include "tlv_tag_def.h" +#include "reo_destination_ring.h" +#include "reo_reg_seq_hwioreg.h" +#include "reo_entrance_ring.h" +#include "reo_get_queue_stats.h" +#include "reo_get_queue_stats_status.h" +#include "tcl_data_cmd.h" +#include "tcl_gse_cmd.h" +#include "tcl_status_ring.h" +#include "mac_tcl_reg_seq_hwioreg.h" +#include "ce_src_desc.h" +#include "ce_stat_desc.h" +#include "wfss_ce_reg_seq_hwioreg.h" +#include "wbm_link_descriptor_ring.h" +#include "wbm_reg_seq_hwioreg.h" +#include "wbm_buffer_ring.h" +#include "wbm_release_ring.h" +#include "rx_msdu_desc_info.h" +#include "rx_mpdu_start.h" +#include "rx_mpdu_end.h" +#include "rx_msdu_start.h" +#include "rx_msdu_end.h" +#include "rx_attention.h" +#include "tx_msdu_extension.h" /* TBD: This should be movded to shared HW header file */ enum hal_srng_ring_id { diff --git a/hal/wifi3.0/hal_rx.c b/hal/wifi3.0/hal_rx.c index b57bd5f1c9bf..d0416db00ef5 100644 --- a/hal/wifi3.0/hal_rx.c +++ b/hal/wifi3.0/hal_rx.c @@ -16,10 +16,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#include "wcss_seq_hwiobase.h" -#include "wcss_seq_hwioreg.h" -#include "sw_xml_headers.h" -#include "tlv_hdr.h" #include "hal_api.h" /* TODO: See if the following definition is available in HW headers */ diff --git a/hal/wifi3.0/hal_srng.c b/hal/wifi3.0/hal_srng.c index 26df90d429d5..0e38ba086e05 100644 --- a/hal/wifi3.0/hal_srng.c +++ b/hal/wifi3.0/hal_srng.c @@ -27,12 +27,6 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "hw/reg_header/wcss/wcss_seq_hwiobase.h" -#include "hw/reg_header/wcss/wcss_seq_hwioreg.h" -#include "hw/data/common/sw_xml_headers.h" -#include "hw/data/datastruct/reo_destination_ring.h" -#include "hw/data/tlv_32/tcl_data_cmd.h" -#include "hw/data/common/tlv_hdr.h" #include "hal_api.h" /** diff --git a/hal/wifi3.0/hal_tx.h b/hal/wifi3.0/hal_tx.h index 28a720fe1a5b..b48251af85d6 100644 --- a/hal/wifi3.0/hal_tx.h +++ b/hal/wifi3.0/hal_tx.h @@ -23,12 +23,6 @@ Include files ---------------------------------------------------------------------------*/ #include "hal_api.h" -#include -#include -#include "qdf_mem.h" -#include "hw/data/datastruct/wbm_release_ring.h" -#include "hw/data/tlv_32/tcl_data_cmd.h" -#include "hw/data/datastruct/tx_msdu_extension.h" /*--------------------------------------------------------------------------- Preprocessor definitions and constants diff --git a/hal/wifi3.0/hal_wbm.c b/hal/wifi3.0/hal_wbm.c index 69ed505712d3..8ef809897842 100644 --- a/hal/wifi3.0/hal_wbm.c +++ b/hal/wifi3.0/hal_wbm.c @@ -16,12 +16,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#include "wcss_seq_hwiobase.h" -#include "wcss_seq_hwioreg.h" -#include "sw_xml_headers.h" -#include "reo_destination_ring.h" -#include "tcl_data_cmd.h" -#include "tlv_hdr.h" #include "hal_api.h" /** diff --git a/hif/inc/regtable_pcie.h b/hif/inc/regtable_pcie.h index 25df023c2033..ca283b31682b 100644 --- a/hif/inc/regtable_pcie.h +++ b/hif/inc/regtable_pcie.h @@ -261,12 +261,18 @@ (pdev->targetdef->d_RX_MSDU_START_0_MSDU_LENGTH_MASK) #define RX_MSDU_START_0_MSDU_LENGTH_LSB \ (pdev->targetdef->d_RX_MSDU_START_0_MSDU_LENGTH_LSB) +#ifndef RX_MSDU_START_2_DECAP_FORMAT_OFFSET #define RX_MSDU_START_2_DECAP_FORMAT_OFFSET \ (pdev->targetdef->d_RX_MSDU_START_2_DECAP_FORMAT_OFFSET) +#endif +#ifndef RX_MSDU_START_2_DECAP_FORMAT_MASK #define RX_MSDU_START_2_DECAP_FORMAT_MASK \ (pdev->targetdef->d_RX_MSDU_START_2_DECAP_FORMAT_MASK) +#endif +#ifndef RX_MSDU_START_2_DECAP_FORMAT_LSB #define RX_MSDU_START_2_DECAP_FORMAT_LSB \ (pdev->targetdef->d_RX_MSDU_START_2_DECAP_FORMAT_LSB) +#endif #define RX_MPDU_START_0_ENCRYPTED_MASK \ (pdev->targetdef->d_RX_MPDU_START_0_ENCRYPTED_MASK) #define RX_MPDU_START_0_ENCRYPTED_LSB \ diff --git a/hif/src/ce/ce_service_srng.c b/hif/src/ce/ce_service_srng.c index a1bd74fe34da..aab67f4e307e 100644 --- a/hif/src/ce/ce_service_srng.c +++ b/hif/src/ce/ce_service_srng.c @@ -206,7 +206,7 @@ ce_sendlist_send_srng(struct CE_handle *copyeng, DPTRACE(qdf_dp_trace((qdf_nbuf_t)per_transfer_context, QDF_DP_TRACE_CE_PACKET_PTR_RECORD, (uint8_t *)(((qdf_nbuf_t)per_transfer_context)->data), - sizeof(((qdf_nbuf_t)per_transfer_context)->data))); + sizeof(((qdf_nbuf_t)per_transfer_context)->data), QDF_NA)); } else { /* * Probably not worth the additional complexity to support diff --git a/hif/src/hif_main.h b/hif/src/hif_main.h index 76e0c2b5693e..2084049d7b18 100644 --- a/hif/src/hif_main.h +++ b/hif/src/hif_main.h @@ -176,6 +176,12 @@ struct hif_softc { uint32_t hif_attribute; }; +static inline void *hif_get_hal_handle(void *hif_hdl) +{ + struct hif_softc *sc = (struct hif_softc *)hif_hdl; + return sc->hal_soc; +} + #ifdef QCA_NSS_WIFI_OFFLOAD_SUPPORT static inline bool hif_is_nss_wifi_enabled(struct hif_softc *sc) { diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c index c5d9eb8c8916..696416dcf41f 100644 --- a/hif/src/pcie/if_pci.c +++ b/hif/src/pcie/if_pci.c @@ -1451,7 +1451,7 @@ QDF_STATUS hif_pci_open(struct hif_softc *hif_ctx, enum qdf_bus_type bus_type) * * Bmi phase uses different copy complete callbacks than mission mode. */ -static void hif_register_bmi_callbacks(struct hif_softc *hif_sc) +void hif_register_bmi_callbacks(struct hif_softc *hif_sc) { struct HIF_CE_pipe_info *pipe_info; struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(hif_sc); diff --git a/hif/src/qca8074def.c b/hif/src/qca8074def.c index 3a99f92c4a6e..e2bfa5bb42bb 100644 --- a/hif/src/qca8074def.c +++ b/hif/src/qca8074def.c @@ -21,7 +21,7 @@ #undef UMAC #define WLAN_HEADERS 1 -#include +#include #define MISSING 0 diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 55c9515eec97..c2756bffc938 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -269,6 +269,8 @@ typedef enum { QDF_MODULE_ID_BMI = 21, QDF_MODULE_ID_EPPING = 22, QDF_MODULE_ID_QVIT = 23, + QDF_MODULE_ID_DP = 24, + QDF_MODULE_ID_SOC = 25, QDF_MODULE_ID_MAX } QDF_MODULE_ID; diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index b253ea3282ab..c042b7ddde08 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -63,9 +63,15 @@ #define WLAN_CFG_PER_PDEV_RX_RING 16 #define WLAN_CFG_NUM_REO_DEST_RING 16 +#ifdef CONFIG_WIN #define WLAN_CFG_NUM_TX_DESC 8192 #define WLAN_CFG_NUM_TX_EXT_DESC 8192 #define WLAN_CFG_NUM_TX_DESC_POOL 16 +#else +#define WLAN_CFG_NUM_TX_DESC 1024 +#define WLAN_CFG_NUM_TX_EXT_DESC 1024 +#define WLAN_CFG_NUM_TX_DESC_POOL 3 +#endif /* CONFIG_WIN */ #define WLAN_CFG_NUM_TXEXT_DESC_POOL 16 #define WLAN_CFG_HTT_PKT_TYPE 2 #define WLAN_CFG_MAX_PEER_ID 16