diff options
| -rw-r--r-- | drivers/atm/solos-pci.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c index 6174965d9a4d..f916ddf63938 100644 --- a/drivers/atm/solos-pci.c +++ b/drivers/atm/solos-pci.c | |||
| @@ -781,7 +781,8 @@ static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci) | |||
| 781 | sk_for_each(s, node, head) { | 781 | sk_for_each(s, node, head) { |
| 782 | vcc = atm_sk(s); | 782 | vcc = atm_sk(s); |
| 783 | if (vcc->dev == dev && vcc->vci == vci && | 783 | if (vcc->dev == dev && vcc->vci == vci && |
| 784 | vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE) | 784 | vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE && |
| 785 | test_bit(ATM_VF_READY, &vcc->flags)) | ||
| 785 | goto out; | 786 | goto out; |
| 786 | } | 787 | } |
| 787 | vcc = NULL; | 788 | vcc = NULL; |
| @@ -907,6 +908,10 @@ static void pclose(struct atm_vcc *vcc) | |||
| 907 | clear_bit(ATM_VF_ADDR, &vcc->flags); | 908 | clear_bit(ATM_VF_ADDR, &vcc->flags); |
| 908 | clear_bit(ATM_VF_READY, &vcc->flags); | 909 | clear_bit(ATM_VF_READY, &vcc->flags); |
| 909 | 910 | ||
| 911 | /* Hold up vcc_destroy_socket() (our caller) until solos_bh() in the | ||
| 912 | tasklet has finished processing any incoming packets (and, more to | ||
| 913 | the point, using the vcc pointer). */ | ||
| 914 | tasklet_unlock_wait(&card->tlet); | ||
| 910 | return; | 915 | return; |
| 911 | } | 916 | } |
| 912 | 917 | ||
