Fixed a kernel panic due to incorrect linux API use
authorbenoit <benoit@0192ed92-7a03-0410-a25b-9323aeb14dbd>
Thu, 10 Jan 2008 20:10:41 +0000 (20:10 +0000)
committerbenoit <benoit@0192ed92-7a03-0410-a25b-9323aeb14dbd>
Thu, 10 Jan 2008 20:10:41 +0000 (20:10 +0000)
hard_start_xmit() functions must either return NETDEV_TX_OK or
NETDEV_TX_BUSY (they might also return negative errno values as well,
like -ENETDOWN)
Correct a small missing static reported by sparse
This revert part of r3075

git-svn-id: http://madwifi-project.org/svn/madwifi/trunk@3123 0192ed92-7a03-0410-a25b-9323aeb14dbd

ath/if_ath.c
net80211/ieee80211_input.c
net80211/ieee80211_output.c
net80211/ieee80211_power.c
net80211/ieee80211_proto.h

index 357234ebf6078552c8665aafa323b48a36ea8377..372f59a5fd8b0d29c4ed2e6704e53a7ba966eb7d 100644 (file)
@@ -2958,6 +2958,7 @@ _take_txbuf(struct ath_softc *sc, int for_management) {
  * assumed to reclaim the resources.
  *
  * Context: process context with BHs disabled
+ * It mut return either NETDEV_TX_OK or NETDEV_TX_BUSY
  */
 static int
 ath_hardstart(struct sk_buff *skb, struct net_device *dev)
@@ -5873,7 +5874,7 @@ ath_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf)
  * created, otherwise the same SKB is used.
  *
  * NB: MAY ALLOCATE */
-struct sk_buff *
+static struct sk_buff *
 ath_skb_removepad(struct sk_buff *skb, unsigned int copy_skb)
 {
        struct sk_buff *tskb = skb;
index 3ef89f276d6b3473520514cd43e423105b2a2811..c8e20ca0e11985322f4219707acc7620fdf8147a 100644 (file)
@@ -3736,7 +3736,7 @@ ieee80211_recv_pspoll(struct ieee80211_node *ni, struct sk_buff *skb0)
        }
        M_PWR_SAV_SET(skb);             /* ensure MORE_DATA bit is set correctly */
 
-       (void)ieee80211_parent_queue_xmit(skb); /* Submit to parent device, including updating stats */
+       ieee80211_parent_queue_xmit(skb);       /* Submit to parent device, including updating stats */
 }
 
 #ifdef ATH_SUPERG_FF
index 729a861a39417da76ae8add8c7f8b4b33d407a47..4ed6ae5e5c68cd97e9d060e20ba8bb120f7867dc 100644 (file)
@@ -196,6 +196,7 @@ ieee80211_classify(struct ieee80211_node *ni, struct sk_buff *skb)
 
 /*
  * Context: process context (BHs disabled)
+ * It must return either NETDEV_TX_OK or NETDEV_TX_BUSY
  */
 int
 ieee80211_hardstart(struct sk_buff *skb, struct net_device *dev)
@@ -232,7 +233,8 @@ ieee80211_hardstart(struct sk_buff *skb, struct net_device *dev)
        
        if (vap->iv_opmode == IEEE80211_M_MONITOR) {
                ieee80211_monitor_encap(vap, skb);
-               return ieee80211_parent_queue_xmit(skb);
+               ieee80211_parent_queue_xmit(skb);
+               return NETDEV_TX_OK;
        }
        
        /* Cancel any running BG scan */
@@ -290,24 +292,28 @@ ieee80211_hardstart(struct sk_buff *skb, struct net_device *dev)
                        SKB_CB(skb1)->ni = ieee80211_find_txnode(vap->iv_xrvap, 
                                                       eh->ether_dhost);
                        /* Ignore this return code. */
-                       (void)ieee80211_parent_queue_xmit(skb1);
+                       ieee80211_parent_queue_xmit(skb1);
                }
        }
 #endif
        ieee80211_unref_node(&ni);
-       return ieee80211_parent_queue_xmit(skb);
+       ieee80211_parent_queue_xmit(skb);
+       return NETDEV_TX_OK;
 
 bad:
        if (skb != NULL)
                ieee80211_dev_kfree_skb(&skb);
        if (ni != NULL)
                ieee80211_unref_node(&ni);
-       return 0;
+       return NETDEV_TX_OK;
 }
 
-int ieee80211_parent_queue_xmit(struct sk_buff *skb) {
+/*
+ * skb is consumed in all cases
+ */
+
+void 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;
@@ -316,10 +322,9 @@ int ieee80211_parent_queue_xmit(struct sk_buff *skb) {
        /* Dispatch the packet to the parent device */
        skb->dev = vap->iv_ic->ic_dev;
 
-       if ((ret = dev_queue_xmit(skb)) == NET_XMIT_DROP)
+       if (dev_queue_xmit(skb) == NET_XMIT_DROP)
                vap->iv_devstats.tx_dropped++;
 
-       return ret;
 }
 
 /*
index 817ea6a7c9373d79f463209f18573eb1773270fc..d51bfe39544b6fba4a037cef4a4e170ae6f25736 100644 (file)
@@ -209,6 +209,7 @@ ieee80211_set_tim(struct ieee80211_node *ni, int set)
  * Save an outbound packet for a node in power-save sleep state.
  * The new packet is placed on the node's saved queue, and the TIM
  * is changed, if necessary.
+ * It must return either NETDEV_TX_OK or NETDEV_TX_BUSY
  */
 int
 ieee80211_pwrsave(struct sk_buff *skb)
@@ -231,7 +232,6 @@ ieee80211_pwrsave(struct sk_buff *skb)
                        ieee80211_dump_pkt(ni->ni_ic, skb->data, skb->len, -1, -1);
 #endif
                ieee80211_unref_node(&SKB_CB(skb)->ni);
-               ieee80211_dev_kfree_skb(&skb);
                return NETDEV_TX_BUSY;
        }
 
@@ -339,7 +339,7 @@ ieee80211_node_pwrsave(struct ieee80211_node *ni, int enable)
                                skb->dev = vap->iv_dev;         /* XXX? unnecessary */
 #endif
 
-                       (void)ieee80211_parent_queue_xmit(skb);
+                       ieee80211_parent_queue_xmit(skb);
                }
                vap->iv_set_tim(ni, 0);
        }
@@ -380,7 +380,7 @@ ieee80211_sta_pwrsave(struct ieee80211vap *vap, int enable)
                                IEEE80211_NODE_SAVEQ_UNLOCK_IRQ(ni);
                                if (skb == NULL)
                                        break;
-                               (void)ieee80211_parent_queue_xmit(skb);
+                               ieee80211_parent_queue_xmit(skb);
                        }
                }
        } else {
index eae3564dfc87f363be146b196e23683ddcd43a06..23e2f49f1c699fc09c77ac98693b0683684c08d2 100644 (file)
@@ -72,7 +72,7 @@ void ieee80211_saveath(struct ieee80211_node *, u_int8_t *);
 void ieee80211_recv_mgmt(struct ieee80211_node *, struct sk_buff *,
        int, int, u_int64_t);
 int ieee80211_hardstart(struct sk_buff *, struct net_device *);
-int ieee80211_parent_queue_xmit(struct sk_buff *);
+void 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);