Skip to content
Snippets Groups Projects
Commit 08baed3b authored by Jonathan Hanks's avatar Jonathan Hanks
Browse files

Merge branch 'dolphin_km_safty' into 'master'

Adding better failure checking in the dolphin proxy km

See merge request cds/software/advligorts!429
parents b88c8fd3 3bd496f9
No related branches found
No related tags found
3 merge requests!439RCG 5.0 release fro deb 10,!431Removing auto start of dolphin proxy km, adding catch because librts will use...,!429Adding better failure checking in the dolphin proxy km
......@@ -26,13 +26,18 @@
//Dolphin globals
volatile void * g_read_addrs [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ] = {0};
volatile void * g_write_addrs [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ] = {0};
static volatile void * g_read_addrs [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ] = {0};
static volatile void * g_write_addrs [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ] = {0};
static sci_l_segment_handle_t g_segments [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
static sci_map_handle_t g_client_map_handles [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
static sci_r_segment_handle_t g_remote_segment_handles [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
//static sci_device_info_t g_sci_dev_info [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
static int g_local_segment_created [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
static int g_local_segment_exported [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
static int g_remote_segment_mapped [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
static int g_remote_segment_connected [ MAX_ADAPTERS ][ MAX_MCAST_GROUPS ];
static int g_callback_registered [ MAX_ADAPTERS ]; //One callback per adapter
struct sock *nl_sock = NULL;
......@@ -93,7 +98,7 @@ session_callback( session_cb_arg_t IN arg,
uint32_t IN local_adapter_number )
{
/// @brief This function contains the required Dolphin callback routine. \n
printk(KERN_INFO MODULE_NAME ": Session callback reason=%d status=%d target_node=%d\n", reason,
printk(KERN_INFO MODULE_NAME ": Session callback reason=%d status=0x%x target_node=%d\n", reason,
status, target_node);
//if (reason == SR_OK) iop_rfm_valid = 1;
......@@ -116,7 +121,7 @@ connect_callback( void IN* arg,
uint32_t IN reason,
uint32_t IN status )
{
printk(KERN_INFO MODULE_NAME ": Connect callback reason=%d status=%d\n", reason, status);
printk(KERN_INFO MODULE_NAME ": Connect callback reason=%d status=0x%x\n", reason, status);
/*
if ( reason == 1 )
iop_rfm_valid = 1;
......@@ -139,6 +144,52 @@ create_segment_callback( void IN* arg,
return 0;
}
void free_dolphin_segment( unsigned segment_id, unsigned adapter_num )
{
//MAX_ADAPTERS ][ MAX_MCAST_GROUPS
if(segment_id > MAX_ADAPTERS || adapter_num > MAX_MCAST_GROUPS)
{
printk(KERN_ERR MODULE_NAME ":free_dolphin_segment() called but segment_id: %u or adapter_num: %u invalid. \n", segment_id, adapter_num);
return;
}
if( g_remote_segment_mapped[ adapter_num ][segment_id ] == 1)
{
sci_unmap_segment( &g_client_map_handles[ adapter_num ][ segment_id ], 0 );
g_remote_segment_mapped[ adapter_num ][segment_id ] = 0;
}
if( g_remote_segment_connected[ adapter_num ][ segment_id ] == 1)
{
sci_disconnect_segment( &g_remote_segment_handles[ adapter_num ][ segment_id ], NO_FLAGS );
g_remote_segment_connected[ adapter_num ][ segment_id ] = 0;
}
if( g_callback_registered[ adapter_num ] == 1)
{
sci_cancel_session_cb( adapter_num, NO_FLAGS );
g_callback_registered[ adapter_num ] = 0;
}
if( g_local_segment_exported[ adapter_num ][ segment_id ] == 1 )
{
sci_unexport_segment( g_segments[ adapter_num ][ segment_id ], adapter_num, NO_FLAGS );
g_local_segment_exported[ adapter_num ][ segment_id ] = 0;
}
if( g_local_segment_created[ adapter_num ][ segment_id ] == 1)
{
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS );
g_local_segment_created[ adapter_num ][ segment_id ] = 0;
}
g_read_addrs[ adapter_num ][segment_id] = NULL;
g_write_addrs[ adapter_num ][segment_id] = NULL;
}
DOLPHIN_ERROR_CODES allocate_segment(unsigned segment_id, unsigned adapter_num, unsigned size)
{
scierror_t err;
......@@ -153,30 +204,35 @@ DOLPHIN_ERROR_CODES allocate_segment(unsigned segment_id, unsigned adapter_num,
&g_segments[ adapter_num ][ segment_id ] );
printk(KERN_INFO MODULE_NAME ": DIS segment alloc status %d\n", err);
if ( err )
{
return DOLPHIN_ERROR_SEGMENT_SETUP_ERROR;
}
g_local_segment_created[ adapter_num ][ segment_id ] = 1;
err = sci_set_local_segment_available( g_segments[ adapter_num ][ segment_id ], adapter_num );
printk(KERN_INFO MODULE_NAME ": DIS segment making available status %d\n", err);
if ( err )
{
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS);
free_dolphin_segment(adapter_num, segment_id);
return DOLPHIN_ERROR_SEGMENT_SETUP_ERROR;
}
err = sci_export_segment( g_segments[ adapter_num ][ segment_id ], adapter_num, DIS_BROADCAST );
printk(KERN_INFO MODULE_NAME ": DIS segment export status 0x%x\n", err);
if ( err )
{
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS );
free_dolphin_segment(adapter_num, segment_id);
return DOLPHIN_ERROR_SEGMENT_SETUP_ERROR;
}
g_local_segment_exported[ adapter_num ][ segment_id ] = 1;
g_read_addrs[ adapter_num ][segment_id] = sci_local_kernel_virtual_address( g_segments[ adapter_num ][ segment_id ] );
if ( g_read_addrs[ adapter_num ][segment_id] == 0 )
{
printk(KERN_ERR MODULE_NAME ": DIS sci_local_kernel_virtual_address returned 0\n");
sci_unexport_segment( g_segments[ adapter_num ][ segment_id ], adapter_num, NO_FLAGS);
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS );
free_dolphin_segment(adapter_num, segment_id);
return DOLPHIN_ERROR_SEGMENT_SETUP_ERROR;
}
else
......@@ -195,13 +251,13 @@ DOLPHIN_ERROR_CODES allocate_segment(unsigned segment_id, unsigned adapter_num,
connect_callback,
0,
&g_remote_segment_handles[ adapter_num ][ segment_id ] );
printk(KERN_INFO MODULE_NAME ": DIS connect segment status %d\n", err);
printk(KERN_INFO MODULE_NAME ": DIS connect segment status %d\n", err);
if ( err )
{
sci_unexport_segment( g_segments[ adapter_num ][ segment_id ], adapter_num, NO_FLAGS);
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS );
free_dolphin_segment(adapter_num, segment_id);
return DOLPHIN_ERROR_SEGMENT_SETUP_ERROR;
}
g_remote_segment_connected[ adapter_num ][ segment_id ] = 1;
mdelay( 40 );
err = sci_map_segment( g_remote_segment_handles[ adapter_num ][ segment_id ],
......@@ -209,23 +265,18 @@ DOLPHIN_ERROR_CODES allocate_segment(unsigned segment_id, unsigned adapter_num,
adapter_num,
size,
&g_client_map_handles[ adapter_num ][ segment_id ] );
printk(KERN_INFO MODULE_NAME ": DIS segment mapping status 0x%x\n", err);
printk(KERN_INFO MODULE_NAME ": DIS segment mapping status 0x%x\n", err);
if ( err )
{
sci_disconnect_segment( &g_remote_segment_handles[ adapter_num ][ segment_id ], NO_FLAGS );
sci_unexport_segment( g_segments[ adapter_num ][ segment_id ], adapter_num, NO_FLAGS);
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS );
free_dolphin_segment(adapter_num, segment_id);
return DOLPHIN_ERROR_SEGMENT_SETUP_ERROR;
}
g_remote_segment_mapped[ adapter_num ][segment_id ] = 1;
g_write_addrs[ adapter_num ][ segment_id ] = sci_kernel_virtual_address_of_mapping( g_client_map_handles[ adapter_num ][segment_id ] );
if ( g_write_addrs[ adapter_num ][ segment_id ] == 0 )
{
// RTSLOG_INFO ("Got zero pointer from
// sci_kernel_virtual_address_of_mapping\n");
sci_disconnect_segment( &g_remote_segment_handles[ adapter_num ][ segment_id ], NO_FLAGS );
sci_unexport_segment( g_segments[ adapter_num ][ segment_id ], adapter_num, NO_FLAGS);
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS );
free_dolphin_segment(adapter_num, segment_id);
return DOLPHIN_ERROR_SEGMENT_SETUP_ERROR;
}
else
......@@ -234,27 +285,11 @@ DOLPHIN_ERROR_CODES allocate_segment(unsigned segment_id, unsigned adapter_num,
}
sci_register_session_cb( adapter_num, NO_FLAGS, session_callback, NULL );
g_callback_registered[ adapter_num ] = 1;
return DOLPHIN_ERROR_OK;
}
void free_dolphin_segment( unsigned segment_id, unsigned adapter_num )
{
if( g_read_addrs[adapter_num][segment_id] != NULL )
{
sci_unmap_segment( &g_client_map_handles[ adapter_num ][ segment_id ], 0 );
sci_disconnect_segment( &g_remote_segment_handles[ adapter_num ][ segment_id ], NO_FLAGS );
sci_unexport_segment( g_segments[ adapter_num ][ segment_id ], adapter_num, NO_FLAGS );
sci_remove_segment( &g_segments[ adapter_num ][ segment_id ], NO_FLAGS );
sci_cancel_session_cb( adapter_num, NO_FLAGS );
g_read_addrs[ adapter_num ][segment_id] = NULL;
g_write_addrs[ adapter_num ][segment_id] = NULL;
}
else
{
printk(KERN_INFO MODULE_NAME ": Free requested for segment_id %u, adapter_num: %d, but not allocated\n", segment_id, adapter_num);
}
}
void handle_alloc_req( dolphin_mc_alloc_req * req_ptr , unsigned pid)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment