From 0bee9db2b598a2436762626d3222da0d349d76ad Mon Sep 17 00:00:00 2001 From: ftillier Date: Mon, 15 May 2006 22:45:01 +0000 Subject: [PATCH] [IBAL] Add GET-only local MAD support to user-mode. Signed-off-by: Yossi Leybovich (sleybo@mellanox.co.il) git-svn-id: svn://openib.tc.cornell.edu/gen1@351 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/core/al/al_dev.h | 4 +- trunk/core/al/al_verbs.h | 6 +- trunk/core/al/kernel/al_proxy_subnet.c | 65 +++++++++++++++++- trunk/core/al/user/ual_mad.c | 42 ++++++++++++ trunk/core/al/user/ual_mad.h | 7 ++ trunk/inc/iba/ib_al_ioctl.h | 45 ++++++++++++ trunk/inc/iba/ib_types.h | 94 ++++++++++++++++++++++++++ 7 files changed, 256 insertions(+), 7 deletions(-) diff --git a/trunk/core/al/al_dev.h b/trunk/core/al/al_dev.h index ad9f6dd7..4c69fcce 100644 --- a/trunk/core/al/al_dev.h +++ b/trunk/core/al/al_dev.h @@ -247,7 +247,8 @@ typedef enum _al_subnet_ops ual_dereg_mad_pool_cmd, ual_cancel_mad_cmd, ual_mad_recv_comp_cmd, - + ual_local_mad_cmd, + al_subnet_maxops } al_subnet_ops_t; @@ -425,6 +426,7 @@ typedef enum _al_dev_ops #define UAL_CANCEL_MAD IOCTL_CODE(ALDEV_KEY, ual_cancel_mad_cmd) #define UAL_GET_SPL_QP_ALIAS IOCTL_CODE(ALDEV_KEY, ual_get_spl_qp_cmd) #define UAL_MAD_RECV_COMP IOCTL_CODE(ALDEV_KEY, ual_mad_recv_comp_cmd) +#define UAL_LOCAL_MAD IOCTL_CODE(ALDEV_KEY, ual_local_mad_cmd) /* CM Related ioctl commands */ #define UAL_CM_LISTEN IOCTL_CODE(ALDEV_KEY, ual_cm_listen_cmd) diff --git a/trunk/core/al/al_verbs.h b/trunk/core/al/al_verbs.h index 44690c7b..dd9a289c 100644 --- a/trunk/core/al/al_verbs.h +++ b/trunk/core/al/al_verbs.h @@ -531,11 +531,7 @@ verbs_local_mad( IN const void* const p_mad_in, IN void* p_mad_out ) { - UNUSED_PARAM( h_ca ); - UNUSED_PARAM( port_num ); - UNUSED_PARAM( p_mad_in ); - UNUSED_PARAM( p_mad_out ); - return IB_UNSUPPORTED; + return ual_local_mad( h_ca, port_num, p_mad_in, p_mad_out ); } #define check_local_mad(h_qp) \ diff --git a/trunk/core/al/kernel/al_proxy_subnet.c b/trunk/core/al/kernel/al_proxy_subnet.c index 4d66ff89..09433a6e 100644 --- a/trunk/core/al/kernel/al_proxy_subnet.c +++ b/trunk/core/al/kernel/al_proxy_subnet.c @@ -1020,10 +1020,70 @@ proxy_cancel_mad( } +/* + * Process the ioctl UAL_LOCAL_MAD: + */ +static cl_status_t +proxy_local_mad( + IN void *p_open_context, + IN cl_ioctl_handle_t h_ioctl, + OUT size_t *p_ret_bytes ) +{ + ual_local_mad_ioctl_t *p_ioctl = + (ual_local_mad_ioctl_t *)cl_ioctl_in_buf( h_ioctl ); + al_dev_open_context_t *p_context = + (al_dev_open_context_t *)p_open_context; + ib_ca_handle_t h_ca; + ib_api_status_t status; + + CL_ENTER(AL_DBG_MAD , g_al_dbg_lvl ); + + /* Validate input buffers. */ + if( !cl_ioctl_in_buf( h_ioctl ) || !cl_ioctl_out_buf( h_ioctl ) || + cl_ioctl_in_size( h_ioctl ) != sizeof(p_ioctl->in) || + cl_ioctl_out_size( h_ioctl ) != sizeof(p_ioctl->out) ) + { + CL_EXIT( AL_DBG_MAD , g_al_dbg_lvl ); + return CL_INVALID_PARAMETER; + } + + if( ((ib_mad_t*)p_ioctl->in.mad_in)->method != IB_MAD_METHOD_GET ) + { + AL_TRACE( AL_DBG_ERROR, + ("invalid method %d\n", ((ib_mad_t*)p_ioctl->in.mad_in)->method) ); + status = IB_UNSUPPORTED; + goto proxy_local_mad_err; + } + + /* Validate CA handle */ + h_ca = (ib_ca_handle_t) + al_hdl_ref( p_context->h_al, p_ioctl->in.h_ca, AL_OBJ_TYPE_H_CA ); + if( !h_ca ) + { + status = IB_INVALID_CA_HANDLE; + goto proxy_local_mad_err; + } + + /* Set the return bytes in all cases */ + *p_ret_bytes = sizeof(p_ioctl->out); + + status = ib_local_mad( + h_ca, p_ioctl->in.port_num, p_ioctl->in.mad_in, p_ioctl->out.mad_out ); + + deref_al_obj( &h_ca->obj ); + +proxy_local_mad_err: + p_ioctl->out.status = status; + + CL_EXIT(AL_DBG_MAD ,g_al_dbg_lvl ); + return CL_SUCCESS; +} + + cl_status_t subnet_ioctl( IN cl_ioctl_handle_t h_ioctl, - OUT size_t *p_ret_bytes ) + OUT size_t *p_ret_bytes ) { cl_status_t cl_status; IO_STACK_LOCATION *p_io_stack; @@ -1080,6 +1140,9 @@ subnet_ioctl( case UAL_DEREG_MAD_POOL: cl_status = proxy_dereg_mad_pool( p_context, h_ioctl, p_ret_bytes ); break; + case UAL_LOCAL_MAD: + cl_status = proxy_local_mad( p_context, h_ioctl, p_ret_bytes ); + break; default: cl_status = CL_INVALID_PARAMETER; break; diff --git a/trunk/core/al/user/ual_mad.c b/trunk/core/al/user/ual_mad.c index 5df52884..4c00e530 100644 --- a/trunk/core/al/user/ual_mad.c +++ b/trunk/core/al/user/ual_mad.c @@ -468,3 +468,45 @@ ual_get_recv_mad( } +ib_api_status_t +ual_local_mad( + IN const ib_ca_handle_t h_ca, + IN const uint8_t port_num, + IN ib_mad_t* const p_mad_in, + IN ib_mad_t* p_mad_out ) +{ + ual_local_mad_ioctl_t local_mad_ioctl; + uintn_t bytes_ret; + cl_status_t cl_status = CL_SUCCESS; + ib_api_status_t status = IB_SUCCESS; + + AL_ENTER( AL_DBG_CA ); + + local_mad_ioctl.in.h_ca = h_ca->obj.p_ci_ca->obj.hdl; + local_mad_ioctl.in.port_num = port_num; + cl_memcpy( local_mad_ioctl.in.mad_in, p_mad_in, + sizeof(local_mad_ioctl.in.mad_in) ); + + cl_status = do_al_dev_ioctl( UAL_LOCAL_MAD, + &local_mad_ioctl.in, sizeof(local_mad_ioctl.in), + &local_mad_ioctl.out, sizeof(local_mad_ioctl.out), + &bytes_ret ); + + if( cl_status != CL_SUCCESS || bytes_ret != sizeof(local_mad_ioctl.out) ) + { + AL_TRACE( AL_DBG_ERROR, + ("UAL_LOCAL_MAD IOCTL returned %s\n", CL_STATUS_MSG(cl_status)) ); + status = IB_ERROR; + } + else + { + status = local_mad_ioctl.out.status; + cl_memcpy( p_mad_out, local_mad_ioctl.out.mad_out, + sizeof(local_mad_ioctl.out.mad_out) ); + } + + AL_EXIT( AL_DBG_CA ); + return status; +} + + diff --git a/trunk/core/al/user/ual_mad.h b/trunk/core/al/user/ual_mad.h index 2518c36d..a1956469 100644 --- a/trunk/core/al/user/ual_mad.h +++ b/trunk/core/al/user/ual_mad.h @@ -86,4 +86,11 @@ ual_get_recv_mad( IN const size_t buf_size, OUT ib_mad_element_t** const pp_mad_element ); +ib_api_status_t +ual_local_mad( +IN const ib_ca_handle_t h_ca, + IN const uint8_t port_num, + IN const void* const p_mad_in, + IN void* p_mad_out ); + #endif /* __IB_UAL_MAD_H__ */ diff --git a/trunk/inc/iba/ib_al_ioctl.h b/trunk/inc/iba/ib_al_ioctl.h index f1d2b70e..e6b5cc9e 100644 --- a/trunk/inc/iba/ib_al_ioctl.h +++ b/trunk/inc/iba/ib_al_ioctl.h @@ -2228,6 +2228,51 @@ typedef union _ual_mad_recv_ioctl +/****s* User-mode Access Layer/ual_local_mad_ioctl_t +* NAME +* ual_local_mad_ioctl_t +* +* DESCRIPTION +* IOCTL structure containing the input and output parameters for +* ib_local_mad +* +* SYNOPSIS +*/ +typedef union _ual_local_mad_ioctl +{ + struct _ual_local_mad_ioctl_in + { + uint64_t h_ca; + uint8_t port_num; + uint8_t mad_in[MAD_BLOCK_SIZE]; + + } in; + struct _ual_local_mad_ioctl_out + { + ib_api_status_t status; + uint8_t mad_out[MAD_BLOCK_SIZE]; + + } out; + +} ual_local_mad_ioctl_t; +/* +** FIELDS +* in.h_ca +* The handle to an open instance of CA returned via a +* ual_open_ca_ioctl structure. +* in.port_num +* Port number this MAD refere to. +* in.mad_in +* Mad structure from user mode to forward to local HCA. +* +** out.status +* Status of the operation. +* out.mad_out +* Mad structure answer from local HCA for user mode. +*****/ + + + /****s* User-mode Access Layer/ual_create_cep_ioctl_t * NAME * ual_create_cep_ioctl_t diff --git a/trunk/inc/iba/ib_types.h b/trunk/inc/iba/ib_types.h index 1c477292..e61c9212 100644 --- a/trunk/inc/iba/ib_types.h +++ b/trunk/inc/iba/ib_types.h @@ -7090,6 +7090,100 @@ typedef uint8_t ib_sidr_status_t; #define IB_SIDR_UNSUPPORTED_VER 5 +/************/ +/****s* IBA Base: Types/ib_gmp_t +* NAME +* ib_gmp_t +* +* DESCRIPTION +* IBA defined GMP MAD format. (16.1.1) +* +* SYNOPSIS +*/ +#define IB_GMP_DATA_SIZE 200 + +#include +typedef struct _ib_gmp +{ + uint8_t base_ver; + uint8_t mgmt_class; + uint8_t class_ver; + uint8_t method; + ib_net16_t status; + ib_net16_t resv; + ib_net64_t trans_id; + ib_net16_t attr_id; + ib_net16_t resv1; + ib_net32_t attr_mod; + uint8_t resv2[40]; + uint8_t data[IB_GMP_DATA_SIZE]; + +} PACK_SUFFIX ib_gmp_t; +#include +/**********/ +#define IB_GMP_MAD_HDR_SIZE (sizeof(ib_gmp_t) - IB_GMP_DATA_SIZE) + + + +/************/ +/****s* IBA Base: Types/ib_port_counters_t +* NAME +* ib_gmp_t +* +* DESCRIPTION +* IBA defined PortCounters MAD format. (16.1.3.5) +* +* SYNOPSIS +*/ +#include +typedef struct _ib_port_counters +{ + uint8_t reserved0; + uint8_t port_select; + ib_net16_t counter_select; + ib_net16_t symbol_error_counter; + uint8_t link_error_recovery_counter; + uint8_t link_down_counter; + ib_net16_t port_rcv_errors; + ib_net16_t port_rcv_remote_physical_errors; + ib_net16_t port_rcv_switch_relay_errors; + ib_net16_t port_xmit_discard; + uint8_t port_xmit_constraint_errors; + uint8_t port_rcv_constraint_errors; + uint8_t reserved1; + /* uint4_t excessive_buffer_overrun_errors; + uint4_t local_link_integrity_errors; */ + uint8_t lli_errors_exc_buf_errors; + ib_net16_t reserved2; + ib_net16_t vl15_dropped; + ib_net32_t port_xmit_data; + ib_net32_t port_rcv_data; + ib_net32_t port_xmit_pkts; + ib_net32_t port_rcv_pkts; + +} PACK_SUFFIX ib_port_counters_t; +#include + + +#define IB_COUNTER_SYMBOL_ERROR CL_NTOH16(1<<0) +#define IB_COUNTER_LINK_RECOVERY_ERROR CL_NTOH16(1<<1) +#define IB_COUNTER_LINK_DOWN CL_NTOH16(1<<2) +#define IB_COUNTER_RCV_ERROR CL_NTOH16(1<<3) +#define IB_COUNTERT_RCV_RMT_PHY_ERROR CL_NTOH16(1<<4) +#define IB_COUNTER_RCV_SWITCH_RELAY_ERROR CL_NTOH16(1<<5) +#define IB_COUNTER_XMIT_DISCARD CL_NTOH16(1<<6) +#define IB_COUNTER_XMIT_CONSTRAIN CL_NTOH16(1<<7) +#define IB_COUNTER_RCV_CONSTRAIN CL_NTOH16(1<<8) +#define IB_COUNTER_LINK_INTEG_ERROR CL_NTOH16(1<<9) +#define IB_COUNTER_EXECE_BUF_ERROR CL_NTOH16(1<<10) +#define IB_COUNTER_VL15_DROP CL_NTOH16(1<<11) +#define IB_COUNTER_XMIT_DATA CL_NTOH16(1<<12) +#define IB_COUNTER_XMIT_PKT CL_NTOH16(1<<13) +#define IB_COUNTER_RCV_DATA CL_NTOH16(1<<14) +#define IB_COUNTER_RCV_PKT CL_NTOH16(1<<15) +#define IB_COUNTER_ALL 0xff + + /* * The following definitions are shared between the Access Layer and VPD */ -- 2.41.0