linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Arend van Spriel" <arend@broadcom.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: linux-wireless <linux-wireless@vger.kernel.org>,
	"Hante Meuleman" <meuleman@broadcom.com>,
	"Arend van Spriel" <arend@broadcom.com>
Subject: [PATCH for 3.10 14/16] brcmfmac: Signalling header push and pull on logic places.
Date: Wed, 29 May 2013 18:39:04 +0200	[thread overview]
Message-ID: <1369845546-31950-15-git-send-email-arend@broadcom.com> (raw)
In-Reply-To: <1369845546-31950-1-git-send-email-arend@broadcom.com>

From: Hante Meuleman <meuleman@broadcom.com>

Currently suppressed packets get enque-ed with header which
then gets pulled before transmit. It is more logical and clean
to pull the header on return and push it unconditionally on xmit.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c |   42 ++++++--------------
 1 file changed, 13 insertions(+), 29 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
index dd47796..8b2297a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
@@ -1263,6 +1263,7 @@ static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo,
 	struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(skb)->mac;
 	u32 hslot;
 	int ret;
+	u8 ifidx;
 
 	hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
 
@@ -1279,9 +1280,12 @@ static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo,
 
 	entry->generation = genbit;
 
-	ret = brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_SUPPRESSED, fifo, skb);
+	ret = brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb);
+	if (ret == 0)
+		ret = brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_SUPPRESSED, fifo,
+				    skb);
 	if (ret != 0) {
-		/* suppress q is full, drop this packet */
+		/* suppress q is full or hdrpull failed, drop this packet */
 		brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb,
 					true);
 	} else {
@@ -1585,18 +1589,10 @@ static int brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo,
 	bool first_time;
 	int hslot = BRCMF_FWS_HANGER_MAXITEMS;
 	u8 free_ctr;
-	u8 ifidx;
 	u8 flags;
 
 	first_time = skcb->state != BRCMF_FWS_SKBSTATE_SUPPRESSED;
 
-	if (!first_time) {
-		rc = brcmf_proto_hdrpull(fws->drvr, false, &ifidx, p);
-		if (rc) {
-			brcmf_err("hdrpull failed\n");
-			return rc;
-		}
-	}
 	brcmf_skb_if_flags_set_field(p, TRANSMIT, 1);
 	brcmf_skb_htod_tag_set_field(p, FIFO, fifo);
 	brcmf_skb_htod_tag_set_field(p, GENERATION, entry->generation);
@@ -1619,15 +1615,14 @@ static int brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo,
 		brcmf_skb_htod_tag_set_field(p, HSLOT, hslot);
 		brcmf_skb_htod_tag_set_field(p, FREERUN, free_ctr);
 		entry->transit_count++;
-	}
-
-	brcmf_fws_hdrpush(fws, p);
-	if (first_time) {
 		rc = brcmf_fws_hanger_pushpkt(&fws->hanger, p, hslot);
 		if (rc)
 			brcmf_err("hanger push failed: rc=%d\n", rc);
 	}
 
+	if (rc == 0)
+		brcmf_fws_hdrpush(fws, p);
+
 	return rc;
 }
 
@@ -1648,7 +1643,6 @@ brcmf_fws_rollback_toq(struct brcmf_fws_info *fws,
 	struct sk_buff *pktout;
 	int rc = 0;
 	int hslot;
-	u8 ifidx;
 
 	state = brcmf_skbcb(skb)->state;
 	entry = brcmf_skbcb(skb)->mac;
@@ -1665,17 +1659,6 @@ brcmf_fws_rollback_toq(struct brcmf_fws_info *fws,
 		} else {
 			hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
 
-			/* remove header first */
-			rc = brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb);
-			if (rc) {
-				brcmf_err("header removal failed\n");
-				/* free the hanger slot */
-				brcmf_fws_hanger_poppkt(&fws->hanger, hslot,
-							&pktout, true);
-				rc = -EINVAL;
-				goto fail;
-			}
-
 			/* delay-q packets are going to delay-q */
 			pktout = brcmu_pktq_penq_head(&entry->psq,
 						      2 * fifo, skb);
@@ -1696,8 +1679,6 @@ brcmf_fws_rollback_toq(struct brcmf_fws_info *fws,
 		rc = -ENOENT;
 	}
 
-
-fail:
 	if (rc) {
 		brcmf_fws_bustxfail(fws, skb);
 		fws->stats.rollback_failed++;
@@ -1767,6 +1748,7 @@ static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo,
 	struct brcmf_fws_mac_descriptor *entry;
 	struct brcmf_bus *bus = fws->drvr->bus_if;
 	int rc;
+	u8 ifidx;
 
 	entry = skcb->mac;
 	if (IS_ERR(entry))
@@ -1781,8 +1763,10 @@ static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo,
 	brcmf_dbg(DATA, "%s flags %X htod %X\n", entry->name, skcb->if_flags,
 		  skcb->htod);
 	rc = brcmf_bus_txdata(bus, skb);
-	if (rc < 0)
+	if (rc < 0) {
+		brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb);
 		goto rollback;
+	}
 
 	entry->seq[fifo]++;
 	fws->stats.pkt2bus++;
-- 
1.7.10.4



  parent reply	other threads:[~2013-05-29 16:39 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-29 16:38 [PATCH for 3.10 00/16] brcmfmac: firmware-signalling fixes Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 01/16] brcmfmac: allow firmware-signal tlv to be longer than specified Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 02/16] brcmfmac: remove fifo bitfield from brcmf_skbuff_cb::if_flags Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 03/16] brcmfmac: Take bus flowcontrol at credit mgmt into account Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 04/16] brcmfmac: rework credit pickup to assure consistent handling Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 05/16] brcmfmac: explicitly indicate sk_buff is sent upon request credit Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 06/16] brcmfmac: reducing debug logging in firmware-signalling code Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 07/16] brcmfmac: On bus flow control use fw signalling or netif Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 08/16] brcmfmac: For FW signalling it is necessary to track gen bit Arend van Spriel
2013-05-29 16:38 ` [PATCH for 3.10 09/16] brcmfmac: Correct creditmap when credit borrowing is active Arend van Spriel
2013-05-29 16:39 ` [PATCH for 3.10 10/16] brcmfmac: Sent TIM information in case of data available Arend van Spriel
2013-05-29 16:39 ` [PATCH for 3.10 11/16] brcmfmac: Find correct MAC descriptor in case of TDLS Arend van Spriel
2013-05-29 16:39 ` [PATCH for 3.10 12/16] brcmfmac: fix invalid ifp lookup in firmware-signalling Arend van Spriel
2013-05-29 16:39 ` [PATCH for 3.10 13/16] brcmfmac: Accept only first creditmap event Arend van Spriel
2013-05-29 16:39 ` Arend van Spriel [this message]
2013-05-29 16:39 ` [PATCH for 3.10 15/16] brcmfmac: Fix endless loop when brcmf_fws_commit_skb fails Arend van Spriel
2013-05-29 16:39 ` [PATCH for 3.10 16/16] brcmfmac: Simplify counting transit count Arend van Spriel
2013-05-29 16:47 ` [PATCH for 3.10 00/16] brcmfmac: firmware-signalling fixes Arend van Spriel
2013-05-29 18:44 ` John W. Linville
2013-05-29 19:23   ` Arend van Spriel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1369845546-31950-15-git-send-email-arend@broadcom.com \
    --to=arend@broadcom.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=meuleman@broadcom.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).