+@@ -790,44 +791,6 @@ static struct atm_vcc *find_vcc(struct a
+ return vcc;
+ }
+
+-static int list_vccs(int vci)
+-{
+- struct hlist_head *head;
+- struct atm_vcc *vcc;
+- struct hlist_node *node;
+- struct sock *s;
+- int num_found = 0;
+- int i;
+-
+- read_lock(&vcc_sklist_lock);
+- if (vci != 0){
+- head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
+- sk_for_each(s, node, head) {
+- num_found ++;
+- vcc = atm_sk(s);
+- printk(KERN_DEBUG "Device: %d Vpi: %d Vci: %d\n",
+- vcc->dev->number,
+- vcc->vpi,
+- vcc->vci);
+- }
+- } else {
+- for(i = 0; i < VCC_HTABLE_SIZE; i++){
+- head = &vcc_hash[i];
+- sk_for_each(s, node, head) {
+- num_found ++;
+- vcc = atm_sk(s);
+- printk(KERN_DEBUG "Device: %d Vpi: %d Vci: %d\n",
+- vcc->dev->number,
+- vcc->vpi,
+- vcc->vci);
+- }
+- }
+- }
+- read_unlock(&vcc_sklist_lock);
+- return num_found;
+-}
+-
+-
+ static int popen(struct atm_vcc *vcc)
+ {
+ struct solos_card *card = vcc->dev->dev_data;
+@@ -840,7 +803,7 @@ static int popen(struct atm_vcc *vcc)
+ return -EINVAL;
+ }
+
+- skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
++ skb = alloc_skb(sizeof(*header), GFP_KERNEL);
+ if (!skb) {
+ if (net_ratelimit())
+ dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
+@@ -857,8 +820,6 @@ static int popen(struct atm_vcc *vcc)
+
+ set_bit(ATM_VF_ADDR, &vcc->flags);
+ set_bit(ATM_VF_READY, &vcc->flags);
+- list_vccs(0);
+-
+
+ return 0;
+ }
+@@ -866,10 +827,21 @@ static int popen(struct atm_vcc *vcc)
+ static void pclose(struct atm_vcc *vcc)
+ {
+ struct solos_card *card = vcc->dev->dev_data;
+- struct sk_buff *skb;
++ unsigned char port = SOLOS_CHAN(vcc->dev);
++ struct sk_buff *skb, *tmpskb;
+ struct pkt_hdr *header;
+
+- skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
++ /* Remove any yet-to-be-transmitted packets from the pending queue */
++ spin_lock(&card->tx_queue_lock);
++ skb_queue_walk_safe(&card->tx_queue[port], skb, tmpskb) {
++ if (SKB_CB(skb)->vcc == vcc) {
++ skb_unlink(skb, &card->tx_queue[port]);
++ solos_pop(vcc, skb);
++ }
++ }
++ spin_unlock(&card->tx_queue_lock);
++
++ skb = alloc_skb(sizeof(*header), GFP_KERNEL);
+ if (!skb) {
+ dev_warn(&card->dev->dev, "Failed to allocate sk_buff in pclose()\n");
+ return;
+@@ -881,15 +853,21 @@ static void pclose(struct atm_vcc *vcc)