qcacmn: fix setup tid for non QOS client

fix tid setup in null queue for packet comes in uninitialized tid.

Change-Id: I430e24f46a1782d0ddc3abebbbf32145573d6844
这个提交包含在:
nobelj
2019-03-20 20:23:59 -07:00
提交者 nshrivas
父节点 a1a1945c1c
当前提交 2b861f8a49
修改 2 个文件,包含 80 行新增8 行删除

查看文件

@@ -40,6 +40,9 @@
#define RX_BUFFER_SIZE 2048
#endif
/* HAL_RX_NON_QOS_TID = NON_QOS_TID which is 16 */
#define HAL_RX_NON_QOS_TID 16
enum {
HAL_HW_RX_DECAP_FORMAT_RAW = 0,
HAL_HW_RX_DECAP_FORMAT_NWIFI,
@@ -1250,6 +1253,79 @@ hal_rx_mpdu_start_mpdu_qos_control_valid_get(uint8_t *buf)
return qos_control_valid;
}
/**
* enum hal_rx_mpdu_info_sw_frame_group_id_type: Enum for group id in MPDU_INFO
*
* @ HAL_MPDU_SW_FRAME_GROUP_NDP_FRAME: NDP frame
* @ HAL_MPDU_SW_FRAME_GROUP_MULTICAST_DATA: multicast data frame
* @ HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA: unicast data frame
* @ HAL_MPDU_SW_FRAME_GROUP_NULL_DATA: NULL data frame
* @ HAL_MPDU_SW_FRAME_GROUP_MGMT: management frame
* @ HAL_MPDU_SW_FRAME_GROUP_CTRL: control frame
* @ HAL_MPDU_SW_FRAME_GROUP_UNSUPPORTED: unsupported
* @ HAL_MPDU_SW_FRAME_GROUP_MAX: max limit
*/
enum hal_rx_mpdu_info_sw_frame_group_id_type {
HAL_MPDU_SW_FRAME_GROUP_NDP_FRAME = 0,
HAL_MPDU_SW_FRAME_GROUP_MULTICAST_DATA,
HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA,
HAL_MPDU_SW_FRAME_GROUP_NULL_DATA,
HAL_MPDU_SW_FRAME_GROUP_MGMT,
HAL_MPDU_SW_FRAME_GROUP_CTRL = 20,
HAL_MPDU_SW_FRAME_GROUP_UNSUPPORTED = 36,
HAL_MPDU_SW_FRAME_GROUP_MAX = 37,
};
/**
* hal_rx_is_unicast: check packet is unicast frame or not.
*
* @ buf: pointer to rx pkt TLV.
*
* Return: true on unicast.
*/
static inline bool
hal_rx_is_unicast(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;
uint32_t grp_id;
uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
grp_id = (_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_OFFSET)),
RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_MASK,
RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_LSB));
return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false;
}
/**
* hal_rx_tid_get: get tid based on qos control valid.
*
* @ buf: pointer to rx pkt TLV.
*
* Return: tid
*/
static inline uint32_t
hal_rx_tid_get(struct hal_soc *hal_soc, 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;
uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
uint8_t qos_control_valid =
(_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_OFFSET)),
RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_MASK,
RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_LSB));
if (qos_control_valid)
return hal_soc->ops->hal_rx_mpdu_start_tid_get(buf);
return HAL_RX_NON_QOS_TID;
}
/*
* Get SW peer id from RX_MPDU_START