UINT32 mt_rx_pkt_process(RTMP_ADAPTER *pAd, UINT8 resource_idx, RX_BLK *rx_blk, PNDIS_PACKET rx_packet)
{
UINT32 rx_pkt_type;
enum resource_attr res_attr = hif_get_resource_type(pAd->hdev_ctrl, resource_idx);
if (res_attr == HIF_RX_DATA)
rx_pkt_type = asic_get_packet_type(pAd, GET_OS_PKT_DATAPTR(rx_packet));
else {
rx_pkt_type = asic_get_packet_type(pAd, rx_packet);
/* rx data is from event ring, convert it to skb */
if (rx_pkt_type == RMAC_RX_PKT_TYPE_RX_NORMAL || rx_pkt_type == RMAC_RX_PKT_TYPE_RX_DUP_RFB) {
PNDIS_PACKET pkt = NULL;
DEV_ALLOC_SKB(pkt, RX1_BUFFER_SIZE);
if (pkt) {
NdisCopyMemory(OS_PKT_TAIL_BUF_EXTEND(pkt, RX1_BUFFER_SIZE), rx_packet, RX1_BUFFER_SIZE);
rx_packet = pkt;
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
} else {
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
return NDIS_STATUS_SUCCESS;
}
}
}
/*notify to interesting feature, only enable when DVT mode enable*/
call_traffic_rx_notifierieres(pAd, rx_pkt_type, rx_packet);
#ifndef ZTE
MTWF_DBG(pAd, DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, "%s, rx_pkt_type(%d)\n", __func__, rx_pkt_type);
#endif
switch (rx_pkt_type) {
case RMAC_RX_PKT_TYPE_RX_NORMAL:
case RMAC_RX_PKT_TYPE_RX_DUP_RFB:
rx_data_handler(pAd, rx_blk, rx_packet);
break;
case RMAC_RX_PKT_TYPE_RX_TXRXV:
#ifdef CONFIG_ICS_FRAME_HANDLE
if (pAd->rxvIcs == 0)
asic_rxv_handler(pAd, rx_blk, rx_packet);
#else
asic_rxv_handler(pAd, rx_blk, rx_packet);
#endif /* CONFIG_ICS_FRAME_HANDLE */
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
break;
case RMAC_RX_PKT_TYPE_RX_TXS:
chip_txs_handler(pAd, rx_packet);
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
break;
case RMAC_RX_PKT_TYPE_RX_EVENT:
asic_rx_event_handler(pAd, rx_packet);
RX_BLK_SET_FLAG(rx_blk, fRX_CMD_RSP);
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
break;
case RMAC_RX_PKT_TYPE_RX_TMR:
/* tmr_handler(pAd, rx_blk, rx_packet); */
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
break;
#ifdef CUT_THROUGH
case RMAC_RX_PKT_TYPE_TXRX_NOTIFY:
#ifdef WFDMA_WED_COMPATIBLE
case RMAC_RX_PKT_TYPE_TXRX_NOTIFY_V0:
#endif /*WFDMA_WED_COMPATIBLE*/
asic_txdone_handle(pAd, rx_packet, resource_idx);
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
break;
#endif /* CUT_THROUGH */
case RMAC_RX_PKT_TYPE_RX_ICS:
#ifdef CONFIG_ICS_FRAME_HANDLE
if (pAd->rxvIcs)
chip_rx_ics_handler(pAd, DBG_LOG_PKT_TYPE_ICS, rx_packet, 0);
#endif /* CONFIG_ICS_FRAME_HANDLE */
#ifdef FW_LOG_DUMP
dbg_log_wrapper(pAd, DBG_LOG_PKT_TYPE_ICS, rx_packet, 0);
#endif /* FW_LOG_DUMP */
RELEASE_NDIS_PACKET(pAd, rx_packet, NDIS_STATUS_SUCCESS);
break;
default:
MTWF_DBG(pAd, DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, "%s():Invalid PktType:%d (res_attr:%d)\n", __func__, rx_pkt_type, res_attr);
if (res_attr != HIF_RX_DATA)
hif_free_rx_buf(pAd->hdev_ctrl, resource_idx);
else
RELEASE_NDIS_PACKET(pAd, rx_packet, NDIS_STATUS_FAILURE);
break;
}
return NDIS_STATUS_SUCCESS;
}
最新发布