4791 /*
4792 * If a packet was found, then queue the packet's
4793 * iocb for deferred processing
4794 */
4795 else if (sbp) {
4796 #ifdef SFCT_SUPPORT
4797 fct_cmd_t *fct_cmd;
4798 emlxs_buf_t *cmd_sbp;
4799
4800 fct_cmd = sbp->fct_cmd;
4801 if (fct_cmd) {
4802 cmd_sbp =
4803 (emlxs_buf_t *)fct_cmd->cmd_fca_private;
4804 mutex_enter(&cmd_sbp->fct_mtx);
4805 EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp,
4806 EMLXS_FCT_IOCB_COMPLETE);
4807 mutex_exit(&cmd_sbp->fct_mtx);
4808 }
4809 #endif /* SFCT_SUPPORT */
4810 cp->hbaCmplCmd_sbp++;
4811 atomic_add_32(&hba->io_active, -1);
4812
4813 /* Copy entry to sbp's iocbq */
4814 iocbq = &sbp->iocbq;
4815 BE_SWAP32_BCOPY((uint8_t *)entry,
4816 (uint8_t *)iocbq, hba->sli.sli3.iocb_rsp_size);
4817
4818 iocbq->next = NULL;
4819
4820 /*
4821 * If this is NOT a polled command completion
4822 * or a driver allocated pkt, then defer pkt
4823 * completion.
4824 */
4825 if (!(sbp->pkt_flags &
4826 (PACKET_POLLED | PACKET_ALLOCATED))) {
4827 /* Add the IOCB to the local list */
4828 if (!rsp_head) {
4829 rsp_head = iocbq;
4830 } else {
4831 rsp_tail->next = iocbq;
5201 ringno = rp->ringno;
5202 sbp = iocbq->sbp;
5203 icmd = &iocbq->iocb;
5204 port = iocbq->port;
5205
5206 HBASTATS.IocbIssued[ringno]++;
5207
5208 /* Check for ULP pkt request */
5209 if (sbp) {
5210 mutex_enter(&sbp->mtx);
5211
5212 if (sbp->node == NULL) {
5213 /* Set node to base node by default */
5214 iocbq->node = (void *)&port->node_base;
5215 sbp->node = (void *)&port->node_base;
5216 }
5217
5218 sbp->pkt_flags |= PACKET_IN_CHIPQ;
5219 mutex_exit(&sbp->mtx);
5220
5221 atomic_add_32(&hba->io_active, 1);
5222
5223 #ifdef SFCT_SUPPORT
5224 #ifdef FCT_IO_TRACE
5225 if (sbp->fct_cmd) {
5226 emlxs_fct_io_trace(port, sbp->fct_cmd,
5227 EMLXS_FCT_IOCB_ISSUED);
5228 emlxs_fct_io_trace(port, sbp->fct_cmd,
5229 icmd->ULPCOMMAND);
5230 }
5231 #endif /* FCT_IO_TRACE */
5232 #endif /* SFCT_SUPPORT */
5233
5234 rp->channelp->hbaSendCmd_sbp++;
5235 iocbq->channel = rp->channelp;
5236 } else {
5237 rp->channelp->hbaSendCmd++;
5238 }
5239
5240 /* get the next available command ring iocb */
5241 iocb =
|
4791 /*
4792 * If a packet was found, then queue the packet's
4793 * iocb for deferred processing
4794 */
4795 else if (sbp) {
4796 #ifdef SFCT_SUPPORT
4797 fct_cmd_t *fct_cmd;
4798 emlxs_buf_t *cmd_sbp;
4799
4800 fct_cmd = sbp->fct_cmd;
4801 if (fct_cmd) {
4802 cmd_sbp =
4803 (emlxs_buf_t *)fct_cmd->cmd_fca_private;
4804 mutex_enter(&cmd_sbp->fct_mtx);
4805 EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp,
4806 EMLXS_FCT_IOCB_COMPLETE);
4807 mutex_exit(&cmd_sbp->fct_mtx);
4808 }
4809 #endif /* SFCT_SUPPORT */
4810 cp->hbaCmplCmd_sbp++;
4811 atomic_dec_32(&hba->io_active);
4812
4813 /* Copy entry to sbp's iocbq */
4814 iocbq = &sbp->iocbq;
4815 BE_SWAP32_BCOPY((uint8_t *)entry,
4816 (uint8_t *)iocbq, hba->sli.sli3.iocb_rsp_size);
4817
4818 iocbq->next = NULL;
4819
4820 /*
4821 * If this is NOT a polled command completion
4822 * or a driver allocated pkt, then defer pkt
4823 * completion.
4824 */
4825 if (!(sbp->pkt_flags &
4826 (PACKET_POLLED | PACKET_ALLOCATED))) {
4827 /* Add the IOCB to the local list */
4828 if (!rsp_head) {
4829 rsp_head = iocbq;
4830 } else {
4831 rsp_tail->next = iocbq;
5201 ringno = rp->ringno;
5202 sbp = iocbq->sbp;
5203 icmd = &iocbq->iocb;
5204 port = iocbq->port;
5205
5206 HBASTATS.IocbIssued[ringno]++;
5207
5208 /* Check for ULP pkt request */
5209 if (sbp) {
5210 mutex_enter(&sbp->mtx);
5211
5212 if (sbp->node == NULL) {
5213 /* Set node to base node by default */
5214 iocbq->node = (void *)&port->node_base;
5215 sbp->node = (void *)&port->node_base;
5216 }
5217
5218 sbp->pkt_flags |= PACKET_IN_CHIPQ;
5219 mutex_exit(&sbp->mtx);
5220
5221 atomic_inc_32(&hba->io_active);
5222
5223 #ifdef SFCT_SUPPORT
5224 #ifdef FCT_IO_TRACE
5225 if (sbp->fct_cmd) {
5226 emlxs_fct_io_trace(port, sbp->fct_cmd,
5227 EMLXS_FCT_IOCB_ISSUED);
5228 emlxs_fct_io_trace(port, sbp->fct_cmd,
5229 icmd->ULPCOMMAND);
5230 }
5231 #endif /* FCT_IO_TRACE */
5232 #endif /* SFCT_SUPPORT */
5233
5234 rp->channelp->hbaSendCmd_sbp++;
5235 iocbq->channel = rp->channelp;
5236 } else {
5237 rp->channelp->hbaSendCmd++;
5238 }
5239
5240 /* get the next available command ring iocb */
5241 iocb =
|