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);
 
        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 */
                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)