Rev 43 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 43 | Rev 44 | ||
---|---|---|---|
Line 98... | Line 98... | ||
98 | DRIVER_OBJ drv; |
98 | DRIVER_OBJ drv; |
99 | 99 | ||
100 | /*--- LOCALS ------------------------------------------------------------------------------*/ |
100 | /*--- LOCALS ------------------------------------------------------------------------------*/ |
101 | 101 | ||
102 | /*--- FUNCTIONS ---------------------------------------------------------------------------*/ |
102 | /*--- FUNCTIONS ---------------------------------------------------------------------------*/ |
- | 103 | ||
- | 104 | struct proc_dir_entry *proc; |
|
- | 105 | ||
103 | static int my_interrupt(u16 intCSR) |
106 | static int my_interrupt(u16 intCSR) |
104 | { |
107 | { |
105 | int result = NOT_MY_INTERRUPT; |
108 | int result = NOT_MY_INTERRUPT; |
106 | 109 | ||
107 | if (intCSR & 0x0040) // it is global enabled |
110 | if (intCSR & 0x0040) // it is global enabled |
Line 287... | Line 290... | ||
287 | 290 | ||
288 | writew(0x0000, (volatile void *) dwADRH); |
291 | writew(0x0000, (volatile void *) dwADRH); |
289 | writew(0xFFFF, (volatile void *) dwADRL); |
292 | writew(0xFFFF, (volatile void *) dwADRL); |
290 | wRet = readw((const volatile void *) dwADRH); |
293 | wRet = readw((const volatile void *) dwADRH); |
291 | if (wRet != 0x0000) |
294 | if (wRet != 0x0000) |
292 | { |
295 | { |
293 | error = 1; |
296 | error = 1; |
294 | break; |
297 | break; |
295 | } |
298 | } |
296 | 299 | ||
297 | writew(0xFFFF, (volatile void *) dwADRH); |
300 | writew(0xFFFF, (volatile void *) dwADRH); |
298 | writew(0x0000, (volatile void *) dwADRL); |
301 | writew(0x0000, (volatile void *) dwADRL); |
299 | wRet = readw((const volatile void *) dwADRH); |
302 | wRet = readw((const volatile void *) dwADRH); |
Line 321... | Line 324... | ||
321 | { |
324 | { |
322 | u16 intCSR_store; |
325 | u16 intCSR_store; |
323 | u16 cntrl_store; |
326 | u16 cntrl_store; |
324 | int found = 0; |
327 | int found = 0; |
325 | u16 data; |
328 | u16 data; |
326 | 329 | ||
327 | cntrl_store = readw((const volatile void *) pd->pPCIADACntrl); /* read CONTROL register */ |
330 | cntrl_store = readw((const volatile void *) pd->pPCIADACntrl); /* read CONTROL register */ |
328 | intCSR_store = readw((const volatile void *) pd->pPCIADAIntCSR); /* read interrupt + CSR register */ |
331 | intCSR_store = readw((const volatile void *) pd->pPCIADAIntCSR); /* read interrupt + CSR register */ |
329 | 332 | ||
330 | PRINTK(KERN_DEBUG "%s : cntrl=0x%04x, intCSR=0x%04x\n", DEVICE_NAME, cntrl_store, intCSR_store); |
333 | PRINTK(KERN_DEBUG "%s : cntrl=0x%04x, intCSR=0x%04x\n", DEVICE_NAME, cntrl_store, intCSR_store); |
331 | 334 | ||
Line 353... | Line 356... | ||
353 | pd->cWordMode = (data & 0x0004); |
356 | pd->cWordMode = (data & 0x0004); |
354 | } |
357 | } |
355 | 358 | ||
356 | // clear possible interrupts |
359 | // clear possible interrupts |
357 | writew(cntrl_store & ~0x0100, (volatile void *) pd->pPCIADACntrl); /* clear potential interrupt */ |
360 | writew(cntrl_store & ~0x0100, (volatile void *) pd->pPCIADACntrl); /* clear potential interrupt */ |
358 | 361 | ||
359 | /* restore all contents */ |
362 | /* restore all contents */ |
360 | writew(cntrl_store, (volatile void *) pd->pPCIADACntrl); |
363 | writew(cntrl_store, (volatile void *) pd->pPCIADACntrl); |
361 | writew(intCSR_store, (volatile void *) pd->pPCIADAIntCSR); |
364 | writew(intCSR_store, (volatile void *) pd->pPCIADAIntCSR); |
362 | } |
365 | } |
363 | 366 | ||
Line 375... | Line 378... | ||
375 | DEVICE_OBJ *pd; |
378 | DEVICE_OBJ *pd; |
376 | PCIConfig *ch; |
379 | PCIConfig *ch; |
377 | u16 cntrl; |
380 | u16 cntrl; |
378 | char *cause = "none"; |
381 | char *cause = "none"; |
379 | struct list_head *ptr; |
382 | struct list_head *ptr; |
- | 383 | PRINTK(KERN_DEBUG "%s : pcivme_read_proc()\n",DEVICE_NAME); |
|
380 | 384 | ||
- | 385 | if (*offp != 0) return 0; |
|
381 | pos += sprintf(buf + pos, "\nPCIVME information. Version %d.%d of %s from Klaus Hitschler.\n", VERSION_HI, VERSION_LO, __DATE__); |
386 | pos += sprintf(buf + pos, "\nPCIVME information. Version %d.%d of %s from Klaus Hitschler.\n", VERSION_HI, VERSION_LO, __DATE__); |
382 | 387 | ||
383 | pos += sprintf(buf + pos, " ---------------------\n"); |
388 | pos += sprintf(buf + pos, " ---------------------\n"); |
384 | pos += sprintf(buf + pos, " Interfaces found : %d\n", drv.count); |
389 | pos += sprintf(buf + pos, " Interfaces found : %d\n", drv.count); |
385 | pos += sprintf(buf + pos, " Major Number : %d\n", drv.nMajor); |
390 | pos += sprintf(buf + pos, " Major Number : %d\n", drv.nMajor); |
Line 403... | Line 408... | ||
403 | pos += sprintf(buf + pos, " Systemcontroller : %s\n", (pd->cSystemController) ? "yes" : "no"); |
408 | pos += sprintf(buf + pos, " Systemcontroller : %s\n", (pd->cSystemController) ? "yes" : "no"); |
404 | pos += sprintf(buf + pos, " Word Mode : %s\n", (pd->cWordMode) ? "yes" : "no"); |
409 | pos += sprintf(buf + pos, " Word Mode : %s\n", (pd->cWordMode) ? "yes" : "no"); |
405 | } |
410 | } |
406 | else |
411 | else |
407 | pos += sprintf(buf + pos, " VMEMM is or was : not (software) connected.\n"); |
412 | pos += sprintf(buf + pos, " VMEMM is or was : not (software) connected.\n"); |
408 | 413 | ||
409 | if (!((cntrl & 0x0800) && (!(cntrl & 0x0600)))) |
414 | if (!((cntrl & 0x0800) && (!(cntrl & 0x0600)))) |
410 | pos += sprintf(buf + pos, " VMEMM is : powered off or cable disconnected.\n"); |
415 | pos += sprintf(buf + pos, " VMEMM is : powered off or cable disconnected.\n"); |
411 | 416 | ||
412 | pos += sprintf(buf + pos, " IrqCount : %d\n", pd->dwInterruptCount); |
417 | pos += sprintf(buf + pos, " IrqCount : %d\n", pd->dwInterruptCount); |
413 | if (pd->wIrqStatus & PCIADA_INTERRUPT) |
418 | if (pd->wIrqStatus & PCIADA_INTERRUPT) |
Line 417... | Line 422... | ||
417 | cause = "VME"; |
422 | cause = "VME"; |
418 | pos += sprintf(buf + pos, " Pending IrqStatus : %s\n", cause); |
423 | pos += sprintf(buf + pos, " Pending IrqStatus : %s\n", cause); |
419 | } |
424 | } |
420 | 425 | ||
421 | pos += sprintf(buf + pos, "\n"); |
426 | pos += sprintf(buf + pos, "\n"); |
- | 427 | if (pos>count) { |
|
- | 428 | buf[count-1]=0; |
|
- | 429 | pos=count; |
|
422 | 430 | } |
|
- | 431 | PRINTK(KERN_DEBUG "%s : pcivme_read_proc() end count=%d\n",DEVICE_NAME, pos); |
|
423 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) |
432 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) |
424 | //*eof = 1; |
433 | //*eof = 1; |
425 | #endif |
434 | #endif |
- | 435 | *offp = pos; |
|
426 | 436 | ||
427 | return pos; |
437 | return pos; |
428 | } |
438 | } |
429 | 439 | ||
430 | 440 | ||
431 | 441 | ||
Line 438... | Line 448... | ||
438 | mode: S_IFREG | S_IRUGO, /* mode */ |
448 | mode: S_IFREG | S_IRUGO, /* mode */ |
439 | nlink: 1, /* nlinks */ |
449 | nlink: 1, /* nlinks */ |
440 | get_info: pcivme_read_proc, /* function used to read data */ |
450 | get_info: pcivme_read_proc, /* function used to read data */ |
441 | }; |
451 | }; |
442 | #else |
452 | #else |
443 | struct file_operations |
453 | struct file_operations pcivme_read_proc_fops = { |
444 | read: pcivme_read_proc |
454 | read: pcivme_read_proc |
445 | }; |
455 | }; |
446 | #endif |
456 | #endif |
447 | 457 | ||
448 | static void deleteMyLists(void) |
458 | static void deleteMyLists(void) |
Line 458... | Line 468... | ||
458 | } |
468 | } |
459 | 469 | ||
460 | DeletePCIConfig(&drv); |
470 | DeletePCIConfig(&drv); |
461 | } |
471 | } |
462 | 472 | ||
463 | int |
473 | int pcivme_module_init(void) |
464 | { |
474 | { |
465 | PCIConfig *ch; |
475 | PCIConfig *ch; |
466 | DEVICE_OBJ *pd; |
476 | DEVICE_OBJ *pd; |
467 | int result = 0; |
477 | int result = 0; |
468 | struct list_head *ptr; |
478 | struct list_head *ptr; |
Line 574... | Line 584... | ||
574 | 584 | ||
575 | printk(KERN_DEBUG "%s : major #%d assigned.\n", DEVICE_NAME, drv.nMajor); |
585 | printk(KERN_DEBUG "%s : major #%d assigned.\n", DEVICE_NAME, drv.nMajor); |
576 | } |
586 | } |
577 | 587 | ||
578 | /* register the proc device */ |
588 | /* register the proc device */ |
579 | #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) |
- | |
580 | proc_register_dynamic(&proc_root, &pcimod_proc_entry); |
- | |
581 | 589 | ||
582 | return 0; |
- | |
583 | #else |
- | |
584 | // create_proc_read_entry is depricated since kernel 3.10 |
590 | // create_proc_read_entry is depricated since kernel 3.10 |
585 | //return create_proc_read_entry(DEVICE_NAME, 0, NULL, pcivme_read_proc, NULL) ? 0 : -ENODEV; |
591 | //return create_proc_read_entry(DEVICE_NAME, 0, NULL, pcivme_read_proc, NULL) ? 0 : -ENODEV; |
586 |
|
592 | proc = proc_create_data(DEVICE_NAME, 0, NULL, &pcivme_read_proc_fops, NULL); |
- | 593 | return (proc) ? 0 : -ENODEV; |
|
587 | #endif |
594 | |
588 | } |
595 | } |
589 | 596 | ||
590 | void |
597 | void pcivme_module_exit(void) |
591 | { |
598 | { |
592 | PCIConfig *ch; |
599 | PCIConfig *ch; |
593 | DEVICE_OBJ *pd; |
600 | DEVICE_OBJ *pd; |
594 | struct list_head *ptr; |
601 | struct list_head *ptr; |
595 | 602 | ||
596 | PRINTK(KERN_DEBUG "%s : cleanup_module.\n", DEVICE_NAME); |
603 | PRINTK(KERN_DEBUG "%s : cleanup_module.\n", DEVICE_NAME); |
597 | 604 | ||
598 | unregister_chrdev(drv.nMajor, DEVICE_NAME); |
605 | unregister_chrdev(drv.nMajor, DEVICE_NAME); |
599 | 606 | ||
600 | /* unregister the proc device */ |
607 | /* unregister the proc device */ |
601 | #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) |
608 | #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) |
602 | proc_unregister(&proc_root, pcimod_proc_entry.low_ino); |
609 | proc_unregister(&proc_root, pcimod_proc_entry.low_ino); |
Line 618... | Line 625... | ||
618 | default: pd->wInitStep = 0; |
625 | default: pd->wInitStep = 0; |
619 | } |
626 | } |
620 | 627 | ||
621 | drv.count--; |
628 | drv.count--; |
622 | } |
629 | } |
623 | 630 | ||
624 | deleteMyLists(); |
631 | deleteMyLists(); |
625 | 632 | ||
626 | return; |
633 | return; |
627 | } |
634 | } |
- | 635 | ||
- | 636 | module_init(pcivme_module_init); |
|
- | 637 | module_exit(pcivme_module_exit); |
|
628 | 638 |