X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/4dc78b4651f006bf0404c8ec7db85651bcee7c2e..04ac67cc3cac14cd601daacd0592121ec0b84012:/lincan/src/nsi_canpci.c diff --git a/lincan/src/nsi_canpci.c b/lincan/src/nsi_canpci.c index 1fee227..309ec85 100644 --- a/lincan/src/nsi_canpci.c +++ b/lincan/src/nsi_canpci.c @@ -97,7 +97,7 @@ void nsi_canpci_disconnect_irq(struct candevice_t *candev) int nsi_canpci_config_irqs(struct canchip_t *chip, short irqs) { - + unsigned long it_mask,it_reg; struct candevice_t *candev; it_mask=0; @@ -144,15 +144,15 @@ int nsi_canpci_i82527_chip_config(struct canchip_t *chip) { can_write_reg(chip,chip->int_cpu_reg,iCPU); // Configure cpu interface can_write_reg(chip,(iCTL_CCE|iCTL_INI),iCTL); // Enable configuration - i82527_seg_write_reg(chip,chip->int_clk_reg,iCLK); // Set clock out slew rates + i82527_seg_write_reg(chip,chip->int_clk_reg,iCLK); // Set clock out slew rates i82527_seg_write_reg(chip,chip->int_bus_reg,iBUS); /* Bus configuration */ - + can_write_reg(chip,P2_2|P2_1,iP2C); // The pin P2_2,P2_1 of the 527 must be set as output can_write_reg(chip,P2_2|P2_1,iP2O); // and P2_2 must be set to 1 - + can_write_reg(chip,0x00,iSTAT); /* Clear error status register */ - /* Check if we can at least read back some arbitrary data from the + /* Check if we can at least read back some arbitrary data from the * card. If we can not, the card is not properly configured! */ canobj_write_reg(chip,chip->msgobj[1],0x25,iMSGDAT1); @@ -191,11 +191,11 @@ int nsi_canpci_i82527_chip_config(struct canchip_t *chip) CANMSG("Error clearing message objects\n"); return -ENODEV; } - + if (nsi_canpci_config_irqs(chip,iCTL_IE|iCTL_EIE)) { /* has been 0x0a */ CANMSG("Error configuring interrupts\n"); return -ENODEV; - } + } return 0; } @@ -220,7 +220,7 @@ int nsi_canpci_start_chip(struct canchip_t *chip) rmb(); it_reg|=it_mask|0x40; iowrite32(it_reg,(void*)(candev->io_addr+PLX_INTCSR)); - wmb(); + wmb(); i82527_start_chip(chip); return 0; } @@ -245,7 +245,7 @@ int nsi_canpci_stop_chip(struct canchip_t *chip) rmb(); it_reg&=~it_mask; iowrite32(it_reg,(void*)(candev->io_addr+PLX_INTCSR)); - wmb(); + wmb(); i82527_stop_chip(chip); return 0; } @@ -272,7 +272,7 @@ int nsi_canpci_irq_handler(int irq, struct canchip_t *chip) { retcode=CANCHIP_IRQ_HANDLED; } - + } } else @@ -286,7 +286,7 @@ int nsi_canpci_irq_handler(int irq, struct canchip_t *chip) }else { retcode=CANCHIP_IRQ_HANDLED; - } + } } } return retcode; @@ -301,11 +301,11 @@ int nsi_canpci_request_io(struct candevice_t *candev) { (void)candev; if(candev->dev_base_addr==0) - return -EIO; + return -EIO; return 0; } -/* The function template_release_io is used to free the previously reserved +/* The function template_release_io is used to free the previously reserved * io-memory. In case you reserved more memory, don't forget to free it here. */ int nsi_canpci_release_io(struct candevice_t *candev) @@ -313,7 +313,7 @@ int nsi_canpci_release_io(struct candevice_t *candev) unsigned long reg_reset; struct pci_dev *pcidev = candev->sysdevptr.pcidev; DEBUGMSG("Releasing board io\n"); - + nsi_canpci_disconnect_irq(candev); // First, set RESET signal to 0 reg_reset = ioread32( (void*)(candev->io_addr+PLX_CNTRL)); @@ -333,8 +333,8 @@ int nsi_canpci_release_io(struct candevice_t *candev) kfree((void*)(candev->dev_base_addr)); pci_release_region(pcidev,0); pci_release_region(pcidev,1); - pci_release_region(pcidev,2); - pci_release_region(pcidev,3); + pci_release_region(pcidev,2); + pci_release_region(pcidev,3); return 0; } @@ -345,9 +345,9 @@ int nsi_canpci_release_io(struct candevice_t *candev) int nsi_canpci_reset(struct candevice_t *candev) { unsigned long reg_reset; - + DEBUGMSG("Board reset !!!\n"); - // Before reset disconnet interrupt to avoir freeze + // Before reset disconnet interrupt to avoir freeze nsi_canpci_disconnect_irq(candev); // First, set RESET signal to 0 reg_reset = ioread32( (void*)(candev->io_addr+PLX_CNTRL)); @@ -360,9 +360,9 @@ int nsi_canpci_reset(struct candevice_t *candev) wmb(); udelay(2500); // Waiting for some additionnal time before writing in the 82527 DEBUGMSG("Reset done !!!\n"); - + nsi_canpci_connect_irq(candev); - return 0; + return 0; } /* The function template_init_hw_data is used to initialize the hardware @@ -374,7 +374,7 @@ int nsi_canpci_reset(struct candevice_t *candev) * the hardware uses programmable interrupts. */ -int nsi_canpci_init_hw_data(struct candevice_t *candev) +int nsi_canpci_init_hw_data(struct candevice_t *candev) { struct pci_dev *pcidev; @@ -387,7 +387,7 @@ int nsi_canpci_init_hw_data(struct candevice_t *candev) return -ENODEV; } - CANMSG ("NSI CANPCI device found\n"); + CANMSG ("NSI CANPCI device found\n"); /* enable it */ if (pci_enable_device (pcidev)) @@ -400,7 +400,7 @@ int nsi_canpci_init_hw_data(struct candevice_t *candev) candev->res_addr=0; candev->nr_82527_chips=2; candev->nr_sja1000_chips=0; - candev->nr_all_chips=2; + candev->nr_all_chips=2; /* initialize device spinlock */ can_spin_lock_init(&candev->device_lock); @@ -417,7 +417,7 @@ int nsi_canpci_init_hw_data(struct candevice_t *candev) { pci_release_region(pcidev,0); pci_release_region(pcidev,1); - pci_release_region(pcidev,2); + pci_release_region(pcidev,2); goto error_io; } } @@ -433,16 +433,16 @@ int nsi_canpci_init_hw_data(struct candevice_t *candev) pci_release_region(pcidev,0); goto error_io; } - } + } else { goto error_io; } - candev->dev_base_addr=(unsigned long)(kmalloc(sizeof(t_CardArray),GFP_ATOMIC)); - + candev->dev_base_addr=(unsigned long)(kmalloc(sizeof(t_CardArray),GFP_ATOMIC)); + if((unsigned long)candev->dev_base_addr==0) goto error_io; - //PLX register + //PLX register ((t_CardArray*)(candev->dev_base_addr))->addr_BAR_remap[0]=ioremap(pci_resource_start(pcidev,0),pci_resource_len(pcidev,0) ); //PLX IO ((t_CardArray*)(candev->dev_base_addr))->addr_BAR_remap[1]=ioremap(pci_resource_start(pcidev,1),pci_resource_len(pcidev,1) ); @@ -450,10 +450,10 @@ int nsi_canpci_init_hw_data(struct candevice_t *candev) ((t_CardArray*)(candev->dev_base_addr))->addr_BAR_remap[2]=ioremap(pci_resource_start(pcidev,2),pci_resource_len(pcidev,2) ); //Chip 1 ((t_CardArray*)(candev->dev_base_addr))->addr_BAR_remap[3]=ioremap(pci_resource_start(pcidev,3),pci_resource_len(pcidev,3) ); - + //Short acces to plx register candev->io_addr=(unsigned long)(((t_CardArray*)(candev->dev_base_addr))->addr_BAR_remap[0]); - return 0; + return 0; error_io: can_pci_dev_put(pcidev); @@ -483,14 +483,14 @@ int nsi_canpci_init_chip_data(struct candevice_t *candev, int chipnr) //u8 irq_line; CANMSG ("NSI chip data init %d\n",chipnr); i82527_fill_chipspecops(candev->chip[chipnr]); - + candev->chip[chipnr]->chipspecops->chip_config =nsi_canpci_i82527_chip_config; candev->chip[chipnr]->chipspecops->start_chip=nsi_canpci_start_chip; candev->chip[chipnr]->chipspecops->stop_chip=nsi_canpci_stop_chip; candev->chip[chipnr]->chipspecops->config_irqs=nsi_canpci_config_irqs; candev->chip[chipnr]->chipspecops->irq_handler=nsi_canpci_irq_handler; /*candev->chip[chipnr]->chip_data = NULL;*/ - + candev->chip[chipnr]->chip_base_addr= (unsigned long) (((t_CardArray*)(candev->dev_base_addr))->addr_BAR_remap[chipnr+2]); candev->chip[chipnr]->clock = iCLOCK; candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq; @@ -506,7 +506,7 @@ int nsi_canpci_init_chip_data(struct candevice_t *candev, int chipnr) * CAN chip. In case of the sja1000 there's only one message object but on the * i82527 chip there are 15. * The code below is for a i82527 chip and initializes the object base addresses - * The entry obj_base_addr represents the first memory address of the message + * The entry obj_base_addr represents the first memory address of the message * object. In case of the sja1000 obj_base_addr is taken the same as the chips * base address. * Unless the hardware uses a segmented memory map, flags can be set zero. @@ -514,10 +514,10 @@ int nsi_canpci_init_chip_data(struct candevice_t *candev, int chipnr) int nsi_canpci_init_obj_data(struct canchip_t *chip, int objnr) { - + chip->msgobj[objnr]->obj_base_addr= chip->chip_base_addr+(objnr+1)*0x10; - + return 0; }