RE: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA adapter

2012-03-22 Thread Parav.Pandit
Inline.

 -Original Message-
 From: Hefty, Sean [mailto:sean.he...@intel.com]
 Sent: Thursday, March 22, 2012 5:50 AM
 To: Pandit, Parav; linux-rdma@vger.kernel.org
 Subject: RE: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA
 adapter

  +static inline void *ocrdma_get_eqe(struct ocrdma_eq *eq) {
  +   return (u8 *)eq-q.va + (eq-q.tail * sizeof(struct ocrdma_eqe)); }

 casts from (void *) to (u8 *) are not needed.  This occurs in multiple places.
Removed.


  +enum ib_qp_state get_ibqp_state(enum ocrdma_qp_state qps) {
  +   switch (qps) {
  +   case OCRDMA_QPS_RST:
  +   return IB_QPS_RESET;
  +   case OCRDMA_QPS_INIT:
  +   return IB_QPS_INIT;
  +   case OCRDMA_QPS_RTR:
  +   return IB_QPS_RTR;
  +   case OCRDMA_QPS_RTS:
  +   return IB_QPS_RTS;
  +   case OCRDMA_QPS_SQD:
  +   case OCRDMA_QPS_SQ_DRAINING:
  +   return IB_QPS_SQD;
  +   case OCRDMA_QPS_SQE:
  +   return IB_QPS_SQE;
  +   case OCRDMA_QPS_ERR:
  +   return IB_QPS_ERR;
  +   };
  +   return IB_QPS_ERR;
  +}
  +
  +enum ocrdma_qp_state get_ocrdma_qp_state(enum ib_qp_state qps) {
  +   switch (qps) {
  +   case IB_QPS_RESET:
  +   return OCRDMA_QPS_RST;
  +   case IB_QPS_INIT:
  +   return OCRDMA_QPS_INIT;
  +   case IB_QPS_RTR:
  +   return OCRDMA_QPS_RTR;
  +   case IB_QPS_RTS:
  +   return OCRDMA_QPS_RTS;
  +   case IB_QPS_SQD:
  +   return OCRDMA_QPS_SQD;
  +   case IB_QPS_SQE:
  +   return OCRDMA_QPS_SQE;
  +   case IB_QPS_ERR:
  +   return OCRDMA_QPS_ERR;
  +   };
  +   return OCRDMA_QPS_ERR;
  +}
  +
  +static int ocrdma_get_mbx_errno(u32 status) {
  +   int err_num = -EFAULT;

 no need to initialize, since it's set in all cases

Removed.

  +   u8 mbox_status = (status  OCRDMA_MBX_RSP_STATUS_MASK) 
  +   OCRDMA_MBX_RSP_STATUS_SHIFT;
  +   u8 add_status = (status  OCRDMA_MBX_RSP_ASTATUS_MASK) 
  +
   OCRDMA_MBX_RSP_ASTATUS_SHIFT;
  +
  +   switch (mbox_status) {
  +   case OCRDMA_MBX_STATUS_OOR:
  +   case OCRDMA_MBX_STATUS_MAX_QP_EXCEEDS:
  +   err_num = -EAGAIN;
  +   break;
  +
  +   case OCRDMA_MBX_STATUS_INVALID_PD:
  +   case OCRDMA_MBX_STATUS_INVALID_CQ:
  +   case OCRDMA_MBX_STATUS_INVALID_SRQ_ID:
  +   case OCRDMA_MBX_STATUS_INVALID_QP:
  +   case OCRDMA_MBX_STATUS_INVALID_CHANGE:
  +   case OCRDMA_MBX_STATUS_MTU_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_INVALID_RNR_NAK_TIMER:
  +   case OCRDMA_MBX_STATUS_PKEY_INDEX_INVALID:
  +   case OCRDMA_MBX_STATUS_PKEY_INDEX_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_ILLEGAL_FIELD:
  +   case OCRDMA_MBX_STATUS_INVALID_PBL_ENTRY:
  +   case OCRDMA_MBX_STATUS_INVALID_LKEY:
  +   case OCRDMA_MBX_STATUS_INVALID_VA:
  +   case OCRDMA_MBX_STATUS_INVALID_LENGTH:
  +   case OCRDMA_MBX_STATUS_INVALID_FBO:
  +   case OCRDMA_MBX_STATUS_INVALID_ACC_RIGHTS:
  +   case OCRDMA_MBX_STATUS_INVALID_PBE_SIZE:
  +   case OCRDMA_MBX_STATUS_ATOMIC_OPS_UNSUP:
  +   case OCRDMA_MBX_STATUS_SRQ_ERROR:
  +   case OCRDMA_MBX_STATUS_SRQ_SIZE_UNDERUNS:
  +   err_num = -EINVAL;
  +   break;
  +
  +   case OCRDMA_MBX_STATUS_PD_INUSE:
  +   case OCRDMA_MBX_STATUS_QP_BOUND:
  +   case OCRDMA_MBX_STATUS_MW_STILL_BOUND:
  +   case OCRDMA_MBX_STATUS_MW_BOUND:
  +   err_num = -EBUSY;
  +   break;
  +
  +   case OCRDMA_MBX_STATUS_RECVQ_RQE_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_SGE_RECV_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_RQE_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_SRQ_LIMIT_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_ORD_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_IRD_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_SENDQ_WQE_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_SGE_SEND_EXCEEDS:
  +   case OCRDMA_MBX_STATUS_SGE_WRITE_EXCEEDS:
  +   err_num = -ENOBUFS;
  +   break;
  +
  +   case OCRDMA_MBX_STATUS_FAILED:
  +   switch (add_status) {
  +   case
 OCRDMA_MBX_ADDI_STATUS_INSUFFICIENT_RESOURCES:
  +   err_num = -EAGAIN;
  +   break;
  +   }
  +   default:
  +   err_num = -EFAULT;
  +   }
  +   return err_num;
  +}
  +
  +static int ocrdma_get_mbx_cqe_errno(u16 cqe_status) {
  +   int err_num = -EINVAL;

 no need to initialize

  +   switch (cqe_status) {
  +   case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_PRIVILEDGES:
  +   err_num = -EPERM;
  +   break;
  +   case OCRDMA_MBX_CQE_STATUS_INVALID_PARAMETER:
  +   err_num = -EINVAL;
  +   break;
  +   case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_RESOURCES:
  +   case OCRDMA_MBX_CQE_STATUS_QUEUE_FLUSHING:
  +   err_num = -EAGAIN;
  +   break;
  +   case OCRDMA_MBX_CQE_STATUS_DMA_FAILED:
  +   err_num = -EIO;
  +   break;
  +   }
  +   return err_num;
  +}

  +static int ocrdma_mbx_create_eq(struct ocrdma_dev *dev, struct
  +ocrdma_eq *eq) {
  +   int status;
  +   struct ocrdma_create_eq_req *cmd = dev-mbx_cmd;
  +   struct ocrdma_create_eq_rsp *rsp = dev-mbx_cmd

Re: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA adapter

2012-03-22 Thread Roland Dreier
 Does OneConnect not support UC?  (I thought UC was required for
 compliance.)

 As of now UC is unsupported. I need to check with other teams. I'll add the 
 support in follow on checkin after this initial version, if its supported.
 Is it o.k. if UC is unsupported in this initial release?
 I read the IB spec.
 C17-11: HCAs shall be capable of supporting the Unreliable Datagram,
 Reliable Connection, and Unreliable Connection transport service on any
 QP supported by the HCA.

It's fine to merge the driver without UC support and add it later.  We're
pretty pragmatic about things if your hardware doesn't do something
(or doesn't do something yet).

 - R.
--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA adapter

2012-03-21 Thread Roland Dreier
 +int ocrdma_qp_state_machine(struct ocrdma_qp *qp, enum ib_qp_state 
 new_ib_state,
 +                           enum ib_qp_state *old_ib_state)
 +{
 +       unsigned long flags;
 +       int status = 0;
 +       enum ocrdma_qp_state new_state;
 +       new_state = get_ocrdma_qp_state(new_ib_state);
 +
 +       /* sync with wqe and rqe posting */
 +       spin_lock_irqsave(qp-q_lock, flags);
 +
 +       if (old_ib_state)
 +               *old_ib_state = get_ibqp_state(qp-state);
 +       if (new_state == qp-state) {
 +               spin_unlock_irqrestore(qp-q_lock, flags);
 +               return 1;
 +       }
 +
 +       switch (qp-state) {
 +       case OCRDMA_QPS_RST:
 +               switch (new_state) {
 +               case OCRDMA_QPS_RST:
 +               case OCRDMA_QPS_INIT:
 +                       break;
 +               default:
 +                       status = -EINVAL;
 +                       break;
 +               };
 +               break;
 +       case OCRDMA_QPS_INIT:
 +               /* qps: INIT-XXX */
 +               switch (new_state) {
 +               case OCRDMA_QPS_INIT:
 +               case OCRDMA_QPS_RTR:
 +                       break;
 +               case OCRDMA_QPS_ERR:
 +                       ocrdma_flush_qp(qp);
 +                       break;
 +               default:
 +                       status = -EINVAL;
 +                       break;
 +               };
 +               break;
 +       case OCRDMA_QPS_RTR:
 +               /* qps: RTS-XXX */
 +               switch (new_state) {
 +               case OCRDMA_QPS_RTS:
 +                       break;
 +               case OCRDMA_QPS_ERR:
 +                       ocrdma_flush_qp(qp);
 +                       break;
 +               default:
 +                       status = -EINVAL;
 +                       break;
 +               };
 +               break;
 +       case OCRDMA_QPS_RTS:
 +               /* qps: RTS-XXX */
 +               switch (new_state) {
 +               case OCRDMA_QPS_SQD:
 +               case OCRDMA_QPS_SQE:
 +                       break;
 +               case OCRDMA_QPS_ERR:
 +                       ocrdma_flush_qp(qp);
 +                       break;
 +               default:
 +                       status = -EINVAL;
 +                       break;
 +               };
 +               break;
 +       case OCRDMA_QPS_SQD:
 +               /* qps: SQD-XXX */
 +               switch (new_state) {
 +               case OCRDMA_QPS_RTS:
 +               case OCRDMA_QPS_SQE:
 +               case OCRDMA_QPS_ERR:
 +                       break;
 +               default:
 +                       status = -EINVAL;
 +                       break;
 +               };
 +               break;
 +       case OCRDMA_QPS_SQE:
 +               switch (new_state) {
 +               case OCRDMA_QPS_RTS:
 +               case OCRDMA_QPS_ERR:
 +                       break;
 +               default:
 +                       status = -EINVAL;
 +                       break;
 +               };
 +               break;
 +       case OCRDMA_QPS_ERR:
 +               /* qps: ERR-XXX */
 +               switch (new_state) {
 +               case OCRDMA_QPS_RST:
 +                       break;
 +               default:
 +                       status = -EINVAL;
 +                       break;
 +               };
 +               break;
 +       default:
 +               status = -EINVAL;
 +               break;
 +       };
 +       if (!status)
 +               qp-state = new_state;
 +
 +       spin_unlock_irqrestore(qp-q_lock, flags);
 +       return status;
 +}

The switch statement here seems to largely reimpliment ib_modify_qp_is_ok()
(which is exported from the rdma midlayer).  Is there some reason that doesn't
work for your driver?  I'd rather fix / generalize the core helper
function instead
of having something mostly duplicate in a hardware driver.


Re: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA adapter

2012-03-21 Thread frank zago
On 03/20/2012 05:39 PM, parav.pan...@emulex.com wrote:
 From: Parav Pandit parav.pan...@emulex.com

 +
 +int ocrdma_mbx_dealloc_lkey(struct ocrdma_dev *dev, int fr_mr, u32 lkey)
 +{
 + int status = -ENOMEM;
 + struct ocrdma_dealloc_lkey *cmd;
 +
 + cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_DEALLOC_LKEY, sizeof(*cmd));
 + if (!cmd)
 + return -ENOMEM;
 + cmd-lkey = lkey;
 + cmd-rsvd_frmr = fr_mr ? 1 : 0;
 + status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
 + if (status)
 + goto mbx_err;
 +mbx_err:

Missing return before the tag ? Or unnecessary goto.

 + kfree(cmd);
 + return status;
 +}

--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA adapter

2012-03-21 Thread Parav.Pandit


 -Original Message-
 From: Roland Dreier [mailto:rol...@purestorage.com]
 Sent: Wednesday, March 21, 2012 10:04 PM
 To: Pandit, Parav
 Cc: linux-rdma@vger.kernel.org; net...@vger.kernel.org
 Subject: Re: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA
 adapter
 
  +int ocrdma_qp_state_machine(struct ocrdma_qp *qp, enum ib_qp_state
  +new_ib_state,
  +                           enum ib_qp_state *old_ib_state) {
  +       unsigned long flags;
  +       int status = 0;
  +       enum ocrdma_qp_state new_state;
  +       new_state = get_ocrdma_qp_state(new_ib_state);
  +
  +       /* sync with wqe and rqe posting */
  +       spin_lock_irqsave(qp-q_lock, flags);
  +
  +       if (old_ib_state)
  +               *old_ib_state = get_ibqp_state(qp-state);
  +       if (new_state == qp-state) {
  +               spin_unlock_irqrestore(qp-q_lock, flags);
  +               return 1;
  +       }
  +
  +       switch (qp-state) {
  +       case OCRDMA_QPS_RST:
  +               switch (new_state) {
  +               case OCRDMA_QPS_RST:
  +               case OCRDMA_QPS_INIT:
  +                       break;
  +               default:
  +                       status = -EINVAL;
  +                       break;
  +               };
  +               break;
  +       case OCRDMA_QPS_INIT:
  +               /* qps: INIT-XXX */
  +               switch (new_state) {
  +               case OCRDMA_QPS_INIT:
  +               case OCRDMA_QPS_RTR:
  +                       break;
  +               case OCRDMA_QPS_ERR:
  +                       ocrdma_flush_qp(qp);
  +                       break;
  +               default:
  +                       status = -EINVAL;
  +                       break;
  +               };
  +               break;
  +       case OCRDMA_QPS_RTR:
  +               /* qps: RTS-XXX */
  +               switch (new_state) {
  +               case OCRDMA_QPS_RTS:
  +                       break;
  +               case OCRDMA_QPS_ERR:
  +                       ocrdma_flush_qp(qp);
  +                       break;
  +               default:
  +                       status = -EINVAL;
  +                       break;
  +               };
  +               break;
  +       case OCRDMA_QPS_RTS:
  +               /* qps: RTS-XXX */
  +               switch (new_state) {
  +               case OCRDMA_QPS_SQD:
  +               case OCRDMA_QPS_SQE:
  +                       break;
  +               case OCRDMA_QPS_ERR:
  +                       ocrdma_flush_qp(qp);
  +                       break;
  +               default:
  +                       status = -EINVAL;
  +                       break;
  +               };
  +               break;
  +       case OCRDMA_QPS_SQD:
  +               /* qps: SQD-XXX */
  +               switch (new_state) {
  +               case OCRDMA_QPS_RTS:
  +               case OCRDMA_QPS_SQE:
  +               case OCRDMA_QPS_ERR:
  +                       break;
  +               default:
  +                       status = -EINVAL;
  +                       break;
  +               };
  +               break;
  +       case OCRDMA_QPS_SQE:
  +               switch (new_state) {
  +               case OCRDMA_QPS_RTS:
  +               case OCRDMA_QPS_ERR:
  +                       break;
  +               default:
  +                       status = -EINVAL;
  +                       break;
  +               };
  +               break;
  +       case OCRDMA_QPS_ERR:
  +               /* qps: ERR-XXX */
  +               switch (new_state) {
  +               case OCRDMA_QPS_RST:
  +                       break;
  +               default:
  +                       status = -EINVAL;
  +                       break;
  +               };
  +               break;
  +       default:
  +               status = -EINVAL;
  +               break;
  +       };
  +       if (!status)
  +               qp-state = new_state;
  +
  +       spin_unlock_irqrestore(qp-q_lock, flags);
  +       return status;
  +}
 
 The switch statement here seems to largely reimpliment
 ib_modify_qp_is_ok() (which is exported from the rdma midlayer).  Is there
 some reason that doesn't work for your driver?  I'd rather fix / generalize 
 the
 core helper function instead of having something mostly duplicate in a
 hardware driver.
Yes. Driver needs to put QP to flush state. So that appropriate CQEs can be 
returned during poll_cq() phase.
So state machine is implemented above.

--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA adapter

2012-03-21 Thread Parav.Pandit


 -Original Message-
 From: Roland Dreier [mailto:rol...@purestorage.com]
 Sent: Thursday, March 22, 2012 1:02 AM
 To: Pandit, Parav
 Cc: linux-rdma@vger.kernel.org; net...@vger.kernel.org
 Subject: Re: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA
 adapter
 
 On Wed, Mar 21, 2012 at 12:09 PM,  parav.pan...@emulex.com wrote:
  Yes. Driver needs to put QP to flush state. So that appropriate CQEs can be
 returned during poll_cq() phase.
  So state machine is implemented above.
 
 Couldn't you just write
 
 if (ib_modify_qp_is_ok(...)) {
 if (new_state == OCRDMA_QPS_ERR)
 ocrdma_flush_qp(qp);
 } else {
 status = -EINVAL;
 }
 
 and save about 100 lines of code?
 
Yes, this can be done. This is one path.
Another path is async_event coming from adapter. So I still need 
qp_state_machine function but as you suggested, I'll remove the states and will 
have invoke flush_qp() on error.

  - R.
--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH 4/9] ocrdma: Driver for Emulex OneConnect RDMA adapter

