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 ( |
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 |
|
150 | pci_resource_start(pPch->pciDev, 0), pci_resource_start(pPch->pciDev, 0) + LCR_SPACE ); |
- | 151 | kfree(pPch); |
|
151 | return |
152 | return EBUSY; |
152 | } |
- | |
153 | 153 | ||
- | 154 | }; |
|
154 | if ( |
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 |
|
157 | pci_resource_start(pPch->pciDev, 0), pci_resource_start(pPch->pciDev, 2) + CTL_SPACE ); |
- | 158 | kfree(pPch); |
|
157 | return |
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 |
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 |
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 |
|
432 | static const struct proc_ops pcivme_read_proc_fops = { |
454 |
|
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 |
|
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); |