static void bnx2x_storm_stats_post(struct bnx2x *bp) { if (!bp->stats_pending) { struct common_query_ramrod_data ramrod_data = {0}; int i, rc; spin_lock_bh(&bp->stats_lock); if (bp->stats_pending) { spin_unlock_bh(&bp->stats_lock); return; } ramrod_data.drv_counter = bp->stats_counter++; ramrod_data.collect_port = bp->port.pmf ? 1 : 0; for_each_eth_queue(bp, i) ramrod_data.ctr_id_vector |= (1 << bp->fp[i].cl_id); rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_STAT_QUERY, 0, ((u32 *)&ramrod_data)[1], ((u32 *)&ramrod_data)[0], 1); if (rc == 0) bp->stats_pending = 1; spin_unlock_bh(&bp->stats_lock); } }
/* Tell PF about SB addresses */ int bnx2x_vfpf_init(struct bnx2x *bp) { struct vfpf_init_tlv *req = &bp->vf2pf_mbox->req.init; struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp; int rc, i; /* clear mailbox and prep first tlv */ bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_INIT, sizeof(*req)); /* status blocks */ for_each_eth_queue(bp, i) req->sb_addr[i] = (dma_addr_t)bnx2x_fp(bp, i, status_blk_mapping); /* statistics - requests only supports single queue for now */ req->stats_addr = bp->fw_stats_data_mapping + offsetof(struct bnx2x_fw_stats_data, queue_stats); /* add list termination tlv */ bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv)); /* output tlvs list */ bnx2x_dp_tlv_list(bp, req); rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping); if (rc) goto out; if (resp->hdr.status != PFVF_STATUS_SUCCESS) { BNX2X_ERR("INIT VF failed: %d. Breaking...\n", resp->hdr.status); rc = -EAGAIN; goto out; } DP(BNX2X_MSG_SP, "INIT VF Succeeded\n"); out: bnx2x_vfpf_finalize(bp, &req->first_tlv); return rc; }