Print this page
5253 kmem_alloc/kmem_zalloc won't fail with KM_SLEEP
5254 getrbuf won't fail with KM_SLEEP


1260  *      delay:  seconds.
1261  *
1262  * Returns:
1263  *      ql local function return status code.
1264  *
1265  * Context:
1266  *      Kernel context
1267  */
1268 static int
1269 ql_task_mgmt_iocb(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t lun,
1270     uint32_t flags, uint16_t delay)
1271 {
1272         ql_mbx_iocb_t   *pkt;
1273         int             rval;
1274         uint32_t        pkt_size;
1275 
1276         QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
1277 
1278         pkt_size = sizeof (ql_mbx_iocb_t);
1279         pkt = kmem_zalloc(pkt_size, KM_SLEEP);
1280         if (pkt == NULL) {
1281                 EL(ha, "failed, kmem_zalloc\n");
1282                 return (QL_MEMORY_ALLOC_FAILED);
1283         }
1284 
1285         pkt->mgmt.entry_type = TASK_MGMT_TYPE;
1286         pkt->mgmt.entry_count = 1;
1287 
1288         pkt->mgmt.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
1289         pkt->mgmt.delay = (uint16_t)LE_16(delay);
1290         pkt->mgmt.timeout = LE_16(MAILBOX_TOV);
1291         pkt->mgmt.fcp_lun[2] = LSB(lun);
1292         pkt->mgmt.fcp_lun[3] = MSB(lun);
1293         pkt->mgmt.control_flags = LE_32(flags);
1294         pkt->mgmt.target_id[0] = tq->d_id.b.al_pa;
1295         pkt->mgmt.target_id[1] = tq->d_id.b.area;
1296         pkt->mgmt.target_id[2] = tq->d_id.b.domain;
1297         pkt->mgmt.vp_index = ha->vp_index;
1298 
1299         rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
1300         if (rval == QL_SUCCESS && (pkt->sts24.entry_status & 0x3c) != 0) {
1301                 EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
1302                     pkt->sts24.entry_status, tq->d_id.b24);
1303                 rval = QL_FUNCTION_PARAMETER_ERROR;


1630  *      mr:             pointer for mailbox data.
1631  *
1632  * Returns:
1633  *      ql local function return status code.
1634  *
1635  * Context:
1636  *      Kernel context.
1637  */
1638 int
1639 ql_log_iocb(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t loop_id,
1640     uint16_t flags, ql_mbx_data_t *mr)
1641 {
1642         ql_mbx_iocb_t   *pkt;
1643         int             rval;
1644         uint32_t        pkt_size;
1645 
1646         QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
1647 
1648         pkt_size = sizeof (ql_mbx_iocb_t);
1649         pkt = kmem_zalloc(pkt_size, KM_SLEEP);
1650         if (pkt == NULL) {
1651                 EL(ha, "failed, kmem_zalloc\n");
1652                 return (QL_MEMORY_ALLOC_FAILED);
1653         }
1654 
1655         pkt->log.entry_type = LOG_TYPE;
1656         pkt->log.entry_count = 1;
1657         pkt->log.n_port_hdl = (uint16_t)LE_16(loop_id);
1658         pkt->log.control_flags = (uint16_t)LE_16(flags);
1659         pkt->log.port_id[0] = tq->d_id.b.al_pa;
1660         pkt->log.port_id[1] = tq->d_id.b.area;
1661         pkt->log.port_id[2] = tq->d_id.b.domain;
1662         pkt->log.vp_index = ha->vp_index;
1663 
1664         rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
1665         if (rval == QL_SUCCESS && (pkt->log.entry_status & 0x3c) != 0) {
1666                 EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
1667                     pkt->log.entry_status, tq->d_id.b24);
1668                 rval = QL_FUNCTION_PARAMETER_ERROR;
1669         }
1670 
1671         if (rval == QL_SUCCESS) {
1672                 if (pkt->log.rsp_size == 0xB) {
1673                         LITTLE_ENDIAN_32(&pkt->log.io_param[5]);


2678  *      sp:     SRB structure pointer.
2679  *
2680  * Returns:
2681  *      ql local function return status code.
2682  *
2683  * Context:
2684  *      Interrupt or Kernel context, no mailbox commands allowed.
2685  */
2686 static int
2687 ql_abort_cmd_iocb(ql_adapter_state_t *ha, ql_srb_t *sp)
2688 {
2689         ql_mbx_iocb_t   *pkt;
2690         int             rval;
2691         uint32_t        pkt_size;
2692         uint16_t        comp_status;
2693         ql_tgt_t        *tq = sp->lun_queue->target_queue;
2694 
2695         QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
2696 
2697         pkt_size = sizeof (ql_mbx_iocb_t);
2698         if ((pkt = kmem_zalloc(pkt_size, KM_SLEEP)) == NULL) {
2699                 EL(ha, "failed, kmem_zalloc\n");
2700                 return (QL_MEMORY_ALLOC_FAILED);
2701         }
2702 
2703         pkt->abo.entry_type = ABORT_CMD_TYPE;
2704         pkt->abo.entry_count = 1;
2705         pkt->abo.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
2706         if (!CFG_IST(ha, CFG_CTRL_8021)) {
2707                 pkt->abo.options = AF_NO_ABTS;
2708         }
2709         pkt->abo.cmd_handle = LE_32(sp->handle);
2710         pkt->abo.target_id[0] = tq->d_id.b.al_pa;
2711         pkt->abo.target_id[1] = tq->d_id.b.area;
2712         pkt->abo.target_id[2] = tq->d_id.b.domain;
2713         pkt->abo.vp_index = ha->vp_index;
2714 
2715         rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
2716 
2717         if (rval == QL_SUCCESS) {
2718                 if ((pkt->abo.entry_status  & 0x3c) != 0) {
2719                         EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
2720                             pkt->abo.entry_status, tq->d_id.b24);
2721                         rval = QL_FUNCTION_PARAMETER_ERROR;




1260  *      delay:  seconds.
1261  *
1262  * Returns:
1263  *      ql local function return status code.
1264  *
1265  * Context:
1266  *      Kernel context
1267  */
1268 static int
1269 ql_task_mgmt_iocb(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t lun,
1270     uint32_t flags, uint16_t delay)
1271 {
1272         ql_mbx_iocb_t   *pkt;
1273         int             rval;
1274         uint32_t        pkt_size;
1275 
1276         QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
1277 
1278         pkt_size = sizeof (ql_mbx_iocb_t);
1279         pkt = kmem_zalloc(pkt_size, KM_SLEEP);




1280 
1281         pkt->mgmt.entry_type = TASK_MGMT_TYPE;
1282         pkt->mgmt.entry_count = 1;
1283 
1284         pkt->mgmt.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
1285         pkt->mgmt.delay = (uint16_t)LE_16(delay);
1286         pkt->mgmt.timeout = LE_16(MAILBOX_TOV);
1287         pkt->mgmt.fcp_lun[2] = LSB(lun);
1288         pkt->mgmt.fcp_lun[3] = MSB(lun);
1289         pkt->mgmt.control_flags = LE_32(flags);
1290         pkt->mgmt.target_id[0] = tq->d_id.b.al_pa;
1291         pkt->mgmt.target_id[1] = tq->d_id.b.area;
1292         pkt->mgmt.target_id[2] = tq->d_id.b.domain;
1293         pkt->mgmt.vp_index = ha->vp_index;
1294 
1295         rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
1296         if (rval == QL_SUCCESS && (pkt->sts24.entry_status & 0x3c) != 0) {
1297                 EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
1298                     pkt->sts24.entry_status, tq->d_id.b24);
1299                 rval = QL_FUNCTION_PARAMETER_ERROR;


1626  *      mr:             pointer for mailbox data.
1627  *
1628  * Returns:
1629  *      ql local function return status code.
1630  *
1631  * Context:
1632  *      Kernel context.
1633  */
1634 int
1635 ql_log_iocb(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t loop_id,
1636     uint16_t flags, ql_mbx_data_t *mr)
1637 {
1638         ql_mbx_iocb_t   *pkt;
1639         int             rval;
1640         uint32_t        pkt_size;
1641 
1642         QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
1643 
1644         pkt_size = sizeof (ql_mbx_iocb_t);
1645         pkt = kmem_zalloc(pkt_size, KM_SLEEP);




1646 
1647         pkt->log.entry_type = LOG_TYPE;
1648         pkt->log.entry_count = 1;
1649         pkt->log.n_port_hdl = (uint16_t)LE_16(loop_id);
1650         pkt->log.control_flags = (uint16_t)LE_16(flags);
1651         pkt->log.port_id[0] = tq->d_id.b.al_pa;
1652         pkt->log.port_id[1] = tq->d_id.b.area;
1653         pkt->log.port_id[2] = tq->d_id.b.domain;
1654         pkt->log.vp_index = ha->vp_index;
1655 
1656         rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
1657         if (rval == QL_SUCCESS && (pkt->log.entry_status & 0x3c) != 0) {
1658                 EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
1659                     pkt->log.entry_status, tq->d_id.b24);
1660                 rval = QL_FUNCTION_PARAMETER_ERROR;
1661         }
1662 
1663         if (rval == QL_SUCCESS) {
1664                 if (pkt->log.rsp_size == 0xB) {
1665                         LITTLE_ENDIAN_32(&pkt->log.io_param[5]);


2670  *      sp:     SRB structure pointer.
2671  *
2672  * Returns:
2673  *      ql local function return status code.
2674  *
2675  * Context:
2676  *      Interrupt or Kernel context, no mailbox commands allowed.
2677  */
2678 static int
2679 ql_abort_cmd_iocb(ql_adapter_state_t *ha, ql_srb_t *sp)
2680 {
2681         ql_mbx_iocb_t   *pkt;
2682         int             rval;
2683         uint32_t        pkt_size;
2684         uint16_t        comp_status;
2685         ql_tgt_t        *tq = sp->lun_queue->target_queue;
2686 
2687         QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
2688 
2689         pkt_size = sizeof (ql_mbx_iocb_t);
2690         pkt = kmem_zalloc(pkt_size, KM_SLEEP);



2691 
2692         pkt->abo.entry_type = ABORT_CMD_TYPE;
2693         pkt->abo.entry_count = 1;
2694         pkt->abo.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
2695         if (!CFG_IST(ha, CFG_CTRL_8021)) {
2696                 pkt->abo.options = AF_NO_ABTS;
2697         }
2698         pkt->abo.cmd_handle = LE_32(sp->handle);
2699         pkt->abo.target_id[0] = tq->d_id.b.al_pa;
2700         pkt->abo.target_id[1] = tq->d_id.b.area;
2701         pkt->abo.target_id[2] = tq->d_id.b.domain;
2702         pkt->abo.vp_index = ha->vp_index;
2703 
2704         rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
2705 
2706         if (rval == QL_SUCCESS) {
2707                 if ((pkt->abo.entry_status  & 0x3c) != 0) {
2708                         EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
2709                             pkt->abo.entry_status, tq->d_id.b24);
2710                         rval = QL_FUNCTION_PARAMETER_ERROR;