Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 277882
b: refs/heads/master
c: ad3b8b3
h: refs/heads/master
v: v3
  • Loading branch information
Arend van Spriel authored and John W. Linville committed Nov 11, 2011
1 parent fbec090 commit 21f7a36
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 99 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ad4d71f69ebe2acab75d0a8a66ab9f7609151cce
refs/heads/master: ad3b8b39189689dbff84c8a8edf024511b087f87
121 changes: 32 additions & 89 deletions trunk/drivers/net/wireless/brcm80211/brcmutil/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,21 +86,13 @@ EXPORT_SYMBOL(brcmu_pkttotlen);
struct sk_buff *brcmu_pktq_penq(struct pktq *pq, int prec,
struct sk_buff *p)
{
struct pktq_prec *q;
struct sk_buff_head *q;

if (pktq_full(pq) || pktq_pfull(pq, prec))
return NULL;

q = &pq->q[prec];

if (q->head)
q->tail->prev = p;
else
q->head = p;

q->tail = p;
q->len++;

q = &pq->q[prec].skblist;
skb_queue_tail(q, p);
pq->len++;

if (pq->hi_prec < prec)
Expand All @@ -113,20 +105,13 @@ EXPORT_SYMBOL(brcmu_pktq_penq);
struct sk_buff *brcmu_pktq_penq_head(struct pktq *pq, int prec,
struct sk_buff *p)
{
struct pktq_prec *q;
struct sk_buff_head *q;

if (pktq_full(pq) || pktq_pfull(pq, prec))
return NULL;

q = &pq->q[prec];

if (q->head == NULL)
q->tail = p;

p->prev = q->head;
q->head = p;
q->len++;

q = &pq->q[prec].skblist;
skb_queue_head(q, p);
pq->len++;

if (pq->hi_prec < prec)
Expand All @@ -138,53 +123,30 @@ EXPORT_SYMBOL(brcmu_pktq_penq_head);

struct sk_buff *brcmu_pktq_pdeq(struct pktq *pq, int prec)
{
struct pktq_prec *q;
struct sk_buff_head *q;
struct sk_buff *p;

q = &pq->q[prec];

p = q->head;
q = &pq->q[prec].skblist;
p = skb_dequeue(q);
if (p == NULL)
return NULL;

q->head = p->prev;
if (q->head == NULL)
q->tail = NULL;

q->len--;

pq->len--;

p->prev = NULL;

return p;
}
EXPORT_SYMBOL(brcmu_pktq_pdeq);

struct sk_buff *brcmu_pktq_pdeq_tail(struct pktq *pq, int prec)
{
struct pktq_prec *q;
struct sk_buff *p, *prev;

q = &pq->q[prec];
struct sk_buff_head *q;
struct sk_buff *p;

p = q->head;
q = &pq->q[prec].skblist;
p = skb_dequeue_tail(q);
if (p == NULL)
return NULL;

for (prev = NULL; p != q->tail; p = p->prev)
prev = p;

if (prev)
prev->prev = NULL;
else
q->head = NULL;

q->tail = prev;
q->len--;

pq->len--;

return p;
}
EXPORT_SYMBOL(brcmu_pktq_pdeq_tail);
Expand All @@ -193,31 +155,17 @@ void
brcmu_pktq_pflush(struct pktq *pq, int prec, bool dir,
bool (*fn)(struct sk_buff *, void *), void *arg)
{
struct pktq_prec *q;
struct sk_buff *p, *prev = NULL;
struct sk_buff_head *q;
struct sk_buff *p, *next;

q = &pq->q[prec];
p = q->head;
while (p) {
q = &pq->q[prec].skblist;
skb_queue_walk_safe(q, p, next) {
if (fn == NULL || (*fn) (p, arg)) {
bool head = (p == q->head);
if (head)
q->head = p->prev;
else
prev->prev = p->prev;
p->prev = NULL;
skb_unlink(p, q);
brcmu_pkt_buf_free_skb(p);
q->len--;
pq->len--;
p = (head ? q->head : prev->prev);
} else {
prev = p;
p = p->prev;
}
}

if (q->head == NULL)
q->tail = NULL;
}
EXPORT_SYMBOL(brcmu_pktq_pflush);

Expand All @@ -242,8 +190,10 @@ void brcmu_pktq_init(struct pktq *pq, int num_prec, int max_len)

pq->max = (u16) max_len;

for (prec = 0; prec < num_prec; prec++)
for (prec = 0; prec < num_prec; prec++) {
pq->q[prec].max = pq->max;
skb_queue_head_init(&pq->q[prec].skblist);
}
}
EXPORT_SYMBOL(brcmu_pktq_init);

Expand All @@ -255,13 +205,13 @@ struct sk_buff *brcmu_pktq_peek_tail(struct pktq *pq, int *prec_out)
return NULL;

for (prec = 0; prec < pq->hi_prec; prec++)
if (pq->q[prec].head)
if (!skb_queue_empty(&pq->q[prec].skblist))
break;

if (prec_out)
*prec_out = prec;

return pq->q[prec].tail;
return skb_peek_tail(&pq->q[prec].skblist);
}
EXPORT_SYMBOL(brcmu_pktq_peek_tail);

Expand All @@ -274,7 +224,7 @@ int brcmu_pktq_mlen(struct pktq *pq, uint prec_bmp)

for (prec = 0; prec <= pq->hi_prec; prec++)
if (prec_bmp & (1 << prec))
len += pq->q[prec].len;
len += pq->q[prec].skblist.qlen;

return len;
}
Expand All @@ -284,39 +234,32 @@ EXPORT_SYMBOL(brcmu_pktq_mlen);
struct sk_buff *brcmu_pktq_mdeq(struct pktq *pq, uint prec_bmp,
int *prec_out)
{
struct pktq_prec *q;
struct sk_buff_head *q;
struct sk_buff *p;
int prec;

if (pq->len == 0)
return NULL;

while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
while ((prec = pq->hi_prec) > 0 &&
skb_queue_empty(&pq->q[prec].skblist))
pq->hi_prec--;

while ((prec_bmp & (1 << prec)) == 0 || pq->q[prec].head == NULL)
while ((prec_bmp & (1 << prec)) == 0 ||
skb_queue_empty(&pq->q[prec].skblist))
if (prec-- == 0)
return NULL;

q = &pq->q[prec];

p = q->head;
q = &pq->q[prec].skblist;
p = skb_dequeue(q);
if (p == NULL)
return NULL;

q->head = p->prev;
if (q->head == NULL)
q->tail = NULL;

q->len--;
pq->len--;

if (prec_out)
*prec_out = prec;

pq->len--;

p->prev = NULL;

return p;
}
EXPORT_SYMBOL(brcmu_pktq_mdeq);
Expand Down
16 changes: 7 additions & 9 deletions trunk/drivers/net/wireless/brcm80211/include/brcmu_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,7 @@
#define ETHER_ADDR_STR_LEN 18

