Ignore:
Timestamp:
Mar 28, 2018, 2:40:29 PM (4 years ago)
Author:
alain
Message:

Fix various bugs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/tsar_mips32/drivers/soclib_bdv.c

    r436 r437  
    22 * soclib_bdv.c - soclib simple block device driver implementation.
    33 *
    4  * Author     Alain Greiner (2016)
     4 * Author     Alain Greiner (2016,2017,2018)
    55 *
    66 * Copyright (c) UPMC Sorbonne Universites
     
    7474    buf_xp   = (xptr_t)hal_remote_lwd( XPTR( th_cxy , &th_ptr->ioc_cmd.buf_xp ) );
    7575    ioc_xp   = (xptr_t)hal_remote_lwd( XPTR( th_cxy , &th_ptr->ioc_cmd.dev_xp ) );
     76
     77#if CONFIG_DEBUG_HAL_IOC_RX
     78uint32_t cycle = (uint32_t)hal_get_cycles();
     79if( (CONFIG_DEBUG_HAL_IOC_RX < cycle) && (cmd_type != IOC_WRITE ) )
     80printk("\n[DBG] %s : thread %x enter for RX / cycle %d\n",
     81__FUNCTION__ , CURRENT_THREAD , cycle );
     82#endif
     83
     84#if CONFIG_DEBUG_HAL_IOC_TX
     85uint32_t cycle = (uint32_t)hal_get_cycles();
     86if( (CONFIG_DEBUG_HAL_IOC_TX < cycle) && (cmd_type == IOC_WRITE) )
     87printk("\n[DBG] %s : thread %x enter for TX / cycle %d\n",
     88__FUNCTION__ , CURRENT_THREAD , cycle );
     89#endif
    7690
    7791    // get IOC device cluster and local pointer
     
    138152    }
    139153   
     154#if CONFIG_DEBUG_HAL_IOC_RX
     155cycle = (uint32_t)hal_get_cycles();
     156if( (CONFIG_DEBUG_HAL_IOC_RX < cycle) && (cmd_type != TXT_WRITE) )
     157printk("\n[DBG] %s : thread %x exit after RX / cycle %d\n",
     158__FUNCTION__ , CURRENT_THREAD , cycle );
     159#endif
     160
     161#if CONFIG_DEBUG_HAL_IOC_TX
     162cycle = (uint32_t)hal_get_cycles();
     163if( (CONFIG_DEBUG_HAL_IOC_TX < cycle) && (cmd_type == TXT_WRITE) )
     164printk("\n[DBG] %s : thread %x exit after TX / cycle %d\n",
     165__FUNCTION__ , CURRENT_THREAD , cycle );
     166#endif
     167
    140168} // end soclib_bdv_cmd()
    141169
     
    144172void __attribute__ ((noinline)) soclib_bdv_isr( chdev_t * chdev )
    145173{
     174    error_t  error = 0;
     175
    146176    // get extended pointer on client thread
    147177    xptr_t root = XPTR( local_cxy , &chdev->wait_root );
     
    155185    thread_t * client_ptr = (thread_t *)GET_PTR( client_xp );
    156186
     187    // get command type
     188    uint32_t   cmd_type = hal_remote_lw( XPTR( client_cxy , &client_ptr->ioc_cmd.type ) );
     189   
    157190    // get SOCLIB_BDV device cluster and local pointer
    158191    cxy_t      bdv_cxy  = GET_CXY( chdev->base );
     
    162195        uint32_t status = hal_remote_lw( XPTR( bdv_cxy , bdv_ptr + BDV_STATUS_REG ) );   
    163196
     197    if( cmd_type == IOC_READ )
     198    {
     199            error = (status != BDV_READ_SUCCESS);
     200
     201#if CONFIG_DEBUG_HAL_IOC_RX
     202uint32_t cycle = (uint32_t)hal_get_cycles();
     203if( CONFIG_DEBUG_HAL_IOC_RX < cycle )
     204printk("\n[DBG] %s : IOC_IRQ / RX transfer / client %x / server %x / cycle %d\n",
     205__FUNCTION__, client_ptr , chdev->server , cycle );
     206#endif
     207
     208    }
     209        else if( cmd_type == IOC_WRITE )
     210    {
     211            error = (status != BDV_WRITE_SUCCESS);
     212
     213#if CONFIG_DEBUG_HAL_IOC_TX
     214uint32_t cycle = (uint32_t)hal_get_cycles();
     215if( CONFIG_DEBUG_HAL_IOC_TX < cycle )
     216printk("\n[DBG] %s : IOC_IRQ / RX transfer / client %x / server %x / cycle %d\n",
     217__FUNCTION__, client_ptr , chdev->server , cycle );
     218#endif
     219
     220    }
     221    else
     222    {
     223        assert( false , __FUNCTION__ , "IOC_SYNC_READ should not use IRQ" );
     224    }
     225
    164226    // set operation status in command
    165         if((status != BDV_READ_SUCCESS) && (status != BDV_WRITE_SUCCESS))
    166     {
    167         hal_remote_sw( XPTR( client_cxy , &client_ptr->ioc_cmd.error ) , 1 );
    168     }
    169         else
    170     {
    171         hal_remote_sw( XPTR( client_cxy , &client_ptr->ioc_cmd.error ) , 0 );
    172     }
     227    hal_remote_sw( XPTR( client_cxy , &client_ptr->ioc_cmd.error ) , error );
    173228
    174229    // unblock server thread
    175230    thread_unblock( server_xp , THREAD_BLOCKED_ISR );
    176231
    177     // unblock client thread
    178     thread_unblock( client_xp , THREAD_BLOCKED_IO );
    179 
    180232} // end soclib_bdv_isr()
    181233
Note: See TracChangeset for help on using the changeset viewer.