Subversion Repositories f9daq

Rev

Rev 44 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 44 Rev 362
Line 143... Line 143...
143
        return IRQ_RETVAL(0);
143
        return IRQ_RETVAL(0);
144
}
144
}
145
 
145
 
146
static int request_io_memory(PCIConfig *pPch)
146
static int request_io_memory(PCIConfig *pPch)
147
{
147
{
148
    if (check_mem_region(pci_resource_start(pPch->pciDev, 0),  LCR_SPACE))
148
    if (!request_mem_region(pci_resource_start(pPch->pciDev, 0),  LCR_SPACE, DEVICE_NAME) ) {
149
    {
-
 
-
 
149
                        PRINTK(KERN_WARNING "%s: LCR memory region %llx-%llx already in use\n", DEVICE_NAME,
150
        PRINTK(KERN_DEBUG "%s : LCR 0x%08lx\n", DEVICE_NAME, (long unsigned int) pci_resource_start(pPch->pciDev, 0));
150
                                 pci_resource_start(pPch->pciDev, 0), pci_resource_start(pPch->pciDev, 0) + LCR_SPACE );
-
 
151
                        kfree(pPch);
151
        return -EBUSY;
152
                        return EBUSY;
152
    }
-
 
153
 
153
 
-
 
154
    };
154
    if (check_mem_region(pci_resource_start(pPch->pciDev, 2),  CTL_SPACE))
155
    if (!request_mem_region(pci_resource_start(pPch->pciDev, 2),  CTL_SPACE, DEVICE_NAME) ){
155
    {
-
 
-
 
156
                        PRINTK(KERN_WARNING "%s: CTL memory region %llx-%llx already in use\n", DEVICE_NAME,
156
        PRINTK(KERN_DEBUG "%s : CTL 0x%08lx\n", DEVICE_NAME, (long unsigned int) pci_resource_start(pPch->pciDev, 2));
157
                                 pci_resource_start(pPch->pciDev, 0),  pci_resource_start(pPch->pciDev, 2) + CTL_SPACE );
-
 
158
                        kfree(pPch);
157
        return -EBUSY;
159
                        return EBUSY;
158
    }
-
 
159
 
160
 
160
    if (check_mem_region(pci_resource_start(pPch->pciDev, 2) + CTL_SPACE, VME_SPACE))
-
 
161
    {
-
 
162
        PRINTK(KERN_DEBUG "%s : VME 0x%08lx\n", DEVICE_NAME, (long unsigned int) pci_resource_start(pPch->pciDev, 2) + CTL_SPACE);
-
 
163
        return -EBUSY;
-
 
164
    }
161
    }
-
 
162
    if (!request_mem_region(pci_resource_start(pPch->pciDev, 2) + CTL_SPACE, VME_SPACE, DEVICE_NAME) ){
-
 
163
                        PRINTK(KERN_WARNING "%s: VME memory region %llx-%llx already in use\n", DEVICE_NAME,
-
 
164
                                 pci_resource_start(pPch->pciDev, 0)+CTL_SPACE,  pci_resource_start(pPch->pciDev, 0) + LCR_SPACE+VME_SPACE );
-
 
165
                        kfree(pPch);
-
 
166
                        return EBUSY;
165
 
167
 
166
    request_mem_region(pci_resource_start(pPch->pciDev, 0),  LCR_SPACE, DEVICE_NAME);
-
 
167
    request_mem_region(pci_resource_start(pPch->pciDev, 2),  CTL_SPACE, DEVICE_NAME);
-
 
168
    request_mem_region(pci_resource_start(pPch->pciDev, 2) + CTL_SPACE, VME_SPACE, DEVICE_NAME);
-
 
169
 
168
    };
170
    return 0;
169
    return 0;
171
}
170
}
172
 
171
 
