1fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit/******************************************************************* 2fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * This file is part of the Emulex RoCE Device Driver for * 3fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * RoCE (RDMA over Converged Ethernet) CNA Adapters. * 4fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * Copyright (C) 2008-2012 Emulex. All rights reserved. * 5fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * EMULEX and SLI are trademarks of Emulex. * 6fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * www.emulex.com * 7fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * * 8fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * This program is free software; you can redistribute it and/or * 9fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * modify it under the terms of version 2 of the GNU General * 10fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * Public License as published by the Free Software Foundation. * 11fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * This program is distributed in the hope that it will be useful. * 12fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * 13fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * 14fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE * 15fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * 16fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * TO BE LEGALLY INVALID. See the GNU General Public License for * 17fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * more details, a copy of which can be found in the file COPYING * 18fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * included with this package. * 19fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * 20fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * Contact Information: 21fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * linux-drivers@emulex.com 22fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * 23fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * Emulex 24fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * 3333 Susan Street 25fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * Costa Mesa, CA 92626 26fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *******************************************************************/ 27fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 28fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include <linux/sched.h> 29fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include <linux/interrupt.h> 30fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include <linux/log2.h> 31fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include <linux/dma-mapping.h> 32fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 33fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include <rdma/ib_verbs.h> 34fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include <rdma/ib_user_verbs.h> 35fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 36fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include "ocrdma.h" 37fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include "ocrdma_hw.h" 38fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include "ocrdma_verbs.h" 39fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit#include "ocrdma_ah.h" 40fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 41fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditenum mbx_status { 42fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_FAILED = 1, 43fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_ILLEGAL_FIELD = 3, 44fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_OOR = 100, 45fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_PD = 101, 46fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_PD_INUSE = 102, 47fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_CQ = 103, 48fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_QP = 104, 49fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_LKEY = 105, 50fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_ORD_EXCEEDS = 106, 51fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_IRD_EXCEEDS = 107, 52fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_SENDQ_WQE_EXCEEDS = 108, 53fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_RECVQ_RQE_EXCEEDS = 109, 54fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_SGE_SEND_EXCEEDS = 110, 55fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_SGE_WRITE_EXCEEDS = 111, 56fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_SGE_RECV_EXCEEDS = 112, 57fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_STATE_CHANGE = 113, 58fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_MW_BOUND = 114, 59fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_VA = 115, 60fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_LENGTH = 116, 61fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_FBO = 117, 62fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_ACC_RIGHTS = 118, 63fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_PBE_SIZE = 119, 64fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_PBL_ENTRY = 120, 65fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_PBL_SHIFT = 121, 66fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_SRQ_ID = 129, 67fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_SRQ_ERROR = 133, 68fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_RQE_EXCEEDS = 134, 69fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_MTU_EXCEEDS = 135, 70fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_MAX_QP_EXCEEDS = 136, 71fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_SRQ_LIMIT_EXCEEDS = 137, 72fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_SRQ_SIZE_UNDERUNS = 138, 73fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_QP_BOUND = 130, 74fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_CHANGE = 139, 75fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_ATOMIC_OPS_UNSUP = 140, 76fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_INVALID_RNR_NAK_TIMER = 141, 77fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_MW_STILL_BOUND = 142, 78fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_PKEY_INDEX_INVALID = 143, 79fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_STATUS_PKEY_INDEX_EXCEEDS = 144 80fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit}; 81fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 82fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditenum additional_status { 83fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_ADDI_STATUS_INSUFFICIENT_RESOURCES = 22 84fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit}; 85fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 86fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditenum cqe_status { 87fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_PRIVILEDGES = 1, 88fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_CQE_STATUS_INVALID_PARAMETER = 2, 89fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_RESOURCES = 3, 90fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_CQE_STATUS_QUEUE_FLUSHING = 4, 91fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_CQE_STATUS_DMA_FAILED = 5 92fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit}; 93fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 94fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic inline void *ocrdma_get_eqe(struct ocrdma_eq *eq) 95fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 96f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala return eq->q.va + (eq->q.tail * sizeof(struct ocrdma_eqe)); 97fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 98fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 99fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic inline void ocrdma_eq_inc_tail(struct ocrdma_eq *eq) 100fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 101fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit eq->q.tail = (eq->q.tail + 1) & (OCRDMA_EQ_LEN - 1); 102fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 103fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 104fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic inline void *ocrdma_get_mcqe(struct ocrdma_dev *dev) 105fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 106fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mcqe *cqe = (struct ocrdma_mcqe *) 107f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala (dev->mq.cq.va + (dev->mq.cq.tail * sizeof(struct ocrdma_mcqe))); 108fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 109fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!(le32_to_cpu(cqe->valid_ae_cmpl_cons) & OCRDMA_MCQE_VALID_MASK)) 110fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return NULL; 111fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return cqe; 112fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 113fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 114fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic inline void ocrdma_mcq_inc_tail(struct ocrdma_dev *dev) 115fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 116fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->mq.cq.tail = (dev->mq.cq.tail + 1) & (OCRDMA_MQ_CQ_LEN - 1); 117fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 118fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 119fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic inline struct ocrdma_mqe *ocrdma_get_mqe(struct ocrdma_dev *dev) 120fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 121f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala return dev->mq.sq.va + (dev->mq.sq.head * sizeof(struct ocrdma_mqe)); 122fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 123fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 124fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic inline void ocrdma_mq_inc_head(struct ocrdma_dev *dev) 125fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 126fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->mq.sq.head = (dev->mq.sq.head + 1) & (OCRDMA_MQ_LEN - 1); 127fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 128fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 129fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic inline void *ocrdma_get_mqe_rsp(struct ocrdma_dev *dev) 130fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 131f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala return dev->mq.sq.va + (dev->mqe_ctx.tag * sizeof(struct ocrdma_mqe)); 132fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 133fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 134fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditenum ib_qp_state get_ibqp_state(enum ocrdma_qp_state qps) 135fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 136fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (qps) { 137fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_RST: 138fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_RESET; 139fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_INIT: 140fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_INIT; 141fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_RTR: 142fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_RTR; 143fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_RTS: 144fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_RTS; 145fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_SQD: 146fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_SQ_DRAINING: 147fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_SQD; 148fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_SQE: 149fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_SQE; 150fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QPS_ERR: 151fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_ERR; 1522b50176d11866e59208a4ed1623b3fc0ca322690Joe Perches } 153fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IB_QPS_ERR; 154fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 155fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 156abe3afacc5762065244421569ad86afef11813bbRoland Dreierstatic enum ocrdma_qp_state get_ocrdma_qp_state(enum ib_qp_state qps) 157fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 158fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (qps) { 159fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPS_RESET: 160fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_RST; 161fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPS_INIT: 162fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_INIT; 163fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPS_RTR: 164fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_RTR; 165fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPS_RTS: 166fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_RTS; 167fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPS_SQD: 168fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_SQD; 169fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPS_SQE: 170fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_SQE; 171fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPS_ERR: 172fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_ERR; 1732b50176d11866e59208a4ed1623b3fc0ca322690Joe Perches } 174fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return OCRDMA_QPS_ERR; 175fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 176fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 177fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_get_mbx_errno(u32 status) 178fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 179f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala int err_num; 180fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 mbox_status = (status & OCRDMA_MBX_RSP_STATUS_MASK) >> 181fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_RSP_STATUS_SHIFT; 182fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 add_status = (status & OCRDMA_MBX_RSP_ASTATUS_MASK) >> 183fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_RSP_ASTATUS_SHIFT; 184fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 185fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (mbox_status) { 186fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_OOR: 187fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_MAX_QP_EXCEEDS: 188fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -EAGAIN; 189fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 190fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 191fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_PD: 192fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_CQ: 193fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_SRQ_ID: 194fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_QP: 195fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_CHANGE: 196fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_MTU_EXCEEDS: 197fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_RNR_NAK_TIMER: 198fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_PKEY_INDEX_INVALID: 199fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_PKEY_INDEX_EXCEEDS: 200fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_ILLEGAL_FIELD: 201fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_PBL_ENTRY: 202fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_LKEY: 203fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_VA: 204fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_LENGTH: 205fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_FBO: 206fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_ACC_RIGHTS: 207fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_INVALID_PBE_SIZE: 208fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_ATOMIC_OPS_UNSUP: 209fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_SRQ_ERROR: 210fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_SRQ_SIZE_UNDERUNS: 211fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -EINVAL; 212fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 213fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 214fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_PD_INUSE: 215fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_QP_BOUND: 216fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_MW_STILL_BOUND: 217fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_MW_BOUND: 218fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -EBUSY; 219fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 220fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 221fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_RECVQ_RQE_EXCEEDS: 222fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_SGE_RECV_EXCEEDS: 223fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_RQE_EXCEEDS: 224fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_SRQ_LIMIT_EXCEEDS: 225fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_ORD_EXCEEDS: 226fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_IRD_EXCEEDS: 227fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_SENDQ_WQE_EXCEEDS: 228fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_SGE_SEND_EXCEEDS: 229fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_SGE_WRITE_EXCEEDS: 230fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -ENOBUFS; 231fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 232fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 233fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_STATUS_FAILED: 234fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (add_status) { 235fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_ADDI_STATUS_INSUFFICIENT_RESOURCES: 236fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -EAGAIN; 237fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 238fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 239fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit default: 240fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -EFAULT; 241fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 242fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return err_num; 243fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 244fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 245a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavierchar *port_speed_string(struct ocrdma_dev *dev) 246a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier{ 247a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier char *str = ""; 248a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier u16 speeds_supported; 249a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 250a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier speeds_supported = dev->phy.fixed_speeds_supported | 251a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dev->phy.auto_speeds_supported; 252a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (speeds_supported & OCRDMA_PHY_SPEED_40GBPS) 253a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier str = "40Gbps "; 254a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier else if (speeds_supported & OCRDMA_PHY_SPEED_10GBPS) 255a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier str = "10Gbps "; 256a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier else if (speeds_supported & OCRDMA_PHY_SPEED_1GBPS) 257a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier str = "1Gbps "; 258a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 259a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier return str; 260a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier} 261a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 262fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_get_mbx_cqe_errno(u16 cqe_status) 263fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 264fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int err_num = -EINVAL; 265fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 266fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (cqe_status) { 267fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_PRIVILEDGES: 268fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -EPERM; 269fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 270fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_CQE_STATUS_INVALID_PARAMETER: 271fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit err_num = -EINVAL; 272fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 273fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_RESOURCES: 274fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_CQE_STATUS_QUEUE_FLUSHING: 275f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala err_num = -EINVAL; 276fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 277fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_MBX_CQE_STATUS_DMA_FAILED: 27843a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala default: 279f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala err_num = -EINVAL; 280fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 281fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 282fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return err_num; 283fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 284fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 285fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditvoid ocrdma_ring_cq_db(struct ocrdma_dev *dev, u16 cq_id, bool armed, 286fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit bool solicited, u16 cqe_popped) 287fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 288fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 val = cq_id & OCRDMA_DB_CQ_RING_ID_MASK; 289fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 290fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= ((cq_id & OCRDMA_DB_CQ_RING_ID_EXT_MASK) << 291fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_DB_CQ_RING_ID_EXT_MASK_SHIFT); 292fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 293fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (armed) 294fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= (1 << OCRDMA_DB_CQ_REARM_SHIFT); 295fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (solicited) 296fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= (1 << OCRDMA_DB_CQ_SOLICIT_SHIFT); 297fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= (cqe_popped << OCRDMA_DB_CQ_NUM_POPPED_SHIFT); 298fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit iowrite32(val, dev->nic_info.db + OCRDMA_DB_CQ_OFFSET); 299fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 300fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 301fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_ring_mq_db(struct ocrdma_dev *dev) 302fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 303fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 val = 0; 304fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 305fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= dev->mq.sq.id & OCRDMA_MQ_ID_MASK; 306fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= 1 << OCRDMA_MQ_NUM_MQE_SHIFT; 307fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit iowrite32(val, dev->nic_info.db + OCRDMA_DB_MQ_OFFSET); 308fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 309fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 310fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_ring_eq_db(struct ocrdma_dev *dev, u16 eq_id, 311fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit bool arm, bool clear_int, u16 num_eqe) 312fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 313fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 val = 0; 314fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 315fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= eq_id & OCRDMA_EQ_ID_MASK; 316fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= ((eq_id & OCRDMA_EQ_ID_EXT_MASK) << OCRDMA_EQ_ID_EXT_MASK_SHIFT); 317fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (arm) 318fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= (1 << OCRDMA_REARM_SHIFT); 319fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (clear_int) 320fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= (1 << OCRDMA_EQ_CLR_SHIFT); 321fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= (1 << OCRDMA_EQ_TYPE_SHIFT); 322fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit val |= (num_eqe << OCRDMA_NUM_EQE_SHIFT); 323fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit iowrite32(val, dev->nic_info.db + OCRDMA_DB_EQ_OFFSET); 324fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 325fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 326fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_init_mch(struct ocrdma_mbx_hdr *cmd_hdr, 327fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 opcode, u8 subsys, u32 cmd_len) 328fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 329fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd_hdr->subsys_op = (opcode | (subsys << OCRDMA_MCH_SUBSYS_SHIFT)); 330fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd_hdr->timeout = 20; /* seconds */ 331fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd_hdr->cmd_len = cmd_len - sizeof(struct ocrdma_mbx_hdr); 332fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 333fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 334fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void *ocrdma_init_emb_mqe(u8 opcode, u32 cmd_len) 335fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 336fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mqe *mqe; 337fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 338fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mqe = kzalloc(sizeof(struct ocrdma_mqe), GFP_KERNEL); 339fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!mqe) 340fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return NULL; 341fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mqe->hdr.spcl_sge_cnt_emb |= 342fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (OCRDMA_MQE_EMBEDDED << OCRDMA_MQE_HDR_EMB_SHIFT) & 343fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MQE_HDR_EMB_MASK; 344fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mqe->hdr.pyld_len = cmd_len - sizeof(struct ocrdma_mqe_hdr); 345fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 346fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch(&mqe->u.emb_req.mch, opcode, OCRDMA_SUBSYS_ROCE, 347fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mqe->hdr.pyld_len); 348fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return mqe; 349fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 350fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 351fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_free_q(struct ocrdma_dev *dev, struct ocrdma_queue_info *q) 352fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 353fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&dev->nic_info.pdev->dev, q->size, q->va, q->dma); 354fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 355fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 356fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_alloc_q(struct ocrdma_dev *dev, 357fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_queue_info *q, u16 len, u16 entry_size) 358fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 359fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(q, 0, sizeof(*q)); 360fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit q->len = len; 361fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit q->entry_size = entry_size; 362fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit q->size = len * entry_size; 363fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit q->va = dma_alloc_coherent(&dev->nic_info.pdev->dev, q->size, 364fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit &q->dma, GFP_KERNEL); 365fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!q->va) 366fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 367fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(q->va, 0, q->size); 368fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 369fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 370fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 371fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_build_q_pages(struct ocrdma_pa *q_pa, int cnt, 372fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_addr_t host_pa, int hw_page_size) 373fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 374fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i; 375fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 376fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < cnt; i++) { 377fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit q_pa[i].lo = (u32) (host_pa & 0xffffffff); 378fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit q_pa[i].hi = (u32) upper_32_bits(host_pa); 379fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit host_pa += hw_page_size; 380fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 381fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 382fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 383fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharmastatic int ocrdma_mbx_delete_q(struct ocrdma_dev *dev, 384fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharma struct ocrdma_queue_info *q, int queue_type) 385fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 386fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 opcode = 0; 387fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 388fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_delete_q_req *cmd = dev->mbx_cmd; 389fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 390fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (queue_type) { 391fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case QTYPE_MCCQ: 392fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit opcode = OCRDMA_CMD_DELETE_MQ; 393fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 394fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case QTYPE_CQ: 395fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit opcode = OCRDMA_CMD_DELETE_CQ; 396fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 397fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case QTYPE_EQ: 398fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit opcode = OCRDMA_CMD_DELETE_EQ; 399fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 400fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit default: 401fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit BUG(); 402fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 403fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(cmd, 0, sizeof(*cmd)); 404fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch(&cmd->req, opcode, OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 405fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->id = q->id; 406fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 407fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = be_roce_mcc_cmd(dev->nic_info.netdev, 408fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd, sizeof(*cmd), NULL, NULL); 409fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!status) 410fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit q->created = false; 411fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 412fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 413fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 414fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_create_eq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) 415fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 416fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 417fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_eq_req *cmd = dev->mbx_cmd; 418fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_eq_rsp *rsp = dev->mbx_cmd; 419fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 420fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(cmd, 0, sizeof(*cmd)); 421fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch(&cmd->req, OCRDMA_CMD_CREATE_EQ, OCRDMA_SUBSYS_COMMON, 422fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit sizeof(*cmd)); 423fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 424c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala cmd->req.rsvd_version = 2; 425fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->num_pages = 4; 426fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->valid = OCRDMA_CREATE_EQ_VALID; 427fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cnt = 4 << OCRDMA_CREATE_EQ_CNT_SHIFT; 428fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 429fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_build_q_pages(&cmd->pa[0], cmd->num_pages, eq->q.dma, 430fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit PAGE_SIZE_4K); 431fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = be_roce_mcc_cmd(dev->nic_info.netdev, cmd, sizeof(*cmd), NULL, 432fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit NULL); 433fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!status) { 434fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit eq->q.id = rsp->vector_eqid & 0xffff; 435c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala eq->vector = (rsp->vector_eqid >> 16) & 0xffff; 436fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit eq->q.created = true; 437fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 438fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 439fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 440fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 441fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_create_eq(struct ocrdma_dev *dev, 442fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_eq *eq, u16 q_len) 443fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 444fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 445fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 446fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_alloc_q(dev, &eq->q, OCRDMA_EQ_LEN, 447fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit sizeof(struct ocrdma_eqe)); 448fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 449fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 450fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 451fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_create_eq(dev, eq); 452fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 453fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 454fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit eq->dev = dev; 455fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_ring_eq_db(dev, eq->q.id, true, true, 0); 456fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 457fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 458fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 459fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_free_q(dev, &eq->q); 460fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 461fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 462fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 463ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharmaint ocrdma_get_irq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) 464fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 465fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int irq; 466fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 467fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dev->nic_info.intr_mode == BE_INTERRUPT_MODE_INTX) 468fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit irq = dev->nic_info.pdev->irq; 469fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit else 470fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit irq = dev->nic_info.msix.vector_list[eq->vector]; 471fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return irq; 472fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 473fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 474fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void _ocrdma_destroy_eq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) 475fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 476fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (eq->q.created) { 477fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mbx_delete_q(dev, &eq->q, QTYPE_EQ); 478fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_free_q(dev, &eq->q); 479fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 480fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 481fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 482fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_destroy_eq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) 483fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 484fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int irq; 485fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 486fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* disarm EQ so that interrupts are not generated 487fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * during freeing and EQ delete is in progress. 488fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit */ 489fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_ring_eq_db(dev, eq->q.id, false, false, 0); 490fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 491fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit irq = ocrdma_get_irq(dev, eq); 492fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit free_irq(irq, eq); 493fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit _ocrdma_destroy_eq(dev, eq); 494fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 495fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 496c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkalastatic void ocrdma_destroy_eqs(struct ocrdma_dev *dev) 497fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 498fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i; 499fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 500fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < dev->eq_cnt; i++) 501c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala ocrdma_destroy_eq(dev, &dev->eq_tbl[i]); 502fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 503fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 504abe3afacc5762065244421569ad86afef11813bbRoland Dreierstatic int ocrdma_mbx_mq_cq_create(struct ocrdma_dev *dev, 505abe3afacc5762065244421569ad86afef11813bbRoland Dreier struct ocrdma_queue_info *cq, 506abe3afacc5762065244421569ad86afef11813bbRoland Dreier struct ocrdma_queue_info *eq) 507fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 508fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_cq_cmd *cmd = dev->mbx_cmd; 509fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_cq_cmd_rsp *rsp = dev->mbx_cmd; 510fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 511fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 512fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(cmd, 0, sizeof(*cmd)); 513fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch(&cmd->req, OCRDMA_CMD_CREATE_CQ, 514fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 515fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 5161afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala cmd->req.rsvd_version = OCRDMA_CREATE_CQ_VER2; 5171afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala cmd->pgsz_pgcnt = (cq->size / OCRDMA_MIN_Q_PAGE_SIZE) << 5181afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala OCRDMA_CREATE_CQ_PAGE_SIZE_SHIFT; 5191afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala cmd->pgsz_pgcnt |= PAGES_4K_SPANNED(cq->va, cq->size); 5201afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala 521fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->ev_cnt_flags = OCRDMA_CREATE_CQ_DEF_FLAGS; 5221afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala cmd->eqn = eq->id; 5238ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma cmd->pdid_cqecnt = cq->size / sizeof(struct ocrdma_mcqe); 524fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 5251afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala ocrdma_build_q_pages(&cmd->pa[0], cq->size / OCRDMA_MIN_Q_PAGE_SIZE, 526fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->dma, PAGE_SIZE_4K); 527fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = be_roce_mcc_cmd(dev->nic_info.netdev, 528fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd, sizeof(*cmd), NULL, NULL); 529fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!status) { 5301afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala cq->id = (u16) (rsp->cq_id & OCRDMA_CREATE_CQ_RSP_CQ_ID_MASK); 531fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->created = true; 532fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 533fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 534fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 535fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 536fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic u32 ocrdma_encoded_q_len(int q_len) 537fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 538fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 len_encoded = fls(q_len); /* log2(len) + 1 */ 539fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 540fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (len_encoded == 16) 541fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit len_encoded = 0; 542fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return len_encoded; 543fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 544fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 545fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_create_mq(struct ocrdma_dev *dev, 546fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_queue_info *mq, 547fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_queue_info *cq) 548fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 549fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int num_pages, status; 550fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_mq_req *cmd = dev->mbx_cmd; 551fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_mq_rsp *rsp = dev->mbx_cmd; 552fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_pa *pa; 553fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 554fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(cmd, 0, sizeof(*cmd)); 555fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit num_pages = PAGES_4K_SPANNED(mq->va, mq->size); 556fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 557b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala ocrdma_init_mch(&cmd->req, OCRDMA_CMD_CREATE_MQ_EXT, 558b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 559b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala cmd->req.rsvd_version = 1; 560b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala cmd->cqid_pages = num_pages; 561b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala cmd->cqid_pages |= (cq->id << OCRDMA_CREATE_MQ_CQ_ID_SHIFT); 562b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala cmd->async_cqid_valid = OCRDMA_CREATE_MQ_ASYNC_CQ_VALID; 56384b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala 564de12348535a93535c408de396d3505541ca5e0d6Jes Sorensen cmd->async_event_bitmap = BIT(OCRDMA_ASYNC_GRP5_EVE_CODE); 565de12348535a93535c408de396d3505541ca5e0d6Jes Sorensen cmd->async_event_bitmap |= BIT(OCRDMA_ASYNC_RDMA_EVE_CODE); 56684b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala 567b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala cmd->async_cqid_ringsize = cq->id; 568b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala cmd->async_cqid_ringsize |= (ocrdma_encoded_q_len(mq->len) << 569b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala OCRDMA_CREATE_MQ_RING_SIZE_SHIFT); 570b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala cmd->valid = OCRDMA_CREATE_MQ_VALID; 571b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala pa = &cmd->pa[0]; 572b1d58b99194a121a44ec77571f84f62a6ccd6431Naresh Gottumukkala 573fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_build_q_pages(pa, num_pages, mq->dma, PAGE_SIZE_4K); 574fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = be_roce_mcc_cmd(dev->nic_info.netdev, 575fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd, sizeof(*cmd), NULL, NULL); 576fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!status) { 577fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mq->id = rsp->id; 578fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mq->created = true; 579fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 580fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 581fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 582fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 583fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_create_mq(struct ocrdma_dev *dev) 584fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 585fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 586fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 587fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* Alloc completion queue for Mailbox queue */ 588fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_alloc_q(dev, &dev->mq.cq, OCRDMA_MQ_CQ_LEN, 589fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit sizeof(struct ocrdma_mcqe)); 590fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 591fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto alloc_err; 592fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 593ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma dev->eq_tbl[0].cq_cnt++; 594c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala status = ocrdma_mbx_mq_cq_create(dev, &dev->mq.cq, &dev->eq_tbl[0].q); 595fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 596fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_cq_free; 597fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 598fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(&dev->mqe_ctx, 0, sizeof(dev->mqe_ctx)); 599fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit init_waitqueue_head(&dev->mqe_ctx.cmd_wait); 600fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_init(&dev->mqe_ctx.lock); 601fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 602fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* Alloc Mailbox queue */ 603fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_alloc_q(dev, &dev->mq.sq, OCRDMA_MQ_LEN, 604fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit sizeof(struct ocrdma_mqe)); 605fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 606fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_cq_destroy; 607fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_create_mq(dev, &dev->mq.sq, &dev->mq.cq); 608fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 609fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_q_free; 610fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_ring_cq_db(dev, dev->mq.cq.id, true, false, 0); 611fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 612fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 613fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_q_free: 614fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_free_q(dev, &dev->mq.sq); 615fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_cq_destroy: 616fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mbx_delete_q(dev, &dev->mq.cq, QTYPE_CQ); 617fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_cq_free: 618fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_free_q(dev, &dev->mq.cq); 619fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditalloc_err: 620fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 621fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 622fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 623fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_destroy_mq(struct ocrdma_dev *dev) 624fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 625fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_queue_info *mbxq, *cq; 626fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 627fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* mqe_ctx lock synchronizes with any other pending cmds. */ 628fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_lock(&dev->mqe_ctx.lock); 629fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mbxq = &dev->mq.sq; 630fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (mbxq->created) { 631fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mbx_delete_q(dev, mbxq, QTYPE_MCCQ); 632fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_free_q(dev, mbxq); 633fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 634fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_unlock(&dev->mqe_ctx.lock); 635fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 636fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq = &dev->mq.cq; 637fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cq->created) { 638fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mbx_delete_q(dev, cq, QTYPE_CQ); 639fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_free_q(dev, cq); 640fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 641fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 642fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 643fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_process_qpcat_error(struct ocrdma_dev *dev, 644fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp) 645fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 646fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit enum ib_qp_state new_ib_qps = IB_QPS_ERR; 647fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit enum ib_qp_state old_ib_qps; 648fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 649fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp == NULL) 650fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit BUG(); 651057729cb234754d12e0b2a361c2fc85c6363cbf6Naresh Gottumukkala ocrdma_qp_state_change(qp, new_ib_qps, &old_ib_qps); 652fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 653fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 654fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_dispatch_ibevent(struct ocrdma_dev *dev, 655fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_ae_mcqe *cqe) 656fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 657fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp = NULL; 658fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_cq *cq = NULL; 6591b09a0c29034eaf68bad9f8821531ebd194af3f7Selvin Xavier struct ib_event ib_evt; 660fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int cq_event = 0; 661fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int qp_event = 1; 662fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int srq_event = 0; 663fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int dev_event = 0; 664fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int type = (cqe->valid_ae_event & OCRDMA_AE_MCQE_EVENT_TYPE_MASK) >> 665fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_AE_MCQE_EVENT_TYPE_SHIFT; 666fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 667fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPVALID) 668fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp = dev->qp_tbl[cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPID_MASK]; 669fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQVALID) 670fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq = dev->cq_tbl[cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQID_MASK]; 671fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 6721b09a0c29034eaf68bad9f8821531ebd194af3f7Selvin Xavier memset(&ib_evt, 0, sizeof(ib_evt)); 6731b09a0c29034eaf68bad9f8821531ebd194af3f7Selvin Xavier 674e9db29534d2bc7c5e24f0fdd4beff9001517d785Roland Dreier ib_evt.device = &dev->ibdev; 675e9db29534d2bc7c5e24f0fdd4beff9001517d785Roland Dreier 676fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (type) { 677fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_CQ_ERROR: 678fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.cq = &cq->ibcq; 679fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_CQ_ERR; 680fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq_event = 1; 681fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp_event = 0; 682fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 683fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_CQ_OVERRUN_ERROR: 684fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.cq = &cq->ibcq; 685fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_CQ_ERR; 6861228056bcff2e4029c3d9d5d31cf122eea3a4c6aSelvin Xavier cq_event = 1; 6871228056bcff2e4029c3d9d5d31cf122eea3a4c6aSelvin Xavier qp_event = 0; 688fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 689fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_CQ_QPCAT_ERROR: 690fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.qp = &qp->ibqp; 691fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_QP_FATAL; 692fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_process_qpcat_error(dev, qp); 693fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 694fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QP_ACCESS_ERROR: 695fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.qp = &qp->ibqp; 696fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_QP_ACCESS_ERR; 697fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 698fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QP_COMM_EST_EVENT: 699fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.qp = &qp->ibqp; 700fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_COMM_EST; 701fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 702fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_SQ_DRAINED_EVENT: 703fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.qp = &qp->ibqp; 704fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_SQ_DRAINED; 705fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 706fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_DEVICE_FATAL_EVENT: 707fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.port_num = 1; 708fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_DEVICE_FATAL; 709fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp_event = 0; 710fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev_event = 1; 711fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 712fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_SRQCAT_ERROR: 713fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.srq = &qp->srq->ibsrq; 714fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_SRQ_ERR; 715fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq_event = 1; 716fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp_event = 0; 717fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 718fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_SRQ_LIMIT_EVENT: 719fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.srq = &qp->srq->ibsrq; 720804eaf29bac4148aa265bedc62182ed41a4c6120Parav Pandit ib_evt.event = IB_EVENT_SRQ_LIMIT_REACHED; 721fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq_event = 1; 722fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp_event = 0; 723fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 724fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case OCRDMA_QP_LAST_WQE_EVENT: 725fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.element.qp = &qp->ibqp; 726fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_evt.event = IB_EVENT_QP_LAST_WQE_REACHED; 727fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 728fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit default: 729fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq_event = 0; 730fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp_event = 0; 731fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq_event = 0; 732fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev_event = 0; 733ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() unknown type=0x%x\n", __func__, type); 734fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 735fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 736fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 737fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp_event) { 738fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->ibqp.event_handler) 739fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->ibqp.event_handler(&ib_evt, qp->ibqp.qp_context); 740fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } else if (cq_event) { 741fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cq->ibcq.event_handler) 742fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->ibcq.event_handler(&ib_evt, cq->ibcq.cq_context); 743fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } else if (srq_event) { 744fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->srq->ibsrq.event_handler) 745fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->srq->ibsrq.event_handler(&ib_evt, 746fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->srq->ibsrq. 747fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq_context); 748f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } else if (dev_event) { 7491228056bcff2e4029c3d9d5d31cf122eea3a4c6aSelvin Xavier pr_err("%s: Fatal event received\n", dev->ibdev.name); 750fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ib_dispatch_event(&ib_evt); 751f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } 752fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 753fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 754fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 75584b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkalastatic void ocrdma_process_grp5_aync(struct ocrdma_dev *dev, 75684b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala struct ocrdma_ae_mcqe *cqe) 75784b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala{ 75884b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala struct ocrdma_ae_pvid_mcqe *evt; 75984b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala int type = (cqe->valid_ae_event & OCRDMA_AE_MCQE_EVENT_TYPE_MASK) >> 76084b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala OCRDMA_AE_MCQE_EVENT_TYPE_SHIFT; 76184b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala 76284b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala switch (type) { 76384b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala case OCRDMA_ASYNC_EVENT_PVID_STATE: 76484b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala evt = (struct ocrdma_ae_pvid_mcqe *)cqe; 76584b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala if ((evt->tag_enabled & OCRDMA_AE_PVID_MCQE_ENABLED_MASK) >> 76684b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala OCRDMA_AE_PVID_MCQE_ENABLED_SHIFT) 76784b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala dev->pvid = ((evt->tag_enabled & 76884b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala OCRDMA_AE_PVID_MCQE_TAG_MASK) >> 76984b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala OCRDMA_AE_PVID_MCQE_TAG_SHIFT); 77084b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala break; 77131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 77231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier case OCRDMA_ASYNC_EVENT_COS_VALUE: 77331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier atomic_set(&dev->update_sl, 1); 77431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier break; 77584b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala default: 77684b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala /* Not interested evts. */ 77784b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala break; 77884b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala } 77984b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala} 78084b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala 781fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_process_acqe(struct ocrdma_dev *dev, void *ae_cqe) 782fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 783fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* async CQE processing */ 784fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_ae_mcqe *cqe = ae_cqe; 785fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 evt_code = (cqe->valid_ae_event & OCRDMA_AE_MCQE_EVENT_CODE_MASK) >> 786fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_AE_MCQE_EVENT_CODE_SHIFT; 787fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 78884b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala if (evt_code == OCRDMA_ASYNC_RDMA_EVE_CODE) 789fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_dispatch_ibevent(dev, cqe); 79084b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala else if (evt_code == OCRDMA_ASYNC_GRP5_EVE_CODE) 79184b105db593e735b8304815c913f7eea222a0600Naresh Gottumukkala ocrdma_process_grp5_aync(dev, cqe); 792fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit else 793ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s(%d) invalid evt code=0x%x\n", __func__, 794ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala dev->id, evt_code); 795fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 796fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 797fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_process_mcqe(struct ocrdma_dev *dev, struct ocrdma_mcqe *cqe) 798fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 799fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dev->mqe_ctx.tag == cqe->tag_lo && dev->mqe_ctx.cmd_done == false) { 800fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->mqe_ctx.cqe_status = (cqe->status & 801fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MCQE_STATUS_MASK) >> OCRDMA_MCQE_STATUS_SHIFT; 802fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->mqe_ctx.ext_status = 803fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (cqe->status & OCRDMA_MCQE_ESTATUS_MASK) 804fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit >> OCRDMA_MCQE_ESTATUS_SHIFT; 805fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->mqe_ctx.cmd_done = true; 806fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit wake_up(&dev->mqe_ctx.cmd_wait); 807fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } else 808ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() cqe for invalid tag0x%x.expected=0x%x\n", 809ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala __func__, cqe->tag_lo, dev->mqe_ctx.tag); 810fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 811fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 812fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mq_cq_handler(struct ocrdma_dev *dev, u16 cq_id) 813fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 814fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u16 cqe_popped = 0; 815fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mcqe *cqe; 816fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 817fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit while (1) { 818fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cqe = ocrdma_get_mcqe(dev); 819fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cqe == NULL) 820fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 821fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_le32_to_cpu(cqe, sizeof(*cqe)); 822fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cqe_popped += 1; 823fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cqe->valid_ae_cmpl_cons & OCRDMA_MCQE_AE_MASK) 824fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_process_acqe(dev, cqe); 825fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit else if (cqe->valid_ae_cmpl_cons & OCRDMA_MCQE_CMPL_MASK) 826fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_process_mcqe(dev, cqe); 827fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(cqe, 0, sizeof(struct ocrdma_mcqe)); 828fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mcq_inc_tail(dev); 829fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 830fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_ring_cq_db(dev, dev->mq.cq.id, true, false, cqe_popped); 831fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 832fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 833fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 834fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_qp_buddy_cq_handler(struct ocrdma_dev *dev, 835fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_cq *cq) 836fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 837fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit unsigned long flags; 838fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp; 839fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit bool buddy_cq_found = false; 840fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* Go through list of QPs in error state which are using this CQ 841fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * and invoke its callback handler to trigger CQE processing for 842fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * error/flushed CQE. It is rare to find more than few entries in 843fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * this list as most consumers stops after getting error CQE. 844fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * List is traversed only once when a matching buddy cq found for a QP. 845fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit */ 846fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_lock_irqsave(&dev->flush_q_lock, flags); 847fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit list_for_each_entry(qp, &cq->sq_head, sq_entry) { 848fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->srq) 849fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit continue; 850fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* if wq and rq share the same cq, than comp_handler 851fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * is already invoked. 852fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit */ 853fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->sq_cq == qp->rq_cq) 854fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit continue; 855fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* if completion came on sq, rq's cq is buddy cq. 856fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * if completion came on rq, sq's cq is buddy cq. 857fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit */ 858fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->sq_cq == cq) 859fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq = qp->rq_cq; 860fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit else 861fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq = qp->sq_cq; 862fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit buddy_cq_found = true; 863fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 864fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 865fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&dev->flush_q_lock, flags); 866fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (buddy_cq_found == false) 867fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return; 868fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cq->ibcq.comp_handler) { 869fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_lock_irqsave(&cq->comp_handler_lock, flags); 870fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (*cq->ibcq.comp_handler) (&cq->ibcq, cq->ibcq.cq_context); 871fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&cq->comp_handler_lock, flags); 872fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 873fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 874fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 875fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_qp_cq_handler(struct ocrdma_dev *dev, u16 cq_idx) 876fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 877fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit unsigned long flags; 878fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_cq *cq; 879fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 880fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cq_idx >= OCRDMA_MAX_CQ) 881fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit BUG(); 882fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 883fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq = dev->cq_tbl[cq_idx]; 884ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma if (cq == NULL) 885fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return; 886fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 887fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cq->ibcq.comp_handler) { 888fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_lock_irqsave(&cq->comp_handler_lock, flags); 889fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (*cq->ibcq.comp_handler) (&cq->ibcq, cq->ibcq.cq_context); 890fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&cq->comp_handler_lock, flags); 891fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 892fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_qp_buddy_cq_handler(dev, cq); 893fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 894fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 895fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_cq_handler(struct ocrdma_dev *dev, u16 cq_id) 896fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 897fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* process the MQ-CQE. */ 898fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cq_id == dev->mq.cq.id) 899fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mq_cq_handler(dev, cq_id); 900fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit else 901fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_qp_cq_handler(dev, cq_id); 902fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 903fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 904fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic irqreturn_t ocrdma_irq_handler(int irq, void *handle) 905fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 906fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_eq *eq = handle; 907fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dev *dev = eq->dev; 908fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_eqe eqe; 909fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_eqe *ptr; 910fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u16 cq_id; 911ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma int budget = eq->cq_cnt; 912ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma 913ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma do { 914fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ptr = ocrdma_get_eqe(eq); 915fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit eqe = *ptr; 916fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_le32_to_cpu(&eqe, sizeof(eqe)); 917fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if ((eqe.id_valid & OCRDMA_EQE_VALID_MASK) == 0) 918fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 919ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma 920fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ptr->id_valid = 0; 921ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma /* ring eq doorbell as soon as its consumed. */ 922ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma ocrdma_ring_eq_db(dev, eq->q.id, false, true, 1); 923fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* check whether its CQE or not. */ 924fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if ((eqe.id_valid & OCRDMA_EQE_FOR_CQE_MASK) == 0) { 925fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq_id = eqe.id_valid >> OCRDMA_EQE_RESOURCE_ID_SHIFT; 926fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_cq_handler(dev, cq_id); 927fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 928fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_eq_inc_tail(eq); 929ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma 930ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma /* There can be a stale EQE after the last bound CQ is 931ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma * destroyed. EQE valid and budget == 0 implies this. 932ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma */ 933ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma if (budget) 934ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma budget--; 935ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma 936ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma } while (budget); 937ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma 938ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma ocrdma_ring_eq_db(dev, eq->q.id, true, true, 0); 939fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return IRQ_HANDLED; 940fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 941fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 942fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_post_mqe(struct ocrdma_dev *dev, struct ocrdma_mqe *cmd) 943fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 944fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mqe *mqe; 945fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 946fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->mqe_ctx.tag = dev->mq.sq.head; 947fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->mqe_ctx.cmd_done = false; 948fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mqe = ocrdma_get_mqe(dev); 949fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->hdr.tag_lo = dev->mq.sq.head; 950fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_copy_cpu_to_le32(mqe, cmd, sizeof(*mqe)); 951fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* make sure descriptor is written before ringing doorbell */ 952fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit wmb(); 953fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mq_inc_head(dev); 954fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_ring_mq_db(dev); 955fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 956fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 957fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_wait_mqe_cmpl(struct ocrdma_dev *dev) 958fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 959fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit long status; 960fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* 30 sec timeout */ 961fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = wait_event_timeout(dev->mqe_ctx.cmd_wait, 962fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (dev->mqe_ctx.cmd_done != false), 963fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit msecs_to_jiffies(30000)); 964fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 965fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 9666dab02648c4c8bb58b35efccf29291d7970aeb68Mitesh Ahuja else { 9676dab02648c4c8bb58b35efccf29291d7970aeb68Mitesh Ahuja dev->mqe_ctx.fw_error_state = true; 9686dab02648c4c8bb58b35efccf29291d7970aeb68Mitesh Ahuja pr_err("%s(%d) mailbox timeout: fw not responding\n", 9696dab02648c4c8bb58b35efccf29291d7970aeb68Mitesh Ahuja __func__, dev->id); 970fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -1; 9716dab02648c4c8bb58b35efccf29291d7970aeb68Mitesh Ahuja } 972fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 973fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 974fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit/* issue a mailbox command on the MQ */ 975fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe) 976fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 977fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = 0; 978fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u16 cqe_status, ext_status; 979bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier struct ocrdma_mqe *rsp_mqe; 980bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier struct ocrdma_mbx_rsp *rsp = NULL; 981fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 982fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_lock(&dev->mqe_ctx.lock); 9836dab02648c4c8bb58b35efccf29291d7970aeb68Mitesh Ahuja if (dev->mqe_ctx.fw_error_state) 9846dab02648c4c8bb58b35efccf29291d7970aeb68Mitesh Ahuja goto mbx_err; 985fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_post_mqe(dev, mqe); 986fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_wait_mqe_cmpl(dev); 987fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 988fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 989fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cqe_status = dev->mqe_ctx.cqe_status; 990fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ext_status = dev->mqe_ctx.ext_status; 991bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier rsp_mqe = ocrdma_get_mqe_rsp(dev); 992bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier ocrdma_copy_le32_to_cpu(mqe, rsp_mqe, (sizeof(*mqe))); 993bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier if ((mqe->hdr.spcl_sge_cnt_emb & OCRDMA_MQE_HDR_EMB_MASK) >> 994bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier OCRDMA_MQE_HDR_EMB_SHIFT) 995bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier rsp = &mqe->u.rsp; 996bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier 997fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cqe_status || ext_status) { 998bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier pr_err("%s() cqe_status=0x%x, ext_status=0x%x,", 999bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier __func__, cqe_status, ext_status); 1000bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier if (rsp) { 1001bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier /* This is for embedded cmds. */ 1002bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier pr_err("opcode=0x%x, subsystem=0x%x\n", 1003bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier (rsp->subsys_op & OCRDMA_MBX_RSP_OPCODE_MASK) >> 1004bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier OCRDMA_MBX_RSP_OPCODE_SHIFT, 1005bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier (rsp->subsys_op & OCRDMA_MBX_RSP_SUBSYS_MASK) >> 1006bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier OCRDMA_MBX_RSP_SUBSYS_SHIFT); 1007bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier } 1008fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_get_mbx_cqe_errno(cqe_status); 1009fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1010fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1011bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier /* For non embedded, rsp errors are handled in ocrdma_nonemb_mbx_cmd */ 1012bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier if (rsp && (mqe->u.rsp.status & OCRDMA_MBX_RSP_STATUS_MASK)) 1013fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_get_mbx_errno(mqe->u.rsp.status); 1014fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1015fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_unlock(&dev->mqe_ctx.lock); 1016fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1017fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1018fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1019bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavierstatic int ocrdma_nonemb_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe, 1020bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier void *payload_va) 1021bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier{ 1022bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier int status = 0; 1023bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier struct ocrdma_mbx_rsp *rsp = payload_va; 1024bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier 1025bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier if ((mqe->hdr.spcl_sge_cnt_emb & OCRDMA_MQE_HDR_EMB_MASK) >> 1026bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier OCRDMA_MQE_HDR_EMB_SHIFT) 1027bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier BUG(); 1028bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier 1029bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier status = ocrdma_mbx_cmd(dev, mqe); 1030bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier if (!status) 1031bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier /* For non embedded, only CQE failures are handled in 1032bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier * ocrdma_mbx_cmd. We need to check for RSP errors. 1033bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier */ 1034bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier if (rsp->status & OCRDMA_MBX_RSP_STATUS_MASK) 1035bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier status = ocrdma_get_mbx_errno(rsp->status); 1036bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier 1037bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier if (status) 1038bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier pr_err("opcode=0x%x, subsystem=0x%x\n", 1039bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier (rsp->subsys_op & OCRDMA_MBX_RSP_OPCODE_MASK) >> 1040bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier OCRDMA_MBX_RSP_OPCODE_SHIFT, 1041bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier (rsp->subsys_op & OCRDMA_MBX_RSP_SUBSYS_MASK) >> 1042bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier OCRDMA_MBX_RSP_SUBSYS_SHIFT); 1043bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier return status; 1044bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier} 1045bbc5ec524eecf8af95b81c3c1d15cbc672568b4eSelvin Xavier 1046fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_get_attr(struct ocrdma_dev *dev, 1047fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dev_attr *attr, 1048fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mbx_query_config *rsp) 1049fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1050fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_pd = 1051fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (rsp->max_pd_ca_ack_delay & OCRDMA_MBX_QUERY_CFG_MAX_PD_MASK) >> 1052fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_PD_SHIFT; 1053fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_qp = 1054fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (rsp->qp_srq_cq_ird_ord & OCRDMA_MBX_QUERY_CFG_MAX_QP_MASK) >> 1055fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_QP_SHIFT; 1056fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharma attr->max_srq = 1057fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharma (rsp->max_srq_rpir_qps & OCRDMA_MBX_QUERY_CFG_MAX_SRQ_MASK) >> 1058fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharma OCRDMA_MBX_QUERY_CFG_MAX_SRQ_OFFSET; 1059fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_send_sge = ((rsp->max_write_send_sge & 1060fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> 1061fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT); 1062fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_recv_sge = (rsp->max_write_send_sge & 1063fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> 1064fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; 1065634c5796a5c60964faf9d51892571ffe36ad24d5Mahesh Vardhamanaiah attr->max_srq_sge = (rsp->max_srq_rqe_sge & 1066634c5796a5c60964faf9d51892571ffe36ad24d5Mahesh Vardhamanaiah OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> 1067634c5796a5c60964faf9d51892571ffe36ad24d5Mahesh Vardhamanaiah OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; 106845e86b33ec8b33f9ed41d9f9005f9e663018f8f1Naresh Gottumukkala attr->max_rdma_sge = (rsp->max_write_send_sge & 106945e86b33ec8b33f9ed41d9f9005f9e663018f8f1Naresh Gottumukkala OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK) >> 107045e86b33ec8b33f9ed41d9f9005f9e663018f8f1Naresh Gottumukkala OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT; 1071fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & 1072fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> 1073fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; 1074fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_ird_per_qp = (rsp->max_ird_ord_per_qp & 1075fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_IRD_PER_QP_MASK) >> 1076fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_IRD_PER_QP_SHIFT; 1077fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->cq_overflow_detect = (rsp->qp_srq_cq_ird_ord & 1078fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_CQ_OVERFLOW_MASK) >> 1079fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_CQ_OVERFLOW_SHIFT; 1080fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->srq_supported = (rsp->qp_srq_cq_ird_ord & 1081fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_SRQ_SUPPORTED_MASK) >> 1082fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_SRQ_SUPPORTED_SHIFT; 1083fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->local_ca_ack_delay = (rsp->max_pd_ca_ack_delay & 1084fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_CA_ACK_DELAY_MASK) >> 1085fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_CA_ACK_DELAY_SHIFT; 1086ac578aef8b9f6095016a12390f0ff638a3a54988Selvin Xavier attr->max_mw = rsp->max_mw; 1087fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_mr = rsp->max_mr; 1088033edd4dff23708c35120d9297fc898ef284bc7dMitesh Ahuja attr->max_mr_size = ((u64)rsp->max_mr_size_hi << 32) | 1089033edd4dff23708c35120d9297fc898ef284bc7dMitesh Ahuja rsp->max_mr_size_lo; 1090fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_fmr = 0; 1091fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_pages_per_frmr = rsp->max_pages_per_frmr; 1092fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_num_mr_pbl = rsp->max_num_mr_pbl; 1093fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_cqe = rsp->max_cq_cqes_per_cq & 1094fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_CQES_PER_CQ_MASK; 1095c43e9ab84d853f499a2fd531362973c8e505b342Naresh Gottumukkala attr->max_cq = (rsp->max_cq_cqes_per_cq & 1096c43e9ab84d853f499a2fd531362973c8e505b342Naresh Gottumukkala OCRDMA_MBX_QUERY_CFG_MAX_CQ_MASK) >> 1097c43e9ab84d853f499a2fd531362973c8e505b342Naresh Gottumukkala OCRDMA_MBX_QUERY_CFG_MAX_CQ_OFFSET; 1098fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->wqe_size = ((rsp->wqe_rqe_stride_max_dpp_cqs & 1099fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_WQE_SIZE_MASK) >> 1100fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_WQE_SIZE_OFFSET) * 1101fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_WQE_STRIDE; 1102fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->rqe_size = ((rsp->wqe_rqe_stride_max_dpp_cqs & 1103fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_RQE_SIZE_MASK) >> 1104fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MBX_QUERY_CFG_MAX_RQE_SIZE_OFFSET) * 1105fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_WQE_STRIDE; 1106fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->max_inline_data = 1107fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) + 1108fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit sizeof(struct ocrdma_sge)); 110921c3391a9adfaddd00481a1d03bf30fc1304e292Devesh Sharma if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) { 1110fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->ird = 1; 1111fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE; 1112fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; 111307bb54244e466f1517357f47a498574f97c31e08Mahesh Vardhamanaiah } 111407bb54244e466f1517357f47a498574f97c31e08Mahesh Vardhamanaiah dev->attr.max_wqe = rsp->max_wqes_rqes_per_q >> 111507bb54244e466f1517357f47a498574f97c31e08Mahesh Vardhamanaiah OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET; 111607bb54244e466f1517357f47a498574f97c31e08Mahesh Vardhamanaiah dev->attr.max_rqe = rsp->max_wqes_rqes_per_q & 111707bb54244e466f1517357f47a498574f97c31e08Mahesh Vardhamanaiah OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK; 1118fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1119fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1120fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_check_fw_config(struct ocrdma_dev *dev, 1121fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_fw_conf_rsp *conf) 1122fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1123fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 fn_mode; 1124fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1125fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit fn_mode = conf->fn_mode & OCRDMA_FN_MODE_RDMA; 1126fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (fn_mode != OCRDMA_FN_MODE_RDMA) 1127fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -EINVAL; 1128fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->base_eqid = conf->base_eqid; 1129fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->max_eq = conf->max_eq; 1130fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 1131fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1132fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1133fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit/* can be issued only during init time. */ 1134fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_query_fw_ver(struct ocrdma_dev *dev) 1135fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1136fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1137fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mqe *cmd; 1138fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_fw_ver_rsp *rsp; 1139fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1140fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_GET_FW_VER, sizeof(*cmd)); 1141fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1142fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 1143fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch((struct ocrdma_mbx_hdr *)&cmd->u.cmd[0], 1144fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CMD_GET_FW_VER, 1145fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 1146fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1147fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1148fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1149fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1150fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_fw_ver_rsp *)cmd; 1151fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(&dev->attr.fw_ver[0], 0, sizeof(dev->attr.fw_ver)); 1152fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memcpy(&dev->attr.fw_ver[0], &rsp->running_ver[0], 1153fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit sizeof(rsp->running_ver)); 1154fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_le32_to_cpu(dev->attr.fw_ver, sizeof(rsp->running_ver)); 1155fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1156fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1157fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1158fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1159fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1160fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit/* can be issued only during init time. */ 1161fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_query_fw_config(struct ocrdma_dev *dev) 1162fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1163fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1164fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mqe *cmd; 1165fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_fw_conf_rsp *rsp; 1166fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1167fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_GET_FW_CONFIG, sizeof(*cmd)); 1168fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1169fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 1170fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch((struct ocrdma_mbx_hdr *)&cmd->u.cmd[0], 1171fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CMD_GET_FW_CONFIG, 1172fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 1173fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1174fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1175fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1176fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_fw_conf_rsp *)cmd; 1177fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_check_fw_config(dev, rsp); 1178fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1179fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1180fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1181fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1182fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1183a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavierint ocrdma_mbx_rdma_stats(struct ocrdma_dev *dev, bool reset) 1184a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier{ 1185a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct ocrdma_rdma_stats_req *req = dev->stats_mem.va; 1186a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct ocrdma_mqe *mqe = &dev->stats_mem.mqe; 1187beb9b703811736adfc608034d1f0d5cf0c8a7073Jes Sorensen struct ocrdma_rdma_stats_resp *old_stats; 1188a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier int status; 1189a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1190beb9b703811736adfc608034d1f0d5cf0c8a7073Jes Sorensen old_stats = kmalloc(sizeof(*old_stats), GFP_KERNEL); 1191a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (old_stats == NULL) 1192a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier return -ENOMEM; 1193a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1194a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier memset(mqe, 0, sizeof(*mqe)); 1195a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->hdr.pyld_len = dev->stats_mem.size; 1196a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->hdr.spcl_sge_cnt_emb |= 1197a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier (1 << OCRDMA_MQE_HDR_SGE_CNT_SHIFT) & 1198a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier OCRDMA_MQE_HDR_SGE_CNT_MASK; 1199a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->u.nonemb_req.sge[0].pa_lo = (u32) (dev->stats_mem.pa & 0xffffffff); 1200a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->u.nonemb_req.sge[0].pa_hi = (u32) upper_32_bits(dev->stats_mem.pa); 1201a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->u.nonemb_req.sge[0].len = dev->stats_mem.size; 1202a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1203a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier /* Cache the old stats */ 1204a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier memcpy(old_stats, req, sizeof(struct ocrdma_rdma_stats_resp)); 1205a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier memset(req, 0, dev->stats_mem.size); 1206a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1207a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier ocrdma_init_mch((struct ocrdma_mbx_hdr *)req, 1208a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier OCRDMA_CMD_GET_RDMA_STATS, 1209a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier OCRDMA_SUBSYS_ROCE, 1210a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dev->stats_mem.size); 1211a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (reset) 1212a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier req->reset_stats = reset; 1213a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1214a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier status = ocrdma_nonemb_mbx_cmd(dev, mqe, dev->stats_mem.va); 1215a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (status) 1216a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier /* Copy from cache, if mbox fails */ 1217a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier memcpy(req, old_stats, sizeof(struct ocrdma_rdma_stats_resp)); 1218a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier else 1219a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier ocrdma_le32_to_cpu(req, dev->stats_mem.size); 1220a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1221a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier kfree(old_stats); 1222a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier return status; 1223a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier} 1224a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1225a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavierstatic int ocrdma_mbx_get_ctrl_attribs(struct ocrdma_dev *dev) 1226a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier{ 1227a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier int status = -ENOMEM; 1228a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct ocrdma_dma_mem dma; 1229a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct ocrdma_mqe *mqe; 1230a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct ocrdma_get_ctrl_attribs_rsp *ctrl_attr_rsp; 1231a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct mgmt_hba_attribs *hba_attribs; 1232a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1233beb9b703811736adfc608034d1f0d5cf0c8a7073Jes Sorensen mqe = kzalloc(sizeof(struct ocrdma_mqe), GFP_KERNEL); 1234a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (!mqe) 1235a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier return status; 1236a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1237a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dma.size = sizeof(struct ocrdma_get_ctrl_attribs_rsp); 1238a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dma.va = dma_alloc_coherent(&dev->nic_info.pdev->dev, 1239a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dma.size, &dma.pa, GFP_KERNEL); 1240a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (!dma.va) 1241a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier goto free_mqe; 1242a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1243a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->hdr.pyld_len = dma.size; 1244a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->hdr.spcl_sge_cnt_emb |= 1245a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier (1 << OCRDMA_MQE_HDR_SGE_CNT_SHIFT) & 1246a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier OCRDMA_MQE_HDR_SGE_CNT_MASK; 1247a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->u.nonemb_req.sge[0].pa_lo = (u32) (dma.pa & 0xffffffff); 1248a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->u.nonemb_req.sge[0].pa_hi = (u32) upper_32_bits(dma.pa); 1249a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier mqe->u.nonemb_req.sge[0].len = dma.size; 1250a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1251a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier memset(dma.va, 0, dma.size); 1252a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier ocrdma_init_mch((struct ocrdma_mbx_hdr *)dma.va, 1253a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier OCRDMA_CMD_GET_CTRL_ATTRIBUTES, 1254a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier OCRDMA_SUBSYS_COMMON, 1255a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dma.size); 1256a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1257a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier status = ocrdma_nonemb_mbx_cmd(dev, mqe, dma.va); 1258a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (!status) { 1259a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier ctrl_attr_rsp = (struct ocrdma_get_ctrl_attribs_rsp *)dma.va; 1260a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier hba_attribs = &ctrl_attr_rsp->ctrl_attribs.hba_attribs; 1261a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 12628ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma dev->hba_port_num = (hba_attribs->ptpnum_maxdoms_hbast_cv & 12638ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma OCRDMA_HBA_ATTRB_PTNUM_MASK) 12648ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma >> OCRDMA_HBA_ATTRB_PTNUM_SHIFT; 1265a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier strncpy(dev->model_number, 1266a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier hba_attribs->controller_model_number, 31); 1267a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier } 1268a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dma_free_coherent(&dev->nic_info.pdev->dev, dma.size, dma.va, dma.pa); 1269a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavierfree_mqe: 1270a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier kfree(mqe); 1271a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier return status; 1272a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier} 1273a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1274fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_query_dev(struct ocrdma_dev *dev) 1275fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1276fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1277fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mbx_query_config *rsp; 1278fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_mqe *cmd; 1279fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1280fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_CONFIG, sizeof(*cmd)); 1281fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1282fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1283fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1284fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1285fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1286fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_mbx_query_config *)cmd; 1287fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_get_attr(dev, &dev->attr, rsp); 1288fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1289fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1290fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1291fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1292fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1293f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkalaint ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed) 1294f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala{ 1295f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala int status = -ENOMEM; 1296f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala struct ocrdma_get_link_speed_rsp *rsp; 1297f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala struct ocrdma_mqe *cmd; 1298f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala 1299f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_NTWK_LINK_CONFIG_V1, 1300f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala sizeof(*cmd)); 1301f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala if (!cmd) 1302f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala return status; 1303f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala ocrdma_init_mch((struct ocrdma_mbx_hdr *)&cmd->u.cmd[0], 1304f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala OCRDMA_CMD_QUERY_NTWK_LINK_CONFIG_V1, 1305f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 1306f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala 1307f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala ((struct ocrdma_mbx_hdr *)cmd->u.cmd)->rsvd_version = 0x1; 1308f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala 1309f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1310f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala if (status) 1311f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala goto mbx_err; 1312f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala 1313f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala rsp = (struct ocrdma_get_link_speed_rsp *)cmd; 13148ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma *lnk_speed = (rsp->pflt_pps_ld_pnum & OCRDMA_PHY_PS_MASK) 13158ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma >> OCRDMA_PHY_PS_SHIFT; 1316f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala 1317f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkalambx_err: 1318f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala kfree(cmd); 1319f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala return status; 1320f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala} 1321f24ceba6b6454f68f456981be2a337b6390d9aa0Naresh Gottumukkala 1322a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavierstatic int ocrdma_mbx_get_phy_info(struct ocrdma_dev *dev) 1323a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier{ 1324a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier int status = -ENOMEM; 1325a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct ocrdma_mqe *cmd; 1326a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier struct ocrdma_get_phy_info_rsp *rsp; 1327a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1328a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_PHY_DETAILS, sizeof(*cmd)); 1329a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (!cmd) 1330a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier return status; 1331a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1332a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier ocrdma_init_mch((struct ocrdma_mbx_hdr *)&cmd->u.cmd[0], 1333a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier OCRDMA_CMD_PHY_DETAILS, OCRDMA_SUBSYS_COMMON, 1334a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier sizeof(*cmd)); 1335a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1336a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1337a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (status) 1338a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier goto mbx_err; 1339a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1340a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier rsp = (struct ocrdma_get_phy_info_rsp *)cmd; 13418ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma dev->phy.phy_type = 13428ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma (rsp->ityp_ptyp & OCRDMA_PHY_TYPE_MASK); 13438ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma dev->phy.interface_type = 13448ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma (rsp->ityp_ptyp & OCRDMA_IF_TYPE_MASK) 13458ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma >> OCRDMA_IF_TYPE_SHIFT; 1346a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dev->phy.auto_speeds_supported = 13478ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma (rsp->fspeed_aspeed & OCRDMA_ASPEED_SUPP_MASK); 1348a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier dev->phy.fixed_speeds_supported = 13498ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma (rsp->fspeed_aspeed & OCRDMA_FSPEED_SUPP_MASK) 13508ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma >> OCRDMA_FSPEED_SUPP_SHIFT; 1351a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xaviermbx_err: 1352a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier kfree(cmd); 1353a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier return status; 1354a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier} 1355a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 1356fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_alloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd) 1357fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1358fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1359fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_alloc_pd *cmd; 1360fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_alloc_pd_rsp *rsp; 1361fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1362fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD, sizeof(*cmd)); 1363fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1364fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1365fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (pd->dpp_enabled) 1366fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP; 1367fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1368fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1369fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1370fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_alloc_pd_rsp *)cmd; 1371fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pd->id = rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_PDID_MASK; 1372fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) { 1373fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pd->dpp_enabled = true; 1374fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pd->dpp_page = rsp->dpp_page_pdid >> 1375fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT; 1376fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } else { 1377fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pd->dpp_enabled = false; 1378fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pd->num_dpp_qp = 0; 1379fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1380fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1381fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1382fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1383fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1384fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1385fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_dealloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd) 1386fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1387fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1388fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dealloc_pd *cmd; 1389fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1390fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DEALLOC_PD, sizeof(*cmd)); 1391fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1392fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1393fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->id = pd->id; 1394fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1395fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1396fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1397fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1398fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1399fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_build_q_conf(u32 *num_entries, int entry_size, 1400fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int *num_pages, int *page_size) 1401fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1402fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i; 1403fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int mem_size; 1404fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1405fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *num_entries = roundup_pow_of_two(*num_entries); 1406fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mem_size = *num_entries * entry_size; 1407fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* find the possible lowest possible multiplier */ 1408fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < OCRDMA_MAX_Q_PAGE_SIZE_CNT; i++) { 1409fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (mem_size <= (OCRDMA_Q_PAGE_BASE_SIZE << i)) 1410fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1411fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1412fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (i >= OCRDMA_MAX_Q_PAGE_SIZE_CNT) 1413fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -EINVAL; 1414fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mem_size = roundup(mem_size, 1415fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ((OCRDMA_Q_PAGE_BASE_SIZE << i) / OCRDMA_MAX_Q_PAGES)); 1416fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *num_pages = 1417fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mem_size / ((OCRDMA_Q_PAGE_BASE_SIZE << i) / OCRDMA_MAX_Q_PAGES); 1418fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *page_size = ((OCRDMA_Q_PAGE_BASE_SIZE << i) / OCRDMA_MAX_Q_PAGES); 1419fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *num_entries = mem_size / entry_size; 1420fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 1421fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1422fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1423fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_create_ah_tbl(struct ocrdma_dev *dev) 1424fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1425fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharma int i; 1426fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = 0; 1427fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int max_ah; 1428fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_ah_tbl *cmd; 1429fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_ah_tbl_rsp *rsp; 1430fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 1431fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_addr_t pa; 1432fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_pbe *pbes; 1433fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1434fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_CREATE_AH_TBL, sizeof(*cmd)); 1435fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1436fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1437fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1438fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_ah = OCRDMA_MAX_AH; 1439fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.size = sizeof(struct ocrdma_av) * max_ah; 1440fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1441fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* number of PBEs in PBL */ 1442fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->ah_conf = (OCRDMA_AH_TBL_PAGES << 1443fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_AH_NUM_PAGES_SHIFT) & 1444fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_AH_NUM_PAGES_MASK; 1445fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1446fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* page size */ 1447fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < OCRDMA_MAX_Q_PAGE_SIZE_CNT; i++) { 1448fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (PAGE_SIZE == (OCRDMA_MIN_Q_PAGE_SIZE << i)) 1449fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1450fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1451fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->ah_conf |= (i << OCRDMA_CREATE_AH_PAGE_SIZE_SHIFT) & 1452fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_AH_PAGE_SIZE_MASK; 1453fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1454fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* ah_entry size */ 1455fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->ah_conf |= (sizeof(struct ocrdma_av) << 1456fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_AH_ENTRY_SIZE_SHIFT) & 1457fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_AH_ENTRY_SIZE_MASK; 1458fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1459fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.pbl.va = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, 1460fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit &dev->av_tbl.pbl.pa, 1461fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit GFP_KERNEL); 1462fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dev->av_tbl.pbl.va == NULL) 1463fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mem_err; 1464fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1465fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.va = dma_alloc_coherent(&pdev->dev, dev->av_tbl.size, 1466fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit &pa, GFP_KERNEL); 1467fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dev->av_tbl.va == NULL) 1468fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mem_err_ah; 1469fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.pa = pa; 1470fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.num_ah = max_ah; 1471fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(dev->av_tbl.va, 0, dev->av_tbl.size); 1472fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1473fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pbes = (struct ocrdma_pbe *)dev->av_tbl.pbl.va; 1474fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < dev->av_tbl.size / OCRDMA_MIN_Q_PAGE_SIZE; i++) { 14758ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma pbes[i].pa_lo = (u32)cpu_to_le32(pa & 0xffffffff); 14768ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma pbes[i].pa_hi = (u32)cpu_to_le32(upper_32_bits(pa)); 1477fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pa += PAGE_SIZE; 1478fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1479fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->tbl_addr[0].lo = (u32)(dev->av_tbl.pbl.pa & 0xFFFFFFFF); 1480fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->tbl_addr[0].hi = (u32)upper_32_bits(dev->av_tbl.pbl.pa); 1481fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1482fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1483fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1484fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_create_ah_tbl_rsp *)cmd; 1485fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.ahid = rsp->ahid & 0xFFFF; 1486fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1487fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 1488fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1489fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1490fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, dev->av_tbl.size, dev->av_tbl.va, 1491fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.pa); 1492fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.va = NULL; 1493fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmem_err_ah: 1494fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->av_tbl.pbl.va, 1495fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.pbl.pa); 1496fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.pbl.va = NULL; 1497fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.size = 0; 1498fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmem_err: 1499fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1500fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1501fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1502fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1503fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_mbx_delete_ah_tbl(struct ocrdma_dev *dev) 1504fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1505fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_delete_ah_tbl *cmd; 1506fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 1507fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1508fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dev->av_tbl.va == NULL) 1509fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return; 1510fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1511fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DELETE_AH_TBL, sizeof(*cmd)); 1512fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1513fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return; 1514fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->ahid = dev->av_tbl.ahid; 1515fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1516fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1517fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, dev->av_tbl.size, dev->av_tbl.va, 1518fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.pa); 1519daac96815e969bd70ed5ad21231be2fc5d99506dDevesh Sharma dev->av_tbl.va = NULL; 1520fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->av_tbl.pbl.va, 1521fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->av_tbl.pbl.pa); 1522fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1523fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1524fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1525fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit/* Multiple CQs uses the EQ. This routine returns least used 1526fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * EQ to associate with CQ. This will distributes the interrupt 1527fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * processing and CPU load to associated EQ, vector and so to that CPU. 1528fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit */ 1529fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic u16 ocrdma_bind_eq(struct ocrdma_dev *dev) 1530fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1531fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i, selected_eq = 0, cq_cnt = 0; 1532fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u16 eq_id; 1533fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1534fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_lock(&dev->dev_lock); 1535c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala cq_cnt = dev->eq_tbl[0].cq_cnt; 1536c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala eq_id = dev->eq_tbl[0].q.id; 1537fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* find the EQ which is has the least number of 1538fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * CQs associated with it. 1539fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit */ 1540fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < dev->eq_cnt; i++) { 1541c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala if (dev->eq_tbl[i].cq_cnt < cq_cnt) { 1542c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala cq_cnt = dev->eq_tbl[i].cq_cnt; 1543c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala eq_id = dev->eq_tbl[i].q.id; 1544fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit selected_eq = i; 1545fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1546fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1547c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala dev->eq_tbl[selected_eq].cq_cnt += 1; 1548fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_unlock(&dev->dev_lock); 1549fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return eq_id; 1550fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1551fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1552fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_unbind_eq(struct ocrdma_dev *dev, u16 eq_id) 1553fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1554fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i; 1555fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1556fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_lock(&dev->dev_lock); 1557ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma i = ocrdma_get_eq_table_index(dev, eq_id); 1558ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma if (i == -EINVAL) 1559ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma BUG(); 1560ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma dev->eq_tbl[i].cq_cnt -= 1; 1561fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit mutex_unlock(&dev->dev_lock); 1562fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1563fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1564fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_create_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq, 1565cffce99051b80c90630a9fff662a1b25e278069dNaresh Gottumukkala int entries, int dpp_cq, u16 pd_id) 1566fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1567fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; int max_hw_cqe; 1568fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 1569fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_cq *cmd; 1570fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_cq_rsp *rsp; 1571fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 hw_pages, cqe_size, page_size, cqe_count; 1572fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1573fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (entries > dev->attr.max_cqe) { 1574ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s(%d) max_cqe=0x%x, requester_cqe=0x%x\n", 1575ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala __func__, dev->id, dev->attr.max_cqe, entries); 1576fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -EINVAL; 1577fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 157821c3391a9adfaddd00481a1d03bf30fc1304e292Devesh Sharma if (dpp_cq && (ocrdma_get_asic_type(dev) != OCRDMA_ASIC_GEN_SKH_R)) 1579fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -EINVAL; 1580fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1581fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dpp_cq) { 1582fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->max_hw_cqe = 1; 1583fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_hw_cqe = 1; 1584fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cqe_size = OCRDMA_DPP_CQE_SIZE; 1585fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit hw_pages = 1; 1586fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } else { 1587fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->max_hw_cqe = dev->attr.max_cqe; 1588fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_hw_cqe = dev->attr.max_cqe; 1589fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cqe_size = sizeof(struct ocrdma_cqe); 1590fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit hw_pages = OCRDMA_CREATE_CQ_MAX_PAGES; 1591fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1592fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1593fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->len = roundup(max_hw_cqe * cqe_size, OCRDMA_MIN_Q_PAGE_SIZE); 1594fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1595fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_CREATE_CQ, sizeof(*cmd)); 1596fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1597fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 1598fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch(&cmd->cmd.req, OCRDMA_CMD_CREATE_CQ, 1599fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 1600fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->va = dma_alloc_coherent(&pdev->dev, cq->len, &cq->pa, GFP_KERNEL); 1601fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cq->va) { 1602fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -ENOMEM; 1603fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mem_err; 1604fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1605fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(cq->va, 0, cq->len); 1606fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit page_size = cq->len / hw_pages; 1607fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.pgsz_pgcnt = (page_size / OCRDMA_MIN_Q_PAGE_SIZE) << 1608fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_CQ_PAGE_SIZE_SHIFT; 1609fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.pgsz_pgcnt |= hw_pages; 1610fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.ev_cnt_flags = OCRDMA_CREATE_CQ_DEF_FLAGS; 1611fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1612fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->eqn = ocrdma_bind_eq(dev); 1613cffce99051b80c90630a9fff662a1b25e278069dNaresh Gottumukkala cmd->cmd.req.rsvd_version = OCRDMA_CREATE_CQ_VER3; 1614fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cqe_count = cq->len / cqe_size; 1615ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma cq->cqe_cnt = cqe_count; 1616f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala if (cqe_count > 1024) { 1617fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* Set cnt to 3 to indicate more than 1024 cq entries */ 1618fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.ev_cnt_flags |= (0x3 << OCRDMA_CREATE_CQ_CNT_SHIFT); 1619f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } else { 1620fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 count = 0; 1621fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (cqe_count) { 1622fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case 256: 1623fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit count = 0; 1624fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1625fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case 512: 1626fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit count = 1; 1627fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1628fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case 1024: 1629fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit count = 2; 1630fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1631fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit default: 1632fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1633fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1634fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.ev_cnt_flags |= (count << OCRDMA_CREATE_CQ_CNT_SHIFT); 1635fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1636fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* shared eq between all the consumer cqs. */ 1637fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.eqn = cq->eqn; 163821c3391a9adfaddd00481a1d03bf30fc1304e292Devesh Sharma if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) { 1639fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dpp_cq) 1640fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.pgsz_pgcnt |= OCRDMA_CREATE_CQ_DPP << 1641fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_CQ_TYPE_SHIFT; 1642fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->phase_change = false; 16438ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma cmd->cmd.pdid_cqecnt = (cq->len / cqe_size); 1644fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } else { 16458ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma cmd->cmd.pdid_cqecnt = (cq->len / cqe_size) - 1; 1646fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->cmd.ev_cnt_flags |= OCRDMA_CREATE_CQ_FLAGS_AUTO_VALID; 1647fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->phase_change = true; 1648fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1649fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 16508ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma /* pd_id valid only for v3 */ 16518ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma cmd->cmd.pdid_cqecnt |= (pd_id << 16528ac0c7c7a13b16e7c49fea812819a7f807a202feDevesh Sharma OCRDMA_CREATE_CQ_CMD_PDID_SHIFT); 1653fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_build_q_pages(&cmd->cmd.pa[0], hw_pages, cq->pa, page_size); 1654fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1655fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1656fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1657fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1658fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_create_cq_rsp *)cmd; 1659fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq->id = (u16) (rsp->rsp.cq_id & OCRDMA_CREATE_CQ_RSP_CQ_ID_MASK); 1660fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1661fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 1662fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1663fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_unbind_eq(dev, cq->eqn); 1664fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, cq->len, cq->va, cq->pa); 1665fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmem_err: 1666fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1667fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1668fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1669fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1670fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_destroy_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq) 1671fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1672fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1673fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_destroy_cq *cmd; 1674fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1675fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DELETE_CQ, sizeof(*cmd)); 1676fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1677fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1678fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_init_mch(&cmd->req, OCRDMA_CMD_DELETE_CQ, 1679fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_SUBSYS_COMMON, sizeof(*cmd)); 1680fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1681fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->bypass_flush_qid |= 1682fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (cq->id << OCRDMA_DESTROY_CQ_QID_SHIFT) & 1683fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_DESTROY_CQ_QID_MASK; 1684fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1685fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1686ea61762679cd4d409dcaa6f502f190f4c8156d09Devesh Sharma ocrdma_unbind_eq(dev, cq->eqn); 1687fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&dev->nic_info.pdev->dev, cq->len, cq->va, cq->pa); 1688fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1689fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1690fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1691fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1692fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_alloc_lkey(struct ocrdma_dev *dev, struct ocrdma_hw_mr *hwmr, 1693fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 pdid, int addr_check) 1694fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1695fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1696fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_alloc_lkey *cmd; 1697fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_alloc_lkey_rsp *rsp; 1698fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1699fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_LKEY, sizeof(*cmd)); 1700fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1701fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1702fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pdid = pdid; 1703fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl_sz_flags |= addr_check; 1704fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl_sz_flags |= (hwmr->fr_mr << OCRDMA_ALLOC_LKEY_FMR_SHIFT); 1705fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl_sz_flags |= 1706fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (hwmr->remote_wr << OCRDMA_ALLOC_LKEY_REMOTE_WR_SHIFT); 1707fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl_sz_flags |= 1708fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (hwmr->remote_rd << OCRDMA_ALLOC_LKEY_REMOTE_RD_SHIFT); 1709fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl_sz_flags |= 1710fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (hwmr->local_wr << OCRDMA_ALLOC_LKEY_LOCAL_WR_SHIFT); 1711fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl_sz_flags |= 1712fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (hwmr->remote_atomic << OCRDMA_ALLOC_LKEY_REMOTE_ATOMIC_SHIFT); 1713fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl_sz_flags |= 1714fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (hwmr->num_pbls << OCRDMA_ALLOC_LKEY_PBL_SIZE_SHIFT); 1715fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1716fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1717fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1718fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1719fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_alloc_lkey_rsp *)cmd; 1720fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit hwmr->lkey = rsp->lrkey; 1721fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1722fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1723fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1724fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1725fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1726fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_dealloc_lkey(struct ocrdma_dev *dev, int fr_mr, u32 lkey) 1727fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1728fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1729fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dealloc_lkey *cmd; 1730fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1731fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DEALLOC_LKEY, sizeof(*cmd)); 1732fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1733fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 1734fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->lkey = lkey; 1735fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->rsvd_frmr = fr_mr ? 1 : 0; 1736fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1737fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1738fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1739fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1740fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1741fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1742fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1743fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1744fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_reg_mr(struct ocrdma_dev *dev, struct ocrdma_hw_mr *hwmr, 1745fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 pdid, u32 pbl_cnt, u32 pbe_size, u32 last) 1746fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1747fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1748fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i; 1749fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_reg_nsmr *cmd; 1750fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_reg_nsmr_rsp *rsp; 1751fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1752fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_REGISTER_NSMR, sizeof(*cmd)); 1753fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1754fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 1755fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->num_pbl_pdid = 1756fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pdid | (hwmr->num_pbls << OCRDMA_REG_NSMR_NUM_PBL_SHIFT); 17572b51a9b9eb6bf240d2592e10d2f8823dd1f5ee3eNaresh Gottumukkala cmd->fr_mr = hwmr->fr_mr; 1758fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1759fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (hwmr->remote_wr << 1760fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_REG_NSMR_REMOTE_WR_SHIFT); 1761fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (hwmr->remote_rd << 1762fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_REG_NSMR_REMOTE_RD_SHIFT); 1763fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (hwmr->local_wr << 1764fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_REG_NSMR_LOCAL_WR_SHIFT); 1765fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (hwmr->remote_atomic << 1766fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_REG_NSMR_REMOTE_ATOMIC_SHIFT); 1767fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (hwmr->mw_bind << 1768fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_REG_NSMR_BIND_MEMWIN_SHIFT); 1769fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (last << OCRDMA_REG_NSMR_LAST_SHIFT); 1770fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1771fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (hwmr->pbe_size / OCRDMA_MIN_HPAGE_SIZE); 1772fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags_hpage_pbe_sz |= (hwmr->pbl_size / OCRDMA_MIN_HPAGE_SIZE) << 1773fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_REG_NSMR_HPAGE_SIZE_SHIFT; 1774fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->totlen_low = hwmr->len; 1775fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->totlen_high = upper_32_bits(hwmr->len); 1776fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->fbo_low = (u32) (hwmr->fbo & 0xffffffff); 1777fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->fbo_high = (u32) upper_32_bits(hwmr->fbo); 1778fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->va_loaddr = (u32) hwmr->va; 1779fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->va_hiaddr = (u32) upper_32_bits(hwmr->va); 1780fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1781fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < pbl_cnt; i++) { 1782fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl[i].lo = (u32) (hwmr->pbl_table[i].pa & 0xffffffff); 1783fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl[i].hi = upper_32_bits(hwmr->pbl_table[i].pa); 1784fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1785fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1786fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1787fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1788fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_reg_nsmr_rsp *)cmd; 1789fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit hwmr->lkey = rsp->lrkey; 1790fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1791fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1792fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1793fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1794fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1795fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_mbx_reg_mr_cont(struct ocrdma_dev *dev, 1796fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_hw_mr *hwmr, u32 pbl_cnt, 1797fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 pbl_offset, u32 last) 1798fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1799fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 1800fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i; 1801fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_reg_nsmr_cont *cmd; 1802fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1803fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_REGISTER_NSMR_CONT, sizeof(*cmd)); 1804fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 1805fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 1806fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->lrkey = hwmr->lkey; 1807fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->num_pbl_offset = (pbl_cnt << OCRDMA_REG_NSMR_CONT_NUM_PBL_SHIFT) | 1808fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (pbl_offset & OCRDMA_REG_NSMR_CONT_PBL_SHIFT_MASK); 1809fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->last = last << OCRDMA_REG_NSMR_CONT_LAST_SHIFT; 1810fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1811fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < pbl_cnt; i++) { 1812fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl[i].lo = 1813fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (u32) (hwmr->pbl_table[i + pbl_offset].pa & 0xffffffff); 1814fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pbl[i].hi = 1815fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit upper_32_bits(hwmr->pbl_table[i + pbl_offset].pa); 1816fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1817fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 1818fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1819fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 1820fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 1821fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 1822fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1823fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1824fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1825fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_reg_mr(struct ocrdma_dev *dev, 1826fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_hw_mr *hwmr, u32 pdid, int acc) 1827fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1828fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 1829fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 last = 0; 1830fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 cur_pbl_cnt, pbl_offset; 1831fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 pending_pbl_cnt = hwmr->num_pbls; 1832fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1833fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pbl_offset = 0; 1834fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cur_pbl_cnt = min(pending_pbl_cnt, MAX_OCRDMA_NSMR_PBL); 1835fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cur_pbl_cnt == pending_pbl_cnt) 1836fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit last = 1; 1837fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1838fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_reg_mr(dev, hwmr, pdid, 1839fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cur_pbl_cnt, hwmr->pbe_size, last); 1840fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) { 1841ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() status=%d\n", __func__, status); 1842fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1843fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1844fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* if there is no more pbls to register then exit. */ 1845fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (last) 1846fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 1847fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1848fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit while (!last) { 1849fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pbl_offset += cur_pbl_cnt; 1850fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pending_pbl_cnt -= cur_pbl_cnt; 1851fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cur_pbl_cnt = min(pending_pbl_cnt, MAX_OCRDMA_NSMR_PBL); 1852fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* if we reach the end of the pbls, then need to set the last 1853fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit * bit, indicating no more pbls to register for this memory key. 1854fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit */ 1855fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (cur_pbl_cnt == pending_pbl_cnt) 1856fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit last = 1; 1857fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1858fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_reg_mr_cont(dev, hwmr, cur_pbl_cnt, 1859fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pbl_offset, last); 1860fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1861fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1862fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1863fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 1864ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() err. status=%d\n", __func__, status); 1865fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1866fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1867fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1868fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1869fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditbool ocrdma_is_qp_in_sq_flushlist(struct ocrdma_cq *cq, struct ocrdma_qp *qp) 1870fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1871fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *tmp; 1872fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit bool found = false; 1873fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit list_for_each_entry(tmp, &cq->sq_head, sq_entry) { 1874fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp == tmp) { 1875fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit found = true; 1876fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1877fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1878fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1879fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return found; 1880fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1881fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1882fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditbool ocrdma_is_qp_in_rq_flushlist(struct ocrdma_cq *cq, struct ocrdma_qp *qp) 1883fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1884fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *tmp; 1885fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit bool found = false; 1886fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit list_for_each_entry(tmp, &cq->rq_head, rq_entry) { 1887fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp == tmp) { 1888fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit found = true; 1889fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 1890fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1891fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1892fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return found; 1893fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1894fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1895fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditvoid ocrdma_flush_qp(struct ocrdma_qp *qp) 1896fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1897fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit bool found; 1898fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit unsigned long flags; 1899fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1900fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_lock_irqsave(&qp->dev->flush_q_lock, flags); 1901fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit found = ocrdma_is_qp_in_sq_flushlist(qp->sq_cq, qp); 1902fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!found) 1903fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit list_add_tail(&qp->sq_entry, &qp->sq_cq->sq_head); 1904fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!qp->srq) { 1905fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit found = ocrdma_is_qp_in_rq_flushlist(qp->rq_cq, qp); 1906fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!found) 1907fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit list_add_tail(&qp->rq_entry, &qp->rq_cq->rq_head); 1908fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1909fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&qp->dev->flush_q_lock, flags); 1910fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1911fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1912f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkalastatic void ocrdma_init_hwq_ptr(struct ocrdma_qp *qp) 1913f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala{ 1914f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala qp->sq.head = 0; 1915f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala qp->sq.tail = 0; 1916f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala qp->rq.head = 0; 1917f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala qp->rq.tail = 0; 1918f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala} 1919f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala 1920057729cb234754d12e0b2a361c2fc85c6363cbf6Naresh Gottumukkalaint ocrdma_qp_state_change(struct ocrdma_qp *qp, enum ib_qp_state new_ib_state, 1921057729cb234754d12e0b2a361c2fc85c6363cbf6Naresh Gottumukkala enum ib_qp_state *old_ib_state) 1922fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1923fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit unsigned long flags; 1924fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = 0; 1925fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit enum ocrdma_qp_state new_state; 1926fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit new_state = get_ocrdma_qp_state(new_ib_state); 1927fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1928fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* sync with wqe and rqe posting */ 1929fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_lock_irqsave(&qp->q_lock, flags); 1930fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1931fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (old_ib_state) 1932fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *old_ib_state = get_ibqp_state(qp->state); 1933fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (new_state == qp->state) { 1934fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&qp->q_lock, flags); 1935fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 1; 1936fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1937fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1938057729cb234754d12e0b2a361c2fc85c6363cbf6Naresh Gottumukkala 1939f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala if (new_state == OCRDMA_QPS_INIT) { 1940f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala ocrdma_init_hwq_ptr(qp); 1941f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala ocrdma_del_flush_qp(qp); 1942f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala } else if (new_state == OCRDMA_QPS_ERR) { 1943057729cb234754d12e0b2a361c2fc85c6363cbf6Naresh Gottumukkala ocrdma_flush_qp(qp); 1944f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala } 1945057729cb234754d12e0b2a361c2fc85c6363cbf6Naresh Gottumukkala 1946057729cb234754d12e0b2a361c2fc85c6363cbf6Naresh Gottumukkala qp->state = new_state; 1947fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1948fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&qp->q_lock, flags); 1949fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 1950fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1951fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1952fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic u32 ocrdma_set_create_qp_mbx_access_flags(struct ocrdma_qp *qp) 1953fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1954fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 flags = 0; 1955fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->cap_flags & OCRDMA_QP_INB_RD) 1956fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit flags |= OCRDMA_CREATE_QP_REQ_INB_RDEN_MASK; 1957fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->cap_flags & OCRDMA_QP_INB_WR) 1958fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit flags |= OCRDMA_CREATE_QP_REQ_INB_WREN_MASK; 1959fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->cap_flags & OCRDMA_QP_MW_BIND) 1960fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit flags |= OCRDMA_CREATE_QP_REQ_BIND_MEMWIN_MASK; 1961fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->cap_flags & OCRDMA_QP_LKEY0) 1962fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit flags |= OCRDMA_CREATE_QP_REQ_ZERO_LKEYEN_MASK; 1963fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->cap_flags & OCRDMA_QP_FAST_REG) 1964fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit flags |= OCRDMA_CREATE_QP_REQ_FMR_EN_MASK; 1965fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return flags; 1966fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 1967fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1968fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_set_create_qp_sq_cmd(struct ocrdma_create_qp_req *cmd, 1969fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ib_qp_init_attr *attrs, 1970fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp) 1971fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 1972fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 1973fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 len, hw_pages, hw_page_size; 1974fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_addr_t pa; 1975fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dev *dev = qp->dev; 1976fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 1977fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 max_wqe_allocated; 1978fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 max_sges = attrs->cap.max_send_sge; 1979fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 198043a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala /* QP1 may exceed 127 */ 19816ebacdfc07ca61ba258693c9b4c88f1ffbe8ccd7Dan Carpenter max_wqe_allocated = min_t(u32, attrs->cap.max_send_wr + 1, 198243a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala dev->attr.max_wqe); 1983fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1984fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_build_q_conf(&max_wqe_allocated, 1985fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->attr.wqe_size, &hw_pages, &hw_page_size); 1986fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) { 1987ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() req. max_send_wr=0x%x\n", __func__, 1988ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala max_wqe_allocated); 1989fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -EINVAL; 1990fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 1991fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.max_cnt = max_wqe_allocated; 1992fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit len = (hw_pages * hw_page_size); 1993fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 1994fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.va = dma_alloc_coherent(&pdev->dev, len, &pa, GFP_KERNEL); 1995fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!qp->sq.va) 1996fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -EINVAL; 1997fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(qp->sq.va, 0, len); 1998fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.len = len; 1999fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.pa = pa; 2000fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.entry_size = dev->attr.wqe_size; 2001fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_build_q_pages(&cmd->wq_addr[0], hw_pages, pa, hw_page_size); 2002fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2003fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->type_pgsz_pdn |= (ilog2(hw_page_size / OCRDMA_MIN_Q_PAGE_SIZE) 2004fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit << OCRDMA_CREATE_QP_REQ_SQ_PAGE_SIZE_SHIFT); 2005fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->num_wq_rq_pages |= (hw_pages << 2006fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_NUM_WQ_PAGES_SHIFT) & 2007fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_NUM_WQ_PAGES_MASK; 2008fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_send_write |= (max_sges << 2009fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_SGE_SEND_SHIFT) & 2010fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_SGE_SEND_MASK; 2011fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_send_write |= (max_sges << 2012fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_SGE_WRITE_SHIFT) & 2013fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_SGE_WRITE_MASK; 2014fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_wqe_rqe |= (ilog2(qp->sq.max_cnt) << 2015fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_WQE_SHIFT) & 2016fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_WQE_MASK; 2017fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->wqe_rqe_size |= (dev->attr.wqe_size << 2018fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_WQE_SIZE_SHIFT) & 2019fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_WQE_SIZE_MASK; 2020fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 2021fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2022fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2023fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_set_create_qp_rq_cmd(struct ocrdma_create_qp_req *cmd, 2024fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ib_qp_init_attr *attrs, 2025fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp) 2026fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2027fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 2028fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 len, hw_pages, hw_page_size; 2029fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_addr_t pa = 0; 2030fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dev *dev = qp->dev; 2031fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 2032fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 max_rqe_allocated = attrs->cap.max_recv_wr + 1; 2033fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2034fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_build_q_conf(&max_rqe_allocated, dev->attr.rqe_size, 2035fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit &hw_pages, &hw_page_size); 2036fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) { 2037ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() req. max_recv_wr=0x%x\n", __func__, 2038ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala attrs->cap.max_recv_wr + 1); 2039fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2040fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2041fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.max_cnt = max_rqe_allocated; 2042fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit len = (hw_pages * hw_page_size); 2043fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2044fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.va = dma_alloc_coherent(&pdev->dev, len, &pa, GFP_KERNEL); 2045fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!qp->rq.va) 2046c94e15c5cb4d02579321382871eb87e17d10858eWei Yongjun return -ENOMEM; 2047fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(qp->rq.va, 0, len); 2048fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.pa = pa; 2049fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.len = len; 2050fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.entry_size = dev->attr.rqe_size; 2051fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2052fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_build_q_pages(&cmd->rq_addr[0], hw_pages, pa, hw_page_size); 2053fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->type_pgsz_pdn |= (ilog2(hw_page_size / OCRDMA_MIN_Q_PAGE_SIZE) << 2054fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_RQ_PAGE_SIZE_SHIFT); 2055fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->num_wq_rq_pages |= 2056fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (hw_pages << OCRDMA_CREATE_QP_REQ_NUM_RQ_PAGES_SHIFT) & 2057fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_NUM_RQ_PAGES_MASK; 2058fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_recv_flags |= (attrs->cap.max_recv_sge << 2059fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_SGE_RECV_SHIFT) & 2060fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_SGE_RECV_MASK; 2061fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_wqe_rqe |= (ilog2(qp->rq.max_cnt) << 2062fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_RQE_SHIFT) & 2063fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_RQE_MASK; 2064fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->wqe_rqe_size |= (dev->attr.rqe_size << 2065fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_RQE_SIZE_SHIFT) & 2066fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_RQE_SIZE_MASK; 2067fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 2068fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2069fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2070fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_set_create_qp_dpp_cmd(struct ocrdma_create_qp_req *cmd, 2071fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_pd *pd, 2072fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp, 2073fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 enable_dpp_cq, u16 dpp_cq_id) 2074fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2075fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pd->num_dpp_qp--; 2076fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->dpp_enabled = true; 2077fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_recv_flags |= OCRDMA_CREATE_QP_REQ_ENABLE_DPP_MASK; 2078fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!enable_dpp_cq) 2079fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return; 2080fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_recv_flags |= OCRDMA_CREATE_QP_REQ_ENABLE_DPP_MASK; 2081fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->dpp_credits_cqid = dpp_cq_id; 2082fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->dpp_credits_cqid |= OCRDMA_CREATE_QP_REQ_DPP_CREDIT_LIMIT << 2083fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_DPP_CREDIT_SHIFT; 2084fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2085fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2086fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_set_create_qp_ird_cmd(struct ocrdma_create_qp_req *cmd, 2087fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp) 2088fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2089fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dev *dev = qp->dev; 2090fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 2091fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_addr_t pa = 0; 2092fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int ird_page_size = dev->attr.ird_page_size; 2093fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int ird_q_len = dev->attr.num_ird_pages * ird_page_size; 209443a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala struct ocrdma_hdr_wqe *rqe; 209543a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala int i = 0; 2096fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2097fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dev->attr.ird == 0) 2098fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 2099fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2100fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->ird_q_va = dma_alloc_coherent(&pdev->dev, ird_q_len, 2101fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit &pa, GFP_KERNEL); 2102fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!qp->ird_q_va) 2103fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 2104fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memset(qp->ird_q_va, 0, ird_q_len); 2105fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_build_q_pages(&cmd->ird_addr[0], dev->attr.num_ird_pages, 2106fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit pa, ird_page_size); 210743a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala for (; i < ird_q_len / dev->attr.rqe_size; i++) { 210843a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala rqe = (struct ocrdma_hdr_wqe *)(qp->ird_q_va + 210943a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala (i * dev->attr.rqe_size)); 211043a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala rqe->cw = 0; 211143a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala rqe->cw |= 2; 211243a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala rqe->cw |= (OCRDMA_TYPE_LKEY << OCRDMA_WQE_TYPE_SHIFT); 211343a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala rqe->cw |= (8 << OCRDMA_WQE_SIZE_SHIFT); 211443a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala rqe->cw |= (8 << OCRDMA_WQE_NXT_WQE_SIZE_SHIFT); 211543a6b4025c79ded5b44e58ba0db97c29dd38d718Naresh Gottumukkala } 2116fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 2117fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2118fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2119fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic void ocrdma_get_create_qp_rsp(struct ocrdma_create_qp_rsp *rsp, 2120fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp *qp, 2121fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ib_qp_init_attr *attrs, 2122fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u16 *dpp_offset, u16 *dpp_credit_lmt) 2123fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2124fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 max_wqe_allocated, max_rqe_allocated; 2125fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->id = rsp->qp_id & OCRDMA_CREATE_QP_RSP_QP_ID_MASK; 2126fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.dbid = rsp->sq_rq_id & OCRDMA_CREATE_QP_RSP_RQ_ID_MASK; 2127fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.dbid = rsp->sq_rq_id >> OCRDMA_CREATE_QP_RSP_SQ_ID_SHIFT; 2128fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->max_ird = rsp->max_ord_ird & OCRDMA_CREATE_QP_RSP_MAX_IRD_MASK; 2129fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->max_ord = (rsp->max_ord_ird >> OCRDMA_CREATE_QP_RSP_MAX_ORD_SHIFT); 2130fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->dpp_enabled = false; 2131fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (rsp->dpp_response & OCRDMA_CREATE_QP_RSP_DPP_ENABLED_MASK) { 2132fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->dpp_enabled = true; 2133fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *dpp_credit_lmt = (rsp->dpp_response & 2134fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_RSP_DPP_CREDITS_MASK) >> 2135fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_RSP_DPP_CREDITS_SHIFT; 2136fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit *dpp_offset = (rsp->dpp_response & 2137fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_RSP_DPP_PAGE_OFFSET_MASK) >> 2138fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_RSP_DPP_PAGE_OFFSET_SHIFT; 2139fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2140fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_wqe_allocated = 2141fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp->max_wqe_rqe >> OCRDMA_CREATE_QP_RSP_MAX_WQE_SHIFT; 2142fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_wqe_allocated = 1 << max_wqe_allocated; 2143fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_rqe_allocated = 1 << ((u16)rsp->max_wqe_rqe); 2144fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2145fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.max_cnt = max_wqe_allocated; 2146fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq.max_wqe_idx = max_wqe_allocated - 1; 2147fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2148fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!attrs->srq) { 2149fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.max_cnt = max_rqe_allocated; 2150fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq.max_wqe_idx = max_rqe_allocated - 1; 2151fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2152fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2153fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2154fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_create_qp(struct ocrdma_qp *qp, struct ib_qp_init_attr *attrs, 2155fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 enable_dpp_cq, u16 dpp_cq_id, u16 *dpp_offset, 2156fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u16 *dpp_credit_lmt) 2157fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2158fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2159fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 flags = 0; 2160fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_dev *dev = qp->dev; 2161fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_pd *pd = qp->pd; 2162fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 2163fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_cq *cq; 2164fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_qp_req *cmd; 2165fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_qp_rsp *rsp; 2166fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int qptype; 2167fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2168fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit switch (attrs->qp_type) { 2169fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPT_GSI: 2170fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qptype = OCRDMA_QPT_GSI; 2171fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 2172fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPT_RC: 2173fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qptype = OCRDMA_QPT_RC; 2174fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 2175fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit case IB_QPT_UD: 2176fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qptype = OCRDMA_QPT_UD; 2177fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 2178fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit default: 2179fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -EINVAL; 21802b50176d11866e59208a4ed1623b3fc0ca322690Joe Perches } 2181fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2182fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_CREATE_QP, sizeof(*cmd)); 2183fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2184fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2185fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->type_pgsz_pdn |= (qptype << OCRDMA_CREATE_QP_REQ_QPT_SHIFT) & 2186fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_QPT_MASK; 2187fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_set_create_qp_sq_cmd(cmd, attrs, qp); 2188fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2189fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto sq_err; 2190fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2191fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attrs->srq) { 2192fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_srq *srq = get_ocrdma_srq(attrs->srq); 2193fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_recv_flags |= OCRDMA_CREATE_QP_REQ_USE_SRQ_MASK; 2194fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->rq_addr[0].lo = srq->id; 2195fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->srq = srq; 2196fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } else { 2197fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_set_create_qp_rq_cmd(cmd, attrs, qp); 2198fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2199fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto rq_err; 2200fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2201fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2202fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_set_create_qp_ird_cmd(cmd, qp); 2203fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2204fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 2205fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2206fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->type_pgsz_pdn |= (pd->id << OCRDMA_CREATE_QP_REQ_PD_ID_SHIFT) & 2207fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_PD_ID_MASK; 2208fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2209fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit flags = ocrdma_set_create_qp_mbx_access_flags(qp); 2210fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2211fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_recv_flags |= flags; 2212fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_ord_ird |= (dev->attr.max_ord_per_qp << 2213fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_ORD_SHIFT) & 2214fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_ORD_MASK; 2215fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_ord_ird |= (dev->attr.max_ird_per_qp << 2216fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_IRD_SHIFT) & 2217fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_MAX_IRD_MASK; 2218fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq = get_ocrdma_cq(attrs->send_cq); 2219fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->wq_rq_cqid |= (cq->id << OCRDMA_CREATE_QP_REQ_WQ_CQID_SHIFT) & 2220fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_WQ_CQID_MASK; 2221fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sq_cq = cq; 2222fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cq = get_ocrdma_cq(attrs->recv_cq); 2223fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->wq_rq_cqid |= (cq->id << OCRDMA_CREATE_QP_REQ_RQ_CQID_SHIFT) & 2224fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_QP_REQ_RQ_CQID_MASK; 2225fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->rq_cq = cq; 2226fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2227f50f31e42fb772b62e209cf6ff5254b1bc02b756Devesh Sharma if (pd->dpp_enabled && attrs->cap.max_inline_data && pd->num_dpp_qp && 2228f50f31e42fb772b62e209cf6ff5254b1bc02b756Devesh Sharma (attrs->cap.max_inline_data <= dev->attr.max_inline_data)) { 2229fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_set_create_qp_dpp_cmd(cmd, pd, qp, enable_dpp_cq, 2230fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dpp_cq_id); 2231f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } 2232fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2233fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2234fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2235fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 2236fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_create_qp_rsp *)cmd; 2237fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_get_create_qp_rsp(rsp, qp, attrs, dpp_offset, dpp_credit_lmt); 2238fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->state = OCRDMA_QPS_RST; 2239fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2240fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 2241fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 2242fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->rq.va) 2243fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, qp->rq.len, qp->rq.va, qp->rq.pa); 2244fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditrq_err: 2245ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s(%d) rq_err\n", __func__, dev->id); 2246fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, qp->sq.len, qp->sq.va, qp->sq.pa); 2247fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditsq_err: 2248ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s(%d) sq_err\n", __func__, dev->id); 2249fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2250fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2251fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2252fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2253fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_query_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp, 2254fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_qp_params *param) 2255fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2256fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2257fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_query_qp *cmd; 2258fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_query_qp_rsp *rsp; 2259fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2260fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_QP, sizeof(*cmd)); 2261fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2262fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2263fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->qp_id = qp->id; 2264fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2265fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2266fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 2267fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_query_qp_rsp *)cmd; 2268fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memcpy(param, &rsp->params, sizeof(struct ocrdma_qp_params)); 2269fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 2270fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2271fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2272fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2273fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2274f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkalastatic int ocrdma_set_av_params(struct ocrdma_qp *qp, 2275fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_modify_qp *cmd, 2276bf67472ca1fac19c81367601bd4ba7d17bdc9f6eSelvin Xavier struct ib_qp_attr *attrs, 2277bf67472ca1fac19c81367601bd4ba7d17bdc9f6eSelvin Xavier int attr_mask) 2278fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2279f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala int status; 2280fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ib_ah_attr *ah_attr = &attrs->ah_attr; 22819c58726ba96ad5f767ce2d8c42159c3075a98d6fNaresh Gottumukkala union ib_gid sgid, zgid; 2282fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 vlan_id; 2283fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u8 mac_addr[6]; 22849c58726ba96ad5f767ce2d8c42159c3075a98d6fNaresh Gottumukkala 2285fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if ((ah_attr->ah_flags & IB_AH_GRH) == 0) 2286f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala return -EINVAL; 228731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (atomic_cmpxchg(&qp->dev->update_sl, 1, 0)) 228831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier ocrdma_init_service_level(qp->dev); 2289fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.tclass_sq_psn |= 2290fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (ah_attr->grh.traffic_class << OCRDMA_QP_PARAMS_TCLASS_SHIFT); 2291fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.rnt_rc_sl_fl |= 2292fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (ah_attr->grh.flow_label & OCRDMA_QP_PARAMS_FLOW_LABEL_MASK); 22932b51a9b9eb6bf240d2592e10d2f8823dd1f5ee3eNaresh Gottumukkala cmd->params.rnt_rc_sl_fl |= (ah_attr->sl << OCRDMA_QP_PARAMS_SL_SHIFT); 2294fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.hop_lmt_rq_psn |= 2295fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (ah_attr->grh.hop_limit << OCRDMA_QP_PARAMS_HOP_LMT_SHIFT); 2296fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_FLOW_LBL_VALID; 2297fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memcpy(&cmd->params.dgid[0], &ah_attr->grh.dgid.raw[0], 2298fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit sizeof(cmd->params.dgid)); 2299f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala status = ocrdma_query_gid(&qp->dev->ibdev, 1, 2300fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharma ah_attr->grh.sgid_index, &sgid); 2301f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala if (status) 2302f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala return status; 23039c58726ba96ad5f767ce2d8c42159c3075a98d6fNaresh Gottumukkala 23049c58726ba96ad5f767ce2d8c42159c3075a98d6fNaresh Gottumukkala memset(&zgid, 0, sizeof(zgid)); 23059c58726ba96ad5f767ce2d8c42159c3075a98d6fNaresh Gottumukkala if (!memcmp(&sgid, &zgid, sizeof(zgid))) 23069c58726ba96ad5f767ce2d8c42159c3075a98d6fNaresh Gottumukkala return -EINVAL; 23079c58726ba96ad5f767ce2d8c42159c3075a98d6fNaresh Gottumukkala 2308fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->sgid_idx = ah_attr->grh.sgid_index; 2309fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit memcpy(&cmd->params.sgid[0], &sgid.raw[0], sizeof(cmd->params.sgid)); 231040aca6ffcac57dd9c65877a59a8bbb210c4691caMoni Shoua ocrdma_resolve_dmac(qp->dev, ah_attr, &mac_addr[0]); 2311fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1] << 8) | 2312fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (mac_addr[2] << 16) | (mac_addr[3] << 24); 2313fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* convert them to LE format. */ 2314fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_cpu_to_le32(&cmd->params.dgid[0], sizeof(cmd->params.dgid)); 2315fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_cpu_to_le32(&cmd->params.sgid[0], sizeof(cmd->params.sgid)); 2316fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.vlan_dmac_b4_to_b5 = mac_addr[4] | (mac_addr[5] << 8); 2317bf67472ca1fac19c81367601bd4ba7d17bdc9f6eSelvin Xavier if (attr_mask & IB_QP_VID) { 2318bf67472ca1fac19c81367601bd4ba7d17bdc9f6eSelvin Xavier vlan_id = attrs->vlan_id; 2319fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.vlan_dmac_b4_to_b5 |= 2320fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit vlan_id << OCRDMA_QP_PARAMS_VLAN_SHIFT; 2321fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_VLAN_EN_VALID; 232231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier cmd->params.rnt_rc_sl_fl |= 23230ea8726250cae3defa0c1065801017f26a269c93Devesh Sharma (qp->dev->sl & 0x07) << OCRDMA_QP_PARAMS_SL_SHIFT; 2324fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2325f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala return 0; 2326fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2327fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2328fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditstatic int ocrdma_set_qp_params(struct ocrdma_qp *qp, 2329fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_modify_qp *cmd, 2330bc1b04ab34a1485339571242cb0fbad823835685Prarit Bhargava struct ib_qp_attr *attrs, int attr_mask) 2331fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2332fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = 0; 2333fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2334fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_PKEY_INDEX) { 2335fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.path_mtu_pkey_indx |= (attrs->pkey_index & 2336fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_PKEY_INDEX_MASK); 2337fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_PKEY_VALID; 2338fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2339fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_QKEY) { 2340fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->qkey = attrs->qkey; 2341fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.qkey = attrs->qkey; 2342fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_QKEY_VALID; 2343fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2344f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala if (attr_mask & IB_QP_AV) { 2345bf67472ca1fac19c81367601bd4ba7d17bdc9f6eSelvin Xavier status = ocrdma_set_av_params(qp, cmd, attrs, attr_mask); 2346f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala if (status) 2347f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala return status; 2348f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } else if (qp->qp_type == IB_QPT_GSI || qp->qp_type == IB_QPT_UD) { 2349fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* set the default mac address for UD, GSI QPs */ 2350fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.dmac_b0_to_b3 = qp->dev->nic_info.mac_addr[0] | 2351fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (qp->dev->nic_info.mac_addr[1] << 8) | 2352fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (qp->dev->nic_info.mac_addr[2] << 16) | 2353fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (qp->dev->nic_info.mac_addr[3] << 24); 2354fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.vlan_dmac_b4_to_b5 = qp->dev->nic_info.mac_addr[4] | 2355fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (qp->dev->nic_info.mac_addr[5] << 8); 2356fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2357fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if ((attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY) && 2358fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit attrs->en_sqd_async_notify) { 2359fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.max_sge_recv_flags |= 2360fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_FLAGS_SQD_ASYNC; 2361fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_DST_QPN_VALID; 2362fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2363fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_DEST_QPN) { 2364fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.ack_to_rnr_rtc_dest_qpn |= (attrs->dest_qp_num & 2365fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_DEST_QPN_MASK); 2366fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_DST_QPN_VALID; 2367fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2368fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_PATH_MTU) { 2369d3cb6c0b2a0d9f507fff8d7c74b2b334d6751beeNaresh Gottumukkala if (attrs->path_mtu < IB_MTU_256 || 2370d3cb6c0b2a0d9f507fff8d7c74b2b334d6751beeNaresh Gottumukkala attrs->path_mtu > IB_MTU_4096) { 2371fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -EINVAL; 2372fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto pmtu_err; 2373fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2374fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.path_mtu_pkey_indx |= 2375fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (ib_mtu_enum_to_int(attrs->path_mtu) << 2376fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_PATH_MTU_SHIFT) & 2377fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_PATH_MTU_MASK; 2378fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_PMTU_VALID; 2379fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2380fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_TIMEOUT) { 2381fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.ack_to_rnr_rtc_dest_qpn |= attrs->timeout << 2382fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_ACK_TIMEOUT_SHIFT; 2383fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_ACK_TO_VALID; 2384fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2385fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_RETRY_CNT) { 2386fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.rnt_rc_sl_fl |= (attrs->retry_cnt << 2387fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_RETRY_CNT_SHIFT) & 2388fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_RETRY_CNT_MASK; 2389fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_RETRY_CNT_VALID; 2390fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2391fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_MIN_RNR_TIMER) { 2392fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.rnt_rc_sl_fl |= (attrs->min_rnr_timer << 2393fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_RNR_NAK_TIMER_SHIFT) & 2394fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_RNR_NAK_TIMER_MASK; 2395fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_RNT_VALID; 2396fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2397fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_RNR_RETRY) { 2398fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.ack_to_rnr_rtc_dest_qpn |= (attrs->rnr_retry << 2399fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_RNR_RETRY_CNT_SHIFT) 2400fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit & OCRDMA_QP_PARAMS_RNR_RETRY_CNT_MASK; 2401fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_RRC_VALID; 2402fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2403fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_SQ_PSN) { 2404fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.tclass_sq_psn |= (attrs->sq_psn & 0x00ffffff); 2405fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_SQPSN_VALID; 2406fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2407fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_RQ_PSN) { 2408fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.hop_lmt_rq_psn |= (attrs->rq_psn & 0x00ffffff); 2409fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_RQPSN_VALID; 2410fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2411fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) { 2412fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attrs->max_rd_atomic > qp->dev->attr.max_ord_per_qp) { 2413fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -EINVAL; 2414fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto pmtu_err; 2415fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2416fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->max_ord = attrs->max_rd_atomic; 2417fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_MAX_ORD_VALID; 2418fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2419fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) { 2420fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attrs->max_dest_rd_atomic > qp->dev->attr.max_ird_per_qp) { 2421fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -EINVAL; 2422fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto pmtu_err; 2423fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2424fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->max_ird = attrs->max_dest_rd_atomic; 2425fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_MAX_IRD_VALID; 2426fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2427fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.max_ord_ird = (qp->max_ord << 2428fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_MAX_ORD_SHIFT) | 2429fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (qp->max_ird & OCRDMA_QP_PARAMS_MAX_IRD_MASK); 2430fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditpmtu_err: 2431fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2432fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2433fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2434fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_modify_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp, 2435bc1b04ab34a1485339571242cb0fbad823835685Prarit Bhargava struct ib_qp_attr *attrs, int attr_mask) 2436fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2437fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2438fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_modify_qp *cmd; 2439fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2440fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_MODIFY_QP, sizeof(*cmd)); 2441fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2442fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2443fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2444fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.id = qp->id; 2445fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags = 0; 2446fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (attr_mask & IB_QP_STATE) { 2447fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.max_sge_recv_flags |= 2448fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (get_ocrdma_qp_state(attrs->qp_state) << 2449fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_STATE_SHIFT) & 2450fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_STATE_MASK; 2451fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->flags |= OCRDMA_QP_PARA_QPS_VALID; 2452f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } else { 2453fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->params.max_sge_recv_flags |= 2454fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (qp->state << OCRDMA_QP_PARAMS_STATE_SHIFT) & 2455fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QP_PARAMS_STATE_MASK; 2456f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } 2457f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala 2458bc1b04ab34a1485339571242cb0fbad823835685Prarit Bhargava status = ocrdma_set_qp_params(qp, cmd, attrs, attr_mask); 2459fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2460fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 2461fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2462fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2463fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 2464c592c42331f685b73f19ee54cfebfac0084f6e93Roland Dreier 2465fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 2466fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2467fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2468fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2469fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2470fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_destroy_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp) 2471fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2472fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2473fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_destroy_qp *cmd; 2474fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 2475fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2476fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DELETE_QP, sizeof(*cmd)); 2477fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2478fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2479fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->qp_id = qp->id; 2480fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2481fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2482fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 2483c592c42331f685b73f19ee54cfebfac0084f6e93Roland Dreier 2484fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 2485fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2486fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->sq.va) 2487fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, qp->sq.len, qp->sq.va, qp->sq.pa); 2488fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!qp->srq && qp->rq.va) 2489fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, qp->rq.len, qp->rq.va, qp->rq.pa); 2490fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (qp->dpp_enabled) 2491fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit qp->pd->num_dpp_qp++; 2492fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2493fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2494fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 24951afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkalaint ocrdma_mbx_create_srq(struct ocrdma_dev *dev, struct ocrdma_srq *srq, 2496fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ib_srq_init_attr *srq_attr, 2497fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_pd *pd) 2498fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2499fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2500fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int hw_pages, hw_page_size; 2501fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int len; 2502fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_srq_rsp *rsp; 2503fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_create_srq *cmd; 2504fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_addr_t pa; 2505fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 2506fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit u32 max_rqe_allocated; 2507fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2508fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_CREATE_SRQ, sizeof(*cmd)); 2509fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2510fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2511fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2512fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pgsz_pdid = pd->id & OCRDMA_CREATE_SRQ_PD_ID_MASK; 2513fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_rqe_allocated = srq_attr->attr.max_wr + 1; 2514fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_build_q_conf(&max_rqe_allocated, 2515fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->attr.rqe_size, 2516fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit &hw_pages, &hw_page_size); 2517fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) { 2518ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() req. max_wr=0x%x\n", __func__, 2519ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala srq_attr->attr.max_wr); 2520fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -EINVAL; 2521fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto ret; 2522fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2523fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit len = hw_pages * hw_page_size; 2524fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.va = dma_alloc_coherent(&pdev->dev, len, &pa, GFP_KERNEL); 2525fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!srq->rq.va) { 2526fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -ENOMEM; 2527fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto ret; 2528fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2529fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_build_q_pages(&cmd->rq_addr[0], hw_pages, pa, hw_page_size); 2530fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2531fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.entry_size = dev->attr.rqe_size; 2532fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.pa = pa; 2533fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.len = len; 2534fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.max_cnt = max_rqe_allocated; 2535fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2536fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_rqe = ilog2(max_rqe_allocated); 2537fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->max_sge_rqe |= srq_attr->attr.max_sge << 2538fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_SRQ_MAX_SGE_RECV_SHIFT; 2539fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2540fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pgsz_pdid |= (ilog2(hw_page_size / OCRDMA_MIN_Q_PAGE_SIZE) 2541fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit << OCRDMA_CREATE_SRQ_PG_SZ_SHIFT); 2542fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pages_rqe_sz |= (dev->attr.rqe_size 2543fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit << OCRDMA_CREATE_SRQ_RQE_SIZE_SHIFT) 2544fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit & OCRDMA_CREATE_SRQ_RQE_SIZE_MASK; 2545fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->pages_rqe_sz |= hw_pages << OCRDMA_CREATE_SRQ_NUM_RQ_PAGES_SHIFT; 2546fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2547fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2548fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2549fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mbx_err; 2550fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp = (struct ocrdma_create_srq_rsp *)cmd; 2551fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->id = rsp->id; 2552fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.dbid = rsp->id; 2553fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_rqe_allocated = ((rsp->max_sge_rqe_allocated & 2554fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_SRQ_RSP_MAX_RQE_ALLOCATED_MASK) >> 2555fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_SRQ_RSP_MAX_RQE_ALLOCATED_SHIFT); 2556fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit max_rqe_allocated = (1 << max_rqe_allocated); 2557fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.max_cnt = max_rqe_allocated; 2558fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.max_wqe_idx = max_rqe_allocated - 1; 2559fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.max_sges = (rsp->max_sge_rqe_allocated & 2560fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_SRQ_RSP_MAX_SGE_RECV_ALLOCATED_MASK) >> 2561fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_CREATE_SRQ_RSP_MAX_SGE_RECV_ALLOCATED_SHIFT; 2562fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto ret; 2563fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmbx_err: 2564fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, srq->rq.len, srq->rq.va, pa); 2565fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditret: 2566fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2567fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2568fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2569fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2570fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_modify_srq(struct ocrdma_srq *srq, struct ib_srq_attr *srq_attr) 2571fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2572fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2573fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_modify_srq *cmd; 2574f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala struct ocrdma_pd *pd = srq->pd; 2575f11220ee69f72cf08479f28fd494264ac6a9349bNaresh Gottumukkala struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); 25761afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala 2577d7e19c0ad9baa0cfe7ef8b69a182a7db1dee6b52Naresh Gottumukkala cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_MODIFY_SRQ, sizeof(*cmd)); 2578fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2579fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2580fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->id = srq->id; 2581fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->limit_max_rqe |= srq_attr->srq_limit << 2582fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_MODIFY_SRQ_LIMIT_SHIFT; 25831afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2584fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2585fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2586fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2587fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2588fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_query_srq(struct ocrdma_srq *srq, struct ib_srq_attr *srq_attr) 2589fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2590fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2591fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_query_srq *cmd; 25921afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala struct ocrdma_dev *dev = get_ocrdma_dev(srq->ibsrq.device); 25931afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala 2594d7e19c0ad9baa0cfe7ef8b69a182a7db1dee6b52Naresh Gottumukkala cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_SRQ, sizeof(*cmd)); 2595fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2596fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2597fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->id = srq->rq.dbid; 25981afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2599fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status == 0) { 2600fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_query_srq_rsp *rsp = 2601fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit (struct ocrdma_query_srq_rsp *)cmd; 2602fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq_attr->max_sge = 2603fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp->srq_lmt_max_sge & 2604fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QUERY_SRQ_RSP_MAX_SGE_RECV_MASK; 2605fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq_attr->max_wr = 2606fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit rsp->max_rqe_pdid >> OCRDMA_QUERY_SRQ_RSP_MAX_RQE_SHIFT; 2607fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq_attr->srq_limit = rsp->srq_lmt_max_sge >> 2608fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit OCRDMA_QUERY_SRQ_RSP_SRQ_LIMIT_SHIFT; 2609fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2610fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2611fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2612fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2613fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2614fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_mbx_destroy_srq(struct ocrdma_dev *dev, struct ocrdma_srq *srq) 2615fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2616fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -ENOMEM; 2617fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_destroy_srq *cmd; 2618fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct pci_dev *pdev = dev->nic_info.pdev; 2619fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DELETE_SRQ, sizeof(*cmd)); 2620fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (!cmd) 2621fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2622fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit cmd->id = srq->id; 26231afc0454b6658ad2d0a87e594e1f06dc19c6977dNaresh Gottumukkala status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); 2624fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (srq->rq.va) 2625fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dma_free_coherent(&pdev->dev, srq->rq.len, 2626fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit srq->rq.va, srq->rq.pa); 2627fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit kfree(cmd); 2628fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2629fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2630fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 263131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavierstatic int ocrdma_mbx_get_dcbx_config(struct ocrdma_dev *dev, u32 ptype, 263231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_dcbx_cfg *dcbxcfg) 263331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier{ 263431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier int status = 0; 263531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dma_addr_t pa; 263631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_mqe cmd; 263731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 263831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_get_dcbx_cfg_req *req = NULL; 263931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_get_dcbx_cfg_rsp *rsp = NULL; 264031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct pci_dev *pdev = dev->nic_info.pdev; 264131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_mqe_sge *mqe_sge = cmd.u.nonemb_req.sge; 264231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 264331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier memset(&cmd, 0, sizeof(struct ocrdma_mqe)); 264431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier cmd.hdr.pyld_len = max_t (u32, sizeof(struct ocrdma_get_dcbx_cfg_rsp), 264531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier sizeof(struct ocrdma_get_dcbx_cfg_req)); 264631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier req = dma_alloc_coherent(&pdev->dev, cmd.hdr.pyld_len, &pa, GFP_KERNEL); 264731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (!req) { 264831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier status = -ENOMEM; 264931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier goto mem_err; 265031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 265131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 265231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier cmd.hdr.spcl_sge_cnt_emb |= (1 << OCRDMA_MQE_HDR_SGE_CNT_SHIFT) & 265331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier OCRDMA_MQE_HDR_SGE_CNT_MASK; 265431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier mqe_sge->pa_lo = (u32) (pa & 0xFFFFFFFFUL); 265531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier mqe_sge->pa_hi = (u32) upper_32_bits(pa); 265631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier mqe_sge->len = cmd.hdr.pyld_len; 265731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 265831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier memset(req, 0, sizeof(struct ocrdma_get_dcbx_cfg_req)); 265931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier ocrdma_init_mch(&req->hdr, OCRDMA_CMD_GET_DCBX_CONFIG, 266031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier OCRDMA_SUBSYS_DCBX, cmd.hdr.pyld_len); 266131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier req->param_type = ptype; 266231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 266331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier status = ocrdma_mbx_cmd(dev, &cmd); 266431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (status) 266531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier goto mbx_err; 266631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 266731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier rsp = (struct ocrdma_get_dcbx_cfg_rsp *)req; 266831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier ocrdma_le32_to_cpu(rsp, sizeof(struct ocrdma_get_dcbx_cfg_rsp)); 266931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier memcpy(dcbxcfg, &rsp->cfg, sizeof(struct ocrdma_dcbx_cfg)); 267031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 267131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xaviermbx_err: 267231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dma_free_coherent(&pdev->dev, cmd.hdr.pyld_len, req, pa); 267331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xaviermem_err: 267431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier return status; 267531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier} 267631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 267731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier#define OCRDMA_MAX_SERVICE_LEVEL_INDEX 0x08 267831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier#define OCRDMA_DEFAULT_SERVICE_LEVEL 0x05 267931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 268031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavierstatic int ocrdma_parse_dcbxcfg_rsp(struct ocrdma_dev *dev, int ptype, 268131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_dcbx_cfg *dcbxcfg, 268231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier u8 *srvc_lvl) 268331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier{ 268431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier int status = -EINVAL, indx, slindx; 268531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier int ventry_cnt; 268631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_app_parameter *app_param; 268731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier u8 valid, proto_sel; 268831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier u8 app_prio, pfc_prio; 268931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier u16 proto; 269031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 269131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (!(dcbxcfg->tcv_aev_opv_st & OCRDMA_DCBX_STATE_MASK)) { 269231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pr_info("%s ocrdma%d DCBX is disabled\n", 269331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev_name(&dev->nic_info.pdev->dev), dev->id); 269431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier goto out; 269531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 269631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 269731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (!ocrdma_is_enabled_and_synced(dcbxcfg->pfc_state)) { 269831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pr_info("%s ocrdma%d priority flow control(%s) is %s%s\n", 269931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev_name(&dev->nic_info.pdev->dev), dev->id, 270031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier (ptype > 0 ? "operational" : "admin"), 270131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier (dcbxcfg->pfc_state & OCRDMA_STATE_FLAG_ENABLED) ? 270231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier "enabled" : "disabled", 270331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier (dcbxcfg->pfc_state & OCRDMA_STATE_FLAG_SYNC) ? 270431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier "" : ", not sync'ed"); 270531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier goto out; 270631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } else { 270731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pr_info("%s ocrdma%d priority flow control is enabled and sync'ed\n", 270831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev_name(&dev->nic_info.pdev->dev), dev->id); 270931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 271031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 271131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier ventry_cnt = (dcbxcfg->tcv_aev_opv_st >> 271231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier OCRDMA_DCBX_APP_ENTRY_SHIFT) 271331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier & OCRDMA_DCBX_STATE_MASK; 271431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 271531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier for (indx = 0; indx < ventry_cnt; indx++) { 271631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier app_param = &dcbxcfg->app_param[indx]; 271731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier valid = (app_param->valid_proto_app >> 271831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier OCRDMA_APP_PARAM_VALID_SHIFT) 271931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier & OCRDMA_APP_PARAM_VALID_MASK; 272031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier proto_sel = (app_param->valid_proto_app 272131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier >> OCRDMA_APP_PARAM_PROTO_SEL_SHIFT) 272231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier & OCRDMA_APP_PARAM_PROTO_SEL_MASK; 272331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier proto = app_param->valid_proto_app & 272431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier OCRDMA_APP_PARAM_APP_PROTO_MASK; 272531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 272631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if ( 272731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier valid && proto == OCRDMA_APP_PROTO_ROCE && 272831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier proto_sel == OCRDMA_PROTO_SELECT_L2) { 272931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier for (slindx = 0; slindx < 273031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier OCRDMA_MAX_SERVICE_LEVEL_INDEX; slindx++) { 273131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier app_prio = ocrdma_get_app_prio( 273231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier (u8 *)app_param->app_prio, 273331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier slindx); 273431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pfc_prio = ocrdma_get_pfc_prio( 273531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier (u8 *)dcbxcfg->pfc_prio, 273631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier slindx); 273731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 273831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (app_prio && pfc_prio) { 273931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier *srvc_lvl = slindx; 274031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier status = 0; 274131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier goto out; 274231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 274331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 274431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (slindx == OCRDMA_MAX_SERVICE_LEVEL_INDEX) { 274531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pr_info("%s ocrdma%d application priority not set for 0x%x protocol\n", 274631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev_name(&dev->nic_info.pdev->dev), 274731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev->id, proto); 274831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 274931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 275031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 275131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 275231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavierout: 275331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier return status; 275431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier} 275531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 275631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xaviervoid ocrdma_init_service_level(struct ocrdma_dev *dev) 275731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier{ 275831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier int status = 0, indx; 275931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier struct ocrdma_dcbx_cfg dcbxcfg; 276031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier u8 srvc_lvl = OCRDMA_DEFAULT_SERVICE_LEVEL; 276131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier int ptype = OCRDMA_PARAMETER_TYPE_OPER; 276231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 276331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier for (indx = 0; indx < 2; indx++) { 276431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier status = ocrdma_mbx_get_dcbx_config(dev, ptype, &dcbxcfg); 276531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (status) { 276631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pr_err("%s(): status=%d\n", __func__, status); 276731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier ptype = OCRDMA_PARAMETER_TYPE_ADMIN; 276831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier continue; 276931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 277031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 277131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier status = ocrdma_parse_dcbxcfg_rsp(dev, ptype, 277231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier &dcbxcfg, &srvc_lvl); 277331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (status) { 277431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier ptype = OCRDMA_PARAMETER_TYPE_ADMIN; 277531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier continue; 277631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 277731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 277831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier break; 277931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier } 278031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 278131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier if (status) 278231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pr_info("%s ocrdma%d service level default\n", 278331dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev_name(&dev->nic_info.pdev->dev), dev->id); 278431dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier else 278531dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier pr_info("%s ocrdma%d service level %d\n", 278631dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev_name(&dev->nic_info.pdev->dev), dev->id, 278731dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier srvc_lvl); 278831dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 278931dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev->pfc_state = ocrdma_is_enabled_and_synced(dcbxcfg.pfc_state); 279031dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier dev->sl = srvc_lvl; 279131dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier} 279231dbdd9af58c63c7f8376a0fa680f5fc1b6cce98Selvin Xavier 2793fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_alloc_av(struct ocrdma_dev *dev, struct ocrdma_ah *ah) 2794fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2795fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int i; 2796fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status = -EINVAL; 2797fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit struct ocrdma_av *av; 2798fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit unsigned long flags; 2799fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2800fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit av = dev->av_tbl.va; 2801fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_lock_irqsave(&dev->av_tbl.lock, flags); 2802fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < dev->av_tbl.num_ah; i++) { 2803fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (av->valid == 0) { 2804fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit av->valid = OCRDMA_AV_VALID; 2805fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ah->av = av; 2806fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ah->id = i; 2807fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = 0; 2808fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 2809fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2810fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit av++; 2811fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2812fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (i == dev->av_tbl.num_ah) 2813fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -EAGAIN; 2814fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&dev->av_tbl.lock, flags); 2815fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2816fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2817fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2818fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_free_av(struct ocrdma_dev *dev, struct ocrdma_ah *ah) 2819fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2820fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit unsigned long flags; 2821fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_lock_irqsave(&dev->av_tbl.lock, flags); 2822fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ah->av->valid = 0; 2823fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit spin_unlock_irqrestore(&dev->av_tbl.lock, flags); 2824fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 2825fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2826fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2827c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkalastatic int ocrdma_create_eqs(struct ocrdma_dev *dev) 2828fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2829da4964387d997244b043dd812540bed851c45c9eRoland Dreier int num_eq, i, status = 0; 2830fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int irq; 2831fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit unsigned long flags = 0; 2832fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2833fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit num_eq = dev->nic_info.msix.num_vectors - 2834fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->nic_info.msix.start_vector; 2835fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (dev->nic_info.intr_mode == BE_INTERRUPT_MODE_INTX) { 2836fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit num_eq = 1; 2837fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit flags = IRQF_SHARED; 2838f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } else { 2839fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit num_eq = min_t(u32, num_eq, num_online_cpus()); 2840f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala } 2841f99b1649dbb6342d618307faef1f214fd54928b9Naresh Gottumukkala 2842c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala if (!num_eq) 2843c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala return -EINVAL; 2844c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala 2845c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala dev->eq_tbl = kzalloc(sizeof(struct ocrdma_eq) * num_eq, GFP_KERNEL); 2846c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala if (!dev->eq_tbl) 2847fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return -ENOMEM; 2848fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2849fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit for (i = 0; i < num_eq; i++) { 2850c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala status = ocrdma_create_eq(dev, &dev->eq_tbl[i], 2851fad51b7d361b4f1b439aa10fa258a35dac62b297Devesh Sharma OCRDMA_EQ_LEN); 2852fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) { 2853fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = -EINVAL; 2854fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit break; 2855fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2856c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala sprintf(dev->eq_tbl[i].irq_name, "ocrdma%d-%d", 2857fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->id, i); 2858c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala irq = ocrdma_get_irq(dev, &dev->eq_tbl[i]); 2859fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = request_irq(irq, ocrdma_irq_handler, flags, 2860c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala dev->eq_tbl[i].irq_name, 2861c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala &dev->eq_tbl[i]); 2862c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala if (status) 2863c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala goto done; 2864fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit dev->eq_cnt += 1; 2865fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit } 2866fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* one eq is sufficient for data path to work */ 2867c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala return 0; 2868c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkaladone: 2869c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala ocrdma_destroy_eqs(dev); 2870fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2871fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2872fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2873fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditint ocrdma_init_hw(struct ocrdma_dev *dev) 2874fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2875fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit int status; 2876c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala 2877c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala /* create the eqs */ 2878c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala status = ocrdma_create_eqs(dev); 2879fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2880fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto qpeq_err; 2881fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_create_mq(dev); 2882fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2883fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto mq_err; 2884fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_query_fw_config(dev); 2885fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2886fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto conf_err; 2887fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_query_dev(dev); 2888fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2889fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto conf_err; 2890fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_query_fw_ver(dev); 2891fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2892fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto conf_err; 2893fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit status = ocrdma_mbx_create_ah_tbl(dev); 2894fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit if (status) 2895fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit goto conf_err; 2896a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier status = ocrdma_mbx_get_phy_info(dev); 2897a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (status) 2898daac96815e969bd70ed5ad21231be2fc5d99506dDevesh Sharma goto info_attrb_err; 2899a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier status = ocrdma_mbx_get_ctrl_attribs(dev); 2900a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier if (status) 2901daac96815e969bd70ed5ad21231be2fc5d99506dDevesh Sharma goto info_attrb_err; 2902a51f06e1679e2abac2e8a817884e60edc18c5c86Selvin Xavier 2903fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return 0; 2904fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2905daac96815e969bd70ed5ad21231be2fc5d99506dDevesh Sharmainfo_attrb_err: 2906daac96815e969bd70ed5ad21231be2fc5d99506dDevesh Sharma ocrdma_mbx_delete_ah_tbl(dev); 2907fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditconf_err: 2908fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_destroy_mq(dev); 2909fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditmq_err: 2910c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala ocrdma_destroy_eqs(dev); 2911fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditqpeq_err: 2912ef99c4c2ed63cb0deb94ea70fb47c2d6294e302eNaresh Gottumukkala pr_err("%s() status=%d\n", __func__, status); 2913fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit return status; 2914fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2915fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2916fe2caefcdf5869f308c102e3d64d40683bfad711Parav Panditvoid ocrdma_cleanup_hw(struct ocrdma_dev *dev) 2917fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit{ 2918fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_mbx_delete_ah_tbl(dev); 2919fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2920c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala /* cleanup the eqs */ 2921c88bd03ffccdb069fd9541bea347bdab8f4e7e6aNaresh Gottumukkala ocrdma_destroy_eqs(dev); 2922fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit 2923fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit /* cleanup the control path */ 2924fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit ocrdma_destroy_mq(dev); 2925fe2caefcdf5869f308c102e3d64d40683bfad711Parav Pandit} 2926