brcmfmac: Return correct error on netdev xmit.
authorHante Meuleman <meuleman@broadcom.com>
Wed, 2 Jan 2013 14:22:49 +0000 (15:22 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 7 Jan 2013 20:16:58 +0000 (15:16 -0500)
Netdev xmit routine brcfm_netdev_start_xmit was defined
incorrectly and used wrong return codes. Always eat the
packet and return ok. Remove drvr_up check since it is not
relevant.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c

index 285a70ee9350bb71a1c4131ca89f39d8f30dd2e6..d655501305b08a3af03a9cd21dd724ca4bc832eb 100644 (file)
@@ -160,7 +160,8 @@ static void brcmf_netdev_set_multicast_list(struct net_device *ndev)
        schedule_work(&ifp->multicast_work);
 }
 
-static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *ndev)
+static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
+                                          struct net_device *ndev)
 {
        int ret;
        struct brcmf_if *ifp = netdev_priv(ndev);
@@ -169,20 +170,21 @@ static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 
        brcmf_dbg(TRACE, "Enter\n");
 
-       /* Reject if down */
-       if (!drvr->bus_if->drvr_up ||
-           (drvr->bus_if->state != BRCMF_BUS_DATA)) {
-               brcmf_err("xmit rejected drvup=%d state=%d\n",
-                         drvr->bus_if->drvr_up,
-                         drvr->bus_if->state);
+       /* Can the device send data? */
+       if (drvr->bus_if->state != BRCMF_BUS_DATA) {
+               brcmf_err("xmit rejected state=%d\n", drvr->bus_if->state);
                netif_stop_queue(ndev);
-               return -ENODEV;
+               dev_kfree_skb(skb);
+               ret = -ENODEV;
+               goto done;
        }
 
        if (!drvr->iflist[ifp->idx]) {
                brcmf_err("bad ifidx %d\n", ifp->idx);
                netif_stop_queue(ndev);
-               return -ENODEV;
+               dev_kfree_skb(skb);
+               ret = -ENODEV;
+               goto done;
        }
 
        /* Make sure there's enough room for any header */
@@ -230,7 +232,7 @@ done:
                drvr->bus_if->dstats.tx_packets++;
 
        /* Return ok: we always eat the packet */
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 void brcmf_txflowblock(struct device *dev, bool state)