173
static void release_io_memory(PCIConfig *pPch)
172
static void release_io_memory(PCIConfig *pPch)
174
{
173
{
175
    release_mem_region(pci_resource_start(pPch->pciDev, 0),  LCR_SPACE);
174
    release_mem_region(pci_resource_start(pPch->pciDev, 0),  LCR_SPACE);
176
    release_mem_region(pci_resource_start(pPch->pciDev, 2),  CTL_SPACE);
175
    release_mem_region(pci_resource_start(pPch->pciDev, 2),  CTL_SPACE);
177
    release_mem_region(pci_resource_start(pPch->pciDev, 2) + CTL_SPACE, VME_SPACE);
176
    release_mem_region(pci_resource_start(pPch->pciDev, 2) + CTL_SPACE, VME_SPACE);
178
}
177
}
179
 
178
 
Line 193... Line 192...
193
    {
192
    {
194
        pd->pPhysVME = pci_resource_start(pPch->pciDev, 2) + CTL_SPACE;
193
        pd->pPhysVME = pci_resource_start(pPch->pciDev, 2) + CTL_SPACE;
195
 
194
 
196
        pd->pCtl = (u32)ioremap(pci_resource_start(pPch->pciDev, 2)            , CTL_SPACE);
195
        pd->pCtl = (u32)ioremap(pci_resource_start(pPch->pciDev, 2)            , CTL_SPACE);
197
        pd->pVME = (u32)ioremap(pci_resource_start(pPch->pciDev, 2) + CTL_SPACE, VME_SPACE);
196
        pd->pVME = (u32)ioremap(pci_resource_start(pPch->pciDev, 2) + CTL_SPACE, VME_SPACE);
198
    }
197
    }
199
 
198
 
200
    return 0;
199
    return 0;
201
}
200
}
202
 
201
 
203
static void un_translate_addresses(DEVICE_OBJ *pd, PCIConfig *pPch)
202
static void un_translate_addresses(DEVICE_OBJ *pd, PCIConfig *pPch)
204
{
203
{
Line 260... Line 259...
260
    u32 dwStore;
259
    u32 dwStore;
261
    u16 wRet;
260
    u16 wRet;
262
 
261
 
263
    cntrl_store  = readw((const volatile void *) pd->pPCIADACntrl);         /* read CONTROL register */
262
    cntrl_store  = readw((const volatile void *) pd->pPCIADACntrl);         /* read CONTROL register */
264
    intCSR_store = readw((const volatile void *) pd->pPCIADAIntCSR);        /* read interrupt + CSR register */
263
    intCSR_store = readw((const volatile void *) pd->pPCIADAIntCSR);        /* read interrupt + CSR register */
265
 
264
 
266
    writew(0, (volatile void *) pd->pPCIADAIntCSR);                   /* disable interrupts */
265
    writew(0, (volatile void *) pd->pPCIADAIntCSR);                   /* disable interrupts */
267
    writew(cntrl_store | 0x0180, (volatile void *) pd->pPCIADACntrl); /* enable access */
266
    writew(cntrl_store | 0x0180, (volatile void *) pd->pPCIADACntrl); /* enable access */
268
 
267
 
269
    // save adr register
268
    // save adr register
270
    dwStore = readl((const volatile void *) dwADRHL);
269
    dwStore = readl((const volatile void *) dwADRHL);
271
    for (i = 1000; i; i--)
270
    for (i = 1000; i; i--)
272
    {
271
    {
273
        writew(0x5555, (volatile void *) dwADRH);
272
        writew(0x5555, (volatile void *) dwADRH);
274
        writew(0xAAAA, (volatile void *) dwADRL);
273
        writew(0xAAAA, (volatile void *) dwADRL);
275
        wRet   = readw((const volatile void *) dwADRH);
274
        wRet   = readw((const volatile void *) dwADRH);
276
        if (wRet != 0x5555)
275
        if (wRet != 0x5555)
277
        {
276
        {
278
            error = 1;
277
            error = 1;
279
            break;
278
            break;
280
        }
279
        }
281
 
280
 
282
        writew(0xAAAA, (volatile void *) dwADRH);
281
        writew(0xAAAA, (volatile void *) dwADRH);
283
        writew(0x5555, (volatile void *) dwADRL);
282
        writew(0x5555, (volatile void *) dwADRL);
284
        wRet   = readw((const volatile void *) dwADRH);
283
        wRet   = readw((const volatile void *) dwADRH);
285
        if (wRet != 0xAAAA)
284
        if (wRet != 0xAAAA)
286
        {
285
        {
287
            error = 1;
286
            error = 1;
288
            break;
287
            break;
289
        }
288
        }
290
 
289
 
291
        writew(0x0000, (volatile void *) dwADRH);
290
        writew(0x0000, (volatile void *) dwADRH);
292
        writew(0xFFFF, (volatile void *) dwADRL);
291
        writew(0xFFFF, (volatile void *) dwADRL);
293
        wRet   = readw((const volatile void *) dwADRH);
292
        wRet   = readw((const volatile void *) dwADRH);
294
        if (wRet != 0x0000)
293
        if (wRet != 0x0000)
295
        {
294
        {
296
            error = 1;
295
            error = 1;
297
            break;
296
            break;
298
        }
297
        }
299
 
298
 
300
        writew(0xFFFF, (volatile void *) dwADRH);
299
        writew(0xFFFF, (volatile void *) dwADRH);
301
        writew(0x0000, (volatile void *) dwADRL);
300
        writew(0x0000, (volatile void *) dwADRL);
302
        wRet   = readw((const volatile void *) dwADRH);
301
        wRet   = readw((const volatile void *) dwADRH);
303
        if (wRet != 0xFFFF)
302
        if (wRet != 0xFFFF)
Line 365... Line 364...
365
    }
364
    }
366
 
365
 
367
    return found;  
366
    return found;  
368
}
367
}
369
 
