Loading drivers/atm/solos-pci.c +29 −1 Original line number Original line Diff line number Diff line Loading @@ -1206,10 +1206,28 @@ static void atm_remove(struct solos_card *card) for (i = 0; i < card->nr_ports; i++) { for (i = 0; i < card->nr_ports; i++) { if (card->atmdev[i]) { if (card->atmdev[i]) { struct sk_buff *skb; dev_info(&card->dev->dev, "Unregistering ATM device %d\n", card->atmdev[i]->number); dev_info(&card->dev->dev, "Unregistering ATM device %d\n", card->atmdev[i]->number); sysfs_remove_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group); sysfs_remove_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group); atm_dev_deregister(card->atmdev[i]); atm_dev_deregister(card->atmdev[i]); skb = card->rx_skb[i]; if (skb) { pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr, RX_DMA_SIZE, PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); } skb = card->tx_skb[i]; if (skb) { pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb(skb); } while ((skb = skb_dequeue(&card->tx_queue[i]))) dev_kfree_skb(skb); } } } } } } Loading @@ -1218,12 +1236,22 @@ static void fpga_remove(struct pci_dev *dev) { { struct solos_card *card = pci_get_drvdata(dev); struct solos_card *card = pci_get_drvdata(dev); /* Disable IRQs */ iowrite32(0, card->config_regs + IRQ_EN_ADDR); /* Reset FPGA */ iowrite32(1, card->config_regs + FPGA_MODE); (void)ioread32(card->config_regs + FPGA_MODE); atm_remove(card); atm_remove(card); iowrite32(0, card->config_regs + IRQ_EN_ADDR); free_irq(dev->irq, card); free_irq(dev->irq, card); tasklet_kill(&card->tlet); tasklet_kill(&card->tlet); /* Release device from reset */ iowrite32(0, card->config_regs + FPGA_MODE); (void)ioread32(card->config_regs + FPGA_MODE); pci_iounmap(dev, card->buffers); pci_iounmap(dev, card->buffers); pci_iounmap(dev, card->config_regs); pci_iounmap(dev, card->config_regs); Loading Loading
drivers/atm/solos-pci.c +29 −1 Original line number Original line Diff line number Diff line Loading @@ -1206,10 +1206,28 @@ static void atm_remove(struct solos_card *card) for (i = 0; i < card->nr_ports; i++) { for (i = 0; i < card->nr_ports; i++) { if (card->atmdev[i]) { if (card->atmdev[i]) { struct sk_buff *skb; dev_info(&card->dev->dev, "Unregistering ATM device %d\n", card->atmdev[i]->number); dev_info(&card->dev->dev, "Unregistering ATM device %d\n", card->atmdev[i]->number); sysfs_remove_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group); sysfs_remove_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group); atm_dev_deregister(card->atmdev[i]); atm_dev_deregister(card->atmdev[i]); skb = card->rx_skb[i]; if (skb) { pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr, RX_DMA_SIZE, PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); } skb = card->tx_skb[i]; if (skb) { pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb(skb); } while ((skb = skb_dequeue(&card->tx_queue[i]))) dev_kfree_skb(skb); } } } } } } Loading @@ -1218,12 +1236,22 @@ static void fpga_remove(struct pci_dev *dev) { { struct solos_card *card = pci_get_drvdata(dev); struct solos_card *card = pci_get_drvdata(dev); /* Disable IRQs */ iowrite32(0, card->config_regs + IRQ_EN_ADDR); /* Reset FPGA */ iowrite32(1, card->config_regs + FPGA_MODE); (void)ioread32(card->config_regs + FPGA_MODE); atm_remove(card); atm_remove(card); iowrite32(0, card->config_regs + IRQ_EN_ADDR); free_irq(dev->irq, card); free_irq(dev->irq, card); tasklet_kill(&card->tlet); tasklet_kill(&card->tlet); /* Release device from reset */ iowrite32(0, card->config_regs + FPGA_MODE); (void)ioread32(card->config_regs + FPGA_MODE); pci_iounmap(dev, card->buffers); pci_iounmap(dev, card->buffers); pci_iounmap(dev, card->config_regs); pci_iounmap(dev, card->config_regs); Loading