diff options
-rw-r--r-- | drivers/staging/fsl_dpa_offload/dpa_stats.c | 132 |
1 files changed, 73 insertions, 59 deletions
diff --git a/drivers/staging/fsl_dpa_offload/dpa_stats.c b/drivers/staging/fsl_dpa_offload/dpa_stats.c index b911732..49ef4cb 100644 --- a/drivers/staging/fsl_dpa_offload/dpa_stats.c +++ b/drivers/staging/fsl_dpa_offload/dpa_stats.c @@ -1605,7 +1605,7 @@ static int set_cnt_traffic_mng_cb(struct dpa_stats_cnt_cb *cnt_cb, struct dpa_stats *dpa_stats = cnt_cb->dpa_stats; uint32_t cnt_sel = params->traffic_mng_params.cnt_sel; uint32_t cnt_src = params->traffic_mng_params.src; - uint64_t frames, bytes; + u64 frames = 0, bytes = 0; int err = 0; if (!dpa_stats) { @@ -1618,10 +1618,19 @@ static int set_cnt_traffic_mng_cb(struct dpa_stats_cnt_cb *cnt_cb, return -EFAULT; } - if (cnt_sel == 0 || cnt_sel > DPA_STATS_CNT_NUM_ALL) { - log_err("Parameter cnt_sel %d must be in range (1 - %d) for " - "counter id %d\n", cnt_sel, DPA_STATS_CNT_NUM_ALL, - cnt_cb->id); + /* check the counter src */ + if (cnt_src > DPA_STATS_CNT_TRAFFIC_CG) { + log_err("Parameter src %d must be in range (%d - %d) for " + "counter id %d\n", cnt_src, DPA_STATS_CNT_TRAFFIC_CLASS, + DPA_STATS_CNT_TRAFFIC_CG, cnt_cb->id); + return -EINVAL; + } + + /* check the counter selection */ + if (cnt_sel > DPA_STATS_CNT_NUM_ALL) { + log_err("Parameter cnt_sel %d must be in range (%d - %d) for " + "counter id %d\n", cnt_sel, DPA_STATS_CNT_NUM_OF_BYTES, + DPA_STATS_CNT_NUM_ALL, cnt_cb->id); return -EINVAL; } @@ -1659,12 +1668,11 @@ static int set_cnt_traffic_mng_cb(struct dpa_stats_cnt_cb *cnt_cb, return -EINVAL; } - /* Decrease one to obtain the mask for all statistics */ + /* Set number of statistics that will be written by this counter */ if (cnt_sel == DPA_STATS_CNT_NUM_ALL) - cnt_sel -= 1; - - cnt_sel_to_stats(&cnt_cb->info, - dpa_stats->stats_sel[DPA_STATS_CNT_TRAFFIC_MNG], cnt_sel); + cnt_cb->info.stats_num = 2; + else + cnt_cb->info.stats_num = 1; /* Set number of bytes that will be written by this counter */ cnt_cb->bytes_num = STATS_VAL_SIZE * cnt_cb->info.stats_num; @@ -2241,7 +2249,7 @@ static int set_cls_cnt_traffic_mng_cb(struct dpa_stats_cnt_cb *cnt_cb, uint32_t cnt_sel = params->traffic_mng_params.cnt_sel; uint32_t cnt_src = params->traffic_mng_params.src; uint32_t i = 0; - uint64_t frames, bytes; + u64 frames = 0, bytes = 0; int err = 0; if (!dpa_stats) { @@ -2249,69 +2257,75 @@ static int set_cls_cnt_traffic_mng_cb(struct dpa_stats_cnt_cb *cnt_cb, return -EFAULT; } - /* First check the counter src */ - if (cnt_src > DPA_STATS_CNT_TRAFFIC_CG || - cnt_src < DPA_STATS_CNT_TRAFFIC_CLASS) { - log_err("Parameter src %d must be in range (%d - %d) for " - "counter id %d\n", cnt_src, DPA_STATS_CNT_TRAFFIC_CLASS, - DPA_STATS_CNT_TRAFFIC_CG, cnt_cb->id); - return -EINVAL; - } - - /* Then check the counter selection */ - if (cnt_sel == 0 || cnt_sel > DPA_STATS_CNT_NUM_ALL) { - log_err("Parameter cnt_sel %d must be in range (1 - %d) for " - "counter id %d\n", cnt_sel, DPA_STATS_CNT_NUM_ALL, - cnt_cb->id); + /* check the counter selection */ + if (cnt_sel > DPA_STATS_CNT_NUM_ALL) { + log_err("Parameter cnt_sel %d must be in range (%d - %d) for " + "counter id %d\n", cnt_sel, DPA_STATS_CNT_NUM_OF_BYTES, + DPA_STATS_CNT_NUM_ALL, cnt_cb->id); return -EINVAL; } cnt_cb->members_num = params->class_members; - /* Check the user provided Traffic Manager object */ - for (i = 0; i < params->class_members; i++) { - if (!params->traffic_mng_params.traffic_mng[i]) { - log_err("Parameter traffic_mng handle cannot be NULL " - "for member %d\n", i); - return -EFAULT; - } - cnt_cb->gen_cb.objs[i] = + /* check the counter src and set the get function */ + switch (cnt_src) { + case DPA_STATS_CNT_TRAFFIC_CLASS: + cnt_cb->f_get_cnt_stats = get_cnt_traffic_mng_cq_stats; + for (i = 0; i < params->class_members; i++) { + if (!params->traffic_mng_params.traffic_mng[i]) { + log_err("Parameter traffic_mng handle cannot be" + " NULL for member %d\n", i); + return -EFAULT; + } + cnt_cb->gen_cb.objs[i] = params->traffic_mng_params.traffic_mng[i]; - - switch (cnt_src) { - case DPA_STATS_CNT_TRAFFIC_CLASS: - cnt_cb->f_get_cnt_stats = get_cnt_traffic_mng_cq_stats; + /* Check the user provided Traffic Manager object */ err = qman_ceetm_cq_get_dequeue_statistics( - params->traffic_mng_params.traffic_mng[i], 0, - &frames, &bytes); + cnt_cb->gen_cb.objs[i], 0, &frames, + &bytes); if (err < 0) { log_err("Invalid Traffic Manager qm_ceetm_cq " "object for counter id %d\n", cnt_cb->id); return -EINVAL; } - break; - case DPA_STATS_CNT_TRAFFIC_CG: - cnt_cb->f_get_cnt_stats = get_cnt_traffic_mng_ccg_stats; + } + break; + + case DPA_STATS_CNT_TRAFFIC_CG: + cnt_cb->f_get_cnt_stats = get_cnt_traffic_mng_ccg_stats; + for (i = 0; i < params->class_members; i++) { + if (!params->traffic_mng_params.traffic_mng[i]) { + log_err("Parameter traffic_mng handle cannot be" + " NULL for member %d\n", i); + return -EFAULT; + } + cnt_cb->gen_cb.objs[i] = + params->traffic_mng_params.traffic_mng[i]; + /* Check the user provided Traffic Manager object */ err = qman_ceetm_ccg_get_reject_statistics( - params->traffic_mng_params.traffic_mng[i], 0, - &frames, &bytes); + cnt_cb->gen_cb.objs[i], 0, &frames, + &bytes); if (err < 0) { - log_err("Invalid Traffic Manager qm_ceetm_ccg " - "object for counter id %d\n", - cnt_cb->id); + log_err("Invalid Traffic Manager qm_ceetm_cq " + "object for counter id %d\n", + cnt_cb->id); return -EINVAL; } - break; } + break; + default: + log_err("Parameter src %d must be in range (%d - %d) for " + "counter id %d\n", cnt_src, DPA_STATS_CNT_TRAFFIC_CLASS, + DPA_STATS_CNT_TRAFFIC_CG, cnt_cb->id); + return -EINVAL; } - /* Decrease one to obtain the mask for all statistics */ + /* Set number of statistics that will be written by this counter */ if (cnt_sel == DPA_STATS_CNT_NUM_ALL) - cnt_sel -= 1; - - cnt_sel_to_stats(&cnt_cb->info, - dpa_stats->stats_sel[DPA_STATS_CNT_TRAFFIC_MNG], cnt_sel); + cnt_cb->info.stats_num = 2; + else + cnt_cb->info.stats_num = 1; /* Set number of bytes that will be written by this counter */ cnt_cb->bytes_num = cnt_cb->members_num * @@ -2871,14 +2885,14 @@ static int get_cnt_traffic_mng_cq_stats(struct dpa_stats_req_cb *req_cb, struct dpa_stats_cnt_cb *cnt_cb) { uint32_t i = 0; - uint64_t stats_val[2]; + u64 stats_val[2]; int err = 0; for (i = 0; i < cnt_cb->members_num; i++) { /* Retrieve statistics for the current member */ err = qman_ceetm_cq_get_dequeue_statistics( cnt_cb->gen_cb.objs[i], 0, - stats_val[1], stats_val[0]); + &stats_val[1], &stats_val[0]); if (err < 0) { log_err("Cannot retrieve Traffic Manager Class Queue " "statistics for counter id %d\n", cnt_cb->id); @@ -2893,13 +2907,13 @@ static int get_cnt_traffic_mng_ccg_stats(struct dpa_stats_req_cb *req_cb, struct dpa_stats_cnt_cb *cnt_cb) { uint32_t i = 0; - uint64_t stats_val[2]; + u64 stats_val[2]; int err = 0; for (i = 0; i < cnt_cb->members_num; i++) { err = qman_ceetm_ccg_get_reject_statistics( cnt_cb->gen_cb.objs[i], 0, - stats_val[1], stats_val[0]); + &stats_val[1], &stats_val[0]); if (err < 0) { log_err("Cannot retrieve Traffic Manager Class " "Congestion Group statistics for counter id " @@ -3533,8 +3547,8 @@ int dpa_stats_get_counters(struct dpa_stats_cnt_request_params params, for (i = 0; i < params.cnts_ids_len; i++) { if (params.cnts_ids[i] == DPA_OFFLD_INVALID_OBJECT_ID || params.cnts_ids[i] > dpa_stats->config.max_counters) { - log_err("Counter id (cnt_ids[%d]) %d is not initialized " - "or is greater than maximum counters %d\n", i, + log_err("Counter id (cnt_ids[%d]) %d is not initialized" + " or is greater than maximum counters %d\n", i, params.cnts_ids[i], dpa_stats->config.max_counters); return -EINVAL; |