static void bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) { struct bnx2x_softc *sc = dev->data->dev_private; PMD_INIT_FUNC_TRACE(); bnx2x_stats_handle(sc, STATS_EVENT_UPDATE); memset(stats, 0, sizeof (struct rte_eth_stats)); stats->ipackets = HILO_U64(sc->eth_stats.total_unicast_packets_received_hi, sc->eth_stats.total_unicast_packets_received_lo) + HILO_U64(sc->eth_stats.total_multicast_packets_received_hi, sc->eth_stats.total_multicast_packets_received_lo) + HILO_U64(sc->eth_stats.total_broadcast_packets_received_hi, sc->eth_stats.total_broadcast_packets_received_lo); stats->opackets = HILO_U64(sc->eth_stats.total_unicast_packets_transmitted_hi, sc->eth_stats.total_unicast_packets_transmitted_lo) + HILO_U64(sc->eth_stats.total_multicast_packets_transmitted_hi, sc->eth_stats.total_multicast_packets_transmitted_lo) + HILO_U64(sc->eth_stats.total_broadcast_packets_transmitted_hi, sc->eth_stats.total_broadcast_packets_transmitted_lo); stats->ibytes = HILO_U64(sc->eth_stats.total_bytes_received_hi, sc->eth_stats.total_bytes_received_lo); stats->obytes = HILO_U64(sc->eth_stats.total_bytes_transmitted_hi, sc->eth_stats.total_bytes_transmitted_lo); stats->ierrors = HILO_U64(sc->eth_stats.error_bytes_received_hi, sc->eth_stats.error_bytes_received_lo); stats->oerrors = 0; stats->rx_nombuf = HILO_U64(sc->eth_stats.no_buff_discard_hi, sc->eth_stats.no_buff_discard_lo); }
static inline long bnx2x_hilo(u32 *hiref) { u32 lo = *(hiref + 1); #if (BITS_PER_LONG == 64) u32 hi = *hiref; return HILO_U64(hi, lo); #else return lo; #endif }
static irqreturn_t qedr_irq_handler(int irq, void *handle) { u16 hw_comp_cons, sw_comp_cons; struct qedr_cnq *cnq = handle; struct regpair *cq_handle; struct qedr_cq *cq; qed_sb_ack(cnq->sb, IGU_INT_DISABLE, 0); qed_sb_update_sb_idx(cnq->sb); hw_comp_cons = le16_to_cpu(*cnq->hw_cons_ptr); sw_comp_cons = qed_chain_get_cons_idx(&cnq->pbl); /* Align protocol-index and chain reads */ rmb(); while (sw_comp_cons != hw_comp_cons) { cq_handle = (struct regpair *)qed_chain_consume(&cnq->pbl); cq = (struct qedr_cq *)(uintptr_t)HILO_U64(cq_handle->hi, cq_handle->lo); if (cq == NULL) { DP_ERR(cnq->dev, "Received NULL CQ cq_handle->hi=%d cq_handle->lo=%d sw_comp_cons=%d hw_comp_cons=%d\n", cq_handle->hi, cq_handle->lo, sw_comp_cons, hw_comp_cons); break; } if (cq->sig != QEDR_CQ_MAGIC_NUMBER) { DP_ERR(cnq->dev, "Problem with cq signature, cq_handle->hi=%d ch_handle->lo=%d cq=%p\n", cq_handle->hi, cq_handle->lo, cq); break; } cq->arm_flags = 0; if (!cq->destroyed && cq->ibcq.comp_handler) (*cq->ibcq.comp_handler) (&cq->ibcq, cq->ibcq.cq_context); /* The CQ's CNQ notification counter is checked before * destroying the CQ in a busy-wait loop that waits for all of * the CQ's CNQ interrupts to be processed. It is increased * here, only after the completion handler, to ensure that the * the handler is not running when the CQ is destroyed. */ cq->cnq_notif++; sw_comp_cons = qed_chain_get_cons_idx(&cnq->pbl); cnq->n_comp++; } qed_ops->rdma_cnq_prod_update(cnq->dev->rdma_ctx, cnq->index, sw_comp_cons); qed_sb_ack(cnq->sb, IGU_INT_ENABLE, 1); return IRQ_HANDLED; }