q->magic_cnt = 0;
if (mt76_queue_is_wed_rro_ind(q)) {
struct mt76_wed_rro_desc *rro_desc;
+ u32 data1 = FIELD_PREP(RRO_IND_DATA1_MAGIC_CNT_MASK,
+ MT_DMA_WED_IND_CMD_CNT - 1);
int i;
rro_desc = (struct mt76_wed_rro_desc *)q->desc;
struct mt76_wed_rro_ind *cmd;
cmd = (struct mt76_wed_rro_ind *)&rro_desc[i];
- cmd->magic_cnt = MT_DMA_WED_IND_CMD_CNT - 1;
+ cmd->data1 = cpu_to_le32(data1);
}
} else if (mt76_queue_is_wed_rro_rxdmad_c(q)) {
struct mt76_rro_rxdmad_c *dmad = (void *)q->desc;
if (mt76_queue_is_wed_rro_ind(q)) {
struct mt76_wed_rro_ind *cmd;
+ u8 magic_cnt;
if (flush)
goto done;
cmd = q->entry[idx].buf;
- if (cmd->magic_cnt != q->magic_cnt)
+ magic_cnt = FIELD_GET(RRO_IND_DATA1_MAGIC_CNT_MASK,
+ le32_to_cpu(cmd->data1));
+ if (magic_cnt != q->magic_cnt)
return NULL;
if (q->tail == q->ndesc - 1)
{
struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
struct mt76_wed_rro_ind *cmd = (struct mt76_wed_rro_ind *)data;
+ u32 cmd_data0 = le32_to_cpu(cmd->data0);
+ u32 cmd_data1 = le32_to_cpu(cmd->data1);
+ u8 ind_reason = FIELD_GET(RRO_IND_DATA0_IND_REASON_MASK, cmd_data0);
+ u16 start_seq = FIELD_GET(RRO_IND_DATA0_START_SEQ_MASK, cmd_data0);
+ u16 seq_id = FIELD_GET(RRO_IND_DATA0_SEQ_ID_MASK, cmd_data0);
+ u16 ind_count = FIELD_GET(RRO_IND_DATA1_IND_COUNT_MASK, cmd_data1);
struct mt7996_msdu_page_info *pinfo = NULL;
struct mt7996_msdu_page *p = NULL;
int i, seq_num = 0;
- for (i = 0; i < cmd->ind_cnt; i++) {
+ for (i = 0; i < ind_count; i++) {
struct mt7996_wed_rro_addr *e;
struct mt76_rx_status *status;
struct mt7996_rro_hif *rxd;
void *buf;
bool ls;
- seq_num = FIELD_GET(MT996_RRO_SN_MASK, cmd->start_sn + i);
- e = mt7996_rro_addr_elem_get(dev, cmd->se_id, seq_num);
+ seq_num = FIELD_GET(MT996_RRO_SN_MASK, start_seq + i);
+ e = mt7996_rro_addr_elem_get(dev, seq_id, seq_num);
data = le32_to_cpu(e->data);
signature = FIELD_GET(WED_RRO_ADDR_SIGNATURE_MASK, data);
if (signature != (seq_num / MT7996_RRO_WINDOW_MAX_LEN)) {
skb_mark_for_recycle(skb);
__skb_put(skb, len);
- if (cmd->ind_reason == 1 || cmd->ind_reason == 2) {
+ if (ind_reason == 1 || ind_reason == 2) {
dev_kfree_skb(skb);
goto next_page;
}
}
status = (struct mt76_rx_status *)skb->cb;
- if (cmd->se_id != MT7996_RRO_MAX_SESSION)
+ if (seq_id != MT7996_RRO_MAX_SESSION)
status->aggr = true;
mt7996_queue_rx_skb(mdev, qid, skb, &info);
if ((i + 1) % 4 == 0)
mt76_wr(dev, MT_RRO_ACK_SN_CTRL,
FIELD_PREP(MT_RRO_ACK_SN_CTRL_SESSION_MASK,
- cmd->se_id) |
+ seq_id) |
FIELD_PREP(MT_RRO_ACK_SN_CTRL_SN_MASK,
seq_num));
if (p) {
/* Update ack_seq_num for remaining addr_elem */
if (i % 4)
mt76_wr(dev, MT_RRO_ACK_SN_CTRL,
- FIELD_PREP(MT_RRO_ACK_SN_CTRL_SESSION_MASK,
- cmd->se_id) |
+ FIELD_PREP(MT_RRO_ACK_SN_CTRL_SESSION_MASK, seq_id) |
FIELD_PREP(MT_RRO_ACK_SN_CTRL_SN_MASK, seq_num));
}