Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8a16c68 authored by Christian Lamparter's avatar Christian Lamparter Committed by John W. Linville
Browse files

carl9170: common error path for bad frames



This patch replaces several identical frame drop
paths with a single shared rx frame error handler.

Signed-off-by: default avatarChristian Lamparter <chunkeey@googlemail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 12eec2cc
Loading
Loading
Loading
Loading
+20 −28
Original line number Diff line number Diff line
@@ -598,18 +598,14 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)
	if (!IS_STARTED(ar))
		return;

	if (unlikely(len < sizeof(*mac))) {
		ar->rx_dropped++;
		return;
	}
	if (unlikely(len < sizeof(*mac)))
		goto drop;

	mpdu_len = len - sizeof(*mac);

	mac = (void *)(buf + mpdu_len);
	if (unlikely(mac->error & AR9170_RX_ERROR_FATAL)) {
		ar->rx_dropped++;
		return;
	}
	if (unlikely(mac->error & AR9170_RX_ERROR_FATAL))
		goto drop;

	switch (mac->status & AR9170_RX_STATUS_MPDU) {
	case AR9170_RX_STATUS_MPDU_FIRST:
@@ -638,8 +634,7 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)
					"is clipped.\n");
			}

			ar->rx_dropped++;
			return;
			goto drop;
		}
		break;

@@ -659,8 +654,7 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)
					"is clipped.\n");
			}

			ar->rx_dropped++;
			return;
			goto drop;
		}

	case AR9170_RX_STATUS_MPDU_MIDDLE:
@@ -672,8 +666,7 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)
			wiphy_err(ar->hw->wiphy, "rx stream does not start "
					"with a first_mpdu frame tag.\n");

			ar->rx_dropped++;
			return;
			goto drop;
		}

		head = &ar->rx_plcp;
@@ -696,16 +689,12 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)
	}

	/* FC + DU + RA + FCS */
	if (unlikely(mpdu_len < (2 + 2 + 6 + FCS_LEN))) {
		ar->rx_dropped++;
		return;
	}
	if (unlikely(mpdu_len < (2 + 2 + ETH_ALEN + FCS_LEN)))
		goto drop;

	memset(&status, 0, sizeof(status));
	if (unlikely(carl9170_rx_mac_status(ar, head, mac, &status))) {
		ar->rx_dropped++;
		return;
	}
	if (unlikely(carl9170_rx_mac_status(ar, head, mac, &status)))
		goto drop;

	if (phy)
		carl9170_rx_phy_status(ar, phy, &status);
@@ -713,13 +702,16 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)
	carl9170_ps_beacon(ar, buf, mpdu_len);

	skb = carl9170_rx_copy_data(buf, mpdu_len);
	if (likely(skb)) {
	if (!skb)
		goto drop;

	memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status));
	ieee80211_rx(ar->hw, skb);
	} else {
	return;

drop:
	ar->rx_dropped++;
}
}

static void carl9170_rx_untie_cmds(struct ar9170 *ar, const u8 *respbuf,
				   const unsigned int resplen)