/* Special reset function for Marathon card */ static void plx_pci_reset_marathon(struct pci_dev *pdev) { void __iomem *reset_addr; int i; int reset_bar[2] = {3, 5}; plx_pci_reset_common(pdev); for (i = 0; i < 2; i++) { reset_addr = pci_iomap(pdev, reset_bar[i], 0); if (!reset_addr) { dev_err(&pdev->dev, "Failed to remap reset " "space %d (BAR%d)\n", i, reset_bar[i]); } else { /* reset the SJA1000 chip */ iowrite8(0x1, reset_addr); udelay(100); pci_iounmap(pdev, reset_addr); } } }
/* Special reset function for ASEM Dual CAN raw card */ static void plx_pci_reset_asem_dual_can_raw(struct pci_dev *pdev) { void __iomem *bar0_addr; u8 tmpval; plx_pci_reset_common(pdev); bar0_addr = pci_iomap(pdev, 0, 0); if (!bar0_addr) { dev_err(&pdev->dev, "Failed to remap reset space 0 (BAR0)\n"); return; } /* reset the two SJA1000 chips */ tmpval = ioread8(bar0_addr + ASEM_RAW_CAN_RST_REGISTER); tmpval &= ~(ASEM_RAW_CAN_RST_MASK_CAN1 | ASEM_RAW_CAN_RST_MASK_CAN2); iowrite8(tmpval, bar0_addr + ASEM_RAW_CAN_RST_REGISTER); usleep_range(300, 400); tmpval |= ASEM_RAW_CAN_RST_MASK_CAN1 | ASEM_RAW_CAN_RST_MASK_CAN2; iowrite8(tmpval, bar0_addr + ASEM_RAW_CAN_RST_REGISTER); usleep_range(300, 400); pci_iounmap(pdev, bar0_addr); }
static void plx_pci_del_card(struct pci_dev *pdev) { struct plx_pci_card *card = pci_get_drvdata(pdev); struct net_device *dev; struct sja1000_priv *priv; int i = 0; for (i = 0; i < card->channels; i++) { dev = card->net_dev[i]; if (!dev) continue; dev_info(&pdev->dev, "Removing %s\n", dev->name); unregister_sja1000dev(dev); priv = netdev_priv(dev); if (priv->reg_base) pci_iounmap(pdev, priv->reg_base); free_sja1000dev(dev); } plx_pci_reset_common(pdev); /* * Disable interrupts from PCI-card (PLX90xx) and disable Local_1, * Local_2 interrupts */ iowrite32(0x0, card->conf_addr + PLX_INTCSR); if (card->conf_addr) pci_iounmap(pdev, card->conf_addr); kfree(card); pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); }