41 #include <linux/slab.h>
42 #include <linux/module.h>
49 static inline unsigned int __carl9170_get_queue(
struct ar9170 *
ar,
65 static inline unsigned int carl9170_get_queue(
struct ar9170 *ar,
68 return __carl9170_get_queue(ar, skb_get_queue_mapping(skb));
71 static bool is_mem_full(
struct ar9170 *ar)
77 static void carl9170_tx_accounting(
struct ar9170 *ar,
struct sk_buff *skb)
84 queue = skb_get_queue_mapping(skb);
96 mem_full = is_mem_full(ar);
97 for (i = 0; i < ar->
hw->queues; i++) {
139 static void carl9170_tx_ps_unblock(
struct ar9170 *ar,
struct sk_buff *skb)
145 sta = __carl9170_get_tx_sta(ar, skb);
157 static void carl9170_tx_accounting_free(
struct ar9170 *ar,
struct sk_buff *skb)
161 queue = skb_get_queue_mapping(skb);
167 if (!is_mem_full(ar)) {
169 for (i = 0; i < ar->
hw->queues; i++) {
191 static int carl9170_alloc_dev_space(
struct ar9170 *ar,
struct sk_buff *skb)
214 super = (
void *) skb->
data;
227 static void carl9170_release_dev_space(
struct ar9170 *ar,
struct sk_buff *skb)
263 static void carl9170_tx_release(
struct kref *ref)
296 super = (
void *)skb->
data;
297 txinfo->
status.ampdu_len = super->
s.rix;
298 txinfo->
status.ampdu_ack_len = super->
s.cnt;
334 (IEEE80211_SKB_CB(skb))->rate_driver_data;
335 kref_get(&arinfo->
ref);
341 (IEEE80211_SKB_CB(skb))->rate_driver_data;
343 return kref_put(&arinfo->
ref, carl9170_tx_release);
347 static void carl9170_tx_shift_bm(
struct ar9170 *ar,
369 if (!bitmap_empty(tid_info->
bitmap, off))
372 tid_info->
bsn += off;
373 tid_info->
bsn &= 0x0fff;
379 static void carl9170_tx_status_process_ampdu(
struct ar9170 *ar,
395 sta = __carl9170_get_tx_sta(ar, skb);
399 tid = get_tid_h(
hdr);
401 sta_info = (
void *) sta->drv_priv;
406 spin_lock_bh(&tid_info->
lock);
408 carl9170_tx_shift_bm(ar, tid_info, get_seq_h(
hdr));
410 if (sta_info->
stats[tid].clear) {
414 sta_info->
stats[
tid].ampdu_ack_len = 0;
418 if (txinfo->
status.rates[0].count == 1)
419 sta_info->
stats[
tid].ampdu_ack_len++;
425 super->
s.rix = sta_info->
stats[
tid].ampdu_len;
426 super->
s.cnt = sta_info->
stats[
tid].ampdu_ack_len;
428 if (sta_info->
stats[tid].req)
433 spin_unlock_bh(&tid_info->
lock);
439 static void carl9170_tx_bar_status(
struct ar9170 *ar,
struct sk_buff *skb,
454 if (
unlikely(ieee80211_is_back_req(bar->frame_control)) &&
457 int queue = skb_get_queue_mapping(skb);
460 list_for_each_entry_rcu(entry, &ar->
bar_list[queue],
list) {
461 if (entry->
skb == skb) {
463 list_del_rcu(&entry->
list);
470 WARN(1,
"bar not found in %d - ra:%pM ta:%pM c:%x ssn:%x\n",
471 queue, bar->ra, bar->ta, bar->control,
483 carl9170_tx_accounting_free(ar, skb);
485 txinfo = IEEE80211_SKB_CB(skb);
487 carl9170_tx_bar_status(ar, skb, txinfo);
495 carl9170_tx_status_process_ampdu(ar, skb, txinfo);
497 carl9170_tx_ps_unblock(ar, skb);
520 spin_lock_bh(&queue->
lock);
521 skb_queue_walk(queue, skb) {
524 if (txc->
s.cookie != cookie)
527 __skb_unlink(skb, queue);
528 spin_unlock_bh(&queue->
lock);
530 carl9170_release_dev_space(ar, skb);
533 spin_unlock_bh(&queue->
lock);
538 static void carl9170_tx_fill_rateinfo(
struct ar9170 *ar,
unsigned int rix,
544 if (txinfo->
status.rates[i].idx < 0)
548 txinfo->
status.rates[
i].count = tries;
555 txinfo->
status.rates[
i].idx = -1;
556 txinfo->
status.rates[
i].count = 0;
560 static void carl9170_check_queue_stop_timeout(
struct ar9170 *ar)
568 for (i = 0; i < ar->
hw->queues; i++) {
576 txinfo = IEEE80211_SKB_CB(skb);
605 static void carl9170_tx_ampdu_timeout(
struct ar9170 *ar)
618 spin_lock_bh(&iter->
lock);
619 skb = skb_peek(&iter->
queue);
623 txinfo = IEEE80211_SKB_CB(skb);
629 sta = __carl9170_get_tx_sta(ar, skb);
635 spin_unlock_bh(&iter->
lock);
650 carl9170_check_queue_stop_timeout(ar);
651 carl9170_tx_ampdu_timeout(ar);
660 static void __carl9170_tx_process_status(
struct ar9170 *ar,
665 unsigned int r,
t,
q;
670 skb = carl9170_get_queued_skb(ar, cookie, &ar->
tx_status[q]);
679 txinfo = IEEE80211_SKB_CB(skb);
687 carl9170_tx_fill_rateinfo(ar, r, t, txinfo);
696 for (i = 0; i < cmd->
hdr.ext; i++) {
699 (
void *) cmd, cmd->
hdr.len + 4);
703 __carl9170_tx_process_status(ar, cmd->
_tx_status[i].cookie,
708 static void carl9170_tx_rate_tpc_chains(
struct ar9170 *ar,
710 unsigned int *phyrate,
unsigned int *tpc,
unsigned int *chains)
736 *phyrate = txrate->
idx;
737 *tpc += txpower[idx & 7];
750 *tpc += txpower[(rate->
hw_value & 0x30) >> 4];
754 if (ar->
eeprom.tx_mask == 1) {
764 *tpc =
min_t(
unsigned int, *tpc, ar->
hw->conf.power_level * 2);
770 unsigned int power = 0, chains = 0, phyrate = 0;
818 carl9170_tx_rate_tpc_chains(ar, info, txrate,
819 &phyrate, &power, &chains);
827 static bool carl9170_tx_rts_check(
struct ar9170 *ar,
829 bool ampdu,
bool multi)
851 static bool carl9170_tx_cts_check(
struct ar9170 *ar,
870 static int carl9170_tx_prepare(
struct ar9170 *ar,
899 hw_queue = ar9170_qmap[carl9170_get_queue(ar, skb)];
901 hdr = (
void *)skb->
data;
902 info = IEEE80211_SKB_CB(skb);
910 cvif = (
void *) info->
control.vif->drv_priv;
914 txc = (
void *)
skb_push(skb,
sizeof(*txc));
915 memset(txc, 0,
sizeof(*txc));
941 len += info->
control.hw_key->icv_len;
943 switch (info->
control.hw_key->cipher) {
960 unsigned int density, factor;
965 factor =
min_t(
unsigned int, 1
u, sta->
ht_cap.ampdu_factor);
966 density = sta->
ht_cap.ampdu_density;
976 density =
max_t(
unsigned int, density + 1, 7
u);
980 txc->
s.ampdu_settings, density);
983 txc->
s.ampdu_settings, factor);
987 if (txrate->
idx >= 0) {
1004 txrate->
count = ar->
hw->max_rate_tries;
1017 if (txrate->
idx < 0)
1023 if (carl9170_tx_rts_check(ar, txrate, ampdu, no_ack))
1026 else if (carl9170_tx_cts_check(ar, txrate))
1030 txc->
s.rr[i - 1] = carl9170_tx_physet(ar, info, txrate);
1033 txrate = &info->
control.rates[0];
1036 if (carl9170_tx_rts_check(ar, txrate, ampdu, no_ack))
1038 else if (carl9170_tx_cts_check(ar, txrate))
1043 txc->
f.mac_control = mac_tmp;
1044 txc->
f.phy_control = carl9170_tx_physet(ar, info, txrate);
1049 kref_init(&arinfo->
ref);
1057 static void carl9170_set_immba(
struct ar9170 *ar,
struct sk_buff *skb)
1061 super = (
void *) skb->
data;
1065 static void carl9170_set_ampdu_params(
struct ar9170 *ar,
struct sk_buff *skb)
1070 super = (
void *) skb->
data;
1088 super->
s.ampdu_settings |=
1097 super->
s.ampdu_settings |=
1102 static bool carl9170_tx_rate_check(
struct ar9170 *ar,
struct sk_buff *_dest,
1107 dest = (
void *) _dest->
data;
1108 src = (
void *) _src->
data;
1119 return (dest->
f.phy_control == src->
f.phy_control);
1122 static void carl9170_tx_ampdu(
struct ar9170 *ar)
1127 unsigned int i = 0, done_ampdus = 0;
1128 u16 seq, queue, tmpssn;
1139 __skb_queue_head_init(&agg);
1157 spin_lock_bh(&tid_info->
lock);
1162 first = skb_peek(&tid_info->
queue);
1163 tmpssn = carl9170_get_seq(first);
1164 seq = tid_info->
snx;
1172 while ((skb = skb_peek(&tid_info->
queue))) {
1174 if (
unlikely(carl9170_get_seq(skb) != seq))
1179 (tid_info->
max - 1)))
1182 if (!carl9170_tx_rate_check(ar, skb, first))
1187 __skb_unlink(skb, &tid_info->
queue);
1189 __skb_queue_tail(&agg, skb);
1195 if (skb_queue_empty(&tid_info->
queue) ||
1196 carl9170_get_seq(skb_peek(&tid_info->
queue)) !=
1208 spin_unlock_bh(&tid_info->
lock);
1210 if (skb_queue_empty(&agg))
1214 carl9170_set_ampdu_params(ar, skb_peek(&agg));
1217 carl9170_set_immba(ar, skb_peek_tail(&agg));
1220 skb_queue_splice_tail_init(&agg, &ar->
tx_pending[queue]);
1224 if ((done_ampdus++ == 0) && (i++ == 0))
1231 static struct sk_buff *carl9170_tx_pick_skb(
struct ar9170 *ar,
1240 spin_lock_bh(&queue->
lock);
1241 skb = skb_peek(queue);
1245 if (carl9170_alloc_dev_space(ar, skb))
1248 __skb_unlink(skb, queue);
1249 spin_unlock_bh(&queue->
lock);
1251 info = IEEE80211_SKB_CB(skb);
1258 spin_unlock_bh(&queue->
lock);
1269 super = (
void *)skb->
data;
1271 ar9170_qmap[carl9170_get_queue(ar, skb)]);
1272 __carl9170_tx_process_status(ar, super->
s.cookie, q);
1275 static bool carl9170_tx_ps_drop(
struct ar9170 *ar,
struct sk_buff *skb)
1282 sta = __carl9170_get_tx_sta(ar, skb);
1286 sta_info = (
void *) sta->drv_priv;
1287 tx_info = IEEE80211_SKB_CB(skb);
1298 carl9170_release_dev_space(ar, skb);
1308 static void carl9170_bar_check(
struct ar9170 *ar,
struct sk_buff *skb)
1313 if (
unlikely(ieee80211_is_back_req(bar->frame_control)) &&
1316 unsigned int queue = skb_get_queue_mapping(skb);
1328 static void carl9170_tx(
struct ar9170 *ar)
1332 bool schedule_garbagecollector =
false;
1341 for (i = 0; i < ar->
hw->queues; i++) {
1342 while (!skb_queue_empty(&ar->
tx_pending[i])) {
1343 skb = carl9170_tx_pick_skb(ar, &ar->
tx_pending[i]);
1347 if (
unlikely(carl9170_tx_ps_drop(ar, skb)))
1350 carl9170_bar_check(ar, skb);
1354 q = __carl9170_get_queue(ar, i);
1372 schedule_garbagecollector =
true;
1376 if (!schedule_garbagecollector)
1383 static bool carl9170_tx_ampdu_queue(
struct ar9170 *ar,
1390 u16 tid, seq, qseq, off;
1393 tid = carl9170_get_tid(skb);
1394 seq = carl9170_get_seq(skb);
1395 sta_info = (
void *) sta->drv_priv;
1401 goto err_unlock_rcu;
1403 spin_lock_bh(&agg->lock);
1419 __skb_queue_tail(&agg->queue, skb);
1424 skb_queue_reverse_walk(&agg->queue, iter) {
1425 qseq = carl9170_get_seq(iter);
1428 __skb_queue_after(&agg->queue, iter, skb);
1433 __skb_queue_head(&agg->queue, skb);
1437 if (agg->snx == carl9170_get_seq(skb_peek(&agg->queue))) {
1443 spin_unlock_bh(&agg->lock);
1449 spin_unlock_bh(&agg->lock);
1471 info = IEEE80211_SKB_CB(skb);
1473 if (
unlikely(carl9170_tx_prepare(ar, sta, skb)))
1476 carl9170_tx_accounting(ar, skb);
1488 run = carl9170_tx_ampdu_queue(ar, sta, skb);
1490 carl9170_tx_ampdu(ar);
1493 unsigned int queue = skb_get_queue_mapping(skb);
1510 carl9170_tx_ampdu(ar);
1523 unsigned int plcp, power, chains;
1530 if (ar->
vifs == 0 || !cvif)
1533 list_for_each_entry_continue_rcu(cvif, &ar->
vif_list,
list) {
1554 txinfo = IEEE80211_SKB_CB(skb);
1561 addr = ar->
fw.beacon_addr + off;
1564 if ((off + len) > ar->
fw.beacon_max_len) {
1567 "fit into device memory!\n");
1575 wiphy_err(ar->
hw->wiphy,
"no support for beacons "
1576 "bigger than %d (yours:%d).\n",
1585 rate = &txinfo->
control.rates[0];
1586 carl9170_tx_rate_tpc_chains(ar, txinfo, rate, &plcp, &power, &chains);
1589 plcp |= ((skb->
len +
FCS_LEN) << (3 + 16)) + 0x0400;
1591 plcp |= ((skb->
len +
FCS_LEN) << 16) + 0x0010;
1628 if (old && (data[i] == old[i]))