/* * Copyright (c) 2019 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /** * hal_rx_get_rx_fragment_number_6490(): Function to retrieve rx fragment number * * @nbuf: Network buffer * Returns: rx fragment number */ static uint8_t hal_rx_get_rx_fragment_number_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf); struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs); /* Return first 4 bits as fragment number */ return (HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info) & DOT11_SEQ_FRAG_MASK); } /** * hal_rx_msdu_end_da_is_mcbc_get_6490(): API to check if pkt is MCBC * from rx_msdu_end TLV * * @ buf: pointer to the start of RX PKT TLV headers * Return: da_is_mcbc */ static uint8_t hal_rx_msdu_end_da_is_mcbc_get_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; return HAL_RX_MSDU_END_DA_IS_MCBC_GET(msdu_end); } /** * hal_rx_msdu_end_sa_is_valid_get_6490(): API to get_6490 the * sa_is_valid bit from rx_msdu_end TLV * * @ buf: pointer to the start of RX PKT TLV headers * Return: sa_is_valid bit */ static uint8_t hal_rx_msdu_end_sa_is_valid_get_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; uint8_t sa_is_valid; sa_is_valid = HAL_RX_MSDU_END_SA_IS_VALID_GET(msdu_end); return sa_is_valid; } /** * hal_rx_msdu_end_sa_idx_get_6490(): API to get_6490 the * sa_idx from rx_msdu_end TLV * * @ buf: pointer to the start of RX PKT TLV headers * Return: sa_idx (SA AST index) */ static uint16_t hal_rx_msdu_end_sa_idx_get_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; uint16_t sa_idx; sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end); return sa_idx; } /** * hal_rx_desc_is_first_msdu_6490() - Check if first msdu * * @hal_soc_hdl: hal_soc handle * @hw_desc_addr: hardware descriptor address * * Return: 0 - success/ non-zero failure */ static uint32_t hal_rx_desc_is_first_msdu_6490(void *hw_desc_addr) { struct rx_pkt_tlvs *rx_tlvs = (struct rx_pkt_tlvs *)hw_desc_addr; struct rx_msdu_end *msdu_end = &rx_tlvs->msdu_end_tlv.rx_msdu_end; return HAL_RX_GET(msdu_end, RX_MSDU_END_10, FIRST_MSDU); } /** * hal_rx_msdu_end_l3_hdr_padding_get_6490(): API to get_6490 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 uint32_t hal_rx_msdu_end_l3_hdr_padding_get_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; uint32_t l3_header_padding; l3_header_padding = HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end); return l3_header_padding; } /* * @ hal_rx_encryption_info_valid_6490: Returns encryption type. * * @ buf: rx_tlv_hdr of the received packet * @ Return: encryption type */ static uint32_t hal_rx_encryption_info_valid_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_mpdu_start *mpdu_start = &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; uint32_t encryption_info = HAL_RX_MPDU_ENCRYPTION_INFO_VALID(mpdu_info); return encryption_info; } /* * @ hal_rx_print_pn_6490: Prints the PN of rx packet. * * @ buf: rx_tlv_hdr of the received packet * @ Return: void */ static void hal_rx_print_pn_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_mpdu_start *mpdu_start = &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; uint32_t pn_31_0 = HAL_RX_MPDU_PN_31_0_GET(mpdu_info); uint32_t pn_63_32 = HAL_RX_MPDU_PN_63_32_GET(mpdu_info); uint32_t pn_95_64 = HAL_RX_MPDU_PN_95_64_GET(mpdu_info); uint32_t pn_127_96 = HAL_RX_MPDU_PN_127_96_GET(mpdu_info); hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ", pn_127_96, pn_95_64, pn_63_32, pn_31_0); } /** * hal_rx_msdu_end_first_msdu_get_6490: API to get first msdu status * from rx_msdu_end TLV * * @ buf: pointer to the start of RX PKT TLV headers * Return: first_msdu */ static uint8_t hal_rx_msdu_end_first_msdu_get_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; uint8_t first_msdu; first_msdu = HAL_RX_MSDU_END_FIRST_MSDU_GET(msdu_end); return first_msdu; } /** * hal_rx_msdu_end_da_is_valid_get_6490: API to check if da is valid * from rx_msdu_end TLV * * @ buf: pointer to the start of RX PKT TLV headers * Return: da_is_valid */ static uint8_t hal_rx_msdu_end_da_is_valid_get_6490(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; uint8_t da_is_valid; da_is_valid = HAL_RX_MSDU_END_DA_IS_VALID_GET(msdu_end); return da_is_valid; } struct hal_hw_txrx_ops qca6490_hal_hw_txrx_ops = { /* rx */ hal_rx_get_rx_fragment_number_6490, hal_rx_msdu_end_da_is_mcbc_get_6490, hal_rx_msdu_end_sa_is_valid_get_6490, hal_rx_desc_is_first_msdu_6490, hal_rx_msdu_end_l3_hdr_padding_get_6490, hal_rx_encryption_info_valid_6490, hal_rx_print_pn_6490, hal_rx_msdu_end_first_msdu_get_6490, hal_rx_msdu_end_da_is_valid_get_6490, };