aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/atm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/atm')
-rw-r--r--drivers/atm/idt77252.c32
-rw-r--r--drivers/atm/idt77252.h4
2 files changed, 10 insertions, 26 deletions
diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c
index 3a504e94a4d9..e33ae0025b12 100644
--- a/drivers/atm/idt77252.c
+++ b/drivers/atm/idt77252.c
@@ -1114,11 +1114,8 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
1114 1114
1115 rpp = &vc->rcv.rx_pool; 1115 rpp = &vc->rcv.rx_pool;
1116 1116
1117 __skb_queue_tail(&rpp->queue, skb);
1117 rpp->len += skb->len; 1118 rpp->len += skb->len;
1118 if (!rpp->count++)
1119 rpp->first = skb;
1120 *rpp->last = skb;
1121 rpp->last = &skb->next;
1122 1119
1123 if (stat & SAR_RSQE_EPDU) { 1120 if (stat & SAR_RSQE_EPDU) {
1124 unsigned char *l1l2; 1121 unsigned char *l1l2;
@@ -1145,7 +1142,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
1145 atomic_inc(&vcc->stats->rx_err); 1142 atomic_inc(&vcc->stats->rx_err);
1146 return; 1143 return;
1147 } 1144 }
1148 if (rpp->count > 1) { 1145 if (skb_queue_len(&rpp->queue) > 1) {
1149 struct sk_buff *sb; 1146 struct sk_buff *sb;
1150 1147
1151 skb = dev_alloc_skb(rpp->len); 1148 skb = dev_alloc_skb(rpp->len);
@@ -1161,12 +1158,9 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
1161 dev_kfree_skb(skb); 1158 dev_kfree_skb(skb);
1162 return; 1159 return;
1163 } 1160 }
1164 sb = rpp->first; 1161 skb_queue_walk(&rpp->queue, sb)
1165 for (i = 0; i < rpp->count; i++) {
1166 memcpy(skb_put(skb, sb->len), 1162 memcpy(skb_put(skb, sb->len),
1167 sb->data, sb->len); 1163 sb->data, sb->len);
1168 sb = sb->next;
1169 }
1170 1164
1171 recycle_rx_pool_skb(card, rpp); 1165 recycle_rx_pool_skb(card, rpp);
1172 1166
@@ -1180,7 +1174,6 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
1180 return; 1174 return;
1181 } 1175 }
1182 1176
1183 skb->next = NULL;
1184 flush_rx_pool(card, rpp); 1177 flush_rx_pool(card, rpp);
1185 1178
1186 if (!atm_charge(vcc, skb->truesize)) { 1179 if (!atm_charge(vcc, skb->truesize)) {
@@ -1918,25 +1911,18 @@ recycle_rx_skb(struct idt77252_dev *card, struct sk_buff *skb)
1918static void 1911static void
1919flush_rx_pool(struct idt77252_dev *card, struct rx_pool *rpp) 1912flush_rx_pool(struct idt77252_dev *card, struct rx_pool *rpp)
1920{ 1913{
1914 skb_queue_head_init(&rpp->queue);
1921 rpp->len = 0; 1915 rpp->len = 0;
1922 rpp->count = 0;
1923 rpp->first = NULL;
1924 rpp->last = &rpp->first;
1925} 1916}
1926 1917
1927static void 1918static void
1928recycle_rx_pool_skb(struct idt77252_dev *card, struct rx_pool *rpp) 1919recycle_rx_pool_skb(struct idt77252_dev *card, struct rx_pool *rpp)
1929{ 1920{
1930 struct sk_buff *skb, *next; 1921 struct sk_buff *skb, *tmp;
1931 int i;
1932 1922
1933 skb = rpp->first; 1923 skb_queue_walk_safe(&rpp->queue, skb, tmp)
1934 for (i = 0; i < rpp->count; i++) {
1935 next = skb->next;
1936 skb->next = NULL;
1937 recycle_rx_skb(card, skb); 1924 recycle_rx_skb(card, skb);
1938 skb = next; 1925
1939 }
1940 flush_rx_pool(card, rpp); 1926 flush_rx_pool(card, rpp);
1941} 1927}
1942 1928
@@ -2537,7 +2523,7 @@ idt77252_close(struct atm_vcc *vcc)
2537 waitfor_idle(card); 2523 waitfor_idle(card);
2538 spin_unlock_irqrestore(&card->cmd_lock, flags); 2524 spin_unlock_irqrestore(&card->cmd_lock, flags);
2539 2525
2540 if (vc->rcv.rx_pool.count) { 2526 if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) {
2541 DPRINTK("%s: closing a VC with pending rx buffers.\n", 2527 DPRINTK("%s: closing a VC with pending rx buffers.\n",
2542 card->name); 2528 card->name);
2543 2529
@@ -2970,7 +2956,7 @@ close_card_oam(struct idt77252_dev *card)
2970 waitfor_idle(card); 2956 waitfor_idle(card);
2971 spin_unlock_irqrestore(&card->cmd_lock, flags); 2957 spin_unlock_irqrestore(&card->cmd_lock, flags);
2972 2958
2973 if (vc->rcv.rx_pool.count) { 2959 if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) {
2974 DPRINTK("%s: closing a VC " 2960 DPRINTK("%s: closing a VC "
2975 "with pending rx buffers.\n", 2961 "with pending rx buffers.\n",
2976 card->name); 2962 card->name);
diff --git a/drivers/atm/idt77252.h b/drivers/atm/idt77252.h
index e83eaf120da0..5042bb2dab15 100644
--- a/drivers/atm/idt77252.h
+++ b/drivers/atm/idt77252.h
@@ -173,10 +173,8 @@ struct scq_info
173}; 173};
174 174
175struct rx_pool { 175struct rx_pool {
176 struct sk_buff *first; 176 struct sk_buff_head queue;
177 struct sk_buff **last;
178 unsigned int len; 177 unsigned int len;
179 unsigned int count;
180}; 178};
181 179
182struct aal1 { 180struct aal1 {