fileio example on HD more than 2GB

Joel Sherrill joel.sherrill at oarcorp.com
Mon May 1 15:44:00 UTC 2006


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