fileio example on HD more than 2GB

Joel Sherrill joel.sherrill at oarcorp.com
Mon May 1 18:16:36 UTC 2006


Thomas Doerfler (nt) wrote:

>Grigori, Joel,
>
>I will have a look at the issues tomorrow.
>
>wkr,
>thomas.
>
>Grigori Khmyrov schrieb:
>  
>
>>It just fixes problem for me. I'm not sure it's a right way to do it.
>>Some IDE expert should look at this. I'm not.
>>
>>The changes are very simple
>>
>>1. rtems-4.6.2\c\src\libchip\ide\ata.c
>>line 30 was:
>>#define DEBUG
>>line 30 now is:
>>//#define DEBUG
>>
>>    
>>
I can't understand why DEBUG only impacts one section of code and it appears
to have nothing to do with debugging.   The code at line 560 which early 
exits
ata_add_to_controller_queue is the only code I see which uses DEBUG.  So 
if the
alternate status register says "busy" then don't add.  I admit to not 
being that intimately
aware of IDE/ATA but this seems weird.

>>2. rtems-4.6.2\c\src\lib\libbsp\i386\pc386\ide\ide.c
>>line 182 was:
>> while ((status_val & IDE_REGISTER_STATUS_DRQ) &&
>>line 182 now is:
>> while (/*(status_val & IDE_REGISTER_STATUS_DRQ) && */
>>
>>I don't know why but it looks like for some IDE controllers
>>IDE_REGISTER_STATUS_DRQ is wrong.
>>And program exits while loop and never reads rest of the block.
>>
>>Grigori
>>
>>
>>Joel Sherrill wrote:
>>
>>    
>>
>>>Grigori Khmyrov wrote:
>>>
>>>      
>>>
>>>>I dig deeper in fileio example and found fixes for problems I had.
>>>>
>>>>        
>>>>
>>>Can you produce a patch or send myself and Thomas Doerfler (cc'ed)
>>>your files for merger?  I can't tell with 100% certainty the precise
>>>edits
>>>you made.
>>>
>>>The first problem looks like there might need to be a semaphore release
>>>at the return.  I don't understand the second problem.
>>>
>>>      
>>>
>>>>I'm reminding. I had 4 computers: 3 laptops and 1 old desktop (with 4
>>>>different small <2GB HDs)
>>>>
>>>>Only one laptop worked OK with fileio example.
>>>>
>>>>1. Two other laptops: program stopped at line 1231 of
>>>>cpukit/libblock/src/bdbuf.c
>>>>_CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
>>>>WATCHDOG_NO_TIMEOUT, level);
>>>>
>>>>Fix is: I commented out #define DEBUG in ata.c
>>>>It was defined!!!
>>>>
>>>>As a result the code was executed
>>>>#ifdef DEBUG
>>>>       /*
>>>>        * read IDE_REGISTER_ALTERNATE_STATUS instead IDE_REGISTER_STATUS
>>>>        * to prevent clearing of pending interrupt
>>>>        */
>>>>       ide_controller_read_register(ctrl_minor,
>>>>                                    IDE_REGISTER_ALTERNATE_STATUS,
>>>>                                    &val);
>>>>       if (val & IDE_REGISTER_STATUS_BSY)
>>>>           return;
>>>>#endif
>>>>val was not busy only for one laptop. For others it never released
>>>>semaphore and returned without any messages!
>>>>
>>>>2. On the desktop error code after init partition was 25 - INTERNAL
>>>>RTEMS ERROR
>>>>
>>>>I found ide read block function never read all 512 bytes only 508 of
>>>>them.
>>>>As a result it was no MSDOS signature in MBR (sector 0).
>>>>
>>>>In ide.c I commented out status_val usage:
>>>>
>>>>/*=========================================================================*\
>>>>
>>>>|
>>>>Function:                                                                
>>>>|
>>>>\*-------------------------------------------------------------------------*/
>>>>
>>>>void pc386_ide_read_block
>>>>(
>>>>/*-------------------------------------------------------------------------*\
>>>>
>>>>|
>>>>Purpose:                                                                 
>>>>|
>>>>|  read a IDE controller data
>>>>block                                         |
>>>>+---------------------------------------------------------------------------+
>>>>
>>>>| Input
>>>>Parameters:                                                         |
>>>>\*-------------------------------------------------------------------------*/
>>>>
>>>>int minor,
>>>>unsigned16 block_size,
>>>>blkdev_sg_buffer *bufs,
>>>>rtems_unsigned32 *cbuf,
>>>>rtems_unsigned32 *pos
>>>>)
>>>>/*-------------------------------------------------------------------------*\
>>>>
>>>>| Return
>>>>Value:                                                             |
>>>>|   
>>>><none>                                                                 |
>>>>\*=========================================================================*/
>>>>
>>>>{
>>>> unsigned32  port = IDE_Controller_Table[minor].port1;
>>>> unsigned16  cnt = 0;
>>>> unsigned32  llength = bufs[(*cbuf)].length;
>>>>//  unsigned8 status_val;
>>>> unsigned16 *lbuf = (unsigned16 *)
>>>>   ((unsigned8 *)(bufs[(*cbuf)].buffer) + (*pos));
>>>>//#define DEBUG_OUT
>>>>
>>>>//  inport_byte(port+IDE_REGISTER_STATUS,status_val);
>>>> while (/*(status_val & IDE_REGISTER_STATUS_DRQ) && */
>>>>        (cnt < block_size)) {
>>>>   inport_word(port+IDE_REGISTER_DATA,*lbuf);
>>>>
>>>>#ifdef DEBUG_OUT
>>>>   printk("%d:0x%x:%d ",cnt, *lbuf, status_val);
>>>>#endif
>>>>   lbuf++;
>>>>   cnt    += sizeof(*lbuf);
>>>>   (*pos) += sizeof(*lbuf);
>>>>   if ((*pos) == llength) {
>>>>     (*pos) = 0;
>>>>     (*cbuf)++;
>>>>     lbuf = bufs[(*cbuf)].buffer;
>>>>     llength = bufs[(*cbuf)].length;
>>>>   }
>>>>//    inport_byte(port+IDE_REGISTER_STATUS,status_val);
>>>> }
>>>>#ifdef DEBUG_OUT
>>>> printk("\npc386_ide_read_block() pos = %d\n", (*pos));
>>>>printk("read ide, llength = %d, block_size = %d,
>>>>IDE_REGISTER_STATUS_DRQ %d\n",
>>>> llength, block_size, IDE_REGISTER_STATUS_DRQ);
>>>>#endif
>>>>}
>>>>
>>>>It works now with all ide/HD I have.
>>>>I use RTEMS 4.6.2.
>>>>I change only my local versions of files.
>>>>
>>>>Can somebody look at the current version. I don't work with RTEMS cvs
>>>>for now.
>>>>
>>>>Thank you,
>>>>Grigori
>>>>
>>>>
>>>>Grigori Khmyrov wrote:
>>>>
>>>>        
>>>>
>>>>>Can RTEMS handle big hard drives?
>>>>>Any help appreciated in solving this mystery.
>>>>>
>>>>>After that big discussion about FileIO example we got it working.
>>>>>But it still some issues.
>>>>>
>>>>>500 MB Hard drive    500 MB FAT16 partition   ---    works OK
>>>>>   3 GB Hard drive     800 MB FAT16 partition   ---   DOESN'T work
>>>>>   4 GB Hard drive         2 GB  FAT16 partition   ---   DOESN'T work
>>>>>
>>>>>It's same like Yan Lou reported:
>>>>>Problem is in initializing partition of /dev/hda using FileIO  example.
>>>>>Program stops at 1231 of cpukit/libblock/src/bdbuf.c
>>>>>
>>>>>_CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
>>>>>                             WATCHDOG_NO_TIMEOUT, level);
>>>>>
>>>>>Here is the call graph:
>>>>>
>>>>>in cpukit/libblock/src/ide_part_table.c
>>>>>
>>>>>rtems_ide_part_table_initialize() --> rtems_ide_part_table_get()
>>>>>-->  read_mbr() --> get_sector() --> rtems_bdbuf_read()
>>>>>
>>>>>in cpukit/libblock/src/bdbuf.c
>>>>>
>>>>>rtems_bdbuf_read() --> _CORE_mutex_Seize()
>>>>>
>>>>>Thank you,
>>>>>Grigori
>>>>>
>>>>>          
>>>>>
>
>
>  
>




More information about the users mailing list