368
 
370
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-
 
371
static int pcivme_read_proc(char *buf, char **start, off_t offset, int len)
-
 
372
#else
-
 
373
//static int pcivme_read_proc(char *buf, char **start, off_t offset, int len, int *eof, void *data)
369
//static int pcivme_read_proc(char *buf, char **start, off_t offset, int len, int *eof, void *data)
374
static int pcivme_read_proc(struct file *filp,char *buf,size_t count,loff_t *offp )
370
static ssize_t pcivme_read_proc(struct file *filp,char *buf,size_t count,loff_t *offp )
375
#endif
-
 
376
    {
371
    {
377
    int              pos = 0;
372
    int              pos = 0;
378
    DEVICE_OBJ       *pd;
373
    DEVICE_OBJ       *pd;
379
    PCIConfig        *ch;
374
    PCIConfig        *ch;
380
    u16                cntrl;
375
    u16                cntrl;
381
    char             *cause = "none";
376
    char             *cause = "none";
382
    struct list_head *ptr;
377
    struct list_head *ptr;
383
    PRINTK(KERN_DEBUG "%s : pcivme_read_proc()\n",DEVICE_NAME);
378
    PRINTK(KERN_DEBUG "%s : pcivme_read_proc()\n",DEVICE_NAME);
384
   
379
   
385
    if (*offp != 0) return 0;
380
    if (*offp != 0) return 0;
386
    pos += sprintf(buf + pos, "\nPCIVME information. Version %d.%d of %s from Klaus Hitschler.\n", VERSION_HI, VERSION_LO, __DATE__);
381
    pos += sprintf(buf + pos, "\nPCIVME information. Version %d.%d from Klaus Hitschler.\n", VERSION_HI, VERSION_LO);
387
 
382
 
388
    pos += sprintf(buf + pos, " ---------------------\n");
383
    pos += sprintf(buf + pos, " ---------------------\n");
389
    pos += sprintf(buf + pos, " Interfaces found : %d\n", drv.count);
384
    pos += sprintf(buf + pos, " Interfaces found : %d\n", drv.count);
390
    pos += sprintf(buf + pos, " Major Number     : %d\n", drv.nMajor);
385
    pos += sprintf(buf + pos, " Major Number     : %d\n", drv.nMajor);
391
 
386
 
Line 427... Line 422...
427
    if (pos>count) {
422
    if (pos>count) {
428
      buf[count-1]=0;
423
      buf[count-1]=0;
429
      pos=count;
424
      pos=count;
430
    }    
425
    }    
431
    PRINTK(KERN_DEBUG "%s : pcivme_read_proc() end count=%d\n",DEVICE_NAME, pos);
426
    PRINTK(KERN_DEBUG "%s : pcivme_read_proc() end count=%d\n",DEVICE_NAME, pos);
432
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-
 
433
    //*eof = 1;
427
    //*eof = 1;
434
#endif
-
 
435
    *offp = pos;
428
    *offp = pos;
436
   
-
 
437
    return pos;
429
    return pos;
438
}
430
}
439
 
