}
M_PWR_SAV_SET(skb); /* ensure MORE_DATA bit is set correctly */
- ieee80211_parent_queue_xmit(skb); /* Submit to parent device, including updating stats */
+ (void)ieee80211_parent_queue_xmit(skb); /* Submit to parent device, including updating stats */
}
#ifdef ATH_SUPERG_FF
if (vap->iv_opmode == IEEE80211_M_MONITOR) {
ieee80211_monitor_encap(vap, skb);
- ieee80211_parent_queue_xmit(skb);
- return 0;
+ return ieee80211_parent_queue_xmit(skb);
}
/* Cancel any running BG scan */
ni = ieee80211_find_txnode(vap, vap->wds_mac);
else
ni = ieee80211_find_txnode(vap, eh->ether_dhost);
-
if (ni == NULL) {
/* NB: ieee80211_find_txnode does stat+msg */
goto bad;
}
+
/* calculate priority so drivers can find the TX queue */
if (ieee80211_classify(ni, skb)) {
IEEE80211_NOTE(vap, IEEE80211_MSG_OUTPUT, ni,
/* XXXAPSD: assuming triggerable means deliverable */
M_FLAG_SET(skb, M_UAPSD);
} else if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT)) {
- /*
- * Station in power save mode; stick the frame
+ /* Station in power save mode; stick the frame
* on the STA's power save queue and continue.
- * We'll get the frame back when the time is right.
- */
- ieee80211_pwrsave(ni, skb);
+ * We'll get the frame back when the time is right. */
ieee80211_unref_node(&ni);
- return 0;
+ return ieee80211_pwrsave(skb);
}
dev->trans_start = jiffies;
#endif /* #ifdef IEEE80211_DEBUG_REFCNT */
SKB_CB(skb1)->ni = ieee80211_find_txnode(vap->iv_xrvap,
eh->ether_dhost);
- ieee80211_parent_queue_xmit(skb1);
+ /* Ignore this return code. */
+ (void)ieee80211_parent_queue_xmit(skb1);
}
}
#endif
- ieee80211_parent_queue_xmit(skb);
ieee80211_unref_node(&ni);
- return 0;
+ return ieee80211_parent_queue_xmit(skb);
bad:
if (skb != NULL)
return 0;
}
-void ieee80211_parent_queue_xmit(struct sk_buff *skb) {
+int ieee80211_parent_queue_xmit(struct sk_buff *skb) {
struct ieee80211vap *vap = skb->dev->priv;
+ int ret;
vap->iv_devstats.tx_packets++;
vap->iv_devstats.tx_bytes += skb->len;
/* Dispatch the packet to the parent device */
skb->dev = vap->iv_ic->ic_dev;
- if (dev_queue_xmit(skb) == NET_XMIT_DROP)
+ if ((ret = dev_queue_xmit(skb)) == NET_XMIT_DROP)
vap->iv_devstats.tx_dropped++;
+
+ return ret;
}
/*
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_proto.h>
+#ifndef NETDEV_TX_OK
+#define NETDEV_TX_OK 0
+#define NETDEV_TX_BUSY 1
+#endif
+
static void ieee80211_set_tim(struct ieee80211_node *ni, int set);
void
* The new packet is placed on the node's saved queue, and the TIM
* is changed, if necessary.
*/
-void
-ieee80211_pwrsave(struct ieee80211_node *ni, struct sk_buff *skb)
+int
+ieee80211_pwrsave(struct sk_buff *skb)
{
+ struct ieee80211_node *ni = SKB_CB(skb)->ni;
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
struct sk_buff *tail;
#endif
ieee80211_unref_node(&SKB_CB(skb)->ni);
ieee80211_dev_kfree_skb(&skb);
- return;
+ return NETDEV_TX_BUSY;
}
/*
if (qlen == 1 && vap->iv_set_tim != NULL)
vap->iv_set_tim(ni, 1);
+
+ return NETDEV_TX_OK;
}
/*
skb->dev = vap->iv_dev; /* XXX? unnecessary */
#endif
- ieee80211_parent_queue_xmit(skb);
+ (void)ieee80211_parent_queue_xmit(skb);
}
vap->iv_set_tim(ni, 0);
}
IEEE80211_NODE_SAVEQ_UNLOCK_IRQ(ni);
if (skb == NULL)
break;
- ieee80211_parent_queue_xmit(skb);
+ (void)ieee80211_parent_queue_xmit(skb);
}
}
} else {
int ieee80211_node_saveq_drain(struct ieee80211_node *);
int ieee80211_node_saveq_age(struct ieee80211_node *);
-void ieee80211_pwrsave(struct ieee80211_node *, struct sk_buff *);
+int ieee80211_pwrsave(struct sk_buff *);
void ieee80211_node_pwrsave(struct ieee80211_node *, int);
void ieee80211_sta_pwrsave(struct ieee80211vap *, int);
#endif /* _NET80211_IEEE80211_POWER_H_ */
void ieee80211_saveath(struct ieee80211_node *, u_int8_t *);
void ieee80211_recv_mgmt(struct ieee80211_node *, struct sk_buff *,
int, int, u_int64_t);
-void ieee80211_sta_pwrsave(struct ieee80211vap *, int);
int ieee80211_hardstart(struct sk_buff *, struct net_device *);
-void ieee80211_parent_queue_xmit(struct sk_buff *);
+int ieee80211_parent_queue_xmit(struct sk_buff *);
int ieee80211_send_nulldata(struct ieee80211_node *);
int ieee80211_send_qosnulldata(struct ieee80211_node *, int);
int ieee80211_send_mgmt(struct ieee80211_node *, int, int);
const u_int8_t bssid[IEEE80211_ADDR_LEN],
const u_int8_t *, size_t, const void *, size_t);
struct sk_buff *ieee80211_encap(struct ieee80211_node *, struct sk_buff *, int *);
-void ieee80211_pwrsave(struct ieee80211_node *, struct sk_buff *);
void ieee80211_reset_erp(struct ieee80211com *, enum ieee80211_phymode);
void ieee80211_set_shortslottime(struct ieee80211com *, int);