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

Commit 371d72a1 authored by Brett Rudley's avatar Brett Rudley Committed by Greg Kroah-Hartman
Browse files

staging: brcm80211: relocate skb_get/free routines



Getting rid of os abstraction layer (ie. osl) is ongoing. Some
routines which are still required have been moved to bcmutils
module.

Reviewed-by: default avatarRoland Vossen <rvossen@broadcom.com>
Reviewed-by: default avatarBrett Rudley <brudley@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 235742ae
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -94,6 +94,11 @@ extern struct sk_buff *pktq_penq_head(struct pktq *pq, int prec,
extern struct sk_buff *pktq_pdeq(struct pktq *pq, int prec);
extern struct sk_buff *pktq_pdeq_tail(struct pktq *pq, int prec);

/* packet primitives */
extern struct sk_buff *pkt_buf_get_skb(struct osl_info *osh, uint len);
extern void pkt_buf_free_skb(struct osl_info *osh,
	struct sk_buff *skb, bool send);

/* Empty the queue at particular precedence level */
#ifdef BRCM_FULLMAC
	extern void pktq_pflush(struct osl_info *osh, struct pktq *pq, int prec,
+0 −3
Original line number Diff line number Diff line
@@ -176,8 +176,5 @@ extern uint osl_pci_slot(struct osl_info *osh);
	} while (0)
#endif				/* IL_BIGENDIAN */

/* packet primitives */
extern struct sk_buff *pkt_buf_get_skb(struct osl_info *osh, uint len);
extern void pkt_buf_free_skb(struct osl_info *osh, struct sk_buff *skb, bool send);

#endif /* _osl_h_ */
+46 −0
Original line number Diff line number Diff line
@@ -30,6 +30,52 @@
#include <proto/802.1d.h>
#include <proto/802.11.h>

struct sk_buff *BCMFASTPATH pkt_buf_get_skb(struct osl_info *osh, uint len)
{
	struct sk_buff *skb;

	skb = dev_alloc_skb(len);
	if (skb) {
		skb_put(skb, len);
		skb->priority = 0;

		osh->pktalloced++;
	}

	return skb;
}

/* Free the driver packet. Free the tag if present */
void BCMFASTPATH pkt_buf_free_skb(struct osl_info *osh,
	struct sk_buff *skb, bool send)
{
	struct sk_buff *nskb;
	int nest = 0;

	ASSERT(skb);

	/* perversion: we use skb->next to chain multi-skb packets */
	while (skb) {
		nskb = skb->next;
		skb->next = NULL;

		if (skb->destructor)
			/* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if
			 * destructor exists
			 */
			dev_kfree_skb_any(skb);
		else
			/* can free immediately (even in_irq()) if destructor
			 * does not exist
			 */
			dev_kfree_skb(skb);

		osh->pktalloced--;
		nest++;
		skb = nskb;
	}
}

/* copy a buffer into a pkt buffer chain */
uint pktfrombuf(struct osl_info *osh, struct sk_buff *p, uint offset, int len,
		unsigned char *buf)
+0 −45
Original line number Diff line number Diff line
@@ -78,51 +78,6 @@ void osl_detach(struct osl_info *osh)
	kfree(osh);
}

struct sk_buff *BCMFASTPATH pkt_buf_get_skb(struct osl_info *osh, uint len)
{
	struct sk_buff *skb;

	skb = dev_alloc_skb(len);
	if (skb) {
		skb_put(skb, len);
		skb->priority = 0;

		osh->pktalloced++;
	}

	return skb;
}

/* Free the driver packet. Free the tag if present */
void BCMFASTPATH pkt_buf_free_skb(struct osl_info *osh, struct sk_buff *skb, bool send)
{
	struct sk_buff *nskb;
	int nest = 0;

	ASSERT(skb);

	/* perversion: we use skb->next to chain multi-skb packets */
	while (skb) {
		nskb = skb->next;
		skb->next = NULL;

		if (skb->destructor)
			/* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if
			 * destructor exists
			 */
			dev_kfree_skb_any(skb);
		else
			/* can free immediately (even in_irq()) if destructor
			 * does not exist
			 */
			dev_kfree_skb(skb);

		osh->pktalloced--;
		nest++;
		skb = nskb;
	}
}

/* return bus # for the pci device pointed by osh->pdev */
uint osl_pci_bus(struct osl_info *osh)
{