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

Commit ceade961 authored by David S. Miller's avatar David S. Miller
Browse files

atm: idt77252: Use generic SKB queue management instead of home-grown scheme.

parent 43f59c89
Loading
Loading
Loading
Loading
+9 −23
Original line number Diff line number Diff line
@@ -1114,11 +1114,8 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)

	rpp = &vc->rcv.rx_pool;

	__skb_queue_tail(&rpp->queue, skb);
	rpp->len += skb->len;
	if (!rpp->count++)
		rpp->first = skb;
	*rpp->last = skb;
	rpp->last = &skb->next;

	if (stat & SAR_RSQE_EPDU) {
		unsigned char *l1l2;
@@ -1145,7 +1142,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
			atomic_inc(&vcc->stats->rx_err);
			return;
		}
		if (rpp->count > 1) {
		if (skb_queue_len(&rpp->queue) > 1) {
			struct sk_buff *sb;

			skb = dev_alloc_skb(rpp->len);
@@ -1161,12 +1158,9 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
				dev_kfree_skb(skb);
				return;
			}
			sb = rpp->first;
			for (i = 0; i < rpp->count; i++) {
			skb_queue_walk(&rpp->queue, sb)
				memcpy(skb_put(skb, sb->len),
				       sb->data, sb->len);
				sb = sb->next;
			}

			recycle_rx_pool_skb(card, rpp);

@@ -1180,7 +1174,6 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
			return;
		}

		skb->next = NULL;
		flush_rx_pool(card, rpp);

		if (!atm_charge(vcc, skb->truesize)) {
@@ -1918,25 +1911,18 @@ recycle_rx_skb(struct idt77252_dev *card, struct sk_buff *skb)
static void
flush_rx_pool(struct idt77252_dev *card, struct rx_pool *rpp)
{
	skb_queue_head_init(&rpp->queue);
	rpp->len = 0;
	rpp->count = 0;
	rpp->first = NULL;
	rpp->last = &rpp->first;
}

static void
recycle_rx_pool_skb(struct idt77252_dev *card, struct rx_pool *rpp)
{
	struct sk_buff *skb, *next;
	int i;
	struct sk_buff *skb, *tmp;

	skb = rpp->first;
	for (i = 0; i < rpp->count; i++) {
		next = skb->next;
		skb->next = NULL;
	skb_queue_walk_safe(&rpp->queue, skb, tmp)
		recycle_rx_skb(card, skb);
		skb = next;
	}

	flush_rx_pool(card, rpp);
}

@@ -2537,7 +2523,7 @@ idt77252_close(struct atm_vcc *vcc)
		waitfor_idle(card);
		spin_unlock_irqrestore(&card->cmd_lock, flags);

		if (vc->rcv.rx_pool.count) {
		if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) {
			DPRINTK("%s: closing a VC with pending rx buffers.\n",
				card->name);

@@ -2970,7 +2956,7 @@ close_card_oam(struct idt77252_dev *card)
			waitfor_idle(card);
			spin_unlock_irqrestore(&card->cmd_lock, flags);

			if (vc->rcv.rx_pool.count) {
			if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) {
				DPRINTK("%s: closing a VC "
					"with pending rx buffers.\n",
					card->name);
+1 −3
Original line number Diff line number Diff line
@@ -173,10 +173,8 @@ struct scq_info
};

struct rx_pool {
	struct sk_buff		*first;
	struct sk_buff		**last;
	struct sk_buff_head	queue;
	unsigned int		len;
	unsigned int		count;
};

struct aal1 {