Commit dc67c6b3 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann

mac802154: tx: remove xmit channel context switch

This patch removes the channel hopping feature before xmit. There are
several issues to provide a real channel hopping (timing requirements,
etc...).

We don't have any known kernelspace protocol which really use this
feature. And I don't know an real user of this feature.
We simply drop this feature now.

This patch removes also the hold of pib lock which isn't needed by any
real driver xmit callback implementation.
Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent e89e45f2
...@@ -113,8 +113,7 @@ struct ieee802154_hw { ...@@ -113,8 +113,7 @@ struct ieee802154_hw {
* skb cntains the buffer starting from the IEEE 802.15.4 header. * skb cntains the buffer starting from the IEEE 802.15.4 header.
* The low-level driver should send the frame based on available * The low-level driver should send the frame based on available
* configuration. * configuration.
* This function should return zero or negative errno. Called with * This function should return zero or negative errno.
* pib_lock held.
* *
* ed: Handler that 802.15.4 module calls for Energy Detection. * ed: Handler that 802.15.4 module calls for Energy Detection.
* This function should place the value for detected energy * This function should place the value for detected energy
......
...@@ -34,8 +34,6 @@ struct wpan_xmit_cb { ...@@ -34,8 +34,6 @@ struct wpan_xmit_cb {
struct sk_buff *skb; struct sk_buff *skb;
struct work_struct work; struct work_struct work;
struct ieee802154_local *local; struct ieee802154_local *local;
u8 chan;
u8 page;
}; };
static inline struct wpan_xmit_cb *wpan_xmit_cb(const struct sk_buff *skb) static inline struct wpan_xmit_cb *wpan_xmit_cb(const struct sk_buff *skb)
...@@ -53,26 +51,10 @@ static void mac802154_xmit_worker(struct work_struct *work) ...@@ -53,26 +51,10 @@ static void mac802154_xmit_worker(struct work_struct *work)
struct sk_buff *skb = cb->skb; struct sk_buff *skb = cb->skb;
int res; int res;
mutex_lock(&local->phy->pib_lock);
if (local->phy->current_channel != cb->chan ||
local->phy->current_page != cb->page) {
res = local->ops->set_channel(&local->hw, cb->page, cb->chan);
if (res) {
pr_debug("set_channel failed\n");
goto out;
}
local->phy->current_channel = cb->chan;
local->phy->current_page = cb->page;
}
res = local->ops->xmit(&local->hw, skb); res = local->ops->xmit(&local->hw, skb);
if (res) if (res)
pr_debug("transmission failed\n"); pr_debug("transmission failed\n");
out:
mutex_unlock(&local->phy->pib_lock);
/* Restart the netif queue on each sub_if_data object. */ /* Restart the netif queue on each sub_if_data object. */
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(sdata, &local->interfaces, list) list_for_each_entry_rcu(sdata, &local->interfaces, list)
...@@ -82,17 +64,12 @@ static void mac802154_xmit_worker(struct work_struct *work) ...@@ -82,17 +64,12 @@ static void mac802154_xmit_worker(struct work_struct *work)
dev_kfree_skb(skb); dev_kfree_skb(skb);
} }
static netdev_tx_t mac802154_tx(struct ieee802154_local *local, static netdev_tx_t
struct sk_buff *skb, u8 page, u8 chan) mac802154_tx(struct ieee802154_local *local, struct sk_buff *skb)
{ {
struct ieee802154_sub_if_data *sdata; struct ieee802154_sub_if_data *sdata;
struct wpan_xmit_cb *cb = wpan_xmit_cb(skb); struct wpan_xmit_cb *cb = wpan_xmit_cb(skb);
if (!(local->phy->channels_supported[page] & (1 << chan))) {
WARN_ON(1);
goto err_tx;
}
mac802154_monitors_rx(local, skb); mac802154_monitors_rx(local, skb);
if (!(local->hw.flags & IEEE802154_HW_OMIT_CKSUM)) { if (!(local->hw.flags & IEEE802154_HW_OMIT_CKSUM)) {
...@@ -115,8 +92,6 @@ static netdev_tx_t mac802154_tx(struct ieee802154_local *local, ...@@ -115,8 +92,6 @@ static netdev_tx_t mac802154_tx(struct ieee802154_local *local,
INIT_WORK(&cb->work, mac802154_xmit_worker); INIT_WORK(&cb->work, mac802154_xmit_worker);
cb->skb = skb; cb->skb = skb;
cb->local = local; cb->local = local;
cb->page = page;
cb->chan = chan;
queue_work(local->workqueue, &cb->work); queue_work(local->workqueue, &cb->work);
...@@ -130,44 +105,19 @@ static netdev_tx_t mac802154_tx(struct ieee802154_local *local, ...@@ -130,44 +105,19 @@ static netdev_tx_t mac802154_tx(struct ieee802154_local *local,
netdev_tx_t mac802154_monitor_xmit(struct sk_buff *skb, struct net_device *dev) netdev_tx_t mac802154_monitor_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
u8 chan, page;
/* FIXME: locking */
chan = sdata->local->phy->current_channel;
page = sdata->local->phy->current_page;
if (chan == MAC802154_CHAN_NONE) /* not initialized */
return NETDEV_TX_OK;
if (WARN_ON(page >= WPAN_NUM_PAGES) ||
WARN_ON(chan >= WPAN_NUM_CHANNELS))
return NETDEV_TX_OK;
skb->skb_iif = dev->ifindex; skb->skb_iif = dev->ifindex;
dev->stats.tx_packets++; dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len; dev->stats.tx_bytes += skb->len;
return mac802154_tx(sdata->local, skb, page, chan); return mac802154_tx(sdata->local, skb);
} }
netdev_tx_t mac802154_wpan_xmit(struct sk_buff *skb, struct net_device *dev) netdev_tx_t mac802154_wpan_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
u8 chan, page;
int rc; int rc;
spin_lock_bh(&sdata->mib_lock);
chan = sdata->chan;
page = sdata->page;
spin_unlock_bh(&sdata->mib_lock);
if (chan == MAC802154_CHAN_NONE ||
page >= WPAN_NUM_PAGES ||
chan >= WPAN_NUM_CHANNELS) {
kfree_skb(skb);
return NETDEV_TX_OK;
}
rc = mac802154_llsec_encrypt(&sdata->sec, skb); rc = mac802154_llsec_encrypt(&sdata->sec, skb);
if (rc) { if (rc) {
pr_warn("encryption failed: %i\n", rc); pr_warn("encryption failed: %i\n", rc);
...@@ -179,5 +129,5 @@ netdev_tx_t mac802154_wpan_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -179,5 +129,5 @@ netdev_tx_t mac802154_wpan_xmit(struct sk_buff *skb, struct net_device *dev)
dev->stats.tx_packets++; dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len; dev->stats.tx_bytes += skb->len;
return mac802154_tx(sdata->local, skb, page, chan); return mac802154_tx(sdata->local, skb);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment