diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a7347ab2a387..a06b7e4f95f9 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -51,9 +51,9 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng, &(srng->base_paddr_unaligned)); if (!srng->base_vaddr_unaligned) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: alloc failed - ring_type: %d, ring_num %d\n", - __func__, ring_type, ring_num); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("alloc failed - ring_type: %d, ring_num %d"), + ring_type, ring_num); return QDF_STATUS_E_NOMEM; } @@ -105,9 +105,9 @@ static void dp_srng_cleanup(struct dp_soc *soc, struct dp_srng *srng, int ring_type, int ring_num) { if (!srng->hal_srng) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: Ring type: %d, num:%d not setup\n", - __func__, ring_type, ring_num); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("Ring type: %d, num:%d not setup"), + ring_type, ring_num); return; } @@ -138,6 +138,8 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) uint32_t budget = dp_budget; uint8_t tx_mask = int_ctx->tx_ring_mask; uint8_t rx_mask = int_ctx->rx_ring_mask; + uint8_t rx_err_mask = int_ctx->rx_err_ring_mask; + uint8_t rx_wbm_rel_mask = int_ctx->rx_wbm_rel_ring_mask; /* Process Tx completion interrupts first to return back buffers */ if (tx_mask) { @@ -147,7 +149,10 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) 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", + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_INFO, + "tx mask 0x%x ring %d," + "budget %d", tx_mask, ring, budget); if (budget <= 0) goto budget_done; @@ -155,6 +160,36 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) } } + /* Process REO Exception ring interrupt */ + if (rx_err_mask) { + work_done = dp_rx_err_process(soc, + soc->reo_exception_ring.hal_srng, budget); + budget -= work_done; + + if (work_done) + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, + "REO Exception Ring: work_done %d budget %d", + work_done, budget); + if (budget <= 0) { + goto budget_done; + } + } + + /* Process Rx WBM release ring interrupt */ + if (rx_wbm_rel_mask) { + work_done = dp_rx_wbm_err_process(soc, + soc->rx_rel_ring.hal_srng, budget); + budget -= work_done; + + if (work_done) + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, + "WBM Release Ring: work_done %d budget %d", + work_done, budget); + if (budget <= 0) { + goto budget_done; + } + } + /* Process Rx interrupts */ if (rx_mask) { for (ring = 0; ring < soc->num_reo_dest_rings; ring++) { @@ -165,7 +200,10 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) budget); budget -= work_done; if (work_done) - DP_TRACE(INFO, "rx mask 0x%x ring %d, budget %d\n", + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_INFO, + "rx mask 0x%x ring %d," + "budget %d", tx_mask, ring, budget); if (budget <= 0) goto budget_done; @@ -215,6 +253,8 @@ QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc) soc->intr_ctx[i].tx_ring_mask = 0xF; soc->intr_ctx[i].rx_ring_mask = 0xF; soc->intr_ctx[i].rx_mon_ring_mask = 0xF; + soc->intr_ctx[i].rx_err_ring_mask = 0x1; + soc->intr_ctx[i].rx_wbm_rel_ring_mask = 0x1; soc->intr_ctx[i].soc = soc; } @@ -305,8 +345,8 @@ QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc) &soc->intr_ctx[i]); if (ret) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: failed, ret = %d", __func__, ret); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("failed, ret = %d"), ret); return QDF_STATUS_E_FAILURE; } @@ -390,9 +430,9 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc) while (total_link_descs < num_entries) total_link_descs <<= 1; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, - "%s: total_link_descs: %u, link_desc_size: %d\n", - __func__, total_link_descs, link_desc_size); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + FL("total_link_descs: %u, link_desc_size: %d"), + total_link_descs, link_desc_size); total_mem_size = total_link_descs * link_desc_size; total_mem_size += link_desc_align; @@ -407,9 +447,9 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc) (max_alloc_size - link_desc_align); } - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, - "%s: total_mem_size: %d, num_link_desc_banks: %u\n", - __func__, total_mem_size, num_link_desc_banks); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + FL("total_mem_size: %d, num_link_desc_banks: %u"), + total_mem_size, num_link_desc_banks); for (i = 0; i < num_link_desc_banks; i++) { soc->link_desc_banks[i].base_vaddr_unaligned = @@ -431,9 +471,8 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc) soc->link_desc_banks[i].base_vaddr_unaligned)); if (!soc->link_desc_banks[i].base_vaddr_unaligned) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: Link descriptor memory alloc failed\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("Link descriptor memory alloc failed")); goto fail; } } @@ -472,9 +511,8 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc) if (dp_srng_setup(soc, &soc->wbm_idle_link_ring, WBM_IDLE_LINK, 0, 0, total_link_descs)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: Link desc idle ring setup failed\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("Link desc idle ring setup failed")); goto fail; } @@ -523,10 +561,9 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc) soc->wbm_idle_scatter_buf_size, &(soc->wbm_idle_scatter_buf_base_paddr[i])); if (soc->wbm_idle_scatter_buf_base_vaddr[i] == NULL) { - QDF_TRACE(QDF_MODULE_ID_TXRX, + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s:Scatter list memory alloc failed\n", - __func__); + FL("Scatter list memory alloc failed")); goto fail; } } @@ -681,9 +718,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) /* Common rings */ if (dp_srng_setup(soc, &soc->wbm_desc_rel_ring, SW2WBM_RELEASE, 0, 0, WBM_RELEASE_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for wbm_desc_rel_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for wbm_desc_rel_ring")); goto fail1; } @@ -696,18 +732,16 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) for (i = 0; i < soc->num_tcl_data_rings; i++) { if (dp_srng_setup(soc, &soc->tcl_data_ring[i], TCL_DATA, i, 0, TCL_DATA_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for tcl_data_ring[%d]\n", - __func__, i); + FL("dp_srng_setup failed for tcl_data_ring[%d]"), i); goto fail1; } if (dp_srng_setup(soc, &soc->tx_comp_ring[i], WBM2SW_RELEASE, i, 0, TCL_DATA_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for tx_comp_ring[%d]\n", - __func__, i); + FL("dp_srng_setup failed for tx_comp_ring[%d]"), i); goto fail1; } } @@ -717,25 +751,23 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) } if (dp_tx_soc_attach(soc)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_tx_soc_attach failed\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_tx_soc_attach failed")); goto fail1; } /* TCL command and status rings */ if (dp_srng_setup(soc, &soc->tcl_cmd_ring, TCL_CMD, 0, 0, TCL_CMD_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for tcl_cmd_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for tcl_cmd_ring")); goto fail1; } if (dp_srng_setup(soc, &soc->tcl_status_ring, TCL_STATUS, 0, 0, TCL_STATUS_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for tcl_status_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for tcl_status_ring")); goto fail1; } @@ -751,10 +783,9 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) for (i = 0; i < soc->num_reo_dest_rings; i++) { if (dp_srng_setup(soc, &soc->reo_dest_ring[i], REO_DST, i, 0, REO_DST_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for reo_dest_ring[%d]\n", - __func__, i); + FL("dp_srng_setup failed for reo_dest_ring[%d]"), i); goto fail1; } } @@ -768,9 +799,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) /* REO reinjection ring */ if (dp_srng_setup(soc, &soc->reo_reinject_ring, REO_REINJECT, 0, 0, REO_REINJECT_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for reo_reinject_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for reo_reinject_ring")); goto fail1; } @@ -778,9 +808,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) /* Rx release ring */ if (dp_srng_setup(soc, &soc->rx_rel_ring, WBM2SW_RELEASE, 3, 0, RX_RELEASE_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for rx_rel_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for rx_rel_ring")); goto fail1; } @@ -788,9 +817,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) /* Rx exception ring */ if (dp_srng_setup(soc, &soc->reo_exception_ring, REO_EXCEPTION, 0, MAX_REO_DEST_RINGS, REO_EXCEPTION_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for reo_exception_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for reo_exception_ring")); goto fail1; } @@ -798,17 +826,15 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) /* REO command and status rings */ if (dp_srng_setup(soc, &soc->reo_cmd_ring, REO_CMD, 0, 0, REO_CMD_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for reo_cmd_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for reo_cmd_ring")); goto fail1; } if (dp_srng_setup(soc, &soc->reo_status_ring, REO_STATUS, 0, 0, REO_STATUS_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for reo_status_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for reo_status_ring")); goto fail1; } @@ -846,16 +872,16 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, struct dp_pdev *pdev = qdf_mem_malloc(sizeof(*pdev)); if (!pdev) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: DP PDEV memory allocation failed\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("DP PDEV memory allocation failed")); goto fail0; } pdev->wlan_cfg_ctx = wlan_cfg_pdev_attach(); if (!pdev->wlan_cfg_ctx) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: pdev cfg_attach failed\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("pdev cfg_attach failed")); qdf_mem_free(pdev); goto fail0; @@ -870,8 +896,8 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, pdev->vdev_count = 0; if (dp_soc_cmn_setup(soc)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_soc_cmn_setup failed\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_soc_cmn_setup failed")); goto fail1; } @@ -879,16 +905,14 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, if (wlan_cfg_per_pdev_tx_ring(soc->wlan_cfg_ctx)) { if (dp_srng_setup(soc, &soc->tcl_data_ring[pdev_id], TCL_DATA, pdev_id, pdev_id, TCL_DATA_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for tcl_data_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for tcl_data_ring")); goto fail1; } if (dp_srng_setup(soc, &soc->tx_comp_ring[pdev_id], WBM2SW_RELEASE, pdev_id, pdev_id, TCL_DATA_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for tx_comp_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for tx_comp_ring")); goto fail1; } soc->num_tcl_data_rings++; @@ -896,8 +920,8 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, /* Tx specific init */ if (dp_tx_pdev_attach(pdev)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_tx_pdev_attach failed\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_tx_pdev_attach failed")); goto fail1; } @@ -905,9 +929,8 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, if (wlan_cfg_per_pdev_rx_ring(soc->wlan_cfg_ctx)) { if (dp_srng_setup(soc, &soc->reo_dest_ring[pdev_id], REO_DST, pdev_id, pdev_id, REO_DST_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for reo_dest_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for reo_dest_ringn")); goto fail1; } soc->num_reo_dest_rings++; @@ -916,15 +939,15 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, if (dp_srng_setup(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0, pdev_id, RXDMA_BUF_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed rx refill ring\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed rx refill ring")); goto fail1; } #ifdef QCA_HOST2FW_RXBUF_RING if (dp_srng_setup(soc, &pdev->rx_mac_buf_ring, RXDMA_BUF, 1, pdev_id, RXDMA_BUF_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed rx mac ring\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed rx mac ring")); goto fail1; } #endif @@ -933,17 +956,15 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, */ if (dp_srng_setup(soc, &pdev->rxdma_mon_buf_ring, RXDMA_MONITOR_BUF, 0, pdev_id, RXDMA_MONITOR_BUF_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for rxdma_mon_buf_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for rxdma_mon_buf_ring")); goto fail1; } if (dp_srng_setup(soc, &pdev->rxdma_mon_dst_ring, RXDMA_MONITOR_DST, 0, pdev_id, RXDMA_MONITOR_DST_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for rxdma_mon_dst_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for rxdma_mon_dst_ring")); goto fail1; } @@ -951,16 +972,15 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev, if (dp_srng_setup(soc, &pdev->rxdma_mon_status_ring, RXDMA_MONITOR_STATUS, 0, pdev_id, RXDMA_MONITOR_STATUS_RING_SIZE)) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for rxdma_mon_status_ring\n", - __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_srng_setup failed for rxdma_mon_status_ring")); 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__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("dp_rx_pdev_attach failed ")); goto fail0; } @@ -1154,8 +1174,8 @@ void *dp_vdev_attach_wifi3(void *txrx_pdev, struct dp_vdev *vdev = qdf_mem_malloc(sizeof(*vdev)); if (!vdev) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: DP VDEV memory allocation failed\n", __func__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("DP VDEV memory allocation failed")); goto fail0; } @@ -1198,11 +1218,8 @@ void *dp_vdev_attach_wifi3(void *txrx_pdev, qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS); #endif - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "Created vdev %p (%02x:%02x:%02x:%02x:%02x:%02x)\n", vdev, - vdev->mac_addr.raw[0], vdev->mac_addr.raw[1], - vdev->mac_addr.raw[2], vdev->mac_addr.raw[3], - vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Created vdev %p (%pM)", vdev, vdev->mac_addr.raw); return (void *)vdev; @@ -1236,7 +1253,8 @@ void dp_vdev_register_wifi3(void *vdev_handle, void *osif_vdev, /* TODO: Enable the following once Tx code is integrated */ txrx_ops->tx.tx = dp_tx_send; - DP_TRACE(ERROR, "DP Vdev Register success"); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, + "DP Vdev Register success"); } /* @@ -1267,13 +1285,10 @@ void dp_vdev_detach_wifi3(void *vdev_handle, /* check that the vdev has no peers allocated */ if (!TAILQ_EMPTY(&vdev->peer_list)) { /* debug print - will be removed later */ - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN, - "%s: not deleting vdev object %p (%02x:%02x:%02x:%02x:%02x:%02x)" - "until deletion finishes for all its peers\n", - __func__, vdev, - vdev->mac_addr.raw[0], vdev->mac_addr.raw[1], - vdev->mac_addr.raw[2], vdev->mac_addr.raw[3], - vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN, + FL("not deleting vdev object %p (%pM)" + "until deletion finishes for all its peers"), + vdev, vdev->mac_addr.raw); /* indicate that the vdev needs to be deleted */ vdev->delete.pending = 1; vdev->delete.callback = callback; @@ -1284,12 +1299,8 @@ void dp_vdev_detach_wifi3(void *vdev_handle, qdf_spin_unlock_bh(&soc->peer_ref_mutex); dp_tx_vdev_detach(vdev); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, - "%s: deleting vdev object %p (%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, vdev, - vdev->mac_addr.raw[0], vdev->mac_addr.raw[1], - vdev->mac_addr.raw[2], vdev->mac_addr.raw[3], - vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + FL("deleting vdev object %p (%pM)"), vdev, vdev->mac_addr.raw); qdf_mem_free(vdev); @@ -1357,18 +1368,15 @@ void *dp_peer_create_wifi3(void *vdev_handle, uint8_t *peer_mac_addr) /* TODO: See if hash based search is required */ dp_peer_find_hash_add(soc, peer); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, - "vdev %p created peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n", - vdev, peer, - peer->mac_addr.raw[0], peer->mac_addr.raw[1], - peer->mac_addr.raw[2], peer->mac_addr.raw[3], - peer->mac_addr.raw[4], peer->mac_addr.raw[5]); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + "vdev %p created peer %p (%pM)", + vdev, peer, peer->mac_addr.raw); /* * For every peer MAp message search and set if bss_peer */ if (memcmp(peer->mac_addr.raw, vdev->mac_addr.raw, 6) == 0) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, - "vdev bss_peer!!!!\n"); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + "vdev bss_peer!!!!"); peer->bss_peer = 1; vdev->vap_bss_peer = peer; } @@ -1469,11 +1477,8 @@ void dp_peer_unref_delete(void *peer_handle) if (peer_id != HTT_INVALID_PEER) soc->peer_id_to_obj_map[peer_id] = NULL; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, - "Deleting peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n", - peer, peer->mac_addr.raw[0], peer->mac_addr.raw[1], - peer->mac_addr.raw[2], peer->mac_addr.raw[3], - peer->mac_addr.raw[4], peer->mac_addr.raw[5]); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + "Deleting peer %p (%pM)", peer, peer->mac_addr.raw); /* remove the reference to the peer from the hash table */ dp_peer_find_hash_remove(soc, peer); @@ -1489,8 +1494,8 @@ void dp_peer_unref_delete(void *peer_handle) peer_list_elem); } else { /*Ignoring the remove operation as peer not found*/ - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN, - "WARN peer %p not found in vdev (%p)->peer_list:%p\n", + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN, + "peer %p not found in vdev (%p)->peer_list:%p", peer, vdev, &peer->vdev->peer_list); } @@ -1514,18 +1519,11 @@ void dp_peer_unref_delete(void *peer_handle) void *vdev_delete_context = vdev->delete.context; - QDF_TRACE(QDF_MODULE_ID_TXRX, + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, - "%s: deleting vdev object %p " - "(%02x:%02x:%02x:%02x:%02x:%02x)" - " - its last peer is done\n", - __func__, vdev, - vdev->mac_addr.raw[0], - vdev->mac_addr.raw[1], - vdev->mac_addr.raw[2], - vdev->mac_addr.raw[3], - vdev->mac_addr.raw[4], - vdev->mac_addr.raw[5]); + FL("deleting vdev object %p (%pM)" + " - its last peer is done"), + vdev, vdev->mac_addr.raw); /* all peers are gone, go ahead and delete it */ qdf_mem_free(vdev); if (vdev_delete_cb) @@ -1561,11 +1559,8 @@ void dp_peer_delete_wifi3(void *peer_handle) */ peer->rx_opt_proc = dp_rx_discard; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, - "%s:peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n", __func__, peer, - peer->mac_addr.raw[0], peer->mac_addr.raw[1], - peer->mac_addr.raw[2], peer->mac_addr.raw[3], - peer->mac_addr.raw[4], peer->mac_addr.raw[5]); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + FL("peer %p (%pM)"), peer, peer->mac_addr.raw); /* * Remove the reference added during peer_attach. @@ -1805,8 +1800,8 @@ void *dp_soc_attach_wifi3(void *osif_soc, void *hif_handle, 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__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("DP SOC memory allocation failed")); goto fail0; } @@ -1819,28 +1814,20 @@ void *dp_soc_attach_wifi3(void *osif_soc, void *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__); + if (!soc->htt_handle) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("HTT attach failed")); 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__); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("wlan_cfg_soc_attach failed")); 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; } diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 954b45f8a9b7..b911a89f0bb4 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -170,8 +170,7 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, bool *is_term) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s %d : Intra-BSS forwarding not implemented", - __func__, __LINE__); + FL("Intra-BSS forwarding not implemented")); return false; } @@ -222,8 +221,7 @@ dp_rx_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 -- %p\n", - __func__, __LINE__, hal_ring); + FL("HAL RING Access Failed -- %p"), hal_ring); hal_srng_access_end(hal_soc, hal_ring); goto done; } @@ -238,8 +236,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) if (qdf_unlikely(error == HAL_REO_ERROR_DETECTED)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING 0x%p:error %d\n", - __func__, __LINE__, hal_ring, error); + FL("HAL RING 0x%p:error %d"), hal_ring, error); /* Don't know how to deal with this -- assert */ qdf_assert(0); } @@ -288,8 +285,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) if (!hal_rx_attn_msdu_done_get(rx_desc->rx_buf_start)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING 0x%p\n", - __func__, __LINE__, hal_ring); + FL("HAL RING 0x%p"), hal_ring); print_hex_dump(KERN_ERR, "\t Pkt Desc:", DUMP_PREFIX_NONE, 32, 4, @@ -338,8 +334,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) /* Peer lookup failed */ if (!peer) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s %d : peer look-up failed peer id %d\n", - __func__, __LINE__, peer_id); + FL("peer look-up failed peer id %d"), peer_id); /* Drop & free packet */ qdf_nbuf_free(rx_desc->nbuf); diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index df4085439515..9f3ec11454b5 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -119,8 +119,12 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, union dp_rx_desc_list_elem_t **desc_list, union dp_rx_desc_list_elem_t **tail, uint8_t owner); +uint32_t dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota); + +uint32_t dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota); + uint32_t -dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota); +dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota); /** * dp_rx_add_to_free_desc_list() - Adds to a local free descriptor list diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index c6b9917a7340..e146df557390 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -219,6 +219,111 @@ dp_rx_2k_jump_handle(struct dp_soc *soc, void *ring_desc, head, tail, quota); } +/** +* dp_rx_null_q_desc_handle() - Function to handle NULL Queue +* descriptor violation on either a +* REO or WBM ring +* +* @soc: core DP main context +* @ring_desc: opaque pointer to the REO error ring descriptor +* @head: pointer to head of rx descriptors to be added to free list +* @tail: pointer to tail of rx descriptors to be added to free list +* quota: upper limit of descriptors that can be reaped +* +* This function handles NULL queue descriptor violations arising out +* a missing REO queue for a given peer or a given TID. This typically +* may happen if a packet is received on a QOS enabled TID before the +* ADDBA negotiation for that TID, when the TID queue is setup. Or +* it may also happen for MC/BC frames if they are not routed to the +* non-QOS TID queue, in the absence of any other default TID queue. +* This error can show up both in a REO destination or WBM release ring. +* +* Return: uint32_t: No. of Rx buffers reaped +*/ +uint32_t +dp_rx_null_q_desc_handle(struct dp_soc *soc, void *ring_desc, + union dp_rx_desc_list_elem_t **head, + union dp_rx_desc_list_elem_t **tail, + uint32_t quota) +{ + uint32_t rx_buf_cookie; + struct dp_rx_desc *rx_desc; + uint32_t rx_bufs_used = 0; + uint32_t pkt_len, l2_hdr_offset; + uint16_t msdu_len; + qdf_nbuf_t nbuf; + struct dp_pdev *pdev0; + struct dp_vdev *vdev0; + + rx_buf_cookie = HAL_RX_WBM_BUF_COOKIE_GET(ring_desc); + + rx_desc = dp_rx_cookie_2_va(soc, rx_buf_cookie); + + qdf_assert(rx_desc); + + rx_bufs_used++; + + nbuf = rx_desc->nbuf; + + qdf_nbuf_unmap_single(soc->osdev, nbuf, + QDF_DMA_BIDIRECTIONAL); + + rx_desc->rx_buf_start = qdf_nbuf_data(nbuf); + + l2_hdr_offset = + hal_rx_msdu_end_l3_hdr_padding_get(rx_desc->rx_buf_start); + + msdu_len = hal_rx_msdu_start_msdu_len_get(rx_desc->rx_buf_start); + pkt_len = msdu_len + l2_hdr_offset + RX_PKT_TLVS_LEN; + + /* Set length in nbuf */ + qdf_nbuf_set_pktlen(nbuf, pkt_len); + + /* + * Check if DMA completed -- msdu_done is the last bit + * to be written + */ + if (!hal_rx_attn_msdu_done_get(rx_desc->rx_buf_start)) { + + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("nbuf->data 0x%p"), rx_desc->rx_buf_start); + + qdf_assert(0); + } + + /* + * Advance the packet start pointer by total size of + * pre-header TLV's + */ + qdf_nbuf_pull_head(nbuf, RX_PKT_TLVS_LEN); + + if (l2_hdr_offset) + qdf_nbuf_pull_head(nbuf, l2_hdr_offset); + + pdev0 = soc->pdev_list[0];/* Hard code 0th elem */ + + if (pdev0) { + vdev0 = (struct dp_vdev *)TAILQ_FIRST(&pdev0->vdev_list); + if (vdev0 && vdev0->osif_rx) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, + FL("pdev0 %p vdev0 %p osif_rx %p"), pdev0, vdev0, + vdev0->osif_rx); + + vdev0->osif_rx(vdev0->osif_vdev, nbuf); + } else { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("INVALID vdev0 %p OR osif_rx"), vdev0); + } + } else { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("INVALID pdev %p"), pdev0); + } + + dp_rx_add_to_free_desc_list(head, tail, rx_desc); + + return rx_bufs_used; +} + /** * dp_rx_link_desc_return() - Return a MPDU link descriptor to HW * (WBM), following error handling @@ -239,7 +344,8 @@ dp_rx_link_desc_return(struct dp_soc *soc, void *ring_desc) void *src_srng_desc; if (!wbm_rel_srng) { - qdf_print("WBM RELEASE RING not initialized\n"); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "WBM RELEASE RING not initialized"); return status; } @@ -250,10 +356,9 @@ dp_rx_link_desc_return(struct dp_soc *soc, void *ring_desc) * Need API to convert from hal_ring pointer to * Ring Type / Ring Id combo */ - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : " - "HAL RING Access For WBM Release SRNG Failed -- %p\n", - __func__, __LINE__, wbm_rel_srng); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("HAL RING Access For WBM Release SRNG Failed - %p"), + wbm_rel_srng); goto done; } src_srng_desc = hal_srng_src_get_next(hal_soc, wbm_rel_srng); @@ -264,9 +369,10 @@ dp_rx_link_desc_return(struct dp_soc *soc, void *ring_desc) status = QDF_STATUS_SUCCESS; } else { struct hal_srng *srng = (struct hal_srng *)wbm_rel_srng; - qdf_print("%s %d -- WBM Release Ring (Id %d) Full\n", - __func__, __LINE__, srng->ring_id); - qdf_print("HP 0x%x Reap HP 0x%x TP 0x%x Cached TP 0x%x\n", + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("WBM Release Ring (Id %d) Full"), srng->ring_id); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "HP 0x%x Reap HP 0x%x TP 0x%x Cached TP 0x%x", *srng->u.src_ring.hp_addr, srng->u.src_ring.reap_hp, *srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp); } @@ -315,9 +421,8 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) * Need API to convert from hal_ring pointer to * Ring Type / Ring Id combo */ - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING Access Failed -- %p\n", - __func__, __LINE__, hal_ring); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("HAL RING Access Failed -- %p"), hal_ring); goto done; } @@ -338,8 +443,8 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) /* TODO */ /* Call appropriate handler */ - qdf_print("%s %d: Invalid RBM %d\n", - __func__, __LINE__, rbm); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid RBM %d"), rbm); continue; } @@ -386,7 +491,8 @@ done: hal_srng_access_end(hal_soc, hal_ring); /* Assume MAC id = 0, owner = 0 */ - dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail, + if (rx_bufs_used) + dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail, HAL_RX_BUF_RBM_SW3_BM); return rx_bufs_used; /* Assume no scale factor for now */ @@ -432,9 +538,8 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) * Need API to convert from hal_ring pointer to * Ring Type / Ring Id combo */ - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL RING Access Failed -- %p\n", - __func__, __LINE__, hal_ring); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("HAL RING Access Failed -- %p"), hal_ring); goto done; } @@ -457,8 +562,8 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) /* TODO */ /* Call appropriate handler */ - qdf_print("%s %d: Invalid RBM %d\n", - __func__, __LINE__, rbm); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid RBM %d"), rbm); continue; } @@ -480,14 +585,30 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) HAL_RX_WBM_REO_ERROR_CODE_GET(ring_desc); switch (reo_error_code) { + /* + * Handling for packets which have NULL REO + * queue descriptor + */ + case HAL_REO_ERR_QUEUE_DESC_ADDR_0: + case HAL_REO_ERR_REGULAR_FRAME_2K_JUMP: + case HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET: + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_WARN, + "Got pkt with REO ERROR: %d", + reo_error_code); + rx_bufs_used += + dp_rx_null_q_desc_handle(soc, + ring_desc, &head, &tail, quota); + continue; /* TODO */ /* Add per error code accounting */ default: - qdf_print( - "%s %d: REO error %d detected\n", - __func__, __LINE__, reo_error_code); + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_ERROR, + "REO error %d detected", + reo_error_code); } } } else if (wbm_err_src == HAL_RX_WBM_ERR_SRC_RXDMA) { @@ -505,9 +626,10 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) /* Add per error code accounting */ default: - qdf_print( - "%s %d: RXDMA error %d detected\n", - __func__, __LINE__, rxdma_error_code); + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_ERROR, + "RXDMA error %d detected", + rxdma_error_code); } } } else { @@ -534,7 +656,8 @@ done: hal_srng_access_end(hal_soc, hal_ring); /* Assume MAC id = 0, owner = 0 */ - dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail, + if (rx_bufs_used) + dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail, HAL_RX_BUF_RBM_SW3_BM); return rx_bufs_used; /* Assume no scale factor for now */ diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index c520b6ff7454..d68bdd19e42a 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -239,6 +239,8 @@ struct dp_intr { uint8_t rx_ring_mask; /* Rx REO rings (0-3) associated with this interrupt context */ uint8_t rx_mon_ring_mask; /* Rx monitor ring mask (0-2) */ + uint8_t rx_err_ring_mask; /* REO Exception Ring */ + uint8_t rx_wbm_rel_ring_mask; /* WBM2SW Rx Release Ring */ struct dp_soc *soc; /* Reference to SoC structure , to get DMA ring handles */ }; diff --git a/dp/wifi3.0/hal_rx.h b/dp/wifi3.0/hal_rx.h index b9797c03c6a0..17fb3d3e71d1 100644 --- a/dp/wifi3.0/hal_rx.h +++ b/dp/wifi3.0/hal_rx.h @@ -498,14 +498,20 @@ struct rx_pkt_hdr_tlv { * 2) TLV's don't span across 128 byte lines * 3) Rx Buffer is nicely aligned on the 128 byte boundary */ -#define RX_PADDING_BYTES 16 +#if defined(WCSS_VERSION) && (WCSS_VERSION >= 96) +#define RX_PADDING0_BYTES 4 +#endif +#define RX_PADDING1_BYTES 16 struct rx_pkt_tlvs { struct rx_msdu_end_tlv msdu_end_tlv; /* 72 bytes */ struct rx_attention_tlv attn_tlv; /* 16 bytes */ struct rx_msdu_start_tlv msdu_start_tlv;/* 40 bytes */ +#if defined(WCSS_VERSION) && (WCSS_VERSION >= 96) + uint8_t rx_padding0[RX_PADDING0_BYTES]; /* 4 bytes */ +#endif struct rx_mpdu_start_tlv mpdu_start_tlv;/* 96 bytes */ struct rx_mpdu_end_tlv mpdu_end_tlv; /* 12 bytes */ - uint8_t rx_padding[RX_PADDING_BYTES]; /* 20 bytes */ + uint8_t rx_padding1[RX_PADDING1_BYTES]; /* 16 bytes */ struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */ }; #else /* RXDMA_OPTIMIZATION */ @@ -542,15 +548,27 @@ hal_rx_attn_msdu_done_get(uint8_t *buf) return msdu_done; } -/* - * Get l3_header_padding from RX_MSDU_END - */ +#if defined(WCSS_VERSION) && (WCSS_VERSION > 81) +#define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end) \ + (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \ + RX_MSDU_END_5_L3_HEADER_PADDING_OFFSET)), \ + RX_MSDU_END_5_L3_HEADER_PADDING_MASK, \ + RX_MSDU_END_5_L3_HEADER_PADDING_LSB)) +#else #define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end) \ (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \ RX_MSDU_END_9_L3_HEADER_PADDING_OFFSET)), \ RX_MSDU_END_9_L3_HEADER_PADDING_MASK, \ RX_MSDU_END_9_L3_HEADER_PADDING_LSB)) +#endif + /** + * hal_rx_msdu_end_l3_hdr_padding_get: API to get the + * l3_header padding from rx_msdu_end TLV + * + * @ buf: pointer to the start of RX PKT TLV headers + * Return: number of l3 header padding bytes + */ static inline uint32_t hal_rx_msdu_end_l3_hdr_padding_get(uint8_t *buf) { @@ -562,6 +580,33 @@ hal_rx_msdu_end_l3_hdr_padding_get(uint8_t *buf) return l3_header_padding; } + +#define HAL_RX_MSDU_START_MSDU_LEN_GET(_rx_msdu_start) \ + (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \ + RX_MSDU_START_1_MSDU_LENGTH_OFFSET)), \ + RX_MSDU_START_1_MSDU_LENGTH_MASK, \ + RX_MSDU_START_1_MSDU_LENGTH_LSB)) + + /** + * hal_rx_msdu_start_msdu_len_get: API to get the MSDU length + * from rx_msdu_start TLV + * + * @ buf: pointer to the start of RX PKT TLV headers + * Return: msdu length + */ +static inline uint32_t +hal_rx_msdu_start_msdu_len_get(uint8_t *buf) +{ + struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; + struct rx_msdu_start *msdu_start = + &pkt_tlvs->msdu_start_tlv.rx_msdu_start; + uint32_t msdu_len; + + msdu_len = HAL_RX_MSDU_START_MSDU_LEN_GET(msdu_start); + + return msdu_len; +} + /******************************************************************************* * RX ERROR APIS ******************************************************************************/ diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index d0736075bf62..271a4f45e0df 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -59,6 +59,9 @@ #include "rx_msdu_end.h" #include "rx_attention.h" #include "tx_msdu_extension.h" +#ifdef CONFIG_WIN +#include "wcss_version.h" +#endif /* TBD: This should be movded to shared HW header file */ enum hal_srng_ring_id {