1d14abf15SRobert Mustacchi #include "lm5710.h"
2d14abf15SRobert Mustacchi #include "everest_iscsi_constants.h"
3d14abf15SRobert Mustacchi #include "everest_l5cm_constants.h"
4d14abf15SRobert Mustacchi #include "577xx_int_offsets.h"
5d14abf15SRobert Mustacchi #include "bd_chain.h"
6d14abf15SRobert Mustacchi #include "command.h"
7d14abf15SRobert Mustacchi #include "lm_sp_req_mgr.h"
8d14abf15SRobert Mustacchi #include "lm_l4sp.h"
9d14abf15SRobert Mustacchi #include "lm_l4if.h"
10d14abf15SRobert Mustacchi #include "lm_l5if.h"
11d14abf15SRobert Mustacchi #include "mm_l5if.h"
12d14abf15SRobert Mustacchi #include "mm_l4if.h"
13d14abf15SRobert Mustacchi #include "mm.h"
14d14abf15SRobert Mustacchi 
15d14abf15SRobert Mustacchi 
16d14abf15SRobert Mustacchi 
lm_get_pbl_entries(IN u32_t bufferSize)17d14abf15SRobert Mustacchi u32_t lm_get_pbl_entries(
18d14abf15SRobert Mustacchi     IN  u32_t bufferSize
19d14abf15SRobert Mustacchi     )
20d14abf15SRobert Mustacchi {
21d14abf15SRobert Mustacchi     return CEIL_DIV(bufferSize, LM_PAGE_SIZE);
22d14abf15SRobert Mustacchi }
23d14abf15SRobert Mustacchi 
24d14abf15SRobert Mustacchi 
25d14abf15SRobert Mustacchi 
lm_alloc_pbl_mem(IN struct _lm_device_t * pdev,IN u32_t pbl_entries,OUT lm_address_t ** pbl_virt,OUT lm_address_t * pbl_phy,OUT void ** pbl_virt_table,IN u8_t rt_mem,OUT u32_t * pbl_size,IN u8_t mm_cli_idx)26d14abf15SRobert Mustacchi lm_status_t lm_alloc_pbl_mem(
27d14abf15SRobert Mustacchi     IN  struct _lm_device_t *pdev,
28d14abf15SRobert Mustacchi     IN  u32_t pbl_entries,
29d14abf15SRobert Mustacchi     OUT lm_address_t** pbl_virt,
30d14abf15SRobert Mustacchi     OUT lm_address_t *pbl_phy,
31d14abf15SRobert Mustacchi     OUT void** pbl_virt_table,
32d14abf15SRobert Mustacchi     IN  u8_t rt_mem,
33d14abf15SRobert Mustacchi     OUT u32_t *pbl_size,
34d14abf15SRobert Mustacchi     IN  u8_t mm_cli_idx
35d14abf15SRobert Mustacchi     )
36d14abf15SRobert Mustacchi {
37d14abf15SRobert Mustacchi 
38d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || (pbl_entries == 0) ||
39d14abf15SRobert Mustacchi         CHK_NULL(pbl_virt) || CHK_NULL(pbl_phy) ||
40d14abf15SRobert Mustacchi         CHK_NULL(pbl_size))
41d14abf15SRobert Mustacchi     {
42d14abf15SRobert Mustacchi         /* allocPblMem - illegal pblSize */
43d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
44d14abf15SRobert Mustacchi     }
45d14abf15SRobert Mustacchi 
46d14abf15SRobert Mustacchi     *pbl_size = pbl_entries * sizeof(lm_address_t);
47d14abf15SRobert Mustacchi 
48d14abf15SRobert Mustacchi     if (rt_mem)
49d14abf15SRobert Mustacchi     {
50d14abf15SRobert Mustacchi         *pbl_virt = (lm_address_t *)mm_rt_alloc_phys_mem(pdev,
51d14abf15SRobert Mustacchi                                                         *pbl_size,
52d14abf15SRobert Mustacchi                                                         pbl_phy,
53d14abf15SRobert Mustacchi                                                         0,
54d14abf15SRobert Mustacchi                                                         mm_cli_idx);
55d14abf15SRobert Mustacchi         if CHK_NULL(*pbl_virt)
56d14abf15SRobert Mustacchi         {
57d14abf15SRobert Mustacchi             *pbl_size = 0;
58d14abf15SRobert Mustacchi 
59d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
60d14abf15SRobert Mustacchi         }
61d14abf15SRobert Mustacchi 
62d14abf15SRobert Mustacchi         *pbl_virt_table = (void *)mm_rt_alloc_mem(pdev,
63d14abf15SRobert Mustacchi                                                    pbl_entries * sizeof(void *),
64d14abf15SRobert Mustacchi                                                    mm_cli_idx);
65d14abf15SRobert Mustacchi 
66d14abf15SRobert Mustacchi         if CHK_NULL(*pbl_virt_table)
67d14abf15SRobert Mustacchi         {
68d14abf15SRobert Mustacchi             *pbl_size = 0;
69d14abf15SRobert Mustacchi             mm_rt_free_phys_mem(pdev, *pbl_size, *pbl_virt, *pbl_phy, mm_cli_idx);
70d14abf15SRobert Mustacchi             *pbl_virt = NULL;
71d14abf15SRobert Mustacchi 
72d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
73d14abf15SRobert Mustacchi         }
74d14abf15SRobert Mustacchi     }
75d14abf15SRobert Mustacchi     else
76d14abf15SRobert Mustacchi     {
77d14abf15SRobert Mustacchi         *pbl_virt = (lm_address_t *)mm_alloc_phys_mem_align(pdev,
78d14abf15SRobert Mustacchi                                                         *pbl_size,
79d14abf15SRobert Mustacchi                                                         pbl_phy,
80d14abf15SRobert Mustacchi                                                         LM_PAGE_SIZE,
81d14abf15SRobert Mustacchi                                                         0,
82d14abf15SRobert Mustacchi                                                         mm_cli_idx);
83d14abf15SRobert Mustacchi         if CHK_NULL(*pbl_virt)
84d14abf15SRobert Mustacchi         {
85d14abf15SRobert Mustacchi             *pbl_size = 0;
86d14abf15SRobert Mustacchi 
87d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
88d14abf15SRobert Mustacchi         }
89d14abf15SRobert Mustacchi 
90d14abf15SRobert Mustacchi         *pbl_virt_table = (void *)mm_alloc_mem(pdev,
91d14abf15SRobert Mustacchi                                                 pbl_entries * sizeof(void *),
92d14abf15SRobert Mustacchi                                                 mm_cli_idx);
93d14abf15SRobert Mustacchi 
94d14abf15SRobert Mustacchi         if CHK_NULL(*pbl_virt_table)
95d14abf15SRobert Mustacchi         {
96d14abf15SRobert Mustacchi             *pbl_size = 0;
97d14abf15SRobert Mustacchi             *pbl_virt = NULL;
98d14abf15SRobert Mustacchi 
99d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
100d14abf15SRobert Mustacchi         }
101d14abf15SRobert Mustacchi     }
102d14abf15SRobert Mustacchi 
103d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
104d14abf15SRobert Mustacchi }
105d14abf15SRobert Mustacchi 
106d14abf15SRobert Mustacchi 
107d14abf15SRobert Mustacchi 
lm_create_pbl(IN struct _lm_device_t * pdev,IN void * buf_base_virt,IN lm_address_t * buf_base_phy,IN u32_t buffer_size,OUT lm_address_t ** pbl_virt,OUT lm_address_t * pbl_phy,OUT void ** pbl_virt_table,OUT u32_t * pbl_entries,OUT u32_t * pbl_size,IN u8_t rt_mem,IN u8_t mm_cli_idx)108d14abf15SRobert Mustacchi lm_status_t lm_create_pbl(
109d14abf15SRobert Mustacchi     IN  struct _lm_device_t *pdev,
110d14abf15SRobert Mustacchi     IN  void* buf_base_virt,
111d14abf15SRobert Mustacchi     IN  lm_address_t* buf_base_phy,
112d14abf15SRobert Mustacchi     IN  u32_t buffer_size,
113d14abf15SRobert Mustacchi     OUT lm_address_t** pbl_virt,
114d14abf15SRobert Mustacchi     OUT lm_address_t* pbl_phy,
115d14abf15SRobert Mustacchi     OUT void** pbl_virt_table,
116d14abf15SRobert Mustacchi     OUT u32_t *pbl_entries,
117d14abf15SRobert Mustacchi     OUT u32_t *pbl_size,
118d14abf15SRobert Mustacchi     IN  u8_t rt_mem,
119d14abf15SRobert Mustacchi     IN  u8_t mm_cli_idx)
120d14abf15SRobert Mustacchi {
121d14abf15SRobert Mustacchi     lm_status_t lm_status;
122d14abf15SRobert Mustacchi 
123d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(buf_base_virt) ||
124d14abf15SRobert Mustacchi         CHK_NULL(buf_base_phy) || CHK_NULL(pbl_virt) ||
125d14abf15SRobert Mustacchi         CHK_NULL(pbl_phy) || CHK_NULL(pbl_virt_table) ||
126d14abf15SRobert Mustacchi         CHK_NULL(pbl_entries) || CHK_NULL(pbl_size))
127d14abf15SRobert Mustacchi     {
128d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
129d14abf15SRobert Mustacchi     }
130d14abf15SRobert Mustacchi 
131d14abf15SRobert Mustacchi     *pbl_entries = lm_get_pbl_entries(buffer_size);
132d14abf15SRobert Mustacchi 
133d14abf15SRobert Mustacchi     lm_status = lm_alloc_pbl_mem(pdev, *pbl_entries, pbl_virt, pbl_phy, pbl_virt_table, rt_mem, pbl_size, mm_cli_idx);
134d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
135d14abf15SRobert Mustacchi     {
136d14abf15SRobert Mustacchi         *pbl_entries = 0;
137d14abf15SRobert Mustacchi 
138d14abf15SRobert Mustacchi         return lm_status;
139d14abf15SRobert Mustacchi     }
140d14abf15SRobert Mustacchi 
141d14abf15SRobert Mustacchi     lm_status = lm_bd_chain_pbl_set_ptrs(buf_base_virt, *buf_base_phy, *pbl_virt, *pbl_virt_table, *pbl_entries);
142d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
143d14abf15SRobert Mustacchi     {
144d14abf15SRobert Mustacchi         if (rt_mem)
145d14abf15SRobert Mustacchi         {
146d14abf15SRobert Mustacchi             mm_rt_free_phys_mem(pdev, *pbl_size, *pbl_virt, *pbl_phy, mm_cli_idx);
147d14abf15SRobert Mustacchi             mm_rt_free_mem(pdev, *pbl_virt_table, *pbl_entries * sizeof(void *), mm_cli_idx);
148d14abf15SRobert Mustacchi         }
149d14abf15SRobert Mustacchi 
150d14abf15SRobert Mustacchi         *pbl_entries = 0;
151d14abf15SRobert Mustacchi         *pbl_size = 0;
152d14abf15SRobert Mustacchi 
153d14abf15SRobert Mustacchi         return lm_status;
154d14abf15SRobert Mustacchi     }
155d14abf15SRobert Mustacchi 
156d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
157d14abf15SRobert Mustacchi }
158d14abf15SRobert Mustacchi 
159d14abf15SRobert Mustacchi 
160d14abf15SRobert Mustacchi 
161d14abf15SRobert Mustacchi lm_status_t
lm_l5_alloc_eq(IN struct _lm_device_t * pdev,IN lm_eq_chain_t * eq_chain,IN lm_eq_addr_t * eq_addr_save,IN u16_t page_cnt,IN u8_t cli_idx)162d14abf15SRobert Mustacchi lm_l5_alloc_eq(
163d14abf15SRobert Mustacchi     IN      struct _lm_device_t  *pdev,
164d14abf15SRobert Mustacchi     IN      lm_eq_chain_t        *eq_chain,
165d14abf15SRobert Mustacchi     IN      lm_eq_addr_t         *eq_addr_save,
166d14abf15SRobert Mustacchi     IN      u16_t                page_cnt,
167d14abf15SRobert Mustacchi     IN      u8_t                 cli_idx)
168d14abf15SRobert Mustacchi {
169d14abf15SRobert Mustacchi     u32_t                mem_size     = 0;
170d14abf15SRobert Mustacchi 
171d14abf15SRobert Mustacchi     /* check arguments */
172d14abf15SRobert Mustacchi     if ((CHK_NULL(pdev) || CHK_NULL(eq_chain) || !page_cnt) ||
173d14abf15SRobert Mustacchi         (LM_CLI_IDX_FCOE != cli_idx) && (LM_CLI_IDX_ISCSI != cli_idx))
174d14abf15SRobert Mustacchi     {
175d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
176d14abf15SRobert Mustacchi     }
177d14abf15SRobert Mustacchi 
178d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi | INFORMl5sp, "#lm_alloc_eq, eq_chain=%p, page_cnt=%d\n", eq_chain, page_cnt);
179d14abf15SRobert Mustacchi 
180d14abf15SRobert Mustacchi     /* alloc the chain */
181d14abf15SRobert Mustacchi     mem_size = page_cnt * LM_PAGE_SIZE;
182d14abf15SRobert Mustacchi 
183d14abf15SRobert Mustacchi     if(!eq_addr_save->b_allocated)
184d14abf15SRobert Mustacchi     {
185d14abf15SRobert Mustacchi         eq_chain->bd_chain.bd_chain_virt = mm_alloc_phys_mem(pdev,
186d14abf15SRobert Mustacchi                                                              mem_size,
187d14abf15SRobert Mustacchi                                                              &eq_chain->bd_chain.bd_chain_phy,
188d14abf15SRobert Mustacchi                                                              0,
189d14abf15SRobert Mustacchi                                                              cli_idx);
190d14abf15SRobert Mustacchi 
191d14abf15SRobert Mustacchi         if (ERR_IF(!eq_chain->bd_chain.bd_chain_virt))
192d14abf15SRobert Mustacchi         {
193d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
194d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
195d14abf15SRobert Mustacchi         }
196d14abf15SRobert Mustacchi 
197d14abf15SRobert Mustacchi         eq_addr_save->bd_chain_virt = eq_chain->bd_chain.bd_chain_virt ;
198d14abf15SRobert Mustacchi         eq_addr_save->bd_chain_phy.as_u64 = eq_chain->bd_chain.bd_chain_phy.as_u64;
199d14abf15SRobert Mustacchi         eq_addr_save->b_allocated = TRUE;
200d14abf15SRobert Mustacchi         // For debugging
201d14abf15SRobert Mustacchi         eq_addr_save->prev_mem_size = mem_size;
202d14abf15SRobert Mustacchi     }
203d14abf15SRobert Mustacchi     else
204d14abf15SRobert Mustacchi     {
205d14abf15SRobert Mustacchi         DbgBreakIf(mem_size != eq_addr_save->prev_mem_size);
206d14abf15SRobert Mustacchi         eq_chain->bd_chain.bd_chain_virt = eq_addr_save->bd_chain_virt;
207d14abf15SRobert Mustacchi         eq_chain->bd_chain.bd_chain_phy.as_u64 = eq_addr_save->bd_chain_phy.as_u64;
208d14abf15SRobert Mustacchi     }
209d14abf15SRobert Mustacchi     mm_memset(eq_chain->bd_chain.bd_chain_virt, 0, mem_size);
210d14abf15SRobert Mustacchi 
211d14abf15SRobert Mustacchi     eq_chain->bd_chain.page_cnt = page_cnt;
212d14abf15SRobert Mustacchi 
213d14abf15SRobert Mustacchi 
214d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
215d14abf15SRobert Mustacchi } /* lm_alloc_eq */
216d14abf15SRobert Mustacchi 
217d14abf15SRobert Mustacchi 
218d14abf15SRobert Mustacchi 
219d14abf15SRobert Mustacchi lm_status_t
lm_sc_setup_eq(IN struct _lm_device_t * pdev,IN u32_t idx,IN const u8_t is_chain_mode)220d14abf15SRobert Mustacchi lm_sc_setup_eq(
221d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
222d14abf15SRobert Mustacchi     IN u32_t                idx,
223d14abf15SRobert Mustacchi     IN const u8_t           is_chain_mode)
224d14abf15SRobert Mustacchi {
225d14abf15SRobert Mustacchi     lm_bd_chain_t * bd_chain;
226d14abf15SRobert Mustacchi     u16_t volatile * sb_indexes;
227d14abf15SRobert Mustacchi 
228d14abf15SRobert Mustacchi     /* check arguments */
229d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) || ERR_IF((ARRSIZE(pdev->iscsi_info.run_time.eq_chain) <= idx)))
230d14abf15SRobert Mustacchi     {
231d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
232d14abf15SRobert Mustacchi     }
233d14abf15SRobert Mustacchi 
234d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl5sp, "#lm_sc_setup_eq, idx=%d\n",idx);
235d14abf15SRobert Mustacchi 
236d14abf15SRobert Mustacchi     bd_chain = &LM_SC_EQ(pdev, idx).bd_chain;
237d14abf15SRobert Mustacchi     lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt,
238d14abf15SRobert Mustacchi                       bd_chain->bd_chain_phy, (u16_t)bd_chain->page_cnt, sizeof(struct iscsi_kcqe), 1/*0*/, is_chain_mode);
239d14abf15SRobert Mustacchi 
240d14abf15SRobert Mustacchi     /* verify that EQ size is not too large */
241d14abf15SRobert Mustacchi     if(bd_chain->capacity > MAX_EQ_SIZE_ISCSI(is_chain_mode))
242d14abf15SRobert Mustacchi     {
243d14abf15SRobert Mustacchi         DbgBreakIf(bd_chain->capacity > MAX_EQ_SIZE_ISCSI(is_chain_mode));
244d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
245d14abf15SRobert Mustacchi     }
246d14abf15SRobert Mustacchi 
247d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "is eq %d, bd_chain %p, bd_left %d\n",
248d14abf15SRobert Mustacchi         idx,
249d14abf15SRobert Mustacchi         bd_chain->next_bd,
250d14abf15SRobert Mustacchi         bd_chain->bd_left);
251d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "   bd_chain_phy 0x%x%08x\n",
252d14abf15SRobert Mustacchi         bd_chain->bd_chain_phy.as_u32.high,
253d14abf15SRobert Mustacchi         bd_chain->bd_chain_phy.as_u32.low);
254d14abf15SRobert Mustacchi 
255d14abf15SRobert Mustacchi     // Assign the EQ chain consumer pointer to the consumer index in the status block.
256d14abf15SRobert Mustacchi     if( idx >= ARRSIZE(pdev->vars.status_blocks_arr) )
257d14abf15SRobert Mustacchi     {
258d14abf15SRobert Mustacchi         DbgBreakIf( idx >= ARRSIZE(pdev->vars.status_blocks_arr) );
259d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
260d14abf15SRobert Mustacchi     }
261d14abf15SRobert Mustacchi 
262d14abf15SRobert Mustacchi     sb_indexes = lm_get_sb_indexes(pdev, (u8_t)idx);
263d14abf15SRobert Mustacchi     sb_indexes[HC_INDEX_ISCSI_EQ_CONS] = 0;
264d14abf15SRobert Mustacchi     LM_SC_EQ(pdev, idx).hw_con_idx_ptr = sb_indexes + HC_INDEX_ISCSI_EQ_CONS;
265d14abf15SRobert Mustacchi /*
266d14abf15SRobert Mustacchi     if (IS_E2(pdev)) {
267d14abf15SRobert Mustacchi         pdev->vars.status_blocks_arr[idx].host_hc_status_block.e2_sb->sb.index_values[HC_INDEX_ISCSI_EQ_CONS] = 0;
268d14abf15SRobert Mustacchi         LM_SC_EQ(pdev, idx).hw_con_idx_ptr =
269d14abf15SRobert Mustacchi             &(pdev->vars.status_blocks_arr[idx].host_hc_status_block.e2_sb->sb.index_values[HC_INDEX_ISCSI_EQ_CONS]);
270d14abf15SRobert Mustacchi     } else {
271d14abf15SRobert Mustacchi         pdev->vars.status_blocks_arr[idx].host_hc_status_block.e1x_sb->sb.index_values[HC_INDEX_ISCSI_EQ_CONS] = 0;
272d14abf15SRobert Mustacchi         LM_SC_EQ(pdev, idx).hw_con_idx_ptr =
273d14abf15SRobert Mustacchi             &(pdev->vars.status_blocks_arr[idx].host_hc_status_block.e1x_sb->sb.index_values[HC_INDEX_ISCSI_EQ_CONS]);
274d14abf15SRobert Mustacchi     }
275d14abf15SRobert Mustacchi  */
276d14abf15SRobert Mustacchi     LM_SC_EQ(pdev, idx).hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_TYPE; //STATUS_BLOCK_CSTORM_TYPE;
277d14abf15SRobert Mustacchi     LM_SC_EQ(pdev, idx).hc_sb_info.hc_index_value = HC_INDEX_ISCSI_EQ_CONS;
278d14abf15SRobert Mustacchi 
279d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
280d14abf15SRobert Mustacchi } /* lm_sc_setup_eq */
281d14abf15SRobert Mustacchi /**
282d14abf15SRobert Mustacchi  *
283d14abf15SRobert Mustacchi  * @description
284d14abf15SRobert Mustacchi  * Allocate EQ PBL to pass to FW in init ramrod
285d14abf15SRobert Mustacchi  * @param pdev
286d14abf15SRobert Mustacchi  * @param eq_chain
287d14abf15SRobert Mustacchi  * @param pbl
288d14abf15SRobert Mustacchi  * @param eq_addr_save
289d14abf15SRobert Mustacchi  *
290d14abf15SRobert Mustacchi  * @return lm_status_t
291d14abf15SRobert Mustacchi  */
292d14abf15SRobert Mustacchi lm_status_t
lm_fc_alloc_eq_pbl(IN struct _lm_device_t * pdev,IN lm_eq_chain_t * eq_chain,IN lm_fcoe_pbl_t * pbl,IN lm_eq_addr_t * eq_addr_save)293d14abf15SRobert Mustacchi lm_fc_alloc_eq_pbl(
294d14abf15SRobert Mustacchi     IN struct   _lm_device_t  *pdev,
295d14abf15SRobert Mustacchi     IN          lm_eq_chain_t *eq_chain,
296d14abf15SRobert Mustacchi     IN          lm_fcoe_pbl_t *pbl,
297d14abf15SRobert Mustacchi     IN          lm_eq_addr_t  *eq_addr_save)
298d14abf15SRobert Mustacchi {
299d14abf15SRobert Mustacchi     lm_status_t     lm_status = LM_STATUS_SUCCESS;
300d14abf15SRobert Mustacchi 
301d14abf15SRobert Mustacchi     /* check arguments */
302d14abf15SRobert Mustacchi     if(CHK_NULL(pdev))
303d14abf15SRobert Mustacchi     {
304d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
305d14abf15SRobert Mustacchi     }
306d14abf15SRobert Mustacchi 
307d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl5sp, "#lm_fc_alloc_eq_pbl\n");
308d14abf15SRobert Mustacchi 
309d14abf15SRobert Mustacchi     // For D3 case
310d14abf15SRobert Mustacchi     if(FALSE == pbl->allocated)
311d14abf15SRobert Mustacchi     {
312d14abf15SRobert Mustacchi         lm_status = lm_create_pbl(pdev,
313d14abf15SRobert Mustacchi                                   eq_chain->bd_chain.bd_chain_virt,
314d14abf15SRobert Mustacchi                                   &(eq_chain->bd_chain.bd_chain_phy),
315d14abf15SRobert Mustacchi                                   eq_addr_save->prev_mem_size,
316d14abf15SRobert Mustacchi                                   &pbl->pbl_phys_table_virt,
317d14abf15SRobert Mustacchi                                   &pbl->pbl_phys_table_phys,
318d14abf15SRobert Mustacchi                                   &pbl->pbl_virt_table,
319d14abf15SRobert Mustacchi                                   &pbl->pbl_entries,
320d14abf15SRobert Mustacchi                                   &pbl->pbl_size,
321d14abf15SRobert Mustacchi                                   FALSE,
322d14abf15SRobert Mustacchi                                   LM_CLI_IDX_FCOE);
323d14abf15SRobert Mustacchi 
324d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
325d14abf15SRobert Mustacchi         {
326d14abf15SRobert Mustacchi             mm_mem_zero(&(pbl) ,sizeof(lm_fcoe_pbl_t));
327d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE;
328d14abf15SRobert Mustacchi         }
329d14abf15SRobert Mustacchi         pbl->allocated = TRUE;
330d14abf15SRobert Mustacchi     }
331d14abf15SRobert Mustacchi     return lm_status;
332d14abf15SRobert Mustacchi }
333d14abf15SRobert Mustacchi 
334d14abf15SRobert Mustacchi lm_status_t
lm_fc_setup_eq(IN struct _lm_device_t * pdev,IN u32_t idx,IN const u8_t is_chain_mode)335d14abf15SRobert Mustacchi lm_fc_setup_eq(
336d14abf15SRobert Mustacchi     IN struct   _lm_device_t  *pdev,
337d14abf15SRobert Mustacchi     IN          u32_t         idx,
338d14abf15SRobert Mustacchi     IN const    u8_t          is_chain_mode)
339d14abf15SRobert Mustacchi {
340d14abf15SRobert Mustacchi     lm_bd_chain_t   * bd_chain;
341d14abf15SRobert Mustacchi     lm_fcoe_pbl_t   * pbl;
342d14abf15SRobert Mustacchi     u16_t volatile  * sb_indexes;
343d14abf15SRobert Mustacchi 
344d14abf15SRobert Mustacchi     /* check arguments */
345d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) || ERR_IF((ARRSIZE(pdev->fcoe_info.run_time.eq_chain) <= idx)))
346d14abf15SRobert Mustacchi     {
347d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
348d14abf15SRobert Mustacchi     }
349d14abf15SRobert Mustacchi 
350d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl5sp, "#lm_fc_setup_eq, idx=%d\n",idx);
351d14abf15SRobert Mustacchi 
352d14abf15SRobert Mustacchi     bd_chain = &LM_FC_EQ(pdev, idx).bd_chain;
353d14abf15SRobert Mustacchi     pbl = &LM_FC_PBL(pdev, idx);
354d14abf15SRobert Mustacchi     lm_bd_chain_pbl_setup(pdev, bd_chain, bd_chain->bd_chain_virt,
355d14abf15SRobert Mustacchi                       bd_chain->bd_chain_phy, pbl->pbl_virt_table, pbl->pbl_phys_table_virt,
356d14abf15SRobert Mustacchi                       (u16_t)bd_chain->page_cnt, sizeof(struct fcoe_kcqe),
357d14abf15SRobert Mustacchi                       1/*0*/); /* EQ is considered full of blank entries */
358d14abf15SRobert Mustacchi 
359d14abf15SRobert Mustacchi     /* verify that EQ size is not too large */
360d14abf15SRobert Mustacchi     if (bd_chain->capacity > MAX_EQ_SIZE_FCOE(is_chain_mode))
361d14abf15SRobert Mustacchi     {
362d14abf15SRobert Mustacchi         DbgBreakIf(bd_chain->capacity > MAX_EQ_SIZE_FCOE(is_chain_mode));
363d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
364d14abf15SRobert Mustacchi     }
365d14abf15SRobert Mustacchi 
366d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "fc eq %d, bd_chain %p, bd_left %d\n",
367d14abf15SRobert Mustacchi         idx,
368d14abf15SRobert Mustacchi         bd_chain->next_bd,
369d14abf15SRobert Mustacchi         bd_chain->bd_left);
370d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "   bd_chain_phy 0x%x%08x\n",
371d14abf15SRobert Mustacchi         bd_chain->bd_chain_phy.as_u32.high,
372d14abf15SRobert Mustacchi         bd_chain->bd_chain_phy.as_u32.low);
373d14abf15SRobert Mustacchi 
374d14abf15SRobert Mustacchi     // Assign the EQ chain consumer pointer to the consumer index in the status block.
375d14abf15SRobert Mustacchi     if (idx >= ARRSIZE(pdev->vars.status_blocks_arr))
376d14abf15SRobert Mustacchi     {
377d14abf15SRobert Mustacchi         DbgBreakIf( idx >= ARRSIZE(pdev->vars.status_blocks_arr) );
378d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
379d14abf15SRobert Mustacchi     }
380d14abf15SRobert Mustacchi 
381d14abf15SRobert Mustacchi     sb_indexes = lm_get_sb_indexes(pdev, (u8_t)idx);
382d14abf15SRobert Mustacchi     sb_indexes[HC_INDEX_FCOE_EQ_CONS] = 0;
383d14abf15SRobert Mustacchi     LM_FC_EQ(pdev, idx).hw_con_idx_ptr = sb_indexes + HC_INDEX_FCOE_EQ_CONS;
384d14abf15SRobert Mustacchi /*
385d14abf15SRobert Mustacchi     if (IS_E2(pdev)) {
386d14abf15SRobert Mustacchi         pdev->vars.status_blocks_arr[idx].host_hc_status_block.e2_sb->sb.index_values[HC_INDEX_FCOE_EQ_CONS] = 0;
387d14abf15SRobert Mustacchi         LM_FC_EQ(pdev, idx).hw_con_idx_ptr =
388d14abf15SRobert Mustacchi             &(pdev->vars.status_blocks_arr[idx].host_hc_status_block.e2_sb->sb.index_values[HC_INDEX_FCOE_EQ_CONS]);
389d14abf15SRobert Mustacchi     } else {
390d14abf15SRobert Mustacchi         pdev->vars.status_blocks_arr[idx].host_hc_status_block.e1x_sb->sb.index_values[HC_INDEX_FCOE_EQ_CONS] = 0;
391d14abf15SRobert Mustacchi         LM_FC_EQ(pdev, idx).hw_con_idx_ptr =
392d14abf15SRobert Mustacchi             &(pdev->vars.status_blocks_arr[idx].host_hc_status_block.e1x_sb->sb.index_values[HC_INDEX_FCOE_EQ_CONS]);
393d14abf15SRobert Mustacchi     }
394d14abf15SRobert Mustacchi */
395d14abf15SRobert Mustacchi     LM_FC_EQ(pdev, idx).hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE; //STATUS_BLOCK_USTORM_TYPE;
396d14abf15SRobert Mustacchi     LM_FC_EQ(pdev, idx).hc_sb_info.hc_index_value = HC_INDEX_FCOE_EQ_CONS;
397d14abf15SRobert Mustacchi 
398d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
399d14abf15SRobert Mustacchi } /* lm_fc_setup_eq */
400d14abf15SRobert Mustacchi 
401d14abf15SRobert Mustacchi 
402d14abf15SRobert Mustacchi 
403d14abf15SRobert Mustacchi 
404d14abf15SRobert Mustacchi /** Description
405d14abf15SRobert Mustacchi  *  Callback function for cids being recylced
406d14abf15SRobert Mustacchi  */
lm_sc_recycle_cid_cb(struct _lm_device_t * pdev,void * cookie,s32_t cid)407d14abf15SRobert Mustacchi void lm_sc_recycle_cid_cb(
408d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
409d14abf15SRobert Mustacchi     void *cookie,
410d14abf15SRobert Mustacchi     s32_t cid)
411d14abf15SRobert Mustacchi {
412d14abf15SRobert Mustacchi     lm_status_t lm_status;
413d14abf15SRobert Mustacchi     lm_sp_req_common_t * sp_req = NULL;
414d14abf15SRobert Mustacchi     lm_iscsi_state_t * iscsi = (lm_iscsi_state_t *)cookie;
415d14abf15SRobert Mustacchi 
416d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(iscsi))
417d14abf15SRobert Mustacchi     {
418d14abf15SRobert Mustacchi         DbgBreakIf(1);
419d14abf15SRobert Mustacchi         return;
420d14abf15SRobert Mustacchi     }
421d14abf15SRobert Mustacchi 
422d14abf15SRobert Mustacchi     MM_ACQUIRE_TOE_LOCK(pdev);
423d14abf15SRobert Mustacchi 
424d14abf15SRobert Mustacchi     /* un-block the manager... */
425d14abf15SRobert Mustacchi     lm_set_cid_state(pdev, iscsi->cid, LM_CID_STATE_VALID);
426d14abf15SRobert Mustacchi 
427d14abf15SRobert Mustacchi     if (iscsi->hdr.status == STATE_STATUS_INIT_CONTEXT)
428d14abf15SRobert Mustacchi     {
429d14abf15SRobert Mustacchi         lm_status = lm_sc_init_iscsi_context(pdev,
430d14abf15SRobert Mustacchi                                              iscsi,
431d14abf15SRobert Mustacchi                                              &iscsi->pending_ofld1,
432d14abf15SRobert Mustacchi                                              &iscsi->pending_ofld2,
433d14abf15SRobert Mustacchi                                              &iscsi->pending_ofld3);
434d14abf15SRobert Mustacchi 
435d14abf15SRobert Mustacchi         mm_sc_complete_offload_request(pdev, iscsi, lm_status);
436d14abf15SRobert Mustacchi     }
437d14abf15SRobert Mustacchi 
438d14abf15SRobert Mustacchi     /* we can now unblock any pending slow-paths */
439d14abf15SRobert Mustacchi     lm_sp_req_manager_unblock(pdev, cid, &sp_req);
440d14abf15SRobert Mustacchi 
441d14abf15SRobert Mustacchi     MM_RELEASE_TOE_LOCK(pdev);
442d14abf15SRobert Mustacchi }
443d14abf15SRobert Mustacchi 
444d14abf15SRobert Mustacchi 
lm_sc_comp_cb(struct _lm_device_t * pdev,struct sq_pending_command * pending)445d14abf15SRobert Mustacchi void lm_sc_comp_cb(struct _lm_device_t *pdev, struct sq_pending_command *pending)
446d14abf15SRobert Mustacchi {
447d14abf15SRobert Mustacchi     struct iscsi_kcqe kcqe  = {0};
448d14abf15SRobert Mustacchi     lm_iscsi_state_t *iscsi = NULL;
449d14abf15SRobert Mustacchi     u32_t            cid;
450d14abf15SRobert Mustacchi     u8_t             cmd;
451d14abf15SRobert Mustacchi 
452d14abf15SRobert Mustacchi 
453d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(pending))
454d14abf15SRobert Mustacchi     {
455d14abf15SRobert Mustacchi         return;
456d14abf15SRobert Mustacchi     }
457d14abf15SRobert Mustacchi 
458d14abf15SRobert Mustacchi     cmd = pending->cmd;
459d14abf15SRobert Mustacchi     cid = pending->cid;
460d14abf15SRobert Mustacchi 
461d14abf15SRobert Mustacchi     iscsi = lm_cid_cookie(pdev, ISCSI_CONNECTION_TYPE, cid);
462d14abf15SRobert Mustacchi 
463d14abf15SRobert Mustacchi     if (iscsi)
464d14abf15SRobert Mustacchi     {
465d14abf15SRobert Mustacchi         kcqe.iscsi_conn_id         = iscsi->iscsi_conn_id;
466d14abf15SRobert Mustacchi         kcqe.iscsi_conn_context_id = HW_CID(pdev, cid);
467d14abf15SRobert Mustacchi     }
468d14abf15SRobert Mustacchi 
469d14abf15SRobert Mustacchi     kcqe.completion_status = LM_STATUS_SUCCESS; /* TODO_ER: Fixme: do we want this?? maybe ok since l5 is aware of er... */
470d14abf15SRobert Mustacchi 
471d14abf15SRobert Mustacchi     kcqe.op_code = cmd; /* In iSCSI they are the same */
472d14abf15SRobert Mustacchi 
473d14abf15SRobert Mustacchi     kcqe.flags |= (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT);
474d14abf15SRobert Mustacchi 
475d14abf15SRobert Mustacchi     lm_sc_complete_slow_path_request(pdev, &kcqe);
476d14abf15SRobert Mustacchi }
477d14abf15SRobert Mustacchi 
478d14abf15SRobert Mustacchi lm_status_t
lm_sc_alloc_resc(IN struct _lm_device_t * pdev)479d14abf15SRobert Mustacchi lm_sc_alloc_resc(
480d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev
481d14abf15SRobert Mustacchi     )
482d14abf15SRobert Mustacchi {
483d14abf15SRobert Mustacchi     u8_t        mm_cli_idx  = LM_RESOURCE_ISCSI;
484d14abf15SRobert Mustacchi     u8_t        *chk_buf    = NULL;
485d14abf15SRobert Mustacchi     u16_t       i           = 0;
486d14abf15SRobert Mustacchi 
487d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
488d14abf15SRobert Mustacchi     {
489d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
490d14abf15SRobert Mustacchi     }
491d14abf15SRobert Mustacchi 
492d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->iscsi_info, sizeof(lm_iscsi_info_t));
493d14abf15SRobert Mustacchi 
494d14abf15SRobert Mustacchi     /* Allocate global buffer */
495d14abf15SRobert Mustacchi     pdev->iscsi_info.bind.global_buff_base_virt = (u8_t*)mm_alloc_phys_mem(pdev,
496d14abf15SRobert Mustacchi                                                                       ISCSI_GLOBAL_BUF_SIZE,
497d14abf15SRobert Mustacchi                                                                       &pdev->iscsi_info.bind.global_buff_base_phy,
498d14abf15SRobert Mustacchi                                                                       0,
499d14abf15SRobert Mustacchi                                                                       mm_cli_idx);
500d14abf15SRobert Mustacchi     if CHK_NULL(pdev->iscsi_info.bind.global_buff_base_virt)
501d14abf15SRobert Mustacchi     {
502d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
503d14abf15SRobert Mustacchi     }
504d14abf15SRobert Mustacchi 
505d14abf15SRobert Mustacchi     /* cid recycled cb registration  */
506d14abf15SRobert Mustacchi     lm_cid_recycled_cb_register(pdev, ISCSI_CONNECTION_TYPE, lm_sc_recycle_cid_cb);
507d14abf15SRobert Mustacchi 
508d14abf15SRobert Mustacchi     /* Sq-completion cb registration (sq that get completed internally in driver */
509d14abf15SRobert Mustacchi     lm_sq_comp_cb_register(pdev, ISCSI_CONNECTION_TYPE, lm_sc_comp_cb);
510d14abf15SRobert Mustacchi 
511d14abf15SRobert Mustacchi     chk_buf = (u8_t *)(&(pdev->iscsi_info.eq_addr_save));
512d14abf15SRobert Mustacchi     // Except global_buff and pdev->iscsi_info all other fileds should be zero
513d14abf15SRobert Mustacchi     for(i = 0 ;i < sizeof(pdev->iscsi_info.eq_addr_save) ;i++)
514d14abf15SRobert Mustacchi     {
515d14abf15SRobert Mustacchi         DbgBreakIf(0 != chk_buf[i]);
516d14abf15SRobert Mustacchi     }
517d14abf15SRobert Mustacchi 
518d14abf15SRobert Mustacchi     chk_buf = (u8_t *)(&(pdev->iscsi_info.run_time));
519d14abf15SRobert Mustacchi     // Except global_buff and pdev->iscsi_info all other fileds should be zero
520d14abf15SRobert Mustacchi     for(i = 0 ;i < sizeof(pdev->iscsi_info.run_time) ;i++)
521d14abf15SRobert Mustacchi     {
522d14abf15SRobert Mustacchi         DbgBreakIf(0 != chk_buf[i]);
523d14abf15SRobert Mustacchi     }
524d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
525d14abf15SRobert Mustacchi } /* lm_sc_alloc_resc */
526d14abf15SRobert Mustacchi 
527d14abf15SRobert Mustacchi /*******************************************************************************
528d14abf15SRobert Mustacchi  * Description:
529d14abf15SRobert Mustacchi  *
530d14abf15SRobert Mustacchi  * Return:
531d14abf15SRobert Mustacchi  ******************************************************************************/
532d14abf15SRobert Mustacchi u16_t
lm_l5_eq_page_cnt(IN struct _lm_device_t * pdev,const u32_t max_func_cons,const u16_t reserved_eq_elements,const u16_t eqes_per_page,const u16_t max_eq_pages)533d14abf15SRobert Mustacchi lm_l5_eq_page_cnt(
534d14abf15SRobert Mustacchi     IN struct       _lm_device_t *pdev,
535d14abf15SRobert Mustacchi     const u32_t     max_func_cons,
536d14abf15SRobert Mustacchi     const u16_t     reserved_eq_elements,
537d14abf15SRobert Mustacchi     const u16_t     eqes_per_page,
538d14abf15SRobert Mustacchi     const u16_t     max_eq_pages
539d14abf15SRobert Mustacchi     )
540d14abf15SRobert Mustacchi {
541d14abf15SRobert Mustacchi     u16_t eq_page_cnt = 0;
542d14abf15SRobert Mustacchi     u16_t min_eq_size = 0;
543d14abf15SRobert Mustacchi 
544d14abf15SRobert Mustacchi     /* Init EQs - create page chains */
545d14abf15SRobert Mustacchi     min_eq_size = (u16_t)(max_func_cons + reserved_eq_elements);
546d14abf15SRobert Mustacchi     eq_page_cnt = CEIL_DIV(min_eq_size, (eqes_per_page));
547d14abf15SRobert Mustacchi     eq_page_cnt = min(eq_page_cnt, max_eq_pages);
548d14abf15SRobert Mustacchi 
549d14abf15SRobert Mustacchi     return eq_page_cnt;
550d14abf15SRobert Mustacchi }
551d14abf15SRobert Mustacchi 
552d14abf15SRobert Mustacchi /*******************************************************************************
553d14abf15SRobert Mustacchi  * Description:
554d14abf15SRobert Mustacchi  *
555d14abf15SRobert Mustacchi  * Return:
556d14abf15SRobert Mustacchi  ******************************************************************************/
557d14abf15SRobert Mustacchi lm_status_t
lm_fc_free_init_resc(IN struct _lm_device_t * pdev)558d14abf15SRobert Mustacchi lm_fc_free_init_resc(
559d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev
560d14abf15SRobert Mustacchi     )
561d14abf15SRobert Mustacchi {
562d14abf15SRobert Mustacchi     lm_status_t         lm_status   = LM_STATUS_SUCCESS;
563d14abf15SRobert Mustacchi     u16_t               eq_sb_idx   = 0;
564d14abf15SRobert Mustacchi     u16_t               eq_page_cnt = 0;
565d14abf15SRobert Mustacchi 
566d14abf15SRobert Mustacchi     if (CHK_NULL(pdev))
567d14abf15SRobert Mustacchi     {
568d14abf15SRobert Mustacchi         DbgBreakMsg("lm_fc_free_init_resc failed");
569d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
570d14abf15SRobert Mustacchi     }
571d14abf15SRobert Mustacchi 
572d14abf15SRobert Mustacchi     mm_memset(&(pdev->fcoe_info.run_time), 0, sizeof(pdev->fcoe_info.run_time));
573d14abf15SRobert Mustacchi     return lm_status;
574d14abf15SRobert Mustacchi }
575d14abf15SRobert Mustacchi 
576d14abf15SRobert Mustacchi 
577d14abf15SRobert Mustacchi lm_status_t
lm_fc_clear_d0_resc(IN struct _lm_device_t * pdev,const u8_t cid)578d14abf15SRobert Mustacchi lm_fc_clear_d0_resc(
579d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
580d14abf15SRobert Mustacchi     const u8_t cid
581d14abf15SRobert Mustacchi     )
582d14abf15SRobert Mustacchi {
583d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
584d14abf15SRobert Mustacchi     u8_t eq_idx = 0;
585d14abf15SRobert Mustacchi 
586d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
587d14abf15SRobert Mustacchi     {
588d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
589d14abf15SRobert Mustacchi     }
590d14abf15SRobert Mustacchi 
591d14abf15SRobert Mustacchi     LM_FC_FOREACH_EQ_IDX(pdev, eq_idx)
592d14abf15SRobert Mustacchi     {
593d14abf15SRobert Mustacchi         lm_clear_chain_sb_cons_idx(pdev, eq_idx, &LM_FC_EQ(pdev, eq_idx).hc_sb_info, &LM_FC_EQ(pdev, eq_idx).hw_con_idx_ptr);
594d14abf15SRobert Mustacchi     }
595d14abf15SRobert Mustacchi 
596d14abf15SRobert Mustacchi     lm_status = lm_fc_free_init_resc(pdev);
597d14abf15SRobert Mustacchi 
598d14abf15SRobert Mustacchi     return lm_status;
599d14abf15SRobert Mustacchi } /* lm_fc_clear_d0_resc */
600d14abf15SRobert Mustacchi 
601d14abf15SRobert Mustacchi lm_status_t
lm_fc_clear_resc(IN struct _lm_device_t * pdev)602d14abf15SRobert Mustacchi lm_fc_clear_resc(
603d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev
604d14abf15SRobert Mustacchi     )
605d14abf15SRobert Mustacchi {
606d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
607d14abf15SRobert Mustacchi     const u8_t cid  = FCOE_CID(pdev);
608d14abf15SRobert Mustacchi 
609d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
610d14abf15SRobert Mustacchi     {
611d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
612d14abf15SRobert Mustacchi     }
613d14abf15SRobert Mustacchi 
614d14abf15SRobert Mustacchi     lm_fc_clear_d0_resc(
615d14abf15SRobert Mustacchi         pdev,
616d14abf15SRobert Mustacchi         cid);
617d14abf15SRobert Mustacchi     s_list_init(&LM_RXQ(pdev, cid).active_descq, NULL, NULL, 0);
618d14abf15SRobert Mustacchi     s_list_init(&LM_RXQ(pdev, cid).common.free_descq, NULL, NULL, 0);
619d14abf15SRobert Mustacchi 
620d14abf15SRobert Mustacchi     return lm_status;
621d14abf15SRobert Mustacchi } /* lm_fc_clear_resc */
622d14abf15SRobert Mustacchi 
623d14abf15SRobert Mustacchi 
624d14abf15SRobert Mustacchi /*******************************************************************************
625d14abf15SRobert Mustacchi  * Description:
626d14abf15SRobert Mustacchi  *
627d14abf15SRobert Mustacchi  * Return:
628d14abf15SRobert Mustacchi  ******************************************************************************/
629d14abf15SRobert Mustacchi lm_status_t
lm_sc_free_init_resc(IN struct _lm_device_t * pdev)630d14abf15SRobert Mustacchi lm_sc_free_init_resc(
631d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev
632d14abf15SRobert Mustacchi     )
633d14abf15SRobert Mustacchi {
634d14abf15SRobert Mustacchi     lm_status_t         lm_status   = LM_STATUS_SUCCESS;
635d14abf15SRobert Mustacchi     u16_t               eq_sb_idx   = 0;
636d14abf15SRobert Mustacchi     u16_t               eq_page_cnt = 0;
637d14abf15SRobert Mustacchi 
638d14abf15SRobert Mustacchi     if (CHK_NULL(pdev))
639d14abf15SRobert Mustacchi     {
640d14abf15SRobert Mustacchi         DbgBreakMsg("lm_sc_free_init_resc failed");
641d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
642d14abf15SRobert Mustacchi     }
643d14abf15SRobert Mustacchi 
644d14abf15SRobert Mustacchi     mm_memset(&(pdev->iscsi_info.run_time), 0, sizeof(pdev->iscsi_info.run_time));
645d14abf15SRobert Mustacchi     return lm_status;
646d14abf15SRobert Mustacchi }
647d14abf15SRobert Mustacchi 
648d14abf15SRobert Mustacchi 
649d14abf15SRobert Mustacchi lm_status_t
lm_sc_clear_d0_resc(IN struct _lm_device_t * pdev,const u8_t cid)650d14abf15SRobert Mustacchi lm_sc_clear_d0_resc(
651d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
652d14abf15SRobert Mustacchi     const u8_t cid
653d14abf15SRobert Mustacchi     )
654d14abf15SRobert Mustacchi {
655d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
656d14abf15SRobert Mustacchi     u8_t eq_idx = 0;
657d14abf15SRobert Mustacchi 
658d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
659d14abf15SRobert Mustacchi     {
660d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
661d14abf15SRobert Mustacchi     }
662d14abf15SRobert Mustacchi 
663d14abf15SRobert Mustacchi     LM_SC_FOREACH_EQ_IDX(pdev, eq_idx)
664d14abf15SRobert Mustacchi     {
665d14abf15SRobert Mustacchi         lm_clear_chain_sb_cons_idx(pdev, eq_idx, &LM_SC_EQ(pdev, eq_idx).hc_sb_info, &LM_SC_EQ(pdev, eq_idx).hw_con_idx_ptr);
666d14abf15SRobert Mustacchi     }
667d14abf15SRobert Mustacchi 
668d14abf15SRobert Mustacchi     lm_status = lm_sc_free_init_resc(pdev);
669d14abf15SRobert Mustacchi 
670d14abf15SRobert Mustacchi     return lm_status;
671d14abf15SRobert Mustacchi } /* lm_sc_clear_d0_resc */
672d14abf15SRobert Mustacchi 
673d14abf15SRobert Mustacchi lm_status_t
lm_sc_clear_resc(IN struct _lm_device_t * pdev)674d14abf15SRobert Mustacchi lm_sc_clear_resc(
675d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev
676d14abf15SRobert Mustacchi     )
677d14abf15SRobert Mustacchi {
678d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
679d14abf15SRobert Mustacchi     const u8_t cid  = ISCSI_CID(pdev);
680d14abf15SRobert Mustacchi 
681d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
682d14abf15SRobert Mustacchi     {
683d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
684d14abf15SRobert Mustacchi     }
685d14abf15SRobert Mustacchi 
686d14abf15SRobert Mustacchi     lm_sc_clear_d0_resc(
687d14abf15SRobert Mustacchi         pdev,
688d14abf15SRobert Mustacchi         cid);
689d14abf15SRobert Mustacchi     s_list_init(&LM_RXQ(pdev, cid).active_descq, NULL, NULL, 0);
690d14abf15SRobert Mustacchi     s_list_init(&LM_RXQ(pdev, cid).common.free_descq, NULL, NULL, 0);
691d14abf15SRobert Mustacchi 
692d14abf15SRobert Mustacchi     return lm_status;
693d14abf15SRobert Mustacchi } /* lm_sc_clear_resc */
694d14abf15SRobert Mustacchi 
695d14abf15SRobert Mustacchi 
696d14abf15SRobert Mustacchi 
697d14abf15SRobert Mustacchi lm_status_t
lm_sc_ooo_chain_establish(IN struct _lm_device_t * pdev)698d14abf15SRobert Mustacchi lm_sc_ooo_chain_establish(
699d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev)
700d14abf15SRobert Mustacchi {
701d14abf15SRobert Mustacchi     lm_status_t             lm_status = LM_STATUS_SUCCESS;
702d14abf15SRobert Mustacchi     const u32_t             func        = FUNC_ID(pdev);
703d14abf15SRobert Mustacchi 
704d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
705d14abf15SRobert Mustacchi     {
706d14abf15SRobert Mustacchi         lm_status = LM_STATUS_INVALID_PARAMETER;
707d14abf15SRobert Mustacchi         return lm_status;
708d14abf15SRobert Mustacchi     }
709d14abf15SRobert Mustacchi     LM_INTMEM_WRITE32(pdev,
710d14abf15SRobert Mustacchi                       TSTORM_ISCSI_L2_ISCSI_OOO_CONS_OFFSET(func),
711d14abf15SRobert Mustacchi                       0,
712d14abf15SRobert Mustacchi                       BAR_TSTRORM_INTMEM);
713d14abf15SRobert Mustacchi 
714d14abf15SRobert Mustacchi     LM_INTMEM_WRITE32(pdev,
715d14abf15SRobert Mustacchi                       TSTORM_ISCSI_L2_ISCSI_OOO_CID_TABLE_OFFSET(func),
716d14abf15SRobert Mustacchi                       HW_CID(pdev, OOO_CID(pdev)),
717d14abf15SRobert Mustacchi                       BAR_TSTRORM_INTMEM);
718d14abf15SRobert Mustacchi 
719d14abf15SRobert Mustacchi     LM_INTMEM_WRITE32(pdev,
720d14abf15SRobert Mustacchi                       TSTORM_ISCSI_L2_ISCSI_OOO_CLIENT_ID_TABLE_OFFSET(func),
721d14abf15SRobert Mustacchi                       LM_FW_CLI_ID(pdev,OOO_CID(pdev)),
722d14abf15SRobert Mustacchi                       BAR_TSTRORM_INTMEM);
723d14abf15SRobert Mustacchi 
724d14abf15SRobert Mustacchi 
725d14abf15SRobert Mustacchi     return lm_status;
726d14abf15SRobert Mustacchi }
727d14abf15SRobert Mustacchi 
728d14abf15SRobert Mustacchi 
729d14abf15SRobert Mustacchi /*******************************************************************************
730d14abf15SRobert Mustacchi  * Description:
731d14abf15SRobert Mustacchi  *
732d14abf15SRobert Mustacchi  * Return:
733d14abf15SRobert Mustacchi  ******************************************************************************/
734d14abf15SRobert Mustacchi lm_status_t
lm_sc_init(IN struct _lm_device_t * pdev,IN struct iscsi_kwqe_init1 * req1,IN struct iscsi_kwqe_init2 * req2)735d14abf15SRobert Mustacchi lm_sc_init(
736d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
737d14abf15SRobert Mustacchi     IN struct iscsi_kwqe_init1  *req1,
738d14abf15SRobert Mustacchi     IN struct iscsi_kwqe_init2  *req2
739d14abf15SRobert Mustacchi     )
740d14abf15SRobert Mustacchi {
741d14abf15SRobert Mustacchi     lm_status_t                  lm_status;
742d14abf15SRobert Mustacchi     u16_t                        eq_page_cnt;
743d14abf15SRobert Mustacchi     u32_t                        hq_size_in_bytes;
744d14abf15SRobert Mustacchi     u32_t                        hq_pbl_entries;
745d14abf15SRobert Mustacchi     u32_t                        eq_idx;
746d14abf15SRobert Mustacchi     u16_t                        eq_sb_idx;
747d14abf15SRobert Mustacchi     u32_t                        page_size_bits;
748d14abf15SRobert Mustacchi     u8_t                         delayed_ack_en              = 0;
749d14abf15SRobert Mustacchi     const u8_t                   is_chain_mode               = TRUE;
750d14abf15SRobert Mustacchi     const u32_t                  func                        = FUNC_ID(pdev);
751d14abf15SRobert Mustacchi     struct tstorm_l5cm_tcp_flags tstorm_l5cm_tcp_flags_param = {0};
752d14abf15SRobert Mustacchi 
753d14abf15SRobert Mustacchi     if (CHK_NULL(req1) || CHK_NULL(req2))
754d14abf15SRobert Mustacchi     {
755d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
756d14abf15SRobert Mustacchi     }
757d14abf15SRobert Mustacchi 
758d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "### lm_sc_init\n");
759d14abf15SRobert Mustacchi 
760d14abf15SRobert Mustacchi     page_size_bits = GET_FIELD(req1->flags, ISCSI_KWQE_INIT1_PAGE_SIZE);
761d14abf15SRobert Mustacchi     if (LM_PAGE_BITS - ISCSI_PAGE_BITS_SHIFT != page_size_bits)
762d14abf15SRobert Mustacchi     {
763d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "lm_sc_init: Illegal page size.\n");
764d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
765d14abf15SRobert Mustacchi     }
766d14abf15SRobert Mustacchi 
767d14abf15SRobert Mustacchi     if(ISCSI_HSI_VERSION != req1->hsi_version)
768d14abf15SRobert Mustacchi     {
769d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
770d14abf15SRobert Mustacchi     }
771d14abf15SRobert Mustacchi 
772d14abf15SRobert Mustacchi     delayed_ack_en = GET_FIELD(req1->flags, ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE);
773d14abf15SRobert Mustacchi 
774d14abf15SRobert Mustacchi     pdev->iscsi_info.run_time.num_of_tasks = req1->num_tasks_per_conn;
775d14abf15SRobert Mustacchi     pdev->iscsi_info.run_time.cq_size      = req1->cq_num_wqes;
776d14abf15SRobert Mustacchi     pdev->iscsi_info.run_time.num_of_cqs   = req1->num_cqs;
777d14abf15SRobert Mustacchi 
778d14abf15SRobert Mustacchi     /* the number of cqs is used to determine the number of eqs */
779d14abf15SRobert Mustacchi     if (pdev->iscsi_info.run_time.num_of_cqs > MAX_EQ_CHAIN)
780d14abf15SRobert Mustacchi     {
781d14abf15SRobert Mustacchi         DbgBreakIf(pdev->iscsi_info.run_time.num_of_cqs > MAX_EQ_CHAIN);
782d14abf15SRobert Mustacchi         pdev->iscsi_info.run_time.num_of_cqs = MAX_EQ_CHAIN;
783d14abf15SRobert Mustacchi     }
784d14abf15SRobert Mustacchi     pdev->iscsi_info.run_time.l5_eq_chain_cnt     = pdev->iscsi_info.run_time.num_of_cqs;
785d14abf15SRobert Mustacchi     pdev->iscsi_info.run_time.l5_eq_max_chain_cnt = MAX_EQ_CHAIN;
786d14abf15SRobert Mustacchi     // Only one EQ chain is supported.
787d14abf15SRobert Mustacchi 
788d14abf15SRobert Mustacchi     if ((pdev->iscsi_info.run_time.l5_eq_chain_cnt > 1)||
789d14abf15SRobert Mustacchi         (pdev->params.sb_cnt < pdev->iscsi_info.run_time.l5_eq_chain_cnt))
790d14abf15SRobert Mustacchi     {
791d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "lm_sc_init: l5_eq_chain_cnt=%d\n.\n",pdev->iscsi_info.run_time.l5_eq_chain_cnt);
792d14abf15SRobert Mustacchi         DbgBreakMsg("lm_sc_init: pdev->iscsi_info.l5_eq_chain_cnt is bigger than 1.\n");
793d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
794d14abf15SRobert Mustacchi     }
795d14abf15SRobert Mustacchi     DbgBreakIf(pdev->iscsi_info.run_time.l5_eq_chain_cnt > 1);
796d14abf15SRobert Mustacchi     DbgBreakIf(pdev->params.sb_cnt < pdev->iscsi_info.run_time.l5_eq_chain_cnt);
797d14abf15SRobert Mustacchi     /* TOE when RSS is disabled, ISCSI and FCOE will use the same NDSB.  */
798d14abf15SRobert Mustacchi     pdev->iscsi_info.run_time.l5_eq_base_chain_idx = LM_NON_RSS_SB(pdev);
799d14abf15SRobert Mustacchi 
800d14abf15SRobert Mustacchi //    if (!pdev->params.l4_enable_rss) {
801d14abf15SRobert Mustacchi //        RESET_FLAGS(pdev->params.sb_cpu_affinity, 1 << LM_TOE_RSS_BASE_CHAIN_INDEX(&pdev->lmdev));
802d14abf15SRobert Mustacchi //    }
803d14abf15SRobert Mustacchi 
804d14abf15SRobert Mustacchi 
805d14abf15SRobert Mustacchi     /* round up HQ size to fill an entire page */
806d14abf15SRobert Mustacchi     hq_size_in_bytes = req1->num_ccells_per_conn * sizeof(struct iscsi_hq_bd);
807d14abf15SRobert Mustacchi     hq_pbl_entries = lm_get_pbl_entries(hq_size_in_bytes);
808d14abf15SRobert Mustacchi     pdev->iscsi_info.run_time.hq_size = (u16_t)(hq_pbl_entries * (LM_PAGE_SIZE / sizeof(struct iscsi_hq_bd)));
809d14abf15SRobert Mustacchi 
810d14abf15SRobert Mustacchi     /* Init EQs - create page chains */
811d14abf15SRobert Mustacchi     // The size of the EQ in iSCSI is <num iscsi connections> * 2 +slowpath.
812d14abf15SRobert Mustacchi     // I.e. for each connection there should be room for 1 fastpath completion and 1 error notification.
813d14abf15SRobert Mustacchi     eq_page_cnt = lm_l5_eq_page_cnt(pdev,
814d14abf15SRobert Mustacchi                                     (u16_t)(pdev->params.max_func_iscsi_cons * 2),
815d14abf15SRobert Mustacchi                                     RESERVED_ISCSI_EQ_ELEMENTS,
816d14abf15SRobert Mustacchi                                     (ISCSI_EQES_PER_PAGE(is_chain_mode)),
817d14abf15SRobert Mustacchi                                     MAX_EQ_PAGES);// Sub the next BD page.
818d14abf15SRobert Mustacchi 
819d14abf15SRobert Mustacchi     LM_SC_FOREACH_EQ_IDX(pdev, eq_sb_idx)
820d14abf15SRobert Mustacchi     {
821d14abf15SRobert Mustacchi         lm_status = lm_l5_alloc_eq(pdev, &LM_SC_EQ(pdev, eq_sb_idx), &LM_EQ_ADDR_SAVE_SC(pdev, eq_sb_idx) , eq_page_cnt, LM_CLI_IDX_ISCSI);
822d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
823d14abf15SRobert Mustacchi         {
824d14abf15SRobert Mustacchi             return lm_status;
825d14abf15SRobert Mustacchi         }
826d14abf15SRobert Mustacchi 
827d14abf15SRobert Mustacchi         lm_status = lm_sc_setup_eq(pdev, eq_sb_idx,is_chain_mode);
828d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
829d14abf15SRobert Mustacchi         {
830d14abf15SRobert Mustacchi             return lm_status;
831d14abf15SRobert Mustacchi         }
832d14abf15SRobert Mustacchi     }
833d14abf15SRobert Mustacchi 
834d14abf15SRobert Mustacchi     SET_FLAGS( tstorm_l5cm_tcp_flags_param.flags, delayed_ack_en << TSTORM_L5CM_TCP_FLAGS_DELAYED_ACK_EN_SHIFT);
835d14abf15SRobert Mustacchi 
836d14abf15SRobert Mustacchi     // in case size change, we need to change LM_INTMEM_WRITEXX macro etc...
837d14abf15SRobert Mustacchi     ASSERT_STATIC( sizeof(tstorm_l5cm_tcp_flags_param) == sizeof(u16_t) );
838d14abf15SRobert Mustacchi 
839d14abf15SRobert Mustacchi     /* Init internal RAM */
840d14abf15SRobert Mustacchi     ASSERT_STATIC(sizeof(struct regpair_t) == sizeof(lm_address_t));
841d14abf15SRobert Mustacchi 
842d14abf15SRobert Mustacchi     /* init Tstorm RAM */
843d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, TSTORM_ISCSI_RQ_SIZE_OFFSET(func),           req1->rq_num_wqes, BAR_TSTRORM_INTMEM);
844d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, TSTORM_ISCSI_PAGE_SIZE_OFFSET(func),         LM_PAGE_SIZE, BAR_TSTRORM_INTMEM);
845d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8 (pdev, TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func),     LM_PAGE_BITS, BAR_TSTRORM_INTMEM);
846d14abf15SRobert Mustacchi     LM_INTMEM_WRITE32(pdev, TSTORM_ISCSI_TCP_LOCAL_ADV_WND_OFFSET(func), 0x100000, BAR_TSTRORM_INTMEM);
847d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func),      req1->num_tasks_per_conn, BAR_TSTRORM_INTMEM);
848d14abf15SRobert Mustacchi     LM_INTMEM_WRITE64(pdev, TSTORM_ISCSI_ERROR_BITMAP_OFFSET(func),      *((u64_t *)&req2->error_bit_map), BAR_TSTRORM_INTMEM);
849d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(func),     tstorm_l5cm_tcp_flags_param.flags, BAR_TSTRORM_INTMEM);
850d14abf15SRobert Mustacchi 
851d14abf15SRobert Mustacchi     /* init Ustorm RAM */
852d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(func), req1->rq_buffer_size, BAR_USTRORM_INTMEM);
853d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_ISCSI_PAGE_SIZE_OFFSET(func), LM_PAGE_SIZE, BAR_USTRORM_INTMEM);
854d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8 (pdev, USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), LM_PAGE_BITS, BAR_USTRORM_INTMEM);
855d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), req1->num_tasks_per_conn, BAR_USTRORM_INTMEM);
856d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_ISCSI_RQ_SIZE_OFFSET(func), req1->rq_num_wqes, BAR_USTRORM_INTMEM);
857d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_ISCSI_CQ_SIZE_OFFSET(func), req1->cq_num_wqes, BAR_USTRORM_INTMEM);
858d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(func), req2->max_cq_sqn, BAR_USTRORM_INTMEM);
859d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_ISCSI_R2TQ_SIZE_OFFSET(func), (u16_t)pdev->iscsi_info.run_time.num_of_tasks * ISCSI_MAX_NUM_OF_PENDING_R2TS, BAR_USTRORM_INTMEM);
860d14abf15SRobert Mustacchi     LM_INTMEM_WRITE64(pdev, USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(func), pdev->iscsi_info.bind.global_buff_base_phy.as_u64, BAR_USTRORM_INTMEM);
861d14abf15SRobert Mustacchi     LM_INTMEM_WRITE64(pdev, USTORM_ISCSI_ERROR_BITMAP_OFFSET(func), *((u64_t *)&req2->error_bit_map), BAR_USTRORM_INTMEM);
862d14abf15SRobert Mustacchi 
863d14abf15SRobert Mustacchi     /* init Xstorm RAM */
864d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, XSTORM_ISCSI_PAGE_SIZE_OFFSET(func), LM_PAGE_SIZE, BAR_XSTRORM_INTMEM);
865d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8 (pdev, XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), LM_PAGE_BITS, BAR_XSTRORM_INTMEM);
866d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), req1->num_tasks_per_conn, BAR_XSTRORM_INTMEM);
867d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, XSTORM_ISCSI_HQ_SIZE_OFFSET(func), pdev->iscsi_info.run_time.hq_size, BAR_XSTRORM_INTMEM);
868d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, XSTORM_ISCSI_SQ_SIZE_OFFSET(func), req1->num_tasks_per_conn, BAR_XSTRORM_INTMEM);
869d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, XSTORM_ISCSI_R2TQ_SIZE_OFFSET(func), req1->num_tasks_per_conn * ISCSI_MAX_NUM_OF_PENDING_R2TS, BAR_XSTRORM_INTMEM);
870d14abf15SRobert Mustacchi 
871d14abf15SRobert Mustacchi     /* init Cstorm RAM */
872d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_PAGE_SIZE_OFFSET(func), LM_PAGE_SIZE, BAR_CSTRORM_INTMEM);
873d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8 (pdev, CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), LM_PAGE_BITS, BAR_CSTRORM_INTMEM);
874d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), req1->num_tasks_per_conn, BAR_CSTRORM_INTMEM);
875d14abf15SRobert Mustacchi     LM_SC_FOREACH_EQ_IDX(pdev, eq_sb_idx)
876d14abf15SRobert Mustacchi     {
877d14abf15SRobert Mustacchi         eq_idx = eq_sb_idx - pdev->iscsi_info.run_time.l5_eq_base_chain_idx;
878d14abf15SRobert Mustacchi         LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_EQ_PROD_OFFSET(func, eq_idx), lm_bd_chain_prod_idx(&LM_SC_EQ(pdev, eq_sb_idx).bd_chain), BAR_CSTRORM_INTMEM);
879d14abf15SRobert Mustacchi         LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_EQ_CONS_OFFSET(func, eq_idx), 0 , BAR_CSTRORM_INTMEM);
880d14abf15SRobert Mustacchi         LM_INTMEM_WRITE32(pdev, CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(func, eq_idx), lm_bd_chain_phys_addr(&LM_SC_EQ(pdev, eq_sb_idx).bd_chain, 1).as_u32.low, BAR_CSTRORM_INTMEM);
881d14abf15SRobert Mustacchi         LM_INTMEM_WRITE32(pdev, 4 + CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(func, eq_idx), lm_bd_chain_phys_addr(&LM_SC_EQ(pdev, eq_sb_idx).bd_chain, 1).as_u32.high, BAR_CSTRORM_INTMEM);
882d14abf15SRobert Mustacchi         LM_INTMEM_WRITE32(pdev, CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(func, eq_idx), lm_bd_chain_phys_addr(&LM_SC_EQ(pdev, eq_sb_idx).bd_chain, 0).as_u32.low, BAR_CSTRORM_INTMEM);
883d14abf15SRobert Mustacchi         LM_INTMEM_WRITE32(pdev, 4 + CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(func, eq_idx), lm_bd_chain_phys_addr(&LM_SC_EQ(pdev, eq_sb_idx).bd_chain, 0).as_u32.high, BAR_CSTRORM_INTMEM);
884d14abf15SRobert Mustacchi         LM_INTMEM_WRITE8 (pdev, CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(func, eq_idx), 1, BAR_CSTRORM_INTMEM); // maybe move to init tool
885d14abf15SRobert Mustacchi         LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_EQ_SB_NUM_OFFSET(func, eq_idx), LM_FW_SB_ID(pdev,eq_sb_idx), BAR_CSTRORM_INTMEM);
886d14abf15SRobert Mustacchi         LM_INTMEM_WRITE8 (pdev, CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(func, eq_idx), HC_INDEX_ISCSI_EQ_CONS, BAR_CSTRORM_INTMEM);
887d14abf15SRobert Mustacchi     }
888d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_HQ_SIZE_OFFSET(func), pdev->iscsi_info.run_time.hq_size, BAR_CSTRORM_INTMEM);
889d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_CQ_SIZE_OFFSET(func), req1->cq_num_wqes, BAR_CSTRORM_INTMEM);
890d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(func), req2->max_cq_sqn, BAR_CSTRORM_INTMEM);
891d14abf15SRobert Mustacchi 
892d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
893d14abf15SRobert Mustacchi } /* lm_sc_init */
894d14abf15SRobert Mustacchi 
895d14abf15SRobert Mustacchi 
896d14abf15SRobert Mustacchi 
897d14abf15SRobert Mustacchi /* Get dma memory for init ramrod */
898d14abf15SRobert Mustacchi STATIC lm_status_t
lm_fc_get_ramrod_phys_mem(IN struct _lm_device_t * pdev)899d14abf15SRobert Mustacchi lm_fc_get_ramrod_phys_mem(
900d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev)
901d14abf15SRobert Mustacchi {
902d14abf15SRobert Mustacchi 
903d14abf15SRobert Mustacchi     if CHK_NULL(pdev->fcoe_info.bind.ramrod_mem_virt)
904d14abf15SRobert Mustacchi     {
905d14abf15SRobert Mustacchi         pdev->fcoe_info.bind.ramrod_mem_virt =
906d14abf15SRobert Mustacchi         mm_alloc_phys_mem(pdev,
907d14abf15SRobert Mustacchi                           sizeof(lm_fcoe_slow_path_phys_data_t),
908d14abf15SRobert Mustacchi                           &pdev->fcoe_info.bind.ramrod_mem_phys,
909d14abf15SRobert Mustacchi                           0,
910d14abf15SRobert Mustacchi                           LM_CLI_IDX_FCOE);
911d14abf15SRobert Mustacchi 
912d14abf15SRobert Mustacchi         if CHK_NULL(pdev->fcoe_info.bind.ramrod_mem_virt)
913d14abf15SRobert Mustacchi         {
914d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
915d14abf15SRobert Mustacchi         }
916d14abf15SRobert Mustacchi     }
917d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
918d14abf15SRobert Mustacchi }
919d14abf15SRobert Mustacchi 
920d14abf15SRobert Mustacchi 
921d14abf15SRobert Mustacchi 
922d14abf15SRobert Mustacchi lm_status_t
lm_fc_init(IN struct _lm_device_t * pdev,IN struct fcoe_kwqe_init1 * init1,IN struct fcoe_kwqe_init2 * init2,IN struct fcoe_kwqe_init3 * init3)923d14abf15SRobert Mustacchi lm_fc_init(
924d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
925d14abf15SRobert Mustacchi     IN struct fcoe_kwqe_init1       *init1,
926d14abf15SRobert Mustacchi     IN struct fcoe_kwqe_init2       *init2,
927d14abf15SRobert Mustacchi     IN struct fcoe_kwqe_init3       *init3)
928d14abf15SRobert Mustacchi {
929d14abf15SRobert Mustacchi     lm_status_t                     lm_status;
930d14abf15SRobert Mustacchi     lm_fcoe_slow_path_phys_data_t   *ramrod_params;
931d14abf15SRobert Mustacchi     u16_t                           eq_page_cnt;
932d14abf15SRobert Mustacchi     u16_t                           eq_sb_idx;
933d14abf15SRobert Mustacchi     u32_t                           func;
934d14abf15SRobert Mustacchi     u32_t                           port;
935d14abf15SRobert Mustacchi     const u8_t                      is_chain_mode = FALSE;
936d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(init1) || CHK_NULL(init2) || CHK_NULL(init3))
937d14abf15SRobert Mustacchi     {
938d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
939d14abf15SRobert Mustacchi     }
940d14abf15SRobert Mustacchi 
941d14abf15SRobert Mustacchi     func = FUNC_ID(pdev);
942d14abf15SRobert Mustacchi     port = PORT_ID(pdev);
943d14abf15SRobert Mustacchi 
944d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "### lm_fc_init\n");
945d14abf15SRobert Mustacchi 
946d14abf15SRobert Mustacchi     pdev->fcoe_info.run_time.num_of_cqs = 1;                 // one EQ
947d14abf15SRobert Mustacchi 
948d14abf15SRobert Mustacchi     // Only one EQ chain is supported.
949d14abf15SRobert Mustacchi     if ((pdev->fcoe_info.run_time.num_of_cqs > 1)||
950d14abf15SRobert Mustacchi         (pdev->params.sb_cnt < pdev->fcoe_info.run_time.num_of_cqs))
951d14abf15SRobert Mustacchi     {
952d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "lm_fc_init: num_of_cqs=%d\n.\n",pdev->fcoe_info.run_time.num_of_cqs);
953d14abf15SRobert Mustacchi         DbgBreakMsg("lm_fc_init: pdev->fcoe_info.run_time.num_of_cqs is bigger than 1.\n");
954d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
955d14abf15SRobert Mustacchi     }
956d14abf15SRobert Mustacchi     DbgBreakIf(pdev->fcoe_info.run_time.num_of_cqs > 1);
957d14abf15SRobert Mustacchi     DbgBreakIf(pdev->params.sb_cnt < pdev->fcoe_info.run_time.num_of_cqs);
958d14abf15SRobert Mustacchi     /* TOE when RSS is disabled, ISCSI and FCOE will use the same NDSB.  */
959d14abf15SRobert Mustacchi     pdev->fcoe_info.run_time.fc_eq_base_chain_idx = LM_NON_RSS_SB(pdev);
960d14abf15SRobert Mustacchi 
961d14abf15SRobert Mustacchi     if(CHK_NULL(pdev->fcoe_info.bind.ramrod_mem_virt))
962d14abf15SRobert Mustacchi     {
963d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
964d14abf15SRobert Mustacchi     }
965d14abf15SRobert Mustacchi     ramrod_params = (lm_fcoe_slow_path_phys_data_t*)pdev->fcoe_info.bind.ramrod_mem_virt;
966d14abf15SRobert Mustacchi 
967d14abf15SRobert Mustacchi     // Init EQs - create page chains
968d14abf15SRobert Mustacchi     eq_page_cnt = lm_l5_eq_page_cnt(pdev,
969d14abf15SRobert Mustacchi                                     (u16_t)pdev->params.max_func_fcoe_cons,
970d14abf15SRobert Mustacchi                                     RESERVED_FCOE_EQ_ELEMENTS,
971d14abf15SRobert Mustacchi                                     FCOE_EQES_PER_PAGE(is_chain_mode),
972d14abf15SRobert Mustacchi                                     FCOE_MAX_EQ_PAGES_PER_FUNC);
973d14abf15SRobert Mustacchi 
974d14abf15SRobert Mustacchi 
975d14abf15SRobert Mustacchi     LM_FC_FOREACH_EQ_IDX(pdev, eq_sb_idx)
976d14abf15SRobert Mustacchi     {
977d14abf15SRobert Mustacchi         lm_status = lm_l5_alloc_eq(pdev, &LM_FC_EQ(pdev, eq_sb_idx),&LM_EQ_ADDR_SAVE_FC(pdev, eq_sb_idx),eq_page_cnt, LM_CLI_IDX_FCOE);
978d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
979d14abf15SRobert Mustacchi         {
980d14abf15SRobert Mustacchi             return lm_status;
981d14abf15SRobert Mustacchi         }
982d14abf15SRobert Mustacchi 
983d14abf15SRobert Mustacchi         lm_status = lm_fc_alloc_eq_pbl(pdev, &LM_FC_EQ(pdev, eq_sb_idx), &LM_FC_PBL(pdev, eq_sb_idx),
984d14abf15SRobert Mustacchi                                        &LM_EQ_ADDR_SAVE_FC(pdev, eq_sb_idx));
985d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
986d14abf15SRobert Mustacchi         {
987d14abf15SRobert Mustacchi             return lm_status;
988d14abf15SRobert Mustacchi         }
989d14abf15SRobert Mustacchi 
990d14abf15SRobert Mustacchi         lm_status = lm_fc_setup_eq(pdev, eq_sb_idx,is_chain_mode);
991d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
992d14abf15SRobert Mustacchi         {
993d14abf15SRobert Mustacchi             return lm_status;
994d14abf15SRobert Mustacchi         }
995d14abf15SRobert Mustacchi     }
996d14abf15SRobert Mustacchi 
997d14abf15SRobert Mustacchi     /* Set up the ramrod params */
998d14abf15SRobert Mustacchi     mm_memset(ramrod_params, 0, sizeof(lm_fcoe_slow_path_phys_data_t));
999d14abf15SRobert Mustacchi 
1000d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_init.init_kwqe1, init1, sizeof(struct fcoe_kwqe_init1));
1001d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_init.init_kwqe2, init2, sizeof(struct fcoe_kwqe_init2));
1002d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_init.init_kwqe3, init3, sizeof(struct fcoe_kwqe_init3));
1003d14abf15SRobert Mustacchi 
1004d14abf15SRobert Mustacchi 
1005d14abf15SRobert Mustacchi     /* waiting for new HSI */
1006d14abf15SRobert Mustacchi     ramrod_params->fcoe_init.eq_pbl_base.lo = mm_cpu_to_le32(LM_FC_PBL(pdev, pdev->fcoe_info.run_time.fc_eq_base_chain_idx).pbl_phys_table_phys.as_u32.low);
1007d14abf15SRobert Mustacchi     ramrod_params->fcoe_init.eq_pbl_base.hi = mm_cpu_to_le32(LM_FC_PBL(pdev, pdev->fcoe_info.run_time.fc_eq_base_chain_idx).pbl_phys_table_phys.as_u32.high);
1008d14abf15SRobert Mustacchi     ramrod_params->fcoe_init.eq_pbl_size = mm_cpu_to_le32(LM_FC_PBL(pdev, pdev->fcoe_info.run_time.fc_eq_base_chain_idx).pbl_entries);
1009d14abf15SRobert Mustacchi     ramrod_params->fcoe_init.eq_prod = mm_cpu_to_le16(lm_bd_chain_prod_idx(&LM_FC_EQ(pdev, pdev->fcoe_info.run_time.fc_eq_base_chain_idx).bd_chain));
1010d14abf15SRobert Mustacchi     ramrod_params->fcoe_init.sb_num = mm_cpu_to_le16(LM_FW_SB_ID(pdev,pdev->fcoe_info.run_time.fc_eq_base_chain_idx));
1011d14abf15SRobert Mustacchi     ramrod_params->fcoe_init.sb_id = HC_INDEX_FCOE_EQ_CONS;
1012d14abf15SRobert Mustacchi 
1013d14abf15SRobert Mustacchi     if (IS_SD_UFP_MODE(pdev))
1014d14abf15SRobert Mustacchi     {
1015d14abf15SRobert Mustacchi         ramrod_params->fcoe_init.init_kwqe1.flags |= FCOE_KWQE_INIT1_CLASSIFY_FAILED_ALLOWED;
1016d14abf15SRobert Mustacchi     }
1017d14abf15SRobert Mustacchi 
1018d14abf15SRobert Mustacchi     lm_status = lm_command_post(pdev,
1019d14abf15SRobert Mustacchi                                 LM_CLI_CID(pdev, LM_CLI_IDX_FCOE),      /* cid */
1020d14abf15SRobert Mustacchi                                 FCOE_RAMROD_CMD_ID_INIT_FUNC,
1021d14abf15SRobert Mustacchi                                 CMD_PRIORITY_NORMAL,
1022d14abf15SRobert Mustacchi                                 FCOE_CONNECTION_TYPE,
1023d14abf15SRobert Mustacchi                                 pdev->fcoe_info.bind.ramrod_mem_phys.as_u64);
1024d14abf15SRobert Mustacchi 
1025d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1026d14abf15SRobert Mustacchi     {
1027d14abf15SRobert Mustacchi         /* only one we know off... */
1028d14abf15SRobert Mustacchi         DbgBreakIf(lm_status != LM_STATUS_REQUEST_NOT_ACCEPTED);
1029d14abf15SRobert Mustacchi         /* Command wasn't posted, so we need to complete it from here. */
1030d14abf15SRobert Mustacchi 
1031d14abf15SRobert Mustacchi     }
1032d14abf15SRobert Mustacchi 
1033d14abf15SRobert Mustacchi     // completion is asynchronous
1034d14abf15SRobert Mustacchi 
1035d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1036d14abf15SRobert Mustacchi } /* lm_fc_init */
1037d14abf15SRobert Mustacchi 
1038d14abf15SRobert Mustacchi 
1039d14abf15SRobert Mustacchi /** Description
1040d14abf15SRobert Mustacchi  *  Callback function for cids being recylced
1041d14abf15SRobert Mustacchi  */
1042d14abf15SRobert Mustacchi void
lm_fc_recycle_cid_cb(struct _lm_device_t * pdev,void * cookie,s32_t cid)1043d14abf15SRobert Mustacchi lm_fc_recycle_cid_cb(
1044d14abf15SRobert Mustacchi     struct _lm_device_t             *pdev,
1045d14abf15SRobert Mustacchi     void                            *cookie,
1046d14abf15SRobert Mustacchi     s32_t                           cid)
1047d14abf15SRobert Mustacchi {
1048d14abf15SRobert Mustacchi     lm_status_t         lm_status;
1049d14abf15SRobert Mustacchi     lm_sp_req_common_t  *sp_req = NULL;
1050d14abf15SRobert Mustacchi     lm_fcoe_state_t     *fcoe = (lm_fcoe_state_t *)cookie;
1051d14abf15SRobert Mustacchi 
1052d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(fcoe))
1053d14abf15SRobert Mustacchi     {
1054d14abf15SRobert Mustacchi         DbgBreakIf(1);
1055d14abf15SRobert Mustacchi         return;
1056d14abf15SRobert Mustacchi     }
1057d14abf15SRobert Mustacchi 
1058d14abf15SRobert Mustacchi     MM_ACQUIRE_TOE_LOCK(pdev);
1059d14abf15SRobert Mustacchi 
1060d14abf15SRobert Mustacchi     /* un-block the manager... */
1061d14abf15SRobert Mustacchi     lm_set_cid_state(pdev, fcoe->cid, LM_CID_STATE_VALID);
1062d14abf15SRobert Mustacchi 
1063d14abf15SRobert Mustacchi     lm_status = lm_fc_init_fcoe_context(pdev, fcoe);
1064d14abf15SRobert Mustacchi 
1065d14abf15SRobert Mustacchi     lm_status = lm_fc_post_offload_ramrod(pdev, fcoe);
1066d14abf15SRobert Mustacchi 
1067d14abf15SRobert Mustacchi     /* we can now unblock any pending slow-paths */
1068d14abf15SRobert Mustacchi     lm_sp_req_manager_unblock(pdev, cid, &sp_req);
1069d14abf15SRobert Mustacchi 
1070d14abf15SRobert Mustacchi     MM_RELEASE_TOE_LOCK(pdev);
1071d14abf15SRobert Mustacchi }
1072d14abf15SRobert Mustacchi 
lm_fc_comp_cb(struct _lm_device_t * pdev,struct sq_pending_command * pending)1073d14abf15SRobert Mustacchi void lm_fc_comp_cb(struct _lm_device_t *pdev, struct sq_pending_command *pending)
1074d14abf15SRobert Mustacchi {
1075d14abf15SRobert Mustacchi     struct fcoe_kcqe kcqe = {0};
1076d14abf15SRobert Mustacchi     lm_fcoe_state_t *fcoe = NULL;
1077d14abf15SRobert Mustacchi     u32_t            cid;
1078d14abf15SRobert Mustacchi     u8_t             cmd;
1079d14abf15SRobert Mustacchi 
1080d14abf15SRobert Mustacchi 
1081d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(pending))
1082d14abf15SRobert Mustacchi     {
1083d14abf15SRobert Mustacchi         return;
1084d14abf15SRobert Mustacchi     }
1085d14abf15SRobert Mustacchi 
1086d14abf15SRobert Mustacchi     cmd = pending->cmd;
1087d14abf15SRobert Mustacchi     cid = pending->cid;
1088d14abf15SRobert Mustacchi 
1089d14abf15SRobert Mustacchi     fcoe = lm_cid_cookie(pdev, FCOE_CONNECTION_TYPE, cid);
1090d14abf15SRobert Mustacchi 
1091d14abf15SRobert Mustacchi     if (fcoe)
1092d14abf15SRobert Mustacchi     {
1093d14abf15SRobert Mustacchi         kcqe.fcoe_conn_id         = fcoe->fcoe_conn_id;
1094d14abf15SRobert Mustacchi         kcqe.fcoe_conn_context_id = HW_CID(pdev, cid);
1095d14abf15SRobert Mustacchi     }
1096d14abf15SRobert Mustacchi 
1097d14abf15SRobert Mustacchi     kcqe.completion_status = LM_STATUS_SUCCESS; /* Fixme: do we want this?? maybe ok since l5 is aware of er... */
1098d14abf15SRobert Mustacchi 
1099d14abf15SRobert Mustacchi     switch (cmd)
1100d14abf15SRobert Mustacchi     {
1101d14abf15SRobert Mustacchi     case FCOE_RAMROD_CMD_ID_INIT_FUNC:
1102d14abf15SRobert Mustacchi         kcqe.op_code = FCOE_KCQE_OPCODE_INIT_FUNC;
1103d14abf15SRobert Mustacchi         break;
1104d14abf15SRobert Mustacchi 
1105d14abf15SRobert Mustacchi     case FCOE_RAMROD_CMD_ID_DESTROY_FUNC:
1106d14abf15SRobert Mustacchi         kcqe.op_code = FCOE_KCQE_OPCODE_DESTROY_FUNC;
1107d14abf15SRobert Mustacchi         break;
1108d14abf15SRobert Mustacchi 
1109d14abf15SRobert Mustacchi     case FCOE_RAMROD_CMD_ID_STAT_FUNC:
1110d14abf15SRobert Mustacchi         kcqe.op_code = FCOE_KCQE_OPCODE_STAT_FUNC;
1111d14abf15SRobert Mustacchi         break;
1112d14abf15SRobert Mustacchi 
1113d14abf15SRobert Mustacchi     case FCOE_RAMROD_CMD_ID_OFFLOAD_CONN:
1114d14abf15SRobert Mustacchi         kcqe.op_code = FCOE_KCQE_OPCODE_OFFLOAD_CONN;
1115d14abf15SRobert Mustacchi         break;
1116d14abf15SRobert Mustacchi 
1117d14abf15SRobert Mustacchi     case FCOE_RAMROD_CMD_ID_ENABLE_CONN:
1118d14abf15SRobert Mustacchi         kcqe.op_code = FCOE_KCQE_OPCODE_ENABLE_CONN;
1119d14abf15SRobert Mustacchi         break;
1120d14abf15SRobert Mustacchi 
1121d14abf15SRobert Mustacchi     case FCOE_RAMROD_CMD_ID_DISABLE_CONN:
1122d14abf15SRobert Mustacchi         kcqe.op_code = FCOE_KCQE_OPCODE_DISABLE_CONN;
1123d14abf15SRobert Mustacchi         break;
1124d14abf15SRobert Mustacchi 
1125d14abf15SRobert Mustacchi     case FCOE_RAMROD_CMD_ID_TERMINATE_CONN:
1126d14abf15SRobert Mustacchi         kcqe.op_code = FCOE_RAMROD_CMD_ID_TERMINATE_CONN;
1127d14abf15SRobert Mustacchi         break;
1128d14abf15SRobert Mustacchi     }
1129d14abf15SRobert Mustacchi 
1130d14abf15SRobert Mustacchi     lm_fc_complete_slow_path_request(pdev, &kcqe);
1131d14abf15SRobert Mustacchi }
1132d14abf15SRobert Mustacchi 
1133d14abf15SRobert Mustacchi /**
1134d14abf15SRobert Mustacchi  * @description
1135d14abf15SRobert Mustacchi  * Returns the max FCOE task supported.
1136d14abf15SRobert Mustacchi  * In oreder to know the max task enabled refer to
1137d14abf15SRobert Mustacchi  * pdev->params.max_fcoe_task
1138d14abf15SRobert Mustacchi  * @param pdev
1139d14abf15SRobert Mustacchi  *
1140d14abf15SRobert Mustacchi  * @return u32_t
1141d14abf15SRobert Mustacchi  */
1142d14abf15SRobert Mustacchi u32_t
lm_fc_max_fcoe_task_sup(IN struct _lm_device_t * pdev)1143d14abf15SRobert Mustacchi lm_fc_max_fcoe_task_sup(
1144d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev)
1145d14abf15SRobert Mustacchi {
1146d14abf15SRobert Mustacchi     u32_t max_fcoe_task = MAX_NUM_FCOE_TASKS_PER_ENGINE;
1147d14abf15SRobert Mustacchi 
1148d14abf15SRobert Mustacchi     /* FCOE supports a maximum of MAX_FCOE_FUNCS_PER_ENGINE per engine.
1149d14abf15SRobert Mustacchi      * Incase of mf / 4-port mode it means we can have more than one fcoe function
1150d14abf15SRobert Mustacchi      * on an engine - in which case we'll need to divide the number of tasks between them.
1151d14abf15SRobert Mustacchi      * However, in single function mode, on a 2-port chip (i.e. one function on the engine)
1152d14abf15SRobert Mustacchi      * the fcoe function will have all the tasks allocated to it
1153d14abf15SRobert Mustacchi      */
1154d14abf15SRobert Mustacchi     if (IS_MULTI_VNIC(pdev) || (CHIP_PORT_MODE(pdev) == LM_CHIP_PORT_MODE_4))
1155d14abf15SRobert Mustacchi     {
1156d14abf15SRobert Mustacchi         max_fcoe_task = max_fcoe_task / MAX_FCOE_FUNCS_PER_ENGINE;
1157d14abf15SRobert Mustacchi     }
1158d14abf15SRobert Mustacchi 
1159d14abf15SRobert Mustacchi     return max_fcoe_task;
1160d14abf15SRobert Mustacchi }
1161d14abf15SRobert Mustacchi /**
1162d14abf15SRobert Mustacchi  *
1163d14abf15SRobert Mustacchi  *
1164d14abf15SRobert Mustacchi  * @description
1165d14abf15SRobert Mustacchi  *
1166d14abf15SRobert Mustacchi  * @param pdev
1167d14abf15SRobert Mustacchi  *
1168d14abf15SRobert Mustacchi  * @return STATIC void
1169d14abf15SRobert Mustacchi  */
1170d14abf15SRobert Mustacchi STATIC void
lm_fc_init_vars(IN struct _lm_device_t * pdev)1171d14abf15SRobert Mustacchi lm_fc_init_vars(
1172d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev)
1173d14abf15SRobert Mustacchi {
1174d14abf15SRobert Mustacchi 
1175d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
1176d14abf15SRobert Mustacchi     {
1177d14abf15SRobert Mustacchi         return ;
1178d14abf15SRobert Mustacchi     }
1179d14abf15SRobert Mustacchi 
1180d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->fcoe_info, sizeof(lm_fcoe_info_t));
1181d14abf15SRobert Mustacchi }
1182d14abf15SRobert Mustacchi /**
1183d14abf15SRobert Mustacchi  *
1184d14abf15SRobert Mustacchi  *
1185d14abf15SRobert Mustacchi  * @description
1186d14abf15SRobert Mustacchi  *
1187d14abf15SRobert Mustacchi  * @param pdev
1188d14abf15SRobert Mustacchi  *
1189d14abf15SRobert Mustacchi  * @return lm_status_t
1190d14abf15SRobert Mustacchi  */
1191d14abf15SRobert Mustacchi lm_status_t
lm_fc_alloc_resc(IN struct _lm_device_t * pdev)1192d14abf15SRobert Mustacchi lm_fc_alloc_resc(
1193d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev)
1194d14abf15SRobert Mustacchi {
1195d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
1196d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
1197d14abf15SRobert Mustacchi     {
1198d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1199d14abf15SRobert Mustacchi     }
1200d14abf15SRobert Mustacchi     lm_fc_init_vars(pdev);
1201d14abf15SRobert Mustacchi     /* cid recycled cb registration */
1202d14abf15SRobert Mustacchi     lm_cid_recycled_cb_register(pdev, FCOE_CONNECTION_TYPE, lm_fc_recycle_cid_cb);
1203d14abf15SRobert Mustacchi 
1204d14abf15SRobert Mustacchi     /* Sq-completion cb registration (sq that get completed internally in driver */
1205d14abf15SRobert Mustacchi     lm_sq_comp_cb_register(pdev, FCOE_CONNECTION_TYPE, lm_fc_comp_cb);
1206d14abf15SRobert Mustacchi     /* Get physical memory for RAMROD commands */
1207d14abf15SRobert Mustacchi     lm_status = lm_fc_get_ramrod_phys_mem(pdev);
1208d14abf15SRobert Mustacchi 
1209d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1210d14abf15SRobert Mustacchi     {
1211d14abf15SRobert Mustacchi         return lm_status;
1212d14abf15SRobert Mustacchi     }
1213d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1214d14abf15SRobert Mustacchi } /* lm_fc_alloc_resc */
1215d14abf15SRobert Mustacchi 
1216d14abf15SRobert Mustacchi 
1217d14abf15SRobert Mustacchi 
1218d14abf15SRobert Mustacchi 
lm_sc_complete_l4_ofld_request(lm_device_t * pdev,struct iscsi_kcqe * kcqe)1219d14abf15SRobert Mustacchi lm_status_t lm_sc_complete_l4_ofld_request(lm_device_t *pdev, struct iscsi_kcqe *kcqe)
1220d14abf15SRobert Mustacchi {
1221d14abf15SRobert Mustacchi     u32_t comp_status = 0;
1222d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp;
1223d14abf15SRobert Mustacchi     u32_t cid;
1224d14abf15SRobert Mustacchi 
1225d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(kcqe))
1226d14abf15SRobert Mustacchi     {
1227d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1228d14abf15SRobert Mustacchi     }
1229d14abf15SRobert Mustacchi 
1230d14abf15SRobert Mustacchi     cid = SW_CID(kcqe->iscsi_conn_context_id);
1231d14abf15SRobert Mustacchi     tcp = lm_cid_cookie(pdev, TOE_CONNECTION_TYPE, cid);
1232d14abf15SRobert Mustacchi     DbgBreakIf(!tcp);
1233d14abf15SRobert Mustacchi 
1234d14abf15SRobert Mustacchi     if (kcqe->completion_status & ISCSI_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE)
1235d14abf15SRobert Mustacchi     {
1236d14abf15SRobert Mustacchi         /* currently there is no specific completion status handling, only success / fail */
1237d14abf15SRobert Mustacchi         /* but originally the flags are those of toe_initiate_offload_ramrod_data */
1238d14abf15SRobert Mustacchi         comp_status = 1;
1239d14abf15SRobert Mustacchi     }
1240d14abf15SRobert Mustacchi 
1241d14abf15SRobert Mustacchi     /* toe lock is taken inside */
1242d14abf15SRobert Mustacchi     lm_tcp_comp_initiate_offload_request(pdev, tcp, comp_status);
1243d14abf15SRobert Mustacchi 
1244d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1245d14abf15SRobert Mustacchi }
1246d14abf15SRobert Mustacchi 
lm_sc_complete_l4_upload_request(lm_device_t * pdev,u8_t op_code,u32_t cid)1247d14abf15SRobert Mustacchi lm_status_t lm_sc_complete_l4_upload_request(lm_device_t *pdev, u8_t op_code, u32_t cid)
1248d14abf15SRobert Mustacchi {
1249d14abf15SRobert Mustacchi     lm_status_t      lm_status = LM_STATUS_SUCCESS;
1250d14abf15SRobert Mustacchi     lm_tcp_state_t * tcp       = NULL;
1251d14abf15SRobert Mustacchi 
1252d14abf15SRobert Mustacchi     tcp = lm_cid_cookie(pdev, TOE_CONNECTION_TYPE, cid);
1253d14abf15SRobert Mustacchi     if (NULL == tcp)
1254d14abf15SRobert Mustacchi     {
1255d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
1256d14abf15SRobert Mustacchi     }
1257d14abf15SRobert Mustacchi 
1258d14abf15SRobert Mustacchi     switch (op_code)
1259d14abf15SRobert Mustacchi     {
1260d14abf15SRobert Mustacchi     case L5CM_RAMROD_CMD_ID_SEARCHER_DELETE:
1261d14abf15SRobert Mustacchi         if (mm_sc_is_omgr_enabled(pdev))
1262d14abf15SRobert Mustacchi         {
1263d14abf15SRobert Mustacchi             lm_empty_ramrod_eth(pdev, OOO_CID(pdev), cid, NULL, 0 /*d/c*/);
1264d14abf15SRobert Mustacchi         }
1265d14abf15SRobert Mustacchi         else
1266d14abf15SRobert Mustacchi         {
1267d14abf15SRobert Mustacchi             lm_tcp_searcher_ramrod_complete(pdev, tcp);
1268d14abf15SRobert Mustacchi         }
1269d14abf15SRobert Mustacchi         break;
1270d14abf15SRobert Mustacchi     case RAMROD_CMD_ID_ETH_EMPTY:
1271d14abf15SRobert Mustacchi         lm_tcp_searcher_ramrod_complete(pdev, tcp);
1272d14abf15SRobert Mustacchi         break;
1273d14abf15SRobert Mustacchi     case L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD:
1274d14abf15SRobert Mustacchi         lm_tcp_terminate_ramrod_complete(pdev, tcp);
1275d14abf15SRobert Mustacchi         break;
1276d14abf15SRobert Mustacchi     case L5CM_RAMROD_CMD_ID_QUERY:
1277d14abf15SRobert Mustacchi         lm_tcp_query_ramrod_complete(pdev, tcp);
1278d14abf15SRobert Mustacchi         break;
1279d14abf15SRobert Mustacchi     default:
1280d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "lm_sc_complete_l4_upload_request: Invalid op_code 0x%x.\n", op_code);
1281d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1282d14abf15SRobert Mustacchi     }
1283d14abf15SRobert Mustacchi 
1284d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1285d14abf15SRobert Mustacchi }
1286d14abf15SRobert Mustacchi 
1287d14abf15SRobert Mustacchi 
1288d14abf15SRobert Mustacchi 
lm_sc_complete_slow_path_request(lm_device_t * pdev,struct iscsi_kcqe * kcqe)1289d14abf15SRobert Mustacchi lm_status_t lm_sc_complete_slow_path_request(lm_device_t *pdev, struct iscsi_kcqe *kcqe)
1290d14abf15SRobert Mustacchi {
1291d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_FAILURE;
1292d14abf15SRobert Mustacchi     u8_t        op_code   = 0;
1293d14abf15SRobert Mustacchi 
1294d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(kcqe))
1295d14abf15SRobert Mustacchi     {
1296d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1297d14abf15SRobert Mustacchi     }
1298d14abf15SRobert Mustacchi 
1299d14abf15SRobert Mustacchi     op_code = kcqe->op_code; /* Store the opcode, the function below may modify it (internal searcher), need to keep for sq_complete later on  */
1300d14abf15SRobert Mustacchi 
1301d14abf15SRobert Mustacchi     switch (kcqe->op_code)
1302d14abf15SRobert Mustacchi     {
1303d14abf15SRobert Mustacchi /*  case ISCSI_KCQE_OPCODE_INIT:
1304d14abf15SRobert Mustacchi         lm_status = mm_sc_complete_init_request(pdev, kcqe);
1305d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1306d14abf15SRobert Mustacchi         {
1307d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_sc_complete_slow_path_request: lm_sc_complete_init_request failed.\n");
1308d14abf15SRobert Mustacchi         }
1309d14abf15SRobert Mustacchi         break;
1310d14abf15SRobert Mustacchi */    case L5CM_RAMROD_CMD_ID_ADD_NEW_CONNECTION:
1311d14abf15SRobert Mustacchi         lm_status = lm_sc_complete_l4_ofld_request(pdev, kcqe);
1312d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1313d14abf15SRobert Mustacchi         {
1314d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_sc_complete_slow_path_request: lm_sc_complete_l4_ofld_request failed.\n");
1315d14abf15SRobert Mustacchi         }
1316d14abf15SRobert Mustacchi         break;
1317d14abf15SRobert Mustacchi     case ISCSI_KCQE_OPCODE_UPDATE_CONN:
1318d14abf15SRobert Mustacchi         lm_status = mm_sc_complete_update_request(pdev, kcqe);
1319d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1320d14abf15SRobert Mustacchi         {
1321d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_sc_complete_slow_path_request: lm_sc_complete_update_request failed.\n");
1322d14abf15SRobert Mustacchi         }
1323d14abf15SRobert Mustacchi         break;
1324d14abf15SRobert Mustacchi     case L5CM_RAMROD_CMD_ID_SEARCHER_DELETE:
1325d14abf15SRobert Mustacchi     case L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD:
1326d14abf15SRobert Mustacchi     case L5CM_RAMROD_CMD_ID_QUERY:
1327d14abf15SRobert Mustacchi         lm_status = lm_sc_complete_l4_upload_request(pdev, kcqe->op_code, SW_CID(kcqe->iscsi_conn_context_id));
1328d14abf15SRobert Mustacchi         break;
1329d14abf15SRobert Mustacchi     default:
1330d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "lm_sc_complete_slow_path_request: Invalid op_code 0x%x.\n", kcqe->op_code);
1331d14abf15SRobert Mustacchi     }
1332d14abf15SRobert Mustacchi 
1333d14abf15SRobert Mustacchi     lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, op_code,
1334d14abf15SRobert Mustacchi                    ISCSI_CONNECTION_TYPE, SW_CID(kcqe->iscsi_conn_context_id));
1335d14abf15SRobert Mustacchi 
1336d14abf15SRobert Mustacchi     return lm_status;
1337d14abf15SRobert Mustacchi }
1338d14abf15SRobert Mustacchi 
1339d14abf15SRobert Mustacchi 
1340d14abf15SRobert Mustacchi /* Handle FC related ramrod completions */
1341d14abf15SRobert Mustacchi lm_status_t
lm_fc_complete_slow_path_request(IN struct _lm_device_t * pdev,IN struct fcoe_kcqe * kcqe)1342d14abf15SRobert Mustacchi lm_fc_complete_slow_path_request(
1343d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
1344d14abf15SRobert Mustacchi     IN struct fcoe_kcqe             *kcqe)
1345d14abf15SRobert Mustacchi {
1346d14abf15SRobert Mustacchi     lm_status_t                     lm_status    = LM_STATUS_FAILURE;
1347d14abf15SRobert Mustacchi     lm_fcoe_state_t                 *fcoe        = NULL;
1348d14abf15SRobert Mustacchi     const u8_t                      priority     = CMD_PRIORITY_NORMAL;
1349d14abf15SRobert Mustacchi     const enum connection_type      con_type     = FCOE_CONNECTION_TYPE;
1350d14abf15SRobert Mustacchi     u32_t                           cid          = 0;
1351d14abf15SRobert Mustacchi     u32_t                           sw_cid       = 0;
1352d14abf15SRobert Mustacchi     u8_t                            fcoe_commnad = 0;
1353d14abf15SRobert Mustacchi     u8_t                            b_valid      = TRUE;
1354d14abf15SRobert Mustacchi 
1355d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(kcqe))
1356d14abf15SRobert Mustacchi     {
1357d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1358d14abf15SRobert Mustacchi     }
1359d14abf15SRobert Mustacchi 
1360d14abf15SRobert Mustacchi     switch (kcqe->op_code)
1361d14abf15SRobert Mustacchi     {
1362d14abf15SRobert Mustacchi         case FCOE_KCQE_OPCODE_INIT_FUNC:
1363d14abf15SRobert Mustacchi         {
1364d14abf15SRobert Mustacchi             fcoe_commnad = FCOE_RAMROD_CMD_ID_INIT_FUNC;
1365d14abf15SRobert Mustacchi             lm_status    = mm_fc_complete_init_request(pdev, kcqe);
1366d14abf15SRobert Mustacchi             cid          = LM_CLI_CID(pdev, LM_CLI_IDX_FCOE);
1367d14abf15SRobert Mustacchi             break;
1368d14abf15SRobert Mustacchi         }
1369d14abf15SRobert Mustacchi         case FCOE_KCQE_OPCODE_OFFLOAD_CONN:
1370d14abf15SRobert Mustacchi         {
1371d14abf15SRobert Mustacchi             fcoe_commnad = FCOE_RAMROD_CMD_ID_OFFLOAD_CONN;
1372d14abf15SRobert Mustacchi 
1373d14abf15SRobert Mustacchi             DbgBreakIf(0 != mm_le32_to_cpu(kcqe->completion_status)); /* offload should never fail */
1374d14abf15SRobert Mustacchi 
1375d14abf15SRobert Mustacchi             sw_cid = SW_CID(mm_le32_to_cpu(kcqe->fcoe_conn_context_id));
1376d14abf15SRobert Mustacchi             fcoe   = lm_cid_cookie(pdev, con_type, sw_cid);
1377d14abf15SRobert Mustacchi 
1378d14abf15SRobert Mustacchi             if(!fcoe)
1379d14abf15SRobert Mustacchi             {
1380d14abf15SRobert Mustacchi                 lm_status = LM_STATUS_RESOURCE;
1381d14abf15SRobert Mustacchi                 DbgBreakIf(!fcoe);
1382d14abf15SRobert Mustacchi                 break;
1383d14abf15SRobert Mustacchi             }
1384d14abf15SRobert Mustacchi 
1385d14abf15SRobert Mustacchi             cid       = fcoe->cid;
1386d14abf15SRobert Mustacchi             lm_status = mm_fc_complete_ofld_request(pdev, fcoe, kcqe);
1387d14abf15SRobert Mustacchi             break;
1388d14abf15SRobert Mustacchi         }
1389d14abf15SRobert Mustacchi         case FCOE_KCQE_OPCODE_ENABLE_CONN:
1390d14abf15SRobert Mustacchi         {
1391d14abf15SRobert Mustacchi             fcoe_commnad = FCOE_RAMROD_CMD_ID_ENABLE_CONN;
1392d14abf15SRobert Mustacchi 
1393d14abf15SRobert Mustacchi             DbgBreakIf(0 != mm_le32_to_cpu(kcqe->completion_status)); /* enable should never fail */
1394d14abf15SRobert Mustacchi 
1395d14abf15SRobert Mustacchi             sw_cid = SW_CID(mm_le32_to_cpu(kcqe->fcoe_conn_context_id));
1396d14abf15SRobert Mustacchi             fcoe   = lm_cid_cookie(pdev, con_type, sw_cid);
1397d14abf15SRobert Mustacchi 
1398d14abf15SRobert Mustacchi             if(!fcoe)
1399d14abf15SRobert Mustacchi             {
1400d14abf15SRobert Mustacchi                 lm_status = LM_STATUS_RESOURCE;
1401d14abf15SRobert Mustacchi                 DbgBreakIf(!fcoe);
1402d14abf15SRobert Mustacchi                 break;
1403d14abf15SRobert Mustacchi             }
1404d14abf15SRobert Mustacchi             cid    = fcoe->cid;
1405d14abf15SRobert Mustacchi 
1406d14abf15SRobert Mustacchi             lm_status = mm_fc_complete_enable_request(pdev, fcoe, kcqe);
1407d14abf15SRobert Mustacchi             break;
1408d14abf15SRobert Mustacchi         }
1409d14abf15SRobert Mustacchi         case FCOE_KCQE_OPCODE_DISABLE_CONN:
1410d14abf15SRobert Mustacchi         {
1411d14abf15SRobert Mustacchi             fcoe_commnad = FCOE_RAMROD_CMD_ID_DISABLE_CONN;
1412d14abf15SRobert Mustacchi 
1413d14abf15SRobert Mustacchi             /* Disable is complete, now we need to send the terminate ramrod */
1414d14abf15SRobert Mustacchi             DbgBreakIf(0 != mm_le32_to_cpu(kcqe->completion_status)); /* disable should never fail */
1415d14abf15SRobert Mustacchi 
1416d14abf15SRobert Mustacchi             sw_cid = SW_CID(mm_le32_to_cpu(kcqe->fcoe_conn_context_id));
1417d14abf15SRobert Mustacchi             fcoe   = lm_cid_cookie(pdev, con_type, sw_cid);
1418d14abf15SRobert Mustacchi 
1419d14abf15SRobert Mustacchi             if(!fcoe)
1420d14abf15SRobert Mustacchi             {
1421d14abf15SRobert Mustacchi                 lm_status = LM_STATUS_RESOURCE;
1422d14abf15SRobert Mustacchi                 DbgBreakIf(!fcoe);
1423d14abf15SRobert Mustacchi                 break;
1424d14abf15SRobert Mustacchi             }
1425d14abf15SRobert Mustacchi 
1426d14abf15SRobert Mustacchi             cid          = fcoe->cid;
1427d14abf15SRobert Mustacchi             lm_status    = mm_fc_complete_disable_request(pdev, fcoe, kcqe);
1428d14abf15SRobert Mustacchi             break;
1429d14abf15SRobert Mustacchi         }
1430d14abf15SRobert Mustacchi         case FCOE_KCQE_OPCODE_DESTROY_FUNC:
1431d14abf15SRobert Mustacchi         {
1432d14abf15SRobert Mustacchi             fcoe_commnad = FCOE_RAMROD_CMD_ID_DESTROY_FUNC;
1433d14abf15SRobert Mustacchi             lm_status    = mm_fc_complete_destroy_request(pdev, kcqe);
1434d14abf15SRobert Mustacchi             cid          = LM_CLI_CID(pdev, LM_CLI_IDX_FCOE);
1435d14abf15SRobert Mustacchi             break;
1436d14abf15SRobert Mustacchi         }
1437d14abf15SRobert Mustacchi         case FCOE_KCQE_OPCODE_STAT_FUNC:
1438d14abf15SRobert Mustacchi         {
1439d14abf15SRobert Mustacchi             fcoe_commnad = FCOE_RAMROD_CMD_ID_STAT_FUNC;
1440d14abf15SRobert Mustacchi             lm_status    = mm_fc_complete_stat_request(pdev, kcqe);
1441d14abf15SRobert Mustacchi             cid          = LM_CLI_CID(pdev, LM_CLI_IDX_FCOE);
1442d14abf15SRobert Mustacchi             break;
1443d14abf15SRobert Mustacchi         }
1444d14abf15SRobert Mustacchi         case FCOE_RAMROD_CMD_ID_TERMINATE_CONN: /* Internal VBD not passed up... */
1445d14abf15SRobert Mustacchi         {
1446d14abf15SRobert Mustacchi             fcoe_commnad = FCOE_RAMROD_CMD_ID_TERMINATE_CONN;
1447d14abf15SRobert Mustacchi 
1448d14abf15SRobert Mustacchi             /* Terminate is complete, now we need to send the CFC delete ramrod */
1449d14abf15SRobert Mustacchi             DbgBreakIf(0 != mm_le32_to_cpu(kcqe->completion_status)); /* terminate should never fail */
1450d14abf15SRobert Mustacchi 
1451d14abf15SRobert Mustacchi             sw_cid = SW_CID(mm_le32_to_cpu(kcqe->fcoe_conn_context_id));
1452d14abf15SRobert Mustacchi 
1453d14abf15SRobert Mustacchi             fcoe = lm_cid_cookie(pdev, con_type, sw_cid);
1454d14abf15SRobert Mustacchi 
1455d14abf15SRobert Mustacchi             if(!fcoe)
1456d14abf15SRobert Mustacchi             {
1457d14abf15SRobert Mustacchi                 lm_status = LM_STATUS_RESOURCE;
1458d14abf15SRobert Mustacchi                 DbgBreakIf(!fcoe);
1459d14abf15SRobert Mustacchi                 break;
1460d14abf15SRobert Mustacchi             }
1461d14abf15SRobert Mustacchi 
1462d14abf15SRobert Mustacchi             cid = fcoe->cid;
1463d14abf15SRobert Mustacchi 
1464d14abf15SRobert Mustacchi             lm_status = mm_fc_complete_terminate_request(pdev, fcoe, kcqe);
1465d14abf15SRobert Mustacchi             break;
1466d14abf15SRobert Mustacchi         }
1467d14abf15SRobert Mustacchi         default:
1468d14abf15SRobert Mustacchi         {
1469d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_fc_complete_slow_path_request: Invalid op_code 0x%x.\n", kcqe->op_code);
1470d14abf15SRobert Mustacchi             b_valid = FALSE;
1471d14abf15SRobert Mustacchi             break;
1472d14abf15SRobert Mustacchi         }
1473d14abf15SRobert Mustacchi     }
1474d14abf15SRobert Mustacchi 
1475d14abf15SRobert Mustacchi     if( b_valid )
1476d14abf15SRobert Mustacchi     {
1477d14abf15SRobert Mustacchi         lm_sq_complete(pdev, priority, fcoe_commnad, con_type, cid);
1478d14abf15SRobert Mustacchi     }
1479d14abf15SRobert Mustacchi 
1480d14abf15SRobert Mustacchi     return lm_status;
1481d14abf15SRobert Mustacchi }
1482d14abf15SRobert Mustacchi 
lm_sc_is_eq_completion(lm_device_t * pdev,u8_t sb_idx)1483d14abf15SRobert Mustacchi u8_t lm_sc_is_eq_completion(lm_device_t *pdev, u8_t sb_idx)
1484d14abf15SRobert Mustacchi {
1485d14abf15SRobert Mustacchi     u8_t result = FALSE;
1486d14abf15SRobert Mustacchi     lm_eq_chain_t *eq = NULL;
1487d14abf15SRobert Mustacchi 
1488d14abf15SRobert Mustacchi     DbgBreakIf(!(pdev && ARRSIZE(pdev->iscsi_info.run_time.eq_chain) > sb_idx));
1489d14abf15SRobert Mustacchi 
1490d14abf15SRobert Mustacchi     eq = &LM_SC_EQ(pdev, sb_idx);
1491d14abf15SRobert Mustacchi 
1492d14abf15SRobert Mustacchi     if (eq->hw_con_idx_ptr &&
1493d14abf15SRobert Mustacchi         mm_le16_to_cpu(*eq->hw_con_idx_ptr) != lm_bd_chain_cons_idx(&eq->bd_chain) )
1494d14abf15SRobert Mustacchi     {
1495d14abf15SRobert Mustacchi         result = TRUE;
1496d14abf15SRobert Mustacchi     }
1497d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMl5, "lm_sc_is_rx_completion(): result is:%s\n", result? "TRUE" : "FALSE");
1498d14abf15SRobert Mustacchi 
1499d14abf15SRobert Mustacchi     return result;
1500d14abf15SRobert Mustacchi }
1501d14abf15SRobert Mustacchi 
1502d14abf15SRobert Mustacchi 
1503d14abf15SRobert Mustacchi 
1504d14abf15SRobert Mustacchi u8_t
lm_fc_is_eq_completion(lm_device_t * pdev,u8_t sb_idx)1505d14abf15SRobert Mustacchi lm_fc_is_eq_completion(lm_device_t *pdev, u8_t sb_idx)
1506d14abf15SRobert Mustacchi {
1507d14abf15SRobert Mustacchi     u8_t result = FALSE;
1508d14abf15SRobert Mustacchi     lm_eq_chain_t *eq = NULL;
1509d14abf15SRobert Mustacchi 
1510d14abf15SRobert Mustacchi     DbgBreakIf(!(pdev && ARRSIZE(pdev->fcoe_info.run_time.eq_chain) > sb_idx));
1511d14abf15SRobert Mustacchi 
1512d14abf15SRobert Mustacchi     eq = &LM_FC_EQ(pdev, sb_idx);
1513d14abf15SRobert Mustacchi 
1514d14abf15SRobert Mustacchi     if (eq->hw_con_idx_ptr &&
1515d14abf15SRobert Mustacchi         mm_le16_to_cpu(*eq->hw_con_idx_ptr) != lm_bd_chain_cons_idx(&eq->bd_chain))
1516d14abf15SRobert Mustacchi     {
1517d14abf15SRobert Mustacchi         result = TRUE;
1518d14abf15SRobert Mustacchi     }
1519d14abf15SRobert Mustacchi 
1520d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMl5, "lm_fc_is_rx_completion(): result is:%s\n", result? "TRUE" : "FALSE");
1521d14abf15SRobert Mustacchi 
1522d14abf15SRobert Mustacchi     return result;
1523d14abf15SRobert Mustacchi }
1524d14abf15SRobert Mustacchi 
1525d14abf15SRobert Mustacchi 
1526d14abf15SRobert Mustacchi 
1527d14abf15SRobert Mustacchi lm_status_t
lm_sc_handle_tcp_event(IN lm_device_t * pdev,IN u32_t cid,IN u32_t op_code)1528d14abf15SRobert Mustacchi lm_sc_handle_tcp_event(
1529d14abf15SRobert Mustacchi     IN    lm_device_t *pdev,
1530d14abf15SRobert Mustacchi     IN    u32_t cid,
1531d14abf15SRobert Mustacchi     IN    u32_t op_code
1532d14abf15SRobert Mustacchi     )
1533d14abf15SRobert Mustacchi {
1534d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp = NULL;
1535d14abf15SRobert Mustacchi 
1536d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
1537d14abf15SRobert Mustacchi     {
1538d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1539d14abf15SRobert Mustacchi     }
1540d14abf15SRobert Mustacchi 
1541d14abf15SRobert Mustacchi     tcp = lm_cid_cookie(pdev, TOE_CONNECTION_TYPE, cid);
1542d14abf15SRobert Mustacchi     if CHK_NULL(tcp)
1543d14abf15SRobert Mustacchi     {
1544d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1545d14abf15SRobert Mustacchi     }
1546d14abf15SRobert Mustacchi 
1547d14abf15SRobert Mustacchi     switch (op_code)
1548d14abf15SRobert Mustacchi     {
1549d14abf15SRobert Mustacchi     case ISCSI_KCQE_OPCODE_TCP_FIN:
1550d14abf15SRobert Mustacchi         tcp->tcp_state_calc.fin_reception_time = mm_get_current_time(pdev);
1551d14abf15SRobert Mustacchi         break;
1552d14abf15SRobert Mustacchi     case ISCSI_KCQE_OPCODE_TCP_RESET:
1553d14abf15SRobert Mustacchi         tcp->tcp_state_calc.con_rst_flag = TRUE;
1554d14abf15SRobert Mustacchi         break;
1555d14abf15SRobert Mustacchi     default:
1556d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "lm_sc_handle_tcp_event: Invalid op_code 0x%x\n", op_code);
1557d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1558d14abf15SRobert Mustacchi     }
1559d14abf15SRobert Mustacchi 
1560d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1561d14abf15SRobert Mustacchi }
1562d14abf15SRobert Mustacchi 
1563d14abf15SRobert Mustacchi lm_status_t
lm_sc_comp_l5_request(IN lm_device_t * pdev,IN lm_eq_chain_t * eq_chain,INOUT struct iscsi_kcqe ** l5_kcqe_start,INOUT u16_t * l5_kcqe_num)1564d14abf15SRobert Mustacchi lm_sc_comp_l5_request(
1565d14abf15SRobert Mustacchi     IN    lm_device_t *pdev,
1566d14abf15SRobert Mustacchi     IN    lm_eq_chain_t *eq_chain,
1567d14abf15SRobert Mustacchi     INOUT struct iscsi_kcqe **l5_kcqe_start,
1568d14abf15SRobert Mustacchi     INOUT u16_t *l5_kcqe_num)
1569d14abf15SRobert Mustacchi {
1570d14abf15SRobert Mustacchi     lm_status_t lm_status;
1571d14abf15SRobert Mustacchi 
1572d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(eq_chain) || CHK_NULL(l5_kcqe_start) || CHK_NULL(l5_kcqe_num))
1573d14abf15SRobert Mustacchi     {
1574d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1575d14abf15SRobert Mustacchi     }
1576d14abf15SRobert Mustacchi 
1577d14abf15SRobert Mustacchi     lm_status = mm_sc_comp_l5_request(pdev, *l5_kcqe_start, *l5_kcqe_num);
1578d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1579d14abf15SRobert Mustacchi     {
1580d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "lm_sc_service_eq_intr: mm_sc_comp_l5_request failed.\n");
1581d14abf15SRobert Mustacchi     }
1582d14abf15SRobert Mustacchi 
1583d14abf15SRobert Mustacchi     lm_bd_chain_bds_produced(&eq_chain->bd_chain, *l5_kcqe_num);
1584d14abf15SRobert Mustacchi     *l5_kcqe_num = 0;
1585d14abf15SRobert Mustacchi     *l5_kcqe_start = NULL;
1586d14abf15SRobert Mustacchi 
1587d14abf15SRobert Mustacchi     return lm_status;
1588d14abf15SRobert Mustacchi }
1589d14abf15SRobert Mustacchi 
1590d14abf15SRobert Mustacchi 
1591d14abf15SRobert Mustacchi 
1592d14abf15SRobert Mustacchi lm_status_t
lm_fc_comp_request(IN lm_device_t * pdev,IN lm_eq_chain_t * eq_chain,INOUT struct fcoe_kcqe ** fcoe_kcqe_start,INOUT u16_t * fcoe_kcqe_num)1593d14abf15SRobert Mustacchi lm_fc_comp_request(
1594d14abf15SRobert Mustacchi     IN    lm_device_t       *pdev,
1595d14abf15SRobert Mustacchi     IN    lm_eq_chain_t     *eq_chain,
1596d14abf15SRobert Mustacchi     INOUT struct fcoe_kcqe  **fcoe_kcqe_start,
1597d14abf15SRobert Mustacchi     INOUT u16_t             *fcoe_kcqe_num)
1598d14abf15SRobert Mustacchi {
1599d14abf15SRobert Mustacchi     lm_status_t lm_status;
1600d14abf15SRobert Mustacchi 
1601d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(eq_chain) || CHK_NULL(fcoe_kcqe_start) || CHK_NULL(fcoe_kcqe_num))
1602d14abf15SRobert Mustacchi     {
1603d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1604d14abf15SRobert Mustacchi     }
1605d14abf15SRobert Mustacchi 
1606d14abf15SRobert Mustacchi     lm_status = mm_fc_comp_request(pdev, *fcoe_kcqe_start, *fcoe_kcqe_num);
1607d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1608d14abf15SRobert Mustacchi     {
1609d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "lm_fc_service_eq_intr: lm_fc_comp_request failed.\n");
1610d14abf15SRobert Mustacchi     }
1611d14abf15SRobert Mustacchi 
1612d14abf15SRobert Mustacchi     lm_bd_chain_bds_produced(&eq_chain->bd_chain, *fcoe_kcqe_num);
1613d14abf15SRobert Mustacchi     *fcoe_kcqe_num = 0;
1614d14abf15SRobert Mustacchi     *fcoe_kcqe_start = NULL;
1615d14abf15SRobert Mustacchi 
1616d14abf15SRobert Mustacchi     return lm_status;
1617d14abf15SRobert Mustacchi }
1618d14abf15SRobert Mustacchi 
1619d14abf15SRobert Mustacchi 
1620d14abf15SRobert Mustacchi 
1621d14abf15SRobert Mustacchi 
1622d14abf15SRobert Mustacchi void
lm_sc_service_eq_intr(IN struct _lm_device_t * pdev,IN u8_t sb_idx)1623d14abf15SRobert Mustacchi lm_sc_service_eq_intr(
1624d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
1625d14abf15SRobert Mustacchi     IN u8_t                         sb_idx)
1626d14abf15SRobert Mustacchi {
1627d14abf15SRobert Mustacchi     lm_status_t         lm_status;
1628d14abf15SRobert Mustacchi     lm_eq_chain_t *eq_chain       = NULL;
1629d14abf15SRobert Mustacchi     struct iscsi_kcqe   *kcqe           = NULL;
1630d14abf15SRobert Mustacchi     struct iscsi_kcqe   *l5_kcqe_start  = NULL;
1631d14abf15SRobert Mustacchi     u16_t               l5_kcqe_num     = 0;
1632d14abf15SRobert Mustacchi     u16_t               eq_new_idx      = 0;
1633d14abf15SRobert Mustacchi     u16_t               eq_old_idx      = 0;
1634d14abf15SRobert Mustacchi     u32_t               eq_num          = 0;
1635d14abf15SRobert Mustacchi     u32_t               cid             = 0;
1636d14abf15SRobert Mustacchi 
1637d14abf15SRobert Mustacchi 
1638d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || (ARRSIZE(pdev->iscsi_info.run_time.eq_chain) <= sb_idx))
1639d14abf15SRobert Mustacchi     {
1640d14abf15SRobert Mustacchi         DbgBreakIf(ARRSIZE(pdev->iscsi_info.run_time.eq_chain) <= sb_idx);
1641d14abf15SRobert Mustacchi         DbgBreakIf(!pdev);
1642d14abf15SRobert Mustacchi         return;
1643d14abf15SRobert Mustacchi     }
1644d14abf15SRobert Mustacchi 
1645d14abf15SRobert Mustacchi     eq_chain = &LM_SC_EQ(pdev, sb_idx);
1646d14abf15SRobert Mustacchi 
1647d14abf15SRobert Mustacchi     eq_new_idx = mm_le16_to_cpu(*(eq_chain->hw_con_idx_ptr));
1648d14abf15SRobert Mustacchi     eq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
1649d14abf15SRobert Mustacchi     DbgBreakIf(S16_SUB(eq_new_idx, eq_old_idx) < 0);
1650d14abf15SRobert Mustacchi 
1651d14abf15SRobert Mustacchi     while (eq_old_idx != eq_new_idx)
1652d14abf15SRobert Mustacchi     {
1653d14abf15SRobert Mustacchi         DbgBreakIf(S16_SUB(eq_new_idx, eq_old_idx) <= 0);
1654d14abf15SRobert Mustacchi 
1655d14abf15SRobert Mustacchi         /* get next consumed kcqe */
1656d14abf15SRobert Mustacchi         kcqe = (struct iscsi_kcqe *)lm_bd_chain_consume_bd_contiguous(&eq_chain->bd_chain);
1657d14abf15SRobert Mustacchi 
1658d14abf15SRobert Mustacchi         /* we got to the end of the page, if we have some kcqe that we need to indicate, */
1659d14abf15SRobert Mustacchi         /* do it now, cause we can't assume that the memorey of the pages is contiguous */
1660d14abf15SRobert Mustacchi         if (kcqe == NULL)
1661d14abf15SRobert Mustacchi         {
1662d14abf15SRobert Mustacchi             if (l5_kcqe_num != 0)
1663d14abf15SRobert Mustacchi             {
1664d14abf15SRobert Mustacchi                 lm_status = lm_sc_comp_l5_request(pdev, eq_chain, &l5_kcqe_start, &l5_kcqe_num);
1665d14abf15SRobert Mustacchi             }
1666d14abf15SRobert Mustacchi 
1667d14abf15SRobert Mustacchi             /* check cons index again */
1668d14abf15SRobert Mustacchi             eq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
1669d14abf15SRobert Mustacchi 
1670d14abf15SRobert Mustacchi             if (eq_old_idx != eq_new_idx)
1671d14abf15SRobert Mustacchi             {
1672d14abf15SRobert Mustacchi                 /* get next consumed cqe */
1673d14abf15SRobert Mustacchi                 kcqe = (struct iscsi_kcqe *)lm_bd_chain_consume_bd_contiguous(&eq_chain->bd_chain);
1674d14abf15SRobert Mustacchi 
1675d14abf15SRobert Mustacchi                 if (CHK_NULL(kcqe))
1676d14abf15SRobert Mustacchi                 {
1677d14abf15SRobert Mustacchi                     /* shouldn't have happened, got second null from the bd */
1678d14abf15SRobert Mustacchi                     DbgBreakIf(!kcqe);
1679d14abf15SRobert Mustacchi                     break;
1680d14abf15SRobert Mustacchi                 }
1681d14abf15SRobert Mustacchi             }
1682d14abf15SRobert Mustacchi             else
1683d14abf15SRobert Mustacchi             {
1684d14abf15SRobert Mustacchi                 /* the new kcqe was the last one we got, break */
1685d14abf15SRobert Mustacchi                 break;
1686d14abf15SRobert Mustacchi             }
1687d14abf15SRobert Mustacchi         }
1688d14abf15SRobert Mustacchi 
1689d14abf15SRobert Mustacchi         switch (kcqe->op_code)
1690d14abf15SRobert Mustacchi         {
1691d14abf15SRobert Mustacchi         case ISCSI_RAMROD_CMD_ID_INIT:
1692d14abf15SRobert Mustacchi         case L5CM_RAMROD_CMD_ID_ADD_NEW_CONNECTION:
1693d14abf15SRobert Mustacchi         case ISCSI_RAMROD_CMD_ID_UPDATE_CONN:
1694d14abf15SRobert Mustacchi         case L5CM_RAMROD_CMD_ID_SEARCHER_DELETE:
1695d14abf15SRobert Mustacchi         case L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD:
1696d14abf15SRobert Mustacchi         case L5CM_RAMROD_CMD_ID_QUERY:
1697d14abf15SRobert Mustacchi 
1698d14abf15SRobert Mustacchi             /* first, complete fast path and error indication, if any */
1699d14abf15SRobert Mustacchi             if (l5_kcqe_num != 0)
1700d14abf15SRobert Mustacchi             {
1701d14abf15SRobert Mustacchi                 lm_status = lm_sc_comp_l5_request(pdev, eq_chain, &l5_kcqe_start, &l5_kcqe_num);
1702d14abf15SRobert Mustacchi             }
1703d14abf15SRobert Mustacchi 
1704d14abf15SRobert Mustacchi             lm_status = lm_sc_complete_slow_path_request(pdev, kcqe);
1705d14abf15SRobert Mustacchi             if (lm_status != LM_STATUS_SUCCESS)
1706d14abf15SRobert Mustacchi             {
1707d14abf15SRobert Mustacchi                 DbgMessage(pdev, WARN, "lm_sc_service_eq_intr: mm_sc_comp_l5_request failed.\n");
1708d14abf15SRobert Mustacchi             }
1709d14abf15SRobert Mustacchi 
1710d14abf15SRobert Mustacchi             lm_bd_chain_bds_produced(&eq_chain->bd_chain, 1);
1711d14abf15SRobert Mustacchi             break;
1712d14abf15SRobert Mustacchi 
1713d14abf15SRobert Mustacchi         case ISCSI_KCQE_OPCODE_TCP_FIN:
1714d14abf15SRobert Mustacchi         case ISCSI_KCQE_OPCODE_TCP_RESET:
1715d14abf15SRobert Mustacchi             cid = SW_CID(kcqe->iscsi_conn_context_id);
1716d14abf15SRobert Mustacchi 
1717d14abf15SRobert Mustacchi             lm_sc_handle_tcp_event(pdev, cid, kcqe->op_code);
1718*6680ee99SToomas Soome             /* FALLTHROUGH */
1719d14abf15SRobert Mustacchi         default:
1720d14abf15SRobert Mustacchi             if (l5_kcqe_start == NULL)
1721d14abf15SRobert Mustacchi             {
1722d14abf15SRobert Mustacchi                 l5_kcqe_start = kcqe;
1723d14abf15SRobert Mustacchi             }
1724d14abf15SRobert Mustacchi 
1725d14abf15SRobert Mustacchi             l5_kcqe_num++;
1726d14abf15SRobert Mustacchi             break;
1727d14abf15SRobert Mustacchi         }
1728d14abf15SRobert Mustacchi 
1729d14abf15SRobert Mustacchi         eq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
1730d14abf15SRobert Mustacchi     }
1731d14abf15SRobert Mustacchi 
1732d14abf15SRobert Mustacchi     /* complete left fast path events */
1733d14abf15SRobert Mustacchi     if (l5_kcqe_num != 0)
1734d14abf15SRobert Mustacchi     {
1735d14abf15SRobert Mustacchi         lm_status = lm_sc_comp_l5_request(pdev, eq_chain, &l5_kcqe_start, &l5_kcqe_num);
1736d14abf15SRobert Mustacchi     }
1737d14abf15SRobert Mustacchi 
1738d14abf15SRobert Mustacchi     /* update EQ prod in RAM */
1739d14abf15SRobert Mustacchi     eq_num = sb_idx - pdev->iscsi_info.run_time.l5_eq_base_chain_idx;
1740d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, CSTORM_ISCSI_EQ_PROD_OFFSET(FUNC_ID(pdev), eq_num), lm_bd_chain_prod_idx(&eq_chain->bd_chain), BAR_CSTRORM_INTMEM);
1741d14abf15SRobert Mustacchi }
1742d14abf15SRobert Mustacchi 
1743d14abf15SRobert Mustacchi 
1744d14abf15SRobert Mustacchi 
1745d14abf15SRobert Mustacchi void
lm_fc_service_eq_intr(lm_device_t * pdev,u8_t sb_idx)1746d14abf15SRobert Mustacchi lm_fc_service_eq_intr(lm_device_t *pdev, u8_t sb_idx)
1747d14abf15SRobert Mustacchi {
1748d14abf15SRobert Mustacchi     lm_status_t         lm_status;
1749d14abf15SRobert Mustacchi     lm_eq_chain_t       *eq_chain       = NULL;
1750d14abf15SRobert Mustacchi     struct fcoe_kcqe    *kcqe           = NULL;
1751d14abf15SRobert Mustacchi     struct fcoe_kcqe    *fcoe_kcqe_start= NULL;
1752d14abf15SRobert Mustacchi     u16_t               fcoe_kcqe_num   = 0;
1753d14abf15SRobert Mustacchi     u16_t               eq_new_idx      = 0;
1754d14abf15SRobert Mustacchi     u16_t               eq_old_idx      = 0;
1755d14abf15SRobert Mustacchi 
1756d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || (ARRSIZE(pdev->fcoe_info.run_time.eq_chain) <= sb_idx))
1757d14abf15SRobert Mustacchi     {
1758d14abf15SRobert Mustacchi         DbgBreakIf(ARRSIZE(pdev->fcoe_info.run_time.eq_chain) <= sb_idx);
1759d14abf15SRobert Mustacchi         DbgBreakIf(!pdev);
1760d14abf15SRobert Mustacchi         return;
1761d14abf15SRobert Mustacchi     }
1762d14abf15SRobert Mustacchi 
1763d14abf15SRobert Mustacchi     eq_chain = &LM_FC_EQ(pdev, sb_idx);
1764d14abf15SRobert Mustacchi 
1765d14abf15SRobert Mustacchi     eq_new_idx = mm_le16_to_cpu(*(eq_chain->hw_con_idx_ptr));
1766d14abf15SRobert Mustacchi     eq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
1767d14abf15SRobert Mustacchi     DbgBreakIf(S16_SUB(eq_new_idx, eq_old_idx) < 0);
1768d14abf15SRobert Mustacchi 
1769d14abf15SRobert Mustacchi     while (eq_old_idx != eq_new_idx)
1770d14abf15SRobert Mustacchi     {
1771d14abf15SRobert Mustacchi         DbgBreakIf(S16_SUB(eq_new_idx, eq_old_idx) <= 0);
1772d14abf15SRobert Mustacchi 
1773d14abf15SRobert Mustacchi         /* get next consumed kcqe */
1774d14abf15SRobert Mustacchi         kcqe = (struct fcoe_kcqe *)lm_bd_chain_consume_bd_contiguous(&eq_chain->bd_chain);
1775d14abf15SRobert Mustacchi 
1776d14abf15SRobert Mustacchi         /* we got to the end of the page, if we have some kcqe that we need to indicate, */
1777d14abf15SRobert Mustacchi         /* do it now, cause we can't assume that the memorey of the pages is contiguous */
1778d14abf15SRobert Mustacchi         if (kcqe == NULL)
1779d14abf15SRobert Mustacchi         {
1780d14abf15SRobert Mustacchi             if (fcoe_kcqe_num != 0)
1781d14abf15SRobert Mustacchi             {
1782d14abf15SRobert Mustacchi                 lm_status = lm_fc_comp_request(pdev,
1783d14abf15SRobert Mustacchi                                                eq_chain,
1784d14abf15SRobert Mustacchi                                                &fcoe_kcqe_start,
1785d14abf15SRobert Mustacchi                                                &fcoe_kcqe_num);
1786d14abf15SRobert Mustacchi             }
1787d14abf15SRobert Mustacchi 
1788d14abf15SRobert Mustacchi             /* check cons index again */
1789d14abf15SRobert Mustacchi             eq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
1790d14abf15SRobert Mustacchi 
1791d14abf15SRobert Mustacchi             if (eq_old_idx != eq_new_idx)
1792d14abf15SRobert Mustacchi             {
1793d14abf15SRobert Mustacchi                 /* get next consumed cqe */
1794d14abf15SRobert Mustacchi                 kcqe = (struct fcoe_kcqe *)lm_bd_chain_consume_bd(&eq_chain->bd_chain);
1795d14abf15SRobert Mustacchi 
1796d14abf15SRobert Mustacchi                 if (CHK_NULL(kcqe))
1797d14abf15SRobert Mustacchi                 {
1798d14abf15SRobert Mustacchi                     /* shouldn't have happened, got second null from the bd */
1799d14abf15SRobert Mustacchi                     DbgBreakIf(!kcqe);
1800d14abf15SRobert Mustacchi                     break;
1801d14abf15SRobert Mustacchi                 }
1802d14abf15SRobert Mustacchi             }
1803d14abf15SRobert Mustacchi             else
1804d14abf15SRobert Mustacchi             {
1805d14abf15SRobert Mustacchi                 /* the new kcqe was the last one we got, break */
1806d14abf15SRobert Mustacchi                 break;
1807d14abf15SRobert Mustacchi             }
1808d14abf15SRobert Mustacchi         }
1809d14abf15SRobert Mustacchi 
1810d14abf15SRobert Mustacchi         /* first, complete fast path completion notification and error indication, if any */
1811d14abf15SRobert Mustacchi         if (fcoe_kcqe_num != 0)
1812d14abf15SRobert Mustacchi         {
1813d14abf15SRobert Mustacchi             lm_status = lm_fc_comp_request(pdev,
1814d14abf15SRobert Mustacchi                                            eq_chain,
1815d14abf15SRobert Mustacchi                                            &fcoe_kcqe_start,
1816d14abf15SRobert Mustacchi                                            &fcoe_kcqe_num);
1817d14abf15SRobert Mustacchi         }
1818d14abf15SRobert Mustacchi 
1819d14abf15SRobert Mustacchi         switch (kcqe->op_code)
1820d14abf15SRobert Mustacchi         {
1821d14abf15SRobert Mustacchi             case FCOE_KCQE_OPCODE_INIT_FUNC:
1822d14abf15SRobert Mustacchi             case FCOE_KCQE_OPCODE_OFFLOAD_CONN:
1823d14abf15SRobert Mustacchi             case FCOE_KCQE_OPCODE_ENABLE_CONN:
1824d14abf15SRobert Mustacchi             case FCOE_KCQE_OPCODE_DISABLE_CONN:
1825d14abf15SRobert Mustacchi             case FCOE_KCQE_OPCODE_DESTROY_FUNC:
1826d14abf15SRobert Mustacchi             case FCOE_KCQE_OPCODE_STAT_FUNC:
1827d14abf15SRobert Mustacchi             case FCOE_RAMROD_CMD_ID_TERMINATE_CONN:
1828d14abf15SRobert Mustacchi             {
1829d14abf15SRobert Mustacchi                 lm_status = lm_fc_complete_slow_path_request(pdev, kcqe);
1830d14abf15SRobert Mustacchi                 if (lm_status != LM_STATUS_SUCCESS)
1831d14abf15SRobert Mustacchi                 {
1832d14abf15SRobert Mustacchi                     DbgMessage(pdev, WARN, "lm_fc_service_eq_intr: lm_fc_complete_slow_path_request failed.\n");
1833d14abf15SRobert Mustacchi                 }
1834d14abf15SRobert Mustacchi 
1835d14abf15SRobert Mustacchi                 lm_bd_chain_bds_produced(&eq_chain->bd_chain, 1);
1836d14abf15SRobert Mustacchi                 break;
1837d14abf15SRobert Mustacchi             }
1838d14abf15SRobert Mustacchi 
1839d14abf15SRobert Mustacchi             default:
1840d14abf15SRobert Mustacchi             {
1841d14abf15SRobert Mustacchi                 if (fcoe_kcqe_start == NULL)
1842d14abf15SRobert Mustacchi                 {
1843d14abf15SRobert Mustacchi                     fcoe_kcqe_start = kcqe;
1844d14abf15SRobert Mustacchi                 }
1845d14abf15SRobert Mustacchi 
1846d14abf15SRobert Mustacchi                 fcoe_kcqe_num++;
1847d14abf15SRobert Mustacchi                 break;
1848d14abf15SRobert Mustacchi             }
1849d14abf15SRobert Mustacchi         }
1850d14abf15SRobert Mustacchi 
1851d14abf15SRobert Mustacchi         eq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
1852d14abf15SRobert Mustacchi     }
1853d14abf15SRobert Mustacchi 
1854d14abf15SRobert Mustacchi     /* complete left fast path events */
1855d14abf15SRobert Mustacchi     if (fcoe_kcqe_num != 0)
1856d14abf15SRobert Mustacchi     {
1857d14abf15SRobert Mustacchi         lm_status = lm_fc_comp_request(pdev, eq_chain, &fcoe_kcqe_start, &fcoe_kcqe_num);
1858d14abf15SRobert Mustacchi     }
1859d14abf15SRobert Mustacchi 
1860d14abf15SRobert Mustacchi     /* update EQ prod in RAM */
1861d14abf15SRobert Mustacchi     LM_INTMEM_WRITE16(pdev, USTORM_FCOE_EQ_PROD_OFFSET(FUNC_ID(pdev)), lm_bd_chain_prod_idx(&eq_chain->bd_chain), BAR_USTRORM_INTMEM);
1862d14abf15SRobert Mustacchi }
1863d14abf15SRobert Mustacchi 
1864d14abf15SRobert Mustacchi 
1865d14abf15SRobert Mustacchi lm_status_t
lm_sc_alloc_con_phys_mem(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi)1866d14abf15SRobert Mustacchi lm_sc_alloc_con_phys_mem(
1867d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
1868d14abf15SRobert Mustacchi     IN lm_iscsi_state_t             *iscsi)
1869d14abf15SRobert Mustacchi {
1870d14abf15SRobert Mustacchi     lm_status_t lm_status  = LM_STATUS_SUCCESS;
1871d14abf15SRobert Mustacchi     u32_t       mem_size   = sizeof(*iscsi->sp_req_data.virt_addr);
1872d14abf15SRobert Mustacchi     u8_t        mm_cli_idx = LM_RESOURCE_ISCSI;
1873d14abf15SRobert Mustacchi 
1874d14abf15SRobert Mustacchi 
1875d14abf15SRobert Mustacchi     /* Allocate slopwath request data */
1876d14abf15SRobert Mustacchi     iscsi->sp_req_data.virt_addr = mm_rt_alloc_phys_mem(pdev,
1877d14abf15SRobert Mustacchi                                                         mem_size,
1878d14abf15SRobert Mustacchi                                                         &iscsi->sp_req_data.phys_addr,
1879d14abf15SRobert Mustacchi                                                         0,
1880d14abf15SRobert Mustacchi                                                         mm_cli_idx);
1881d14abf15SRobert Mustacchi     if CHK_NULL(iscsi->sp_req_data.virt_addr)
1882d14abf15SRobert Mustacchi     {   /* can't allocate task array */
1883d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
1884d14abf15SRobert Mustacchi     }
1885d14abf15SRobert Mustacchi 
1886d14abf15SRobert Mustacchi     mm_memset(iscsi->sp_req_data.virt_addr, 0, mem_size);
1887d14abf15SRobert Mustacchi 
1888d14abf15SRobert Mustacchi     /* Allocate task array */
1889d14abf15SRobert Mustacchi     iscsi->task_array.base_size = pdev->iscsi_info.run_time.num_of_tasks * sizeof(struct iscsi_task_context_entry);
1890d14abf15SRobert Mustacchi     iscsi->task_array.base_virt = mm_rt_alloc_phys_mem(pdev,
1891d14abf15SRobert Mustacchi                                                 iscsi->task_array.base_size,
1892d14abf15SRobert Mustacchi                                                 &iscsi->task_array.base_phy,
1893d14abf15SRobert Mustacchi                                                 0,
1894d14abf15SRobert Mustacchi                                                 mm_cli_idx);
1895d14abf15SRobert Mustacchi     if CHK_NULL(iscsi->task_array.base_virt)
1896d14abf15SRobert Mustacchi     {   /* can't allocate task array */
1897d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
1898d14abf15SRobert Mustacchi     }
1899d14abf15SRobert Mustacchi 
1900d14abf15SRobert Mustacchi     mm_memset(iscsi->task_array.base_virt, 0, iscsi->task_array.base_size);
1901d14abf15SRobert Mustacchi 
1902d14abf15SRobert Mustacchi     lm_status = lm_create_pbl(pdev,
1903d14abf15SRobert Mustacchi                               iscsi->task_array.base_virt,
1904d14abf15SRobert Mustacchi                               &iscsi->task_array.base_phy,
1905d14abf15SRobert Mustacchi                               iscsi->task_array.base_size,
1906d14abf15SRobert Mustacchi                               &iscsi->task_array.pbl_phys_table_virt,
1907d14abf15SRobert Mustacchi                               &iscsi->task_array.pbl_phys_table_phys,
1908d14abf15SRobert Mustacchi                               &iscsi->task_array.pbl_virt_table,
1909d14abf15SRobert Mustacchi                               &iscsi->task_array.pbl_entries,
1910d14abf15SRobert Mustacchi                               &iscsi->task_array.pbl_size,
1911d14abf15SRobert Mustacchi                               TRUE,
1912d14abf15SRobert Mustacchi                               LM_RESOURCE_ISCSI);
1913d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1914d14abf15SRobert Mustacchi     {
1915d14abf15SRobert Mustacchi         return lm_status;
1916d14abf15SRobert Mustacchi     }
1917d14abf15SRobert Mustacchi 
1918d14abf15SRobert Mustacchi     /* Allocate R2TQ */
1919d14abf15SRobert Mustacchi     iscsi->r2tq.base_size = pdev->iscsi_info.run_time.num_of_tasks * ISCSI_MAX_NUM_OF_PENDING_R2TS * ISCSI_R2TQE_SIZE;
1920d14abf15SRobert Mustacchi     iscsi->r2tq.base_virt = mm_rt_alloc_phys_mem(pdev,
1921d14abf15SRobert Mustacchi                                                 iscsi->r2tq.base_size,
1922d14abf15SRobert Mustacchi                                                 &iscsi->r2tq.base_phy,
1923d14abf15SRobert Mustacchi                                                 0,
1924d14abf15SRobert Mustacchi                                                 mm_cli_idx);
1925d14abf15SRobert Mustacchi     if CHK_NULL(iscsi->r2tq.base_virt)
1926d14abf15SRobert Mustacchi     {   /* can't allocate R2TQ */
1927d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
1928d14abf15SRobert Mustacchi     }
1929d14abf15SRobert Mustacchi 
1930d14abf15SRobert Mustacchi     mm_memset(iscsi->r2tq.base_virt, 0, iscsi->r2tq.base_size);
1931d14abf15SRobert Mustacchi 
1932d14abf15SRobert Mustacchi     lm_status = lm_create_pbl(pdev,
1933d14abf15SRobert Mustacchi                               iscsi->r2tq.base_virt,
1934d14abf15SRobert Mustacchi                               &iscsi->r2tq.base_phy,
1935d14abf15SRobert Mustacchi                               iscsi->r2tq.base_size,
1936d14abf15SRobert Mustacchi                               &iscsi->r2tq.pbl_phys_table_virt,
1937d14abf15SRobert Mustacchi                               &iscsi->r2tq.pbl_phys_table_phys,
1938d14abf15SRobert Mustacchi                               &iscsi->r2tq.pbl_virt_table,
1939d14abf15SRobert Mustacchi                               &iscsi->r2tq.pbl_entries,
1940d14abf15SRobert Mustacchi                               &iscsi->r2tq.pbl_size,
1941d14abf15SRobert Mustacchi                               TRUE,
1942d14abf15SRobert Mustacchi                               LM_RESOURCE_ISCSI);
1943d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1944d14abf15SRobert Mustacchi     {
1945d14abf15SRobert Mustacchi         return lm_status;
1946d14abf15SRobert Mustacchi     }
1947d14abf15SRobert Mustacchi 
1948d14abf15SRobert Mustacchi     /* Allocate HQ */
1949d14abf15SRobert Mustacchi     iscsi->hq.base_size = pdev->iscsi_info.run_time.hq_size * sizeof(struct iscsi_hq_bd);
1950d14abf15SRobert Mustacchi     iscsi->hq.base_virt = mm_rt_alloc_phys_mem(pdev,
1951d14abf15SRobert Mustacchi                                                 iscsi->hq.base_size,
1952d14abf15SRobert Mustacchi                                                 &iscsi->hq.base_phy,
1953d14abf15SRobert Mustacchi                                                 0,
1954d14abf15SRobert Mustacchi                                                 mm_cli_idx);
1955d14abf15SRobert Mustacchi     if CHK_NULL(iscsi->hq.base_virt)
1956d14abf15SRobert Mustacchi     {   /* can't allocate HQ */
1957d14abf15SRobert Mustacchi 
1958d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
1959d14abf15SRobert Mustacchi     }
1960d14abf15SRobert Mustacchi 
1961d14abf15SRobert Mustacchi     mm_memset(iscsi->hq.base_virt, 0, iscsi->hq.base_size);
1962d14abf15SRobert Mustacchi 
1963d14abf15SRobert Mustacchi     lm_status = lm_create_pbl(pdev,
1964d14abf15SRobert Mustacchi                               iscsi->hq.base_virt,
1965d14abf15SRobert Mustacchi                               &iscsi->hq.base_phy,
1966d14abf15SRobert Mustacchi                               iscsi->hq.base_size,
1967d14abf15SRobert Mustacchi                               &iscsi->hq.pbl_phys_table_virt,
1968d14abf15SRobert Mustacchi                               &iscsi->hq.pbl_phys_table_phys,
1969d14abf15SRobert Mustacchi                               &iscsi->hq.pbl_virt_table,
1970d14abf15SRobert Mustacchi                               &iscsi->hq.pbl_entries,
1971d14abf15SRobert Mustacchi                               &iscsi->hq.pbl_size,
1972d14abf15SRobert Mustacchi                               TRUE,
1973d14abf15SRobert Mustacchi                               LM_RESOURCE_ISCSI);
1974d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1975d14abf15SRobert Mustacchi     {
1976d14abf15SRobert Mustacchi         return lm_status;
1977d14abf15SRobert Mustacchi     }
1978d14abf15SRobert Mustacchi 
1979d14abf15SRobert Mustacchi     return lm_status;
1980d14abf15SRobert Mustacchi 
1981d14abf15SRobert Mustacchi }
1982d14abf15SRobert Mustacchi /*******************************************************************************
1983d14abf15SRobert Mustacchi  * Description:
1984d14abf15SRobert Mustacchi  *
1985d14abf15SRobert Mustacchi  * Return:
1986d14abf15SRobert Mustacchi  ******************************************************************************/
1987d14abf15SRobert Mustacchi lm_status_t
lm_sc_alloc_con_resc(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi,IN struct iscsi_kwqe_conn_offload1 * req1,IN struct iscsi_kwqe_conn_offload2 * req2,IN struct iscsi_kwqe_conn_offload3 * req3)1988d14abf15SRobert Mustacchi lm_sc_alloc_con_resc(
1989d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
1990d14abf15SRobert Mustacchi     IN lm_iscsi_state_t             *iscsi,
1991d14abf15SRobert Mustacchi     IN struct iscsi_kwqe_conn_offload1   *req1,
1992d14abf15SRobert Mustacchi     IN struct iscsi_kwqe_conn_offload2   *req2,
1993d14abf15SRobert Mustacchi     IN struct iscsi_kwqe_conn_offload3   *req3
1994d14abf15SRobert Mustacchi     )
1995d14abf15SRobert Mustacchi {
1996d14abf15SRobert Mustacchi     lm_status_t lm_status;
1997d14abf15SRobert Mustacchi     s32_t cid;
1998d14abf15SRobert Mustacchi 
1999d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(iscsi) || CHK_NULL(req1) || CHK_NULL(req2) || CHK_NULL(req3))
2000d14abf15SRobert Mustacchi     {
2001d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2002d14abf15SRobert Mustacchi     }
2003d14abf15SRobert Mustacchi 
2004d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "### lm_sc_alloc_con_resc\n");
2005d14abf15SRobert Mustacchi 
2006d14abf15SRobert Mustacchi     /* save the miniport's conn id */
2007d14abf15SRobert Mustacchi     iscsi->iscsi_conn_id = req1->iscsi_conn_id;
2008d14abf15SRobert Mustacchi 
2009d14abf15SRobert Mustacchi     /* Boot connections physical resources are allocated during bind, and not during offload... */
2010d14abf15SRobert Mustacchi     if (!iscsi->b_resources_allocated)
2011d14abf15SRobert Mustacchi     {
2012d14abf15SRobert Mustacchi         lm_status = lm_sc_alloc_con_phys_mem(pdev, iscsi);
2013d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
2014d14abf15SRobert Mustacchi         {
2015d14abf15SRobert Mustacchi             lm_sc_free_con_resc(pdev, iscsi);
2016d14abf15SRobert Mustacchi             return lm_status;
2017d14abf15SRobert Mustacchi         }
2018d14abf15SRobert Mustacchi         iscsi->b_resources_allocated = TRUE;
2019d14abf15SRobert Mustacchi     }
2020d14abf15SRobert Mustacchi 
2021d14abf15SRobert Mustacchi 
2022d14abf15SRobert Mustacchi     /* Allocate CID */
2023d14abf15SRobert Mustacchi     lm_status = lm_allocate_cid(pdev, ISCSI_CONNECTION_TYPE, (void *)iscsi, &cid);
2024d14abf15SRobert Mustacchi     if (lm_status == LM_STATUS_PENDING)
2025d14abf15SRobert Mustacchi     {
2026d14abf15SRobert Mustacchi         lm_sp_req_manager_block(pdev, (u32_t)cid);
2027d14abf15SRobert Mustacchi     }
2028d14abf15SRobert Mustacchi     else if (lm_status != LM_STATUS_SUCCESS)
2029d14abf15SRobert Mustacchi     {
2030d14abf15SRobert Mustacchi         /* failed to allocate CID */
2031d14abf15SRobert Mustacchi         lm_sc_free_con_resc(pdev, iscsi);
2032d14abf15SRobert Mustacchi 
2033d14abf15SRobert Mustacchi         return lm_status;
2034d14abf15SRobert Mustacchi     }
2035d14abf15SRobert Mustacchi 
2036d14abf15SRobert Mustacchi     /* save the returned cid */
2037d14abf15SRobert Mustacchi     iscsi->cid = (u32_t)cid;
2038d14abf15SRobert Mustacchi 
2039d14abf15SRobert Mustacchi     /* the allocated slow path request phys data for iscsi will be used in the tcp_state.sp_data, for the query request */
2040d14abf15SRobert Mustacchi     lm_status = lm_sp_req_manager_set_sp_data(pdev, iscsi->cid, iscsi->sp_req_data.virt_addr, iscsi->sp_req_data.phys_addr);
2041d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
2042d14abf15SRobert Mustacchi     {
2043d14abf15SRobert Mustacchi         lm_sc_free_con_resc(pdev, iscsi);
2044d14abf15SRobert Mustacchi 
2045d14abf15SRobert Mustacchi         return lm_status;
2046d14abf15SRobert Mustacchi     }
2047d14abf15SRobert Mustacchi 
2048d14abf15SRobert Mustacchi     if (lm_cid_state(pdev, iscsi->cid) == LM_CID_STATE_PENDING) {
2049d14abf15SRobert Mustacchi         return LM_STATUS_PENDING; /* Too soon to initialize context */
2050d14abf15SRobert Mustacchi     }
2051d14abf15SRobert Mustacchi 
2052d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2053d14abf15SRobert Mustacchi } /* lm_sc_alloc_con_resc */
2054d14abf15SRobert Mustacchi 
2055d14abf15SRobert Mustacchi 
lm_sc_free_con_phys_mem(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi)2056d14abf15SRobert Mustacchi void lm_sc_free_con_phys_mem(
2057d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
2058d14abf15SRobert Mustacchi     IN lm_iscsi_state_t *iscsi
2059d14abf15SRobert Mustacchi     )
2060d14abf15SRobert Mustacchi {
2061d14abf15SRobert Mustacchi     u8_t mm_cli_idx = LM_RESOURCE_ISCSI;
2062d14abf15SRobert Mustacchi 
2063d14abf15SRobert Mustacchi     if (iscsi->sp_req_data.virt_addr)
2064d14abf15SRobert Mustacchi     {
2065d14abf15SRobert Mustacchi         mm_rt_free_phys_mem(pdev, sizeof(*iscsi->sp_req_data.virt_addr), iscsi->sp_req_data.virt_addr, iscsi->sp_req_data.phys_addr, mm_cli_idx);
2066d14abf15SRobert Mustacchi         iscsi->sp_req_data.virt_addr = NULL;
2067d14abf15SRobert Mustacchi     }
2068d14abf15SRobert Mustacchi     if (iscsi->task_array.base_virt) {
2069d14abf15SRobert Mustacchi         mm_rt_free_phys_mem(pdev, iscsi->task_array.base_size, iscsi->task_array.base_virt, iscsi->task_array.base_phy, mm_cli_idx);
2070d14abf15SRobert Mustacchi         iscsi->task_array.base_virt = NULL;
2071d14abf15SRobert Mustacchi     }
2072d14abf15SRobert Mustacchi     if (iscsi->task_array.pbl_phys_table_virt) {
2073d14abf15SRobert Mustacchi         mm_rt_free_phys_mem(pdev, iscsi->task_array.pbl_size, iscsi->task_array.pbl_phys_table_virt, iscsi->task_array.pbl_phys_table_phys, mm_cli_idx);
2074d14abf15SRobert Mustacchi         iscsi->task_array.pbl_phys_table_virt = NULL;
2075d14abf15SRobert Mustacchi     }
2076d14abf15SRobert Mustacchi     if (iscsi->task_array.pbl_virt_table) {
2077d14abf15SRobert Mustacchi         mm_rt_free_mem(pdev, iscsi->task_array.pbl_virt_table, iscsi->task_array.pbl_entries * sizeof(void *), mm_cli_idx);
2078d14abf15SRobert Mustacchi         iscsi->task_array.pbl_virt_table = NULL;
2079d14abf15SRobert Mustacchi     }
2080d14abf15SRobert Mustacchi     if (iscsi->r2tq.base_virt) {
2081d14abf15SRobert Mustacchi         mm_rt_free_phys_mem(pdev, iscsi->r2tq.base_size, iscsi->r2tq.base_virt, iscsi->r2tq.base_phy, mm_cli_idx);
2082d14abf15SRobert Mustacchi         iscsi->r2tq.base_virt = NULL;
2083d14abf15SRobert Mustacchi     }
2084d14abf15SRobert Mustacchi     if (iscsi->r2tq.pbl_phys_table_virt) {
2085d14abf15SRobert Mustacchi         mm_rt_free_phys_mem(pdev, iscsi->r2tq.pbl_size, iscsi->r2tq.pbl_phys_table_virt, iscsi->r2tq.pbl_phys_table_phys, mm_cli_idx);
2086d14abf15SRobert Mustacchi         iscsi->r2tq.pbl_phys_table_virt = NULL;
2087d14abf15SRobert Mustacchi     }
2088d14abf15SRobert Mustacchi     if (iscsi->r2tq.pbl_virt_table) {
2089d14abf15SRobert Mustacchi         mm_rt_free_mem(pdev, iscsi->r2tq.pbl_virt_table, iscsi->r2tq.pbl_entries * sizeof(void *), mm_cli_idx);
2090d14abf15SRobert Mustacchi         iscsi->r2tq.pbl_virt_table = NULL;
2091d14abf15SRobert Mustacchi     }
2092d14abf15SRobert Mustacchi     if (iscsi->hq.base_virt) {
2093d14abf15SRobert Mustacchi         mm_rt_free_phys_mem(pdev, iscsi->hq.base_size, iscsi->hq.base_virt, iscsi->hq.base_phy, mm_cli_idx);
2094d14abf15SRobert Mustacchi         iscsi->hq.base_virt = NULL;
2095d14abf15SRobert Mustacchi     }
2096d14abf15SRobert Mustacchi     if (iscsi->hq.pbl_phys_table_virt) {
2097d14abf15SRobert Mustacchi         mm_rt_free_phys_mem(pdev, iscsi->hq.pbl_size, iscsi->hq.pbl_phys_table_virt, iscsi->hq.pbl_phys_table_phys, mm_cli_idx);
2098d14abf15SRobert Mustacchi         iscsi->hq.pbl_phys_table_virt = NULL;
2099d14abf15SRobert Mustacchi     }
2100d14abf15SRobert Mustacchi     if (iscsi->hq.pbl_virt_table) {
2101d14abf15SRobert Mustacchi         mm_rt_free_mem(pdev, iscsi->hq.pbl_virt_table, iscsi->hq.pbl_entries * sizeof(void *), mm_cli_idx);
2102d14abf15SRobert Mustacchi         iscsi->hq.pbl_virt_table = NULL;
2103d14abf15SRobert Mustacchi     }
2104d14abf15SRobert Mustacchi 
2105d14abf15SRobert Mustacchi }
2106d14abf15SRobert Mustacchi /*******************************************************************************
2107d14abf15SRobert Mustacchi  * Description:
2108d14abf15SRobert Mustacchi  *
2109d14abf15SRobert Mustacchi  * Return:
2110d14abf15SRobert Mustacchi  ******************************************************************************/
lm_sc_free_con_resc(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi)2111d14abf15SRobert Mustacchi lm_status_t lm_sc_free_con_resc(
2112d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
2113d14abf15SRobert Mustacchi     IN lm_iscsi_state_t *iscsi
2114d14abf15SRobert Mustacchi     )
2115d14abf15SRobert Mustacchi {
2116d14abf15SRobert Mustacchi     u8_t notify_fw = 1;
2117d14abf15SRobert Mustacchi 
2118d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(iscsi))
2119d14abf15SRobert Mustacchi     {
2120d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2121d14abf15SRobert Mustacchi     }
2122d14abf15SRobert Mustacchi 
2123d14abf15SRobert Mustacchi     if (iscsi->cid != 0) {
2124d14abf15SRobert Mustacchi         if (iscsi->hdr.status == STATE_STATUS_INIT_OFFLOAD_ERR) {
2125d14abf15SRobert Mustacchi             notify_fw = 0;
2126d14abf15SRobert Mustacchi         }
2127d14abf15SRobert Mustacchi         lm_free_cid_resc(pdev, ISCSI_CONNECTION_TYPE, iscsi->cid, notify_fw);
2128d14abf15SRobert Mustacchi         iscsi->cid = 0;
2129d14abf15SRobert Mustacchi     }
2130d14abf15SRobert Mustacchi 
2131d14abf15SRobert Mustacchi     if (!iscsi->b_keep_resources)
2132d14abf15SRobert Mustacchi     {
2133d14abf15SRobert Mustacchi         lm_sc_free_con_phys_mem(pdev, iscsi);
2134d14abf15SRobert Mustacchi     }
2135d14abf15SRobert Mustacchi 
2136d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2137d14abf15SRobert Mustacchi }
2138d14abf15SRobert Mustacchi 
2139d14abf15SRobert Mustacchi 
2140d14abf15SRobert Mustacchi /* Free the ramrod memory and the CID */
2141d14abf15SRobert Mustacchi lm_status_t
lm_fc_free_con_resc(IN struct _lm_device_t * pdev,IN lm_fcoe_state_t * fcoe)2142d14abf15SRobert Mustacchi lm_fc_free_con_resc(
2143d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
2144d14abf15SRobert Mustacchi     IN lm_fcoe_state_t              *fcoe)
2145d14abf15SRobert Mustacchi {
2146d14abf15SRobert Mustacchi     u8_t                            notify_fw = 1;
2147d14abf15SRobert Mustacchi 
2148d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(fcoe))
2149d14abf15SRobert Mustacchi     {
2150d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2151d14abf15SRobert Mustacchi     }
2152d14abf15SRobert Mustacchi 
2153d14abf15SRobert Mustacchi     if (fcoe->cid != 0)
2154d14abf15SRobert Mustacchi     {
2155d14abf15SRobert Mustacchi         if (fcoe->hdr.status == STATE_STATUS_INIT_OFFLOAD_ERR)
2156d14abf15SRobert Mustacchi         {
2157d14abf15SRobert Mustacchi             notify_fw = 0;
2158d14abf15SRobert Mustacchi         }
2159d14abf15SRobert Mustacchi 
2160d14abf15SRobert Mustacchi         lm_free_cid_resc(pdev, FCOE_CONNECTION_TYPE, fcoe->cid, notify_fw);
2161d14abf15SRobert Mustacchi 
2162d14abf15SRobert Mustacchi         fcoe->hdr.state_blk = NULL;
2163d14abf15SRobert Mustacchi         fcoe->cid = 0;
2164d14abf15SRobert Mustacchi         fcoe->ctx_virt = NULL;
2165d14abf15SRobert Mustacchi         fcoe->ctx_phys.as_u64 = 0;
2166d14abf15SRobert Mustacchi     }
2167d14abf15SRobert Mustacchi 
2168d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2169d14abf15SRobert Mustacchi }
2170d14abf15SRobert Mustacchi 
2171d14abf15SRobert Mustacchi 
2172d14abf15SRobert Mustacchi 
2173d14abf15SRobert Mustacchi /*******************************************************************************
2174d14abf15SRobert Mustacchi  * Description:
2175d14abf15SRobert Mustacchi  *
2176d14abf15SRobert Mustacchi  * Return:
2177d14abf15SRobert Mustacchi  ******************************************************************************/
lm_sc_init_iscsi_context(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi,struct iscsi_kwqe_conn_offload1 * req1,struct iscsi_kwqe_conn_offload2 * req2,struct iscsi_kwqe_conn_offload3 * req3)2178d14abf15SRobert Mustacchi lm_status_t lm_sc_init_iscsi_context(
2179d14abf15SRobert Mustacchi     IN struct _lm_device_t      *pdev,
2180d14abf15SRobert Mustacchi     IN lm_iscsi_state_t         *iscsi,
2181d14abf15SRobert Mustacchi     struct iscsi_kwqe_conn_offload1  *req1,
2182d14abf15SRobert Mustacchi     struct iscsi_kwqe_conn_offload2  *req2,
2183d14abf15SRobert Mustacchi     struct iscsi_kwqe_conn_offload3  *req3
2184d14abf15SRobert Mustacchi     )
2185d14abf15SRobert Mustacchi {
2186d14abf15SRobert Mustacchi     struct iscsi_context *ctx;
2187d14abf15SRobert Mustacchi     u32_t cid;
2188d14abf15SRobert Mustacchi     u32_t cq_size_in_bytes;
2189d14abf15SRobert Mustacchi     u32_t single_cq_pbl_entries;
2190d14abf15SRobert Mustacchi     u32_t i;
2191d14abf15SRobert Mustacchi     u16_t conn_id;
2192d14abf15SRobert Mustacchi     lm_address_t pbl_base;
2193d14abf15SRobert Mustacchi 
2194d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(iscsi) || CHK_NULL(req1) || CHK_NULL(req2) || CHK_NULL(req3))
2195d14abf15SRobert Mustacchi     {
2196d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2197d14abf15SRobert Mustacchi     }
2198d14abf15SRobert Mustacchi 
2199d14abf15SRobert Mustacchi 
2200d14abf15SRobert Mustacchi     conn_id = req1->iscsi_conn_id;
2201d14abf15SRobert Mustacchi     cid = iscsi->cid;
2202d14abf15SRobert Mustacchi 
2203d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "### lm_sc_init_iscsi_context\n");
2204d14abf15SRobert Mustacchi 
2205d14abf15SRobert Mustacchi     if (req2->num_additional_wqes != 1)
2206d14abf15SRobert Mustacchi     {
2207d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2208d14abf15SRobert Mustacchi     }
2209d14abf15SRobert Mustacchi 
2210d14abf15SRobert Mustacchi     /* get context */
2211d14abf15SRobert Mustacchi     iscsi->ctx_virt = (struct iscsi_context *)lm_get_context(pdev, iscsi->cid);
2212d14abf15SRobert Mustacchi     DbgBreakIf(!iscsi->ctx_virt);
2213d14abf15SRobert Mustacchi     iscsi->ctx_phys.as_u64 = lm_get_context_phys(pdev, iscsi->cid);
2214d14abf15SRobert Mustacchi     DbgBreakIf(!iscsi->ctx_phys.as_u64);
2215d14abf15SRobert Mustacchi     DbgMessage(pdev, VERBOSEl5sp,
2216d14abf15SRobert Mustacchi                 "iscsi->ctx_virt=%p, iscsi->ctx_phys_high=%x, iscsi->ctx_phys_low=%x\n",
2217d14abf15SRobert Mustacchi                 iscsi->ctx_virt, iscsi->ctx_phys.as_u32.high, iscsi->ctx_phys.as_u32.low);
2218d14abf15SRobert Mustacchi 
2219d14abf15SRobert Mustacchi     ctx = iscsi->ctx_virt;
2220d14abf15SRobert Mustacchi 
2221d14abf15SRobert Mustacchi     mm_memset(ctx, 0, sizeof(struct iscsi_context));
2222d14abf15SRobert Mustacchi 
2223d14abf15SRobert Mustacchi     // init xstorm aggregative context
2224d14abf15SRobert Mustacchi     ctx->xstorm_ag_context.hq_prod = 1; //this value represents actual hq_prod + 1
2225d14abf15SRobert Mustacchi 
2226d14abf15SRobert Mustacchi     // init xstorm storm context
2227d14abf15SRobert Mustacchi     //iscsi context
2228d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.first_burst_length = ISCSI_DEFAULT_FIRST_BURST_LENGTH;
2229d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.max_send_pdu_length = ISCSI_DEFAULT_MAX_PDU_LENGTH;
2230d14abf15SRobert Mustacchi 
2231d14abf15SRobert Mustacchi     /* advance the SQ pbl_base cause it's pointing the SQ_DB */
2232d14abf15SRobert Mustacchi     pbl_base.as_u32.low = req1->sq_page_table_addr_lo;
2233d14abf15SRobert Mustacchi     pbl_base.as_u32.high = req1->sq_page_table_addr_hi;
2234d14abf15SRobert Mustacchi     LM_INC64(&pbl_base, ISCSI_SQ_DB_SIZE);
2235d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.sq_pbl_base.lo = pbl_base.as_u32.low;
2236d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.sq_pbl_base.hi = pbl_base.as_u32.high;
2237d14abf15SRobert Mustacchi 
2238d14abf15SRobert Mustacchi     //!!DP
2239d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.sq_curr_pbe.lo = req2->sq_first_pte.lo;
2240d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.sq_curr_pbe.hi = req2->sq_first_pte.hi;
2241d14abf15SRobert Mustacchi 
2242d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.hq_pbl_base.lo = iscsi->hq.pbl_phys_table_phys.as_u32.low;
2243d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.hq_pbl_base.hi = iscsi->hq.pbl_phys_table_phys.as_u32.high;
2244d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.hq_curr_pbe_base.lo = iscsi->hq.pbl_phys_table_virt[0].as_u32.low;
2245d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.hq_curr_pbe_base.hi = iscsi->hq.pbl_phys_table_virt[0].as_u32.high;
2246d14abf15SRobert Mustacchi 
2247d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.r2tq_pbl_base.lo = iscsi->r2tq.pbl_phys_table_phys.as_u32.low;
2248d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.r2tq_pbl_base.hi = iscsi->r2tq.pbl_phys_table_phys.as_u32.high;
2249d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.r2tq_curr_pbe_base.lo = iscsi->r2tq.pbl_phys_table_virt[0].as_u32.low;
2250d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.r2tq_curr_pbe_base.hi = iscsi->r2tq.pbl_phys_table_virt[0].as_u32.high;
2251d14abf15SRobert Mustacchi 
2252d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.task_pbl_base.lo = iscsi->task_array.pbl_phys_table_phys.as_u32.low;
2253d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.task_pbl_base.hi = iscsi->task_array.pbl_phys_table_phys.as_u32.high;
2254d14abf15SRobert Mustacchi     ctx->xstorm_st_context.iscsi.task_pbl_cache_idx = ISCSI_PBL_NOT_CACHED;
2255d14abf15SRobert Mustacchi     //ctx->xstorm_st_context.iscsi.max_outstanding_r2ts = ISCSI_DEFAULT_MAX_OUTSTANDING_R2T;
2256d14abf15SRobert Mustacchi     SET_FIELD(ctx->xstorm_st_context.iscsi.flags.flags, XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA, ISCSI_DEFAULT_IMMEDIATE_DATA);
2257d14abf15SRobert Mustacchi     SET_FIELD(ctx->xstorm_st_context.iscsi.flags.flags, XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T, ISCSI_DEFAULT_INITIAL_R2T);
2258d14abf15SRobert Mustacchi     SET_FIELD(ctx->xstorm_st_context.iscsi.flags.flags, XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_HEADER_DIGEST, ISCSI_DEFAULT_HEADER_DIGEST);
2259d14abf15SRobert Mustacchi     SET_FIELD(ctx->xstorm_st_context.iscsi.flags.flags, XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_DATA_DIGEST, ISCSI_DEFAULT_DATA_DIGEST);
2260d14abf15SRobert Mustacchi 
2261d14abf15SRobert Mustacchi     // init tstorm storm context
2262d14abf15SRobert Mustacchi     ctx->tstorm_st_context.iscsi.hdr_bytes_2_fetch = ISCSI_HEADER_SIZE + (ISCSI_DEFAULT_HEADER_DIGEST ? ISCSI_DIGEST_SIZE : 0);
2263d14abf15SRobert Mustacchi     SET_FIELD(ctx->tstorm_st_context.iscsi.flags, TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN, ISCSI_DEFAULT_HEADER_DIGEST);
2264d14abf15SRobert Mustacchi     SET_FIELD(ctx->tstorm_st_context.iscsi.flags, TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN, ISCSI_DEFAULT_DATA_DIGEST);
2265d14abf15SRobert Mustacchi     ctx->tstorm_st_context.iscsi.rq_db_phy_addr.lo = req2->rq_page_table_addr_lo;
2266d14abf15SRobert Mustacchi     ctx->tstorm_st_context.iscsi.rq_db_phy_addr.hi = req2->rq_page_table_addr_hi;
2267d14abf15SRobert Mustacchi     ctx->tstorm_st_context.iscsi.iscsi_conn_id = conn_id;
2268d14abf15SRobert Mustacchi 
2269d14abf15SRobert Mustacchi     //To enable the timer block.
2270d14abf15SRobert Mustacchi     SET_FIELD(ctx->timers_context.flags, TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG, 1);
2271d14abf15SRobert Mustacchi 
2272d14abf15SRobert Mustacchi     // init ustorm storm context
2273d14abf15SRobert Mustacchi     cq_size_in_bytes = pdev->iscsi_info.run_time.cq_size * ISCSI_CQE_SIZE;
2274d14abf15SRobert Mustacchi     single_cq_pbl_entries = lm_get_pbl_entries(cq_size_in_bytes);
2275d14abf15SRobert Mustacchi 
2276d14abf15SRobert Mustacchi     ctx->ustorm_st_context.task_pbe_cache_index = ISCSI_PBL_NOT_CACHED;
2277d14abf15SRobert Mustacchi     ctx->ustorm_st_context.task_pdu_cache_index = ISCSI_PDU_HEADER_NOT_CACHED;
2278d14abf15SRobert Mustacchi 
2279d14abf15SRobert Mustacchi     /* advance the RQ pbl_base cause it's pointing the RQ_DB  */
2280d14abf15SRobert Mustacchi     pbl_base.as_u32.low = req2->rq_page_table_addr_lo;
2281d14abf15SRobert Mustacchi     pbl_base.as_u32.high = req2->rq_page_table_addr_hi;
2282d14abf15SRobert Mustacchi     LM_INC64(&pbl_base, ISCSI_RQ_DB_SIZE);
2283d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.rq.pbl_base.lo = pbl_base.as_u32.low;
2284d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.rq.pbl_base.hi = pbl_base.as_u32.high;
2285d14abf15SRobert Mustacchi 
2286d14abf15SRobert Mustacchi     //!!DP
2287d14abf15SRobert Mustacchi     /* qp_first_pte[0] will contain the first PTE of the RQ */
2288d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.rq.curr_pbe.lo = req3->qp_first_pte[0].lo;
2289d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.rq.curr_pbe.hi = req3->qp_first_pte[0].hi;
2290d14abf15SRobert Mustacchi 
2291d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.r2tq.pbl_base.lo = iscsi->r2tq.pbl_phys_table_phys.as_u32.low;
2292d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.r2tq.pbl_base.hi = iscsi->r2tq.pbl_phys_table_phys.as_u32.high;
2293d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.r2tq.curr_pbe.lo = iscsi->r2tq.pbl_phys_table_virt[0].as_u32.low;
2294d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.r2tq.curr_pbe.hi = iscsi->r2tq.pbl_phys_table_virt[0].as_u32.high;
2295d14abf15SRobert Mustacchi 
2296d14abf15SRobert Mustacchi     /* Set up the first CQ, the first PTE info is contained in req2 */
2297d14abf15SRobert Mustacchi     pbl_base.as_u32.low = req1->cq_page_table_addr_lo;
2298d14abf15SRobert Mustacchi     pbl_base.as_u32.high = req1->cq_page_table_addr_hi;
2299d14abf15SRobert Mustacchi     LM_INC64(&pbl_base, ISCSI_CQ_DB_SIZE);
2300d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.cq_pbl_base.lo = pbl_base.as_u32.low;
2301d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.cq_pbl_base.hi = pbl_base.as_u32.high;
2302d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.cq[0].cq_sn = ISCSI_INITIAL_SN;
2303d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.cq[0].curr_pbe.lo = req2->cq_first_pte.lo;
2304d14abf15SRobert Mustacchi     ctx->ustorm_st_context.ring.cq[0].curr_pbe.hi = req2->cq_first_pte.hi;
2305d14abf15SRobert Mustacchi 
2306d14abf15SRobert Mustacchi     if (1 != pdev->iscsi_info.run_time.num_of_cqs)
2307d14abf15SRobert Mustacchi     {
2308d14abf15SRobert Mustacchi         /* For now we only support a single CQ */
2309d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2310d14abf15SRobert Mustacchi 
2311d14abf15SRobert Mustacchi #if 0
2312d14abf15SRobert Mustacchi         /* Set up additional CQs */
2313d14abf15SRobert Mustacchi         for (i = 1; i < pdev->iscsi_info.run_time.num_of_cqs; i++)   // 8 x CQ curr_pbe
2314d14abf15SRobert Mustacchi         {
2315d14abf15SRobert Mustacchi             ctx->ustorm_st_context.ring.cq[i].cq_sn = ISCSI_INITIAL_SN;
2316d14abf15SRobert Mustacchi 
2317d14abf15SRobert Mustacchi             curr_pbl_base.as_u32.low = pbl_base.as_u32.low;
2318d14abf15SRobert Mustacchi             curr_pbl_base.as_u32.high = pbl_base.as_u32.high;
2319d14abf15SRobert Mustacchi 
2320d14abf15SRobert Mustacchi             LM_INC64(&curr_pbl_base, i * single_cq_pbl_entries * sizeof(lm_address_t));
2321d14abf15SRobert Mustacchi #if 0
2322d14abf15SRobert Mustacchi             fix this if we ever want to use > 1 CQ
2323d14abf15SRobert Mustacchi 
2324d14abf15SRobert Mustacchi             curr_pbe = (lm_address_t *)mm_map_io_space(curr_pbl_base, sizeof(lm_address_t));
2325d14abf15SRobert Mustacchi             if CHK_NULL(curr_pbe)
2326d14abf15SRobert Mustacchi             {
2327d14abf15SRobert Mustacchi                 return LM_STATUS_INVALID_PARAMETER;
2328d14abf15SRobert Mustacchi             }
2329d14abf15SRobert Mustacchi             ctx->ustorm_st_context.ring.cq[i].curr_pbe.lo = curr_pbe->as_u32.low;
2330d14abf15SRobert Mustacchi             ctx->ustorm_st_context.ring.cq[i].curr_pbe.hi = curr_pbe->as_u32.high;
2331d14abf15SRobert Mustacchi             mm_unmap_io_space(curr_pbe, sizeof(lm_address_t));
2332d14abf15SRobert Mustacchi 
2333d14abf15SRobert Mustacchi #endif
2334d14abf15SRobert Mustacchi         }
2335d14abf15SRobert Mustacchi #endif
2336d14abf15SRobert Mustacchi     }
2337d14abf15SRobert Mustacchi 
2338d14abf15SRobert Mustacchi     ctx->ustorm_st_context.task_pbl_base.lo = iscsi->task_array.pbl_phys_table_phys.as_u32.low;
2339d14abf15SRobert Mustacchi     ctx->ustorm_st_context.task_pbl_base.hi = iscsi->task_array.pbl_phys_table_phys.as_u32.high;
2340d14abf15SRobert Mustacchi     ctx->ustorm_st_context.tce_phy_addr.lo = iscsi->task_array.pbl_phys_table_virt[0].as_u32.low;
2341d14abf15SRobert Mustacchi     ctx->ustorm_st_context.tce_phy_addr.hi = iscsi->task_array.pbl_phys_table_virt[0].as_u32.high;
2342d14abf15SRobert Mustacchi     ctx->ustorm_st_context.iscsi_conn_id = conn_id;
2343d14abf15SRobert Mustacchi     SET_FIELD(ctx->ustorm_st_context.negotiated_rx, USTORM_ISCSI_ST_CONTEXT_MAX_RECV_PDU_LENGTH, ISCSI_DEFAULT_MAX_PDU_LENGTH);
2344d14abf15SRobert Mustacchi     SET_FIELD(ctx->ustorm_st_context.negotiated_rx_and_flags, USTORM_ISCSI_ST_CONTEXT_MAX_BURST_LENGTH, ISCSI_DEFAULT_MAX_BURST_LENGTH);
2345d14abf15SRobert Mustacchi     SET_FIELD(ctx->ustorm_st_context.negotiated_rx, USTORM_ISCSI_ST_CONTEXT_MAX_OUTSTANDING_R2TS, ISCSI_DEFAULT_MAX_OUTSTANDING_R2T);
2346d14abf15SRobert Mustacchi     SET_FIELD(ctx->ustorm_st_context.negotiated_rx_and_flags, USTORM_ISCSI_ST_CONTEXT_B_HDR_DIGEST_EN, ISCSI_DEFAULT_HEADER_DIGEST);
2347d14abf15SRobert Mustacchi     SET_FIELD(ctx->ustorm_st_context.negotiated_rx_and_flags, USTORM_ISCSI_ST_CONTEXT_B_DATA_DIGEST_EN, ISCSI_DEFAULT_DATA_DIGEST);
2348d14abf15SRobert Mustacchi     ctx->ustorm_st_context.num_cqs = pdev->iscsi_info.run_time.num_of_cqs;
2349d14abf15SRobert Mustacchi 
2350d14abf15SRobert Mustacchi     // init cstorm storm context
2351d14abf15SRobert Mustacchi     ctx->cstorm_st_context.hq_pbl_base.lo = iscsi->hq.pbl_phys_table_phys.as_u32.low;
2352d14abf15SRobert Mustacchi     ctx->cstorm_st_context.hq_pbl_base.hi = iscsi->hq.pbl_phys_table_phys.as_u32.high;
2353d14abf15SRobert Mustacchi     ctx->cstorm_st_context.hq_curr_pbe.lo = iscsi->hq.pbl_phys_table_virt[0].as_u32.low;
2354d14abf15SRobert Mustacchi     ctx->cstorm_st_context.hq_curr_pbe.hi = iscsi->hq.pbl_phys_table_virt[0].as_u32.high;
2355d14abf15SRobert Mustacchi 
2356d14abf15SRobert Mustacchi     ctx->cstorm_st_context.task_pbl_base.lo = iscsi->task_array.pbl_phys_table_phys.as_u32.low;
2357d14abf15SRobert Mustacchi     ctx->cstorm_st_context.task_pbl_base.hi = iscsi->task_array.pbl_phys_table_phys.as_u32.high;
2358d14abf15SRobert Mustacchi     ctx->cstorm_st_context.cq_db_base.lo = req1->cq_page_table_addr_lo;
2359d14abf15SRobert Mustacchi     ctx->cstorm_st_context.cq_db_base.hi = req1->cq_page_table_addr_hi;
2360d14abf15SRobert Mustacchi     ctx->cstorm_st_context.iscsi_conn_id = conn_id;
2361d14abf15SRobert Mustacchi     ctx->cstorm_st_context.cq_proc_en_bit_map = (1 << pdev->iscsi_info.run_time.num_of_cqs) - 1;
2362d14abf15SRobert Mustacchi     SET_FIELD(ctx->cstorm_st_context.flags, CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN, ISCSI_DEFAULT_HEADER_DIGEST);
2363d14abf15SRobert Mustacchi     SET_FIELD(ctx->cstorm_st_context.flags, CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN, ISCSI_DEFAULT_DATA_DIGEST);
2364d14abf15SRobert Mustacchi     for (i = 0; i < pdev->iscsi_info.run_time.num_of_cqs; i++)
2365d14abf15SRobert Mustacchi     {
2366d14abf15SRobert Mustacchi         ctx->cstorm_st_context.cq_c_prod_sqn_arr.sqn[i] = ISCSI_INITIAL_SN;
2367d14abf15SRobert Mustacchi         ctx->cstorm_st_context.cq_c_sqn_2_notify_arr.sqn[i] = ISCSI_INITIAL_SN;
2368d14abf15SRobert Mustacchi     }
2369d14abf15SRobert Mustacchi 
2370d14abf15SRobert Mustacchi     /* now we need to configure the cdu-validation data */
2371d14abf15SRobert Mustacchi     lm_set_cdu_validation_data(pdev, iscsi->cid, FALSE /* don't invalidate */);
2372d14abf15SRobert Mustacchi 
2373d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2374d14abf15SRobert Mustacchi }
2375d14abf15SRobert Mustacchi 
2376d14abf15SRobert Mustacchi 
2377d14abf15SRobert Mustacchi lm_status_t
lm_fc_init_fcoe_context(IN struct _lm_device_t * pdev,IN lm_fcoe_state_t * fcoe)2378d14abf15SRobert Mustacchi lm_fc_init_fcoe_context(
2379d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
2380d14abf15SRobert Mustacchi     IN lm_fcoe_state_t              *fcoe)
2381d14abf15SRobert Mustacchi {
2382d14abf15SRobert Mustacchi     struct fcoe_context *ctx;
2383d14abf15SRobert Mustacchi     u32_t cid;
2384d14abf15SRobert Mustacchi     u16_t conn_id;
2385d14abf15SRobert Mustacchi 
2386d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(fcoe))
2387d14abf15SRobert Mustacchi     {
2388d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2389d14abf15SRobert Mustacchi     }
2390d14abf15SRobert Mustacchi 
2391d14abf15SRobert Mustacchi     conn_id = fcoe->ofld1.fcoe_conn_id;
2392d14abf15SRobert Mustacchi     cid = fcoe->cid;
2393d14abf15SRobert Mustacchi 
2394d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "### lm_fc_init_fcoe_context\n");
2395d14abf15SRobert Mustacchi 
2396d14abf15SRobert Mustacchi     /* get context */
2397d14abf15SRobert Mustacchi     fcoe->ctx_virt = (struct fcoe_context *)lm_get_context(pdev, fcoe->cid);
2398d14abf15SRobert Mustacchi     DbgBreakIf(!fcoe->ctx_virt);
2399d14abf15SRobert Mustacchi     fcoe->ctx_phys.as_u64 = lm_get_context_phys(pdev, fcoe->cid);
2400d14abf15SRobert Mustacchi     DbgBreakIf(!fcoe->ctx_phys.as_u64);
2401d14abf15SRobert Mustacchi     DbgMessage(pdev, VERBOSEl5sp,
2402d14abf15SRobert Mustacchi                 "fcoe->ctx_virt=%p, fcoe->ctx_phys_high=%x, fcoe->ctx_phys_low=%x\n",
2403d14abf15SRobert Mustacchi                 fcoe->ctx_virt, fcoe->ctx_phys.as_u32.high, fcoe->ctx_phys.as_u32.low);
2404d14abf15SRobert Mustacchi 
2405d14abf15SRobert Mustacchi     ctx = fcoe->ctx_virt;
2406d14abf15SRobert Mustacchi 
2407d14abf15SRobert Mustacchi     mm_memset(ctx, 0, sizeof(struct fcoe_context));
2408d14abf15SRobert Mustacchi 
2409d14abf15SRobert Mustacchi     /* now we need to configure the cdu-validation data */
2410d14abf15SRobert Mustacchi     lm_set_cdu_validation_data(pdev, fcoe->cid, FALSE /* don't invalidate */);
2411d14abf15SRobert Mustacchi 
2412d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2413d14abf15SRobert Mustacchi }
2414d14abf15SRobert Mustacchi 
2415d14abf15SRobert Mustacchi 
2416d14abf15SRobert Mustacchi 
2417d14abf15SRobert Mustacchi lm_status_t
lm_fc_alloc_con_resc(IN struct _lm_device_t * pdev,IN lm_fcoe_state_t * fcoe)2418d14abf15SRobert Mustacchi lm_fc_alloc_con_resc(
2419d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
2420d14abf15SRobert Mustacchi     IN lm_fcoe_state_t              *fcoe)
2421d14abf15SRobert Mustacchi {
2422d14abf15SRobert Mustacchi     lm_status_t                     lm_status = LM_STATUS_SUCCESS;
2423d14abf15SRobert Mustacchi     s32_t                           cid       = 0;
2424d14abf15SRobert Mustacchi 
2425d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(fcoe))
2426d14abf15SRobert Mustacchi     {
2427d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
2428d14abf15SRobert Mustacchi     }
2429d14abf15SRobert Mustacchi 
2430d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "### lm_fc_alloc_con_resc\n");
2431d14abf15SRobert Mustacchi 
2432d14abf15SRobert Mustacchi     /* save the miniport's conn id */
2433d14abf15SRobert Mustacchi     fcoe->fcoe_conn_id = fcoe->ofld1.fcoe_conn_id;
2434d14abf15SRobert Mustacchi 
2435d14abf15SRobert Mustacchi     /* Allocate CID */
2436d14abf15SRobert Mustacchi     lm_status = lm_allocate_cid(pdev, FCOE_CONNECTION_TYPE, (void *)fcoe, &cid);
2437d14abf15SRobert Mustacchi     if (lm_status == LM_STATUS_PENDING)
2438d14abf15SRobert Mustacchi     {
2439d14abf15SRobert Mustacchi         lm_sp_req_manager_block(pdev, (u32_t)cid);
2440d14abf15SRobert Mustacchi     }
2441d14abf15SRobert Mustacchi     else if (lm_status != LM_STATUS_SUCCESS)
2442d14abf15SRobert Mustacchi     {
2443d14abf15SRobert Mustacchi         /* failed to allocate CID */
2444d14abf15SRobert Mustacchi         lm_fc_free_con_resc(pdev, fcoe);
2445d14abf15SRobert Mustacchi         return lm_status;
2446d14abf15SRobert Mustacchi     }
2447d14abf15SRobert Mustacchi 
2448d14abf15SRobert Mustacchi     /* save the returned cid */
2449d14abf15SRobert Mustacchi     fcoe->cid = (u32_t)cid;
2450d14abf15SRobert Mustacchi 
2451d14abf15SRobert Mustacchi     if (lm_cid_state(pdev, fcoe->cid) == LM_CID_STATE_PENDING)
2452d14abf15SRobert Mustacchi     {
2453d14abf15SRobert Mustacchi         return LM_STATUS_PENDING; /* Too soon to initialize context */
2454d14abf15SRobert Mustacchi     }
2455d14abf15SRobert Mustacchi 
2456d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2457d14abf15SRobert Mustacchi } /* lm_fc_alloc_con_resc */
2458d14abf15SRobert Mustacchi 
2459d14abf15SRobert Mustacchi 
2460d14abf15SRobert Mustacchi 
2461d14abf15SRobert Mustacchi lm_status_t
lm_fc_post_offload_ramrod(struct _lm_device_t * pdev,lm_fcoe_state_t * fcoe)2462d14abf15SRobert Mustacchi lm_fc_post_offload_ramrod(
2463d14abf15SRobert Mustacchi     struct _lm_device_t             *pdev,
2464d14abf15SRobert Mustacchi     lm_fcoe_state_t                 *fcoe)
2465d14abf15SRobert Mustacchi {
2466d14abf15SRobert Mustacchi     lm_fcoe_slow_path_phys_data_t   *ramrod_params;
2467d14abf15SRobert Mustacchi     lm_status_t                     lm_status;
2468d14abf15SRobert Mustacchi 
2469d14abf15SRobert Mustacchi     ramrod_params = (lm_fcoe_slow_path_phys_data_t*)pdev->fcoe_info.bind.ramrod_mem_virt;
2470d14abf15SRobert Mustacchi 
2471d14abf15SRobert Mustacchi     mm_memset(ramrod_params, 0, sizeof(lm_fcoe_slow_path_phys_data_t));
2472d14abf15SRobert Mustacchi 
2473d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_ofld.offload_kwqe1, &fcoe->ofld1, sizeof(struct fcoe_kwqe_conn_offload1));
2474d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_ofld.offload_kwqe2, &fcoe->ofld2, sizeof(struct fcoe_kwqe_conn_offload2));
2475d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_ofld.offload_kwqe3, &fcoe->ofld3, sizeof(struct fcoe_kwqe_conn_offload3));
2476d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_ofld.offload_kwqe4, &fcoe->ofld4, sizeof(struct fcoe_kwqe_conn_offload4));
2477d14abf15SRobert Mustacchi 
2478d14abf15SRobert Mustacchi     lm_status = lm_command_post(pdev,
2479d14abf15SRobert Mustacchi                                 fcoe->cid,
2480d14abf15SRobert Mustacchi                                 FCOE_RAMROD_CMD_ID_OFFLOAD_CONN,
2481d14abf15SRobert Mustacchi                                 CMD_PRIORITY_NORMAL,
2482d14abf15SRobert Mustacchi                                 FCOE_CONNECTION_TYPE,
2483d14abf15SRobert Mustacchi                                 pdev->fcoe_info.bind.ramrod_mem_phys.as_u64);
2484d14abf15SRobert Mustacchi 
2485d14abf15SRobert Mustacchi     return lm_status;
2486d14abf15SRobert Mustacchi }
2487d14abf15SRobert Mustacchi 
2488d14abf15SRobert Mustacchi 
2489d14abf15SRobert Mustacchi 
2490d14abf15SRobert Mustacchi lm_status_t
lm_fc_post_enable_ramrod(struct _lm_device_t * pdev,lm_fcoe_state_t * fcoe,struct fcoe_kwqe_conn_enable_disable * enable)2491d14abf15SRobert Mustacchi lm_fc_post_enable_ramrod(
2492d14abf15SRobert Mustacchi     struct _lm_device_t                     *pdev,
2493d14abf15SRobert Mustacchi     lm_fcoe_state_t                         *fcoe,
2494d14abf15SRobert Mustacchi     struct fcoe_kwqe_conn_enable_disable    *enable)
2495d14abf15SRobert Mustacchi {
2496d14abf15SRobert Mustacchi     lm_fcoe_slow_path_phys_data_t   *ramrod_params;
2497d14abf15SRobert Mustacchi     lm_status_t                     lm_status;
2498d14abf15SRobert Mustacchi 
2499d14abf15SRobert Mustacchi     ramrod_params = (lm_fcoe_slow_path_phys_data_t*)pdev->fcoe_info.bind.ramrod_mem_virt;
2500d14abf15SRobert Mustacchi 
2501d14abf15SRobert Mustacchi     mm_memset(ramrod_params, 0, sizeof(lm_fcoe_slow_path_phys_data_t));
2502d14abf15SRobert Mustacchi 
2503d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_enable.enable_disable_kwqe, enable, sizeof(struct fcoe_kwqe_conn_enable_disable));
2504d14abf15SRobert Mustacchi 
2505d14abf15SRobert Mustacchi     lm_status = lm_command_post(pdev,
2506d14abf15SRobert Mustacchi                                 fcoe->cid,
2507d14abf15SRobert Mustacchi                                 FCOE_RAMROD_CMD_ID_ENABLE_CONN,
2508d14abf15SRobert Mustacchi                                 CMD_PRIORITY_NORMAL,
2509d14abf15SRobert Mustacchi                                 FCOE_CONNECTION_TYPE,
2510d14abf15SRobert Mustacchi                                 pdev->fcoe_info.bind.ramrod_mem_phys.as_u64);
2511d14abf15SRobert Mustacchi 
2512d14abf15SRobert Mustacchi     return lm_status;
2513d14abf15SRobert Mustacchi }
2514d14abf15SRobert Mustacchi 
2515d14abf15SRobert Mustacchi 
2516d14abf15SRobert Mustacchi 
2517d14abf15SRobert Mustacchi lm_status_t
lm_fc_post_disable_ramrod(struct _lm_device_t * pdev,lm_fcoe_state_t * fcoe,struct fcoe_kwqe_conn_enable_disable * disable)2518d14abf15SRobert Mustacchi lm_fc_post_disable_ramrod(
2519d14abf15SRobert Mustacchi     struct _lm_device_t                    *pdev,
2520d14abf15SRobert Mustacchi     lm_fcoe_state_t                        *fcoe,
2521d14abf15SRobert Mustacchi     struct fcoe_kwqe_conn_enable_disable   *disable)
2522d14abf15SRobert Mustacchi {
2523d14abf15SRobert Mustacchi     lm_fcoe_slow_path_phys_data_t   *ramrod_params;
2524d14abf15SRobert Mustacchi     lm_status_t                     lm_status;
2525d14abf15SRobert Mustacchi 
2526d14abf15SRobert Mustacchi     ramrod_params = (lm_fcoe_slow_path_phys_data_t*)pdev->fcoe_info.bind.ramrod_mem_virt;
2527d14abf15SRobert Mustacchi 
2528d14abf15SRobert Mustacchi     mm_memset(ramrod_params, 0, sizeof(lm_fcoe_slow_path_phys_data_t));
2529d14abf15SRobert Mustacchi 
2530d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_enable.enable_disable_kwqe, disable, sizeof *disable);
2531d14abf15SRobert Mustacchi 
2532d14abf15SRobert Mustacchi     lm_status = lm_command_post(pdev,
2533d14abf15SRobert Mustacchi                                 fcoe->cid,
2534d14abf15SRobert Mustacchi                                 FCOE_RAMROD_CMD_ID_DISABLE_CONN,
2535d14abf15SRobert Mustacchi                                 CMD_PRIORITY_NORMAL,
2536d14abf15SRobert Mustacchi                                 FCOE_CONNECTION_TYPE,
2537d14abf15SRobert Mustacchi                                 pdev->fcoe_info.bind.ramrod_mem_phys.as_u64);
2538d14abf15SRobert Mustacchi 
2539d14abf15SRobert Mustacchi     return lm_status;
2540d14abf15SRobert Mustacchi }
2541d14abf15SRobert Mustacchi 
2542d14abf15SRobert Mustacchi lm_status_t
lm_fc_post_destroy_ramrod(struct _lm_device_t * pdev)2543d14abf15SRobert Mustacchi lm_fc_post_destroy_ramrod(
2544d14abf15SRobert Mustacchi     struct _lm_device_t             *pdev)
2545d14abf15SRobert Mustacchi {
2546d14abf15SRobert Mustacchi     lm_status_t                     lm_status;
2547d14abf15SRobert Mustacchi 
2548d14abf15SRobert Mustacchi     lm_status = lm_command_post(pdev,
2549d14abf15SRobert Mustacchi                                 LM_CLI_CID(pdev, LM_CLI_IDX_FCOE),      /* cid */
2550d14abf15SRobert Mustacchi                                 FCOE_RAMROD_CMD_ID_DESTROY_FUNC,
2551d14abf15SRobert Mustacchi                                 CMD_PRIORITY_NORMAL,
2552d14abf15SRobert Mustacchi                                 FCOE_CONNECTION_TYPE,
2553d14abf15SRobert Mustacchi                                 0);
2554d14abf15SRobert Mustacchi 
2555d14abf15SRobert Mustacchi     return lm_status;
2556d14abf15SRobert Mustacchi }
2557d14abf15SRobert Mustacchi 
2558d14abf15SRobert Mustacchi 
2559d14abf15SRobert Mustacchi lm_status_t
lm_fc_post_stat_ramrod(struct _lm_device_t * pdev,struct fcoe_kwqe_stat * stat)2560d14abf15SRobert Mustacchi lm_fc_post_stat_ramrod(
2561d14abf15SRobert Mustacchi     struct _lm_device_t         *pdev,
2562d14abf15SRobert Mustacchi     struct fcoe_kwqe_stat       *stat)
2563d14abf15SRobert Mustacchi {
2564d14abf15SRobert Mustacchi     lm_status_t                     lm_status = LM_STATUS_SUCCESS;
2565d14abf15SRobert Mustacchi 
2566d14abf15SRobert Mustacchi     lm_fcoe_slow_path_phys_data_t   *ramrod_params;
2567d14abf15SRobert Mustacchi 
2568d14abf15SRobert Mustacchi     if(CHK_NULL(pdev->fcoe_info.bind.ramrod_mem_virt))
2569d14abf15SRobert Mustacchi     {
2570d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
2571d14abf15SRobert Mustacchi     }
2572d14abf15SRobert Mustacchi     ramrod_params = (lm_fcoe_slow_path_phys_data_t*)pdev->fcoe_info.bind.ramrod_mem_virt;
2573d14abf15SRobert Mustacchi 
2574d14abf15SRobert Mustacchi     mm_memset(ramrod_params, 0, sizeof(lm_fcoe_slow_path_phys_data_t));
2575d14abf15SRobert Mustacchi 
2576d14abf15SRobert Mustacchi     memcpy(&ramrod_params->fcoe_stat.stat_kwqe, stat, sizeof(struct fcoe_kwqe_stat));
2577d14abf15SRobert Mustacchi 
2578d14abf15SRobert Mustacchi     lm_status = lm_command_post(pdev,
2579d14abf15SRobert Mustacchi                                 LM_CLI_CID(pdev, LM_CLI_IDX_FCOE),      /* cid */
2580d14abf15SRobert Mustacchi                                 FCOE_RAMROD_CMD_ID_STAT_FUNC,
2581d14abf15SRobert Mustacchi                                 CMD_PRIORITY_NORMAL,
2582d14abf15SRobert Mustacchi                                 FCOE_CONNECTION_TYPE,
2583d14abf15SRobert Mustacchi                                 pdev->fcoe_info.bind.ramrod_mem_phys.as_u64);
2584d14abf15SRobert Mustacchi 
2585d14abf15SRobert Mustacchi     return lm_status;
2586d14abf15SRobert Mustacchi }
2587d14abf15SRobert Mustacchi 
2588d14abf15SRobert Mustacchi lm_status_t
lm_fc_post_terminate_ramrod(struct _lm_device_t * pdev,lm_fcoe_state_t * fcoe)2589d14abf15SRobert Mustacchi lm_fc_post_terminate_ramrod(
2590d14abf15SRobert Mustacchi     struct _lm_device_t             *pdev,
2591d14abf15SRobert Mustacchi     lm_fcoe_state_t                 *fcoe)
2592d14abf15SRobert Mustacchi {
2593d14abf15SRobert Mustacchi     lm_status_t                     lm_status;
2594d14abf15SRobert Mustacchi 
2595d14abf15SRobert Mustacchi     lm_status = lm_command_post(pdev,
2596d14abf15SRobert Mustacchi                                 fcoe->cid,
2597d14abf15SRobert Mustacchi                                 FCOE_RAMROD_CMD_ID_TERMINATE_CONN,
2598d14abf15SRobert Mustacchi                                 CMD_PRIORITY_NORMAL,
2599d14abf15SRobert Mustacchi                                 FCOE_CONNECTION_TYPE,
2600d14abf15SRobert Mustacchi                                 0);
2601d14abf15SRobert Mustacchi 
2602d14abf15SRobert Mustacchi     return lm_status;
2603d14abf15SRobert Mustacchi }
2604