Results 1 to 2 of 2
Hello, I'm having trouble with returning data from my char driver's read method. During "probe" driver intialization I request a DMA buffer for my pci-express device like this:
Code:
my_device.dma_cpu_addr ...
Enjoy an ad free experience by logging in. Not a member yet? Register.
- 10-01-2011 #1Just Joined!
- Join Date
- Oct 2011
- Posts
- 2
copy_to_user hangs system on buffers >= 4K bytes
Hello, I'm having trouble with returning data from my char driver's read method. During "probe" driver intialization I request a DMA buffer for my pci-express device like this:
in my read method I basically do this (watered down code)Code:my_device.dma_cpu_addr = pci_alloc_consistent(dev, DMA_MEM_SIZE, &my_device.dma_phy_handle);
This works well as long as nbytes is less than 4K. At 4K the system absolutely freezes. At first I assumed this maybe had to do with PAGE_SIZE limits, so I decided to loop the 'memcpy' and 'copy_to_user' calls multiple times in incrments less than 4K (I started with 1K). This also would result in system hangs. Perhaps is there something with my intermediate "buffer" array? Could I just directly copy from I/O memory to user space without using an intermediate buffer? Thank for taking the time to read this.Code:byte [] buffer[nbytes]; memcpy_fromio( &buffer, my_device.dma_cpu_addr + my_device.offset, nbytes); copy_to_user(buf, &buffer, nbytes); *ppos += nbytes; return nbytes;
- 11-26-2011 #2Banned
- Join Date
- Nov 2011
- Posts
- 13
byte [] buffer[nbytes]; what is this?? an array?? if yes, then this are wrong:
memcpy_fromio( &buffer, my_device.dma_cpu_addr + my_device.offset, nbytes);
copy_to_user(buf, &buffer, nbytes);
These should be
memcpy_fromio(buffer, my_device.dma_cpu_addr + my_device.offset, nbytes);
copy_to_user(buf, buffer, nbytes);
Note & deletion.
Let me know, if this helps.Last edited by oz; 11-26-2011 at 12:43 PM. Reason: redirect spammer


Reply With Quote
