1*3878fb6fSWolfgang Grandegger /* 2*3878fb6fSWolfgang Grandegger * Copyright (C) 2008 Per Dalen <per.dalen@cnw.se> 3*3878fb6fSWolfgang Grandegger * 4*3878fb6fSWolfgang Grandegger * Parts of this software are based on (derived) the following: 5*3878fb6fSWolfgang Grandegger * 6*3878fb6fSWolfgang Grandegger * - Kvaser linux driver, version 4.72 BETA 7*3878fb6fSWolfgang Grandegger * Copyright (C) 2002-2007 KVASER AB 8*3878fb6fSWolfgang Grandegger * 9*3878fb6fSWolfgang Grandegger * - Lincan driver, version 0.3.3, OCERA project 10*3878fb6fSWolfgang Grandegger * Copyright (C) 2004 Pavel Pisa 11*3878fb6fSWolfgang Grandegger * Copyright (C) 2001 Arnaud Westenberg 12*3878fb6fSWolfgang Grandegger * 13*3878fb6fSWolfgang Grandegger * - Socketcan SJA1000 drivers 14*3878fb6fSWolfgang Grandegger * Copyright (C) 2007 Wolfgang Grandegger <wg@grandegger.com> 15*3878fb6fSWolfgang Grandegger * Copyright (c) 2002-2007 Volkswagen Group Electronic Research 16*3878fb6fSWolfgang Grandegger * Copyright (c) 2003 Matthias Brukner, Trajet Gmbh, Rebenring 33, 17*3878fb6fSWolfgang Grandegger * 38106 Braunschweig, GERMANY 18*3878fb6fSWolfgang Grandegger * 19*3878fb6fSWolfgang Grandegger * This program is free software; you can redistribute it and/or modify 20*3878fb6fSWolfgang Grandegger * it under the terms of the version 2 of the GNU General Public License 21*3878fb6fSWolfgang Grandegger * as published by the Free Software Foundation 22*3878fb6fSWolfgang Grandegger * 23*3878fb6fSWolfgang Grandegger * This program is distributed in the hope that it will be useful, but 24*3878fb6fSWolfgang Grandegger * WITHOUT ANY WARRANTY; without even the implied warranty of 25*3878fb6fSWolfgang Grandegger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 26*3878fb6fSWolfgang Grandegger * General Public License for more details. 27*3878fb6fSWolfgang Grandegger * 28*3878fb6fSWolfgang Grandegger * You should have received a copy of the GNU General Public License 29*3878fb6fSWolfgang Grandegger * along with this program; if not, write to the Free Software Foundation, 30*3878fb6fSWolfgang Grandegger * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 31*3878fb6fSWolfgang Grandegger */ 32*3878fb6fSWolfgang Grandegger 33*3878fb6fSWolfgang Grandegger #include <linux/kernel.h> 34*3878fb6fSWolfgang Grandegger #include <linux/module.h> 35*3878fb6fSWolfgang Grandegger #include <linux/interrupt.h> 36*3878fb6fSWolfgang Grandegger #include <linux/netdevice.h> 37*3878fb6fSWolfgang Grandegger #include <linux/delay.h> 38*3878fb6fSWolfgang Grandegger #include <linux/pci.h> 39*3878fb6fSWolfgang Grandegger #include <linux/can.h> 40*3878fb6fSWolfgang Grandegger #include <linux/can/dev.h> 41*3878fb6fSWolfgang Grandegger #include <linux/io.h> 42*3878fb6fSWolfgang Grandegger 43*3878fb6fSWolfgang Grandegger #include "sja1000.h" 44*3878fb6fSWolfgang Grandegger 45*3878fb6fSWolfgang Grandegger #define DRV_NAME "kvaser_pci" 46*3878fb6fSWolfgang Grandegger 47*3878fb6fSWolfgang Grandegger MODULE_AUTHOR("Per Dalen <per.dalen@cnw.se>"); 48*3878fb6fSWolfgang Grandegger MODULE_DESCRIPTION("Socket-CAN driver for KVASER PCAN PCI cards"); 49*3878fb6fSWolfgang Grandegger MODULE_SUPPORTED_DEVICE("KVASER PCAN PCI CAN card"); 50*3878fb6fSWolfgang Grandegger MODULE_LICENSE("GPL v2"); 51*3878fb6fSWolfgang Grandegger 52*3878fb6fSWolfgang Grandegger #define MAX_NO_OF_CHANNELS 4 /* max no of channels on a single card */ 53*3878fb6fSWolfgang Grandegger 54*3878fb6fSWolfgang Grandegger struct kvaser_pci { 55*3878fb6fSWolfgang Grandegger int channel; 56*3878fb6fSWolfgang Grandegger struct pci_dev *pci_dev; 57*3878fb6fSWolfgang Grandegger struct net_device *slave_dev[MAX_NO_OF_CHANNELS-1]; 58*3878fb6fSWolfgang Grandegger void __iomem *conf_addr; 59*3878fb6fSWolfgang Grandegger void __iomem *res_addr; 60*3878fb6fSWolfgang Grandegger int no_channels; 61*3878fb6fSWolfgang Grandegger u8 xilinx_ver; 62*3878fb6fSWolfgang Grandegger }; 63*3878fb6fSWolfgang Grandegger 64*3878fb6fSWolfgang Grandegger #define KVASER_PCI_CAN_CLOCK (16000000 / 2) 65*3878fb6fSWolfgang Grandegger 66*3878fb6fSWolfgang Grandegger /* 67*3878fb6fSWolfgang Grandegger * The board configuration is probably following: 68*3878fb6fSWolfgang Grandegger * RX1 is connected to ground. 69*3878fb6fSWolfgang Grandegger * TX1 is not connected. 70*3878fb6fSWolfgang Grandegger * CLKO is not connected. 71*3878fb6fSWolfgang Grandegger * Setting the OCR register to 0xDA is a good idea. 72*3878fb6fSWolfgang Grandegger * This means normal output mode , push-pull and the correct polarity. 73*3878fb6fSWolfgang Grandegger */ 74*3878fb6fSWolfgang Grandegger #define KVASER_PCI_OCR (OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL) 75*3878fb6fSWolfgang Grandegger 76*3878fb6fSWolfgang Grandegger /* 77*3878fb6fSWolfgang Grandegger * In the CDR register, you should set CBP to 1. 78*3878fb6fSWolfgang Grandegger * You will probably also want to set the clock divider value to 0 79*3878fb6fSWolfgang Grandegger * (meaning divide-by-2), the Pelican bit, and the clock-off bit 80*3878fb6fSWolfgang Grandegger * (you will have no need for CLKOUT anyway). 81*3878fb6fSWolfgang Grandegger */ 82*3878fb6fSWolfgang Grandegger #define KVASER_PCI_CDR (CDR_CBP | CDR_CLKOUT_MASK) 83*3878fb6fSWolfgang Grandegger 84*3878fb6fSWolfgang Grandegger /* 85*3878fb6fSWolfgang Grandegger * These register values are valid for revision 14 of the Xilinx logic. 86*3878fb6fSWolfgang Grandegger */ 87*3878fb6fSWolfgang Grandegger #define XILINX_VERINT 7 /* Lower nibble simulate interrupts, 88*3878fb6fSWolfgang Grandegger high nibble version number. */ 89*3878fb6fSWolfgang Grandegger 90*3878fb6fSWolfgang Grandegger #define XILINX_PRESUMED_VERSION 14 91*3878fb6fSWolfgang Grandegger 92*3878fb6fSWolfgang Grandegger /* 93*3878fb6fSWolfgang Grandegger * Important S5920 registers 94*3878fb6fSWolfgang Grandegger */ 95*3878fb6fSWolfgang Grandegger #define S5920_INTCSR 0x38 96*3878fb6fSWolfgang Grandegger #define S5920_PTCR 0x60 97*3878fb6fSWolfgang Grandegger #define INTCSR_ADDON_INTENABLE_M 0x2000 98*3878fb6fSWolfgang Grandegger 99*3878fb6fSWolfgang Grandegger 100*3878fb6fSWolfgang Grandegger #define KVASER_PCI_PORT_BYTES 0x20 101*3878fb6fSWolfgang Grandegger 102*3878fb6fSWolfgang Grandegger #define PCI_CONFIG_PORT_SIZE 0x80 /* size of the config io-memory */ 103*3878fb6fSWolfgang Grandegger #define PCI_PORT_SIZE 0x80 /* size of a channel io-memory */ 104*3878fb6fSWolfgang Grandegger #define PCI_PORT_XILINX_SIZE 0x08 /* size of a xilinx io-memory */ 105*3878fb6fSWolfgang Grandegger 106*3878fb6fSWolfgang Grandegger #define KVASER_PCI_VENDOR_ID1 0x10e8 /* the PCI device and vendor IDs */ 107*3878fb6fSWolfgang Grandegger #define KVASER_PCI_DEVICE_ID1 0x8406 108*3878fb6fSWolfgang Grandegger 109*3878fb6fSWolfgang Grandegger #define KVASER_PCI_VENDOR_ID2 0x1a07 /* the PCI device and vendor IDs */ 110*3878fb6fSWolfgang Grandegger #define KVASER_PCI_DEVICE_ID2 0x0008 111*3878fb6fSWolfgang Grandegger 112*3878fb6fSWolfgang Grandegger static struct pci_device_id kvaser_pci_tbl[] = { 113*3878fb6fSWolfgang Grandegger {KVASER_PCI_VENDOR_ID1, KVASER_PCI_DEVICE_ID1, PCI_ANY_ID, PCI_ANY_ID,}, 114*3878fb6fSWolfgang Grandegger {KVASER_PCI_VENDOR_ID2, KVASER_PCI_DEVICE_ID2, PCI_ANY_ID, PCI_ANY_ID,}, 115*3878fb6fSWolfgang Grandegger { 0,} 116*3878fb6fSWolfgang Grandegger }; 117*3878fb6fSWolfgang Grandegger 118*3878fb6fSWolfgang Grandegger MODULE_DEVICE_TABLE(pci, kvaser_pci_tbl); 119*3878fb6fSWolfgang Grandegger 120*3878fb6fSWolfgang Grandegger static u8 kvaser_pci_read_reg(const struct net_device *dev, int port) 121*3878fb6fSWolfgang Grandegger { 122*3878fb6fSWolfgang Grandegger return ioread8((void __iomem *)(dev->base_addr + port)); 123*3878fb6fSWolfgang Grandegger } 124*3878fb6fSWolfgang Grandegger 125*3878fb6fSWolfgang Grandegger static void kvaser_pci_write_reg(const struct net_device *dev, int port, u8 val) 126*3878fb6fSWolfgang Grandegger { 127*3878fb6fSWolfgang Grandegger iowrite8(val, (void __iomem *)(dev->base_addr + port)); 128*3878fb6fSWolfgang Grandegger } 129*3878fb6fSWolfgang Grandegger 130*3878fb6fSWolfgang Grandegger static void kvaser_pci_disable_irq(struct net_device *dev) 131*3878fb6fSWolfgang Grandegger { 132*3878fb6fSWolfgang Grandegger struct sja1000_priv *priv = netdev_priv(dev); 133*3878fb6fSWolfgang Grandegger struct kvaser_pci *board = priv->priv; 134*3878fb6fSWolfgang Grandegger u32 intcsr; 135*3878fb6fSWolfgang Grandegger 136*3878fb6fSWolfgang Grandegger /* Disable interrupts from card */ 137*3878fb6fSWolfgang Grandegger intcsr = ioread32(board->conf_addr + S5920_INTCSR); 138*3878fb6fSWolfgang Grandegger intcsr &= ~INTCSR_ADDON_INTENABLE_M; 139*3878fb6fSWolfgang Grandegger iowrite32(intcsr, board->conf_addr + S5920_INTCSR); 140*3878fb6fSWolfgang Grandegger } 141*3878fb6fSWolfgang Grandegger 142*3878fb6fSWolfgang Grandegger static void kvaser_pci_enable_irq(struct net_device *dev) 143*3878fb6fSWolfgang Grandegger { 144*3878fb6fSWolfgang Grandegger struct sja1000_priv *priv = netdev_priv(dev); 145*3878fb6fSWolfgang Grandegger struct kvaser_pci *board = priv->priv; 146*3878fb6fSWolfgang Grandegger u32 tmp_en_io; 147*3878fb6fSWolfgang Grandegger 148*3878fb6fSWolfgang Grandegger /* Enable interrupts from card */ 149*3878fb6fSWolfgang Grandegger tmp_en_io = ioread32(board->conf_addr + S5920_INTCSR); 150*3878fb6fSWolfgang Grandegger tmp_en_io |= INTCSR_ADDON_INTENABLE_M; 151*3878fb6fSWolfgang Grandegger iowrite32(tmp_en_io, board->conf_addr + S5920_INTCSR); 152*3878fb6fSWolfgang Grandegger } 153*3878fb6fSWolfgang Grandegger 154*3878fb6fSWolfgang Grandegger static int number_of_sja1000_chip(void __iomem *base_addr) 155*3878fb6fSWolfgang Grandegger { 156*3878fb6fSWolfgang Grandegger u8 status; 157*3878fb6fSWolfgang Grandegger int i; 158*3878fb6fSWolfgang Grandegger 159*3878fb6fSWolfgang Grandegger for (i = 0; i < MAX_NO_OF_CHANNELS; i++) { 160*3878fb6fSWolfgang Grandegger /* reset chip */ 161*3878fb6fSWolfgang Grandegger iowrite8(MOD_RM, base_addr + 162*3878fb6fSWolfgang Grandegger (i * KVASER_PCI_PORT_BYTES) + REG_MOD); 163*3878fb6fSWolfgang Grandegger status = ioread8(base_addr + 164*3878fb6fSWolfgang Grandegger (i * KVASER_PCI_PORT_BYTES) + REG_MOD); 165*3878fb6fSWolfgang Grandegger /* check reset bit */ 166*3878fb6fSWolfgang Grandegger if (!(status & MOD_RM)) 167*3878fb6fSWolfgang Grandegger break; 168*3878fb6fSWolfgang Grandegger } 169*3878fb6fSWolfgang Grandegger 170*3878fb6fSWolfgang Grandegger return i; 171*3878fb6fSWolfgang Grandegger } 172*3878fb6fSWolfgang Grandegger 173*3878fb6fSWolfgang Grandegger static void kvaser_pci_del_chan(struct net_device *dev) 174*3878fb6fSWolfgang Grandegger { 175*3878fb6fSWolfgang Grandegger struct sja1000_priv *priv; 176*3878fb6fSWolfgang Grandegger struct kvaser_pci *board; 177*3878fb6fSWolfgang Grandegger int i; 178*3878fb6fSWolfgang Grandegger 179*3878fb6fSWolfgang Grandegger if (!dev) 180*3878fb6fSWolfgang Grandegger return; 181*3878fb6fSWolfgang Grandegger priv = netdev_priv(dev); 182*3878fb6fSWolfgang Grandegger board = priv->priv; 183*3878fb6fSWolfgang Grandegger if (!board) 184*3878fb6fSWolfgang Grandegger return; 185*3878fb6fSWolfgang Grandegger 186*3878fb6fSWolfgang Grandegger dev_info(&board->pci_dev->dev, "Removing device %s\n", 187*3878fb6fSWolfgang Grandegger dev->name); 188*3878fb6fSWolfgang Grandegger 189*3878fb6fSWolfgang Grandegger /* Disable PCI interrupts */ 190*3878fb6fSWolfgang Grandegger kvaser_pci_disable_irq(dev); 191*3878fb6fSWolfgang Grandegger 192*3878fb6fSWolfgang Grandegger for (i = 0; i < board->no_channels - 1; i++) { 193*3878fb6fSWolfgang Grandegger if (board->slave_dev[i]) { 194*3878fb6fSWolfgang Grandegger dev_info(&board->pci_dev->dev, "Removing device %s\n", 195*3878fb6fSWolfgang Grandegger board->slave_dev[i]->name); 196*3878fb6fSWolfgang Grandegger unregister_sja1000dev(board->slave_dev[i]); 197*3878fb6fSWolfgang Grandegger free_sja1000dev(board->slave_dev[i]); 198*3878fb6fSWolfgang Grandegger } 199*3878fb6fSWolfgang Grandegger } 200*3878fb6fSWolfgang Grandegger unregister_sja1000dev(dev); 201*3878fb6fSWolfgang Grandegger 202*3878fb6fSWolfgang Grandegger pci_iounmap(board->pci_dev, (void __iomem *)dev->base_addr); 203*3878fb6fSWolfgang Grandegger pci_iounmap(board->pci_dev, board->conf_addr); 204*3878fb6fSWolfgang Grandegger pci_iounmap(board->pci_dev, board->res_addr); 205*3878fb6fSWolfgang Grandegger 206*3878fb6fSWolfgang Grandegger free_sja1000dev(dev); 207*3878fb6fSWolfgang Grandegger } 208*3878fb6fSWolfgang Grandegger 209*3878fb6fSWolfgang Grandegger static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel, 210*3878fb6fSWolfgang Grandegger struct net_device **master_dev, 211*3878fb6fSWolfgang Grandegger void __iomem *conf_addr, 212*3878fb6fSWolfgang Grandegger void __iomem *res_addr, 213*3878fb6fSWolfgang Grandegger unsigned long base_addr) 214*3878fb6fSWolfgang Grandegger { 215*3878fb6fSWolfgang Grandegger struct net_device *dev; 216*3878fb6fSWolfgang Grandegger struct sja1000_priv *priv; 217*3878fb6fSWolfgang Grandegger struct kvaser_pci *board; 218*3878fb6fSWolfgang Grandegger int err, init_step; 219*3878fb6fSWolfgang Grandegger 220*3878fb6fSWolfgang Grandegger dev = alloc_sja1000dev(sizeof(struct kvaser_pci)); 221*3878fb6fSWolfgang Grandegger if (dev == NULL) 222*3878fb6fSWolfgang Grandegger return -ENOMEM; 223*3878fb6fSWolfgang Grandegger 224*3878fb6fSWolfgang Grandegger priv = netdev_priv(dev); 225*3878fb6fSWolfgang Grandegger board = priv->priv; 226*3878fb6fSWolfgang Grandegger 227*3878fb6fSWolfgang Grandegger board->pci_dev = pdev; 228*3878fb6fSWolfgang Grandegger board->channel = channel; 229*3878fb6fSWolfgang Grandegger 230*3878fb6fSWolfgang Grandegger /* S5920 */ 231*3878fb6fSWolfgang Grandegger board->conf_addr = conf_addr; 232*3878fb6fSWolfgang Grandegger 233*3878fb6fSWolfgang Grandegger /* XILINX board wide address */ 234*3878fb6fSWolfgang Grandegger board->res_addr = res_addr; 235*3878fb6fSWolfgang Grandegger 236*3878fb6fSWolfgang Grandegger if (channel == 0) { 237*3878fb6fSWolfgang Grandegger board->xilinx_ver = 238*3878fb6fSWolfgang Grandegger ioread8(board->res_addr + XILINX_VERINT) >> 4; 239*3878fb6fSWolfgang Grandegger init_step = 2; 240*3878fb6fSWolfgang Grandegger 241*3878fb6fSWolfgang Grandegger /* Assert PTADR# - we're in passive mode so the other bits are 242*3878fb6fSWolfgang Grandegger not important */ 243*3878fb6fSWolfgang Grandegger iowrite32(0x80808080UL, board->conf_addr + S5920_PTCR); 244*3878fb6fSWolfgang Grandegger 245*3878fb6fSWolfgang Grandegger /* Enable interrupts from card */ 246*3878fb6fSWolfgang Grandegger kvaser_pci_enable_irq(dev); 247*3878fb6fSWolfgang Grandegger } else { 248*3878fb6fSWolfgang Grandegger struct sja1000_priv *master_priv = netdev_priv(*master_dev); 249*3878fb6fSWolfgang Grandegger struct kvaser_pci *master_board = master_priv->priv; 250*3878fb6fSWolfgang Grandegger master_board->slave_dev[channel - 1] = dev; 251*3878fb6fSWolfgang Grandegger master_board->no_channels = channel + 1; 252*3878fb6fSWolfgang Grandegger board->xilinx_ver = master_board->xilinx_ver; 253*3878fb6fSWolfgang Grandegger } 254*3878fb6fSWolfgang Grandegger 255*3878fb6fSWolfgang Grandegger dev->base_addr = base_addr + channel * KVASER_PCI_PORT_BYTES; 256*3878fb6fSWolfgang Grandegger 257*3878fb6fSWolfgang Grandegger priv->read_reg = kvaser_pci_read_reg; 258*3878fb6fSWolfgang Grandegger priv->write_reg = kvaser_pci_write_reg; 259*3878fb6fSWolfgang Grandegger 260*3878fb6fSWolfgang Grandegger priv->can.clock.freq = KVASER_PCI_CAN_CLOCK; 261*3878fb6fSWolfgang Grandegger 262*3878fb6fSWolfgang Grandegger priv->ocr = KVASER_PCI_OCR; 263*3878fb6fSWolfgang Grandegger priv->cdr = KVASER_PCI_CDR; 264*3878fb6fSWolfgang Grandegger 265*3878fb6fSWolfgang Grandegger priv->irq_flags = IRQF_SHARED; 266*3878fb6fSWolfgang Grandegger dev->irq = pdev->irq; 267*3878fb6fSWolfgang Grandegger 268*3878fb6fSWolfgang Grandegger init_step = 4; 269*3878fb6fSWolfgang Grandegger 270*3878fb6fSWolfgang Grandegger dev_info(&pdev->dev, "base_addr=%#lx conf_addr=%p irq=%d\n", 271*3878fb6fSWolfgang Grandegger dev->base_addr, board->conf_addr, dev->irq); 272*3878fb6fSWolfgang Grandegger 273*3878fb6fSWolfgang Grandegger SET_NETDEV_DEV(dev, &pdev->dev); 274*3878fb6fSWolfgang Grandegger 275*3878fb6fSWolfgang Grandegger /* Register SJA1000 device */ 276*3878fb6fSWolfgang Grandegger err = register_sja1000dev(dev); 277*3878fb6fSWolfgang Grandegger if (err) { 278*3878fb6fSWolfgang Grandegger dev_err(&pdev->dev, "Registering device failed (err=%d)\n", 279*3878fb6fSWolfgang Grandegger err); 280*3878fb6fSWolfgang Grandegger goto failure; 281*3878fb6fSWolfgang Grandegger } 282*3878fb6fSWolfgang Grandegger 283*3878fb6fSWolfgang Grandegger if (channel == 0) 284*3878fb6fSWolfgang Grandegger *master_dev = dev; 285*3878fb6fSWolfgang Grandegger 286*3878fb6fSWolfgang Grandegger return 0; 287*3878fb6fSWolfgang Grandegger 288*3878fb6fSWolfgang Grandegger failure: 289*3878fb6fSWolfgang Grandegger kvaser_pci_del_chan(dev); 290*3878fb6fSWolfgang Grandegger return err; 291*3878fb6fSWolfgang Grandegger } 292*3878fb6fSWolfgang Grandegger 293*3878fb6fSWolfgang Grandegger static int __devinit kvaser_pci_init_one(struct pci_dev *pdev, 294*3878fb6fSWolfgang Grandegger const struct pci_device_id *ent) 295*3878fb6fSWolfgang Grandegger { 296*3878fb6fSWolfgang Grandegger int err; 297*3878fb6fSWolfgang Grandegger struct net_device *master_dev = NULL; 298*3878fb6fSWolfgang Grandegger struct sja1000_priv *priv; 299*3878fb6fSWolfgang Grandegger struct kvaser_pci *board; 300*3878fb6fSWolfgang Grandegger int no_channels; 301*3878fb6fSWolfgang Grandegger void __iomem *base_addr = NULL; 302*3878fb6fSWolfgang Grandegger void __iomem *conf_addr = NULL; 303*3878fb6fSWolfgang Grandegger void __iomem *res_addr = NULL; 304*3878fb6fSWolfgang Grandegger int i; 305*3878fb6fSWolfgang Grandegger 306*3878fb6fSWolfgang Grandegger dev_info(&pdev->dev, "initializing device %04x:%04x\n", 307*3878fb6fSWolfgang Grandegger pdev->vendor, pdev->device); 308*3878fb6fSWolfgang Grandegger 309*3878fb6fSWolfgang Grandegger err = pci_enable_device(pdev); 310*3878fb6fSWolfgang Grandegger if (err) 311*3878fb6fSWolfgang Grandegger goto failure; 312*3878fb6fSWolfgang Grandegger 313*3878fb6fSWolfgang Grandegger err = pci_request_regions(pdev, DRV_NAME); 314*3878fb6fSWolfgang Grandegger if (err) 315*3878fb6fSWolfgang Grandegger goto failure_release_pci; 316*3878fb6fSWolfgang Grandegger 317*3878fb6fSWolfgang Grandegger /* S5920 */ 318*3878fb6fSWolfgang Grandegger conf_addr = pci_iomap(pdev, 0, PCI_CONFIG_PORT_SIZE); 319*3878fb6fSWolfgang Grandegger if (conf_addr == NULL) { 320*3878fb6fSWolfgang Grandegger err = -ENODEV; 321*3878fb6fSWolfgang Grandegger goto failure_release_regions; 322*3878fb6fSWolfgang Grandegger } 323*3878fb6fSWolfgang Grandegger 324*3878fb6fSWolfgang Grandegger /* XILINX board wide address */ 325*3878fb6fSWolfgang Grandegger res_addr = pci_iomap(pdev, 2, PCI_PORT_XILINX_SIZE); 326*3878fb6fSWolfgang Grandegger if (res_addr == NULL) { 327*3878fb6fSWolfgang Grandegger err = -ENOMEM; 328*3878fb6fSWolfgang Grandegger goto failure_iounmap; 329*3878fb6fSWolfgang Grandegger } 330*3878fb6fSWolfgang Grandegger 331*3878fb6fSWolfgang Grandegger base_addr = pci_iomap(pdev, 1, PCI_PORT_SIZE); 332*3878fb6fSWolfgang Grandegger if (base_addr == NULL) { 333*3878fb6fSWolfgang Grandegger err = -ENOMEM; 334*3878fb6fSWolfgang Grandegger goto failure_iounmap; 335*3878fb6fSWolfgang Grandegger } 336*3878fb6fSWolfgang Grandegger 337*3878fb6fSWolfgang Grandegger no_channels = number_of_sja1000_chip(base_addr); 338*3878fb6fSWolfgang Grandegger if (no_channels == 0) { 339*3878fb6fSWolfgang Grandegger err = -ENOMEM; 340*3878fb6fSWolfgang Grandegger goto failure_iounmap; 341*3878fb6fSWolfgang Grandegger } 342*3878fb6fSWolfgang Grandegger 343*3878fb6fSWolfgang Grandegger for (i = 0; i < no_channels; i++) { 344*3878fb6fSWolfgang Grandegger err = kvaser_pci_add_chan(pdev, i, &master_dev, 345*3878fb6fSWolfgang Grandegger conf_addr, res_addr, 346*3878fb6fSWolfgang Grandegger (unsigned long)base_addr); 347*3878fb6fSWolfgang Grandegger if (err) 348*3878fb6fSWolfgang Grandegger goto failure_cleanup; 349*3878fb6fSWolfgang Grandegger } 350*3878fb6fSWolfgang Grandegger 351*3878fb6fSWolfgang Grandegger priv = netdev_priv(master_dev); 352*3878fb6fSWolfgang Grandegger board = priv->priv; 353*3878fb6fSWolfgang Grandegger 354*3878fb6fSWolfgang Grandegger dev_info(&pdev->dev, "xilinx version=%d number of channels=%d\n", 355*3878fb6fSWolfgang Grandegger board->xilinx_ver, board->no_channels); 356*3878fb6fSWolfgang Grandegger 357*3878fb6fSWolfgang Grandegger pci_set_drvdata(pdev, master_dev); 358*3878fb6fSWolfgang Grandegger return 0; 359*3878fb6fSWolfgang Grandegger 360*3878fb6fSWolfgang Grandegger failure_cleanup: 361*3878fb6fSWolfgang Grandegger kvaser_pci_del_chan(master_dev); 362*3878fb6fSWolfgang Grandegger 363*3878fb6fSWolfgang Grandegger failure_iounmap: 364*3878fb6fSWolfgang Grandegger if (conf_addr != NULL) 365*3878fb6fSWolfgang Grandegger pci_iounmap(pdev, conf_addr); 366*3878fb6fSWolfgang Grandegger if (res_addr != NULL) 367*3878fb6fSWolfgang Grandegger pci_iounmap(pdev, res_addr); 368*3878fb6fSWolfgang Grandegger if (base_addr != NULL) 369*3878fb6fSWolfgang Grandegger pci_iounmap(pdev, base_addr); 370*3878fb6fSWolfgang Grandegger 371*3878fb6fSWolfgang Grandegger failure_release_regions: 372*3878fb6fSWolfgang Grandegger pci_release_regions(pdev); 373*3878fb6fSWolfgang Grandegger 374*3878fb6fSWolfgang Grandegger failure_release_pci: 375*3878fb6fSWolfgang Grandegger pci_disable_device(pdev); 376*3878fb6fSWolfgang Grandegger 377*3878fb6fSWolfgang Grandegger failure: 378*3878fb6fSWolfgang Grandegger return err; 379*3878fb6fSWolfgang Grandegger 380*3878fb6fSWolfgang Grandegger } 381*3878fb6fSWolfgang Grandegger 382*3878fb6fSWolfgang Grandegger static void __devexit kvaser_pci_remove_one(struct pci_dev *pdev) 383*3878fb6fSWolfgang Grandegger { 384*3878fb6fSWolfgang Grandegger struct net_device *dev = pci_get_drvdata(pdev); 385*3878fb6fSWolfgang Grandegger 386*3878fb6fSWolfgang Grandegger kvaser_pci_del_chan(dev); 387*3878fb6fSWolfgang Grandegger 388*3878fb6fSWolfgang Grandegger pci_release_regions(pdev); 389*3878fb6fSWolfgang Grandegger pci_disable_device(pdev); 390*3878fb6fSWolfgang Grandegger pci_set_drvdata(pdev, NULL); 391*3878fb6fSWolfgang Grandegger } 392*3878fb6fSWolfgang Grandegger 393*3878fb6fSWolfgang Grandegger static struct pci_driver kvaser_pci_driver = { 394*3878fb6fSWolfgang Grandegger .name = DRV_NAME, 395*3878fb6fSWolfgang Grandegger .id_table = kvaser_pci_tbl, 396*3878fb6fSWolfgang Grandegger .probe = kvaser_pci_init_one, 397*3878fb6fSWolfgang Grandegger .remove = __devexit_p(kvaser_pci_remove_one), 398*3878fb6fSWolfgang Grandegger }; 399*3878fb6fSWolfgang Grandegger 400*3878fb6fSWolfgang Grandegger static int __init kvaser_pci_init(void) 401*3878fb6fSWolfgang Grandegger { 402*3878fb6fSWolfgang Grandegger return pci_register_driver(&kvaser_pci_driver); 403*3878fb6fSWolfgang Grandegger } 404*3878fb6fSWolfgang Grandegger 405*3878fb6fSWolfgang Grandegger static void __exit kvaser_pci_exit(void) 406*3878fb6fSWolfgang Grandegger { 407*3878fb6fSWolfgang Grandegger pci_unregister_driver(&kvaser_pci_driver); 408*3878fb6fSWolfgang Grandegger } 409*3878fb6fSWolfgang Grandegger 410*3878fb6fSWolfgang Grandegger module_init(kvaser_pci_init); 411*3878fb6fSWolfgang Grandegger module_exit(kvaser_pci_exit); 412