Blame view
net/mac802154/util.c
2.29 KB
1802d0bee
|
1 2 |
// SPDX-License-Identifier: GPL-2.0-only /* |
c20851035
|
3 4 5 6 7 8 9 10 |
* * Authors: * Alexander Aring <aar@pengutronix.de> * * Based on: net/mac80211/util.c */ #include "ieee802154_i.h" |
c4227c8a6
|
11 |
#include "driver-ops.h" |
c20851035
|
12 |
|
6322d50d8
|
13 14 |
/* privid for wpan_phys to determine whether they belong to us or not */ const void *const mac802154_wpan_phy_privid = &mac802154_wpan_phy_privid; |
c20851035
|
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
void ieee802154_wake_queue(struct ieee802154_hw *hw) { struct ieee802154_local *local = hw_to_local(hw); struct ieee802154_sub_if_data *sdata; rcu_read_lock(); list_for_each_entry_rcu(sdata, &local->interfaces, list) { if (!sdata->dev) continue; netif_wake_queue(sdata->dev); } rcu_read_unlock(); } EXPORT_SYMBOL(ieee802154_wake_queue); void ieee802154_stop_queue(struct ieee802154_hw *hw) { struct ieee802154_local *local = hw_to_local(hw); struct ieee802154_sub_if_data *sdata; rcu_read_lock(); list_for_each_entry_rcu(sdata, &local->interfaces, list) { if (!sdata->dev) continue; netif_stop_queue(sdata->dev); } rcu_read_unlock(); } EXPORT_SYMBOL(ieee802154_stop_queue); |
61f2dcba9
|
46 |
enum hrtimer_restart ieee802154_xmit_ifs_timer(struct hrtimer *timer) |
c20851035
|
47 |
{ |
61f2dcba9
|
48 49 50 51 52 53 54 55 56 57 58 59 60 |
struct ieee802154_local *local = container_of(timer, struct ieee802154_local, ifs_timer); ieee802154_wake_queue(&local->hw); return HRTIMER_NORESTART; } void ieee802154_xmit_complete(struct ieee802154_hw *hw, struct sk_buff *skb, bool ifs_handling) { if (ifs_handling) { struct ieee802154_local *local = hw_to_local(hw); |
3f3c4bb5e
|
61 |
u8 max_sifs_size; |
61f2dcba9
|
62 |
|
3f3c4bb5e
|
63 64 65 66 67 68 69 70 71 72 73 |
/* If transceiver sets CRC on his own we need to use lifs * threshold len above 16 otherwise 18, because it's not * part of skb->len. */ if (hw->flags & IEEE802154_HW_TX_OMIT_CKSUM) max_sifs_size = IEEE802154_MAX_SIFS_FRAME_SIZE - IEEE802154_FCS_LEN; else max_sifs_size = IEEE802154_MAX_SIFS_FRAME_SIZE; if (skb->len > max_sifs_size) |
61f2dcba9
|
74 |
hrtimer_start(&local->ifs_timer, |
8b0e19531
|
75 |
hw->phy->lifs_period * NSEC_PER_USEC, |
61f2dcba9
|
76 77 78 |
HRTIMER_MODE_REL); else hrtimer_start(&local->ifs_timer, |
8b0e19531
|
79 |
hw->phy->sifs_period * NSEC_PER_USEC, |
61f2dcba9
|
80 |
HRTIMER_MODE_REL); |
61f2dcba9
|
81 82 |
} else { ieee802154_wake_queue(hw); |
61f2dcba9
|
83 |
} |
3862eba69
|
84 85 |
dev_consume_skb_any(skb); |
c20851035
|
86 87 |
} EXPORT_SYMBOL(ieee802154_xmit_complete); |
c4227c8a6
|
88 89 90 91 92 93 94 |
void ieee802154_stop_device(struct ieee802154_local *local) { flush_workqueue(local->workqueue); hrtimer_cancel(&local->ifs_timer); drv_stop(local); } |