17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
2a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
37725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * All rights reserved
47725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * www.brocade.com
57725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
67725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter.
77725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
87725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is free software; you can redistribute it and/or modify it
97725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as
107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * published by the Free Software Foundation
117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is distributed in the hope that it will be useful, but
137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of
147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * General Public License for more details.
167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h"
19a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_modules.h"
207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing HuangBFA_TRC_FILE(HAL, FCPIM);
227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
235fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
24a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  BFA ITNIM Related definitions
25a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
26a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_update_del_itn_stats(struct bfa_itnim_s *itnim);
2783763d591b343b07331cebe86715205230c568b1Krishna Gudipatistatic void bfa_ioim_lm_init(struct bfa_s *bfa);
28a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
29a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_ITNIM_FROM_TAG(_fcpim, _tag)                                \
30a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	(((_fcpim)->itnim_arr + ((_tag) & ((_fcpim)->num_itnims - 1))))
31a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_fcpim_additn(__itnim)					\
33a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&(__itnim)->qe, &(__itnim)->fcpim->itnim_q)
34a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_fcpim_delitn(__itnim)	do {				\
35d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!bfa_q_is_on_q(&(__itnim)->fcpim->itnim_q, __itnim));   \
36a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim_update_del_itn_stats(__itnim);      \
37a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_del(&(__itnim)->qe);      \
38d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!list_empty(&(__itnim)->io_q));				\
39d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!list_empty(&(__itnim)->io_cleanup_q));			\
40d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!list_empty(&(__itnim)->pending_q));			\
41a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
42a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
43a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_itnim_online_cb(__itnim) do {				\
44a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((__itnim)->bfa->fcs)					\
45a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_online((__itnim)->ditn);      \
46a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else {								\
47a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe,	\
48a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		__bfa_cb_itnim_online, (__itnim));      \
49a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}								\
50a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
51a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
52a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_itnim_offline_cb(__itnim) do {				\
53a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((__itnim)->bfa->fcs)					\
54a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_offline((__itnim)->ditn);      \
55a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else {								\
56a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe,	\
57a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		__bfa_cb_itnim_offline, (__itnim));      \
58a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}								\
59a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
60a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
61a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_itnim_sler_cb(__itnim) do {					\
62a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((__itnim)->bfa->fcs)					\
63a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_sler((__itnim)->ditn);      \
64a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else {								\
65a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe,	\
66a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		__bfa_cb_itnim_sler, (__itnim));      \
67a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}								\
68a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
69a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7083763d591b343b07331cebe86715205230c568b1Krishna Gudipatienum bfa_ioim_lm_ua_status {
7183763d591b343b07331cebe86715205230c568b1Krishna Gudipati	BFA_IOIM_LM_UA_RESET = 0,
7283763d591b343b07331cebe86715205230c568b1Krishna Gudipati	BFA_IOIM_LM_UA_SET = 1,
7383763d591b343b07331cebe86715205230c568b1Krishna Gudipati};
7483763d591b343b07331cebe86715205230c568b1Krishna Gudipati
755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
76da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang *  itnim state machine event
77a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
78a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_itnim_event {
79a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_CREATE = 1,	/*  itnim is created */
80a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_ONLINE = 2,	/*  itnim is online */
81a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_OFFLINE = 3,	/*  itnim is offline */
82a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_FWRSP = 4,		/*  firmware response */
83a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_DELETE = 5,	/*  deleting an existing itnim */
84a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_CLEANUP = 6,	/*  IO cleanup completion */
85a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_SLER = 7,		/*  second level error recovery */
86a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_HWFAIL = 8,	/*  IOC h/w failure event */
87a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_ITNIM_SM_QRESUME = 9,	/*  queue space available */
88a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
89a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
905fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
91a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  BFA IOIM related definitions
92a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
93a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioim_move_to_comp_q(__ioim) do {				\
94a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_del(&(__ioim)->qe);					\
95a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&(__ioim)->qe, &(__ioim)->fcpim->ioim_comp_q);	\
96a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
97a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
98a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
99a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioim_cb_profile_comp(__fcpim, __ioim) do {			\
100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((__fcpim)->profile_comp)					\
101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		(__fcpim)->profile_comp(__ioim);			\
102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioim_cb_profile_start(__fcpim, __ioim) do {			\
105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((__fcpim)->profile_start)					\
106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		(__fcpim)->profile_start(__ioim);			\
107a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
108a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1095fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
110a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO state machine events
111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
112a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_ioim_event {
113a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_START	= 1,	/*  io start request from host */
114a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_COMP_GOOD	= 2,	/*  io good comp, resource free */
115a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_COMP	= 3,	/*  io comp, resource is free */
116a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_COMP_UTAG	= 4,	/*  io comp, resource is free */
117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_DONE	= 5,	/*  io comp, resource not free */
118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_FREE	= 6,	/*  io resource is freed */
119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_ABORT	= 7,	/*  abort request from scsi stack */
120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_ABORT_COMP	= 8,	/*  abort from f/w */
121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_ABORT_DONE	= 9,	/*  abort completion from f/w */
122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_QRESUME	= 10,	/*  CQ space available to queue IO */
123a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_SGALLOCED	= 11,	/*  SG page allocation successful */
124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_SQRETRY	= 12,	/*  sequence recovery retry */
125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_HCB		= 13,	/*  bfa callback complete */
126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_CLEANUP	= 14,	/*  IO cleanup from itnim */
127a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_TMSTART	= 15,	/*  IO cleanup from tskim */
128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_TMDONE	= 16,	/*  IO cleanup from tskim */
129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_HWFAIL	= 17,	/*  IOC h/w failure event */
130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOIM_SM_IOTOV	= 18,	/*  ITN offline TOV */
131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  BFA TSKIM related definitions
136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1385fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * task management completion handling
140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_tskim_qcomp(__tskim, __cbfn) do {				\
142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_queue((__tskim)->bfa, &(__tskim)->hcb_qe, __cbfn, (__tskim));\
143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_tskim_notify_comp(__tskim);      \
144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_tskim_notify_comp(__tskim) do {				\
147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((__tskim)->notify)						\
148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_tskdone((__tskim)->itnim);      \
149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0)
150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_tskim_event {
153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_START	= 1,	/*  TM command start		*/
154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_DONE	= 2,	/*  TM completion		*/
155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_QRESUME	= 3,	/*  resume after qfull		*/
156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_HWFAIL	= 5,	/*  IOC h/w failure event	*/
157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_HCB	= 6,	/*  BFA callback completion	*/
158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_IOS_DONE	= 7,	/*  IO and sub TM completions	*/
159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_CLEANUP	= 8,	/*  TM cleanup on ITN offline	*/
160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_TSKIM_SM_CLEANUP_DONE = 9,	/*  TM abort completion	*/
1611306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	BFA_TSKIM_SM_UTAG	= 10,	/*  TM completion unknown tag  */
162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for BFA ITNIM functions
166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_iocdisable_cleanup(struct bfa_itnim_s *itnim);
168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_itnim_send_fwcreate(struct bfa_itnim_s *itnim);
169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_itnim_send_fwdelete(struct bfa_itnim_s *itnim);
170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_cleanp_comp(void *itnim_cbarg);
171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_cleanup(struct bfa_itnim_s *itnim);
172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     __bfa_cb_itnim_online(void *cbarg, bfa_boolean_t complete);
173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     __bfa_cb_itnim_offline(void *cbarg, bfa_boolean_t complete);
174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     __bfa_cb_itnim_sler(void *cbarg, bfa_boolean_t complete);
175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_iotov_online(struct bfa_itnim_s *itnim);
176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_iotov_cleanup(struct bfa_itnim_s *itnim);
177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_iotov(void *itnim_arg);
178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_iotov_start(struct bfa_itnim_s *itnim);
179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_iotov_stop(struct bfa_itnim_s *itnim);
180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_iotov_delete(struct bfa_itnim_s *itnim);
181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1825fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration of ITNIM state machine
184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_uninit(struct bfa_itnim_s *itnim,
186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_created(struct bfa_itnim_s *itnim,
188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_fwcreate(struct bfa_itnim_s *itnim,
190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_delete_pending(struct bfa_itnim_s *itnim,
192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_online(struct bfa_itnim_s *itnim,
194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_sler(struct bfa_itnim_s *itnim,
196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_cleanup_offline(struct bfa_itnim_s *itnim,
198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_cleanup_delete(struct bfa_itnim_s *itnim,
200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_fwdelete(struct bfa_itnim_s *itnim,
202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_offline(struct bfa_itnim_s *itnim,
204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_iocdisable(struct bfa_itnim_s *itnim,
206a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_deleting(struct bfa_itnim_s *itnim,
208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_fwcreate_qfull(struct bfa_itnim_s *itnim,
210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_fwdelete_qfull(struct bfa_itnim_s *itnim,
212a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_itnim_sm_deleting_qfull(struct bfa_itnim_s *itnim,
214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_itnim_event event);
215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2165fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for BFA IOIM functions
218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t	bfa_ioim_send_ioreq(struct bfa_ioim_s *ioim);
220e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhangstatic bfa_boolean_t	bfa_ioim_sgpg_alloc(struct bfa_ioim_s *ioim);
221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t	bfa_ioim_send_abort(struct bfa_ioim_s *ioim);
222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void		bfa_ioim_notify_cleanup(struct bfa_ioim_s *ioim);
223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_good_comp(void *cbarg, bfa_boolean_t complete);
224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_comp(void *cbarg, bfa_boolean_t complete);
225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_abort(void *cbarg, bfa_boolean_t complete);
226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_failed(void *cbarg, bfa_boolean_t complete);
227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_pathtov(void *cbarg, bfa_boolean_t complete);
228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t    bfa_ioim_is_abortable(struct bfa_ioim_s *ioim);
229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration of BFA IO state machine
232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_uninit(struct bfa_ioim_s *ioim,
234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim,
236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
237a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_active(struct bfa_ioim_s *ioim,
238a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_abort(struct bfa_ioim_s *ioim,
240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim,
242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_qfull(struct bfa_ioim_s *ioim,
244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim,
246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim,
248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_hcb(struct bfa_ioim_s *ioim,
250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim,
252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_ioim_sm_resfree(struct bfa_ioim_s *ioim,
254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim,
256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_ioim_event event);
2575fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for BFA TSKIM functions
259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     __bfa_cb_tskim_done(void *cbarg, bfa_boolean_t complete);
261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     __bfa_cb_tskim_failed(void *cbarg, bfa_boolean_t complete);
262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_tskim_match_scope(struct bfa_tskim_s *tskim,
263f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang					struct scsi_lun lun);
264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_gather_ios(struct bfa_tskim_s *tskim);
265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_cleanp_comp(void *tskim_cbarg);
266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_cleanup_ios(struct bfa_tskim_s *tskim);
267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_tskim_send(struct bfa_tskim_s *tskim);
268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_tskim_send_abort(struct bfa_tskim_s *tskim);
269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_iocdisable_ios(struct bfa_tskim_s *tskim);
270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration of BFA TSKIM state machine
273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
274a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_sm_uninit(struct bfa_tskim_s *tskim,
275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_tskim_event event);
276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_sm_active(struct bfa_tskim_s *tskim,
277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_tskim_event event);
278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim,
279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_tskim_event event);
280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim,
281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_tskim_event event);
282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_sm_qfull(struct bfa_tskim_s *tskim,
283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_tskim_event event);
284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim,
285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_tskim_event event);
286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void     bfa_tskim_sm_hcb(struct bfa_tskim_s *tskim,
287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					enum bfa_tskim_event event);
2885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
289df0f1933eb5454a5c481311837076056557467adMaggie Zhang *  BFA FCP Initiator Mode module
2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2925fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
293da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Compute and return memory needed by FCP(im) module.
2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2964507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_fcpim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len)
2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2984507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_itnim_meminfo(cfg, km_len);
2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3005fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * IO memory
3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	*km_len += cfg->fwcfg.num_ioim_reqs *
3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	  (sizeof(struct bfa_ioim_s) + sizeof(struct bfa_ioim_sp_s));
3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * task management command memory
3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (cfg->fwcfg.num_tskim_reqs < BFA_TSKIM_MIN)
3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		cfg->fwcfg.num_tskim_reqs = BFA_TSKIM_MIN;
3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	*km_len += cfg->fwcfg.num_tskim_reqs * sizeof(struct bfa_tskim_s);
3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
316e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcpim_attach(struct bfa_fcp_mod_s *fcp, void *bfad,
3174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		struct bfa_iocfc_cfg_s *cfg, struct bfa_pcidev_s *pcidev)
3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
319e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = &fcp->fcpim;
320e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_s *bfa = fcp->bfa;
3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(bfa, cfg->drvcfg.path_tov);
3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(bfa, cfg->fwcfg.num_rports);
3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(bfa, cfg->fwcfg.num_ioim_reqs);
3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(bfa, cfg->fwcfg.num_tskim_reqs);
3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
327e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	fcpim->fcp		= fcp;
328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->bfa		= bfa;
329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->num_itnims	= cfg->fwcfg.num_rports;
3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	fcpim->num_tskim_reqs = cfg->fwcfg.num_tskim_reqs;
331a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->path_tov		= cfg->drvcfg.path_tov;
332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->delay_comp	= cfg->drvcfg.delay_comp;
333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->profile_comp = NULL;
334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->profile_start = NULL;
3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3364507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_itnim_attach(fcpim);
3374507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_tskim_attach(fcpim);
3384507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_ioim_attach(fcpim);
3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
342e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcpim_iocdisable(struct bfa_fcp_mod_s *fcp)
3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
344e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = &fcp->fcpim;
3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_itnim_s *itnim;
346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *qe, *qen;
3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3483fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	/* Enqueue unused ioim resources to free_q */
3493fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	list_splice_tail_init(&fcpim->tskim_unused_q, &fcpim->tskim_free_q);
3503fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim = (struct bfa_itnim_s *) qe;
3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_iocdisable(itnim);
3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcpim_path_tov_set(struct bfa_s *bfa, u16 path_tov)
3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
360e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	fcpim->path_tov = path_tov * 1000;
3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (fcpim->path_tov > BFA_FCPIM_PATHTOV_MAX)
3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		fcpim->path_tov = BFA_FCPIM_PATHTOV_MAX;
3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16
3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcpim_path_tov_get(struct bfa_s *bfa)
3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
370e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
372f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang	return fcpim->path_tov / 1000;
3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
375601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati#define bfa_fcpim_add_iostats(__l, __r, __stats)	\
376601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	(__l->__stats += __r->__stats)
377601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
378601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipativoid
379601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfa_fcpim_add_stats(struct bfa_itnim_iostats_s *lstats,
380601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		struct bfa_itnim_iostats_s *rstats)
381601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
382601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, total_ios);
383601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, qresumes);
384601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, no_iotags);
385601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, io_aborts);
386601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, no_tskims);
387601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocomp_ok);
388601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocomp_underrun);
389601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocomp_overrun);
390601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocomp_aborted);
391601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocomp_timedout);
392601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocom_nexus_abort);
393601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocom_proto_err);
394601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocom_dif_err);
395601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocom_sqer_needed);
396601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocom_res_free);
397601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocom_hostabrts);
398601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, iocom_utags);
399601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, io_cleanups);
400601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, io_tmaborts);
401601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, onlines);
402601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, offlines);
403601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, creates);
404601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, deletes);
405601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, create_comps);
406601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, delete_comps);
407601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, sler_events);
408601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, fw_create);
409601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, fw_delete);
410601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, ioc_disabled);
411601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, cleanup_comps);
412601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_cmnds);
413601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_fw_rsps);
414601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_success);
415601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_failures);
416601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_io_comps);
417601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_qresumes);
418601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_iocdowns);
419601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_cleanups);
420601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, tm_cleanup_comps);
421601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, io_comps);
422601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, input_reqs);
423601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, output_reqs);
424601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, rd_throughput);
425601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_add_iostats(lstats, rstats, wr_throughput);
426601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
427601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
428601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfa_status_t
429601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfa_fcpim_port_iostats(struct bfa_s *bfa,
430601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		struct bfa_itnim_iostats_s *stats, u8 lp_tag)
431601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
432601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
433601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct list_head *qe, *qen;
434601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_itnim_s *itnim;
435601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
436601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	/* accumulate IO stats from itnim */
437601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memset(stats, 0, sizeof(struct bfa_itnim_iostats_s));
438601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
439601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		itnim = (struct bfa_itnim_s *) qe;
440601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		if (itnim->rport->rport_info.lp_tag != lp_tag)
441601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			continue;
442601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_fcpim_add_stats(stats, &(itnim->stats));
443601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
444601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return BFA_STATUS_OK;
445601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
446601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
44742a8e6e298f39518445785c53a16357267db37efKrishna Gudipativoid
44842a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_ioim_profile_comp(struct bfa_ioim_s *ioim)
44942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{
45042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_itnim_latency_s *io_lat =
45142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati			&(ioim->itnim->ioprofile.io_latency);
45242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	u32 val, idx;
45342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
45442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	val = (u32)(jiffies - ioim->start_time);
45542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	idx = bfa_ioim_get_index(scsi_bufflen((struct scsi_cmnd *)ioim->dio));
45642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	bfa_itnim_ioprofile_update(ioim->itnim, idx);
45742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
45842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	io_lat->count[idx]++;
45942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	io_lat->min[idx] = (io_lat->min[idx] < val) ? io_lat->min[idx] : val;
46042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	io_lat->max[idx] = (io_lat->max[idx] > val) ? io_lat->max[idx] : val;
46142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	io_lat->avg[idx] += val;
46242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati}
46342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
46442a8e6e298f39518445785c53a16357267db37efKrishna Gudipativoid
46542a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_ioim_profile_start(struct bfa_ioim_s *ioim)
46642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{
46742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	ioim->start_time = jiffies;
46842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati}
46942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
47042a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_status_t
47142a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_fcpim_profile_on(struct bfa_s *bfa, u32 time)
47242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{
47342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_itnim_s *itnim;
47442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
47542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct list_head *qe, *qen;
47642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
47742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	/* accumulate IO stats from itnim */
47842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
47942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		itnim = (struct bfa_itnim_s *) qe;
48042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		bfa_itnim_clear_stats(itnim);
48142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	}
48242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->io_profile = BFA_TRUE;
48342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->io_profile_start_time = time;
48442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->profile_comp = bfa_ioim_profile_comp;
48542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->profile_start = bfa_ioim_profile_start;
48642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	return BFA_STATUS_OK;
48742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati}
48842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
48942a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_status_t
49042a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_fcpim_profile_off(struct bfa_s *bfa)
49142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{
49242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
49342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->io_profile = BFA_FALSE;
49442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->io_profile_start_time = 0;
49542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->profile_comp = NULL;
49642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcpim->profile_start = NULL;
49742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	return BFA_STATUS_OK;
49842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati}
49942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16
5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcpim_qdepth_get(struct bfa_s *bfa)
5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
503e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
505f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang	return fcpim->q_depth;
5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  BFA ITNIM module state machine functions
510a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
513da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Beginning/unallocated state - no events expected.
514a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_uninit(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_CREATE:
523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_created);
524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->is_online = BFA_FALSE;
525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_additn(itnim);
526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
530a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
534da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Beginning state, only online event expected.
535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_created(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
538a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_ONLINE:
544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_itnim_send_fwcreate(itnim))
545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate);
546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate_qfull);
548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_delitn(itnim);
553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
554a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
563a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	Waiting for itnim create response from firmware.
566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwcreate(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_FWRSP:
575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_online);
576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->is_online = BFA_TRUE;
577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_online(itnim);
578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_online_cb(itnim);
579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_delete_pending);
583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_OFFLINE:
586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_itnim_send_fwdelete(itnim))
587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete);
588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete_qfull);
590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
602a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwcreate_qfull(struct bfa_itnim_s *itnim,
603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			enum bfa_itnim_event event)
604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_QRESUME:
610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate);
611a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_send_fwcreate(itnim);
612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&itnim->reqq_wait);
617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_delitn(itnim);
618a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_OFFLINE:
621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_offline);
622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&itnim->reqq_wait);
623a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_offline_cb(itnim);
624a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
625a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
626a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
627a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&itnim->reqq_wait);
629a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
632a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
633a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
635a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6365fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
637da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Waiting for itnim create response from firmware, a delete is pending.
638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_delete_pending(struct bfa_itnim_s *itnim,
641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				enum bfa_itnim_event event)
642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_FWRSP:
648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_itnim_send_fwdelete(itnim))
649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_deleting);
650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_deleting_qfull);
652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_delitn(itnim);
657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
660a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
665da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Online state - normal parking state.
666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
667a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
668a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_online(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
672a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_OFFLINE:
675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_offline);
676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->is_online = BFA_FALSE;
677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_start(itnim);
678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_cleanup(itnim);
679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
682a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_delete);
683a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->is_online = BFA_FALSE;
684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_cleanup(itnim);
685a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
686a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_SLER:
688a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_sler);
689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->is_online = BFA_FALSE;
690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_start(itnim);
691a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_sler_cb(itnim);
692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->is_online = BFA_FALSE;
697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_start(itnim);
698a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iocdisable_cleanup(itnim);
699a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
700a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
707da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Second level error recovery need.
708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_sler(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
714a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_OFFLINE:
717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_offline);
718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_cleanup(itnim);
719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_delete);
723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_cleanup(itnim);
724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_delete(itnim);
725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
729a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iocdisable_cleanup(itnim);
730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
738da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Going offline. Waiting for active IO cleanup.
739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_cleanup_offline(struct bfa_itnim_s *itnim,
742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				 enum bfa_itnim_event event)
743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_CLEANUP:
749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_itnim_send_fwdelete(itnim))
750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete);
751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete_qfull);
753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_delete);
757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_delete(itnim);
758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iocdisable_cleanup(itnim);
763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_offline_cb(itnim);
764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_SLER:
767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7745fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
775da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Deleting itnim. Waiting for active IO cleanup.
776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_cleanup_delete(struct bfa_itnim_s *itnim,
779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				enum bfa_itnim_event event)
780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_CLEANUP:
786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_itnim_send_fwdelete(itnim))
787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_deleting);
788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_deleting_qfull);
790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
793a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iocdisable_cleanup(itnim);
795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Rport offline. Fimrware itnim is being deleted - awaiting f/w response.
804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwdelete(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_FWRSP:
813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_offline);
814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_offline_cb(itnim);
815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_deleting);
819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_offline_cb(itnim);
824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwdelete_qfull(struct bfa_itnim_s *itnim,
833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			enum bfa_itnim_event event)
834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_QRESUME:
840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete);
841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_send_fwdelete(itnim);
842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_deleting_qfull);
846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&itnim->reqq_wait);
851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_offline_cb(itnim);
852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
858a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8595fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
860da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Offline state.
861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
862a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_offline(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
866a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
867a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
868a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_delete(itnim);
872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_delitn(itnim);
873a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
874a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_ONLINE:
876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_itnim_send_fwcreate(itnim))
877a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate);
878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate_qfull);
880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
882a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable);
884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_iocdisable(struct bfa_itnim_s *itnim,
893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				enum bfa_itnim_event event)
894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_DELETE:
900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iotov_delete(itnim);
902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_delitn(itnim);
903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_OFFLINE:
906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_offline_cb(itnim);
907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_ONLINE:
910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_itnim_send_fwcreate(itnim))
911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate);
912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate_qfull);
914a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
917a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
918a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
923a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
9245fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
925da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Itnim is deleted, waiting for firmware response to delete.
926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_deleting(struct bfa_itnim_s *itnim, enum bfa_itnim_event event)
929a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
932a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
933a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_FWRSP:
935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
937a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_delitn(itnim);
938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
944a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_deleting_qfull(struct bfa_itnim_s *itnim,
947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		enum bfa_itnim_event event)
948a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, itnim->rport->rport_tag);
950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(itnim->bfa, event);
951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_QRESUME:
954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_deleting);
955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_send_fwdelete(itnim);
956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_ITNIM_SM_HWFAIL:
959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&itnim->reqq_wait);
961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcpim_delitn(itnim);
962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(itnim->bfa, event);
966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
9695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
970da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Initiate cleanup of all IOs on an IOC failure.
971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iocdisable_cleanup(struct bfa_itnim_s *itnim)
974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
975a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim;
976a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head	*qe, *qen;
978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
979a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->tsk_q) {
980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		tskim = (struct bfa_tskim_s *) qe;
981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_iocdisable(tskim);
982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
984a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->io_q) {
985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_iocdisable(ioim);
987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
9895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * For IO request in pending queue, we pretend an early timeout.
991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->pending_q) {
993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_tov(ioim);
995a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->io_cleanup_q) {
998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_iocdisable(ioim);
1000a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1002a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1004da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO cleanup completion
1005a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1006a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1007a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_cleanp_comp(void *itnim_cbarg)
1008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1009a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = itnim_cbarg;
1010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, cleanup_comps);
1012a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(itnim, BFA_ITNIM_SM_CLEANUP);
1013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1014a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10155fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1016da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Initiate cleanup of all IOs.
1017a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1018a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1019a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_cleanup(struct bfa_itnim_s *itnim)
1020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s  *ioim;
1022a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim;
1023a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head	*qe, *qen;
1024a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_wc_init(&itnim->wc, bfa_itnim_cleanp_comp, itnim);
1026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->io_q) {
1028a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
1029a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
1031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Move IO to a cleanup queue from active queue so that a later
1032a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * TM will not pickup this IO.
1033a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1034a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_del(&ioim->qe);
1035a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_add_tail(&ioim->qe, &itnim->io_cleanup_q);
1036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1037a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_wc_up(&itnim->wc);
1038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_cleanup(ioim);
1039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->tsk_q) {
1042a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		tskim = (struct bfa_tskim_s *) qe;
1043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_wc_up(&itnim->wc);
1044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_cleanup(tskim);
1045a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1047a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_wc_wait(&itnim->wc);
1048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1050a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1051a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_itnim_online(void *cbarg, bfa_boolean_t complete)
1052a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1053a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = cbarg;
1054a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1055a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (complete)
1056a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_online(itnim->ditn);
1057a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1058a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_itnim_offline(void *cbarg, bfa_boolean_t complete)
1061a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1062a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = cbarg;
1063a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1064a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (complete)
1065a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_offline(itnim->ditn);
1066a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1067a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1068a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1069a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_itnim_sler(void *cbarg, bfa_boolean_t complete)
1070a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1071a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = cbarg;
1072a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1073a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (complete)
1074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_sler(itnim->ditn);
1075a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1076a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Call to resume any I/O requests waiting for room in request queue.
1079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_qresume(void *cbarg)
1082a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1083a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = cbarg;
1084a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1085a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(itnim, BFA_ITNIM_SM_QRESUME);
1086a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1087a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  bfa_itnim_public
1090a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1093a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iodone(struct bfa_itnim_s *itnim)
1094a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_wc_down(&itnim->wc);
1096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1097a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_tskdone(struct bfa_itnim_s *itnim)
1100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_wc_down(&itnim->wc);
1102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
11054507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_itnim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len)
1106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
11075fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1108a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * ITN memory
1109a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1110a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*km_len += cfg->fwcfg.num_rports * sizeof(struct bfa_itnim_s);
1111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1112a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1113a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
11144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_itnim_attach(struct bfa_fcpim_s *fcpim)
1115a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1116a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = fcpim->bfa;
11174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_fcp_mod_s	*fcp = fcpim->fcp;
1118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim;
1119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int	i, j;
1120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&fcpim->itnim_q);
1122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	itnim = (struct bfa_itnim_s *) bfa_mem_kva_curp(fcp);
1124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->itnim_arr = itnim;
1125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < fcpim->num_itnims; i++, itnim++) {
11276a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang		memset(itnim, 0, sizeof(struct bfa_itnim_s));
1128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->bfa = bfa;
1129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->fcpim = fcpim;
1130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->reqq = BFA_REQQ_QOS_LO;
1131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->rport = BFA_RPORT_FROM_TAG(bfa, i);
1132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->iotov_active = BFA_FALSE;
1133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_winit(&itnim->reqq_wait, bfa_itnim_qresume, itnim);
1134a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&itnim->io_q);
1136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&itnim->io_cleanup_q);
1137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&itnim->pending_q);
1138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&itnim->tsk_q);
1139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&itnim->delay_comp_q);
1140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		for (j = 0; j < BFA_IOBUCKET_MAX; j++)
1141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			itnim->ioprofile.io_latency.min[j] = ~0;
1142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(itnim, bfa_itnim_sm_uninit);
1143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11454507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_curp(fcp) = (u8 *) itnim;
1146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iocdisable(struct bfa_itnim_s *itnim)
1150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, ioc_disabled);
1152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(itnim, BFA_ITNIM_SM_HWFAIL);
1153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t
1156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_send_fwcreate(struct bfa_itnim_s *itnim)
1157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1158dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	struct bfi_itn_create_req_s *m;
1159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->msg_no++;
1161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11625fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * check for room in queue to send request now
1164a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(itnim->bfa, itnim->reqq);
1166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m) {
1167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wait(itnim->bfa, itnim->reqq, &itnim->reqq_wait);
1168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
1169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1171dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ITN, BFI_ITN_H2I_CREATE_REQ,
11723fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati			bfa_fn_lpu(itnim->bfa));
1173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->fw_handle = itnim->rport->fw_handle;
1174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->class = FC_CLASS_3;
1175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->seq_rec = itnim->seq_rec;
1176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->msg_no = itnim->msg_no;
1177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, fw_create);
1178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11795fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * queue I/O message to firmware
1181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
11823fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_reqq_produce(itnim->bfa, itnim->reqq, m->mh);
1183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
1184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t
1187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_send_fwdelete(struct bfa_itnim_s *itnim)
1188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1189dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	struct bfi_itn_delete_req_s *m;
1190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11915fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * check for room in queue to send request now
1193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(itnim->bfa, itnim->reqq);
1195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m) {
1196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wait(itnim->bfa, itnim->reqq, &itnim->reqq_wait);
1197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
1198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1200dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ITN, BFI_ITN_H2I_DELETE_REQ,
12013fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati			bfa_fn_lpu(itnim->bfa));
1202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->fw_handle = itnim->rport->fw_handle;
1203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, fw_delete);
1204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1206a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * queue I/O message to firmware
1207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
12083fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_reqq_produce(itnim->bfa, itnim->reqq, m->mh);
1209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
1210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup all pending failed inflight requests.
1214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_delayed_comp(struct bfa_itnim_s *itnim, bfa_boolean_t iotov)
1217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
1219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *qe, *qen;
1220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->delay_comp_q) {
1222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *)qe;
1223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_delayed_comp(ioim, iotov);
1224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12275fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Start all pending IO requests.
1229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_online(struct bfa_itnim_s *itnim)
1232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
1234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim_iotov_stop(itnim);
1236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1238a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Abort all inflight IO requests in the queue
1239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim_delayed_comp(itnim, BFA_FALSE);
1241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12425fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Start all pending IO requests.
1244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	while (!list_empty(&itnim->pending_q)) {
1246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_q_deq(&itnim->pending_q, &ioim);
1247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_add_tail(&ioim->qe, &itnim->io_q);
1248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_start(ioim);
1249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Fail all pending IO requests
1254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_cleanup(struct bfa_itnim_s *itnim)
1257a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
1259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12605fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Fail all inflight IO requests in the queue
1262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim_delayed_comp(itnim, BFA_TRUE);
1264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Fail any pending IO requests.
1267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	while (!list_empty(&itnim->pending_q)) {
1269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_q_deq(&itnim->pending_q, &ioim);
1270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
1271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_tov(ioim);
1272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1274a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO TOV timer callback. Fail any pending IO requests.
1277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov(void *itnim_arg)
1280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = itnim_arg;
1282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->iotov_active = BFA_FALSE;
1284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_itnim_tov_begin(itnim->ditn);
1286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim_iotov_cleanup(itnim);
1287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_itnim_tov(itnim->ditn);
1288a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1289a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12905fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Start IO TOV timer for failing back pending IO requests in offline state.
1292a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1293a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_start(struct bfa_itnim_s *itnim)
1295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (itnim->fcpim->path_tov > 0) {
1297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->iotov_active = BFA_TRUE;
1299d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(!bfa_itnim_hold_io(itnim));
1300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_timer_start(itnim->bfa, &itnim->timer,
1301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_itnim_iotov, itnim, itnim->fcpim->path_tov);
1302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
13055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Stop IO TOV timer.
1307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1309a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_stop(struct bfa_itnim_s *itnim)
1310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1311a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (itnim->iotov_active) {
1312a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->iotov_active = BFA_FALSE;
1313a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_timer_stop(&itnim->timer);
1314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
13175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Stop IO TOV timer.
1319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1320a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_delete(struct bfa_itnim_s *itnim)
1322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_boolean_t pathtov_active = BFA_FALSE;
1324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1325a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (itnim->iotov_active)
1326a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		pathtov_active = BFA_TRUE;
1327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim_iotov_stop(itnim);
1329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (pathtov_active)
1330a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_tov_begin(itnim->ditn);
1331a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim_iotov_cleanup(itnim);
1332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (pathtov_active)
1333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_itnim_tov(itnim->ditn);
1334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_update_del_itn_stats(struct bfa_itnim_s *itnim)
1338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1339e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(itnim->bfa);
1340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_itn_iocomp_aborted +=
1341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->stats.iocomp_aborted;
1342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_itn_iocomp_timedout +=
1343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->stats.iocomp_timedout;
1344a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_itn_iocom_sqer_needed +=
1345a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->stats.iocom_sqer_needed;
1346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_itn_iocom_res_free +=
1347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->stats.iocom_res_free;
1348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_itn_iocom_hostabrts +=
1349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->stats.iocom_hostabrts;
1350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_itn_total_ios += itnim->stats.total_ios;
1351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_io_iocdowns += itnim->stats.io_iocdowns;
1352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->del_itn_stats.del_tm_iocdowns += itnim->stats.tm_iocdowns;
1353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1354a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
13555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1356da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * bfa_itnim_public
1357a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1358a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
13595fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1360da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Itnim interrupt processing.
1361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1363a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
1364a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1365e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
1366dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	union bfi_itn_i2h_msg_u msg;
1367a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim;
1368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, m->mhdr.msg_id);
1370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	msg.msg = m;
1372a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (m->mhdr.msg_id) {
1374dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	case BFI_ITN_I2H_CREATE_RSP:
1375a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim = BFA_ITNIM_FROM_TAG(fcpim,
1376a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati						msg.create_rsp->bfa_handle);
1377d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(msg.create_rsp->status != BFA_STATUS_OK);
1378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, create_comps);
1379a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(itnim, BFA_ITNIM_SM_FWRSP);
1380a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1381a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1382dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	case BFI_ITN_I2H_DELETE_RSP:
1383a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim = BFA_ITNIM_FROM_TAG(fcpim,
1384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati						msg.delete_rsp->bfa_handle);
1385d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(msg.delete_rsp->status != BFA_STATUS_OK);
1386a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, delete_comps);
1387a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(itnim, BFA_ITNIM_SM_FWRSP);
1388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1390dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati	case BFI_ITN_I2H_SLER_EVENT:
1391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim = BFA_ITNIM_FROM_TAG(fcpim,
1392a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati						msg.sler_event->bfa_handle);
1393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, sler_events);
1394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(itnim, BFA_ITNIM_SM_SLER);
1395a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(bfa, m->mhdr.msg_id);
1399d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
1400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1402a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
14035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1404da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * bfa_itnim_api
1405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistruct bfa_itnim_s *
1408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_create(struct bfa_s *bfa, struct bfa_rport_s *rport, void *ditn)
1409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1410e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
1411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim;
1412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1413e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	bfa_itn_create(bfa, rport, bfa_itnim_isr);
1414e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
1415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim = BFA_ITNIM_FROM_TAG(fcpim, rport->rport_tag);
1416d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(itnim->rport != rport);
1417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->ditn = ditn;
1419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, creates);
1421a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(itnim, BFA_ITNIM_SM_CREATE);
1422a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return itnim;
1424a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_delete(struct bfa_itnim_s *itnim)
1428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, deletes);
1430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(itnim, BFA_ITNIM_SM_DELETE);
1431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1432a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1433a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_online(struct bfa_itnim_s *itnim, bfa_boolean_t seq_rec)
1435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->seq_rec = seq_rec;
1437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, onlines);
1438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(itnim, BFA_ITNIM_SM_ONLINE);
1439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_offline(struct bfa_itnim_s *itnim)
1443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, offlines);
1445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(itnim, BFA_ITNIM_SM_OFFLINE);
1446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
14485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Return true if itnim is considered offline for holding off IO request.
1450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO is not held if itnim is being deleted.
1451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t
1453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_hold_io(struct bfa_itnim_s *itnim)
1454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return itnim->fcpim->path_tov && itnim->iotov_active &&
1456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		(bfa_sm_cmp_state(itnim, bfa_itnim_sm_fwcreate) ||
1457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 bfa_sm_cmp_state(itnim, bfa_itnim_sm_sler) ||
1458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 bfa_sm_cmp_state(itnim, bfa_itnim_sm_cleanup_offline) ||
1459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 bfa_sm_cmp_state(itnim, bfa_itnim_sm_fwdelete) ||
1460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 bfa_sm_cmp_state(itnim, bfa_itnim_sm_offline) ||
1461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 bfa_sm_cmp_state(itnim, bfa_itnim_sm_iocdisable));
1462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
146442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati#define bfa_io_lat_clock_res_div	HZ
146542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati#define bfa_io_lat_clock_res_mul	1000
146642a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_status_t
146742a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_itnim_get_ioprofile(struct bfa_itnim_s *itnim,
146842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati			struct bfa_itnim_ioprofile_s *ioprofile)
146942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{
147061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	struct bfa_fcpim_s *fcpim;
147161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
147261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	if (!itnim)
147361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		return BFA_STATUS_NO_FCPIM_NEXUS;
147461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
147561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	fcpim = BFA_FCPIM(itnim->bfa);
147661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
147742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	if (!fcpim->io_profile)
147842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		return BFA_STATUS_IOPROFILE_OFF;
147942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
148042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	itnim->ioprofile.index = BFA_IOBUCKET_MAX;
148142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	itnim->ioprofile.io_profile_start_time =
148242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati				bfa_io_profile_start_time(itnim->bfa);
148342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	itnim->ioprofile.clock_res_mul = bfa_io_lat_clock_res_mul;
148442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	itnim->ioprofile.clock_res_div = bfa_io_lat_clock_res_div;
148542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	*ioprofile = itnim->ioprofile;
148642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
148742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	return BFA_STATUS_OK;
148842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati}
148942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
1490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_clear_stats(struct bfa_itnim_s *itnim)
1492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1493a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int j;
149461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
149561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	if (!itnim)
149661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		return;
149761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
14986a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset(&itnim->stats, 0, sizeof(itnim->stats));
14996a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset(&itnim->ioprofile, 0, sizeof(itnim->ioprofile));
1500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (j = 0; j < BFA_IOBUCKET_MAX; j++)
1501a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->ioprofile.io_latency.min[j] = ~0;
1502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1503a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
15045fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1505a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  BFA IO module state machine functions
1506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
15085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1509da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is not started (unallocated).
1510a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1512a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_uninit(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1513a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1514a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_START:
1516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_itnim_is_online(ioim->itnim)) {
1517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			if (!bfa_itnim_hold_io(ioim->itnim)) {
1518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				list_del(&ioim->qe);
1520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				list_add_tail(&ioim->qe,
1521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					&ioim->fcpim->ioim_comp_q);
1522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati						__bfa_cb_ioim_pathtov, ioim);
1524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			} else {
1525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				list_del(&ioim->qe);
1526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				list_add_tail(&ioim->qe,
1527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					&ioim->itnim->pending_q);
1528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			}
1529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
1530a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (ioim->nsges > BFI_SGE_INLINE) {
1533e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			if (!bfa_ioim_sgpg_alloc(ioim)) {
1534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				bfa_sm_set_state(ioim, bfa_ioim_sm_sgalloc);
1535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				return;
1536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			}
1537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1538a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_ioim_send_ioreq(ioim)) {
1540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_qfull);
1541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
1542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_IOTOV:
1548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__bfa_cb_ioim_pathtov, ioim);
1552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1554a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT:
15555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
1556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * IO in pending queue can get abort requests. Complete abort
1557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * requests immediately.
1558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1560d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(!bfa_q_is_on_q(&ioim->itnim->pending_q, ioim));
1561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
156283763d591b343b07331cebe86715205230c568b1Krishna Gudipati			__bfa_cb_ioim_abort, ioim);
156383763d591b343b07331cebe86715205230c568b1Krishna Gudipati		break;
156483763d591b343b07331cebe86715205230c568b1Krishna Gudipati
1565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
15705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1571da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is waiting for SG pages.
1572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
1577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
1578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_SGALLOCED:
1581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_ioim_send_ioreq(ioim)) {
1582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_qfull);
1583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
1584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
1589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe);
1591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
1594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT:
1597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe);
1599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1602a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
1605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe);
1607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1611a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
16175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1618da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is active.
1619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_active(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1623a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1624a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP_GOOD:
1625a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1626a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1627a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      __bfa_cb_ioim_good_comp, ioim);
1629a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP:
1632a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1633a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_comp,
1635a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1636a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1637a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_DONE:
1639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_comp,
1642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT:
1646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->iosp->abort_explicit = BFA_TRUE;
1647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->io_cbfn = __bfa_cb_ioim_abort;
1648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_ioim_send_abort(ioim))
1650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_abort);
1651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else {
1652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_abort_qfull);
1653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(ioim->itnim, qwait);
1654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_reqq_wait(ioim->bfa, ioim->reqq,
1655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					  &ioim->iosp->reqq_wait);
1656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
1660a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->iosp->abort_explicit = BFA_FALSE;
1661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->io_cbfn = __bfa_cb_ioim_failed;
1662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_ioim_send_abort(ioim))
1664a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1665a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else {
1666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1667a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(ioim->itnim, qwait);
1668a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_reqq_wait(ioim->bfa, ioim->reqq,
1669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					  &ioim->iosp->reqq_wait);
1670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1672a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
1674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_SQRETRY:
168115821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati		if (bfa_ioim_maxretry_reached(ioim)) {
168215821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati			/* max retry reached, free IO */
1683a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_ioim_move_to_comp_q(ioim);
1685a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1686a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					__bfa_cb_ioim_failed, ioim);
1687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
1688a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		/* waiting for IO tag resource free */
1690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_cmnd_retry);
1691a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
16985fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1699da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is retried with new tag.
1700da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang */
1701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_FREE:
1706a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		/* abts and rrq done. Now retry the IO with new tag */
170715821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati		bfa_ioim_update_iotag(ioim);
1708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_ioim_send_ioreq(ioim)) {
1709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_qfull);
1710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
1711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	break;
1714a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
1716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->iosp->abort_explicit = BFA_FALSE;
1717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->io_cbfn = __bfa_cb_ioim_failed;
1718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_ioim_send_abort(ioim))
1720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else {
1722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(ioim->itnim, qwait);
1724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_reqq_wait(ioim->bfa, ioim->reqq,
1725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					  &ioim->iosp->reqq_wait);
1726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	break;
1728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1729a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
1730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
1733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 __bfa_cb_ioim_failed, ioim);
1734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT:
17375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/* in this state IO abort is done.
1738a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Waiting for IO tag resource free.
1739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
17505fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1751da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is being aborted, waiting for completion from firmware.
1752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_abort(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
1757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
1758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP_GOOD:
1761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP:
1762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_DONE:
1763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_FREE:
1764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT_DONE:
1767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT_COMP:
1773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP_UTAG:
1780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
1787d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(ioim->iosp->abort_explicit != BFA_TRUE);
1788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->iosp->abort_explicit = BFA_FALSE;
1789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_ioim_send_abort(ioim))
1791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else {
1793a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(ioim->itnim, qwait);
1795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_reqq_wait(ioim->bfa, ioim->reqq,
1796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					  &ioim->iosp->reqq_wait);
1797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
1801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1802a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
18125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO is being cleaned up (implicit abort), waiting for completion from
1814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * firmware.
1815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
1820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
1821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP_GOOD:
1824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP:
1825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_DONE:
1826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_FREE:
1827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT:
18305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
1831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * IO is already being aborted implicitly
1832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->io_cbfn = __bfa_cb_ioim_abort;
1834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT_DONE:
1837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
1840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT_COMP:
1843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
1846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP_UTAG:
1849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
1852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
1855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1858a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1859a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1860a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
18625fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
1863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * IO can be in cleanup state already due to TM command.
1864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * 2nd cleanup request comes from ITN offline event.
1865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1866a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1867a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1868a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
18735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1874da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is waiting for room in request CQ
1875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1877a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
1880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
1881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1882a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_QRESUME:
1884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_active);
1885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_send_ioreq(ioim);
1886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT:
1889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
1897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
1902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
1905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1914a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
19175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1918da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Active IO is being aborted, waiting for room in request CQ.
1919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1923a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
1924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
1925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_QRESUME:
1928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_abort);
1929a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_send_abort(ioim);
1930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1932a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
1933d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(ioim->iosp->abort_explicit != BFA_TRUE);
1934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->iosp->abort_explicit = BFA_FALSE;
1935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull);
1936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1937a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP_GOOD:
1939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP:
1940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1944a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_DONE:
1948a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
1949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort,
1952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
1956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
1959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
1960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
1961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
1965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
19685fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1969da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Active IO is being cleaned up, waiting for room in request CQ.
1970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
1973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
1975a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
1976a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
1978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_QRESUME:
1979a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup);
1980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_send_abort(ioim);
1981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_ABORT:
19845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
1985b595076a180a56d1bb170e6eceda6eb9d76f4cd3Uwe Kleine-König		 * IO is already being cleaned up implicitly
1986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->io_cbfn = __bfa_cb_ioim_abort;
1988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1989a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP_GOOD:
1991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_COMP:
1992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
1993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
1994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
1995a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
1996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_DONE:
1999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
2000a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
2001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
2002a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
2003a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2004a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2005a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
2006a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
2007a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&ioim->iosp->reqq_wait);
2008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_move_to_comp_q(ioim);
2009a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed,
2010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			      ioim);
2011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2012a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
2014a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
2015a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2016a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2017a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
20185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2019a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO bfa callback is pending.
2020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2022a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_hcb(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
2023a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2024a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
2025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HCB:
2026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_uninit);
2027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_free(ioim);
2028a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2029a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2030a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
2031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
2032a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2033a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2034a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
2035a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2037a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
2038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
2039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
20425fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO bfa callback is pending. IO resource cannot be freed.
2044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2045a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
2047a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
2049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
2050a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2051a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
2052a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HCB:
2053a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_resfree);
2054a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_del(&ioim->qe);
2055a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_add_tail(&ioim->qe, &ioim->fcpim->ioim_resfree_q);
2056a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2057a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2058a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_FREE:
2059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
2060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2061a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2062a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
2063a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
2064a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2065a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2066a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
2067a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_hcb);
2068a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2069a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2070a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
2071a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
2072a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2073a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
20755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2076a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO is completed, waiting resource free from firmware.
2077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_resfree(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
2080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
2082a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, event);
2083a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2084a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
2085a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_FREE:
2086a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_uninit);
2087a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_free(ioim);
2088a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2090a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_CLEANUP:
2091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_notify_cleanup(ioim);
2092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2093a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2094a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_IOIM_SM_HWFAIL:
2095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2097a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
2098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioim->bfa, event);
2099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
210283763d591b343b07331cebe86715205230c568b1Krishna Gudipati/*
210383763d591b343b07331cebe86715205230c568b1Krishna Gudipati * This is called from bfa_fcpim_start after the bfa_init() with flash read
210483763d591b343b07331cebe86715205230c568b1Krishna Gudipati * is complete by driver. now invalidate the stale content of lun mask
210583763d591b343b07331cebe86715205230c568b1Krishna Gudipati * like unit attention, rp tag and lp tag.
210683763d591b343b07331cebe86715205230c568b1Krishna Gudipati */
210783763d591b343b07331cebe86715205230c568b1Krishna Gudipatistatic void
210883763d591b343b07331cebe86715205230c568b1Krishna Gudipatibfa_ioim_lm_init(struct bfa_s *bfa)
210983763d591b343b07331cebe86715205230c568b1Krishna Gudipati{
211083763d591b343b07331cebe86715205230c568b1Krishna Gudipati	struct bfa_lun_mask_s *lunm_list;
211183763d591b343b07331cebe86715205230c568b1Krishna Gudipati	int	i;
211283763d591b343b07331cebe86715205230c568b1Krishna Gudipati
211383763d591b343b07331cebe86715205230c568b1Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG)
211483763d591b343b07331cebe86715205230c568b1Krishna Gudipati		return;
211583763d591b343b07331cebe86715205230c568b1Krishna Gudipati
211683763d591b343b07331cebe86715205230c568b1Krishna Gudipati	lunm_list = bfa_get_lun_mask_list(bfa);
211783763d591b343b07331cebe86715205230c568b1Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
211883763d591b343b07331cebe86715205230c568b1Krishna Gudipati		lunm_list[i].ua = BFA_IOIM_LM_UA_RESET;
211983763d591b343b07331cebe86715205230c568b1Krishna Gudipati		lunm_list[i].lp_tag = BFA_LP_TAG_INVALID;
212083763d591b343b07331cebe86715205230c568b1Krishna Gudipati		lunm_list[i].rp_tag = BFA_RPORT_TAG_INVALID;
212183763d591b343b07331cebe86715205230c568b1Krishna Gudipati	}
212283763d591b343b07331cebe86715205230c568b1Krishna Gudipati}
212383763d591b343b07331cebe86715205230c568b1Krishna Gudipati
2124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_good_comp(void *cbarg, bfa_boolean_t complete)
2126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2127a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim = cbarg;
2128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!complete) {
2130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
2132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2134a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_ioim_good_comp(ioim->bfa->bfad, ioim->dio);
2135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_comp(void *cbarg, bfa_boolean_t complete)
2139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s	*ioim = cbarg;
2141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioim_rsp_s *m;
2142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u8	*snsinfo = NULL;
2143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u8	sns_len = 0;
2144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	s32	residue = 0;
2145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!complete) {
2147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
2149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = (struct bfi_ioim_rsp_s *) &ioim->iosp->comp_rspmsg;
2152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (m->io_status == BFI_IOIM_STS_OK) {
21535fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
2154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * setup sense information, if present
2155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
2156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if ((m->scsi_status == SCSI_STATUS_CHECK_CONDITION) &&
2157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					m->sns_len) {
2158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			sns_len = m->sns_len;
2159e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			snsinfo = BFA_SNSINFO_FROM_TAG(ioim->fcpim->fcp,
2160e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati						ioim->iotag);
2161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
2162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
21635fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
2164a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * setup residue value correctly for normal completions
2165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
2166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (m->resid_flags == FCP_RESID_UNDER) {
2167ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			residue = be32_to_cpu(m->residue);
2168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(ioim->itnim, iocomp_underrun);
2169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
2170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (m->resid_flags == FCP_RESID_OVER) {
2171ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			residue = be32_to_cpu(m->residue);
2172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			residue = -residue;
2173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(ioim->itnim, iocomp_overrun);
2174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
2175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, m->io_status,
2178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			  m->scsi_status, sns_len, snsinfo, residue);
2179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
218183763d591b343b07331cebe86715205230c568b1Krishna Gudipativoid
218283763d591b343b07331cebe86715205230c568b1Krishna Gudipatibfa_fcpim_lunmask_rp_update(struct bfa_s *bfa, wwn_t lp_wwn, wwn_t rp_wwn,
218383763d591b343b07331cebe86715205230c568b1Krishna Gudipati			u16 rp_tag, u8 lp_tag)
218483763d591b343b07331cebe86715205230c568b1Krishna Gudipati{
218583763d591b343b07331cebe86715205230c568b1Krishna Gudipati	struct bfa_lun_mask_s *lun_list;
218683763d591b343b07331cebe86715205230c568b1Krishna Gudipati	u8	i;
218783763d591b343b07331cebe86715205230c568b1Krishna Gudipati
218883763d591b343b07331cebe86715205230c568b1Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG)
218983763d591b343b07331cebe86715205230c568b1Krishna Gudipati		return;
219083763d591b343b07331cebe86715205230c568b1Krishna Gudipati
219183763d591b343b07331cebe86715205230c568b1Krishna Gudipati	lun_list = bfa_get_lun_mask_list(bfa);
219283763d591b343b07331cebe86715205230c568b1Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
219383763d591b343b07331cebe86715205230c568b1Krishna Gudipati		if (lun_list[i].state == BFA_IOIM_LUN_MASK_ACTIVE) {
219483763d591b343b07331cebe86715205230c568b1Krishna Gudipati			if ((lun_list[i].lp_wwn == lp_wwn) &&
219583763d591b343b07331cebe86715205230c568b1Krishna Gudipati			    (lun_list[i].rp_wwn == rp_wwn)) {
219683763d591b343b07331cebe86715205230c568b1Krishna Gudipati				lun_list[i].rp_tag = rp_tag;
219783763d591b343b07331cebe86715205230c568b1Krishna Gudipati				lun_list[i].lp_tag = lp_tag;
219883763d591b343b07331cebe86715205230c568b1Krishna Gudipati			}
219983763d591b343b07331cebe86715205230c568b1Krishna Gudipati		}
220083763d591b343b07331cebe86715205230c568b1Krishna Gudipati	}
220183763d591b343b07331cebe86715205230c568b1Krishna Gudipati}
220283763d591b343b07331cebe86715205230c568b1Krishna Gudipati
22034c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati/*
22044c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati * set UA for all active luns in LM DB
22054c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati */
22064c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatistatic void
22074c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_ioim_lm_set_ua(struct bfa_s *bfa)
22084c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
22094c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_lun_mask_s	*lunm_list;
22104c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	int	i;
22114c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22124c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list = bfa_get_lun_mask_list(bfa);
22134c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
22144c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if (lunm_list[i].state != BFA_IOIM_LUN_MASK_ACTIVE)
22154c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			continue;
22164c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		lunm_list[i].ua = BFA_IOIM_LM_UA_SET;
22174c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
22184c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
22194c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22204c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t
22214c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_update(struct bfa_s *bfa, u32 update)
22224c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
22234c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_lunmask_cfg_s	*lun_mask;
22244c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22254c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, bfa_get_lun_mask_status(bfa));
22264c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG)
22274c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		return BFA_STATUS_FAILED;
22284c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22294c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == update)
22304c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		return BFA_STATUS_NO_CHANGE;
22314c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22324c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lun_mask = bfa_get_lun_mask(bfa);
22334c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lun_mask->status = update;
22344c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22354c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_ENABLED)
22364c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		bfa_ioim_lm_set_ua(bfa);
22374c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22384c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return  bfa_dconf_update(bfa);
22394c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
22404c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22414c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t
22424c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_clear(struct bfa_s *bfa)
22434c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
22444c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	int i;
22454c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_lun_mask_s	*lunm_list;
22464c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22474c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, bfa_get_lun_mask_status(bfa));
22484c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG)
22494c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		return BFA_STATUS_FAILED;
22504c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22514c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list = bfa_get_lun_mask_list(bfa);
22524c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
22534c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if (lunm_list[i].state == BFA_IOIM_LUN_MASK_ACTIVE) {
22544c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			if (lunm_list[i].rp_tag != BFA_RPORT_TAG_INVALID)
22554c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				bfa_rport_unset_lunmask(bfa,
22564c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				  BFA_RPORT_FROM_TAG(bfa, lunm_list[i].rp_tag));
22574c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		}
22584c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
22594c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22604c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	memset(lunm_list, 0, sizeof(struct bfa_lun_mask_s) * MAX_LUN_MASK_CFG);
22614c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return bfa_dconf_update(bfa);
22624c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
22634c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22644c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t
22654c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_query(struct bfa_s *bfa, void *buf)
22664c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
22674c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_lunmask_cfg_s *lun_mask;
22684c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22694c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, bfa_get_lun_mask_status(bfa));
22704c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG)
22714c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		return BFA_STATUS_FAILED;
22724c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22734c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lun_mask = bfa_get_lun_mask(bfa);
22744c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	memcpy(buf, lun_mask, sizeof(struct bfa_lunmask_cfg_s));
22754c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return BFA_STATUS_OK;
22764c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
22774c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22784c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t
22794c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_add(struct bfa_s *bfa, u16 vf_id, wwn_t *pwwn,
22804c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		      wwn_t rpwwn, struct scsi_lun lun)
22814c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
22824c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_lun_mask_s *lunm_list;
22834c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_rport_s *rp = NULL;
22844c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	int i, free_index = MAX_LUN_MASK_CFG + 1;
22854c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_fcs_lport_s *port = NULL;
22864c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_fcs_rport_s *rp_fcs;
22874c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22884c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, bfa_get_lun_mask_status(bfa));
22894c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG)
22904c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		return BFA_STATUS_FAILED;
22914c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
22924c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	port = bfa_fcs_lookup_port(&((struct bfad_s *)bfa->bfad)->bfa_fcs,
22934c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				   vf_id, *pwwn);
22944c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (port) {
22954c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		*pwwn = port->port_cfg.pwwn;
22964c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		rp_fcs = bfa_fcs_lport_get_rport_by_pwwn(port, rpwwn);
22976bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati		if (rp_fcs)
22986bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati			rp = rp_fcs->bfa_rport;
22994c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
23004c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23014c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list = bfa_get_lun_mask_list(bfa);
23024c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	/* if entry exists */
23034c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
23044c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if (lunm_list[i].state != BFA_IOIM_LUN_MASK_ACTIVE)
23054c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			free_index = i;
23064c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if ((lunm_list[i].lp_wwn == *pwwn) &&
23074c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		    (lunm_list[i].rp_wwn == rpwwn) &&
23084c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		    (scsilun_to_int((struct scsi_lun *)&lunm_list[i].lun) ==
23094c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		     scsilun_to_int((struct scsi_lun *)&lun)))
23104c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			return  BFA_STATUS_ENTRY_EXISTS;
23114c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
23124c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23134c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (free_index > MAX_LUN_MASK_CFG)
23144c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		return BFA_STATUS_MAX_ENTRY_REACHED;
23154c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23164c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (rp) {
23174c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		lunm_list[free_index].lp_tag = bfa_lps_get_tag_from_pid(bfa,
23184c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati						   rp->rport_info.local_pid);
23194c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		lunm_list[free_index].rp_tag = rp->rport_tag;
23204c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	} else {
23214c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		lunm_list[free_index].lp_tag = BFA_LP_TAG_INVALID;
23224c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		lunm_list[free_index].rp_tag = BFA_RPORT_TAG_INVALID;
23234c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
23244c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23254c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list[free_index].lp_wwn = *pwwn;
23264c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list[free_index].rp_wwn = rpwwn;
23274c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list[free_index].lun = lun;
23284c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list[free_index].state = BFA_IOIM_LUN_MASK_ACTIVE;
23294c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23304c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	/* set for all luns in this rp */
23314c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
23324c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if ((lunm_list[i].lp_wwn == *pwwn) &&
23334c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		    (lunm_list[i].rp_wwn == rpwwn))
23344c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			lunm_list[i].ua = BFA_IOIM_LM_UA_SET;
23354c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
23364c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23374c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return bfa_dconf_update(bfa);
23384c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
23394c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23404c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t
23414c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_delete(struct bfa_s *bfa, u16 vf_id, wwn_t *pwwn,
23424c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			 wwn_t rpwwn, struct scsi_lun lun)
23434c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
23444c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_lun_mask_s	*lunm_list;
23454c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_rport_s	*rp = NULL;
23464c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_fcs_lport_s *port = NULL;
23474c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_fcs_rport_s *rp_fcs;
23484c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	int	i;
23494c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23504c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	/* in min cfg lunm_list could be NULL but  no commands should run. */
23514c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG)
23524c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		return BFA_STATUS_FAILED;
23534c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23544c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, bfa_get_lun_mask_status(bfa));
23554c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, *pwwn);
23564c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, rpwwn);
23574c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	bfa_trc(bfa, scsilun_to_int((struct scsi_lun *)&lun));
23584c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23594c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (*pwwn == 0) {
23604c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		port = bfa_fcs_lookup_port(
23614c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				&((struct bfad_s *)bfa->bfad)->bfa_fcs,
23624c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				vf_id, *pwwn);
23634c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if (port) {
23644c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			*pwwn = port->port_cfg.pwwn;
23654c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			rp_fcs = bfa_fcs_lport_get_rport_by_pwwn(port, rpwwn);
23666bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati			if (rp_fcs)
23676bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati				rp = rp_fcs->bfa_rport;
23684c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		}
23694c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
23704c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23714c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	lunm_list = bfa_get_lun_mask_list(bfa);
23724c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
23734c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if ((lunm_list[i].lp_wwn == *pwwn) &&
23744c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		    (lunm_list[i].rp_wwn == rpwwn) &&
23754c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		    (scsilun_to_int((struct scsi_lun *)&lunm_list[i].lun) ==
23764c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		     scsilun_to_int((struct scsi_lun *)&lun))) {
23774c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			lunm_list[i].lp_wwn = 0;
23784c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			lunm_list[i].rp_wwn = 0;
23794c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			int_to_scsilun(0, &lunm_list[i].lun);
23804c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			lunm_list[i].state = BFA_IOIM_LUN_MASK_INACTIVE;
23814c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			if (lunm_list[i].rp_tag != BFA_RPORT_TAG_INVALID) {
23824c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				lunm_list[i].rp_tag = BFA_RPORT_TAG_INVALID;
23834c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				lunm_list[i].lp_tag = BFA_LP_TAG_INVALID;
23844c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			}
23854c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			return bfa_dconf_update(bfa);
23864c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		}
23874c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
23884c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23894c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	/* set for all luns in this rp */
23904c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	for (i = 0; i < MAX_LUN_MASK_CFG; i++) {
23914c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		if ((lunm_list[i].lp_wwn == *pwwn) &&
23924c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		    (lunm_list[i].rp_wwn == rpwwn))
23934c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			lunm_list[i].ua = BFA_IOIM_LM_UA_SET;
23944c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	}
23954c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23964c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return BFA_STATUS_ENTRY_NOT_EXISTS;
23974c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
23984c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
239983763d591b343b07331cebe86715205230c568b1Krishna Gudipatistatic void
2400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_failed(void *cbarg, bfa_boolean_t complete)
2401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2402a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim = cbarg;
2403a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!complete) {
2405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
2407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, BFI_IOIM_STS_ABORTED,
2410a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			  0, 0, NULL, 0);
2411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2414a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_pathtov(void *cbarg, bfa_boolean_t complete)
2415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim = cbarg;
2417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(ioim->itnim, path_tov_expired);
2419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!complete) {
2420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2421a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
2422a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2424a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, BFI_IOIM_STS_PATHTOV,
2425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			  0, 0, NULL, 0);
2426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_abort(void *cbarg, bfa_boolean_t complete)
2430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim = cbarg;
2432a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2433a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!complete) {
2434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB);
2435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
2436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_ioim_abort(ioim->bfa->bfad, ioim->dio);
2439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sgpg_alloced(void *cbarg)
2443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim = cbarg;
2445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->nsgpgs = BFA_SGPG_NPAGE(ioim->nsges);
2447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_splice_tail_init(&ioim->iosp->sgpg_wqe.sgpg_q, &ioim->sgpg_q);
2448e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	ioim->sgpg = bfa_q_first(&ioim->sgpg_q);
2449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_SGALLOCED);
2450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
24525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Send I/O request to firmware.
2454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic	bfa_boolean_t
2456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_send_ioreq(struct bfa_ioim_s *ioim)
2457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = ioim->itnim;
2459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioim_req_s *m;
2460da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang	static struct fcp_cmnd_s cmnd_z0 = { { { 0 } } };
2461e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	struct bfi_sge_s *sge, *sgpge;
2462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	pgdlen = 0;
2463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	fcp_dl;
2464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u64 addr;
2465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct scatterlist *sg;
2466e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	struct bfa_sgpg_s *sgpg;
2467a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct scsi_cmnd *cmnd = (struct scsi_cmnd *) ioim->dio;
2468e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	u32 i, sge_id, pgcumsz;
2469f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	enum dma_data_direction dmadir;
2470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
24715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2472a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * check for room in queue to send request now
2473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(ioim->bfa, ioim->reqq);
2475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m) {
2476a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, qwait);
2477a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wait(ioim->bfa, ioim->reqq,
2478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				  &ioim->iosp->reqq_wait);
2479a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
2480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
24825fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * build i/o request message next
2484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2485ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	m->io_tag = cpu_to_be16(ioim->iotag);
2486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->rport_hdl = ioim->itnim->rport->fw_handle;
2487f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	m->io_timeout = 0;
2488a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	sge = &m->sges[0];
2490e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	sgpg = ioim->sgpg;
2491e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	sge_id = 0;
2492e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	sgpge = NULL;
2493e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	pgcumsz = 0;
2494e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	scsi_for_each_sg(cmnd, sg, ioim->nsges, i) {
2495e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang		if (i == 0) {
2496e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			/* build inline IO SG element */
2497f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang			addr = bfa_sgaddr_le(sg_dma_address(sg));
2498e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			sge->sga = *(union bfi_addr_u *) &addr;
2499e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			pgdlen = sg_dma_len(sg);
2500e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			sge->sg_len = pgdlen;
2501e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			sge->flags = (ioim->nsges > BFI_SGE_INLINE) ?
2502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					BFI_SGE_DATA_CPL : BFI_SGE_DATA_LAST;
2503e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			bfa_sge_to_be(sge);
2504e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			sge++;
2505e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang		} else {
2506e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			if (sge_id == 0)
2507e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge = sgpg->sgpg->sges;
2508e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang
2509f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang			addr = bfa_sgaddr_le(sg_dma_address(sg));
2510e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			sgpge->sga = *(union bfi_addr_u *) &addr;
2511e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			sgpge->sg_len = sg_dma_len(sg);
2512e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			pgcumsz += sgpge->sg_len;
2513e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang
2514e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			/* set flags */
2515e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			if (i < (ioim->nsges - 1) &&
2516e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang					sge_id < (BFI_SGPG_DATA_SGES - 1))
2517e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->flags = BFI_SGE_DATA;
2518e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			else if (i < (ioim->nsges - 1))
2519e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->flags = BFI_SGE_DATA_CPL;
2520e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			else
2521e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->flags = BFI_SGE_DATA_LAST;
2522e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang
2523e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			bfa_sge_to_le(sgpge);
2524e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang
2525e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			sgpge++;
2526e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			if (i == (ioim->nsges - 1)) {
2527e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->flags = BFI_SGE_PGDLEN;
2528e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->sga.a32.addr_lo = 0;
2529e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->sga.a32.addr_hi = 0;
2530e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->sg_len = pgcumsz;
2531e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				bfa_sge_to_le(sgpge);
2532e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			} else if (++sge_id == BFI_SGPG_DATA_SGES) {
2533e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpg = (struct bfa_sgpg_s *) bfa_q_next(sgpg);
2534e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->flags = BFI_SGE_LINK;
2535e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->sga = sgpg->sgpg_pa;
2536e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sgpge->sg_len = pgcumsz;
2537e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				bfa_sge_to_le(sgpge);
2538e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				sge_id = 0;
2539e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang				pgcumsz = 0;
2540e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang			}
2541e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang		}
2542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (ioim->nsges > BFI_SGE_INLINE) {
2545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		sge->sga = ioim->sgpg->sgpg_pa;
2546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	} else {
2547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		sge->sga.a32.addr_lo = 0;
2548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		sge->sga.a32.addr_hi = 0;
2549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	sge->sg_len = pgdlen;
2551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	sge->flags = BFI_SGE_PGDLEN;
2552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sge_to_be(sge);
2553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
25545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * set up I/O command parameters
2556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
25576a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	m->cmnd = cmnd_z0;
2558f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	int_to_scsilun(cmnd->device->lun, &m->cmnd.lun);
2559f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	dmadir = cmnd->sc_data_direction;
2560f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	if (dmadir == DMA_TO_DEVICE)
2561f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		m->cmnd.iodir = FCP_IODIR_WRITE;
2562f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	else if (dmadir == DMA_FROM_DEVICE)
2563f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		m->cmnd.iodir = FCP_IODIR_READ;
2564f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	else
2565f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		m->cmnd.iodir = FCP_IODIR_NONE;
2566f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang
25678f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang	m->cmnd.cdb = *(struct scsi_cdb_s *) cmnd->cmnd;
2568f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	fcp_dl = scsi_bufflen(cmnd);
2569ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	m->cmnd.fcp_dl = cpu_to_be32(fcp_dl);
2570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
25715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * set up I/O message header
2573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (m->cmnd.iodir) {
2575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_IODIR_READ:
25763fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		bfi_h2i_set(m->mh, BFI_MC_IOIM_READ, 0, bfa_fn_lpu(ioim->bfa));
2577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, input_reqs);
2578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->itnim->stats.rd_throughput += fcp_dl;
2579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_IODIR_WRITE:
25813fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		bfi_h2i_set(m->mh, BFI_MC_IOIM_WRITE, 0, bfa_fn_lpu(ioim->bfa));
2582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, output_reqs);
2583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->itnim->stats.wr_throughput += fcp_dl;
2584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_IODIR_RW:
2586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, input_reqs);
2587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, output_reqs);
2588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
25893fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_fn_lpu(ioim->bfa));
2590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (itnim->seq_rec ||
2592f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	    (scsi_bufflen(cmnd) & (sizeof(u32) - 1)))
25933fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_fn_lpu(ioim->bfa));
2594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
25955fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * queue I/O message to firmware
2597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
25983fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_reqq_produce(ioim->bfa, ioim->reqq, m->mh);
2599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
2600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Setup any additional SG pages needed.Inline SG element is setup
2604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * at queuing time.
2605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t
2607e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhangbfa_ioim_sgpg_alloc(struct bfa_ioim_s *ioim)
2608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u16	nsgpgs;
2610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2611d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(ioim->nsges <= BFI_SGE_INLINE);
2612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * allocate SG pages needed
2615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	nsgpgs = BFA_SGPG_NPAGE(ioim->nsges);
2617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!nsgpgs)
2618a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_TRUE;
2619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa_sgpg_malloc(ioim->bfa, &ioim->sgpg_q, nsgpgs)
2621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	    != BFA_STATUS_OK) {
2622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sgpg_wait(ioim->bfa, &ioim->iosp->sgpg_wqe, nsgpgs);
2623a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
2624a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2625a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2626a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->nsgpgs = nsgpgs;
2627e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang	ioim->sgpg = bfa_q_first(&ioim->sgpg_q);
2628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2629a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
2630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26325fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2633a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Send I/O abort request to firmware.
2634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2635a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic	bfa_boolean_t
2636a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_send_abort(struct bfa_ioim_s *ioim)
2637a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioim_abort_req_s *m;
2639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	enum bfi_ioim_h2i	msgop;
2640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * check for room in queue to send request now
2643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(ioim->bfa, ioim->reqq);
2645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m)
2646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
2647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * build i/o request message next
2650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (ioim->iosp->abort_explicit)
2652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		msgop = BFI_IOIM_H2I_IOABORT_REQ;
2653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else
2654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		msgop = BFI_IOIM_H2I_IOCLEANUP_REQ;
2655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26563fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_IOIM, msgop, bfa_fn_lpu(ioim->bfa));
2657ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	m->io_tag    = cpu_to_be16(ioim->iotag);
2658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->abort_tag = ++ioim->abort_tag;
2659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26605fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * queue I/O message to firmware
2662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
26633fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_reqq_produce(ioim->bfa, ioim->reqq, m->mh);
2664a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
2665a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
26675fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2668a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Call to resume any I/O requests waiting for room in request queue.
2669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_qresume(void *cbarg)
2672a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim = cbarg;
2674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(ioim->itnim, qresumes);
2676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_QRESUME);
2677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_notify_cleanup(struct bfa_ioim_s *ioim)
2682a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
26835fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Move IO from itnim queue to fcpim global queue since itnim will be
2685a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * freed.
2686a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_del(&ioim->qe);
2688a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
2689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!ioim->iosp->tskim) {
2691a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (ioim->fcpim->delay_comp && ioim->itnim->iotov_active) {
2692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_dequeue(&ioim->hcb_qe);
2693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_del(&ioim->qe);
2694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_add_tail(&ioim->qe, &ioim->itnim->delay_comp_q);
2695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
2696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_iodone(ioim->itnim);
2697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	} else
2698f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_wc_down(&ioim->iosp->tskim->wc);
2699a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2700a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t
2702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_is_abortable(struct bfa_ioim_s *ioim)
2703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((bfa_sm_cmp_state(ioim, bfa_ioim_sm_uninit) &&
2705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	    (!bfa_q_is_on_q(&ioim->itnim->pending_q, ioim)))	||
2706a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	    (bfa_sm_cmp_state(ioim, bfa_ioim_sm_abort))		||
2707a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	    (bfa_sm_cmp_state(ioim, bfa_ioim_sm_abort_qfull))	||
2708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	    (bfa_sm_cmp_state(ioim, bfa_ioim_sm_hcb))		||
2709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	    (bfa_sm_cmp_state(ioim, bfa_ioim_sm_hcb_free))	||
2710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	    (bfa_sm_cmp_state(ioim, bfa_ioim_sm_resfree)))
2711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
2712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
2714a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_delayed_comp(struct bfa_ioim_s *ioim, bfa_boolean_t iotov)
2718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
27195fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * If path tov timer expired, failback with PATHTOV status - these
2721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * IO requests are not normally retried by IO stack.
2722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *
2723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Otherwise device cameback online and fail it with normal failed
2724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * status so that IO stack retries these failed IO requests.
2725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (iotov)
2727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->io_cbfn = __bfa_cb_ioim_pathtov;
2728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else {
2729a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->io_cbfn = __bfa_cb_ioim_failed;
2730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocom_nexus_abort);
2731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim);
2733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Move IO to fcpim global queue since itnim will be
2736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * freed.
2737a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2738a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_del(&ioim->qe);
2739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
2740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27435fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Memory allocation and initialization.
2745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
27474507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_ioim_attach(struct bfa_fcpim_s *fcpim)
2748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s		*ioim;
27504507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_fcp_mod_s	*fcp = fcpim->fcp;
2751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_sp_s	*iosp;
2752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u16		i;
2753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * claim memory first
2756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
27574507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	ioim = (struct bfa_ioim_s *) bfa_mem_kva_curp(fcp);
2758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->ioim_arr = ioim;
27594507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_curp(fcp) = (u8 *) (ioim + fcpim->fcp->num_ioim_reqs);
2760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27614507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	iosp = (struct bfa_ioim_sp_s *) bfa_mem_kva_curp(fcp);
2762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->ioim_sp_arr = iosp;
27634507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_curp(fcp) = (u8 *) (iosp + fcpim->fcp->num_ioim_reqs);
2764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Initialize ioim free queues
2767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&fcpim->ioim_resfree_q);
2769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&fcpim->ioim_comp_q);
2770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2771e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	for (i = 0; i < fcpim->fcp->num_ioim_reqs;
2772e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	     i++, ioim++, iosp++) {
2773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		/*
2774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * initialize IOIM
2775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
27766a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang		memset(ioim, 0, sizeof(struct bfa_ioim_s));
2777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->iotag   = i;
2778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->bfa     = fcpim->bfa;
2779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->fcpim   = fcpim;
2780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim->iosp    = iosp;
2781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&ioim->sgpg_q);
2782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_winit(&ioim->iosp->reqq_wait,
2783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				   bfa_ioim_qresume, ioim);
2784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sgpg_winit(&ioim->iosp->sgpg_wqe,
2785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				   bfa_ioim_sgpg_alloced, ioim);
2786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(ioim, bfa_ioim_sm_uninit);
2787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
2792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2793e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
2794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioim_rsp_s *rsp = (struct bfi_ioim_rsp_s *) m;
2795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
2796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u16	iotag;
2797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	enum bfa_ioim_event evt = BFA_IOIM_SM_COMP;
2798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2799ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	iotag = be16_to_cpu(rsp->io_tag);
2800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim = BFA_IOIM_FROM_TAG(fcpim, iotag);
2802d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(ioim->iotag != iotag);
2803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
2805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, rsp->io_status);
2806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, rsp->reuse_io_tag);
2807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa_sm_cmp_state(ioim, bfa_ioim_sm_active))
28096a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang		ioim->iosp->comp_rspmsg = *m;
2810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (rsp->io_status) {
2812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_OK:
2813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocomp_ok);
2814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (rsp->reuse_io_tag == 0)
2815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			evt = BFA_IOIM_SM_DONE;
2816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
2817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			evt = BFA_IOIM_SM_COMP;
2818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_TIMEDOUT:
2821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocomp_timedout);
2822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_ABORTED:
2823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		rsp->io_status = BFI_IOIM_STS_ABORTED;
2824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocomp_aborted);
2825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (rsp->reuse_io_tag == 0)
2826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			evt = BFA_IOIM_SM_DONE;
2827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
2828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			evt = BFA_IOIM_SM_COMP;
2829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_PROTO_ERR:
2832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocom_proto_err);
2833d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(!rsp->reuse_io_tag);
2834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		evt = BFA_IOIM_SM_COMP;
2835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_SQER_NEEDED:
2838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocom_sqer_needed);
2839d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(rsp->reuse_io_tag != 0);
2840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		evt = BFA_IOIM_SM_SQRETRY;
2841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_RES_FREE:
2844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocom_res_free);
2845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		evt = BFA_IOIM_SM_FREE;
2846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_HOST_ABORTED:
2849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocom_hostabrts);
2850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (rsp->abort_tag != ioim->abort_tag) {
2851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_trc(ioim->bfa, rsp->abort_tag);
2852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_trc(ioim->bfa, ioim->abort_tag);
2853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			return;
2854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
2855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (rsp->reuse_io_tag)
2857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			evt = BFA_IOIM_SM_ABORT_COMP;
2858a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
2859a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			evt = BFA_IOIM_SM_ABORT_DONE;
2860a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2862a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOIM_STS_UTAG:
2863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(ioim->itnim, iocom_utags);
2864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		evt = BFA_IOIM_SM_COMP_UTAG;
2865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
2866a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2867a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
2868d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
2869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, evt);
2872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2873a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2874a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_good_comp_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
2876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2877e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
2878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioim_rsp_s *rsp = (struct bfi_ioim_rsp_s *) m;
2879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
2880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u16	iotag;
2881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2882ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	iotag = be16_to_cpu(rsp->io_tag);
2883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim = BFA_IOIM_FROM_TAG(fcpim, iotag);
28851287641e945de1bf533178c2e0e31eed287b4a60Vijaya Mohan Guvva	WARN_ON(ioim->iotag != iotag);
2886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioim_cb_profile_comp(fcpim, ioim);
288883763d591b343b07331cebe86715205230c568b1Krishna Gudipati
28898ca2dd87e7f29df99389e9dc41f7a45a35223672Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_COMP_GOOD);
2890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
28925fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Called by itnim to clean up IO while going offline.
2894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_cleanup(struct bfa_ioim_s *ioim)
2897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
2899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(ioim->itnim, io_cleanups);
2900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->iosp->tskim = NULL;
2902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_CLEANUP);
2903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_cleanup_tm(struct bfa_ioim_s *ioim, struct bfa_tskim_s *tskim)
2907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
2909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(ioim->itnim, io_tmaborts);
2910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->iosp->tskim = tskim;
2912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_CLEANUP);
2913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2914a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
29155fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC failure handling.
2917a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2918a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_iocdisable(struct bfa_ioim_s *ioim)
2920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
2922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(ioim->itnim, io_iocdowns);
2923a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_HWFAIL);
2924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
29265fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO offline TOV popped. Fail the pending IO.
2928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2929a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_tov(struct bfa_ioim_s *ioim)
2931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2932a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
2933a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_IOTOV);
2934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
29375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Allocate IOIM resource for initiator mode I/O request.
2939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistruct bfa_ioim_s *
2941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_alloc(struct bfa_s *bfa, struct bfad_ioim_s *dio,
2942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		struct bfa_itnim_s *itnim, u16 nsges)
2943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2944e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
2945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
2946e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_iotag_s *iotag = NULL;
2947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
29485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * alocate IOIM resource
2950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2951e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	bfa_q_deq(&fcpim->fcp->iotag_ioim_free_q, &iotag);
2952e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	if (!iotag) {
2953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(itnim, no_iotags);
2954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return NULL;
2955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2957e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	ioim = BFA_IOIM_FROM_TAG(fcpim, iotag->tag);
2958e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
2959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->dio = dio;
2960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->itnim = itnim;
2961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->nsges = nsges;
2962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->nsgpgs = 0;
2963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, total_ios);
2965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->ios_active++;
2966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&ioim->qe, &itnim->io_q);
2968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return ioim;
2970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_free(struct bfa_ioim_s *ioim)
2974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2975e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = ioim->fcpim;
2976e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_iotag_s *iotag;
2977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (ioim->nsgpgs > 0)
2979a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sgpg_mfree(ioim->bfa, &ioim->sgpg_q, ioim->nsgpgs);
2980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(ioim->itnim, io_comps);
2982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->ios_active--;
2983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
298415821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati	ioim->iotag &= BFA_IOIM_IOTAG_MASK;
2985e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
2986e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	WARN_ON(!(ioim->iotag <
2987e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		(fcpim->fcp->num_ioim_reqs + fcpim->fcp->num_fwtio_reqs)));
2988e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	iotag = BFA_IOTAG_FROM_TAG(fcpim->fcp, ioim->iotag);
2989e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
2990e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	if (ioim->iotag < fcpim->fcp->num_ioim_reqs)
2991e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		list_add_tail(&iotag->qe, &fcpim->fcp->iotag_ioim_free_q);
2992e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	else
2993e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		list_add_tail(&iotag->qe, &fcpim->fcp->iotag_tio_free_q);
2994e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
2995a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_del(&ioim->qe);
2996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_start(struct bfa_ioim_s *ioim)
3000a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioim_cb_profile_start(ioim->fcpim, ioim);
3002a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
30035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3004a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Obtain the queue over which this request has to be issued
3005a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3006a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioim->reqq = bfa_fcpim_ioredirect_enabled(ioim->bfa) ?
3007f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang			BFA_FALSE : bfa_itnim_get_reqq(ioim);
3008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3009a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_START);
3010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
30125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Driver I/O abort request.
3014a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3015a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t
3016a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_abort(struct bfa_ioim_s *ioim)
3017a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3018a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3019a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioim->bfa, ioim->iotag);
3020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!bfa_ioim_is_abortable(ioim))
3022a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_FAILED;
3023a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3024a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(ioim->itnim, io_aborts);
3025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(ioim, BFA_IOIM_SM_ABORT);
3026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_STATUS_OK;
3028a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3029a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
30305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  BFA TSKIM state machine functions
3032a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3033a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
30345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3035da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Task management command beginning state.
3036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3037a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_uninit(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
3039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
30401306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
3041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3042a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
3043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_START:
3044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_active);
3045a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_gather_ios(tskim);
3046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
30475fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
3048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * If device is offline, do not send TM on wire. Just cleanup
3049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * any pending IO requests and complete TM request.
3050a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
3051a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_itnim_is_online(tskim->itnim)) {
3052a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup);
3053a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			tskim->tsk_status = BFI_TSKIM_STS_OK;
3054a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_tskim_cleanup_ios(tskim);
3055a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			return;
3056a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
3057a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3058a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_tskim_send(tskim)) {
3059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(tskim, bfa_tskim_sm_qfull);
3060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(tskim->itnim, tm_qwait);
3061a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_reqq_wait(tskim->bfa, tskim->itnim->reqq,
3062a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					  &tskim->reqq_wait);
3063a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
3064a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3065a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3066a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3067a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(tskim->bfa, event);
3068a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3069a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3070a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
30715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3072da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * TM command is active, awaiting completion from firmware to
3073da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * cleanup IO requests in TM scope.
3074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3075a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3076a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_active(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
3077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
30781306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
3079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
3081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_DONE:
3082a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup);
3083a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_cleanup_ios(tskim);
3084a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3085a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3086a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_CLEANUP:
3087a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_cleanup);
3088a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_tskim_send_abort(tskim)) {
3089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_sm_set_state(tskim, bfa_tskim_sm_cleanup_qfull);
3090a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_stats(tskim->itnim, tm_qwait);
3091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_reqq_wait(tskim->bfa, tskim->itnim->reqq,
3092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				&tskim->reqq_wait);
3093a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
3094a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_HWFAIL:
3097a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_hcb);
3098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_iocdisable_ios(tskim);
3099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed);
3100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(tskim->bfa, event);
3104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
31075fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3108da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * An active TM is being cleaned up since ITN is offline. Awaiting cleanup
3109da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * completion event from firmware.
3110a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3112a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
3113a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
31141306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
3115a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3116a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
3117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_DONE:
31185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
3119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Ignore and wait for ABORT completion from firmware.
3120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
3121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
31231306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	case BFA_TSKIM_SM_UTAG:
3124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_CLEANUP_DONE:
3125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup);
3126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_cleanup_ios(tskim);
3127a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_HWFAIL:
3130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_hcb);
3131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_iocdisable_ios(tskim);
3132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed);
3133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3134a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(tskim->bfa, event);
3137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
3142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
31431306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
3144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
3146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_IOS_DONE:
3147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_hcb);
3148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_qcomp(tskim, __bfa_cb_tskim_done);
3149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_CLEANUP:
31525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
3153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Ignore, TM command completed on wire.
3154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Notify TM conmpletion on IO cleanup completion.
3155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
3156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_HWFAIL:
3159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_hcb);
3160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_iocdisable_ios(tskim);
3161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed);
3162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3164a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(tskim->bfa, event);
3166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
31695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3170da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Task management command is waiting for room in request CQ
3171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_qfull(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
3174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
31751306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
3176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
3178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_QRESUME:
3179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_active);
3180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_send(tskim);
3181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3182a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_CLEANUP:
31845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
3185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * No need to send TM on wire since ITN is offline.
3186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
3187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup);
3188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&tskim->reqq_wait);
3189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_cleanup_ios(tskim);
3190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_HWFAIL:
3193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_hcb);
3194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&tskim->reqq_wait);
3195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_iocdisable_ios(tskim);
3196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed);
3197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(tskim->bfa, event);
3201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
32045fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3205da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Task management command is active, awaiting for room in request CQ
3206da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * to send clean up request.
3207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim,
3210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		enum bfa_tskim_event event)
3211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
32121306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
3213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
3215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_DONE:
3216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&tskim->reqq_wait);
32175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
3218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Fall through !!!
3219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
3220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_QRESUME:
3221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_cleanup);
3222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_send_abort(tskim);
3223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_HWFAIL:
3226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_hcb);
3227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_wcancel(&tskim->reqq_wait);
3228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_iocdisable_ios(tskim);
3229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed);
3230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(tskim->bfa, event);
3234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
32375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3238da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * BFA callback is pending
3239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_hcb(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
3242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
32431306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
3244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
3246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_HCB:
3247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_uninit);
3248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_free(tskim);
3249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_CLEANUP:
3252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_tskim_notify_comp(tskim);
3253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFA_TSKIM_SM_HWFAIL:
3256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
3257a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(tskim->bfa, event);
3260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_tskim_done(void *cbarg, bfa_boolean_t complete)
3265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim = cbarg;
3267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!complete) {
3269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(tskim, BFA_TSKIM_SM_HCB);
3270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
3271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(tskim->itnim, tm_success);
3274a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_tskim_done(tskim->bfa->bfad, tskim->dtsk, tskim->tsk_status);
3275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_tskim_failed(void *cbarg, bfa_boolean_t complete)
3279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim = cbarg;
3281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!complete) {
3283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(tskim, BFA_TSKIM_SM_HCB);
3284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
3285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(tskim->itnim, tm_failures);
3288a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_cb_tskim_done(tskim->bfa->bfad, tskim->dtsk,
3289a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				BFI_TSKIM_STS_FAILED);
3290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3292da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhangstatic bfa_boolean_t
3293f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhangbfa_tskim_match_scope(struct bfa_tskim_s *tskim, struct scsi_lun lun)
3294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (tskim->tm_cmnd) {
3296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_TM_TARGET_RESET:
3297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_TRUE;
3298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3299a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_TM_ABORT_TASK_SET:
3300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_TM_CLEAR_TASK_SET:
3301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_TM_LUN_RESET:
3302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case FCP_TM_CLEAR_ACA:
3303da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang		return !memcmp(&tskim->lun, &lun, sizeof(lun));
3304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3305a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
3306d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
3307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3309a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_FALSE;
3310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3311a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
33125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3313da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Gather affected IO requests and task management commands.
3314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_gather_ios(struct bfa_tskim_s *tskim)
3317a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = tskim->itnim;
3319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
3320f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	struct list_head *qe, *qen;
3321f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	struct scsi_cmnd *cmnd;
3322f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang	struct scsi_lun scsilun;
3323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&tskim->io_q);
3325a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
33265fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Gather any active IO requests first.
3328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->io_q) {
3330a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
3331f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		cmnd = (struct scsi_cmnd *) ioim->dio;
3332f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		int_to_scsilun(cmnd->device->lun, &scsilun);
3333f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		if (bfa_tskim_match_scope(tskim, scsilun)) {
3334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_del(&ioim->qe);
3335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_add_tail(&ioim->qe, &tskim->io_q);
3336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
3337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
33395fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Failback any pending IO requests immediately.
3341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &itnim->pending_q) {
3343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
3344f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		cmnd = (struct scsi_cmnd *) ioim->dio;
3345f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		int_to_scsilun(cmnd->device->lun, &scsilun);
3346f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang		if (bfa_tskim_match_scope(tskim, scsilun)) {
3347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_del(&ioim->qe);
3348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q);
3349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_ioim_tov(ioim);
3350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
3351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
33545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3355da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO cleanup completion
3356a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3357a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3358a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_cleanp_comp(void *tskim_cbarg)
3359a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3360a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim = tskim_cbarg;
3361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(tskim->itnim, tm_io_comps);
3363a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(tskim, BFA_TSKIM_SM_IOS_DONE);
3364a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3365a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
33665fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3367da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Gather affected IO requests and task management commands.
3368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_cleanup_ios(struct bfa_tskim_s *tskim)
3371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3372a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
3373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head	*qe, *qen;
3374a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3375a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_wc_init(&tskim->wc, bfa_tskim_cleanp_comp, tskim);
3376a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3377a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &tskim->io_q) {
3378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
3379a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_wc_up(&tskim->wc);
3380a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_cleanup_tm(ioim, tskim);
3381a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3382a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3383a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_wc_wait(&tskim->wc);
3384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
33865fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3387da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Send task management request to firmware.
3388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t
3390a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_send(struct bfa_tskim_s *tskim)
3391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3392a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s *itnim = tskim->itnim;
3393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_tskim_req_s *m;
3394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
33955fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * check for room in queue to send request now
3397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(tskim->bfa, itnim->reqq);
3399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m)
3400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
3401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3403a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * build i/o request message next
3404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_TSKIM, BFI_TSKIM_H2I_TM_REQ,
34063fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati			bfa_fn_lpu(tskim->bfa));
3407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3408ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	m->tsk_tag = cpu_to_be16(tskim->tsk_tag);
3409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->itn_fhdl = tskim->itnim->rport->fw_handle;
3410a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->t_secs = tskim->tsecs;
3411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->lun = tskim->lun;
3412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->tm_flags = tskim->tm_cmnd;
3413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * queue I/O message to firmware
3416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
34173fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_reqq_produce(tskim->bfa, itnim->reqq, m->mh);
3418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
3419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34215fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3422da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Send abort request to cleanup an active TM to firmware.
3423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3424a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t
3425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_send_abort(struct bfa_tskim_s *tskim)
3426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_itnim_s	*itnim = tskim->itnim;
3428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_tskim_abortreq_s	*m;
3429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * check for room in queue to send request now
3432a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3433a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(tskim->bfa, itnim->reqq);
3434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m)
3435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
3436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * build i/o request message next
3439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_TSKIM, BFI_TSKIM_H2I_ABORT_REQ,
34413fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati			bfa_fn_lpu(tskim->bfa));
3442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3443ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	m->tsk_tag  = cpu_to_be16(tskim->tsk_tag);
3444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34455fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * queue I/O message to firmware
3447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
34483fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_reqq_produce(tskim->bfa, itnim->reqq, m->mh);
3449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
3450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3453da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Call to resume task management cmnd waiting for room in request queue.
3454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_qresume(void *cbarg)
3457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim = cbarg;
3459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(tskim->itnim, tm_qresumes);
3461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(tskim, BFA_TSKIM_SM_QRESUME);
3462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup IOs associated with a task mangement command on IOC failures.
3466a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3467a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
3468a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_iocdisable_ios(struct bfa_tskim_s *tskim)
3469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioim_s *ioim;
3471a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head	*qe, *qen;
3472a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, &tskim->io_q) {
3474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioim = (struct bfa_ioim_s *) qe;
3475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioim_iocdisable(ioim);
3476a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3477a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34795fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Notification on completions from related ioim.
3481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
3483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_iodone(struct bfa_tskim_s *tskim)
3484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3485a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_wc_down(&tskim->wc);
3486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Handle IOC h/w failure notification from itnim.
3490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
3492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_iocdisable(struct bfa_tskim_s *tskim)
3493a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3494a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->notify = BFA_FALSE;
3495a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(tskim->itnim, tm_iocdowns);
3496a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(tskim, BFA_TSKIM_SM_HWFAIL);
3497a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3498a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
34995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup TM command and associated IOs as part of ITNIM offline.
3501a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
3503a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_cleanup(struct bfa_tskim_s *tskim)
3504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3505a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->notify = BFA_TRUE;
3506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(tskim->itnim, tm_cleanups);
3507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(tskim, BFA_TSKIM_SM_CLEANUP);
3508a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
35105fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3511da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Memory allocation and initialization.
3512a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3513a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
35144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_tskim_attach(struct bfa_fcpim_s *fcpim)
3515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim;
35174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_fcp_mod_s	*fcp = fcpim->fcp;
3518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u16	i;
3519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&fcpim->tskim_free_q);
35213fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	INIT_LIST_HEAD(&fcpim->tskim_unused_q);
3522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
35234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	tskim = (struct bfa_tskim_s *) bfa_mem_kva_curp(fcp);
3524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fcpim->tskim_arr = tskim;
3525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < fcpim->num_tskim_reqs; i++, tskim++) {
3527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		/*
3528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * initialize TSKIM
3529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
35306a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang		memset(tskim, 0, sizeof(struct bfa_tskim_s));
3531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		tskim->tsk_tag = i;
3532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		tskim->bfa	= fcpim->bfa;
3533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		tskim->fcpim	= fcpim;
3534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		tskim->notify  = BFA_FALSE;
3535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_winit(&tskim->reqq_wait, bfa_tskim_qresume,
3536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					tskim);
3537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_set_state(tskim, bfa_tskim_sm_uninit);
3538a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_add_tail(&tskim->qe, &fcpim->tskim_free_q);
3540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
35424507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_curp(fcp) = (u8 *) tskim;
3543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
3546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
3547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3548e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
3549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_tskim_rsp_s *rsp = (struct bfi_tskim_rsp_s *) m;
3550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim;
3551ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	u16	tsk_tag = be16_to_cpu(rsp->tsk_tag);
3552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim = BFA_TSKIM_FROM_TAG(fcpim, tsk_tag);
3554d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(tskim->tsk_tag != tsk_tag);
3555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->tsk_status = rsp->tsk_status;
3557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
35585fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
3559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Firmware sends BFI_TSKIM_STS_ABORTED status for abort
3560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * requests. All other statuses are for normal completions.
3561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
3562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (rsp->tsk_status == BFI_TSKIM_STS_ABORTED) {
3563a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(tskim->itnim, tm_cleanup_comps);
3564a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(tskim, BFA_TSKIM_SM_CLEANUP_DONE);
35651306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati	} else if (rsp->tsk_status == BFI_TSKIM_STS_UTAG) {
35661306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati		bfa_sm_send_event(tskim, BFA_TSKIM_SM_UTAG);
3567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	} else {
3568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_stats(tskim->itnim, tm_fw_rsps);
3569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_send_event(tskim, BFA_TSKIM_SM_DONE);
3570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistruct bfa_tskim_s *
3575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_alloc(struct bfa_s *bfa, struct bfad_tskim_s *dtsk)
3576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3577e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
3578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_tskim_s *tskim;
3579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_q_deq(&fcpim->tskim_free_q, &tskim);
3581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (tskim)
3583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		tskim->dtsk = dtsk;
3584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return tskim;
3586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
3589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_free(struct bfa_tskim_s *tskim)
3590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3591d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!bfa_q_is_on_q_func(&tskim->itnim->tsk_q, &tskim->qe));
3592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_del(&tskim->qe);
3593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&tskim->qe, &tskim->fcpim->tskim_free_q);
3594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
35965fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3597da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Start a task management command.
3598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *
3599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	tskim	BFA task management command instance
3600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	itnim	i-t nexus for the task management command
3601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	lun	lun, if applicable
3602a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	tm_cmnd	Task management command code.
3603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	t_secs	Timeout in seconds
3604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *
3605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @return None.
3606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
3607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
3608f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhangbfa_tskim_start(struct bfa_tskim_s *tskim, struct bfa_itnim_s *itnim,
3609f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang			struct scsi_lun lun,
3610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			enum fcp_tm_cmnd tm_cmnd, u8 tsecs)
3611a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
3612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->itnim	= itnim;
3613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->lun	= lun;
3614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->tm_cmnd = tm_cmnd;
3615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->tsecs	= tsecs;
3616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tskim->notify  = BFA_FALSE;
3617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_stats(itnim, tm_cmnds);
3618a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&tskim->qe, &itnim->tsk_q);
3620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sm_send_event(tskim, BFA_TSKIM_SM_START);
3621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
3622e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
36233fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipativoid
36243fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipatibfa_tskim_res_recfg(struct bfa_s *bfa, u16 num_tskim_fw)
36253fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati{
36263fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	struct bfa_fcpim_s	*fcpim = BFA_FCPIM(bfa);
36273fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	struct list_head	*qe;
36283fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	int	i;
36293fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
36303fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	for (i = 0; i < (fcpim->num_tskim_reqs - num_tskim_fw); i++) {
36313fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		bfa_q_deq_tail(&fcpim->tskim_free_q, &qe);
36323fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		list_add_tail(qe, &fcpim->tskim_unused_q);
36333fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	}
36343fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati}
36353fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
3636e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati/* BFA FCP module - parent module for fcpim */
3637e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3638e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna GudipatiBFA_MODULE(fcp);
3639e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3640e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void
36414507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_fcp_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *minfo,
36424507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		struct bfa_s *bfa)
3643e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
36444507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
36454507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_kva_s *fcp_kva = BFA_MEM_FCP_KVA(bfa);
36464507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *seg_ptr;
36474507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	u16	nsegs, idx, per_seg_ios, num_io_req;
36484507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	u32	km_len = 0;
3649e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3650e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	/*
3651e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	 * ZERO for num_ioim_reqs and num_fwtio_reqs is allowed config value.
3652e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	 * So if the values are non zero, adjust them appropriately.
3653e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	 */
3654e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	if (cfg->fwcfg.num_ioim_reqs &&
3655e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	    cfg->fwcfg.num_ioim_reqs < BFA_IOIM_MIN)
3656e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MIN;
3657e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	else if (cfg->fwcfg.num_ioim_reqs > BFA_IOIM_MAX)
3658e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MAX;
3659e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3660e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	if (cfg->fwcfg.num_fwtio_reqs > BFA_FWTIO_MAX)
3661e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		cfg->fwcfg.num_fwtio_reqs = BFA_FWTIO_MAX;
3662e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3663e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs);
3664e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	if (num_io_req > BFA_IO_MAX) {
3665e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		if (cfg->fwcfg.num_ioim_reqs && cfg->fwcfg.num_fwtio_reqs) {
3666e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			cfg->fwcfg.num_ioim_reqs = BFA_IO_MAX/2;
3667e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			cfg->fwcfg.num_fwtio_reqs = BFA_IO_MAX/2;
3668e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		} else if (cfg->fwcfg.num_fwtio_reqs)
3669e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			cfg->fwcfg.num_fwtio_reqs = BFA_FWTIO_MAX;
3670e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		else
3671e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MAX;
3672e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	}
3673e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
36744507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_fcpim_meminfo(cfg, &km_len);
3675e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3676e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs);
36774507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	km_len += num_io_req * sizeof(struct bfa_iotag_s);
36784507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	km_len += cfg->fwcfg.num_rports * sizeof(struct bfa_itn_s);
36794507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
36804507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* dma memory */
36814507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	nsegs = BFI_MEM_DMA_NSEGS(num_io_req, BFI_IOIM_SNSLEN);
36824507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	per_seg_ios = BFI_MEM_NREQS_SEG(BFI_IOIM_SNSLEN);
36834507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
36844507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_dma_seg_iter(fcp, seg_ptr, nsegs, idx) {
36854507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		if (num_io_req >= per_seg_ios) {
36864507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			num_io_req -= per_seg_ios;
36874507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			bfa_mem_dma_setup(minfo, seg_ptr,
36884507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				per_seg_ios * BFI_IOIM_SNSLEN);
36894507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		} else
36904507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			bfa_mem_dma_setup(minfo, seg_ptr,
36914507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				num_io_req * BFI_IOIM_SNSLEN);
36924507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	}
36934507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
36944507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* kva memory */
36954507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_setup(minfo, fcp_kva, km_len);
3696e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3697e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3698e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void
3699e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
37004507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		struct bfa_pcidev_s *pcidev)
3701e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
3702e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
37034507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *seg_ptr;
37044507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	u16	idx, nsegs, num_io_req;
3705e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
37067ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	fcp->max_ioim_reqs = cfg->fwcfg.num_ioim_reqs;
3707e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	fcp->num_ioim_reqs = cfg->fwcfg.num_ioim_reqs;
3708e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	fcp->num_fwtio_reqs  = cfg->fwcfg.num_fwtio_reqs;
37094507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	fcp->num_itns   = cfg->fwcfg.num_rports;
3710e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	fcp->bfa = bfa;
3711e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
37124507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/*
37134507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	 * Setup the pool of snsbase addr's, that is passed to fw as
37144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	 * part of bfi_iocfc_cfg_s.
37154507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	 */
37164507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs);
37174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	nsegs = BFI_MEM_DMA_NSEGS(num_io_req, BFI_IOIM_SNSLEN);
37184507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
37194507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_dma_seg_iter(fcp, seg_ptr, nsegs, idx) {
37204507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
37214507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		if (!bfa_mem_dma_virt(seg_ptr))
37224507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			break;
37234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
37244507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		fcp->snsbase[idx].pa = bfa_mem_dma_phys(seg_ptr);
37254507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		fcp->snsbase[idx].kva = bfa_mem_dma_virt(seg_ptr);
37264507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		bfa_iocfc_set_snsbase(bfa, idx, fcp->snsbase[idx].pa);
37274507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	}
3728e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
37297ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	fcp->throttle_update_required = 1;
37304507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_fcpim_attach(fcp, bfad, cfg, pcidev);
3731e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
37324507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_iotag_attach(fcp);
3733e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
37344507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	fcp->itn_arr = (struct bfa_itn_s *) bfa_mem_kva_curp(fcp);
37354507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_curp(fcp) = (u8 *)fcp->itn_arr +
3736e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			(fcp->num_itns * sizeof(struct bfa_itn_s));
3737e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	memset(fcp->itn_arr, 0,
3738e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			(fcp->num_itns * sizeof(struct bfa_itn_s)));
3739e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3740e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3741e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void
3742e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_detach(struct bfa_s *bfa)
3743e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
3744e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3745e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3746e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void
3747e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_start(struct bfa_s *bfa)
3748e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
374983763d591b343b07331cebe86715205230c568b1Krishna Gudipati	struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
375083763d591b343b07331cebe86715205230c568b1Krishna Gudipati
375183763d591b343b07331cebe86715205230c568b1Krishna Gudipati	/*
375283763d591b343b07331cebe86715205230c568b1Krishna Gudipati	 * bfa_init() with flash read is complete. now invalidate the stale
375383763d591b343b07331cebe86715205230c568b1Krishna Gudipati	 * content of lun mask like unit attention, rp tag and lp tag.
375483763d591b343b07331cebe86715205230c568b1Krishna Gudipati	 */
375583763d591b343b07331cebe86715205230c568b1Krishna Gudipati	bfa_ioim_lm_init(fcp->bfa);
3756e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3757e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3758e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void
3759e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_stop(struct bfa_s *bfa)
3760e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
3761e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3762e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3763e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void
3764e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_iocdisable(struct bfa_s *bfa)
3765e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
3766e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
3767e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3768e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	bfa_fcpim_iocdisable(fcp);
3769e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3770e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3771e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipativoid
37727ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcp_res_recfg(struct bfa_s *bfa, u16 num_ioim_fw, u16 max_ioim_fw)
37733fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati{
37743fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	struct bfa_fcp_mod_s	*mod = BFA_FCP_MOD(bfa);
37753fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	struct list_head	*qe;
37763fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	int	i;
37773fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
37787ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	/* Update io throttle value only once during driver load time */
37797ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if (!mod->throttle_update_required)
37807ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		return;
37817ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
37823fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	for (i = 0; i < (mod->num_ioim_reqs - num_ioim_fw); i++) {
37833fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		bfa_q_deq_tail(&mod->iotag_ioim_free_q, &qe);
37843fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		list_add_tail(qe, &mod->iotag_unused_q);
37853fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	}
37867ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
37877ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if (mod->num_ioim_reqs != num_ioim_fw) {
37887ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		bfa_trc(bfa, mod->num_ioim_reqs);
37897ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		bfa_trc(bfa, num_ioim_fw);
37907ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	}
37917ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
37927ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	mod->max_ioim_reqs = max_ioim_fw;
37937ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	mod->num_ioim_reqs = num_ioim_fw;
37947ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	mod->throttle_update_required = 0;
37953fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati}
37963fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
37973fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipativoid
3798e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_itn_create(struct bfa_s *bfa, struct bfa_rport_s *rport,
3799e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		void (*isr)(struct bfa_s *bfa, struct bfi_msg_s *m))
3800e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
3801e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
3802e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_itn_s *itn;
3803e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3804e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	itn =  BFA_ITN_FROM_TAG(fcp, rport->rport_tag);
3805e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	itn->isr = isr;
3806e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3807e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3808e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati/*
3809e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati * Itn interrupt processing.
3810e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati */
3811e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipativoid
3812e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_itn_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
3813e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
3814e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
3815e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	union bfi_itn_i2h_msg_u msg;
3816e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_itn_s *itn;
3817e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3818e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	msg.msg = m;
3819e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	itn =  BFA_ITN_FROM_TAG(fcp, msg.create_rsp->bfa_handle);
3820e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3821e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	if (itn->isr)
3822e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		itn->isr(bfa, m);
3823e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	else
3824e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		WARN_ON(1);
3825e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
3826e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3827e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipativoid
38284507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_iotag_attach(struct bfa_fcp_mod_s *fcp)
3829e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{
3830e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	struct bfa_iotag_s *iotag;
3831e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	u16	num_io_req, i;
3832e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
38334507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	iotag = (struct bfa_iotag_s *) bfa_mem_kva_curp(fcp);
3834e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	fcp->iotag_arr = iotag;
3835e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3836e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	INIT_LIST_HEAD(&fcp->iotag_ioim_free_q);
3837e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	INIT_LIST_HEAD(&fcp->iotag_tio_free_q);
38383fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	INIT_LIST_HEAD(&fcp->iotag_unused_q);
3839e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
3840e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	num_io_req = fcp->num_ioim_reqs + fcp->num_fwtio_reqs;
3841e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	for (i = 0; i < num_io_req; i++, iotag++) {
3842e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		memset(iotag, 0, sizeof(struct bfa_iotag_s));
3843e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		iotag->tag = i;
3844e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		if (i < fcp->num_ioim_reqs)
3845e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			list_add_tail(&iotag->qe, &fcp->iotag_ioim_free_q);
3846e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati		else
3847e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati			list_add_tail(&iotag->qe, &fcp->iotag_tio_free_q);
3848e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	}
3849e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati
38504507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_curp(fcp) = (u8 *) iotag;
3851e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati}
38527ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38537ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38547ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati/**
38557ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * To send config req, first try to use throttle value from flash
38567ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * If 0, then use driver parameter
38577ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * We need to use min(flash_val, drv_val) because
38587ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * memory allocation was done based on this cfg'd value
38597ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati */
38607ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatiu16
38617ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_get_throttle_cfg(struct bfa_s *bfa, u16 drv_cfg_param)
38627ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{
38637ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	u16 tmp;
38647ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
38657ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38667ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	/*
38677ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	 * If throttle value from flash is already in effect after driver is
38687ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	 * loaded then until next load, always return current value instead
38697ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	 * of actual flash value
38707ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	 */
38717ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if (!fcp->throttle_update_required)
38727ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		return (u16)fcp->num_ioim_reqs;
38737ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38747ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	tmp = bfa_dconf_read_data_valid(bfa) ? bfa_fcpim_read_throttle(bfa) : 0;
38757ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if (!tmp || (tmp > drv_cfg_param))
38767ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		tmp = drv_cfg_param;
38777ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38787ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	return tmp;
38797ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati}
38807ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38817ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_status_t
38827ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_write_throttle(struct bfa_s *bfa, u16 value)
38837ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{
38847ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if (!bfa_dconf_get_min_cfg(bfa)) {
38857ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		BFA_DCONF_MOD(bfa)->dconf->throttle_cfg.value = value;
38867ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		BFA_DCONF_MOD(bfa)->dconf->throttle_cfg.is_valid = 1;
38877ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		return BFA_STATUS_OK;
38887ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	}
38897ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38907ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	return BFA_STATUS_FAILED;
38917ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati}
38927ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38937ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatiu16
38947ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_read_throttle(struct bfa_s *bfa)
38957ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{
38967ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	struct bfa_throttle_cfg_s *throttle_cfg =
38977ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati			&(BFA_DCONF_MOD(bfa)->dconf->throttle_cfg);
38987ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
38997ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	return ((!bfa_dconf_get_min_cfg(bfa)) ?
39007ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	       ((throttle_cfg->is_valid == 1) ? (throttle_cfg->value) : 0) : 0);
39017ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati}
39027ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39037ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_status_t
39047ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_throttle_set(struct bfa_s *bfa, u16 value)
39057ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{
39067ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	/* in min cfg no commands should run. */
39077ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if ((bfa_dconf_get_min_cfg(bfa) == BFA_TRUE) ||
39087ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	    (!bfa_dconf_read_data_valid(bfa)))
39097ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		return BFA_STATUS_FAILED;
39107ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39117ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	bfa_fcpim_write_throttle(bfa, value);
39127ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39137ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	return bfa_dconf_update(bfa);
39147ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati}
39157ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39167ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_status_t
39177ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_throttle_get(struct bfa_s *bfa, void *buf)
39187ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{
39197ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
39207ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	struct bfa_defs_fcpim_throttle_s throttle;
39217ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39227ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if ((bfa_dconf_get_min_cfg(bfa) == BFA_TRUE) ||
39237ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	    (!bfa_dconf_read_data_valid(bfa)))
39247ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		return BFA_STATUS_FAILED;
39257ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39267ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	memset(&throttle, 0, sizeof(struct bfa_defs_fcpim_throttle_s));
39277ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39287ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	throttle.cur_value = (u16)(fcpim->fcp->num_ioim_reqs);
39297ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	throttle.cfg_value = bfa_fcpim_read_throttle(bfa);
39307ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	if (!throttle.cfg_value)
39317ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati		throttle.cfg_value = throttle.cur_value;
39327ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	throttle.max_value = (u16)(fcpim->fcp->max_ioim_reqs);
39337ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	memcpy(buf, &throttle, sizeof(struct bfa_defs_fcpim_throttle_s));
39347ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati
39357ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati	return BFA_STATUS_OK;
39367ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati}
3937