int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags)
{
u32 info, pad;
/* Buffer layout: * | 4B | xfer len | pad | 4B | * | TXINFO | pkt/cmd | zero pad to 4B | zero | * * length field of TXINFO should be set to 'xfer len'.
*/
info = FIELD_PREP(MT_TXD_INFO_LEN, round_up(skb->len, 4)) |
FIELD_PREP(MT_TXD_INFO_DPORT, port) | flags;
put_unaligned_le32(info, skb_push(skb, sizeof(info)));
/* encode packet rate for no-skb packet id to fix up status reporting */ if (pid == MT_PACKET_ID_NO_SKB)
pid = MT_PACKET_ID_HAS_RATE |
(le16_to_cpu(txwi->rate) & MT_PKTID_RATE) |
FIELD_PREP(MT_PKTID_AC,
skb_get_queue_mapping(tx_info->skb));
txwi->pktid = pid;
if ((mt76_is_skb_pktid(pid) && ampdu) || ep == MT_EP_OUT_HCCA)
qsel = MT_QSEL_MGMT; else
qsel = MT_QSEL_EDCA;
/* Trigger pre-TBTT event 8 ms before TBTT */ #define PRE_TBTT_USEC 8000
/* Beacon SRAM memory is limited to 8kB. We need to send PS buffered frames * (which can be 1500 bytes big) via beacon memory. That make limit of number * of slots to 5. TODO: dynamically calculate offsets in beacon SRAM.
*/ #define N_BCN_SLOTS 5
/* Convert beacon interval in TU (1024 usec) to nsec */
time = ((1000000000ull * dev->mt76.beacon_int) >> 10);
/* Adjust time to trigger hrtimer 8ms before TBTT */ if (tbtt < PRE_TBTT_USEC)
time -= (PRE_TBTT_USEC - tbtt) * 1000ull; else
time += (tbtt - PRE_TBTT_USEC) * 1000ull;
hrtimer_start(&dev->pre_tbtt_timer, time, HRTIMER_MODE_REL);
}
staticvoid mt76x02u_stop_pre_tbtt_timer(struct mt76x02_dev *dev)
{ do {
hrtimer_cancel(&dev->pre_tbtt_timer);
cancel_work_sync(&dev->pre_tbtt_work); /* Timer can be rearmed by work. */
} while (hrtimer_active(&dev->pre_tbtt_timer));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.