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;
|