struct pktq_prec {
struct sk_buff *head; /* first packet to dequeue */
struct sk_buff *tail; /* last packet to dequeue */
u16 len; /* number of queued packets */
struct sk_buff_head skblist;
u16 max; /* maximum number of queued packets */
};

Expand All @@ -88,32 +86,32 @@ struct pktq {

static inline int pktq_plen(struct pktq *pq, int prec)
{
return pq->q[prec].len;
return pq->q[prec].skblist.qlen;
}

static inline int pktq_pavail(struct pktq *pq, int prec)
{
return pq->q[prec].max - pq->q[prec].len;
return pq->q[prec].max - pq->q[prec].skblist.qlen;
}

static inline bool pktq_pfull(struct pktq *pq, int prec)
{
return pq->q[prec].len >= pq->q[prec].max;
return pq->q[prec].skblist.qlen >= pq->q[prec].max;
}

static inline bool pktq_pempty(struct pktq *pq, int prec)
{
return pq->q[prec].len == 0;
return skb_queue_empty(&pq->q[prec].skblist);
}

static inline struct sk_buff *pktq_ppeek(struct pktq *pq, int prec)
{
return pq->q[prec].head;
return skb_peek(&pq->q[prec].skblist);
}

static inline struct sk_buff *pktq_ppeek_tail(struct pktq *pq, int prec)
{
return pq->q[prec].tail;
return skb_peek_tail(&pq->q[prec].skblist);
}

extern struct sk_buff *brcmu_pktq_penq(struct pktq *pq, int prec,
Expand Down

0 comments on commit 21f7a36

Please sign in to comment.