Lines Matching defs:ioim
211 static bfa_boolean_t bfa_ioim_send_ioreq(struct bfa_ioim_s *ioim);
212 static bfa_boolean_t bfa_ioim_sgpg_alloc(struct bfa_ioim_s *ioim);
213 static bfa_boolean_t bfa_ioim_send_abort(struct bfa_ioim_s *ioim);
214 static void bfa_ioim_notify_cleanup(struct bfa_ioim_s *ioim);
220 static bfa_boolean_t bfa_ioim_is_abortable(struct bfa_ioim_s *ioim);
225 static void bfa_ioim_sm_uninit(struct bfa_ioim_s *ioim,
227 static void bfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim,
229 static void bfa_ioim_sm_active(struct bfa_ioim_s *ioim,
231 static void bfa_ioim_sm_abort(struct bfa_ioim_s *ioim,
233 static void bfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim,
235 static void bfa_ioim_sm_qfull(struct bfa_ioim_s *ioim,
237 static void bfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim,
239 static void bfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim,
241 static void bfa_ioim_sm_hcb(struct bfa_ioim_s *ioim,
243 static void bfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim,
245 static void bfa_ioim_sm_resfree(struct bfa_ioim_s *ioim,
247 static void bfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim,
340 /* Enqueue unused ioim resources to free_q */
440 bfa_ioim_profile_comp(struct bfa_ioim_s *ioim)
443 &(ioim->itnim->ioprofile.io_latency);
446 val = (u32)(jiffies - ioim->start_time);
447 idx = bfa_ioim_get_index(scsi_bufflen((struct scsi_cmnd *)ioim->dio));
448 bfa_itnim_ioprofile_update(ioim->itnim, idx);
457 bfa_ioim_profile_start(struct bfa_ioim_s *ioim)
459 ioim->start_time = jiffies;
968 struct bfa_ioim_s *ioim;
977 ioim = (struct bfa_ioim_s *) qe;
978 bfa_ioim_iocdisable(ioim);
985 ioim = (struct bfa_ioim_s *) qe;
986 bfa_ioim_tov(ioim);
990 ioim = (struct bfa_ioim_s *) qe;
991 bfa_ioim_iocdisable(ioim);
1013 struct bfa_ioim_s *ioim;
1020 ioim = (struct bfa_ioim_s *) qe;
1026 list_del(&ioim->qe);
1027 list_add_tail(&ioim->qe, &itnim->io_cleanup_q);
1030 bfa_ioim_cleanup(ioim);
1210 struct bfa_ioim_s *ioim;
1214 ioim = (struct bfa_ioim_s *)qe;
1215 bfa_ioim_delayed_comp(ioim, iotov);
1225 struct bfa_ioim_s *ioim;
1238 bfa_q_deq(&itnim->pending_q, &ioim);
1239 list_add_tail(&ioim->qe, &itnim->io_q);
1240 bfa_ioim_start(ioim);
1250 struct bfa_ioim_s *ioim;
1261 bfa_q_deq(&itnim->pending_q, &ioim);
1262 list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
1263 bfa_ioim_tov(ioim);
1505 bfa_ioim_sm_uninit(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1509 if (!bfa_itnim_is_online(ioim->itnim)) {
1510 if (!bfa_itnim_hold_io(ioim->itnim)) {
1511 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1512 list_del(&ioim->qe);
1513 list_add_tail(&ioim->qe,
1514 &ioim->fcpim->ioim_comp_q);
1515 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1516 __bfa_cb_ioim_pathtov, ioim);
1518 list_del(&ioim->qe);
1519 list_add_tail(&ioim->qe,
1520 &ioim->itnim->pending_q);
1525 if (ioim->nsges > BFI_SGE_INLINE) {
1526 if (!bfa_ioim_sgpg_alloc(ioim)) {
1527 bfa_sm_set_state(ioim, bfa_ioim_sm_sgalloc);
1532 if (!bfa_ioim_send_ioreq(ioim)) {
1533 bfa_sm_set_state(ioim, bfa_ioim_sm_qfull);
1537 bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1541 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1542 bfa_ioim_move_to_comp_q(ioim);
1543 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1544 __bfa_cb_ioim_pathtov, ioim);
1552 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1553 WARN_ON(!bfa_q_is_on_q(&ioim->itnim->pending_q, ioim));
1554 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1555 __bfa_cb_ioim_abort, ioim);
1559 bfa_sm_fault(ioim->bfa, event);
1567 bfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1569 bfa_trc(ioim->bfa, ioim->iotag);
1570 bfa_trc(ioim->bfa, event);
1574 if (!bfa_ioim_send_ioreq(ioim)) {
1575 bfa_sm_set_state(ioim, bfa_ioim_sm_qfull);
1578 bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1582 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1583 bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe);
1584 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1585 ioim);
1586 bfa_ioim_notify_cleanup(ioim);
1590 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1591 bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe);
1592 bfa_ioim_move_to_comp_q(ioim);
1593 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1594 ioim);
1598 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1599 bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe);
1600 bfa_ioim_move_to_comp_q(ioim);
1601 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1602 ioim);
1606 bfa_sm_fault(ioim->bfa, event);
1614 bfa_ioim_sm_active(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1618 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1619 bfa_ioim_move_to_comp_q(ioim);
1620 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1621 __bfa_cb_ioim_good_comp, ioim);
1625 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1626 bfa_ioim_move_to_comp_q(ioim);
1627 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_comp,
1628 ioim);
1632 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1633 bfa_ioim_move_to_comp_q(ioim);
1634 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_comp,
1635 ioim);
1639 ioim->iosp->abort_explicit = BFA_TRUE;
1640 ioim->io_cbfn = __bfa_cb_ioim_abort;
1642 if (bfa_ioim_send_abort(ioim))
1643 bfa_sm_set_state(ioim, bfa_ioim_sm_abort);
1645 bfa_sm_set_state(ioim, bfa_ioim_sm_abort_qfull);
1646 bfa_stats(ioim->itnim, qwait);
1647 bfa_reqq_wait(ioim->bfa, ioim->reqq,
1648 &ioim->iosp->reqq_wait);
1653 ioim->iosp->abort_explicit = BFA_FALSE;
1654 ioim->io_cbfn = __bfa_cb_ioim_failed;
1656 if (bfa_ioim_send_abort(ioim))
1657 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1659 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1660 bfa_stats(ioim->itnim, qwait);
1661 bfa_reqq_wait(ioim->bfa, ioim->reqq,
1662 &ioim->iosp->reqq_wait);
1667 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1668 bfa_ioim_move_to_comp_q(ioim);
1669 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1670 ioim);
1674 if (bfa_ioim_maxretry_reached(ioim)) {
1676 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1677 bfa_ioim_move_to_comp_q(ioim);
1678 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1679 __bfa_cb_ioim_failed, ioim);
1683 bfa_sm_set_state(ioim, bfa_ioim_sm_cmnd_retry);
1687 bfa_sm_fault(ioim->bfa, event);
1695 bfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1700 bfa_ioim_update_iotag(ioim);
1701 if (!bfa_ioim_send_ioreq(ioim)) {
1702 bfa_sm_set_state(ioim, bfa_ioim_sm_qfull);
1705 bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1709 ioim->iosp->abort_explicit = BFA_FALSE;
1710 ioim->io_cbfn = __bfa_cb_ioim_failed;
1712 if (bfa_ioim_send_abort(ioim))
1713 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1715 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1716 bfa_stats(ioim->itnim, qwait);
1717 bfa_reqq_wait(ioim->bfa, ioim->reqq,
1718 &ioim->iosp->reqq_wait);
1723 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1724 bfa_ioim_move_to_comp_q(ioim);
1725 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1726 __bfa_cb_ioim_failed, ioim);
1733 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1734 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1735 ioim);
1739 bfa_sm_fault(ioim->bfa, event);
1747 bfa_ioim_sm_abort(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1749 bfa_trc(ioim->bfa, ioim->iotag);
1750 bfa_trc(ioim->bfa, event);
1760 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1761 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1762 ioim);
1766 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1767 bfa_ioim_move_to_comp_q(ioim);
1768 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1769 ioim);
1773 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1774 bfa_ioim_move_to_comp_q(ioim);
1775 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1776 ioim);
1780 WARN_ON(ioim->iosp->abort_explicit != BFA_TRUE);
1781 ioim->iosp->abort_explicit = BFA_FALSE;
1783 if (bfa_ioim_send_abort(ioim))
1784 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1786 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1787 bfa_stats(ioim->itnim, qwait);
1788 bfa_reqq_wait(ioim->bfa, ioim->reqq,
1789 &ioim->iosp->reqq_wait);
1794 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1795 bfa_ioim_move_to_comp_q(ioim);
1796 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1797 ioim);
1801 bfa_sm_fault(ioim->bfa, event);
1810 bfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1812 bfa_trc(ioim->bfa, ioim->iotag);
1813 bfa_trc(ioim->bfa, event);
1826 ioim->io_cbfn = __bfa_cb_ioim_abort;
1830 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1831 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1832 bfa_ioim_notify_cleanup(ioim);
1836 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1837 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1838 bfa_ioim_notify_cleanup(ioim);
1842 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1843 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1844 bfa_ioim_notify_cleanup(ioim);
1848 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1849 bfa_ioim_move_to_comp_q(ioim);
1850 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1851 ioim);
1862 bfa_sm_fault(ioim->bfa, event);
1870 bfa_ioim_sm_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1872 bfa_trc(ioim->bfa, ioim->iotag);
1873 bfa_trc(ioim->bfa, event);
1877 bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1878 bfa_ioim_send_ioreq(ioim);
1882 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1883 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1884 bfa_ioim_move_to_comp_q(ioim);
1885 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1886 ioim);
1890 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1891 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1892 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1893 ioim);
1894 bfa_ioim_notify_cleanup(ioim);
1898 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1899 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1900 bfa_ioim_move_to_comp_q(ioim);
1901 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1902 ioim);
1906 bfa_sm_fault(ioim->bfa, event);
1914 bfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1916 bfa_trc(ioim->bfa, ioim->iotag);
1917 bfa_trc(ioim->bfa, event);
1921 bfa_sm_set_state(ioim, bfa_ioim_sm_abort);
1922 bfa_ioim_send_abort(ioim);
1926 WARN_ON(ioim->iosp->abort_explicit != BFA_TRUE);
1927 ioim->iosp->abort_explicit = BFA_FALSE;
1928 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1933 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1934 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1935 bfa_ioim_move_to_comp_q(ioim);
1936 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1937 ioim);
1941 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1942 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1943 bfa_ioim_move_to_comp_q(ioim);
1944 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1945 ioim);
1949 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1950 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1951 bfa_ioim_move_to_comp_q(ioim);
1952 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1953 ioim);
1957 bfa_sm_fault(ioim->bfa, event);
1965 bfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1967 bfa_trc(ioim->bfa, ioim->iotag);
1968 bfa_trc(ioim->bfa, event);
1972 bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1973 bfa_ioim_send_abort(ioim);
1980 ioim->io_cbfn = __bfa_cb_ioim_abort;
1985 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1986 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1987 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1988 bfa_ioim_notify_cleanup(ioim);
1992 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1993 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1994 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1995 bfa_ioim_notify_cleanup(ioim);
1999 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
2000 bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
2001 bfa_ioim_move_to_comp_q(ioim);
2002 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
2003 ioim);
2007 bfa_sm_fault(ioim->bfa, event);
2015 bfa_ioim_sm_hcb(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
2019 bfa_sm_set_state(ioim, bfa_ioim_sm_uninit);
2020 bfa_ioim_free(ioim);
2024 bfa_ioim_notify_cleanup(ioim);
2031 bfa_sm_fault(ioim->bfa, event);
2039 bfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
2041 bfa_trc(ioim->bfa, ioim->iotag);
2042 bfa_trc(ioim->bfa, event);
2046 bfa_sm_set_state(ioim, bfa_ioim_sm_resfree);
2047 list_del(&ioim->qe);
2048 list_add_tail(&ioim->qe, &ioim->fcpim->ioim_resfree_q);
2052 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
2056 bfa_ioim_notify_cleanup(ioim);
2060 bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
2064 bfa_sm_fault(ioim->bfa, event);
2072 bfa_ioim_sm_resfree(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
2074 bfa_trc(ioim->bfa, ioim->iotag);
2075 bfa_trc(ioim->bfa, event);
2079 bfa_sm_set_state(ioim, bfa_ioim_sm_uninit);
2080 bfa_ioim_free(ioim);
2084 bfa_ioim_notify_cleanup(ioim);
2091 bfa_sm_fault(ioim->bfa, event);
2120 struct bfa_ioim_s *ioim = cbarg;
2123 bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2127 bfa_cb_ioim_good_comp(ioim->bfa->bfad, ioim->dio);
2133 struct bfa_ioim_s *ioim = cbarg;
2140 bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2144 m = (struct bfi_ioim_rsp_s *) &ioim->iosp->comp_rspmsg;
2152 snsinfo = BFA_SNSINFO_FROM_TAG(ioim->fcpim->fcp,
2153 ioim->iotag);
2161 bfa_stats(ioim->itnim, iocomp_underrun);
2166 bfa_stats(ioim->itnim, iocomp_overrun);
2170 bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, m->io_status,
2389 struct bfa_ioim_s *ioim = cbarg;
2392 bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2396 bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, BFI_IOIM_STS_ABORTED,
2403 struct bfa_ioim_s *ioim = cbarg;
2405 bfa_stats(ioim->itnim, path_tov_expired);
2407 bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2411 bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, BFI_IOIM_STS_PATHTOV,
2418 struct bfa_ioim_s *ioim = cbarg;
2421 bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2425 bfa_cb_ioim_abort(ioim->bfa->bfad, ioim->dio);
2431 struct bfa_ioim_s *ioim = cbarg;
2433 ioim->nsgpgs = BFA_SGPG_NPAGE(ioim->nsges);
2434 list_splice_tail_init(&ioim->iosp->sgpg_wqe.sgpg_q, &ioim->sgpg_q);
2435 ioim->sgpg = bfa_q_first(&ioim->sgpg_q);
2436 bfa_sm_send_event(ioim, BFA_IOIM_SM_SGALLOCED);
2443 bfa_ioim_send_ioreq(struct bfa_ioim_s *ioim)
2445 struct bfa_itnim_s *itnim = ioim->itnim;
2454 struct scsi_cmnd *cmnd = (struct scsi_cmnd *) ioim->dio;
2461 m = bfa_reqq_next(ioim->bfa, ioim->reqq);
2463 bfa_stats(ioim->itnim, qwait);
2464 bfa_reqq_wait(ioim->bfa, ioim->reqq,
2465 &ioim->iosp->reqq_wait);
2472 m->io_tag = cpu_to_be16(ioim->iotag);
2473 m->rport_hdl = ioim->itnim->rport->fw_handle;
2477 sgpg = ioim->sgpg;
2481 scsi_for_each_sg(cmnd, sg, ioim->nsges, i) {
2488 sge->flags = (ioim->nsges > BFI_SGE_INLINE) ?
2502 if (i < (ioim->nsges - 1) &&
2505 else if (i < (ioim->nsges - 1))
2513 if (i == (ioim->nsges - 1)) {
2531 if (ioim->nsges > BFI_SGE_INLINE) {
2532 sge->sga = ioim->sgpg->sgpg_pa;
2563 bfi_h2i_set(m->mh, BFI_MC_IOIM_READ, 0, bfa_fn_lpu(ioim->bfa));
2565 ioim->itnim->stats.rd_throughput += fcp_dl;
2568 bfi_h2i_set(m->mh, BFI_MC_IOIM_WRITE, 0, bfa_fn_lpu(ioim->bfa));
2570 ioim->itnim->stats.wr_throughput += fcp_dl;
2577 bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_fn_lpu(ioim->bfa));
2581 bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_fn_lpu(ioim->bfa));
2586 bfa_reqq_produce(ioim->bfa, ioim->reqq, m->mh);
2595 bfa_ioim_sgpg_alloc(struct bfa_ioim_s *ioim)
2599 WARN_ON(ioim->nsges <= BFI_SGE_INLINE);
2604 nsgpgs = BFA_SGPG_NPAGE(ioim->nsges);
2608 if (bfa_sgpg_malloc(ioim->bfa, &ioim->sgpg_q, nsgpgs)
2610 bfa_sgpg_wait(ioim->bfa, &ioim->iosp->sgpg_wqe, nsgpgs);
2614 ioim->nsgpgs = nsgpgs;
2615 ioim->sgpg = bfa_q_first(&ioim->sgpg_q);
2624 bfa_ioim_send_abort(struct bfa_ioim_s *ioim)
2632 m = bfa_reqq_next(ioim->bfa, ioim->reqq);
2639 if (ioim->iosp->abort_explicit)
2644 bfi_h2i_set(m->mh, BFI_MC_IOIM, msgop, bfa_fn_lpu(ioim->bfa));
2645 m->io_tag = cpu_to_be16(ioim->iotag);
2646 m->abort_tag = ++ioim->abort_tag;
2651 bfa_reqq_produce(ioim->bfa, ioim->reqq, m->mh);
2661 struct bfa_ioim_s *ioim = cbarg;
2663 bfa_stats(ioim->itnim, qresumes);
2664 bfa_sm_send_event(ioim, BFA_IOIM_SM_QRESUME);
2669 bfa_ioim_notify_cleanup(struct bfa_ioim_s *ioim)
2675 list_del(&ioim->qe);
2676 list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
2678 if (!ioim->iosp->tskim) {
2679 if (ioim->fcpim->delay_comp && ioim->itnim->iotov_active) {
2680 bfa_cb_dequeue(&ioim->hcb_qe);
2681 list_del(&ioim->qe);
2682 list_add_tail(&ioim->qe, &ioim->itnim->delay_comp_q);
2684 bfa_itnim_iodone(ioim->itnim);
2686 bfa_wc_down(&ioim->iosp->tskim->wc);
2690 bfa_ioim_is_abortable(struct bfa_ioim_s *ioim)
2692 if ((bfa_sm_cmp_state(ioim, bfa_ioim_sm_uninit) &&
2693 (!bfa_q_is_on_q(&ioim->itnim->pending_q, ioim))) ||
2694 (bfa_sm_cmp_state(ioim, bfa_ioim_sm_abort)) ||
2695 (bfa_sm_cmp_state(ioim, bfa_ioim_sm_abort_qfull)) ||
2696 (bfa_sm_cmp_state(ioim, bfa_ioim_sm_hcb)) ||
2697 (bfa_sm_cmp_state(ioim, bfa_ioim_sm_hcb_free)) ||
2698 (bfa_sm_cmp_state(ioim, bfa_ioim_sm_resfree)))
2705 bfa_ioim_delayed_comp(struct bfa_ioim_s *ioim, bfa_boolean_t iotov)
2715 ioim->io_cbfn = __bfa_cb_ioim_pathtov;
2717 ioim->io_cbfn = __bfa_cb_ioim_failed;
2718 bfa_stats(ioim->itnim, iocom_nexus_abort);
2720 bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
2726 list_del(&ioim->qe);
2727 list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
2737 struct bfa_ioim_s *ioim;
2745 ioim = (struct bfa_ioim_s *) bfa_mem_kva_curp(fcp);
2746 fcpim->ioim_arr = ioim;
2747 bfa_mem_kva_curp(fcp) = (u8 *) (ioim + fcpim->fcp->num_ioim_reqs);
2754 * Initialize ioim free queues
2760 i++, ioim++, iosp++) {
2764 memset(ioim, 0, sizeof(struct bfa_ioim_s));
2765 ioim->iotag = i;
2766 ioim->bfa = fcpim->bfa;
2767 ioim->fcpim = fcpim;
2768 ioim->iosp = iosp;
2769 INIT_LIST_HEAD(&ioim->sgpg_q);
2770 bfa_reqq_winit(&ioim->iosp->reqq_wait,
2771 bfa_ioim_qresume, ioim);
2772 bfa_sgpg_winit(&ioim->iosp->sgpg_wqe,
2773 bfa_ioim_sgpg_alloced, ioim);
2774 bfa_sm_set_state(ioim, bfa_ioim_sm_uninit);
2783 struct bfa_ioim_s *ioim;
2789 ioim = BFA_IOIM_FROM_TAG(fcpim, iotag);
2790 WARN_ON(ioim->iotag != iotag);
2792 bfa_trc(ioim->bfa, ioim->iotag);
2793 bfa_trc(ioim->bfa, rsp->io_status);
2794 bfa_trc(ioim->bfa, rsp->reuse_io_tag);
2796 if (bfa_sm_cmp_state(ioim, bfa_ioim_sm_active))
2797 ioim->iosp->comp_rspmsg = *m;
2801 bfa_stats(ioim->itnim, iocomp_ok);
2809 bfa_stats(ioim->itnim, iocomp_timedout);
2813 bfa_stats(ioim->itnim, iocomp_aborted);
2821 bfa_stats(ioim->itnim, iocom_proto_err);
2827 bfa_stats(ioim->itnim, iocom_sqer_needed);
2833 bfa_stats(ioim->itnim, iocom_res_free);
2838 bfa_stats(ioim->itnim, iocom_hostabrts);
2839 if (rsp->abort_tag != ioim->abort_tag) {
2840 bfa_trc(ioim->bfa, rsp->abort_tag);
2841 bfa_trc(ioim->bfa, ioim->abort_tag);
2852 bfa_stats(ioim->itnim, iocom_utags);
2860 bfa_sm_send_event(ioim, evt);
2868 struct bfa_ioim_s *ioim;
2873 ioim = BFA_IOIM_FROM_TAG(fcpim, iotag);
2874 WARN_ON(ioim->iotag != iotag);
2876 bfa_ioim_cb_profile_comp(fcpim, ioim);
2878 bfa_sm_send_event(ioim, BFA_IOIM_SM_COMP_GOOD);
2885 bfa_ioim_cleanup(struct bfa_ioim_s *ioim)
2887 bfa_trc(ioim->bfa, ioim->iotag);
2888 bfa_stats(ioim->itnim, io_cleanups);
2890 ioim->iosp->tskim = NULL;
2891 bfa_sm_send_event(ioim, BFA_IOIM_SM_CLEANUP);
2895 bfa_ioim_cleanup_tm(struct bfa_ioim_s *ioim, struct bfa_tskim_s *tskim)
2897 bfa_trc(ioim->bfa, ioim->iotag);
2898 bfa_stats(ioim->itnim, io_tmaborts);
2900 ioim->iosp->tskim = tskim;
2901 bfa_sm_send_event(ioim, BFA_IOIM_SM_CLEANUP);
2908 bfa_ioim_iocdisable(struct bfa_ioim_s *ioim)
2910 bfa_trc(ioim->bfa, ioim->iotag);
2911 bfa_stats(ioim->itnim, io_iocdowns);
2912 bfa_sm_send_event(ioim, BFA_IOIM_SM_HWFAIL);
2919 bfa_ioim_tov(struct bfa_ioim_s *ioim)
2921 bfa_trc(ioim->bfa, ioim->iotag);
2922 bfa_sm_send_event(ioim, BFA_IOIM_SM_IOTOV);
2934 struct bfa_ioim_s *ioim;
2946 ioim = BFA_IOIM_FROM_TAG(fcpim, iotag->tag);
2948 ioim->dio = dio;
2949 ioim->itnim = itnim;
2950 ioim->nsges = nsges;
2951 ioim->nsgpgs = 0;
2956 list_add_tail(&ioim->qe, &itnim->io_q);
2958 return ioim;
2962 bfa_ioim_free(struct bfa_ioim_s *ioim)
2964 struct bfa_fcpim_s *fcpim = ioim->fcpim;
2967 if (ioim->nsgpgs > 0)
2968 bfa_sgpg_mfree(ioim->bfa, &ioim->sgpg_q, ioim->nsgpgs);
2970 bfa_stats(ioim->itnim, io_comps);
2973 ioim->iotag &= BFA_IOIM_IOTAG_MASK;
2975 WARN_ON(!(ioim->iotag <
2977 iotag = BFA_IOTAG_FROM_TAG(fcpim->fcp, ioim->iotag);
2979 if (ioim->iotag < fcpim->fcp->num_ioim_reqs)
2984 list_del(&ioim->qe);
2988 bfa_ioim_start(struct bfa_ioim_s *ioim)
2990 bfa_ioim_cb_profile_start(ioim->fcpim, ioim);
2995 ioim->reqq = bfa_fcpim_ioredirect_enabled(ioim->bfa) ?
2996 BFA_FALSE : bfa_itnim_get_reqq(ioim);
2998 bfa_sm_send_event(ioim, BFA_IOIM_SM_START);
3005 bfa_ioim_abort(struct bfa_ioim_s *ioim)
3008 bfa_trc(ioim->bfa, ioim->iotag);
3010 if (!bfa_ioim_is_abortable(ioim))
3013 bfa_stats(ioim->itnim, io_aborts);
3014 bfa_sm_send_event(ioim, BFA_IOIM_SM_ABORT);
3306 struct bfa_ioim_s *ioim;
3317 ioim = (struct bfa_ioim_s *) qe;
3318 cmnd = (struct scsi_cmnd *) ioim->dio;
3321 list_del(&ioim->qe);
3322 list_add_tail(&ioim->qe, &tskim->io_q);
3330 ioim = (struct bfa_ioim_s *) qe;
3331 cmnd = (struct scsi_cmnd *) ioim->dio;
3334 list_del(&ioim->qe);
3335 list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
3336 bfa_ioim_tov(ioim);
3359 struct bfa_ioim_s *ioim;
3365 ioim = (struct bfa_ioim_s *) qe;
3367 bfa_ioim_cleanup_tm(ioim, tskim);
3457 struct bfa_ioim_s *ioim;
3461 ioim = (struct bfa_ioim_s *) qe;
3462 bfa_ioim_iocdisable(ioim);
3467 * Notification on completions from related ioim.