for (i = 0; i < dev->beacon_ops->nslots; i++) {
val = i * dev->beacon_ops->slot_size;
regs[i / 4] |= (val / 64) << (8 * (i % 4));
}
for (i = 0; i < 4; i++)
mt76_wr(dev, MT_BCN_OFFSET(i), regs[i]);
}
staticint
mt76x02_write_beacon(struct mt76x02_dev *dev, int offset, struct sk_buff *skb)
{ int beacon_len = dev->beacon_ops->slot_size;
if (WARN_ON_ONCE(beacon_len < skb->len + sizeof(struct mt76x02_txwi))) return -ENOSPC;
/* USB devices already reserve enough skb headroom for txwi's. This * helps to save slow copies over USB.
*/ if (mt76_is_usb(&dev->mt76)) { struct mt76x02_txwi *txwi;
/* * Beacon timer drifts by 1us every tick, the timer is configured * in 1/16 TU (64us) units.
*/ if (dev->tbtt_count < 63) return;
/* * The updated beacon interval takes effect after two TBTT, because * at this point the original interval has already been loaded into * the next TBTT_TIMER value
*/ if (dev->tbtt_count == 63)
timer_val -= 1;
void
mt76x02_enqueue_buffered_bc(struct mt76x02_dev *dev, struct beacon_bc_data *data, int max_nframes)
{ int i, nframes;
do {
nframes = skb_queue_len(&data->q);
ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
IEEE80211_IFACE_ITER_RESUME_ALL,
mt76x02_add_buffered_bc, data);
} while (nframes != skb_queue_len(&data->q) &&
skb_queue_len(&data->q) < max_nframes);
if (!skb_queue_len(&data->q)) return;
for (i = 0; i < ARRAY_SIZE(data->tail); i++) { if (!data->tail[i]) continue;
mt76_skb_set_moredata(data->tail[i], false);
}
}
EXPORT_SYMBOL_GPL(mt76x02_enqueue_buffered_bc);
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.