Loading drivers/atm/solos-pci.c +28 −2 Original line number Diff line number Diff line Loading @@ -132,6 +132,7 @@ static int fpga_tx(struct solos_card *); static irqreturn_t solos_irq(int irq, void *dev_id); static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci); static int list_vccs(int vci); static void release_vccs(struct atm_dev *dev); static int atm_init(struct solos_card *); static void atm_remove(struct solos_card *); static int send_command(struct solos_card *card, int dev, const char *buf, size_t size); Loading Loading @@ -332,7 +333,10 @@ static int process_status(struct solos_card *card, int port, struct sk_buff *skb str = next_string(skb); if (!strcmp(str, "Showtime")) state = ATM_PHY_SIG_FOUND; else state = ATM_PHY_SIG_LOST; else { state = ATM_PHY_SIG_LOST; release_vccs(card->atmdev[port]); } card->atmdev[port]->link_rate = rate_down; card->atmdev[port]->signal = state; Loading Loading @@ -683,7 +687,7 @@ static int list_vccs(int vci) vcc->vci); } } else { for(i=0; i<32; i++){ for(i = 0; i < VCC_HTABLE_SIZE; i++){ head = &vcc_hash[i]; sk_for_each(s, node, head) { num_found ++; Loading @@ -699,6 +703,28 @@ static int list_vccs(int vci) return num_found; } static void release_vccs(struct atm_dev *dev) { int i; write_lock_irq(&vcc_sklist_lock); for (i = 0; i < VCC_HTABLE_SIZE; i++) { struct hlist_head *head = &vcc_hash[i]; struct hlist_node *node, *tmp; struct sock *s; struct atm_vcc *vcc; sk_for_each_safe(s, node, tmp, head) { vcc = atm_sk(s); if (vcc->dev == dev) { vcc_release_async(vcc, -EPIPE); sk_del_node_init(s); } } } write_unlock_irq(&vcc_sklist_lock); } static int popen(struct atm_vcc *vcc) { Loading Loading
drivers/atm/solos-pci.c +28 −2 Original line number Diff line number Diff line Loading @@ -132,6 +132,7 @@ static int fpga_tx(struct solos_card *); static irqreturn_t solos_irq(int irq, void *dev_id); static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci); static int list_vccs(int vci); static void release_vccs(struct atm_dev *dev); static int atm_init(struct solos_card *); static void atm_remove(struct solos_card *); static int send_command(struct solos_card *card, int dev, const char *buf, size_t size); Loading Loading @@ -332,7 +333,10 @@ static int process_status(struct solos_card *card, int port, struct sk_buff *skb str = next_string(skb); if (!strcmp(str, "Showtime")) state = ATM_PHY_SIG_FOUND; else state = ATM_PHY_SIG_LOST; else { state = ATM_PHY_SIG_LOST; release_vccs(card->atmdev[port]); } card->atmdev[port]->link_rate = rate_down; card->atmdev[port]->signal = state; Loading Loading @@ -683,7 +687,7 @@ static int list_vccs(int vci) vcc->vci); } } else { for(i=0; i<32; i++){ for(i = 0; i < VCC_HTABLE_SIZE; i++){ head = &vcc_hash[i]; sk_for_each(s, node, head) { num_found ++; Loading @@ -699,6 +703,28 @@ static int list_vccs(int vci) return num_found; } static void release_vccs(struct atm_dev *dev) { int i; write_lock_irq(&vcc_sklist_lock); for (i = 0; i < VCC_HTABLE_SIZE; i++) { struct hlist_head *head = &vcc_hash[i]; struct hlist_node *node, *tmp; struct sock *s; struct atm_vcc *vcc; sk_for_each_safe(s, node, tmp, head) { vcc = atm_sk(s); if (vcc->dev == dev) { vcc_release_async(vcc, -EPIPE); sk_del_node_init(s); } } } write_unlock_irq(&vcc_sklist_lock); } static int popen(struct atm_vcc *vcc) { Loading