Lines Matching refs:priv

30 static void p54_dump_tx_queue(struct p54_common *priv)  in p54_dump_tx_queue()  argument
41 spin_lock_irqsave(&priv->tx_queue.lock, flags); in p54_dump_tx_queue()
42 wiphy_debug(priv->hw->wiphy, "/ --- tx queue dump (%d entries) ---\n", in p54_dump_tx_queue()
43 skb_queue_len(&priv->tx_queue)); in p54_dump_tx_queue()
45 prev_addr = priv->rx_start; in p54_dump_tx_queue()
46 skb_queue_walk(&priv->tx_queue, skb) { in p54_dump_tx_queue()
52 wiphy_debug(priv->hw->wiphy, in p54_dump_tx_queue()
64 free = priv->rx_end - prev_addr; in p54_dump_tx_queue()
66 wiphy_debug(priv->hw->wiphy, in p54_dump_tx_queue()
69 spin_unlock_irqrestore(&priv->tx_queue.lock, flags); in p54_dump_tx_queue()
82 static int p54_assign_address(struct p54_common *priv, struct sk_buff *skb) in p54_assign_address() argument
89 u32 last_addr = priv->rx_start; in p54_assign_address()
90 u32 target_addr = priv->rx_start; in p54_assign_address()
91 u16 len = priv->headroom + skb->len + priv->tailroom + 3; in p54_assign_address()
97 spin_lock_irqsave(&priv->tx_queue.lock, flags); in p54_assign_address()
98 if (unlikely(skb_queue_len(&priv->tx_queue) == 32)) { in p54_assign_address()
104 spin_unlock_irqrestore(&priv->tx_queue.lock, flags); in p54_assign_address()
108 skb_queue_walk(&priv->tx_queue, entry) { in p54_assign_address()
123 if (priv->rx_end - last_addr >= len) { in p54_assign_address()
124 target_skb = priv->tx_queue.prev; in p54_assign_address()
125 if (!skb_queue_empty(&priv->tx_queue)) { in p54_assign_address()
131 spin_unlock_irqrestore(&priv->tx_queue.lock, flags); in p54_assign_address()
140 data->req_id = cpu_to_le32(target_addr + priv->headroom); in p54_assign_address()
143 priv->beacon_req_id = data->req_id; in p54_assign_address()
145 __skb_queue_after(&priv->tx_queue, target_skb, skb); in p54_assign_address()
146 spin_unlock_irqrestore(&priv->tx_queue.lock, flags); in p54_assign_address()
150 static void p54_tx_pending(struct p54_common *priv) in p54_tx_pending() argument
155 skb = skb_dequeue(&priv->tx_pending); in p54_tx_pending()
159 ret = p54_assign_address(priv, skb); in p54_tx_pending()
161 skb_queue_head(&priv->tx_pending, skb); in p54_tx_pending()
163 priv->tx(priv->hw, skb); in p54_tx_pending()
166 static void p54_wake_queues(struct p54_common *priv) in p54_wake_queues() argument
171 if (unlikely(priv->mode == NL80211_IFTYPE_UNSPECIFIED)) in p54_wake_queues()
174 p54_tx_pending(priv); in p54_wake_queues()
176 spin_lock_irqsave(&priv->tx_stats_lock, flags); in p54_wake_queues()
177 for (i = 0; i < priv->hw->queues; i++) { in p54_wake_queues()
178 if (priv->tx_stats[i + P54_QUEUE_DATA].len < in p54_wake_queues()
179 priv->tx_stats[i + P54_QUEUE_DATA].limit) in p54_wake_queues()
180 ieee80211_wake_queue(priv->hw, i); in p54_wake_queues()
182 spin_unlock_irqrestore(&priv->tx_stats_lock, flags); in p54_wake_queues()
185 static int p54_tx_qos_accounting_alloc(struct p54_common *priv, in p54_tx_qos_accounting_alloc() argument
195 queue = &priv->tx_stats[p54_queue]; in p54_tx_qos_accounting_alloc()
197 spin_lock_irqsave(&priv->tx_stats_lock, flags); in p54_tx_qos_accounting_alloc()
199 spin_unlock_irqrestore(&priv->tx_stats_lock, flags); in p54_tx_qos_accounting_alloc()
208 ieee80211_stop_queue(priv->hw, ac_queue); in p54_tx_qos_accounting_alloc()
211 spin_unlock_irqrestore(&priv->tx_stats_lock, flags); in p54_tx_qos_accounting_alloc()
215 static void p54_tx_qos_accounting_free(struct p54_common *priv, in p54_tx_qos_accounting_free() argument
221 spin_lock_irqsave(&priv->tx_stats_lock, flags); in p54_tx_qos_accounting_free()
222 priv->tx_stats[GET_HW_QUEUE(skb)].len--; in p54_tx_qos_accounting_free()
223 spin_unlock_irqrestore(&priv->tx_stats_lock, flags); in p54_tx_qos_accounting_free()
226 if (priv->beacon_req_id == GET_REQ_ID(skb)) { in p54_tx_qos_accounting_free()
228 priv->beacon_req_id = 0; in p54_tx_qos_accounting_free()
230 complete(&priv->beacon_comp); in p54_tx_qos_accounting_free()
233 p54_wake_queues(priv); in p54_tx_qos_accounting_free()
238 struct p54_common *priv = dev->priv; in p54_free_skb() local
242 skb_unlink(skb, &priv->tx_queue); in p54_free_skb()
243 p54_tx_qos_accounting_free(priv, skb); in p54_free_skb()
248 static struct sk_buff *p54_find_and_unlink_skb(struct p54_common *priv, in p54_find_and_unlink_skb() argument
254 spin_lock_irqsave(&priv->tx_queue.lock, flags); in p54_find_and_unlink_skb()
255 skb_queue_walk(&priv->tx_queue, entry) { in p54_find_and_unlink_skb()
259 __skb_unlink(entry, &priv->tx_queue); in p54_find_and_unlink_skb()
260 spin_unlock_irqrestore(&priv->tx_queue.lock, flags); in p54_find_and_unlink_skb()
261 p54_tx_qos_accounting_free(priv, entry); in p54_find_and_unlink_skb()
265 spin_unlock_irqrestore(&priv->tx_queue.lock, flags); in p54_find_and_unlink_skb()
269 void p54_tx(struct p54_common *priv, struct sk_buff *skb) in p54_tx() argument
271 skb_queue_tail(&priv->tx_pending, skb); in p54_tx()
272 p54_tx_pending(priv); in p54_tx()
275 static int p54_rssi_to_dbm(struct p54_common *priv, int rssi) in p54_rssi_to_dbm() argument
277 if (priv->rxhw != 5) { in p54_rssi_to_dbm()
278 return ((rssi * priv->cur_rssi->mul) / 64 + in p54_rssi_to_dbm()
279 priv->cur_rssi->add) / 4; in p54_rssi_to_dbm()
294 static void p54_pspoll_workaround(struct p54_common *priv, struct sk_buff *skb) in p54_pspoll_workaround() argument
306 if (!priv->aid) in p54_pspoll_workaround()
310 if (!ether_addr_equal_64bits(hdr->addr3, priv->bssid)) in p54_pspoll_workaround()
320 new_psm = ieee80211_check_tim(tim_ie, tim_len, priv->aid); in p54_pspoll_workaround()
321 if (new_psm != priv->powersave_override) { in p54_pspoll_workaround()
322 priv->powersave_override = new_psm; in p54_pspoll_workaround()
323 p54_set_ps(priv); in p54_pspoll_workaround()
327 static int p54_rx_data(struct p54_common *priv, struct sk_buff *skb) in p54_rx_data() argument
341 if (unlikely(priv->mode == NL80211_IFTYPE_UNSPECIFIED)) in p54_rx_data()
353 rx_status->signal = p54_rssi_to_dbm(priv, hdr->rssi); in p54_rx_data()
356 if (priv->hw->conf.chandef.chan->band == IEEE80211_BAND_5GHZ) in p54_rx_data()
362 rx_status->band = priv->hw->conf.chandef.chan->band; in p54_rx_data()
366 if (tsf32 < priv->tsf_low32) in p54_rx_data()
367 priv->tsf_high32++; in p54_rx_data()
368 rx_status->mactime = ((u64)priv->tsf_high32) << 32 | tsf32; in p54_rx_data()
369 priv->tsf_low32 = tsf32; in p54_rx_data()
382 if (unlikely(priv->hw->conf.flags & IEEE80211_CONF_PS)) in p54_rx_data()
383 p54_pspoll_workaround(priv, skb); in p54_rx_data()
385 ieee80211_rx_irqsafe(priv->hw, skb); in p54_rx_data()
387 ieee80211_queue_delayed_work(priv->hw, &priv->work, in p54_rx_data()
393 static void p54_rx_frame_sent(struct p54_common *priv, struct sk_buff *skb) in p54_rx_frame_sent() argument
404 entry = p54_find_and_unlink_skb(priv, hdr->req_id); in p54_rx_frame_sent()
412 priv->stats.dot11ACKFailureCount += payload->tries - 1; in p54_rx_frame_sent()
456 info->status.ack_signal = p54_rssi_to_dbm(priv, in p54_rx_frame_sent()
483 ieee80211_tx_status_irqsafe(priv->hw, entry); in p54_rx_frame_sent()
486 static void p54_rx_eeprom_readback(struct p54_common *priv, in p54_rx_eeprom_readback() argument
493 if (!priv->eeprom) in p54_rx_eeprom_readback()
496 if (priv->fw_var >= 0x509) { in p54_rx_eeprom_readback()
497 memcpy(priv->eeprom, eeprom->v2.data, in p54_rx_eeprom_readback()
500 memcpy(priv->eeprom, eeprom->v1.data, in p54_rx_eeprom_readback()
504 priv->eeprom = NULL; in p54_rx_eeprom_readback()
505 tmp = p54_find_and_unlink_skb(priv, hdr->req_id); in p54_rx_eeprom_readback()
507 complete(&priv->eeprom_comp); in p54_rx_eeprom_readback()
510 static void p54_rx_stats(struct p54_common *priv, struct sk_buff *skb) in p54_rx_stats() argument
519 if (unlikely(priv->mode == NL80211_IFTYPE_UNSPECIFIED)) in p54_rx_stats()
523 if (tsf32 < priv->tsf_low32) in p54_rx_stats()
524 priv->tsf_high32++; in p54_rx_stats()
525 priv->tsf_low32 = tsf32; in p54_rx_stats()
527 priv->stats.dot11RTSFailureCount = le32_to_cpu(stats->rts_fail); in p54_rx_stats()
528 priv->stats.dot11RTSSuccessCount = le32_to_cpu(stats->rts_success); in p54_rx_stats()
529 priv->stats.dot11FCSErrorCount = le32_to_cpu(stats->rx_bad_fcs); in p54_rx_stats()
531 priv->noise = p54_rssi_to_dbm(priv, le32_to_cpu(stats->noise)); in p54_rx_stats()
538 dtime = tsf32 - priv->survey_raw.timestamp; in p54_rx_stats()
551 dcca = cca - priv->survey_raw.cached_cca; in p54_rx_stats()
552 drssi = rssi - priv->survey_raw.cached_rssi; in p54_rx_stats()
553 dtx = tx - priv->survey_raw.cached_tx; in p54_rx_stats()
560 if (dtotal && (priv->update_stats || dtime >= USEC_PER_SEC) && in p54_rx_stats()
562 priv->survey_raw.timestamp = tsf32; in p54_rx_stats()
563 priv->update_stats = false; in p54_rx_stats()
567 priv->survey_raw.cca += dcca * unit; in p54_rx_stats()
568 priv->survey_raw.cached_cca = cca; in p54_rx_stats()
571 priv->survey_raw.tx += dtx * unit; in p54_rx_stats()
572 priv->survey_raw.cached_tx = tx; in p54_rx_stats()
575 priv->survey_raw.rssi += drssi * unit; in p54_rx_stats()
576 priv->survey_raw.cached_rssi = rssi; in p54_rx_stats()
580 if (!(priv->phy_ps || priv->phy_idle)) in p54_rx_stats()
581 priv->survey_raw.active += dtotal * unit; in p54_rx_stats()
583 priv->survey_raw.active += (dcca + dtx) * unit; in p54_rx_stats()
586 chan = priv->curchan; in p54_rx_stats()
588 struct survey_info *survey = &priv->survey[chan->hw_value]; in p54_rx_stats()
589 survey->noise = clamp(priv->noise, -128, 127); in p54_rx_stats()
590 survey->time = priv->survey_raw.active; in p54_rx_stats()
591 survey->time_tx = priv->survey_raw.tx; in p54_rx_stats()
592 survey->time_busy = priv->survey_raw.tx + in p54_rx_stats()
593 priv->survey_raw.cca; in p54_rx_stats()
599 tmp = p54_find_and_unlink_skb(priv, hdr->req_id); in p54_rx_stats()
601 complete(&priv->stat_comp); in p54_rx_stats()
604 static void p54_rx_trap(struct p54_common *priv, struct sk_buff *skb) in p54_rx_trap() argument
615 wiphy_info(priv->hw->wiphy, "radar (freq:%d MHz)\n", freq); in p54_rx_trap()
618 if (priv->vif) in p54_rx_trap()
619 ieee80211_beacon_loss(priv->vif); in p54_rx_trap()
628 wiphy_rfkill_set_hw_state(priv->hw->wiphy, true); in p54_rx_trap()
631 wiphy_rfkill_set_hw_state(priv->hw->wiphy, false); in p54_rx_trap()
634 wiphy_info(priv->hw->wiphy, "received event:%x freq:%d\n", in p54_rx_trap()
640 static int p54_rx_control(struct p54_common *priv, struct sk_buff *skb) in p54_rx_control() argument
646 p54_rx_frame_sent(priv, skb); in p54_rx_control()
649 p54_rx_trap(priv, skb); in p54_rx_control()
654 p54_rx_stats(priv, skb); in p54_rx_control()
657 p54_rx_eeprom_readback(priv, skb); in p54_rx_control()
660 wiphy_debug(priv->hw->wiphy, in p54_rx_control()
671 struct p54_common *priv = dev->priv; in p54_rx() local
675 return p54_rx_control(priv, skb); in p54_rx()
677 return p54_rx_data(priv, skb); in p54_rx()
681 static void p54_tx_80211_header(struct p54_common *priv, struct sk_buff *skb, in p54_tx_80211_header() argument
705 switch (priv->mode) { in p54_tx_80211_header()
778 struct p54_common *priv = dev->priv; in p54_tx_80211() local
793 p54_tx_80211_header(priv, skb, info, control->sta, &queue, &extra_len, in p54_tx_80211()
796 if (p54_tx_qos_accounting_alloc(priv, skb, queue)) { in p54_tx_80211()
921 txhdr->backlog = priv->tx_stats[queue].len - 1; in p54_tx_80211()
923 txhdr->tx_antenna = 2 & priv->tx_diversity_mask; in p54_tx_80211()
924 if (priv->rxhw == 5) { in p54_tx_80211()
926 txhdr->longbow.output_power = cpu_to_le16(priv->output_power); in p54_tx_80211()
928 txhdr->normal.output_power = priv->output_power; in p54_tx_80211()
939 p54_tx(priv, skb); in p54_tx_80211()