brcmfmac: Move handling 802.1x frames to dhd_linux.
authorHante Meuleman <meuleman@broadcom.com>
Mon, 12 May 2014 08:47:29 +0000 (10:47 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 13 May 2014 19:56:45 +0000 (15:56 -0400)
Tracking and handling of 802.1x frames is done in two modules, it
is more logical and clear to move this to dhd_linux module.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Daniel (Deognyoun) Kim <dekim@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
drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c

index 6056efd02fcde54ae7e4b86a39e04aab48e6832f..4cacc3d85212dcc58c70dc546c910c11a48dc3da 100644 (file)
@@ -190,7 +190,7 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
        int ret;
        struct brcmf_if *ifp = netdev_priv(ndev);
        struct brcmf_pub *drvr = ifp->drvr;
-       struct ethhdr *eh;
+       struct ethhdr *eh = (struct ethhdr *)(skb->data);
 
        brcmf_dbg(DATA, "Enter, idx=%d\n", ifp->bssidx);
 
@@ -236,6 +236,9 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
                goto done;
        }
 
+       if (eh->h_proto == htons(ETH_P_PAE))
+               atomic_inc(&ifp->pend_8021x_cnt);
+
        ret = brcmf_fws_process_skb(ifp, skb);
 
 done:
index bfe7c9aab65ca2ebb43456e8cd327b88d6bf8ffb..b58a97aa659a644d622c581f9201a531bb66f0e5 100644 (file)
@@ -1863,7 +1863,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
        struct ethhdr *eh = (struct ethhdr *)(skb->data);
        int fifo = BRCMF_FWS_FIFO_BCMC;
        bool multicast = is_multicast_ether_addr(eh->h_dest);
-       bool pae = eh->h_proto == htons(ETH_P_PAE);
+       int rc = 0;
 
        brcmf_dbg(DATA, "tx proto=0x%X\n", ntohs(eh->h_proto));
        /* determine the priority */
@@ -1871,8 +1871,6 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
                skb->priority = cfg80211_classify8021d(skb, NULL);
 
        drvr->tx_multicast += !!multicast;
-       if (pae)
-               atomic_inc(&ifp->pend_8021x_cnt);
 
        /* set control buffer information */
        skcb->if_flags = 0;
@@ -1894,15 +1892,12 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
                brcmf_fws_schedule_deq(fws);
        } else {
                brcmf_err("drop skb: no hanger slot\n");
-               if (pae) {
-                       atomic_dec(&ifp->pend_8021x_cnt);
-                       if (waitqueue_active(&ifp->pend_8021x_wait))
-                               wake_up(&ifp->pend_8021x_wait);
-               }
-               brcmu_pkt_buf_free_skb(skb);
+               brcmf_txfinalize(drvr, skb, ifp->ifidx, false);
+               rc = -ENOMEM;
        }
        brcmf_fws_unlock(fws);
-       return 0;
+
+       return rc;
 }
 
 void brcmf_fws_reset_interface(struct brcmf_if *ifp)