|
@@ -34,8 +34,6 @@ struct wpan_xmit_cb {
|
|
|
struct sk_buff *skb;
|
|
|
struct work_struct work;
|
|
|
struct ieee802154_local *local;
|
|
|
- u8 chan;
|
|
|
- u8 page;
|
|
|
};
|
|
|
|
|
|
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)
|
|
|
struct sk_buff *skb = cb->skb;
|
|
|
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);
|
|
|
if (res)
|
|
|
pr_debug("transmission failed\n");
|
|
|
|
|
|
-out:
|
|
|
- mutex_unlock(&local->phy->pib_lock);
|
|
|
-
|
|
|
/* Restart the netif queue on each sub_if_data object. */
|
|
|
rcu_read_lock();
|
|
|
list_for_each_entry_rcu(sdata, &local->interfaces, list)
|
|
@@ -82,17 +64,12 @@ out:
|
|
|
dev_kfree_skb(skb);
|
|
|
}
|
|
|
|
|
|
-static netdev_tx_t mac802154_tx(struct ieee802154_local *local,
|
|
|
- struct sk_buff *skb, u8 page, u8 chan)
|
|
|
+static netdev_tx_t
|
|
|
+mac802154_tx(struct ieee802154_local *local, struct sk_buff *skb)
|
|
|
{
|
|
|
struct ieee802154_sub_if_data *sdata;
|
|
|
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);
|
|
|
|
|
|
if (!(local->hw.flags & IEEE802154_HW_OMIT_CKSUM)) {
|
|
@@ -115,8 +92,6 @@ static netdev_tx_t mac802154_tx(struct ieee802154_local *local,
|
|
|
INIT_WORK(&cb->work, mac802154_xmit_worker);
|
|
|
cb->skb = skb;
|
|
|
cb->local = local;
|
|
|
- cb->page = page;
|
|
|
- cb->chan = chan;
|
|
|
|
|
|
queue_work(local->workqueue, &cb->work);
|
|
|
|
|
@@ -130,44 +105,19 @@ err_tx:
|
|
|
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);
|
|
|
- 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;
|
|
|
dev->stats.tx_packets++;
|
|
|
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)
|
|
|
{
|
|
|
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
|
|
|
- u8 chan, page;
|
|
|
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);
|
|
|
if (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)
|
|
|
dev->stats.tx_packets++;
|
|
|
dev->stats.tx_bytes += skb->len;
|
|
|
|
|
|
- return mac802154_tx(sdata->local, skb, page, chan);
|
|
|
+ return mac802154_tx(sdata->local, skb);
|
|
|
}
|