On 12/16/2009 11:04 AM, Alain Knaff wrote:
On 16/12/09 16:50, Mark Hounschell wrote:
On 12/16/2009 10:43 AM, Alain Knaff wrote:
On 16/12/09 16:34, Mark Hounschell wrote:
On 12/15/2009 03:18 PM, Alain Knaff wrote:
Mark Hounschell wrote:
Attached is the one I'm using for 2.6.28
I just compiled a kernel with it here, and everything works fine on my test machine...
Weird
Alain
Alain, where exactly does the driver send the track label buffer to the drive for the FDFMTTRK ioctl? I can see (via printks) that the setup_format_params routine is NOT doing anything wrong so something between there and when it actually gets sent to the drive must be happening to the track number in that buffer for these sector 0xa's. Maybe I can capture and see that data right before it is sent to the drive?
Data is sent via DMA, so there is no specific place in the code where it is sent (basically, the FDC grabs it itself). However, the floppy command is sent in function setup_rw_floppy:
for (i = 0; i < raw_cmd->cmd_count; i++) r |= output_byte(raw_cmd->cmd[i]);
Only after the FD_FORMAT command has been received entirely by the FDC will it start fetching the track label buffer via DMA.
It could be that for some reason the DMA transfer itself is buggy... in that case, it might be useful to test without dma. You can do this by supplying the floppy=nodma flag to modprobe when inserting the module:
modprobe floppy floppy=nodma
Regards,
Alain
Yep, it works with nodma???
This is great news! So now we know it's somehow DMA related.
There are still 2 possible theories: 1. data is being corrupted in memory before being transferred. 2. data is being corrupted during DMA (while still being left all right in memory)
To check this, it still might be interesting to check the buffer, as you intended earlier, both just before the command is sent in setup_rw_floppy, and also after command complete. A good place for the "after" check is in do_format, after the following statement:
IWAIT(redo_format);
If it shows the correct data, we probably have 2 (corruption in transit), otherwise 1 (corruption in memory, maybe due to a stray pointer...).
Ok, I assume that the dma buffer is the actual floppy_track_buffer. To be sure, I corrupted it before the DMA in such a way I could see the corruption doing the readid. If that is in fact the case, there is no corruption of the floppy_track_buffer taking place. Dec 16 13:43:05 harley kernel: Dec 16 13:43:05 harley kernel: setup_rw_floppy: Track Label Buffer Before Dec 16 13:43:05 harley kernel: Logical Sector 0: track = 1 head 0 sect = 10 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 1: track = 1 head 0 sect = 11 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 2: track = 1 head 0 sect = 12 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 3: track = 1 head 0 sect = 13 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 4: track = 1 head 0 sect = 14 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 5: track = 1 head 0 sect = 15 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 6: track = 1 head 0 sect = 16 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 7: track = 1 head 0 sect = 17 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 8: track = 1 head 0 sect = 18 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 9: track = 1 head 0 sect = 1 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 10: track = 1 head 0 sect = 2 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 11: track = 1 head 0 sect = 3 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 12: track = 1 head 0 sect = 4 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 13: track = 1 head 0 sect = 5 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 14: track = 1 head 0 sect = 6 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 15: track = 1 head 0 sect = 7 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 16: track = 1 head 0 sect = 8 size = 2 Dec 16 13:43:05 harley kernel: Logical Sector 17: track = 1 head 0 sect = 9 size = 2 Dec 16 13:43:06 harley kernel: do_format: Track Label Buffer after Dec 16 13:43:06 harley kernel: Logical Sector 0: track = 1 head 0 sect = 10 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 1: track = 1 head 0 sect = 11 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 2: track = 1 head 0 sect = 12 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 3: track = 1 head 0 sect = 13 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 4: track = 1 head 0 sect = 14 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 5: track = 1 head 0 sect = 15 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 6: track = 1 head 0 sect = 16 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 7: track = 1 head 0 sect = 17 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 8: track = 1 head 0 sect = 18 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 9: track = 1 head 0 sect = 1 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 10: track = 1 head 0 sect = 2 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 11: track = 1 head 0 sect = 3 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 12: track = 1 head 0 sect = 4 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 13: track = 1 head 0 sect = 5 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 14: track = 1 head 0 sect = 6 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 15: track = 1 head 0 sect = 7 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 16: track = 1 head 0 sect = 8 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 17: track = 1 head 0 sect = 9 size = 2 Dec 16 13:43:06 harley kernel: Dec 16 13:43:06 harley kernel: setup_rw_floppy: Track Label Buffer Before Dec 16 13:43:06 harley kernel: Logical Sector 0: track = 1 head 1 sect = 7 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 1: track = 1 head 1 sect = 8 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 2: track = 1 head 1 sect = 9 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 3: track = 1 head 1 sect = 10 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 4: track = 1 head 1 sect = 11 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 5: track = 1 head 1 sect = 12 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 6: track = 1 head 1 sect = 13 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 7: track = 1 head 1 sect = 14 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 8: track = 1 head 1 sect = 15 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 9: track = 1 head 1 sect = 16 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 10: track = 1 head 1 sect = 17 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 11: track = 1 head 1 sect = 18 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 12: track = 1 head 1 sect = 1 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 13: track = 1 head 1 sect = 2 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 14: track = 1 head 1 sect = 3 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 15: track = 1 head 1 sect = 4 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 16: track = 1 head 1 sect = 5 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 17: track = 1 head 1 sect = 6 size = 2 Dec 16 13:43:06 harley kernel: do_format: Track Label Buffer after Dec 16 13:43:06 harley kernel: Logical Sector 0: track = 1 head 1 sect = 7 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 1: track = 1 head 1 sect = 8 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 2: track = 1 head 1 sect = 9 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 3: track = 1 head 1 sect = 10 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 4: track = 1 head 1 sect = 11 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 5: track = 1 head 1 sect = 12 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 6: track = 1 head 1 sect = 13 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 7: track = 1 head 1 sect = 14 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 8: track = 1 head 1 sect = 15 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 9: track = 1 head 1 sect = 16 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 10: track = 1 head 1 sect = 17 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 11: track = 1 head 1 sect = 18 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 12: track = 1 head 1 sect = 1 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 13: track = 1 head 1 sect = 2 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 14: track = 1 head 1 sect = 3 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 15: track = 1 head 1 sect = 4 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 16: track = 1 head 1 sect = 5 size = 2 Dec 16 13:43:06 harley kernel: Logical Sector 17: track = 1 head 1 sect = 6 size = 2 So, to me, if my assumptions above are correct, it looks like we have corruption in transit?? Mark