Commit f0852922 authored by Andrea Lowe's avatar Andrea Lowe Committed by Greg Kroah-Hartman

staging/rdma/hfi1: Adding counter resolutions for DataPortCounters

Changing the 32-bit reserved field in opa_port_data_counters_msg
to the new 'resolution' field. PMA will use resolutions to right-
shift values for LocalLinkIntegrity and LinkErrorRecovery when
computing the ErrorCounterSummary for a DataPortCounters request.
Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarAndrea Lowe <andrea.l.lowe@intel.com>
Signed-off-by: default avatarJubin John <jubin.john@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6cc6ad2e
...@@ -2076,13 +2076,20 @@ struct opa_aggregate { ...@@ -2076,13 +2076,20 @@ struct opa_aggregate {
u8 data[0]; u8 data[0];
}; };
/* Request contains first two fields, response contains those plus the rest */ #define MSK_LLI 0x000000f0
#define MSK_LLI_SFT 4
#define MSK_LER 0x0000000f
#define MSK_LER_SFT 0
#define ADD_LLI 8
#define ADD_LER 2
/* Request contains first three fields, response contains those plus the rest */
struct opa_port_data_counters_msg { struct opa_port_data_counters_msg {
__be64 port_select_mask[4]; __be64 port_select_mask[4];
__be32 vl_select_mask; __be32 vl_select_mask;
__be32 resolution;
/* Response fields follow */ /* Response fields follow */
__be32 reserved1;
struct _port_dctrs { struct _port_dctrs {
u8 port_number; u8 port_number;
u8 reserved2[3]; u8 reserved2[3];
...@@ -2443,7 +2450,8 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp, ...@@ -2443,7 +2450,8 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
return reply((struct ib_mad_hdr *)pmp); return reply((struct ib_mad_hdr *)pmp);
} }
static u64 get_error_counter_summary(struct ib_device *ibdev, u8 port) static u64 get_error_counter_summary(struct ib_device *ibdev, u8 port,
u8 res_lli, u8 res_ler)
{ {
struct hfi1_devdata *dd = dd_from_ibdev(ibdev); struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
struct hfi1_ibport *ibp = to_iport(ibdev, port); struct hfi1_ibport *ibp = to_iport(ibdev, port);
...@@ -2459,14 +2467,14 @@ static u64 get_error_counter_summary(struct ib_device *ibdev, u8 port) ...@@ -2459,14 +2467,14 @@ static u64 get_error_counter_summary(struct ib_device *ibdev, u8 port)
CNTR_INVALID_VL); CNTR_INVALID_VL);
error_counter_summary += read_dev_cntr(dd, C_DC_RMT_PHY_ERR, error_counter_summary += read_dev_cntr(dd, C_DC_RMT_PHY_ERR,
CNTR_INVALID_VL); CNTR_INVALID_VL);
error_counter_summary += read_dev_cntr(dd, C_DC_TX_REPLAY, /* local link integrity must be right-shifted by the lli resolution */
CNTR_INVALID_VL); tmp = read_dev_cntr(dd, C_DC_RX_REPLAY, CNTR_INVALID_VL);
error_counter_summary += read_dev_cntr(dd, C_DC_RX_REPLAY, tmp += read_dev_cntr(dd, C_DC_TX_REPLAY, CNTR_INVALID_VL);
CNTR_INVALID_VL); error_counter_summary += (tmp >> res_lli);
error_counter_summary += read_dev_cntr(dd, C_DC_SEQ_CRC_CNT, /* link error recovery must b right-shifted by the ler resolution */
CNTR_INVALID_VL); tmp = read_dev_cntr(dd, C_DC_SEQ_CRC_CNT, CNTR_INVALID_VL);
error_counter_summary += read_dev_cntr(dd, C_DC_REINIT_FROM_PEER_CNT, tmp += read_dev_cntr(dd, C_DC_REINIT_FROM_PEER_CNT, CNTR_INVALID_VL);
CNTR_INVALID_VL); error_counter_summary += (tmp >> res_ler);
error_counter_summary += read_dev_cntr(dd, C_DC_RCV_ERR, error_counter_summary += read_dev_cntr(dd, C_DC_RCV_ERR,
CNTR_INVALID_VL); CNTR_INVALID_VL);
error_counter_summary += read_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL); error_counter_summary += read_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL);
...@@ -2520,6 +2528,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, ...@@ -2520,6 +2528,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
u32 num_ports; u32 num_ports;
u8 num_pslm; u8 num_pslm;
u8 lq, num_vls; u8 lq, num_vls;
u8 res_lli, res_ler;
u64 port_mask; u64 port_mask;
unsigned long port_num; unsigned long port_num;
unsigned long vl; unsigned long vl;
...@@ -2530,6 +2539,10 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, ...@@ -2530,6 +2539,10 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
num_pslm = hweight64(be64_to_cpu(req->port_select_mask[3])); num_pslm = hweight64(be64_to_cpu(req->port_select_mask[3]));
num_vls = hweight32(be32_to_cpu(req->vl_select_mask)); num_vls = hweight32(be32_to_cpu(req->vl_select_mask));
vl_select_mask = be32_to_cpu(req->vl_select_mask); vl_select_mask = be32_to_cpu(req->vl_select_mask);
res_lli = (u8)(be32_to_cpu(req->resolution) & MSK_LLI) >> MSK_LLI_SFT;
res_lli = res_lli ? res_lli + ADD_LLI : 0;
res_ler = (u8)(be32_to_cpu(req->resolution) & MSK_LER) >> MSK_LER_SFT;
res_ler = res_ler ? res_ler + ADD_LER : 0;
if (num_ports != 1 || (vl_select_mask & ~VL_MASK_ALL)) { if (num_ports != 1 || (vl_select_mask & ~VL_MASK_ALL)) {
pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD;
...@@ -2598,7 +2611,8 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, ...@@ -2598,7 +2611,8 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_BCN, CNTR_INVALID_VL)); cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_BCN, CNTR_INVALID_VL));
rsp->port_error_counter_summary = rsp->port_error_counter_summary =
cpu_to_be64(get_error_counter_summary(ibdev, port)); cpu_to_be64(get_error_counter_summary(ibdev, port,
res_lli, res_ler));
vlinfo = &(rsp->vls[0]); vlinfo = &(rsp->vls[0]);
vfi = 0; vfi = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment