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

Commit 046808da authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville
Browse files

brcm80211: fmac: add function to free the glom skb queue



In several places in dhd_sdio.c a skb packet queue was being emptied
and the packets freed. This warrants to have a function in place to
do this.

Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: default avatarAlwin Beukers <alwin@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 53ee4bc4
Loading
Loading
Loading
Loading
+14 −20
Original line number Diff line number Diff line
@@ -1119,6 +1119,16 @@ static uint brcmf_sdbrcm_glom_len(struct brcmf_bus *bus)
	return total;
}

static void brcmf_sdbrcm_free_glom(struct brcmf_bus *bus)
{
	struct sk_buff *cur, *next;

	skb_queue_walk_safe(&bus->glom, cur, next) {
		skb_unlink(cur, &bus->glom);
		brcmu_pkt_buf_free_skb(cur);
	}
}

static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq)
{
	u16 dlen, totlen;
@@ -1203,11 +1213,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq)
			}
			pfirst = pnext = NULL;
		} else {
			if (!skb_queue_empty(&bus->glom))
				skb_queue_walk_safe(&bus->glom, pfirst, pnext) {
					skb_unlink(pfirst, &bus->glom);
					brcmu_pkt_buf_free_skb(pfirst);
				}
			brcmf_sdbrcm_free_glom(bus);
			num = 0;
		}

@@ -1274,10 +1280,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq)
				bus->glomerr = 0;
				brcmf_sdbrcm_rxfail(bus, true, false);
				bus->rxglomfail++;
				skb_queue_walk_safe(&bus->glom, pfirst, pnext) {
					skb_unlink(pfirst, &bus->glom);
					brcmu_pkt_buf_free_skb(pfirst);
				}
				brcmf_sdbrcm_free_glom(bus);
			}
			return 0;
		}
@@ -1399,10 +1402,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq)
				bus->glomerr = 0;
				brcmf_sdbrcm_rxfail(bus, true, false);
				bus->rxglomfail++;
				skb_queue_walk_safe(&bus->glom, pfirst, pnext) {
					skb_unlink(pfirst, &bus->glom);
					brcmu_pkt_buf_free_skb(pfirst);
				}
				brcmf_sdbrcm_free_glom(bus);
			}
			bus->nextlen = 0;
			return 0;
@@ -3369,8 +3369,6 @@ void brcmf_sdbrcm_bus_stop(struct brcmf_bus *bus)
	u8 saveclk;
	uint retries;
	int err;
	struct sk_buff *cur;
	struct sk_buff *next;

	brcmf_dbg(TRACE, "Enter\n");

@@ -3430,11 +3428,7 @@ void brcmf_sdbrcm_bus_stop(struct brcmf_bus *bus)
	/* Clear any held glomming stuff */
	if (bus->glomd)
		brcmu_pkt_buf_free_skb(bus->glomd);
	if (!skb_queue_empty(&bus->glom))
		skb_queue_walk_safe(&bus->glom, cur, next) {
			skb_unlink(cur, &bus->glom);
			brcmu_pkt_buf_free_skb(cur);
		}
	brcmf_sdbrcm_free_glom(bus);

	/* Clear rx control and wake any waiters */
	bus->rxlen = 0;