]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
Merge remote-tracking branch 'sound-current/for-linus'
[karo-tx-linux.git] / drivers / net / wireless / brcm80211 / brcmfmac / fwsignal.c
index 5017eaa4af45fdd8f9dfd1034919c5042cce7cd8..086cac3f86d64bf41840f61e4c770dcb035363a5 100644 (file)
@@ -972,7 +972,7 @@ static void
 brcmf_fws_flow_control_check(struct brcmf_fws_info *fws, struct pktq *pq,
                             u8 if_id)
 {
-       struct brcmf_if *ifp = fws->drvr->iflist[!if_id ? 0 : if_id + 1];
+       struct brcmf_if *ifp = brcmf_get_ifp(fws->drvr, if_id);
 
        if (WARN_ON(!ifp))
                return;
@@ -1398,7 +1398,7 @@ done:
 }
 
 static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo,
-                                        struct sk_buff *skb, u8 ifidx,
+                                        struct sk_buff *skb,
                                         u32 genbit, u16 seq)
 {
        struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(skb)->mac;
@@ -1448,7 +1448,7 @@ brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot,
        struct sk_buff *skb;
        struct brcmf_skbuff_cb *skcb;
        struct brcmf_fws_mac_descriptor *entry = NULL;
-       u8 ifidx;
+       struct brcmf_if *ifp;
 
        brcmf_dbg(DATA, "flags %d\n", flags);
 
@@ -1497,15 +1497,16 @@ brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot,
        }
        brcmf_fws_macdesc_return_req_credit(skb);
 
-       if (brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb)) {
+       ret = brcmf_proto_hdrpull(fws->drvr, false, skb, &ifp);
+       if (ret) {
                brcmu_pkt_buf_free_skb(skb);
                return -EINVAL;
        }
        if (!remove_from_hanger)
-               ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, ifidx,
+               ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb,
                                                    genbit, seq);
        if (remove_from_hanger || ret)
-               brcmf_txfinalize(fws->drvr, skb, ifidx, true);
+               brcmf_txfinalize(ifp, skb, true);
 
        return 0;
 }
@@ -1615,11 +1616,10 @@ static int brcmf_fws_notify_bcmc_credit_support(struct brcmf_if *ifp,
        return 0;
 }
 
-int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
-                     struct sk_buff *skb)
+void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb)
 {
        struct brcmf_skb_reorder_data *rd;
-       struct brcmf_fws_info *fws = drvr->fws;
+       struct brcmf_fws_info *fws = ifp->drvr->fws;
        u8 *signal_data;
        s16 data_len;
        u8 type;
@@ -1629,20 +1629,20 @@ int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
        s32 err;
 
        brcmf_dbg(HDRS, "enter: ifidx %d, skblen %u, sig %d\n",
-                 ifidx, skb->len, signal_len);
+                 ifp->ifidx, skb->len, siglen);
 
-       WARN_ON(signal_len > skb->len);
+       WARN_ON(siglen > skb->len);
 
-       if (!signal_len)
-               return 0;
+       if (!siglen)
+               return;
        /* if flow control disabled, skip to packet data and leave */
        if ((!fws) || (!fws->fw_signals)) {
-               skb_pull(skb, signal_len);
-               return 0;
+               skb_pull(skb, siglen);
+               return;
        }
 
        fws->stats.header_pulls++;
-       data_len = signal_len;
+       data_len = siglen;
        signal_data = skb->data;
 
        status = BRCMF_FWS_RET_OK_NOSCHEDULE;
@@ -1730,14 +1730,12 @@ int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
        /* signalling processing result does
         * not affect the actual ethernet packet.
         */
-       skb_pull(skb, signal_len);
+       skb_pull(skb, siglen);
 
        /* this may be a signal-only packet
         */
        if (skb->len == 0)
                fws->stats.header_only_pkt++;
-
-       return 0;
 }
 
 static u8 brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo,
@@ -1848,7 +1846,7 @@ static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo,
                entry->transit_count--;
                if (entry->suppressed)
                        entry->suppr_transit_count--;
-               brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb);
+               (void)brcmf_proto_hdrpull(fws->drvr, false, skb, NULL);
                goto rollback;
        }
 
@@ -1904,7 +1902,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
        if (fws->avoid_queueing) {
                rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb);
                if (rc < 0)
-                       brcmf_txfinalize(drvr, skb, ifp->ifidx, false);
+                       brcmf_txfinalize(ifp, skb, false);
                return rc;
        }
 
@@ -1928,7 +1926,7 @@ 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");
-               brcmf_txfinalize(drvr, skb, ifp->ifidx, false);
+               brcmf_txfinalize(ifp, skb, false);
                rc = -ENOMEM;
        }
        brcmf_fws_unlock(fws);
@@ -2008,8 +2006,9 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
                                ret = brcmf_proto_txdata(drvr, ifidx, 0, skb);
                                brcmf_fws_lock(fws);
                                if (ret < 0)
-                                       brcmf_txfinalize(drvr, skb, ifidx,
-                                                        false);
+                                       brcmf_txfinalize(brcmf_get_ifp(drvr,
+                                                                      ifidx),
+                                                        skb, false);
                                if (fws->bus_flow_blocked)
                                        break;
                        }
@@ -2117,6 +2116,7 @@ static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data)
 int brcmf_fws_init(struct brcmf_pub *drvr)
 {
        struct brcmf_fws_info *fws;
+       struct brcmf_if *ifp;
        u32 tlv = BRCMF_FWS_FLAGS_RSSI_SIGNALS;
        int rc;
        u32 mode;
@@ -2176,21 +2176,22 @@ int brcmf_fws_init(struct brcmf_pub *drvr)
         * continue. Set mode back to none indicating not enabled.
         */
        fws->fw_signals = true;
-       if (brcmf_fil_iovar_int_set(drvr->iflist[0], "tlv", tlv)) {
+       ifp = brcmf_get_ifp(drvr, 0);
+       if (brcmf_fil_iovar_int_set(ifp, "tlv", tlv)) {
                brcmf_err("failed to set bdcv2 tlv signaling\n");
                fws->fcmode = BRCMF_FWS_FCMODE_NONE;
                fws->fw_signals = false;
        }
 
-       if (brcmf_fil_iovar_int_set(drvr->iflist[0], "ampdu_hostreorder", 1))
+       if (brcmf_fil_iovar_int_set(ifp, "ampdu_hostreorder", 1))
                brcmf_dbg(INFO, "enabling AMPDU host-reorder failed\n");
 
        /* Enable seq number reuse, if supported */
-       if (brcmf_fil_iovar_int_get(drvr->iflist[0], "wlfc_mode", &mode) == 0) {
+       if (brcmf_fil_iovar_int_get(ifp, "wlfc_mode", &mode) == 0) {
                if (BRCMF_FWS_MODE_GET_REUSESEQ(mode)) {
                        mode = 0;
                        BRCMF_FWS_MODE_SET_REUSESEQ(mode, 1);
-                       if (brcmf_fil_iovar_int_set(drvr->iflist[0],
+                       if (brcmf_fil_iovar_int_set(ifp,
                                                    "wlfc_mode", mode) == 0) {
                                BRCMF_FWS_MODE_SET_REUSESEQ(fws->mode, 1);
                        }