
Implement hal_rx_msdu_end_dat API based on the chipset as the macro to retrieve da_is_valid value is chipset dependent. Change-Id: I79f06eaa2576e7516c21f963b2c149aac7f62c64 CRs-Fixed: 2522133
211 lines
6.2 KiB
C
211 lines
6.2 KiB
C
/*
|
|
* 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,
|
|
};
|