2012-03-21 Thread Hefty, Sean
 +static inline void *ocrdma_get_eqe(struct ocrdma_eq *eq)
 +{
 + return (u8 *)eq-q.va + (eq-q.tail * sizeof(struct ocrdma_eqe));
 +}

casts from (void *) to (u8 *) are not needed.  This occurs in multiple places.

 +enum ib_qp_state get_ibqp_state(enum ocrdma_qp_state qps)
 +{
 + switch (qps) {
 + case OCRDMA_QPS_RST:
 + return IB_QPS_RESET;
 + case OCRDMA_QPS_INIT:
 + return IB_QPS_INIT;
 + case OCRDMA_QPS_RTR:
 + return IB_QPS_RTR;
 + case OCRDMA_QPS_RTS:
 + return IB_QPS_RTS;
 + case OCRDMA_QPS_SQD:
 + case OCRDMA_QPS_SQ_DRAINING:
 + return IB_QPS_SQD;
 + case OCRDMA_QPS_SQE:
 + return IB_QPS_SQE;
 + case OCRDMA_QPS_ERR:
 + return IB_QPS_ERR;
 + };
 + return IB_QPS_ERR;
 +}
 +
 +enum ocrdma_qp_state get_ocrdma_qp_state(enum ib_qp_state qps)
 +{
 + switch (qps) {
 + case IB_QPS_RESET:
 + return OCRDMA_QPS_RST;
 + case IB_QPS_INIT:
 + return OCRDMA_QPS_INIT;
 + case IB_QPS_RTR:
 + return OCRDMA_QPS_RTR;
 + case IB_QPS_RTS:
 + return OCRDMA_QPS_RTS;
 + case IB_QPS_SQD:
 + return OCRDMA_QPS_SQD;
 + case IB_QPS_SQE:
 + return OCRDMA_QPS_SQE;
 + case IB_QPS_ERR:
 + return OCRDMA_QPS_ERR;
 + };
 + return OCRDMA_QPS_ERR;
 +}
 +
 +static int ocrdma_get_mbx_errno(u32 status)
 +{
 + int err_num = -EFAULT;

no need to initialize, since it's set in all cases

 + u8 mbox_status = (status  OCRDMA_MBX_RSP_STATUS_MASK) 
 + OCRDMA_MBX_RSP_STATUS_SHIFT;
 + u8 add_status = (status  OCRDMA_MBX_RSP_ASTATUS_MASK) 
 + OCRDMA_MBX_RSP_ASTATUS_SHIFT;
 +
 + switch (mbox_status) {
 + case OCRDMA_MBX_STATUS_OOR:
 + case OCRDMA_MBX_STATUS_MAX_QP_EXCEEDS:
 + err_num = -EAGAIN;
 + break;
 +
 + case OCRDMA_MBX_STATUS_INVALID_PD:
 + case OCRDMA_MBX_STATUS_INVALID_CQ:
 + case OCRDMA_MBX_STATUS_INVALID_SRQ_ID:
 + case OCRDMA_MBX_STATUS_INVALID_QP:
 + case OCRDMA_MBX_STATUS_INVALID_CHANGE:
 + case OCRDMA_MBX_STATUS_MTU_EXCEEDS:
 + case OCRDMA_MBX_STATUS_INVALID_RNR_NAK_TIMER:
 + case OCRDMA_MBX_STATUS_PKEY_INDEX_INVALID:
 + case OCRDMA_MBX_STATUS_PKEY_INDEX_EXCEEDS:
 + case OCRDMA_MBX_STATUS_ILLEGAL_FIELD:
 + case OCRDMA_MBX_STATUS_INVALID_PBL_ENTRY:
 + case OCRDMA_MBX_STATUS_INVALID_LKEY:
 + case OCRDMA_MBX_STATUS_INVALID_VA:
 + case OCRDMA_MBX_STATUS_INVALID_LENGTH:
 + case OCRDMA_MBX_STATUS_INVALID_FBO:
 + case OCRDMA_MBX_STATUS_INVALID_ACC_RIGHTS:
 + case OCRDMA_MBX_STATUS_INVALID_PBE_SIZE:
 + case OCRDMA_MBX_STATUS_ATOMIC_OPS_UNSUP:
 + case OCRDMA_MBX_STATUS_SRQ_ERROR:
 + case OCRDMA_MBX_STATUS_SRQ_SIZE_UNDERUNS:
 + err_num = -EINVAL;
 + break;
 +
 + case OCRDMA_MBX_STATUS_PD_INUSE:
 + case OCRDMA_MBX_STATUS_QP_BOUND:
 + case OCRDMA_MBX_STATUS_MW_STILL_BOUND:
 + case OCRDMA_MBX_STATUS_MW_BOUND:
 + err_num = -EBUSY;
 + break;
 +
 + case OCRDMA_MBX_STATUS_RECVQ_RQE_EXCEEDS:
 + case OCRDMA_MBX_STATUS_SGE_RECV_EXCEEDS:
 + case OCRDMA_MBX_STATUS_RQE_EXCEEDS:
 + case OCRDMA_MBX_STATUS_SRQ_LIMIT_EXCEEDS:
 + case OCRDMA_MBX_STATUS_ORD_EXCEEDS:
 + case OCRDMA_MBX_STATUS_IRD_EXCEEDS:
 + case OCRDMA_MBX_STATUS_SENDQ_WQE_EXCEEDS:
 + case OCRDMA_MBX_STATUS_SGE_SEND_EXCEEDS:
 + case OCRDMA_MBX_STATUS_SGE_WRITE_EXCEEDS:
 + err_num = -ENOBUFS;
 + break;
 +
 + case OCRDMA_MBX_STATUS_FAILED:
 + switch (add_status) {
 + case OCRDMA_MBX_ADDI_STATUS_INSUFFICIENT_RESOURCES:
 + err_num = -EAGAIN;
 + break;
 + }
 + default:
 + err_num = -EFAULT;
 + }
 + return err_num;
 +}
 +
 +static int ocrdma_get_mbx_cqe_errno(u16 cqe_status)
 +{
 + int err_num = -EINVAL;

no need to initialize

 + switch (cqe_status) {
 + case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_PRIVILEDGES:
 + err_num = -EPERM;
 + break;
 + case OCRDMA_MBX_CQE_STATUS_INVALID_PARAMETER:
 + err_num = -EINVAL;
 + break;
 + case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_RESOURCES:
 + case OCRDMA_MBX_CQE_STATUS_QUEUE_FLUSHING:
 + err_num = -EAGAIN;
 + break;
 + case OCRDMA_MBX_CQE_STATUS_DMA_FAILED:
 + err_num = -EIO;
 + break;
 + }
 + return err_num;
 +}

 +static int ocrdma_mbx_create_eq(struct ocrdma_dev *dev, struct ocrdma_eq *eq)
 +{
 + int status;
 + struct ocrdma_create_eq_req *cmd = dev-mbx_cmd;
 + struct ocrdma_create_eq_rsp *rsp = dev-mbx_cmd;
 +
 + memset(cmd, 0, sizeof(*cmd));
 + ocrdma_init_mch(cmd-req, OCRDMA_CMD_CREATE_EQ, OCRDMA_SUBSYS_COMMON,
 +