431
 
440
 
-
 
441
 
-
 
442
 
-
 
443
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-
 
444
struct proc_dir_entry pcimod_proc_entry =
-
 
445
{
-
 
446
    namelen:    7,                  /* len of name */
-
 
447
    name:       DEVICE_NAME,        /* entry  name */
-
 
448
    mode:       S_IFREG | S_IRUGO,  /* mode */
-
 
449
    nlink:      1,                  /* nlinks */
-
 
450
    get_info:   pcivme_read_proc,  /* function used to read data */
-
 
451
};
-
 
452
#else 
-
 
453
struct file_operations pcivme_read_proc_fops = {
432
static const struct proc_ops  pcivme_read_proc_fops = {    
454
read: pcivme_read_proc
433
proc_read: pcivme_read_proc
455
};
434
};
456
#endif
-
 
457
 
435
 
458
static void deleteMyLists(void)
436
static void deleteMyLists(void)
459
{
437
{
460
    DEVICE_OBJ      *pd;
438
    DEVICE_OBJ      *pd;
461
 
439
 
Line 529... Line 507...
529
                pd->pCSR    = pd->pCtl + CSR;
507
                pd->pCSR    = pd->pCtl + CSR;
530
 
508
 
531
                pd->pPCIADACntrl  = pd->pLCR + PLX9050_CNTRL;
509
                pd->pPCIADACntrl  = pd->pLCR + PLX9050_CNTRL;
532
                pd->pPCIADAIntCSR = pd->pLCR + PLX9050_INTCSR;
510
                pd->pPCIADAIntCSR = pd->pLCR + PLX9050_INTCSR;
533
 
511
 
534
                if (request_irq(pd->pPch->pciDev->irq, pcivme_irqhandler, IRQF_DISABLED| IRQF_SHARED, DEVICE_NAME, pd))
512
                //if (request_irq(pd->pPch->pciDev->irq, pcivme_irqhandler, IRQF_DISABLED| IRQF_SHARED, DEVICE_NAME, pd))
-
 
513
                if (request_irq(pd->pPch->pciDev->irq, pcivme_irqhandler, IRQF_SHARED, DEVICE_NAME, pd))
535
                {
514
                {
536
                    printk(KERN_ERR "%s : can't get irq @ %d\n", DEVICE_NAME, pd->pPch->pciDev->irq);
515
                    printk(KERN_ERR "%s : can't get irq @ %d\n", DEVICE_NAME, pd->pPch->pciDev->irq);
537
                    kfree_s(pd, sizeof(*pd));       // FREE(pd);
516
                    kfree_s(pd, sizeof(*pd));       // FREE(pd);
538
                }
517
                }
539
                else
518
                else
Line 603... Line 582...
603
    PRINTK(KERN_DEBUG "%s : cleanup_module.\n", DEVICE_NAME);
582
    PRINTK(KERN_DEBUG "%s : cleanup_module.\n", DEVICE_NAME);
604
 
583
 
605
    unregister_chrdev(drv.nMajor, DEVICE_NAME);
584
    unregister_chrdev(drv.nMajor, DEVICE_NAME);
606
 
585
 
607
    /* unregister the proc device */
586
    /* unregister the proc device */
608
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-
 
609
    proc_unregister(&proc_root, pcimod_proc_entry.low_ino);
-
 
610
#else
-
 
611
    remove_proc_entry(DEVICE_NAME, NULL);
587
    remove_proc_entry(DEVICE_NAME, NULL);
612
#endif
-
 
613
 
588
 
614
    /* redo all */
589
    /* redo all */
615
    for (ptr = drv.devList.next; ptr != &drv.devList; ptr = ptr->next)
590
    for (ptr = drv.devList.next; ptr != &drv.devList; ptr = ptr->next)
616
    {
591
    {
617
        pd = list_entry(ptr, DEVICE_OBJ, list);
592
        pd = list_entry(ptr, DEVICE_OBJ, list);