1d14abf15SRobert Mustacchi /*******************************************************************************
2d14abf15SRobert Mustacchi  * CDDL HEADER START
3d14abf15SRobert Mustacchi  *
4d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
5d14abf15SRobert Mustacchi  * Common Development and Distribution License (the "License").
6d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
7d14abf15SRobert Mustacchi  *
8d14abf15SRobert Mustacchi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9d14abf15SRobert Mustacchi  * or http://www.opensolaris.org/os/licensing.
10d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
11d14abf15SRobert Mustacchi  * and limitations under the License.
12d14abf15SRobert Mustacchi  *
13d14abf15SRobert Mustacchi  * When distributing Covered Code, include this CDDL HEADER in each
14d14abf15SRobert Mustacchi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15d14abf15SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
16d14abf15SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
17d14abf15SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
18d14abf15SRobert Mustacchi  *
19d14abf15SRobert Mustacchi  * CDDL HEADER END
20d14abf15SRobert Mustacchi  *
21d14abf15SRobert Mustacchi  * Copyright 2014 QLogic Corporation
22d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
23d14abf15SRobert Mustacchi  * QLogic End User License (the "License").
24d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
25d14abf15SRobert Mustacchi  *
26d14abf15SRobert Mustacchi  * You can obtain a copy of the License at
27d14abf15SRobert Mustacchi  * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
28d14abf15SRobert Mustacchi  * QLogic_End_User_Software_License.txt
29d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
30d14abf15SRobert Mustacchi  * and limitations under the License.
31d14abf15SRobert Mustacchi  *
32d14abf15SRobert Mustacchi  *
33d14abf15SRobert Mustacchi  * Module Description:
34d14abf15SRobert Mustacchi  *      This file contains functions that deal with resource allocation and setup
35d14abf15SRobert Mustacchi  *
36d14abf15SRobert Mustacchi  ******************************************************************************/
37d14abf15SRobert Mustacchi #include "lm5710.h"
38d14abf15SRobert Mustacchi #include "bd_chain.h"
39d14abf15SRobert Mustacchi #include "command.h"
40d14abf15SRobert Mustacchi #include "ecore_common.h"
41d14abf15SRobert Mustacchi #include "577xx_int_offsets.h"
42d14abf15SRobert Mustacchi #include "bcmtype.h"
43d14abf15SRobert Mustacchi 
44d14abf15SRobert Mustacchi // should be same as ceil (math.h) doesn't support u64_t
45d14abf15SRobert Mustacchi #define _ceil( _x_32, _divisor_32 ) ((_x_32 / _divisor_32) + ( (_x_32%_divisor_32) ? 1 : 0))
46d14abf15SRobert Mustacchi 
47d14abf15SRobert Mustacchi lm_status_t
lm_clear_chain_sb_cons_idx(IN struct _lm_device_t * pdev,IN u8_t sb_id,IN struct _lm_hc_sb_info_t * hc_sb_info,IN volatile u16_t ** hw_con_idx_ptr)48d14abf15SRobert Mustacchi lm_clear_chain_sb_cons_idx(
49d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
50d14abf15SRobert Mustacchi     IN u8_t sb_id,
51d14abf15SRobert Mustacchi     IN struct _lm_hc_sb_info_t *hc_sb_info,
52d14abf15SRobert Mustacchi     IN volatile u16_t ** hw_con_idx_ptr
53d14abf15SRobert Mustacchi     )
54d14abf15SRobert Mustacchi {
55d14abf15SRobert Mustacchi     u8_t  port       = 0;
56d14abf15SRobert Mustacchi     u8_t  func       = 0;
57d14abf15SRobert Mustacchi     u16_t rd_val     = 0xFFFF;
58d14abf15SRobert Mustacchi     u32_t rd_val_32  = 0xFFFFFFFF;
59d14abf15SRobert Mustacchi     u8_t  fw_sb_id   = 0;
60d14abf15SRobert Mustacchi     u8_t  sb_lock_id = 0;
61d14abf15SRobert Mustacchi 
62d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) || CHK_NULL(hc_sb_info) || CHK_NULL(hw_con_idx_ptr))
63d14abf15SRobert Mustacchi     {
64d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
65d14abf15SRobert Mustacchi     }
66d14abf15SRobert Mustacchi 
67d14abf15SRobert Mustacchi     if (IS_VFDEV(pdev))
68d14abf15SRobert Mustacchi     {
69d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
70d14abf15SRobert Mustacchi     }
71d14abf15SRobert Mustacchi 
72d14abf15SRobert Mustacchi     sb_lock_id = lm_sb_id_from_chain(pdev, sb_id);
73d14abf15SRobert Mustacchi     if (sb_lock_id == DEF_STATUS_BLOCK_INDEX)
74d14abf15SRobert Mustacchi     {
75d14abf15SRobert Mustacchi         sb_lock_id = DEF_STATUS_BLOCK_IGU_INDEX;
76d14abf15SRobert Mustacchi     }
77d14abf15SRobert Mustacchi 
78d14abf15SRobert Mustacchi     /* make sure that the sb is not during processing while we
79d14abf15SRobert Mustacchi      * clear the pointer */
80d14abf15SRobert Mustacchi     MM_ACQUIRE_SB_LOCK(pdev, sb_lock_id);
81d14abf15SRobert Mustacchi 
82d14abf15SRobert Mustacchi     *hw_con_idx_ptr = NULL;
83d14abf15SRobert Mustacchi 
84d14abf15SRobert Mustacchi     MM_RELEASE_SB_LOCK(pdev, sb_lock_id);
85d14abf15SRobert Mustacchi 
86d14abf15SRobert Mustacchi     if (lm_reset_is_inprogress(pdev))
87d14abf15SRobert Mustacchi     {
88d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
89d14abf15SRobert Mustacchi     }
90d14abf15SRobert Mustacchi 
91d14abf15SRobert Mustacchi     port = PORT_ID(pdev);
92d14abf15SRobert Mustacchi     func = FUNC_ID(pdev);
93d14abf15SRobert Mustacchi     fw_sb_id = LM_FW_SB_ID(pdev, sb_id);
94d14abf15SRobert Mustacchi 
95d14abf15SRobert Mustacchi     switch (hc_sb_info->hc_sb) {
96d14abf15SRobert Mustacchi     case STATUS_BLOCK_SP_SL_TYPE:
97d14abf15SRobert Mustacchi         LM_INTMEM_WRITE16(pdev, CSTORM_SP_HC_SYNC_LINE_INDEX_OFFSET(hc_sb_info->hc_index_value,func), 0, BAR_CSTRORM_INTMEM);
98d14abf15SRobert Mustacchi         LM_INTMEM_READ16(pdev, CSTORM_SP_HC_SYNC_LINE_INDEX_OFFSET(hc_sb_info->hc_index_value,func),  &rd_val, BAR_CSTRORM_INTMEM);
99d14abf15SRobert Mustacchi         DbgBreakIfAll(rd_val != 0);
100d14abf15SRobert Mustacchi 
101d14abf15SRobert Mustacchi         LM_INTMEM_WRITE16(pdev, (CSTORM_SP_STATUS_BLOCK_OFFSET(func) + OFFSETOF(struct hc_sp_status_block, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), 0, BAR_CSTRORM_INTMEM);
102d14abf15SRobert Mustacchi         LM_INTMEM_READ16 (pdev, (CSTORM_SP_STATUS_BLOCK_OFFSET(func) + OFFSETOF(struct hc_sp_status_block, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), &rd_val, BAR_CSTRORM_INTMEM);
103d14abf15SRobert Mustacchi         DbgBreakIfAll(rd_val != 0);
104d14abf15SRobert Mustacchi         break;
105d14abf15SRobert Mustacchi     case STATUS_BLOCK_NORMAL_SL_TYPE:
106d14abf15SRobert Mustacchi         if (!LM_SB_ID_VALID(pdev, sb_id))
107d14abf15SRobert Mustacchi         {
108d14abf15SRobert Mustacchi             return LM_STATUS_INVALID_PARAMETER;
109d14abf15SRobert Mustacchi         }
110d14abf15SRobert Mustacchi         LM_INTMEM_WRITE32(PFDEV(pdev), CSTORM_HC_SYNC_LINE_DHC_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), 0, BAR_CSTRORM_INTMEM);
111d14abf15SRobert Mustacchi         LM_INTMEM_READ32(PFDEV(pdev), CSTORM_HC_SYNC_LINE_DHC_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), &rd_val_32, BAR_CSTRORM_INTMEM);
112d14abf15SRobert Mustacchi         DbgBreakIfAll(rd_val_32 != 0);
113*6680ee99SToomas Soome         /* FALLTHROUGH */
114d14abf15SRobert Mustacchi     case STATUS_BLOCK_NORMAL_TYPE:
115d14abf15SRobert Mustacchi         if (CHIP_IS_E1x(PFDEV(pdev))) {
116d14abf15SRobert Mustacchi             LM_INTMEM_WRITE16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), 0, BAR_CSTRORM_INTMEM);
117d14abf15SRobert Mustacchi             LM_INTMEM_READ16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), &rd_val, BAR_CSTRORM_INTMEM);
118d14abf15SRobert Mustacchi         } else {
119d14abf15SRobert Mustacchi             LM_INTMEM_WRITE16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), 0, BAR_CSTRORM_INTMEM);
120d14abf15SRobert Mustacchi             LM_INTMEM_READ16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), &rd_val, BAR_CSTRORM_INTMEM);
121d14abf15SRobert Mustacchi         }
122d14abf15SRobert Mustacchi         DbgBreakIfAll(rd_val != 0);
123d14abf15SRobert Mustacchi         if (CHIP_IS_E1x(pdev)) {
124d14abf15SRobert Mustacchi             LM_INTMEM_WRITE16(PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e1x, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), 0, BAR_CSTRORM_INTMEM);
125d14abf15SRobert Mustacchi             LM_INTMEM_READ16 (PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e1x, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), &rd_val, BAR_CSTRORM_INTMEM);
126d14abf15SRobert Mustacchi         } else {
127d14abf15SRobert Mustacchi             LM_INTMEM_WRITE16(PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e2, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), 0, BAR_CSTRORM_INTMEM);
128d14abf15SRobert Mustacchi             LM_INTMEM_READ16 (PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e2, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), &rd_val, BAR_CSTRORM_INTMEM);
129d14abf15SRobert Mustacchi 
130d14abf15SRobert Mustacchi         }
131d14abf15SRobert Mustacchi         break;
132d14abf15SRobert Mustacchi     default:
133d14abf15SRobert Mustacchi         DbgMessage(NULL, FATAL, "Invalid hc_sb value: 0x%x.\n", hc_sb_info->hc_sb);
134d14abf15SRobert Mustacchi         DbgBreakIf(1);
135d14abf15SRobert Mustacchi     }
136d14abf15SRobert Mustacchi     /* We read from the same memory and verify that it's 0 to make sure that the value was written to the grc and was not delayed in the pci */
137d14abf15SRobert Mustacchi     DbgBreakIfAll(rd_val != 0);
138d14abf15SRobert Mustacchi 
139d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
140d14abf15SRobert Mustacchi }
141d14abf15SRobert Mustacchi 
142d14abf15SRobert Mustacchi /*
143d14abf15SRobert Mustacchi  * reset txq, rxq, rcq counters for L2 client connection
144d14abf15SRobert Mustacchi  *
145d14abf15SRobert Mustacchi  * assumption: the cid equals the chain idx
146d14abf15SRobert Mustacchi  */
147d14abf15SRobert Mustacchi /**
148d14abf15SRobert Mustacchi  * @Description:
149d14abf15SRobert Mustacchi  *   allocate given num of coalesce buffers, and queue them in the txq chain.
150d14abf15SRobert Mustacchi  *   1 buffer is allocated for LSO packets, and the rest are allocated with
151d14abf15SRobert Mustacchi  *   MTU size.
152d14abf15SRobert Mustacchi  * @Return:
153d14abf15SRobert Mustacchi  *   lm_status
154d14abf15SRobert Mustacchi */
155d14abf15SRobert Mustacchi static lm_status_t
lm_allocate_coalesce_buffers(lm_device_t * pdev,lm_tx_chain_t * txq,u32_t coalesce_buf_cnt,u32_t cid)156d14abf15SRobert Mustacchi lm_allocate_coalesce_buffers(
157d14abf15SRobert Mustacchi     lm_device_t     *pdev,
158d14abf15SRobert Mustacchi     lm_tx_chain_t   *txq,
159d14abf15SRobert Mustacchi     u32_t           coalesce_buf_cnt,
160d14abf15SRobert Mustacchi     u32_t           cid)
161d14abf15SRobert Mustacchi {
162d14abf15SRobert Mustacchi     lm_coalesce_buffer_t *last_coalesce_buf = NULL;
163d14abf15SRobert Mustacchi     lm_coalesce_buffer_t *coalesce_buf      = NULL;
164d14abf15SRobert Mustacchi     lm_address_t         mem_phy            = {{0}};
165d14abf15SRobert Mustacchi     u8_t *               mem_virt           = NULL;
166d14abf15SRobert Mustacchi     u32_t                mem_left           = 0;
167d14abf15SRobert Mustacchi     u32_t                mem_size           = 0;
168d14abf15SRobert Mustacchi     u32_t                buf_size           = 0;
169d14abf15SRobert Mustacchi     u32_t                cnt                = 0;
170d14abf15SRobert Mustacchi     u8_t                 mm_cli_idx         = 0;
171d14abf15SRobert Mustacchi 
172d14abf15SRobert Mustacchi     /* check arguments */
173d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) || CHK_NULL(txq))
174d14abf15SRobert Mustacchi     {
175d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
176d14abf15SRobert Mustacchi     }
177d14abf15SRobert Mustacchi 
178d14abf15SRobert Mustacchi     DbgMessage(pdev, VERBOSEi | VERBOSEl2sp,
179d14abf15SRobert Mustacchi                 "#lm_allocate_coalesce_buffers, coalesce_buf_cnt=%d\n",
180d14abf15SRobert Mustacchi                 coalesce_buf_cnt);
181d14abf15SRobert Mustacchi 
182d14abf15SRobert Mustacchi     mm_cli_idx = cid_to_resource(pdev, cid); //!!DP mm_cli_idx_to_um_idx(LM_CHAIN_IDX_CLI(pdev, idx));
183d14abf15SRobert Mustacchi 
184d14abf15SRobert Mustacchi     if(coalesce_buf_cnt == 0)
185d14abf15SRobert Mustacchi     {
186d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
187d14abf15SRobert Mustacchi     }
188d14abf15SRobert Mustacchi 
189d14abf15SRobert Mustacchi     buf_size = MAX_L2_CLI_BUFFER_SIZE(pdev, cid);
190d14abf15SRobert Mustacchi 
191d14abf15SRobert Mustacchi     mem_size = coalesce_buf_cnt * sizeof(lm_coalesce_buffer_t);
192d14abf15SRobert Mustacchi     mem_virt = mm_alloc_mem(pdev,mem_size, mm_cli_idx);
193d14abf15SRobert Mustacchi     if(ERR_IF(!mem_virt))
194d14abf15SRobert Mustacchi     {
195d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
196d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
197d14abf15SRobert Mustacchi     }
198d14abf15SRobert Mustacchi     mm_memset(mem_virt, 0, mem_size);
199d14abf15SRobert Mustacchi 
200d14abf15SRobert Mustacchi     /* Create a list of frame buffer descriptors. */
201d14abf15SRobert Mustacchi     coalesce_buf = (lm_coalesce_buffer_t *) mem_virt;
202d14abf15SRobert Mustacchi     for(cnt = 0; cnt < coalesce_buf_cnt; cnt++)
203d14abf15SRobert Mustacchi     {
204d14abf15SRobert Mustacchi         coalesce_buf->frags.cnt = 1;
205d14abf15SRobert Mustacchi         coalesce_buf->frags.size = 0; /* not in use */
206d14abf15SRobert Mustacchi         coalesce_buf->buf_size = buf_size;
207d14abf15SRobert Mustacchi 
208d14abf15SRobert Mustacchi         s_list_push_tail(
209d14abf15SRobert Mustacchi             &txq->coalesce_buf_list,
210d14abf15SRobert Mustacchi             &coalesce_buf->link);
211d14abf15SRobert Mustacchi 
212d14abf15SRobert Mustacchi         coalesce_buf++;
213d14abf15SRobert Mustacchi     }
214d14abf15SRobert Mustacchi 
215d14abf15SRobert Mustacchi     /* Have at least one coalesce buffer large enough to copy
216d14abf15SRobert Mustacchi      * an LSO frame. */
217d14abf15SRobert Mustacchi     coalesce_buf = (lm_coalesce_buffer_t *) s_list_peek_head(
218d14abf15SRobert Mustacchi         &txq->coalesce_buf_list);
219d14abf15SRobert Mustacchi     coalesce_buf->buf_size = 0x10000; /* TBD: consider apply change here for GSO */
220d14abf15SRobert Mustacchi 
221d14abf15SRobert Mustacchi     /* Determine the total memory for the coalesce buffers. */
222d14abf15SRobert Mustacchi     mem_left = 0;
223d14abf15SRobert Mustacchi 
224d14abf15SRobert Mustacchi     coalesce_buf = (lm_coalesce_buffer_t *) s_list_peek_head(
225d14abf15SRobert Mustacchi         &txq->coalesce_buf_list);
226d14abf15SRobert Mustacchi     while(coalesce_buf)
227d14abf15SRobert Mustacchi     {
228d14abf15SRobert Mustacchi         mem_left += coalesce_buf->buf_size;
229d14abf15SRobert Mustacchi         coalesce_buf = (lm_coalesce_buffer_t *) s_list_next_entry(
230d14abf15SRobert Mustacchi             &coalesce_buf->link);
231d14abf15SRobert Mustacchi     }
232d14abf15SRobert Mustacchi 
233d14abf15SRobert Mustacchi     mem_size = 0;
234d14abf15SRobert Mustacchi 
235d14abf15SRobert Mustacchi     /* Initialize all the descriptors to point to a buffer. */
236d14abf15SRobert Mustacchi     coalesce_buf = (lm_coalesce_buffer_t *) s_list_peek_head(
237d14abf15SRobert Mustacchi         &txq->coalesce_buf_list);
238d14abf15SRobert Mustacchi     while(coalesce_buf)
239d14abf15SRobert Mustacchi     {
240d14abf15SRobert Mustacchi         #define MAX_CONTIGUOUS_BLOCK            (64*1024)
241d14abf15SRobert Mustacchi 
242d14abf15SRobert Mustacchi         /* Allocate a small block of memory at a time. */
243d14abf15SRobert Mustacchi         if(mem_size == 0)
244d14abf15SRobert Mustacchi         {
245d14abf15SRobert Mustacchi             last_coalesce_buf = coalesce_buf;
246d14abf15SRobert Mustacchi 
247d14abf15SRobert Mustacchi             while(coalesce_buf)
248d14abf15SRobert Mustacchi             {
249d14abf15SRobert Mustacchi                 mem_size += coalesce_buf->buf_size;
250d14abf15SRobert Mustacchi                 if(mem_size >= MAX_CONTIGUOUS_BLOCK) /* TBD: consider apply change here for GSO */
251d14abf15SRobert Mustacchi                 {
252d14abf15SRobert Mustacchi                     break;
253d14abf15SRobert Mustacchi                 }
254d14abf15SRobert Mustacchi 
255d14abf15SRobert Mustacchi                 coalesce_buf = (lm_coalesce_buffer_t *) s_list_next_entry(
256d14abf15SRobert Mustacchi                     &coalesce_buf->link);
257d14abf15SRobert Mustacchi             }
258d14abf15SRobert Mustacchi 
259d14abf15SRobert Mustacchi             mem_left -= mem_size;
260d14abf15SRobert Mustacchi 
261d14abf15SRobert Mustacchi             mem_virt = mm_alloc_phys_mem( pdev, mem_size, &mem_phy, 0, mm_cli_idx);
262d14abf15SRobert Mustacchi             if(ERR_IF(!mem_virt))
263d14abf15SRobert Mustacchi             {
264d14abf15SRobert Mustacchi                 DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
265d14abf15SRobert Mustacchi                 return LM_STATUS_RESOURCE;
266d14abf15SRobert Mustacchi             }
267d14abf15SRobert Mustacchi             mm_memset(mem_virt, 0, mem_size);
268d14abf15SRobert Mustacchi 
269d14abf15SRobert Mustacchi             coalesce_buf = last_coalesce_buf;
270d14abf15SRobert Mustacchi         }
271d14abf15SRobert Mustacchi 
272d14abf15SRobert Mustacchi         coalesce_buf->mem_virt = mem_virt;
273d14abf15SRobert Mustacchi         coalesce_buf->frags.frag_arr[0].addr = mem_phy;
274d14abf15SRobert Mustacchi         coalesce_buf->frags.frag_arr[0].size = 0; /* to be set later according to actual packet size */
275d14abf15SRobert Mustacchi         mem_size -= coalesce_buf->buf_size;
276d14abf15SRobert Mustacchi 
277d14abf15SRobert Mustacchi         /* Go to the next packet buffer. */
278d14abf15SRobert Mustacchi         mem_virt += coalesce_buf->buf_size;
279d14abf15SRobert Mustacchi         LM_INC64(&mem_phy, coalesce_buf->buf_size);
280d14abf15SRobert Mustacchi 
281d14abf15SRobert Mustacchi         coalesce_buf = (lm_coalesce_buffer_t *) s_list_next_entry(
282d14abf15SRobert Mustacchi             &coalesce_buf->link);
283d14abf15SRobert Mustacchi     }
284d14abf15SRobert Mustacchi 
285d14abf15SRobert Mustacchi     if(mem_left || mem_size)
286d14abf15SRobert Mustacchi     {
287d14abf15SRobert Mustacchi         DbgBreakMsg("Memory allocation out of sync\n");
288d14abf15SRobert Mustacchi 
289d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
290d14abf15SRobert Mustacchi     }
291d14abf15SRobert Mustacchi 
292d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
293d14abf15SRobert Mustacchi } /* lm_allocate_coalesce_buffers */
294d14abf15SRobert Mustacchi 
295d14abf15SRobert Mustacchi lm_status_t
lm_alloc_txq(IN struct _lm_device_t * pdev,IN u32_t const cid,IN u16_t const page_cnt,IN u16_t const coalesce_buf_cnt)296d14abf15SRobert Mustacchi lm_alloc_txq(
297d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
298d14abf15SRobert Mustacchi     IN u32_t const          cid, /* chain id */
299d14abf15SRobert Mustacchi     IN u16_t const          page_cnt,
300d14abf15SRobert Mustacchi     IN u16_t const          coalesce_buf_cnt)
301d14abf15SRobert Mustacchi {
302d14abf15SRobert Mustacchi     lm_tx_chain_t *tx_chain   = NULL  ;
303d14abf15SRobert Mustacchi     u32_t const    mem_size   = page_cnt * LM_PAGE_SIZE;
304d14abf15SRobert Mustacchi     u8_t  mm_cli_idx      = 0 ;
305d14abf15SRobert Mustacchi 
306d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi | INFORMl2sp, "#lm_alloc_txq, cid=%d, page_cnt=%d\n", cid, page_cnt);
307d14abf15SRobert Mustacchi 
308d14abf15SRobert Mustacchi     /* check arguments */
309d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
310d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->tx_info.chain) <= cid) || !page_cnt))
311d14abf15SRobert Mustacchi     {
312d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
313d14abf15SRobert Mustacchi     }
314d14abf15SRobert Mustacchi 
315d14abf15SRobert Mustacchi     tx_chain = &LM_TXQ(pdev, cid);
316d14abf15SRobert Mustacchi 
317d14abf15SRobert Mustacchi     mm_cli_idx = cid_to_resource(pdev, cid);
318d14abf15SRobert Mustacchi 
319d14abf15SRobert Mustacchi     /* alloc the chain */
320d14abf15SRobert Mustacchi 
321d14abf15SRobert Mustacchi     tx_chain->bd_chain.bd_chain_virt =
322d14abf15SRobert Mustacchi         mm_alloc_phys_mem( pdev, mem_size, &tx_chain->bd_chain.bd_chain_phy, 0, mm_cli_idx);
323d14abf15SRobert Mustacchi     if(ERR_IF(!tx_chain->bd_chain.bd_chain_virt))
324d14abf15SRobert Mustacchi     {
325d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
326d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
327d14abf15SRobert Mustacchi     }
328d14abf15SRobert Mustacchi     mm_mem_zero(tx_chain->bd_chain.bd_chain_virt, mem_size);
329d14abf15SRobert Mustacchi 
330d14abf15SRobert Mustacchi     tx_chain->bd_chain.page_cnt = page_cnt;
331d14abf15SRobert Mustacchi 
332d14abf15SRobert Mustacchi     s_list_init(&tx_chain->active_descq, NULL, NULL, 0);
333d14abf15SRobert Mustacchi     s_list_init(&tx_chain->coalesce_buf_list, NULL, NULL, 0);
334d14abf15SRobert Mustacchi     tx_chain->idx              = cid;
335d14abf15SRobert Mustacchi     tx_chain->coalesce_buf_cnt = coalesce_buf_cnt;
336d14abf15SRobert Mustacchi 
337d14abf15SRobert Mustacchi     return lm_allocate_coalesce_buffers(
338d14abf15SRobert Mustacchi         pdev,
339d14abf15SRobert Mustacchi         &LM_TXQ(pdev, cid),
340d14abf15SRobert Mustacchi         coalesce_buf_cnt,
341d14abf15SRobert Mustacchi         cid);
342d14abf15SRobert Mustacchi 
343d14abf15SRobert Mustacchi } /* lm_alloc_txq */
344d14abf15SRobert Mustacchi 
345d14abf15SRobert Mustacchi lm_status_t
lm_alloc_rxq(IN struct _lm_device_t * pdev,IN u32_t const cid,IN u16_t const page_cnt,IN u32_t const desc_cnt)346d14abf15SRobert Mustacchi lm_alloc_rxq(
347d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
348d14abf15SRobert Mustacchi     IN u32_t const          cid,
349d14abf15SRobert Mustacchi     IN u16_t const          page_cnt,
350d14abf15SRobert Mustacchi     IN u32_t const          desc_cnt)
351d14abf15SRobert Mustacchi {
352d14abf15SRobert Mustacchi     lm_rx_chain_t*     rxq_chain        = NULL;
353d14abf15SRobert Mustacchi     lm_bd_chain_t *    bd_chain         = NULL;
354d14abf15SRobert Mustacchi     lm_rxq_chain_idx_t rx_chain_idx_max = LM_RXQ_CHAIN_IDX_MAX;
355d14abf15SRobert Mustacchi     lm_rxq_chain_idx_t rx_chain_idx_cur = 0;
356d14abf15SRobert Mustacchi     u32_t const        mem_size         = page_cnt * LM_PAGE_SIZE;
357d14abf15SRobert Mustacchi     u8_t               mm_cli_idx       = 0 ;
358d14abf15SRobert Mustacchi 
359d14abf15SRobert Mustacchi     /* check arguments */
360d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
361d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid) || !page_cnt))
362d14abf15SRobert Mustacchi     {
363d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
364d14abf15SRobert Mustacchi     }
365d14abf15SRobert Mustacchi 
366d14abf15SRobert Mustacchi     rxq_chain = &LM_RXQ(pdev, cid);
367d14abf15SRobert Mustacchi 
368d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "#lm_alloc_rxq, cid=%d, page_cnt=%d, desc_cnt=%d\n",
369d14abf15SRobert Mustacchi                 cid, page_cnt, desc_cnt);
370d14abf15SRobert Mustacchi 
371d14abf15SRobert Mustacchi     mm_cli_idx = cid_to_resource(pdev, cid);//!!DP mm_cli_idx_to_um_idx(LM_CHAIN_IDX_CLI(pdev, idx));
372d14abf15SRobert Mustacchi 
373d14abf15SRobert Mustacchi     s_list_init(&rxq_chain->common.free_descq, NULL, NULL, 0);
374d14abf15SRobert Mustacchi     s_list_init(&rxq_chain->active_descq, NULL, NULL, 0);
375d14abf15SRobert Mustacchi     rxq_chain->idx      = cid;
376d14abf15SRobert Mustacchi     rxq_chain->common.desc_cnt = desc_cnt;
377d14abf15SRobert Mustacchi 
378d14abf15SRobert Mustacchi     /* alloc the chain(s) */
379d14abf15SRobert Mustacchi     rx_chain_idx_max = LM_RXQ_IS_CHAIN_SGE_VALID( pdev, cid ) ? LM_RXQ_CHAIN_IDX_SGE : LM_RXQ_CHAIN_IDX_BD;
380d14abf15SRobert Mustacchi 
381d14abf15SRobert Mustacchi     for( rx_chain_idx_cur = 0; rx_chain_idx_cur <= rx_chain_idx_max; rx_chain_idx_cur++ )
382d14abf15SRobert Mustacchi     {
383d14abf15SRobert Mustacchi         bd_chain = &LM_RXQ_CHAIN( pdev, cid, rx_chain_idx_cur );
384d14abf15SRobert Mustacchi 
385d14abf15SRobert Mustacchi         bd_chain->bd_chain_virt =  mm_alloc_phys_mem( pdev, mem_size, &bd_chain->bd_chain_phy, 0, mm_cli_idx);
386d14abf15SRobert Mustacchi         if(ERR_IF(!bd_chain->bd_chain_virt))
387d14abf15SRobert Mustacchi         {
388d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
389d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
390d14abf15SRobert Mustacchi         }
391d14abf15SRobert Mustacchi         mm_mem_zero(bd_chain->bd_chain_virt, mem_size);
392d14abf15SRobert Mustacchi 
393d14abf15SRobert Mustacchi         bd_chain->page_cnt = page_cnt;
394d14abf15SRobert Mustacchi     }
395d14abf15SRobert Mustacchi 
396d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
397d14abf15SRobert Mustacchi } /* lm_alloc_rxq */
398d14abf15SRobert Mustacchi 
399d14abf15SRobert Mustacchi lm_status_t
lm_alloc_rcq(IN struct _lm_device_t * pdev,IN u32_t const cid,IN u16_t const page_cnt)400d14abf15SRobert Mustacchi lm_alloc_rcq(
401d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
402d14abf15SRobert Mustacchi     IN u32_t const          cid,
403d14abf15SRobert Mustacchi     IN u16_t const          page_cnt)
404d14abf15SRobert Mustacchi {
405d14abf15SRobert Mustacchi     lm_rcq_chain_t *rcq_chain = NULL;
406d14abf15SRobert Mustacchi     u32_t const mem_size      = page_cnt * LM_PAGE_SIZE;
407d14abf15SRobert Mustacchi     u8_t  mm_cli_idx      = 0 ;
408d14abf15SRobert Mustacchi 
409d14abf15SRobert Mustacchi     /* check arguments */
410d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
411d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->rx_info.rcq_chain) <= cid) || !page_cnt))
412d14abf15SRobert Mustacchi     {
413d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
414d14abf15SRobert Mustacchi     }
415d14abf15SRobert Mustacchi 
416d14abf15SRobert Mustacchi     ASSERT_STATIC(sizeof(struct eth_rx_bd)*LM_RX_BD_CQ_SIZE_RATIO == sizeof(union eth_rx_cqe));
417d14abf15SRobert Mustacchi     ASSERT_STATIC(sizeof(struct eth_rx_bd) == sizeof(struct eth_rx_sge) );
418d14abf15SRobert Mustacchi 
419d14abf15SRobert Mustacchi     rcq_chain = &pdev->rx_info.rcq_chain[cid];
420d14abf15SRobert Mustacchi 
421d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi | INFORMl2sp,
422d14abf15SRobert Mustacchi                 "#lm_alloc_rcq, idx=%d, page_cnt=%d\n",
423d14abf15SRobert Mustacchi                 cid, page_cnt);
424d14abf15SRobert Mustacchi 
425d14abf15SRobert Mustacchi     mm_cli_idx = cid_to_resource(pdev, cid);//!!DP mm_cli_idx_to_um_idx(LM_CHAIN_IDX_CLI(pdev, idx));
426d14abf15SRobert Mustacchi 
427d14abf15SRobert Mustacchi     /* alloc the chain */
428d14abf15SRobert Mustacchi     rcq_chain->bd_chain.bd_chain_virt =
429d14abf15SRobert Mustacchi         mm_alloc_phys_mem( pdev, mem_size, &rcq_chain->bd_chain.bd_chain_phy, 0, mm_cli_idx);
430d14abf15SRobert Mustacchi 
431d14abf15SRobert Mustacchi     if(ERR_IF(!rcq_chain->bd_chain.bd_chain_virt))
432d14abf15SRobert Mustacchi     {
433d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
434d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
435d14abf15SRobert Mustacchi     }
436d14abf15SRobert Mustacchi 
437d14abf15SRobert Mustacchi     mm_mem_zero(rcq_chain->bd_chain.bd_chain_virt, mem_size);
438d14abf15SRobert Mustacchi     rcq_chain->bd_chain.page_cnt = page_cnt;
439d14abf15SRobert Mustacchi 
440d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
441d14abf15SRobert Mustacchi } /* lm_alloc_rcq */
442d14abf15SRobert Mustacchi 
443d14abf15SRobert Mustacchi /**
444d14abf15SRobert Mustacchi  * @description
445d14abf15SRobert Mustacchi  * Allocte TPA chain
446d14abf15SRobert Mustacchi  * @param pdev
447d14abf15SRobert Mustacchi  * @param cid -chain index.
448d14abf15SRobert Mustacchi  * @param page_cnt - Number of BD pages
449d14abf15SRobert Mustacchi  * @param desc_cnt - Number of descriptor counts
450d14abf15SRobert Mustacchi  * @param bds_per_page - Number of BDs per page.
451d14abf15SRobert Mustacchi  *
452d14abf15SRobert Mustacchi  * @return lm_status_t
453d14abf15SRobert Mustacchi  */
454d14abf15SRobert Mustacchi lm_status_t
lm_alloc_tpa_chain(IN struct _lm_device_t * pdev,IN u32_t const cid,IN u16_t const page_cnt,IN u32_t const desc_cnt,IN u32_t const bds_per_page)455d14abf15SRobert Mustacchi lm_alloc_tpa_chain(
456d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
457d14abf15SRobert Mustacchi     IN u32_t const          cid,
458d14abf15SRobert Mustacchi     IN u16_t const          page_cnt,
459d14abf15SRobert Mustacchi     IN u32_t const          desc_cnt,
460d14abf15SRobert Mustacchi     IN u32_t const          bds_per_page)
461d14abf15SRobert Mustacchi {
462d14abf15SRobert Mustacchi     lm_tpa_chain_t*     tpa_chain   = NULL;
463d14abf15SRobert Mustacchi     lm_bd_chain_t *     bd_chain    = NULL;
464d14abf15SRobert Mustacchi     lm_tpa_sge_chain_t*    sge_chain   = NULL;
465d14abf15SRobert Mustacchi     u32_t               mem_size    = 0;
466d14abf15SRobert Mustacchi     u8_t                mm_cli_idx  = 0 ;
467d14abf15SRobert Mustacchi 
468d14abf15SRobert Mustacchi     /* check arguments */
469d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
470d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid) || !page_cnt))
471d14abf15SRobert Mustacchi     {
472d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
473d14abf15SRobert Mustacchi     }
474d14abf15SRobert Mustacchi 
475d14abf15SRobert Mustacchi     tpa_chain = &LM_TPA(pdev, cid);
476d14abf15SRobert Mustacchi     bd_chain  = &LM_TPA_CHAIN_BD( pdev, cid );
477d14abf15SRobert Mustacchi     sge_chain = &LM_SGE_TPA_CHAIN( pdev, cid );
478d14abf15SRobert Mustacchi 
479d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "#lm_alloc_tpa, cid=%d, page_cnt=%d, desc_cnt=%d\n",
480d14abf15SRobert Mustacchi                 cid, page_cnt, desc_cnt);
481d14abf15SRobert Mustacchi 
482d14abf15SRobert Mustacchi     mm_cli_idx = cid_to_resource(pdev, cid);
483d14abf15SRobert Mustacchi 
484d14abf15SRobert Mustacchi     s_list_init(&tpa_chain->common.free_descq, NULL, NULL, 0);
485d14abf15SRobert Mustacchi     tpa_chain->common.desc_cnt = desc_cnt;
486d14abf15SRobert Mustacchi 
487d14abf15SRobert Mustacchi     /************ Alocate BD chain********************************/
488d14abf15SRobert Mustacchi     mem_size    = page_cnt * LM_PAGE_SIZE;
489d14abf15SRobert Mustacchi     bd_chain->bd_chain_virt =  mm_alloc_phys_mem( pdev, mem_size, &bd_chain->bd_chain_phy, 0, mm_cli_idx);
490d14abf15SRobert Mustacchi     if(ERR_IF(!bd_chain->bd_chain_virt))
491d14abf15SRobert Mustacchi     {
492d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
493d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
494d14abf15SRobert Mustacchi     }
495d14abf15SRobert Mustacchi     mm_mem_zero(bd_chain->bd_chain_virt, mem_size);
496d14abf15SRobert Mustacchi     bd_chain->page_cnt = page_cnt;
497d14abf15SRobert Mustacchi 
498d14abf15SRobert Mustacchi     // The number of SGE bd entries
499d14abf15SRobert Mustacchi     sge_chain->size = page_cnt * bds_per_page;
500d14abf15SRobert Mustacchi     tpa_chain->state = lm_tpa_state_disable;
501d14abf15SRobert Mustacchi 
502d14abf15SRobert Mustacchi     /************ Alocate active descriptor array********************************/
503d14abf15SRobert Mustacchi     mem_size = LM_TPA_ACTIVE_DESCQ_ARRAY_ELEM(pdev,cid);
504d14abf15SRobert Mustacchi     mem_size *= sizeof(lm_packet_t *);
505d14abf15SRobert Mustacchi     sge_chain->active_descq_array = mm_alloc_mem(pdev, mem_size, mm_cli_idx);
506d14abf15SRobert Mustacchi 
507d14abf15SRobert Mustacchi     if(CHK_NULL(sge_chain->active_descq_array))
508d14abf15SRobert Mustacchi     {
509d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
510d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
511d14abf15SRobert Mustacchi     }
512d14abf15SRobert Mustacchi     mm_mem_zero(sge_chain->active_descq_array, mem_size);
513d14abf15SRobert Mustacchi 
514d14abf15SRobert Mustacchi     /************ Alocate mask_array descriptor array********************************/
515d14abf15SRobert Mustacchi     ASSERT_STATIC(0 != BIT_VEC64_ELEM_SZ); //LM_TPA_MASK_LEN - divide by BIT_VEC64_ELEM_SZ
516d14abf15SRobert Mustacchi     mem_size = LM_TPA_MASK_LEN(pdev, cid);
517d14abf15SRobert Mustacchi     mem_size = mem_size * sizeof(u64_t);
518d14abf15SRobert Mustacchi     sge_chain->mask_array = mm_alloc_mem(pdev, mem_size, mm_cli_idx);
519d14abf15SRobert Mustacchi 
520d14abf15SRobert Mustacchi     if(CHK_NULL(sge_chain->mask_array))
521d14abf15SRobert Mustacchi     {
522d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
523d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
524d14abf15SRobert Mustacchi     }
525d14abf15SRobert Mustacchi     mm_mem_zero(sge_chain->mask_array, mem_size);
526d14abf15SRobert Mustacchi 
527d14abf15SRobert Mustacchi     /************ Alocate TPA ramrod data********************************/
528d14abf15SRobert Mustacchi     mem_size = sizeof(struct tpa_update_ramrod_data);
529d14abf15SRobert Mustacchi     tpa_chain->ramrod_data_virt = mm_alloc_phys_mem(pdev, mem_size, &tpa_chain->ramrod_data_phys, 0, mm_cli_idx);
530d14abf15SRobert Mustacchi 
531d14abf15SRobert Mustacchi     if(CHK_NULL(tpa_chain->ramrod_data_virt))
532d14abf15SRobert Mustacchi     {
533d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
534d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
535d14abf15SRobert Mustacchi     }
536d14abf15SRobert Mustacchi     mm_mem_zero(tpa_chain->ramrod_data_virt, mem_size);
537d14abf15SRobert Mustacchi 
538d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
539d14abf15SRobert Mustacchi } /* lm_alloc_tpa */
540d14abf15SRobert Mustacchi 
cid_to_resource(lm_device_t * pdev,u32_t cid)541d14abf15SRobert Mustacchi lm_resource_idx_t cid_to_resource(lm_device_t *pdev, u32_t cid)
542d14abf15SRobert Mustacchi {
543d14abf15SRobert Mustacchi     lm_resource_idx_t resource;
544d14abf15SRobert Mustacchi 
545d14abf15SRobert Mustacchi     if (lm_chain_type_not_cos != lm_mp_get_chain_type(pdev, cid))
546d14abf15SRobert Mustacchi     {
547d14abf15SRobert Mustacchi         resource = LM_RESOURCE_NDIS;
548d14abf15SRobert Mustacchi     }
549d14abf15SRobert Mustacchi     else if (cid == ISCSI_CID(pdev))
550d14abf15SRobert Mustacchi     {
551d14abf15SRobert Mustacchi         resource = LM_RESOURCE_ISCSI;
552d14abf15SRobert Mustacchi     }
553d14abf15SRobert Mustacchi     else if (cid == FCOE_CID(pdev))
554d14abf15SRobert Mustacchi     {
555d14abf15SRobert Mustacchi         resource = LM_RESOURCE_FCOE;
556d14abf15SRobert Mustacchi     }
557d14abf15SRobert Mustacchi     else if (cid == FWD_CID(pdev))
558d14abf15SRobert Mustacchi     {
559d14abf15SRobert Mustacchi         resource = LM_RESOURCE_FWD;
560d14abf15SRobert Mustacchi     }
561d14abf15SRobert Mustacchi     else if (cid == OOO_CID(pdev))
562d14abf15SRobert Mustacchi     {
563d14abf15SRobert Mustacchi         resource = LM_RESOURCE_OOO;
564d14abf15SRobert Mustacchi     }
565d14abf15SRobert Mustacchi     else
566d14abf15SRobert Mustacchi     {
567d14abf15SRobert Mustacchi         resource = LM_RESOURCE_COMMON;
568d14abf15SRobert Mustacchi     }
569d14abf15SRobert Mustacchi 
570d14abf15SRobert Mustacchi     return resource;
571d14abf15SRobert Mustacchi }
572d14abf15SRobert Mustacchi 
573d14abf15SRobert Mustacchi 
574d14abf15SRobert Mustacchi lm_status_t
lm_setup_txq(IN struct _lm_device_t * pdev,IN u32_t cid)575d14abf15SRobert Mustacchi lm_setup_txq(
576d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
577d14abf15SRobert Mustacchi     IN u32_t                cid)
578d14abf15SRobert Mustacchi {
579d14abf15SRobert Mustacchi     lm_bd_chain_t *                         bd_chain = NULL;
580d14abf15SRobert Mustacchi     volatile struct hc_sp_status_block *    sp_sb = NULL;
581d14abf15SRobert Mustacchi     u16_t volatile *                        sb_indexes = NULL;
582d14abf15SRobert Mustacchi     u8_t                                    tx_sb_index_number =0;
583d14abf15SRobert Mustacchi     /* check arguments */
584d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
585d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->tx_info.chain) <= cid)))
586d14abf15SRobert Mustacchi     {
587d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
588d14abf15SRobert Mustacchi     }
589d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_txq, cid=%d\n",cid);
590d14abf15SRobert Mustacchi 
591d14abf15SRobert Mustacchi     sp_sb = lm_get_default_status_block(pdev);
592d14abf15SRobert Mustacchi 
593d14abf15SRobert Mustacchi     LM_TXQ(pdev, cid).prod_bseq = 0;
594d14abf15SRobert Mustacchi     LM_TXQ(pdev, cid).pkt_idx = 0;
595d14abf15SRobert Mustacchi     LM_TXQ(pdev, cid).coalesce_buf_used = 0;
596d14abf15SRobert Mustacchi     LM_TXQ(pdev, cid).lso_split_used = 0;
597d14abf15SRobert Mustacchi 
598d14abf15SRobert Mustacchi     bd_chain = &LM_TXQ(pdev, cid).bd_chain;
599d14abf15SRobert Mustacchi     lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy, bd_chain->page_cnt, sizeof(struct eth_tx_bd), /* is full? */0, TRUE);
600d14abf15SRobert Mustacchi 
601d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "txq %d, bd_chain %p, bd_left %d\n",
602d14abf15SRobert Mustacchi         cid,
603d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).bd_chain.next_bd,
604d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).bd_chain.bd_left);
605d14abf15SRobert Mustacchi 
606d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "   bd_chain_phy 0x%x%08x\n",
607d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).bd_chain.bd_chain_phy.as_u32.high,
608d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).bd_chain.bd_chain_phy.as_u32.low);
609d14abf15SRobert Mustacchi 
610d14abf15SRobert Mustacchi     mm_memset(&LM_TXQ(pdev, cid).eth_tx_prods.packets_prod, 0, sizeof(eth_tx_prod_t));
611d14abf15SRobert Mustacchi 
612d14abf15SRobert Mustacchi     if (cid == FWD_CID(pdev))
613d14abf15SRobert Mustacchi     {
614d14abf15SRobert Mustacchi         sp_sb->index_values[HC_SP_INDEX_ETH_FW_TX_CQ_CONS] = 0;
615d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hw_con_idx_ptr =
616d14abf15SRobert Mustacchi             &(sp_sb->index_values[HC_SP_INDEX_ETH_FW_TX_CQ_CONS]);
617d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE; // STATUS_BLOCK_SP_TYPE;
618d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_FW_TX_CQ_CONS;
619d14abf15SRobert Mustacchi         /* iro_dhc_offste not initialized on purpose --> not expected for FWD channel */
620d14abf15SRobert Mustacchi     }
621d14abf15SRobert Mustacchi     else if (cid == ISCSI_CID(pdev))
622d14abf15SRobert Mustacchi     {
623d14abf15SRobert Mustacchi         sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_CQ_CONS] = 0;
624d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hw_con_idx_ptr = &(sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_CQ_CONS]);
625d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE; //STATUS_BLOCK_SP_TYPE;
626d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_ISCSI_CQ_CONS;
627d14abf15SRobert Mustacchi         /* iro_dhc_offste not initialized on purpose --> not expected for FWD channel */
628d14abf15SRobert Mustacchi     }
629d14abf15SRobert Mustacchi     else if (cid == FCOE_CID(pdev))
630d14abf15SRobert Mustacchi     {
631d14abf15SRobert Mustacchi         sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_CQ_CONS] = 0;
632d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hw_con_idx_ptr =
633d14abf15SRobert Mustacchi             &(sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_CQ_CONS]);
634d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE; //STATUS_BLOCK_SP_TYPE;
635d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_FCOE_CQ_CONS;
636d14abf15SRobert Mustacchi         /* iro_dhc_offste not initialized on purpose --> not expected for FWD channel */
637d14abf15SRobert Mustacchi     }
638d14abf15SRobert Mustacchi     else if(cid == OOO_CID(pdev))
639d14abf15SRobert Mustacchi     {
640d14abf15SRobert Mustacchi         DbgBreakMsg("OOO doesn't have a txq");
641d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
642d14abf15SRobert Mustacchi     }
643d14abf15SRobert Mustacchi     else
644d14abf15SRobert Mustacchi     {
645d14abf15SRobert Mustacchi         u32_t sb_id = RSS_ID_TO_SB_ID(CHAIN_TO_RSS_ID(pdev,cid));
646d14abf15SRobert Mustacchi         const u8_t byte_counter_id = CHIP_IS_E1x(pdev)? LM_FW_SB_ID(pdev, sb_id) : LM_FW_DHC_QZONE_ID(pdev, sb_id);
647d14abf15SRobert Mustacchi 
648d14abf15SRobert Mustacchi         // Assign the TX chain consumer pointer to the consumer index in the status block. TBD: rename HC_INDEX_C_ETH_TX_CQ_CONS as its inappropriate
649d14abf15SRobert Mustacchi         if( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) )
650d14abf15SRobert Mustacchi         {
651d14abf15SRobert Mustacchi             DbgBreakIf( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) ) ;
652d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE ;
653d14abf15SRobert Mustacchi         }
654d14abf15SRobert Mustacchi 
655d14abf15SRobert Mustacchi         sb_indexes = lm_get_sb_indexes(pdev, (u8_t)sb_id);
656d14abf15SRobert Mustacchi         // This isn't realy cid it is the chain index
657d14abf15SRobert Mustacchi         tx_sb_index_number =
658d14abf15SRobert Mustacchi             lm_eth_tx_hc_cq_cons_cosx_from_chain(pdev, cid);
659d14abf15SRobert Mustacchi 
660d14abf15SRobert Mustacchi         sb_indexes[tx_sb_index_number] = 0;
661d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hw_con_idx_ptr = sb_indexes + tx_sb_index_number;
662d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_TYPE;
663d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = tx_sb_index_number;
664d14abf15SRobert Mustacchi         if (IS_PFDEV(pdev))
665d14abf15SRobert Mustacchi         {
666d14abf15SRobert Mustacchi             LM_TXQ(pdev, cid).hc_sb_info.iro_dhc_offset = CSTORM_BYTE_COUNTER_OFFSET(byte_counter_id, tx_sb_index_number);
667d14abf15SRobert Mustacchi         }
668d14abf15SRobert Mustacchi         else
669d14abf15SRobert Mustacchi         {
670d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "Dhc not implemented for VF yet\n");
671d14abf15SRobert Mustacchi         }
672d14abf15SRobert Mustacchi     }
673d14abf15SRobert Mustacchi 
674d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
675d14abf15SRobert Mustacchi } /* lm_setup_txq */
676d14abf15SRobert Mustacchi 
lm_setup_rxq(IN struct _lm_device_t * pdev,IN u32_t const cid)677d14abf15SRobert Mustacchi lm_status_t lm_setup_rxq( IN struct _lm_device_t *pdev,
678d14abf15SRobert Mustacchi                           IN u32_t const          cid)
679d14abf15SRobert Mustacchi {
680d14abf15SRobert Mustacchi     lm_bd_chain_t * bd_chain = NULL;
681d14abf15SRobert Mustacchi     lm_rx_chain_t *    rxq_chain                             = NULL;
682d14abf15SRobert Mustacchi     lm_rxq_chain_idx_t rx_chain_idx_max                      = LM_RXQ_CHAIN_IDX_MAX;
683d14abf15SRobert Mustacchi     lm_rxq_chain_idx_t rx_chain_idx_cur                      = 0;
684d14abf15SRobert Mustacchi     static u8_t const  eth_rx_size_arr[LM_RXQ_CHAIN_IDX_MAX] = {sizeof(struct eth_rx_bd), sizeof(struct eth_rx_sge)};
685d14abf15SRobert Mustacchi     u32_t              sb_id                                 = RSS_ID_TO_SB_ID(CHAIN_TO_RSS_ID(pdev,cid));
686d14abf15SRobert Mustacchi     const u8_t         byte_counter_id                       = CHIP_IS_E1x(pdev)? LM_FW_SB_ID(pdev, sb_id) : LM_FW_DHC_QZONE_ID(pdev, sb_id);
687d14abf15SRobert Mustacchi 
688d14abf15SRobert Mustacchi     /* check arguments */
689d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
690d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid)))
691d14abf15SRobert Mustacchi     {
692d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
693d14abf15SRobert Mustacchi     }
694d14abf15SRobert Mustacchi 
695d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_rxq, cid=%d\n",cid);
696d14abf15SRobert Mustacchi 
697d14abf15SRobert Mustacchi     rxq_chain = &LM_RXQ(pdev, cid);
698d14abf15SRobert Mustacchi 
699d14abf15SRobert Mustacchi     rxq_chain->common.prod_bseq                = 0;
700d14abf15SRobert Mustacchi     rxq_chain->ret_bytes                = 0;
701d14abf15SRobert Mustacchi     rxq_chain->ret_bytes_last_fw_update = 0;
702d14abf15SRobert Mustacchi     rxq_chain->common.bd_prod_without_next     = 0;
703d14abf15SRobert Mustacchi 
704d14abf15SRobert Mustacchi     rx_chain_idx_max = LM_RXQ_IS_CHAIN_SGE_VALID( pdev, cid ) ? LM_RXQ_CHAIN_IDX_SGE : LM_RXQ_CHAIN_IDX_BD;
705d14abf15SRobert Mustacchi 
706d14abf15SRobert Mustacchi     for( rx_chain_idx_cur = 0; rx_chain_idx_cur <= rx_chain_idx_max; rx_chain_idx_cur++ )
707d14abf15SRobert Mustacchi     {
708d14abf15SRobert Mustacchi         bd_chain = &LM_RXQ_CHAIN( pdev, cid, rx_chain_idx_cur );
709d14abf15SRobert Mustacchi 
710d14abf15SRobert Mustacchi         lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy,bd_chain->page_cnt, eth_rx_size_arr[rx_chain_idx_cur], /* is full? */0, TRUE);
711d14abf15SRobert Mustacchi 
712d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORMi, "rxq[%d] bd_chain[%d] %p, bd_left %d\n", cid,
713d14abf15SRobert Mustacchi                                                                             rx_chain_idx_cur,
714d14abf15SRobert Mustacchi                                                                             bd_chain->next_bd,
715d14abf15SRobert Mustacchi                                                                             bd_chain->bd_left);
716d14abf15SRobert Mustacchi 
717d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORMi, "   bd_chain_phy[%d] 0x%x%08x\n", rx_chain_idx_cur,
718d14abf15SRobert Mustacchi                                                                      bd_chain->bd_chain_phy.as_u32.high,
719d14abf15SRobert Mustacchi                                                                      bd_chain->bd_chain_phy.as_u32.low);
720d14abf15SRobert Mustacchi     }
721d14abf15SRobert Mustacchi 
722d14abf15SRobert Mustacchi     /* We initilize the hc_sb_info here for completeness. The fw updates are actually done by rcq-chain, but the dynamic-host-coalescing based on rx-chain */
723d14abf15SRobert Mustacchi     rxq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE;
724d14abf15SRobert Mustacchi     rxq_chain->hc_sb_info.hc_index_value = HC_INDEX_ETH_RX_CQ_CONS;
725d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev))
726d14abf15SRobert Mustacchi     {
727d14abf15SRobert Mustacchi         rxq_chain->hc_sb_info.iro_dhc_offset = CSTORM_BYTE_COUNTER_OFFSET(byte_counter_id, HC_INDEX_ETH_RX_CQ_CONS);
728d14abf15SRobert Mustacchi     }
729d14abf15SRobert Mustacchi     else
730d14abf15SRobert Mustacchi     {
731d14abf15SRobert Mustacchi         rxq_chain->hc_sb_info.iro_dhc_offset = sizeof(struct cstorm_queue_zone_data) * LM_FW_DHC_QZONE_ID(pdev, sb_id)
732d14abf15SRobert Mustacchi             + sizeof(u32_t) * HC_INDEX_ETH_RX_CQ_CONS;
733d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "Dhc offset is 0x%x for VF Q Zone %d\n",rxq_chain->hc_sb_info.iro_dhc_offset,LM_FW_DHC_QZONE_ID(pdev, sb_id));
734d14abf15SRobert Mustacchi     }
735d14abf15SRobert Mustacchi 
736d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
737d14abf15SRobert Mustacchi } /* lm_setup_rxq */
738d14abf15SRobert Mustacchi 
739d14abf15SRobert Mustacchi 
740d14abf15SRobert Mustacchi lm_status_t
lm_setup_rcq(IN struct _lm_device_t * pdev,IN u32_t const cid)741d14abf15SRobert Mustacchi lm_setup_rcq( IN struct _lm_device_t *pdev,
742d14abf15SRobert Mustacchi               IN u32_t  const         cid)
743d14abf15SRobert Mustacchi {
744d14abf15SRobert Mustacchi     lm_bd_chain_t *                      bd_chain   = NULL;
745d14abf15SRobert Mustacchi     lm_rcq_chain_t *                     rcq_chain  = NULL;
746d14abf15SRobert Mustacchi     lm_rx_chain_t *                      rxq_chain  = NULL;
747d14abf15SRobert Mustacchi     volatile struct hc_sp_status_block * sp_sb      = NULL;
748d14abf15SRobert Mustacchi     u16_t volatile *                     sb_indexes = NULL;
749d14abf15SRobert Mustacchi 
750d14abf15SRobert Mustacchi     /* check arguments */
751d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
752d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->rx_info.rcq_chain) <= cid)))
753d14abf15SRobert Mustacchi     {
754d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
755d14abf15SRobert Mustacchi     }
756d14abf15SRobert Mustacchi 
757d14abf15SRobert Mustacchi     rcq_chain = &LM_RCQ(pdev, cid);
758d14abf15SRobert Mustacchi     rxq_chain = &LM_RXQ(pdev, cid);
759d14abf15SRobert Mustacchi 
760d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_rcq, cid=%d\n",cid);
761d14abf15SRobert Mustacchi 
762d14abf15SRobert Mustacchi     sp_sb = lm_get_default_status_block(pdev);
763d14abf15SRobert Mustacchi 
764d14abf15SRobert Mustacchi     rcq_chain->prod_bseq = 0;
765d14abf15SRobert Mustacchi     if (CHIP_IS_E1x(pdev))
766d14abf15SRobert Mustacchi     {
767d14abf15SRobert Mustacchi         rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E1X_OFFSET(PORT_ID(pdev), LM_FW_CLI_ID(pdev, cid));
768d14abf15SRobert Mustacchi     }
769d14abf15SRobert Mustacchi     else
770d14abf15SRobert Mustacchi     {
771d14abf15SRobert Mustacchi         if (IS_VFDEV(pdev))
772d14abf15SRobert Mustacchi         {
773d14abf15SRobert Mustacchi             rcq_chain->iro_prod_offset = LM_FW_QZONE_ID(pdev, cid)*sizeof(struct ustorm_queue_zone_data);
774d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "iro_prod_offset for vf = %x...\n", rcq_chain->iro_prod_offset);
775d14abf15SRobert Mustacchi         }
776d14abf15SRobert Mustacchi     }
777d14abf15SRobert Mustacchi 
778d14abf15SRobert Mustacchi     //if(pdev->params.l2_rx_desc_cnt[0]) /* if removed. was not required */
779d14abf15SRobert Mustacchi     bd_chain = &rcq_chain->bd_chain;
780d14abf15SRobert Mustacchi 
781d14abf15SRobert Mustacchi     lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy,bd_chain->page_cnt, sizeof(union eth_rx_cqe), /* is full? */0, TRUE);
782d14abf15SRobert Mustacchi 
783d14abf15SRobert Mustacchi     //number of Bds left in the RCQ must be at least the same with its corresponding Rx chain.
784d14abf15SRobert Mustacchi     DbgBreakIf(lm_bd_chain_avail_bds(&rxq_chain->chain_arr[LM_RXQ_CHAIN_IDX_BD]) <= lm_bd_chain_avail_bds(&rcq_chain->bd_chain));
785d14abf15SRobert Mustacchi 
786d14abf15SRobert Mustacchi     if( LM_RXQ_IS_CHAIN_SGE_VALID(pdev, cid ) )
787d14abf15SRobert Mustacchi     {
788d14abf15SRobert Mustacchi         DbgBreakIf( !lm_bd_chains_are_consistent( &rxq_chain->chain_arr[LM_RXQ_CHAIN_IDX_BD], &rxq_chain->chain_arr[LM_RXQ_CHAIN_IDX_SGE]) );
789d14abf15SRobert Mustacchi     }
790d14abf15SRobert Mustacchi 
791d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "rcq %d, bd_chain %p, bd_left %d\n", cid,
792d14abf15SRobert Mustacchi                                                                     rcq_chain->bd_chain.next_bd,
793d14abf15SRobert Mustacchi                                                                     rcq_chain->bd_chain.bd_left);
794d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "   bd_chain_phy 0x%x%08x\n", rcq_chain->bd_chain.bd_chain_phy.as_u32.high,
795d14abf15SRobert Mustacchi                                                              rcq_chain->bd_chain.bd_chain_phy.as_u32.low);
796d14abf15SRobert Mustacchi 
797d14abf15SRobert Mustacchi     // Assign the RCQ chain consumer pointer to the consumer index in the status block.
798d14abf15SRobert Mustacchi     if (cid == ISCSI_CID(pdev))
799d14abf15SRobert Mustacchi     {
800d14abf15SRobert Mustacchi         if (CHIP_IS_E2E3(pdev)) {
801d14abf15SRobert Mustacchi             u8_t rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
802d14abf15SRobert Mustacchi             rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_AUX_QZONE_ID(pdev, rel_cid));
803d14abf15SRobert Mustacchi         }
804d14abf15SRobert Mustacchi         sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS] = 0;
805d14abf15SRobert Mustacchi         rcq_chain->hw_con_idx_ptr                             = &(sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS]);
806d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_sb                           = STATUS_BLOCK_SP_SL_TYPE;
807d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_index_value                  = HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS;
808d14abf15SRobert Mustacchi     }
809d14abf15SRobert Mustacchi     else if (cid == FCOE_CID(pdev))
810d14abf15SRobert Mustacchi     {
811d14abf15SRobert Mustacchi         if (CHIP_IS_E2E3(pdev)) {
812d14abf15SRobert Mustacchi             u8_t rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
813d14abf15SRobert Mustacchi             rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_AUX_QZONE_ID(pdev, rel_cid));
814d14abf15SRobert Mustacchi         }
815d14abf15SRobert Mustacchi         sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS] = 0;
816d14abf15SRobert Mustacchi         rcq_chain->hw_con_idx_ptr                             = &(sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS]);
817d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_sb                           = STATUS_BLOCK_SP_SL_TYPE;
818d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_index_value                  = HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS;
819d14abf15SRobert Mustacchi     }
820d14abf15SRobert Mustacchi     else if (cid == OOO_CID(pdev))
821d14abf15SRobert Mustacchi     {
822d14abf15SRobert Mustacchi         // Any SB that isn't RSS share the same SB.
823d14abf15SRobert Mustacchi         // basically we will want the ISCSI OOO to work on the same SB that ISCSI works.(This does happen see the line above)
824d14abf15SRobert Mustacchi         // Even if we want to count on ISCSI and make sure we will work on the same SB:
825d14abf15SRobert Mustacchi         // 1.There is no promise on the order the ISCSI nminiport will call
826d14abf15SRobert Mustacchi         // ISCSI_KWQE_OPCODE_INIT1 (lm_sc_init inits pdev->iscsi_info.l5_eq_base_chain_idx) or
827d14abf15SRobert Mustacchi         // 2.OOO is general code that doesn't depend on a protocol (ISCSI).
828d14abf15SRobert Mustacchi 
829d14abf15SRobert Mustacchi         //TODO_OOO Ask Michal regarding E2 if we need LM_FW_SB_ID
830d14abf15SRobert Mustacchi         if (CHIP_IS_E2E3(pdev)) {
831d14abf15SRobert Mustacchi             u8_t rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
832d14abf15SRobert Mustacchi             rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_AUX_QZONE_ID(pdev, rel_cid));
833d14abf15SRobert Mustacchi         }
834d14abf15SRobert Mustacchi         sp_sb->index_values[HC_SP_INDEX_ISCSI_OOO_RX_CONS]  = 0;
835d14abf15SRobert Mustacchi         rcq_chain->hw_con_idx_ptr                           = &(sp_sb->index_values[HC_SP_INDEX_ISCSI_OOO_RX_CONS]);
836d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_sb                         = STATUS_BLOCK_SP_SL_TYPE;
837d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_index_value                = HC_SP_INDEX_ISCSI_OOO_RX_CONS;
838d14abf15SRobert Mustacchi     }
839d14abf15SRobert Mustacchi     else /* NDIS */
840d14abf15SRobert Mustacchi     {
841d14abf15SRobert Mustacchi         u32_t sb_id = RSS_ID_TO_SB_ID(CHAIN_TO_RSS_ID(pdev,cid));
842d14abf15SRobert Mustacchi         const u8_t byte_counter_id = CHIP_IS_E1x(pdev)? LM_FW_SB_ID(pdev, sb_id) : LM_FW_DHC_QZONE_ID(pdev, sb_id);
843d14abf15SRobert Mustacchi 
844d14abf15SRobert Mustacchi         if (IS_PFDEV(pdev) && CHIP_IS_E2E3(pdev)) {
845d14abf15SRobert Mustacchi             rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_DHC_QZONE_ID(pdev, sb_id));
846d14abf15SRobert Mustacchi         }
847d14abf15SRobert Mustacchi         if( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) )
848d14abf15SRobert Mustacchi         {
849d14abf15SRobert Mustacchi             DbgBreakIf( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) ) ;
850d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE ;
851d14abf15SRobert Mustacchi         }
852d14abf15SRobert Mustacchi 
853d14abf15SRobert Mustacchi         sb_indexes = lm_get_sb_indexes(pdev, (u8_t)sb_id);
854d14abf15SRobert Mustacchi         sb_indexes[HC_INDEX_ETH_RX_CQ_CONS] = 0;
855d14abf15SRobert Mustacchi         rcq_chain->hw_con_idx_ptr = sb_indexes + HC_INDEX_ETH_RX_CQ_CONS;
856d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE;
857d14abf15SRobert Mustacchi         rcq_chain->hc_sb_info.hc_index_value = HC_INDEX_ETH_RX_CQ_CONS;
858d14abf15SRobert Mustacchi         if (IS_PFDEV(pdev))
859d14abf15SRobert Mustacchi         {
860d14abf15SRobert Mustacchi             rcq_chain->hc_sb_info.iro_dhc_offset = CSTORM_BYTE_COUNTER_OFFSET(byte_counter_id, HC_INDEX_ETH_RX_CQ_CONS);
861d14abf15SRobert Mustacchi         }
862d14abf15SRobert Mustacchi         else
863d14abf15SRobert Mustacchi         {
864d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "Dhc not implemented for VF yet\n");
865d14abf15SRobert Mustacchi         }
866d14abf15SRobert Mustacchi     }
867d14abf15SRobert Mustacchi 
868d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
869d14abf15SRobert Mustacchi } /* lm_setup_rcq */
870d14abf15SRobert Mustacchi 
871d14abf15SRobert Mustacchi lm_status_t
lm_setup_client_con_resc(IN struct _lm_device_t * pdev,IN u32_t cid)872d14abf15SRobert Mustacchi lm_setup_client_con_resc(
873d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
874d14abf15SRobert Mustacchi     IN u32_t cid
875d14abf15SRobert Mustacchi     )
876d14abf15SRobert Mustacchi {
877d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
878d14abf15SRobert Mustacchi 
879d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
880d14abf15SRobert Mustacchi     {
881d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
882d14abf15SRobert Mustacchi     }
883d14abf15SRobert Mustacchi 
884d14abf15SRobert Mustacchi     if((GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX) &&
885d14abf15SRobert Mustacchi        (cid >= MAX_RX_CHAIN(pdev))) ||
886d14abf15SRobert Mustacchi         (GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX) &&
887d14abf15SRobert Mustacchi        (cid >= MAX_TX_CHAIN(pdev))))
888d14abf15SRobert Mustacchi 
889d14abf15SRobert Mustacchi     {
890d14abf15SRobert Mustacchi         DbgBreakMsg(" invalid chain ");
891d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
892d14abf15SRobert Mustacchi     }
893d14abf15SRobert Mustacchi 
894d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX))
895d14abf15SRobert Mustacchi     {
896d14abf15SRobert Mustacchi         lm_status = lm_setup_txq(pdev, cid);
897d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
898d14abf15SRobert Mustacchi         {
899d14abf15SRobert Mustacchi             return lm_status;
900d14abf15SRobert Mustacchi         }
901d14abf15SRobert Mustacchi     }
902d14abf15SRobert Mustacchi 
903d14abf15SRobert Mustacchi 
904d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX))
905d14abf15SRobert Mustacchi     {
906d14abf15SRobert Mustacchi         lm_status = lm_setup_rxq(pdev, cid);
907d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
908d14abf15SRobert Mustacchi         {
909d14abf15SRobert Mustacchi             return lm_status;
910d14abf15SRobert Mustacchi         }
911d14abf15SRobert Mustacchi 
912d14abf15SRobert Mustacchi         lm_status = lm_setup_rcq(pdev, cid);
913d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
914d14abf15SRobert Mustacchi         {
915d14abf15SRobert Mustacchi             return lm_status;
916d14abf15SRobert Mustacchi         }
917d14abf15SRobert Mustacchi     }
918d14abf15SRobert Mustacchi 
919d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TPA))
920d14abf15SRobert Mustacchi     {
921d14abf15SRobert Mustacchi         lm_status = lm_setup_tpa_chain(pdev, cid);
922d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
923d14abf15SRobert Mustacchi         {
924d14abf15SRobert Mustacchi             return lm_status;
925d14abf15SRobert Mustacchi         }
926d14abf15SRobert Mustacchi     }
927d14abf15SRobert Mustacchi     pdev->client_info[cid].last_set_rx_mask = 0;
928d14abf15SRobert Mustacchi 
929d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
930d14abf15SRobert Mustacchi }
931d14abf15SRobert Mustacchi 
932d14abf15SRobert Mustacchi /*
933d14abf15SRobert Mustacchi  * reset txq, rxq, rcq counters for L2 client connection
934d14abf15SRobert Mustacchi  *
935d14abf15SRobert Mustacchi  * assumption: the cid equals the chain idx
936d14abf15SRobert Mustacchi  */
lm_clear_eth_con_resc(IN struct _lm_device_t * pdev,IN u8_t const cid)937d14abf15SRobert Mustacchi lm_status_t lm_clear_eth_con_resc( IN struct _lm_device_t *pdev,
938d14abf15SRobert Mustacchi                                    IN u8_t const          cid )
939d14abf15SRobert Mustacchi {
940d14abf15SRobert Mustacchi     u8_t sb_id = lm_sb_id_from_chain(pdev, cid);
941d14abf15SRobert Mustacchi     u8_t max_eth_cid;
942d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
943d14abf15SRobert Mustacchi     {
944d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
945d14abf15SRobert Mustacchi     }
946d14abf15SRobert Mustacchi     if (MM_DCB_MP_L2_IS_ENABLE(pdev))
947d14abf15SRobert Mustacchi     {
948d14abf15SRobert Mustacchi         max_eth_cid = lm_mp_max_cos_chain_used(pdev);
949d14abf15SRobert Mustacchi     }
950d14abf15SRobert Mustacchi     else
951d14abf15SRobert Mustacchi     {
952d14abf15SRobert Mustacchi         max_eth_cid = MAX_RX_CHAIN(pdev);
953d14abf15SRobert Mustacchi     }
954d14abf15SRobert Mustacchi     if (cid >= max_eth_cid)
955d14abf15SRobert Mustacchi     {
956d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
957d14abf15SRobert Mustacchi     }
958d14abf15SRobert Mustacchi 
959d14abf15SRobert Mustacchi     /* Set hw consumer index pointers to null, so we won't get rx/tx completion */
960d14abf15SRobert Mustacchi     /* for this connection, next time we'll load it                             */
961d14abf15SRobert Mustacchi 
962d14abf15SRobert Mustacchi     // Regardless the attributes we "clean' the TX status block
963d14abf15SRobert Mustacchi 
964d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX))
965d14abf15SRobert Mustacchi     {
966d14abf15SRobert Mustacchi         if (cid >= MAX_TX_CHAIN(pdev))
967d14abf15SRobert Mustacchi         {
968d14abf15SRobert Mustacchi             DbgBreakMsg(" Invalid TX chain index ");
969d14abf15SRobert Mustacchi             return LM_STATUS_INVALID_PARAMETER;
970d14abf15SRobert Mustacchi         }
971d14abf15SRobert Mustacchi         /* first set the hw consumer index pointers to null, and only then clear the pkt_idx value
972d14abf15SRobert Mustacchi          * to avoid a race when servicing interrupt at the same time */
973d14abf15SRobert Mustacchi         lm_clear_chain_sb_cons_idx(pdev, sb_id, &LM_TXQ(pdev, cid).hc_sb_info, &LM_TXQ(pdev, cid).hw_con_idx_ptr);
974d14abf15SRobert Mustacchi         LM_TXQ(pdev, cid).pkt_idx = 0;
975d14abf15SRobert Mustacchi     }
976d14abf15SRobert Mustacchi 
977d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX))
978d14abf15SRobert Mustacchi     {
979d14abf15SRobert Mustacchi         if (cid >= MAX_RX_CHAIN(pdev))
980d14abf15SRobert Mustacchi         {
981d14abf15SRobert Mustacchi             DbgBreakMsg(" Invalid RX chain index ");
982d14abf15SRobert Mustacchi             return LM_STATUS_INVALID_PARAMETER;
983d14abf15SRobert Mustacchi         }
984d14abf15SRobert Mustacchi         lm_clear_chain_sb_cons_idx(pdev, sb_id, &LM_RCQ(pdev, cid).hc_sb_info, &LM_RCQ(pdev, cid).hw_con_idx_ptr);
985d14abf15SRobert Mustacchi     }
986d14abf15SRobert Mustacchi     //s_list_init(&LM_RXQ(pdev, cid).active_descq, NULL, NULL, 0);
987d14abf15SRobert Mustacchi     //s_list_init(&LM_RXQ(pdev, cid).free_descq, NULL, NULL, 0);
988d14abf15SRobert Mustacchi 
989d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
990d14abf15SRobert Mustacchi }
991d14abf15SRobert Mustacchi 
992d14abf15SRobert Mustacchi lm_status_t
lm_alloc_chain_con_resc(IN struct _lm_device_t * pdev,IN u32_t const cid,IN lm_cli_idx_t const lm_cli_idx)993d14abf15SRobert Mustacchi lm_alloc_chain_con_resc(
994d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev,
995d14abf15SRobert Mustacchi     IN u32_t        const   cid,
996d14abf15SRobert Mustacchi     IN lm_cli_idx_t const   lm_cli_idx
997d14abf15SRobert Mustacchi     )
998d14abf15SRobert Mustacchi {
999d14abf15SRobert Mustacchi     lm_status_t  lm_status = LM_STATUS_SUCCESS;
1000d14abf15SRobert Mustacchi     u16_t   l2_rx_bd_page_cnt = 0;
1001d14abf15SRobert Mustacchi     u16_t l2_tpa_bd_page_cnt = 0;
1002d14abf15SRobert Mustacchi     u16_t bds_per_page = 0;
1003d14abf15SRobert Mustacchi 
1004d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
1005d14abf15SRobert Mustacchi     {
1006d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1007d14abf15SRobert Mustacchi     }
1008d14abf15SRobert Mustacchi 
1009d14abf15SRobert Mustacchi     if((GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX) &&
1010d14abf15SRobert Mustacchi        (cid >= MAX_RX_CHAIN(pdev))) ||
1011d14abf15SRobert Mustacchi         (GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX) &&
1012d14abf15SRobert Mustacchi        (cid >= MAX_TX_CHAIN(pdev))))
1013d14abf15SRobert Mustacchi 
1014d14abf15SRobert Mustacchi     {
1015d14abf15SRobert Mustacchi         DbgBreakMsg(" invalid chain ");
1016d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1017d14abf15SRobert Mustacchi     }
1018d14abf15SRobert Mustacchi 
1019d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX))
1020d14abf15SRobert Mustacchi     {
1021d14abf15SRobert Mustacchi         lm_status = lm_alloc_txq(pdev,
1022d14abf15SRobert Mustacchi                                  cid,
1023d14abf15SRobert Mustacchi                                  (u16_t)pdev->params.l2_tx_bd_page_cnt[lm_cli_idx],
1024d14abf15SRobert Mustacchi                                  (u16_t)pdev->params.l2_tx_coal_buf_cnt[lm_cli_idx]);
1025d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1026d14abf15SRobert Mustacchi         {
1027d14abf15SRobert Mustacchi             return lm_status;
1028d14abf15SRobert Mustacchi         }
1029d14abf15SRobert Mustacchi     }
1030d14abf15SRobert Mustacchi 
1031d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX))
1032d14abf15SRobert Mustacchi     {
1033d14abf15SRobert Mustacchi         l2_rx_bd_page_cnt =_ceil( pdev->params.l2_cli_con_params[cid].num_rx_desc, 500 );
1034d14abf15SRobert Mustacchi         lm_status = lm_alloc_rxq(pdev,
1035d14abf15SRobert Mustacchi                                  cid,
1036d14abf15SRobert Mustacchi                                  l2_rx_bd_page_cnt,
1037d14abf15SRobert Mustacchi                                  pdev->params.l2_cli_con_params[cid].num_rx_desc);
1038d14abf15SRobert Mustacchi 
1039d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1040d14abf15SRobert Mustacchi         {
1041d14abf15SRobert Mustacchi             return lm_status;
1042d14abf15SRobert Mustacchi         }
1043d14abf15SRobert Mustacchi 
1044d14abf15SRobert Mustacchi         lm_status = lm_alloc_rcq(pdev,
1045d14abf15SRobert Mustacchi                                  cid,
1046d14abf15SRobert Mustacchi                                  (u16_t)l2_rx_bd_page_cnt * LM_RX_BD_CQ_SIZE_RATIO);
1047d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1048d14abf15SRobert Mustacchi         {
1049d14abf15SRobert Mustacchi             return lm_status;
1050d14abf15SRobert Mustacchi         }
1051d14abf15SRobert Mustacchi     }
1052d14abf15SRobert Mustacchi 
1053d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TPA))
1054d14abf15SRobert Mustacchi     {
1055d14abf15SRobert Mustacchi         bds_per_page = BD_PER_PAGE(LM_TPA_BD_ELEN_SIZE);
1056d14abf15SRobert Mustacchi 
1057d14abf15SRobert Mustacchi         if ((0 == pdev->params.tpa_desc_cnt_per_chain) ||
1058d14abf15SRobert Mustacchi             (!(POWER_OF_2(bds_per_page))))
1059d14abf15SRobert Mustacchi         {
1060d14abf15SRobert Mustacchi             DbgBreakMsg(" Illegal TPA params");
1061d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE;
1062d14abf15SRobert Mustacchi         }
1063d14abf15SRobert Mustacchi         l2_tpa_bd_page_cnt =_ceil( pdev->params.tpa_desc_cnt_per_chain,
1064d14abf15SRobert Mustacchi                                   USABLE_BDS_PER_PAGE(LM_TPA_BD_ELEN_SIZE, TRUE));
1065d14abf15SRobert Mustacchi 
1066d14abf15SRobert Mustacchi         l2_tpa_bd_page_cnt = (u16_t)
1067d14abf15SRobert Mustacchi             upper_align_power_of_2(l2_tpa_bd_page_cnt,
1068d14abf15SRobert Mustacchi                                    sizeof(l2_tpa_bd_page_cnt) * BITS_PER_BYTE);
1069d14abf15SRobert Mustacchi 
1070d14abf15SRobert Mustacchi         lm_status = lm_alloc_tpa_chain(pdev,
1071d14abf15SRobert Mustacchi                                        cid,
1072d14abf15SRobert Mustacchi                                        l2_tpa_bd_page_cnt,
1073d14abf15SRobert Mustacchi                                        pdev->params.tpa_desc_cnt_per_chain,
1074d14abf15SRobert Mustacchi                                        bds_per_page);
1075d14abf15SRobert Mustacchi 
1076d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1077d14abf15SRobert Mustacchi         {
1078d14abf15SRobert Mustacchi             return lm_status;
1079d14abf15SRobert Mustacchi         }
1080d14abf15SRobert Mustacchi     }
1081d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1082d14abf15SRobert Mustacchi }
1083d14abf15SRobert Mustacchi 
1084d14abf15SRobert Mustacchi lm_status_t
lm_setup_client_con_params(IN struct _lm_device_t * pdev,IN u8_t const chain_idx,IN struct _lm_client_con_params_t * cli_params)1085d14abf15SRobert Mustacchi lm_setup_client_con_params( IN struct _lm_device_t            *pdev,
1086d14abf15SRobert Mustacchi                             IN u8_t const                      chain_idx,
1087d14abf15SRobert Mustacchi                             IN struct _lm_client_con_params_t *cli_params )
1088d14abf15SRobert Mustacchi {
1089d14abf15SRobert Mustacchi     lm_rx_chain_t* rxq_chain = NULL;
1090d14abf15SRobert Mustacchi 
1091d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) ||
1092d14abf15SRobert Mustacchi         CHK_NULL(cli_params) ||
1093d14abf15SRobert Mustacchi         ERR_IF((ARRSIZE(pdev->params.l2_cli_con_params) <= chain_idx) ||
1094d14abf15SRobert Mustacchi                (CHIP_IS_E1H(pdev) && (chain_idx >= ETH_MAX_RX_CLIENTS_E1H)) || /* TODO E2 add IS_E2*/
1095d14abf15SRobert Mustacchi                (CHIP_IS_E1(pdev) && (chain_idx >= ETH_MAX_RX_CLIENTS_E1)) ))
1096d14abf15SRobert Mustacchi     {
1097d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1098d14abf15SRobert Mustacchi     }
1099d14abf15SRobert Mustacchi 
1100d14abf15SRobert Mustacchi     mm_memcpy(&pdev->params.l2_cli_con_params[chain_idx], cli_params, sizeof(struct _lm_client_con_params_t));
1101d14abf15SRobert Mustacchi 
1102d14abf15SRobert Mustacchi 
1103d14abf15SRobert Mustacchi     if(GET_FLAGS(pdev->params.l2_cli_con_params[chain_idx].attributes,
1104d14abf15SRobert Mustacchi                  LM_CLIENT_ATTRIBUTES_RX))
1105d14abf15SRobert Mustacchi     {
1106d14abf15SRobert Mustacchi         // update rxq_chain strucutre
1107d14abf15SRobert Mustacchi         rxq_chain           = &LM_RXQ(pdev, chain_idx);
1108d14abf15SRobert Mustacchi         rxq_chain->lah_size = pdev->params.l2_cli_con_params[chain_idx].lah_size;
1109d14abf15SRobert Mustacchi     }
1110d14abf15SRobert Mustacchi 
1111d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1112d14abf15SRobert Mustacchi }
1113d14abf15SRobert Mustacchi 
1114d14abf15SRobert Mustacchi lm_status_t
lm_init_chain_con(IN struct _lm_device_t * pdev,IN u8_t const chain_idx,IN u8_t const b_alloc)1115d14abf15SRobert Mustacchi lm_init_chain_con( IN struct _lm_device_t *pdev,
1116d14abf15SRobert Mustacchi                     IN u8_t const          chain_idx,
1117d14abf15SRobert Mustacchi                     IN u8_t const          b_alloc )
1118d14abf15SRobert Mustacchi {
1119d14abf15SRobert Mustacchi     lm_status_t  lm_status  = LM_STATUS_SUCCESS;
1120d14abf15SRobert Mustacchi     u8_t         lm_cli_idx = LM_CHAIN_IDX_CLI(pdev, chain_idx); // FIXME!!!
1121d14abf15SRobert Mustacchi 
1122d14abf15SRobert Mustacchi     if (CHK_NULL(pdev) ||
1123d14abf15SRobert Mustacchi         (LM_CLI_IDX_MAX <= lm_cli_idx))
1124d14abf15SRobert Mustacchi     {
1125d14abf15SRobert Mustacchi         DbgBreakMsg(" lm_init_client_con lm_cli_idx has an invalid value");
1126d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1127d14abf15SRobert Mustacchi     }
1128d14abf15SRobert Mustacchi 
1129d14abf15SRobert Mustacchi     if (b_alloc)
1130d14abf15SRobert Mustacchi     {
1131d14abf15SRobert Mustacchi         lm_status = lm_alloc_chain_con_resc(pdev, chain_idx, lm_cli_idx);
1132d14abf15SRobert Mustacchi 
1133d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1134d14abf15SRobert Mustacchi         {
1135d14abf15SRobert Mustacchi             return lm_status;
1136d14abf15SRobert Mustacchi         }
1137d14abf15SRobert Mustacchi 
1138d14abf15SRobert Mustacchi         if(GET_FLAGS(pdev->params.l2_cli_con_params[chain_idx].attributes,LM_CLIENT_ATTRIBUTES_RX))
1139d14abf15SRobert Mustacchi         {
1140d14abf15SRobert Mustacchi             /* On allocation, init the clients objects... do this only on allocation, on setup, we'll need
1141d14abf15SRobert Mustacchi              * the info to reconfigure... */
1142d14abf15SRobert Mustacchi             ecore_init_mac_obj(pdev,
1143d14abf15SRobert Mustacchi                            &pdev->client_info[chain_idx].mac_obj,
1144d14abf15SRobert Mustacchi                            LM_FW_CLI_ID(pdev, chain_idx),
1145d14abf15SRobert Mustacchi                            chain_idx,
1146d14abf15SRobert Mustacchi                            FUNC_ID(pdev),
1147d14abf15SRobert Mustacchi                            LM_SLOWPATH(pdev, mac_rdata)[lm_cli_idx],
1148d14abf15SRobert Mustacchi                            LM_SLOWPATH_PHYS(pdev, mac_rdata)[lm_cli_idx],
1149d14abf15SRobert Mustacchi                            ECORE_FILTER_MAC_PENDING,
1150d14abf15SRobert Mustacchi                            (unsigned long *)&pdev->client_info[chain_idx].sp_mac_state,
1151d14abf15SRobert Mustacchi                            ECORE_OBJ_TYPE_RX_TX,
1152d14abf15SRobert Mustacchi                            &pdev->slowpath_info.macs_pool);
1153d14abf15SRobert Mustacchi 
1154d14abf15SRobert Mustacchi 
1155d14abf15SRobert Mustacchi             if (!CHIP_IS_E1(pdev))
1156d14abf15SRobert Mustacchi             {
1157d14abf15SRobert Mustacchi                 ecore_init_vlan_mac_obj(pdev,
1158d14abf15SRobert Mustacchi                                    &pdev->client_info[chain_idx].mac_vlan_obj,
1159d14abf15SRobert Mustacchi                                    LM_FW_CLI_ID(pdev, chain_idx),
1160d14abf15SRobert Mustacchi                                    chain_idx,
1161d14abf15SRobert Mustacchi                                    FUNC_ID(pdev),
1162d14abf15SRobert Mustacchi                                    LM_SLOWPATH(pdev, mac_rdata)[lm_cli_idx],
1163d14abf15SRobert Mustacchi                                    LM_SLOWPATH_PHYS(pdev, mac_rdata)[lm_cli_idx],
1164d14abf15SRobert Mustacchi                                    ECORE_FILTER_VLAN_MAC_PENDING,
1165d14abf15SRobert Mustacchi                                    (unsigned long *)&pdev->client_info[chain_idx].sp_mac_state,
1166d14abf15SRobert Mustacchi                                    ECORE_OBJ_TYPE_RX_TX,
1167d14abf15SRobert Mustacchi                                    &pdev->slowpath_info.macs_pool,
1168d14abf15SRobert Mustacchi                                    &pdev->slowpath_info.vlans_pool);
1169d14abf15SRobert Mustacchi 
1170d14abf15SRobert Mustacchi             }
1171d14abf15SRobert Mustacchi 
1172d14abf15SRobert Mustacchi             if (!CHIP_IS_E1x(pdev))
1173d14abf15SRobert Mustacchi             {
1174d14abf15SRobert Mustacchi                 ecore_init_vlan_obj(pdev,
1175d14abf15SRobert Mustacchi                                     &pdev->client_info[chain_idx].vlan_obj,
1176d14abf15SRobert Mustacchi                                     LM_FW_CLI_ID(pdev, chain_idx),
1177d14abf15SRobert Mustacchi                                     chain_idx,
1178d14abf15SRobert Mustacchi                                     FUNC_ID(pdev),
1179d14abf15SRobert Mustacchi                                     LM_SLOWPATH(pdev, mac_rdata)[lm_cli_idx],
1180d14abf15SRobert Mustacchi                                     LM_SLOWPATH_PHYS(pdev, mac_rdata)[lm_cli_idx],
1181d14abf15SRobert Mustacchi                                     ECORE_FILTER_VLAN_PENDING,
1182d14abf15SRobert Mustacchi                                     (unsigned long *)&pdev->client_info[chain_idx].sp_mac_state,
1183d14abf15SRobert Mustacchi                                     ECORE_OBJ_TYPE_RX_TX,
1184d14abf15SRobert Mustacchi                                     &pdev->slowpath_info.vlans_pool);
1185d14abf15SRobert Mustacchi             }
1186d14abf15SRobert Mustacchi         }
1187d14abf15SRobert Mustacchi     }
1188d14abf15SRobert Mustacchi 
1189d14abf15SRobert Mustacchi 
1190d14abf15SRobert Mustacchi     lm_status = lm_setup_client_con_resc(pdev, chain_idx);
1191d14abf15SRobert Mustacchi 
1192d14abf15SRobert Mustacchi     return lm_status;
1193d14abf15SRobert Mustacchi }
1194d14abf15SRobert Mustacchi 
lm_alloc_sq(struct _lm_device_t * pdev)1195d14abf15SRobert Mustacchi lm_status_t lm_alloc_sq(struct _lm_device_t *pdev)
1196d14abf15SRobert Mustacchi {
1197d14abf15SRobert Mustacchi     lm_sq_info_t * sq_info = &pdev->sq_info;
1198d14abf15SRobert Mustacchi 
1199d14abf15SRobert Mustacchi     sq_info->sq_chain.sq_chain_virt = mm_alloc_phys_mem( pdev,
1200d14abf15SRobert Mustacchi                                                          LM_PAGE_SIZE,
1201d14abf15SRobert Mustacchi                                                          (lm_address_t*)&(sq_info->sq_chain.bd_chain_phy),
1202d14abf15SRobert Mustacchi                                                          0,
1203d14abf15SRobert Mustacchi                                                          LM_CLI_IDX_MAX);
1204d14abf15SRobert Mustacchi 
1205d14abf15SRobert Mustacchi     if CHK_NULL(sq_info->sq_chain.sq_chain_virt)
1206d14abf15SRobert Mustacchi     {
1207d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1208d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1209d14abf15SRobert Mustacchi     }
1210d14abf15SRobert Mustacchi 
1211d14abf15SRobert Mustacchi     mm_mem_zero(sq_info->sq_chain.sq_chain_virt, LM_PAGE_SIZE);
1212d14abf15SRobert Mustacchi 
1213d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1214d14abf15SRobert Mustacchi }
1215d14abf15SRobert Mustacchi 
lm_alloc_eq(struct _lm_device_t * pdev)1216d14abf15SRobert Mustacchi lm_status_t lm_alloc_eq(struct _lm_device_t *pdev)
1217d14abf15SRobert Mustacchi {
1218d14abf15SRobert Mustacchi     lm_eq_chain_t *eq_chain = NULL;
1219d14abf15SRobert Mustacchi     u32_t          mem_size = 0;
1220d14abf15SRobert Mustacchi     u8_t  const    page_cnt = 1;
1221d14abf15SRobert Mustacchi 
1222d14abf15SRobert Mustacchi 
1223d14abf15SRobert Mustacchi     /* check arguments */
1224d14abf15SRobert Mustacchi     if(CHK_NULL(pdev))
1225d14abf15SRobert Mustacchi     {
1226d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
1227d14abf15SRobert Mustacchi     }
1228d14abf15SRobert Mustacchi 
1229d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi | INFORMl2sp, "#lm_alloc_eq\n");
1230d14abf15SRobert Mustacchi 
1231d14abf15SRobert Mustacchi     mem_size = page_cnt * LM_PAGE_SIZE;
1232d14abf15SRobert Mustacchi     eq_chain = &pdev->eq_info.eq_chain;
1233d14abf15SRobert Mustacchi 
1234d14abf15SRobert Mustacchi 
1235d14abf15SRobert Mustacchi     /* alloc the chain */
1236d14abf15SRobert Mustacchi     eq_chain->bd_chain.bd_chain_virt =
1237d14abf15SRobert Mustacchi         mm_alloc_phys_mem( pdev, mem_size, &eq_chain->bd_chain.bd_chain_phy, 0, LM_CLI_IDX_MAX);
1238d14abf15SRobert Mustacchi 
1239d14abf15SRobert Mustacchi     if(ERR_IF(!eq_chain->bd_chain.bd_chain_virt))
1240d14abf15SRobert Mustacchi     {
1241d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1242d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
1243d14abf15SRobert Mustacchi     }
1244d14abf15SRobert Mustacchi 
1245d14abf15SRobert Mustacchi     mm_mem_zero(eq_chain->bd_chain.bd_chain_virt, mem_size);
1246d14abf15SRobert Mustacchi     eq_chain->bd_chain.page_cnt = page_cnt;
1247d14abf15SRobert Mustacchi 
1248d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1249d14abf15SRobert Mustacchi 
1250d14abf15SRobert Mustacchi }
1251d14abf15SRobert Mustacchi 
lm_alloc_client_info(struct _lm_device_t * pdev)1252d14abf15SRobert Mustacchi lm_status_t lm_alloc_client_info(struct _lm_device_t *pdev)
1253d14abf15SRobert Mustacchi {
1254d14abf15SRobert Mustacchi     client_init_data_t  *client_init_data_virt                  = NULL;
1255d14abf15SRobert Mustacchi     const u32_t mem_size_init                                   = sizeof(client_init_data_t);
1256d14abf15SRobert Mustacchi     struct client_update_ramrod_data  *client_update_data_virt  = NULL;
1257d14abf15SRobert Mustacchi     const u32_t mem_size_update                                 = sizeof(struct client_update_ramrod_data);
1258d14abf15SRobert Mustacchi     u8_t i                                                      = 0;
1259d14abf15SRobert Mustacchi 
1260d14abf15SRobert Mustacchi     for (i = 0; i < ARRSIZE(pdev->client_info); i++)
1261d14abf15SRobert Mustacchi     {
1262d14abf15SRobert Mustacchi         //Init data
1263d14abf15SRobert Mustacchi         client_init_data_virt = mm_alloc_phys_mem(pdev, mem_size_init, &pdev->client_info[i].client_init_data_phys, 0, LM_RESOURCE_COMMON);
1264d14abf15SRobert Mustacchi         if CHK_NULL(client_init_data_virt)
1265d14abf15SRobert Mustacchi         {
1266d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1267d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
1268d14abf15SRobert Mustacchi         }
1269d14abf15SRobert Mustacchi 
1270d14abf15SRobert Mustacchi         mm_mem_zero(client_init_data_virt, mem_size_init);
1271d14abf15SRobert Mustacchi 
1272d14abf15SRobert Mustacchi         pdev->client_info[i].client_init_data_virt = client_init_data_virt;
1273d14abf15SRobert Mustacchi 
1274d14abf15SRobert Mustacchi         //update data
1275d14abf15SRobert Mustacchi         client_update_data_virt = mm_alloc_phys_mem(pdev, mem_size_update, &pdev->client_info[i].update.data_phys, 0, LM_RESOURCE_COMMON);
1276d14abf15SRobert Mustacchi         if CHK_NULL(client_update_data_virt)
1277d14abf15SRobert Mustacchi         {
1278d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1279d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
1280d14abf15SRobert Mustacchi         }
1281d14abf15SRobert Mustacchi 
1282d14abf15SRobert Mustacchi         mm_mem_zero(client_update_data_virt, mem_size_update);
1283d14abf15SRobert Mustacchi 
1284d14abf15SRobert Mustacchi         pdev->client_info[i].update.data_virt = client_update_data_virt;
1285d14abf15SRobert Mustacchi     }
1286d14abf15SRobert Mustacchi 
1287d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1288d14abf15SRobert Mustacchi }
1289d14abf15SRobert Mustacchi 
lm_setup_client_info(struct _lm_device_t * pdev)1290d14abf15SRobert Mustacchi lm_status_t lm_setup_client_info(struct _lm_device_t *pdev)
1291d14abf15SRobert Mustacchi {
1292d14abf15SRobert Mustacchi     client_init_data_t  *client_init_data_virt                  = NULL;
1293d14abf15SRobert Mustacchi     const u32_t mem_size_init                                   = sizeof(client_init_data_t);
1294d14abf15SRobert Mustacchi     struct client_update_ramrod_data  *client_update_data_virt  = NULL;
1295d14abf15SRobert Mustacchi     const u32_t mem_size_update                                 = sizeof(struct client_update_ramrod_data);
1296d14abf15SRobert Mustacchi     u8_t i                                                      = 0;
1297d14abf15SRobert Mustacchi 
1298d14abf15SRobert Mustacchi     for (i = 0; i < ARRSIZE(pdev->client_info); i++)
1299d14abf15SRobert Mustacchi     {
1300d14abf15SRobert Mustacchi         //Init
1301d14abf15SRobert Mustacchi         client_init_data_virt = pdev->client_info[i].client_init_data_virt;
1302d14abf15SRobert Mustacchi         if CHK_NULL(client_init_data_virt)
1303d14abf15SRobert Mustacchi         {
1304d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "client-init-data at this point is not expected to be null... \n");
1305d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE ;
1306d14abf15SRobert Mustacchi         }
1307d14abf15SRobert Mustacchi         mm_mem_zero(client_init_data_virt, mem_size_init);
1308d14abf15SRobert Mustacchi 
1309d14abf15SRobert Mustacchi         //update
1310d14abf15SRobert Mustacchi         client_update_data_virt = pdev->client_info[i].update.data_virt;
1311d14abf15SRobert Mustacchi         if CHK_NULL(client_update_data_virt)
1312d14abf15SRobert Mustacchi         {
1313d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "client-update-data at this point is not expected to be null... \n");
1314d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE ;
1315d14abf15SRobert Mustacchi         }
1316d14abf15SRobert Mustacchi         mm_mem_zero(client_update_data_virt, mem_size_update);
1317d14abf15SRobert Mustacchi     }
1318d14abf15SRobert Mustacchi 
1319d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1320d14abf15SRobert Mustacchi }
1321d14abf15SRobert Mustacchi 
1322d14abf15SRobert Mustacchi /**
1323d14abf15SRobert Mustacchi  * @description
1324d14abf15SRobert Mustacchi  * The next page entrys are static and wont be used by active
1325d14abf15SRobert Mustacchi  * descriptor array and mask array.
1326d14abf15SRobert Mustacchi  * @param pdev
1327d14abf15SRobert Mustacchi  * @param chain_idx
1328d14abf15SRobert Mustacchi  *
1329d14abf15SRobert Mustacchi  * @return STATIC void
1330d14abf15SRobert Mustacchi  */
1331d14abf15SRobert Mustacchi __inline STATIC void
lm_tpa_clear_next_page(IN lm_device_t * pdev,IN const u32_t chain_idx)1332d14abf15SRobert Mustacchi lm_tpa_clear_next_page( IN        lm_device_t*        pdev,
1333d14abf15SRobert Mustacchi                         IN const  u32_t               chain_idx)
1334d14abf15SRobert Mustacchi {
1335d14abf15SRobert Mustacchi     lm_bd_chain_t*      bd_chain        = &LM_TPA_CHAIN_BD(pdev, chain_idx);
1336d14abf15SRobert Mustacchi     u16_t               active_entry    = 0;
1337d14abf15SRobert Mustacchi     u16_t               bd_entry        = 0;
1338d14abf15SRobert Mustacchi     u16_t               i               = 0;
1339d14abf15SRobert Mustacchi     u16_t               j               = 0;
1340d14abf15SRobert Mustacchi 
1341d14abf15SRobert Mustacchi     for(i = 1; i <= lm_bd_chain_page_cnt(bd_chain); i++ )
1342d14abf15SRobert Mustacchi     {
1343d14abf15SRobert Mustacchi         bd_entry = (lm_bd_chain_bds_per_page(bd_chain) * i) - lm_bd_chain_bds_skip_eop(bd_chain);
1344d14abf15SRobert Mustacchi         /* clear page-end entries */
1345d14abf15SRobert Mustacchi         for(j = 0; j < lm_bd_chain_bds_skip_eop(bd_chain); j++ )
1346d14abf15SRobert Mustacchi         {
1347d14abf15SRobert Mustacchi             active_entry = LM_TPA_BD_ENTRY_TO_ACTIVE_ENTRY(pdev, chain_idx, bd_entry);
1348d14abf15SRobert Mustacchi             LM_TPA_MASK_CLEAR_ACTIVE_BIT(pdev, chain_idx, active_entry);
1349d14abf15SRobert Mustacchi             bd_entry++;
1350d14abf15SRobert Mustacchi         }
1351d14abf15SRobert Mustacchi     }
1352d14abf15SRobert Mustacchi }
1353d14abf15SRobert Mustacchi 
1354d14abf15SRobert Mustacchi /**
1355d14abf15SRobert Mustacchi  * @description
1356d14abf15SRobert Mustacchi  * Clear TPA parameters. TPA can be disabled between NDIS bind
1357d14abf15SRobert Mustacchi  * unbind but the RX cahin will stay used.
1358d14abf15SRobert Mustacchi  * @param pdev
1359d14abf15SRobert Mustacchi  * @param cid
1360d14abf15SRobert Mustacchi  */
1361d14abf15SRobert Mustacchi lm_status_t
lm_tpa_chain_reset(IN lm_device_t * pdev,IN const u32_t cid)1362d14abf15SRobert Mustacchi lm_tpa_chain_reset(IN lm_device_t   *pdev,
1363d14abf15SRobert Mustacchi                    IN const u32_t   cid)
1364d14abf15SRobert Mustacchi {
1365d14abf15SRobert Mustacchi 
1366d14abf15SRobert Mustacchi     lm_tpa_chain_t *    tpa_chain          = NULL;
1367d14abf15SRobert Mustacchi 
1368d14abf15SRobert Mustacchi     /* check arguments */
1369d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
1370d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid)))
1371d14abf15SRobert Mustacchi     {
1372d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
1373d14abf15SRobert Mustacchi     }
1374d14abf15SRobert Mustacchi 
1375d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_tpa, cid=%d\n",cid);
1376d14abf15SRobert Mustacchi 
1377d14abf15SRobert Mustacchi     tpa_chain = &LM_TPA(pdev, cid);
1378d14abf15SRobert Mustacchi     /***************** SGE chain setup *************************************/
1379d14abf15SRobert Mustacchi     mm_mem_zero(tpa_chain,sizeof(lm_tpa_chain_t));
1380d14abf15SRobert Mustacchi 
1381d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1382d14abf15SRobert Mustacchi }
1383d14abf15SRobert Mustacchi /**
1384d14abf15SRobert Mustacchi  * @description
1385d14abf15SRobert Mustacchi  *
1386d14abf15SRobert Mustacchi  * @param pdev
1387d14abf15SRobert Mustacchi  * @param cid
1388d14abf15SRobert Mustacchi  *
1389d14abf15SRobert Mustacchi  * @return lm_status_t
1390d14abf15SRobert Mustacchi  */
lm_setup_tpa_chain(IN struct _lm_device_t * pdev,IN u32_t const cid)1391d14abf15SRobert Mustacchi lm_status_t lm_setup_tpa_chain( IN struct _lm_device_t *pdev,
1392d14abf15SRobert Mustacchi                                 IN u32_t const          cid)
1393d14abf15SRobert Mustacchi {
1394d14abf15SRobert Mustacchi     lm_bd_chain_t *     bd_chain            = NULL;
1395d14abf15SRobert Mustacchi     lm_tpa_chain_t *    tpa_chain           = NULL;
1396d14abf15SRobert Mustacchi     u16_t                i                  = 0;
1397d14abf15SRobert Mustacchi 
1398d14abf15SRobert Mustacchi     /* check arguments */
1399d14abf15SRobert Mustacchi     if(CHK_NULL(pdev) ||
1400d14abf15SRobert Mustacchi        ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid)))
1401d14abf15SRobert Mustacchi     {
1402d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
1403d14abf15SRobert Mustacchi     }
1404d14abf15SRobert Mustacchi 
1405d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_tpa, cid=%d\n",cid);
1406d14abf15SRobert Mustacchi 
1407d14abf15SRobert Mustacchi     tpa_chain = &LM_TPA(pdev, cid);
1408d14abf15SRobert Mustacchi     bd_chain = &LM_TPA_CHAIN_BD( pdev, cid );
1409d14abf15SRobert Mustacchi 
1410d14abf15SRobert Mustacchi 
1411d14abf15SRobert Mustacchi     /***************** TPA chain setup ************************************/
1412d14abf15SRobert Mustacchi     for(i = 0; i < ARRSIZE(tpa_chain->start_coales_bd) ; i++)
1413d14abf15SRobert Mustacchi     {
1414d14abf15SRobert Mustacchi         tpa_chain->start_coales_bd[i].is_entry_used = FALSE;
1415d14abf15SRobert Mustacchi         tpa_chain->start_coales_bd[i].packet = NULL;
1416d14abf15SRobert Mustacchi     }
1417d14abf15SRobert Mustacchi 
1418d14abf15SRobert Mustacchi     /***************** SGE common setup ************************************/
1419d14abf15SRobert Mustacchi     tpa_chain->common.prod_bseq                 = 0;
1420d14abf15SRobert Mustacchi     tpa_chain->common.bd_prod_without_next      = 0;
1421d14abf15SRobert Mustacchi 
1422d14abf15SRobert Mustacchi     /***************** SGE chain setup *************************************/
1423d14abf15SRobert Mustacchi     lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy,bd_chain->page_cnt, LM_TPA_BD_ELEN_SIZE, /* is full? */0, TRUE);
1424d14abf15SRobert Mustacchi 
1425d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "rxq[%d] bd_chain[%d] %p, bd_left %d\n", cid,
1426d14abf15SRobert Mustacchi                                                                         bd_chain->next_bd,
1427d14abf15SRobert Mustacchi                                                                         bd_chain->bd_left);
1428d14abf15SRobert Mustacchi 
1429d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi, "   bd_chain_phy[%d] 0x%x%08x\n", bd_chain->bd_chain_phy.as_u32.high,
1430d14abf15SRobert Mustacchi                                                                  bd_chain->bd_chain_phy.as_u32.low);
1431d14abf15SRobert Mustacchi     tpa_chain->sge_chain.last_max_con = 0;
1432d14abf15SRobert Mustacchi 
1433d14abf15SRobert Mustacchi     for(i = 0; i < LM_TPA_ACTIVE_DESCQ_ARRAY_ELEM(pdev, cid) ; i++)
1434d14abf15SRobert Mustacchi     {
1435d14abf15SRobert Mustacchi         tpa_chain->sge_chain.active_descq_array[i] = NULL;
1436d14abf15SRobert Mustacchi     }
1437d14abf15SRobert Mustacchi 
1438d14abf15SRobert Mustacchi     /***************** Mask entry prepare *************************************/
1439d14abf15SRobert Mustacchi     ASSERT_STATIC(0 != BIT_VEC64_ELEM_SZ); //LM_TPA_MASK_LEN - divide by BIT_VEC64_ELEM_SZ
1440d14abf15SRobert Mustacchi     for(i = 0; i < LM_TPA_MASK_LEN(pdev, cid) ; i++)
1441d14abf15SRobert Mustacchi     {
1442d14abf15SRobert Mustacchi         tpa_chain->sge_chain.mask_array[i] = BIT_VEC64_ELEM_ONE_MASK;
1443d14abf15SRobert Mustacchi     }
1444d14abf15SRobert Mustacchi 
1445d14abf15SRobert Mustacchi     lm_tpa_clear_next_page(pdev,
1446d14abf15SRobert Mustacchi                            cid);
1447d14abf15SRobert Mustacchi 
1448d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1449d14abf15SRobert Mustacchi } /* lm_setup_tpa */
1450d14abf15SRobert Mustacchi 
lm_setup_sq(struct _lm_device_t * pdev)1451d14abf15SRobert Mustacchi lm_status_t lm_setup_sq(struct _lm_device_t *pdev)
1452d14abf15SRobert Mustacchi {
1453d14abf15SRobert Mustacchi     lm_sq_info_t * sq_info = &pdev->sq_info;
1454d14abf15SRobert Mustacchi 
1455d14abf15SRobert Mustacchi     mm_mem_zero(sq_info->sq_chain.sq_chain_virt, LM_PAGE_SIZE);
1456d14abf15SRobert Mustacchi 
1457d14abf15SRobert Mustacchi     pdev->sq_info.num_pending_normal = MAX_NORMAL_PRIORITY_SPE;
1458d14abf15SRobert Mustacchi     pdev->sq_info.num_pending_high = MAX_HIGH_PRIORITY_SPE;
1459d14abf15SRobert Mustacchi 
1460d14abf15SRobert Mustacchi     d_list_init(&pdev->sq_info.pending_normal, 0,0,0);
1461d14abf15SRobert Mustacchi     d_list_init(&pdev->sq_info.pending_high, 0,0,0);
1462d14abf15SRobert Mustacchi     d_list_init(&pdev->sq_info.pending_complete, 0,0,0);
1463d14abf15SRobert Mustacchi 
1464d14abf15SRobert Mustacchi 
1465d14abf15SRobert Mustacchi     /* The spq dont have next bd */
1466d14abf15SRobert Mustacchi     pdev->sq_info.sq_chain.bd_left =  USABLE_BDS_PER_PAGE(sizeof(struct slow_path_element), TRUE); /* prod == cons means empty chain */
1467d14abf15SRobert Mustacchi     pdev->sq_info.sq_chain.con_idx = 0;
1468d14abf15SRobert Mustacchi 
1469d14abf15SRobert Mustacchi     pdev->sq_info.sq_chain.prod_bd = pdev->sq_info.sq_chain.sq_chain_virt;
1470d14abf15SRobert Mustacchi     pdev->sq_info.sq_chain.last_bd = pdev->sq_info.sq_chain.prod_bd + pdev->sq_info.sq_chain.bd_left ;
1471d14abf15SRobert Mustacchi     pdev->sq_info.sq_chain.prod_idx = 0;
1472d14abf15SRobert Mustacchi 
1473d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1474d14abf15SRobert Mustacchi 
1475d14abf15SRobert Mustacchi }
1476d14abf15SRobert Mustacchi 
lm_setup_eq(struct _lm_device_t * pdev)1477d14abf15SRobert Mustacchi lm_status_t lm_setup_eq(struct _lm_device_t *pdev)
1478d14abf15SRobert Mustacchi {
1479d14abf15SRobert Mustacchi     lm_bd_chain_t * bd_chain = NULL;
1480d14abf15SRobert Mustacchi     lm_eq_chain_t * eq_chain = NULL;
1481d14abf15SRobert Mustacchi     volatile struct hc_sp_status_block * sp_sb = NULL;
1482d14abf15SRobert Mustacchi 
1483d14abf15SRobert Mustacchi 
1484d14abf15SRobert Mustacchi     /* check arguments */
1485d14abf15SRobert Mustacchi     if(CHK_NULL(pdev))
1486d14abf15SRobert Mustacchi     {
1487d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
1488d14abf15SRobert Mustacchi     }
1489d14abf15SRobert Mustacchi 
1490d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMeq, "#lm_setup_eq\n");
1491d14abf15SRobert Mustacchi 
1492d14abf15SRobert Mustacchi     eq_chain = &pdev->eq_info.eq_chain;
1493d14abf15SRobert Mustacchi     bd_chain = &eq_chain->bd_chain;
1494d14abf15SRobert Mustacchi 
1495d14abf15SRobert Mustacchi     lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy, bd_chain->page_cnt, sizeof(union event_ring_elem), /* is full? */TRUE, TRUE);
1496d14abf15SRobert Mustacchi 
1497d14abf15SRobert Mustacchi     sp_sb = lm_get_default_status_block(pdev);
1498d14abf15SRobert Mustacchi 
1499d14abf15SRobert Mustacchi     sp_sb->index_values[HC_SP_INDEX_EQ_CONS] = 0;
1500d14abf15SRobert Mustacchi 
1501d14abf15SRobert Mustacchi     eq_chain->hw_con_idx_ptr = &sp_sb->index_values[HC_SP_INDEX_EQ_CONS];
1502d14abf15SRobert Mustacchi     eq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE;
1503d14abf15SRobert Mustacchi     eq_chain->hc_sb_info.hc_index_value = HC_SP_INDEX_EQ_CONS;
1504d14abf15SRobert Mustacchi     eq_chain->iro_prod_offset = CSTORM_EVENT_RING_PROD_OFFSET(FUNC_ID(pdev));
1505d14abf15SRobert Mustacchi 
1506d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1507d14abf15SRobert Mustacchi }
1508d14abf15SRobert Mustacchi 
lm_init_sp_objs(struct _lm_device_t * pdev)1509d14abf15SRobert Mustacchi lm_status_t lm_init_sp_objs(struct _lm_device_t *pdev)
1510d14abf15SRobert Mustacchi {
1511d14abf15SRobert Mustacchi     u32_t lm_cli_idx = LM_CLI_IDX_MAX;
1512d14abf15SRobert Mustacchi 
1513d14abf15SRobert Mustacchi     ecore_init_mac_credit_pool(pdev, &pdev->slowpath_info.macs_pool, FUNC_ID(pdev), CHIP_IS_E1x(pdev)? VNICS_PER_PORT(pdev) : VNICS_PER_PATH(pdev));
1514d14abf15SRobert Mustacchi     ecore_init_vlan_credit_pool(pdev, &pdev->slowpath_info.vlans_pool, FUNC_ID(pdev), CHIP_IS_E1x(pdev)? VNICS_PER_PORT(pdev) : VNICS_PER_PATH(pdev));
1515d14abf15SRobert Mustacchi     ecore_init_rx_mode_obj(pdev, &pdev->slowpath_info.rx_mode_obj);
1516d14abf15SRobert Mustacchi 
1517d14abf15SRobert Mustacchi     for (lm_cli_idx=0; lm_cli_idx < ARRSIZE(pdev->slowpath_info.mcast_obj); lm_cli_idx++)
1518d14abf15SRobert Mustacchi     {
1519d14abf15SRobert Mustacchi         ecore_init_mcast_obj(pdev,
1520d14abf15SRobert Mustacchi                              &pdev->slowpath_info.mcast_obj[lm_cli_idx],
1521d14abf15SRobert Mustacchi                              LM_FW_CLI_ID(pdev, pdev->params.map_client_to_cid[lm_cli_idx]),
1522d14abf15SRobert Mustacchi                              pdev->params.map_client_to_cid[lm_cli_idx],
1523d14abf15SRobert Mustacchi                              FUNC_ID(pdev),
1524d14abf15SRobert Mustacchi                              FUNC_ID(pdev),
1525d14abf15SRobert Mustacchi                              LM_SLOWPATH(pdev, mcast_rdata)[lm_cli_idx],
1526d14abf15SRobert Mustacchi                              LM_SLOWPATH_PHYS(pdev, mcast_rdata)[lm_cli_idx],
1527d14abf15SRobert Mustacchi                              ECORE_FILTER_MCAST_PENDING,
1528d14abf15SRobert Mustacchi                              (unsigned long *)&pdev->slowpath_info.sp_mcast_state[lm_cli_idx],
1529d14abf15SRobert Mustacchi                              ECORE_OBJ_TYPE_RX_TX);
1530d14abf15SRobert Mustacchi     }
1531d14abf15SRobert Mustacchi 
1532d14abf15SRobert Mustacchi     ecore_init_rss_config_obj(pdev,
1533d14abf15SRobert Mustacchi                               &pdev->slowpath_info.rss_conf_obj,
1534d14abf15SRobert Mustacchi                               LM_FW_CLI_ID(pdev, LM_SW_LEADING_RSS_CID(pdev)),
1535d14abf15SRobert Mustacchi                               LM_SW_LEADING_RSS_CID(pdev),
1536d14abf15SRobert Mustacchi                               FUNC_ID(pdev),
1537d14abf15SRobert Mustacchi                               FUNC_ID(pdev),
1538d14abf15SRobert Mustacchi                               LM_SLOWPATH(pdev, rss_rdata),
1539d14abf15SRobert Mustacchi                               LM_SLOWPATH_PHYS(pdev, rss_rdata),
1540d14abf15SRobert Mustacchi                               ECORE_FILTER_RSS_CONF_PENDING,
1541d14abf15SRobert Mustacchi                               (unsigned long *)&pdev->slowpath_info.sp_rss_state,
1542d14abf15SRobert Mustacchi                               ECORE_OBJ_TYPE_RX);
1543d14abf15SRobert Mustacchi 
1544d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
1545d14abf15SRobert Mustacchi }
1546d14abf15SRobert Mustacchi 
1547d14abf15SRobert Mustacchi /**
1548d14abf15SRobert Mustacchi  * Description:
1549d14abf15SRobert Mustacchi  *   allocate slowpath resources
1550d14abf15SRobert Mustacchi  */
1551d14abf15SRobert Mustacchi static lm_status_t
lm_alloc_setup_slowpath_resc(struct _lm_device_t * pdev,u8_t b_alloc)1552d14abf15SRobert Mustacchi lm_alloc_setup_slowpath_resc(struct _lm_device_t *pdev , u8_t b_alloc)
1553d14abf15SRobert Mustacchi {
1554d14abf15SRobert Mustacchi     lm_slowpath_data_t *slowpath_data = &pdev->slowpath_info.slowpath_data;
1555d14abf15SRobert Mustacchi     u8_t                i             = 0;
1556d14abf15SRobert Mustacchi 
1557d14abf15SRobert Mustacchi     ASSERT_STATIC(ARRSIZE(slowpath_data->mac_rdata) == ARRSIZE(slowpath_data->rx_mode_rdata));
1558d14abf15SRobert Mustacchi     ASSERT_STATIC(ARRSIZE(slowpath_data->mac_rdata) == ARRSIZE(slowpath_data->mcast_rdata));
1559d14abf15SRobert Mustacchi 
1560d14abf15SRobert Mustacchi     for (i = 0; i < ARRSIZE(slowpath_data->mac_rdata); i++ )
1561d14abf15SRobert Mustacchi     {
1562d14abf15SRobert Mustacchi         if (b_alloc)
1563d14abf15SRobert Mustacchi     {
1564d14abf15SRobert Mustacchi             slowpath_data->mac_rdata[i] =
1565d14abf15SRobert Mustacchi                 mm_alloc_phys_mem(pdev,
1566d14abf15SRobert Mustacchi                                   sizeof(*slowpath_data->mac_rdata[i]),
1567d14abf15SRobert Mustacchi                                   &slowpath_data->mac_rdata_phys[i],
1568d14abf15SRobert Mustacchi                                   0,
1569d14abf15SRobert Mustacchi                                   LM_RESOURCE_COMMON);
1570d14abf15SRobert Mustacchi 
1571d14abf15SRobert Mustacchi             slowpath_data->rx_mode_rdata[i] =
1572d14abf15SRobert Mustacchi                 mm_alloc_phys_mem(pdev,
1573d14abf15SRobert Mustacchi                                   sizeof(*slowpath_data->rx_mode_rdata[i]),
1574d14abf15SRobert Mustacchi                                   &slowpath_data->rx_mode_rdata_phys[i],
1575d14abf15SRobert Mustacchi                                   0,
1576d14abf15SRobert Mustacchi                                   LM_RESOURCE_COMMON);
1577d14abf15SRobert Mustacchi 
1578d14abf15SRobert Mustacchi             slowpath_data->mcast_rdata[i] =
1579d14abf15SRobert Mustacchi                 mm_alloc_phys_mem(pdev,
1580d14abf15SRobert Mustacchi                                   sizeof(*slowpath_data->mcast_rdata[i]),
1581d14abf15SRobert Mustacchi                                   &slowpath_data->mcast_rdata_phys[i],
1582d14abf15SRobert Mustacchi                                   0,
1583d14abf15SRobert Mustacchi                                   LM_RESOURCE_COMMON);
1584d14abf15SRobert Mustacchi 
1585d14abf15SRobert Mustacchi 
1586d14abf15SRobert Mustacchi     }
1587d14abf15SRobert Mustacchi 
1588d14abf15SRobert Mustacchi         if (CHK_NULL(slowpath_data->mac_rdata[i]) ||
1589d14abf15SRobert Mustacchi             CHK_NULL(slowpath_data->rx_mode_rdata[i]) ||
1590d14abf15SRobert Mustacchi             CHK_NULL(slowpath_data->mcast_rdata[i]))
1591d14abf15SRobert Mustacchi 
1592d14abf15SRobert Mustacchi         {
1593d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1594d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
1595d14abf15SRobert Mustacchi         }
1596d14abf15SRobert Mustacchi 
1597d14abf15SRobert Mustacchi         mm_mem_zero(slowpath_data->mac_rdata[i], sizeof(*slowpath_data->mac_rdata[i]));
1598d14abf15SRobert Mustacchi         mm_mem_zero(slowpath_data->rx_mode_rdata[i], sizeof(*slowpath_data->rx_mode_rdata[i]));
1599d14abf15SRobert Mustacchi         mm_mem_zero(slowpath_data->mcast_rdata[i], sizeof(*slowpath_data->mcast_rdata[i]));
1600d14abf15SRobert Mustacchi     }
1601d14abf15SRobert Mustacchi 
1602d14abf15SRobert Mustacchi     if (b_alloc)
1603d14abf15SRobert Mustacchi     {
1604d14abf15SRobert Mustacchi         slowpath_data->rss_rdata  = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->rss_rdata), &slowpath_data->rss_rdata_phys, 0, LM_RESOURCE_COMMON);
1605d14abf15SRobert Mustacchi     }
1606d14abf15SRobert Mustacchi 
1607d14abf15SRobert Mustacchi     if CHK_NULL(slowpath_data->rss_rdata)
1608d14abf15SRobert Mustacchi     {
1609d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1610d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1611d14abf15SRobert Mustacchi     }
1612d14abf15SRobert Mustacchi 
1613d14abf15SRobert Mustacchi     mm_mem_zero(slowpath_data->rss_rdata, sizeof(*slowpath_data->rss_rdata));
1614d14abf15SRobert Mustacchi 
1615d14abf15SRobert Mustacchi     if (b_alloc)
1616d14abf15SRobert Mustacchi     {
1617d14abf15SRobert Mustacchi         slowpath_data->func_start_data  = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->func_start_data), &slowpath_data->func_start_data_phys, 0, LM_RESOURCE_COMMON);
1618d14abf15SRobert Mustacchi     }
1619d14abf15SRobert Mustacchi 
1620d14abf15SRobert Mustacchi     if CHK_NULL(slowpath_data->func_start_data)
1621d14abf15SRobert Mustacchi     {
1622d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1623d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1624d14abf15SRobert Mustacchi     }
1625d14abf15SRobert Mustacchi 
1626d14abf15SRobert Mustacchi     mm_mem_zero(slowpath_data->func_start_data, sizeof(*slowpath_data->func_start_data));
1627d14abf15SRobert Mustacchi 
1628d14abf15SRobert Mustacchi     if (b_alloc)
1629d14abf15SRobert Mustacchi     {
1630d14abf15SRobert Mustacchi         slowpath_data->niv_function_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->niv_function_update_data), &slowpath_data->niv_function_update_data_phys, 0, LM_RESOURCE_COMMON);
1631d14abf15SRobert Mustacchi     }
1632d14abf15SRobert Mustacchi     if CHK_NULL(slowpath_data->niv_function_update_data)
1633d14abf15SRobert Mustacchi     {
1634d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1635d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1636d14abf15SRobert Mustacchi     }
1637d14abf15SRobert Mustacchi     mm_mem_zero(slowpath_data->niv_function_update_data, sizeof(*slowpath_data->niv_function_update_data));
1638d14abf15SRobert Mustacchi 
1639d14abf15SRobert Mustacchi     if (b_alloc)
1640d14abf15SRobert Mustacchi     {
1641d14abf15SRobert Mustacchi         slowpath_data->l2mp_func_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->l2mp_func_update_data), &slowpath_data->l2mp_func_update_data_phys, 0, LM_RESOURCE_COMMON);
1642d14abf15SRobert Mustacchi     }
1643d14abf15SRobert Mustacchi     if CHK_NULL(slowpath_data->l2mp_func_update_data)
1644d14abf15SRobert Mustacchi     {
1645d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1646d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1647d14abf15SRobert Mustacchi     }
1648d14abf15SRobert Mustacchi     mm_mem_zero(slowpath_data->l2mp_func_update_data, sizeof(*slowpath_data->l2mp_func_update_data));
1649d14abf15SRobert Mustacchi 
1650d14abf15SRobert Mustacchi     if (b_alloc)
1651d14abf15SRobert Mustacchi     {
1652d14abf15SRobert Mustacchi         slowpath_data->encap_function_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->encap_function_update_data), &slowpath_data->encap_function_update_data_phys, 0, LM_RESOURCE_COMMON);
1653d14abf15SRobert Mustacchi     }
1654d14abf15SRobert Mustacchi     if CHK_NULL(slowpath_data->encap_function_update_data)
1655d14abf15SRobert Mustacchi     {
1656d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1657d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1658d14abf15SRobert Mustacchi     }
1659d14abf15SRobert Mustacchi     mm_mem_zero(slowpath_data->encap_function_update_data, sizeof(*slowpath_data->encap_function_update_data));
1660d14abf15SRobert Mustacchi 
1661d14abf15SRobert Mustacchi     if (b_alloc)
1662d14abf15SRobert Mustacchi     {
1663d14abf15SRobert Mustacchi         slowpath_data->ufp_function_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->ufp_function_update_data), &slowpath_data->ufp_function_update_data_phys, 0, LM_RESOURCE_COMMON);
1664d14abf15SRobert Mustacchi     }
1665d14abf15SRobert Mustacchi     if CHK_NULL(slowpath_data->ufp_function_update_data)
1666d14abf15SRobert Mustacchi     {
1667d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1668d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1669d14abf15SRobert Mustacchi     }
1670d14abf15SRobert Mustacchi     mm_mem_zero(slowpath_data->ufp_function_update_data, sizeof(*slowpath_data->ufp_function_update_data));
1671d14abf15SRobert Mustacchi 
1672d14abf15SRobert Mustacchi     pdev->slowpath_info.niv_ramrod_state                              = NIV_RAMROD_NOT_POSTED;
1673d14abf15SRobert Mustacchi     pdev->slowpath_info.l2mp_func_update_ramrod_state                 = L2MP_FUNC_UPDATE_RAMROD_NOT_POSTED;
1674d14abf15SRobert Mustacchi     pdev->slowpath_info.ufp_func_ramrod_state                         = UFP_RAMROD_NOT_POSTED;
1675d14abf15SRobert Mustacchi 
1676d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS ;
1677d14abf15SRobert Mustacchi }
1678d14abf15SRobert Mustacchi 
1679d14abf15SRobert Mustacchi 
lm_setup_allocate_ilt_client_page(struct _lm_device_t * pdev,lm_address_t * phys_mem,u8_t const cli_idx)1680d14abf15SRobert Mustacchi static void * lm_setup_allocate_ilt_client_page( struct _lm_device_t *pdev,
1681d14abf15SRobert Mustacchi     lm_address_t        *phys_mem,
1682d14abf15SRobert Mustacchi                                                  u8_t const          cli_idx )
1683d14abf15SRobert Mustacchi {
1684d14abf15SRobert Mustacchi     void* ilt_client_page_virt_address = NULL;
1685d14abf15SRobert Mustacchi 
1686d14abf15SRobert Mustacchi     if (!CHIP_IS_E1(pdev))
1687d14abf15SRobert Mustacchi     {
1688d14abf15SRobert Mustacchi         ilt_client_page_virt_address = mm_alloc_phys_mem_align( pdev,
1689d14abf15SRobert Mustacchi                                                                    pdev->params.ilt_client_page_size,
1690d14abf15SRobert Mustacchi                                                                    phys_mem,
1691d14abf15SRobert Mustacchi                                                                    LM_ILT_ALIGNMENT,
1692d14abf15SRobert Mustacchi                                                                    0,
1693d14abf15SRobert Mustacchi                                                                    cli_idx);
1694d14abf15SRobert Mustacchi     }
1695d14abf15SRobert Mustacchi     else
1696d14abf15SRobert Mustacchi     {
1697d14abf15SRobert Mustacchi         ilt_client_page_virt_address = mm_alloc_phys_mem_align(pdev,
1698d14abf15SRobert Mustacchi                                                                    pdev->params.ilt_client_page_size,
1699d14abf15SRobert Mustacchi                                                                    phys_mem,
1700d14abf15SRobert Mustacchi                                                                    pdev->params.ilt_client_page_size,
1701d14abf15SRobert Mustacchi                                                                    0,
1702d14abf15SRobert Mustacchi                                                                    cli_idx);
1703d14abf15SRobert Mustacchi     }
1704d14abf15SRobert Mustacchi 
1705d14abf15SRobert Mustacchi     return ilt_client_page_virt_address;
1706d14abf15SRobert Mustacchi }
1707d14abf15SRobert Mustacchi 
1708d14abf15SRobert Mustacchi /* Description:
1709d14abf15SRobert Mustacchi *    This routine contain common code for alloc/setup distinguish by flag
1710d14abf15SRobert Mustacchi */
lm_common_setup_alloc_resc(struct _lm_device_t * pdev,u8_t const b_is_alloc)1711d14abf15SRobert Mustacchi lm_status_t lm_common_setup_alloc_resc(struct _lm_device_t *pdev, u8_t const b_is_alloc )
1712d14abf15SRobert Mustacchi {
1713d14abf15SRobert Mustacchi     lm_params_t*    params     = NULL ;
1714d14abf15SRobert Mustacchi     lm_variables_t* vars       = NULL ;
1715d14abf15SRobert Mustacchi //    lm_sq_info_t*   sq_info    = NULL ;
1716d14abf15SRobert Mustacchi     lm_status_t     lm_status;
1717d14abf15SRobert Mustacchi     u32_t           alloc_size = 0 ;
1718d14abf15SRobert Mustacchi     u32_t           alloc_num  = 0 ;
1719d14abf15SRobert Mustacchi     u32_t           i          = 0 ;
1720d14abf15SRobert Mustacchi     u32_t           mem_size   = 0 ;
1721d14abf15SRobert Mustacchi     u8_t            sb_id      = 0 ;
1722d14abf15SRobert Mustacchi     u8_t            mm_cli_idx = 0 ;
1723d14abf15SRobert Mustacchi     lm_address_t    sb_phy_address;
1724d14abf15SRobert Mustacchi 
1725d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
1726d14abf15SRobert Mustacchi     {
1727d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
1728d14abf15SRobert Mustacchi     }
1729d14abf15SRobert Mustacchi 
1730d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi , "### lm_common_setup_alloc_resc b_is_alloc=%s\n", b_is_alloc ? "TRUE" : "FALSE" );
1731d14abf15SRobert Mustacchi 
1732d14abf15SRobert Mustacchi     params     = &pdev->params ;
1733d14abf15SRobert Mustacchi     vars       = &(pdev->vars) ;
1734d14abf15SRobert Mustacchi 
1735d14abf15SRobert Mustacchi     //       Status blocks allocation. We allocate mem both for the default and non-default status blocks
1736d14abf15SRobert Mustacchi     //       there is 1 def sb and 16 non-def sb per port.
1737d14abf15SRobert Mustacchi     //       non-default sb: index 0-15, default sb: index 16.
1738d14abf15SRobert Mustacchi     if (CHIP_IS_E1x(pdev))
1739d14abf15SRobert Mustacchi     {
1740d14abf15SRobert Mustacchi         mem_size = E1X_STATUS_BLOCK_BUFFER_SIZE;
1741d14abf15SRobert Mustacchi     }
1742d14abf15SRobert Mustacchi     else
1743d14abf15SRobert Mustacchi     {
1744d14abf15SRobert Mustacchi         mem_size = E2_STATUS_BLOCK_BUFFER_SIZE;
1745d14abf15SRobert Mustacchi     }
1746d14abf15SRobert Mustacchi 
1747d14abf15SRobert Mustacchi     mm_cli_idx = LM_RESOURCE_COMMON;//!!DP mm_cli_idx_to_um_idx(LM_CLI_IDX_MAX);
1748d14abf15SRobert Mustacchi 
1749d14abf15SRobert Mustacchi     LM_FOREACH_SB_ID(pdev, sb_id)
1750d14abf15SRobert Mustacchi     {
1751d14abf15SRobert Mustacchi         if( b_is_alloc )
1752d14abf15SRobert Mustacchi         {
1753d14abf15SRobert Mustacchi             vars->status_blocks_arr[sb_id].host_hc_status_block.e1x_sb = mm_alloc_phys_mem(pdev, mem_size, &sb_phy_address, 0, mm_cli_idx);
1754d14abf15SRobert Mustacchi             if (CHIP_IS_E1x(pdev))
1755d14abf15SRobert Mustacchi             {
1756d14abf15SRobert Mustacchi                 vars->status_blocks_arr[sb_id].hc_status_block_data.e1x_sb_data.common.host_sb_addr.lo = sb_phy_address.as_u32.low;
1757d14abf15SRobert Mustacchi                 vars->status_blocks_arr[sb_id].hc_status_block_data.e1x_sb_data.common.host_sb_addr.hi = sb_phy_address.as_u32.high;
1758d14abf15SRobert Mustacchi             }
1759d14abf15SRobert Mustacchi             else
1760d14abf15SRobert Mustacchi             {
1761d14abf15SRobert Mustacchi                 vars->status_blocks_arr[sb_id].hc_status_block_data.e2_sb_data.common.host_sb_addr.lo = sb_phy_address.as_u32.low;
1762d14abf15SRobert Mustacchi                 vars->status_blocks_arr[sb_id].hc_status_block_data.e2_sb_data.common.host_sb_addr.hi = sb_phy_address.as_u32.high;
1763d14abf15SRobert Mustacchi             }
1764d14abf15SRobert Mustacchi         }
1765d14abf15SRobert Mustacchi         if CHK_NULL(vars->status_blocks_arr[sb_id].host_hc_status_block.e1x_sb)
1766d14abf15SRobert Mustacchi         {
1767d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1768d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
1769d14abf15SRobert Mustacchi         }
1770d14abf15SRobert Mustacchi         mm_mem_zero((void *)(vars->status_blocks_arr[sb_id].host_hc_status_block.e1x_sb), mem_size);
1771d14abf15SRobert Mustacchi     }
1772d14abf15SRobert Mustacchi 
1773d14abf15SRobert Mustacchi     mem_size = DEF_STATUS_BLOCK_BUFFER_SIZE;
1774d14abf15SRobert Mustacchi 
1775d14abf15SRobert Mustacchi 
1776d14abf15SRobert Mustacchi     if( b_is_alloc )
1777d14abf15SRobert Mustacchi     {
1778d14abf15SRobert Mustacchi         vars->gen_sp_status_block.hc_sp_status_blk = mm_alloc_phys_mem(pdev,
1779d14abf15SRobert Mustacchi                                                     mem_size,
1780d14abf15SRobert Mustacchi                                                     &(vars->gen_sp_status_block.blk_phy_address),
1781d14abf15SRobert Mustacchi                                                     0,
1782d14abf15SRobert Mustacchi                                                     mm_cli_idx);
1783d14abf15SRobert Mustacchi     }
1784d14abf15SRobert Mustacchi 
1785d14abf15SRobert Mustacchi     if CHK_NULL(vars->gen_sp_status_block.hc_sp_status_blk)
1786d14abf15SRobert Mustacchi     {
1787d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1788d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1789d14abf15SRobert Mustacchi     }
1790d14abf15SRobert Mustacchi 
1791d14abf15SRobert Mustacchi     mm_mem_zero((void *)(vars->gen_sp_status_block.hc_sp_status_blk), mem_size);
1792d14abf15SRobert Mustacchi 
1793d14abf15SRobert Mustacchi     /* Now reset the status-block ack values back to zero. */
1794d14abf15SRobert Mustacchi     lm_reset_sb_ack_values(pdev);
1795d14abf15SRobert Mustacchi 
1796d14abf15SRobert Mustacchi     mm_mem_zero(pdev->debug_info.ack_dis,     sizeof(pdev->debug_info.ack_dis));
1797d14abf15SRobert Mustacchi     mm_mem_zero(pdev->debug_info.ack_en,      sizeof(pdev->debug_info.ack_en));
1798d14abf15SRobert Mustacchi     pdev->debug_info.ack_def_dis = pdev->debug_info.ack_def_en = 0;
1799d14abf15SRobert Mustacchi     mm_mem_zero(pdev->debug_info.rx_only_int, sizeof(pdev->debug_info.rx_only_int));
1800d14abf15SRobert Mustacchi     mm_mem_zero(pdev->debug_info.tx_only_int, sizeof(pdev->debug_info.tx_only_int));
1801d14abf15SRobert Mustacchi     mm_mem_zero(pdev->debug_info.both_int,    sizeof(pdev->debug_info.both_int));
1802d14abf15SRobert Mustacchi     mm_mem_zero(pdev->debug_info.empty_int,   sizeof(pdev->debug_info.empty_int));
1803d14abf15SRobert Mustacchi     mm_mem_zero(pdev->debug_info.false_int,   sizeof(pdev->debug_info.false_int));
1804d14abf15SRobert Mustacchi 
1805d14abf15SRobert Mustacchi     /* Register common and ethernet connection types completion callback. */
1806d14abf15SRobert Mustacchi     lm_sq_comp_cb_register(pdev, ETH_CONNECTION_TYPE, lm_eth_comp_cb);
1807d14abf15SRobert Mustacchi     lm_sq_comp_cb_register(pdev, NONE_CONNECTION_TYPE, lm_eq_comp_cb);
1808d14abf15SRobert Mustacchi 
1809d14abf15SRobert Mustacchi     /* SlowPath Info */
1810d14abf15SRobert Mustacchi     lm_status = lm_alloc_setup_slowpath_resc(pdev, b_is_alloc);
1811d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1812d14abf15SRobert Mustacchi     {
1813d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_alloc_client_info failed lm-status = %d\n", lm_status);
1814d14abf15SRobert Mustacchi         return lm_status;
1815d14abf15SRobert Mustacchi     }
1816d14abf15SRobert Mustacchi 
1817d14abf15SRobert Mustacchi 
1818d14abf15SRobert Mustacchi     /* Client Info */
1819d14abf15SRobert Mustacchi     if( b_is_alloc )
1820d14abf15SRobert Mustacchi     {
1821d14abf15SRobert Mustacchi         lm_status = lm_alloc_client_info(pdev);
1822d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1823d14abf15SRobert Mustacchi         {
1824d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_alloc_client_info failed lm-status = %d\n", lm_status);
1825d14abf15SRobert Mustacchi             return lm_status;
1826d14abf15SRobert Mustacchi         }
1827d14abf15SRobert Mustacchi     }
1828d14abf15SRobert Mustacchi 
1829d14abf15SRobert Mustacchi     lm_status = lm_setup_client_info(pdev);
1830d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1831d14abf15SRobert Mustacchi     {
1832d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_setup_client_info failed lm-status = %d\n", lm_status);
1833d14abf15SRobert Mustacchi         return lm_status;
1834d14abf15SRobert Mustacchi     }
1835d14abf15SRobert Mustacchi 
1836d14abf15SRobert Mustacchi     //  Context (roundup ( MAX_CONN / CONN_PER_PAGE) We may configure the CDU to have more than max_func_connections, specifically, we will
1837d14abf15SRobert Mustacchi     // configure the CDU to have max_port_connections since it is a per-port register and not per-func, but it is OK to allocate
1838d14abf15SRobert Mustacchi     // less for the cdu, and allocate only what will be used in practice - which is what is configured in max_func_connectinos.
1839d14abf15SRobert Mustacchi     alloc_num = vars->context_cdu_num_pages = (params->max_func_connections / params->num_context_in_page) +
1840d14abf15SRobert Mustacchi         ((params->max_func_connections % params->num_context_in_page)? 1:0);
1841d14abf15SRobert Mustacchi 
1842d14abf15SRobert Mustacchi     //TODO: optimize the roundup
1843d14abf15SRobert Mustacchi     //TODO: assert that we did not go over the limit
1844d14abf15SRobert Mustacchi 
1845d14abf15SRobert Mustacchi     // allocate buffer pointers
1846d14abf15SRobert Mustacchi     if( b_is_alloc )
1847d14abf15SRobert Mustacchi     {
1848d14abf15SRobert Mustacchi         mem_size = alloc_num * sizeof(void *) ;
1849d14abf15SRobert Mustacchi         vars->context_cdu_virt_addr_table = (void **) mm_alloc_mem( pdev, mem_size, mm_cli_idx );
1850d14abf15SRobert Mustacchi     }
1851d14abf15SRobert Mustacchi     if CHK_NULL( vars->context_cdu_virt_addr_table )
1852d14abf15SRobert Mustacchi     {
1853d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1854d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1855d14abf15SRobert Mustacchi     }
1856d14abf15SRobert Mustacchi     else if ( b_is_alloc )
1857d14abf15SRobert Mustacchi     {
1858d14abf15SRobert Mustacchi         mm_mem_zero( vars->context_cdu_virt_addr_table, mem_size ) ;
1859d14abf15SRobert Mustacchi     }
1860d14abf15SRobert Mustacchi 
1861d14abf15SRobert Mustacchi     if( b_is_alloc )
1862d14abf15SRobert Mustacchi     {
1863d14abf15SRobert Mustacchi         mem_size = alloc_num * sizeof(lm_address_t) ;
1864d14abf15SRobert Mustacchi         vars->context_cdu_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
1865d14abf15SRobert Mustacchi     }
1866d14abf15SRobert Mustacchi 
1867d14abf15SRobert Mustacchi     if CHK_NULL( vars->context_cdu_phys_addr_table )
1868d14abf15SRobert Mustacchi     {
1869d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1870d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1871d14abf15SRobert Mustacchi     }
1872d14abf15SRobert Mustacchi     else if ( b_is_alloc )
1873d14abf15SRobert Mustacchi     {
1874d14abf15SRobert Mustacchi         mm_mem_zero(vars->context_cdu_phys_addr_table, mem_size );
1875d14abf15SRobert Mustacchi     }
1876d14abf15SRobert Mustacchi 
1877d14abf15SRobert Mustacchi     /* TBD: for starters, we'll just allocate each page seperatly, to save space in the future, we may want */
1878d14abf15SRobert Mustacchi     for( i = 0  ;i < alloc_num; i++)
1879d14abf15SRobert Mustacchi     {
1880d14abf15SRobert Mustacchi         if( b_is_alloc )
1881d14abf15SRobert Mustacchi         {
1882d14abf15SRobert Mustacchi             vars->context_cdu_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
1883d14abf15SRobert Mustacchi                                                                                      (lm_address_t*)&vars->context_cdu_phys_addr_table[i],
1884d14abf15SRobert Mustacchi                                                          mm_cli_idx);
1885d14abf15SRobert Mustacchi         }
1886d14abf15SRobert Mustacchi         if CHK_NULL( vars->context_cdu_virt_addr_table[i] )
1887d14abf15SRobert Mustacchi         {
1888d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1889d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
1890d14abf15SRobert Mustacchi         }
1891d14abf15SRobert Mustacchi         mm_mem_zero( vars->context_cdu_virt_addr_table[i], params->ilt_client_page_size ) ;
1892d14abf15SRobert Mustacchi     }
1893d14abf15SRobert Mustacchi 
1894d14abf15SRobert Mustacchi 
1895d14abf15SRobert Mustacchi     //  Searcher T1  (roundup to log2 of 64*MAX_CONN), T2 is 1/4 of T1. The searcher has a 'per-function' register we configure
1896d14abf15SRobert Mustacchi     // with the number of max connections, therefore, we use the max_func_connections. It can be different per function and independent
1897d14abf15SRobert Mustacchi     // from what we configure for qm/timers/cdu.
1898d14abf15SRobert Mustacchi     alloc_size = (log2_align(max(params->max_func_connections,(u32_t)1000))*64);
1899d14abf15SRobert Mustacchi     alloc_num = vars->searcher_t1_num_pages = max((alloc_size / params->ilt_client_page_size),(u32_t)1);
1900d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(void *) ;
1901d14abf15SRobert Mustacchi 
1902d14abf15SRobert Mustacchi     if( b_is_alloc )
1903d14abf15SRobert Mustacchi     {
1904d14abf15SRobert Mustacchi         vars->searcher_t1_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx);
1905d14abf15SRobert Mustacchi     }
1906d14abf15SRobert Mustacchi     if CHK_NULL(vars->searcher_t1_virt_addr_table)
1907d14abf15SRobert Mustacchi     {
1908d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1909d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1910d14abf15SRobert Mustacchi     }
1911d14abf15SRobert Mustacchi     else if ( b_is_alloc )
1912d14abf15SRobert Mustacchi     {
1913d14abf15SRobert Mustacchi         mm_mem_zero( vars->searcher_t1_virt_addr_table, mem_size ) ;
1914d14abf15SRobert Mustacchi     }
1915d14abf15SRobert Mustacchi 
1916d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(lm_address_t) ;
1917d14abf15SRobert Mustacchi 
1918d14abf15SRobert Mustacchi     if( b_is_alloc )
1919d14abf15SRobert Mustacchi     {
1920d14abf15SRobert Mustacchi         vars->searcher_t1_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
1921d14abf15SRobert Mustacchi     }
1922d14abf15SRobert Mustacchi     if CHK_NULL(vars->searcher_t1_phys_addr_table)
1923d14abf15SRobert Mustacchi     {
1924d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1925d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1926d14abf15SRobert Mustacchi     }
1927d14abf15SRobert Mustacchi     else if ( b_is_alloc )
1928d14abf15SRobert Mustacchi     {
1929d14abf15SRobert Mustacchi         mm_mem_zero( vars->searcher_t1_phys_addr_table, mem_size ) ;
1930d14abf15SRobert Mustacchi     }
1931d14abf15SRobert Mustacchi 
1932d14abf15SRobert Mustacchi     for( i = 0  ; i < alloc_num; i++ )
1933d14abf15SRobert Mustacchi     {
1934d14abf15SRobert Mustacchi         if( b_is_alloc )
1935d14abf15SRobert Mustacchi         {
1936d14abf15SRobert Mustacchi             vars->searcher_t1_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
1937d14abf15SRobert Mustacchi                                                          (lm_address_t*)&(vars->searcher_t1_phys_addr_table[i]),
1938d14abf15SRobert Mustacchi                                                          mm_cli_idx);
1939d14abf15SRobert Mustacchi         }
1940d14abf15SRobert Mustacchi         if CHK_NULL( vars->searcher_t1_virt_addr_table[i] )
1941d14abf15SRobert Mustacchi         {
1942d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1943d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
1944d14abf15SRobert Mustacchi         }
1945d14abf15SRobert Mustacchi         mm_mem_zero( vars->searcher_t1_virt_addr_table[i], params->ilt_client_page_size ) ;
1946d14abf15SRobert Mustacchi     }
1947d14abf15SRobert Mustacchi 
1948d14abf15SRobert Mustacchi     // allocate searcher T2 table
1949d14abf15SRobert Mustacchi     // T2 does not entered into the ILT)
1950d14abf15SRobert Mustacchi     alloc_size = (params->max_func_connections + 4)*64;
1951d14abf15SRobert Mustacchi     alloc_num = vars->searcher_t2_num_pages = alloc_size / params->ilt_client_page_size +
1952d14abf15SRobert Mustacchi         ((alloc_size % params->ilt_client_page_size)? 1:0) ;
1953d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(void *) ;
1954d14abf15SRobert Mustacchi 
1955d14abf15SRobert Mustacchi     if ( b_is_alloc )
1956d14abf15SRobert Mustacchi     {
1957d14abf15SRobert Mustacchi         vars->searcher_t2_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx) ;
1958d14abf15SRobert Mustacchi     }
1959d14abf15SRobert Mustacchi     if CHK_NULL(vars->searcher_t2_virt_addr_table)
1960d14abf15SRobert Mustacchi     {
1961d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1962d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1963d14abf15SRobert Mustacchi     }
1964d14abf15SRobert Mustacchi     else if (b_is_alloc)
1965d14abf15SRobert Mustacchi     {
1966d14abf15SRobert Mustacchi         mm_mem_zero( vars->searcher_t2_virt_addr_table, mem_size ) ;
1967d14abf15SRobert Mustacchi     }
1968d14abf15SRobert Mustacchi 
1969d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(lm_address_t) ;
1970d14abf15SRobert Mustacchi     if (b_is_alloc)
1971d14abf15SRobert Mustacchi     {
1972d14abf15SRobert Mustacchi         vars->searcher_t2_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
1973d14abf15SRobert Mustacchi     }
1974d14abf15SRobert Mustacchi     if CHK_NULL(vars->searcher_t2_phys_addr_table)
1975d14abf15SRobert Mustacchi     {
1976d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1977d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
1978d14abf15SRobert Mustacchi     }
1979d14abf15SRobert Mustacchi 
1980d14abf15SRobert Mustacchi     for( i = 0  ; i < alloc_num; i++)
1981d14abf15SRobert Mustacchi     {
1982d14abf15SRobert Mustacchi         if (b_is_alloc )
1983d14abf15SRobert Mustacchi         {
1984d14abf15SRobert Mustacchi             vars->searcher_t2_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
1985d14abf15SRobert Mustacchi                                                          (lm_address_t*)&(vars->searcher_t2_phys_addr_table[i]),
1986d14abf15SRobert Mustacchi                                                          mm_cli_idx);
1987d14abf15SRobert Mustacchi         }
1988d14abf15SRobert Mustacchi         if CHK_NULL(vars->searcher_t2_virt_addr_table[i])
1989d14abf15SRobert Mustacchi         {
1990d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
1991d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
1992d14abf15SRobert Mustacchi         }
1993d14abf15SRobert Mustacchi         mm_mem_zero( vars->searcher_t2_virt_addr_table[i],params->ilt_client_page_size ) ;
1994d14abf15SRobert Mustacchi     }
1995d14abf15SRobert Mustacchi 
1996d14abf15SRobert Mustacchi     //  Timer block array (MAX_CONN*8) phys uncached. Timer block has a per-port register that defines it's size, and the amount of
1997d14abf15SRobert Mustacchi     // memory we allocate MUST match this number, therefore we have to allocate the amount of max_port_connections.
1998d14abf15SRobert Mustacchi     alloc_size = ( 8 * pdev->hw_info.max_port_conns);
1999d14abf15SRobert Mustacchi     alloc_num = vars->timers_linear_num_pages = alloc_size / params->ilt_client_page_size +
2000d14abf15SRobert Mustacchi         ((alloc_size % params->ilt_client_page_size)? 1:0) ;
2001d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(void *) ;
2002d14abf15SRobert Mustacchi 
2003d14abf15SRobert Mustacchi     if( b_is_alloc )
2004d14abf15SRobert Mustacchi     {
2005d14abf15SRobert Mustacchi         vars->timers_linear_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx );
2006d14abf15SRobert Mustacchi     }
2007d14abf15SRobert Mustacchi     if CHK_NULL(vars->timers_linear_virt_addr_table)
2008d14abf15SRobert Mustacchi     {
2009d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
2010d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
2011d14abf15SRobert Mustacchi     }
2012d14abf15SRobert Mustacchi     else if ( b_is_alloc )
2013d14abf15SRobert Mustacchi     {
2014d14abf15SRobert Mustacchi         mm_mem_zero( vars->timers_linear_virt_addr_table, mem_size ) ;
2015d14abf15SRobert Mustacchi     }
2016d14abf15SRobert Mustacchi 
2017d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(lm_address_t) ;
2018d14abf15SRobert Mustacchi 
2019d14abf15SRobert Mustacchi     if ( b_is_alloc )
2020d14abf15SRobert Mustacchi     {
2021d14abf15SRobert Mustacchi         vars->timers_linear_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
2022d14abf15SRobert Mustacchi     }
2023d14abf15SRobert Mustacchi     if CHK_NULL(vars->timers_linear_phys_addr_table)
2024d14abf15SRobert Mustacchi     {
2025d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
2026d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
2027d14abf15SRobert Mustacchi     }
2028d14abf15SRobert Mustacchi     else if ( b_is_alloc )
2029d14abf15SRobert Mustacchi     {
2030d14abf15SRobert Mustacchi         mm_mem_zero( vars->timers_linear_phys_addr_table, mem_size ) ;
2031d14abf15SRobert Mustacchi     }
2032d14abf15SRobert Mustacchi 
2033d14abf15SRobert Mustacchi     for( i = 0  ;i < alloc_num; i++)
2034d14abf15SRobert Mustacchi     {
2035d14abf15SRobert Mustacchi         if( b_is_alloc )
2036d14abf15SRobert Mustacchi         {
2037d14abf15SRobert Mustacchi             vars->timers_linear_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
2038d14abf15SRobert Mustacchi                                                            (lm_address_t*)&(vars->timers_linear_phys_addr_table[i]),
2039d14abf15SRobert Mustacchi                                                            mm_cli_idx);
2040d14abf15SRobert Mustacchi         }
2041d14abf15SRobert Mustacchi         if CHK_NULL(vars->timers_linear_virt_addr_table[i])
2042d14abf15SRobert Mustacchi         {
2043d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
2044d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
2045d14abf15SRobert Mustacchi         }
2046d14abf15SRobert Mustacchi         mm_mem_zero( vars->timers_linear_virt_addr_table[i], params->ilt_client_page_size ) ;
2047d14abf15SRobert Mustacchi     }
2048d14abf15SRobert Mustacchi 
2049d14abf15SRobert Mustacchi     //  QM queues (128*MAX_CONN) QM has a per-port register that defines it's size, and the amount of
2050d14abf15SRobert Mustacchi     // memory we allocate MUST match this number, therefore we have to allocate the amount of max_port_connections.
2051d14abf15SRobert Mustacchi     alloc_size = ( 128 * pdev->hw_info.max_common_conns);
2052d14abf15SRobert Mustacchi     alloc_num = vars->qm_queues_num_pages = alloc_size / params->ilt_client_page_size +
2053d14abf15SRobert Mustacchi         ((alloc_size % params->ilt_client_page_size)? 1:0) ;
2054d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(void *) ;
2055d14abf15SRobert Mustacchi 
2056d14abf15SRobert Mustacchi     if( b_is_alloc )
2057d14abf15SRobert Mustacchi     {
2058d14abf15SRobert Mustacchi         vars->qm_queues_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx );
2059d14abf15SRobert Mustacchi     }
2060d14abf15SRobert Mustacchi     if CHK_NULL(vars->qm_queues_virt_addr_table)
2061d14abf15SRobert Mustacchi     {
2062d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
2063d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
2064d14abf15SRobert Mustacchi     }
2065d14abf15SRobert Mustacchi     else if (b_is_alloc)
2066d14abf15SRobert Mustacchi     {
2067d14abf15SRobert Mustacchi         mm_mem_zero( vars->qm_queues_virt_addr_table, mem_size ) ;
2068d14abf15SRobert Mustacchi     }
2069d14abf15SRobert Mustacchi 
2070d14abf15SRobert Mustacchi     mem_size = alloc_num * sizeof(lm_address_t) ;
2071d14abf15SRobert Mustacchi 
2072d14abf15SRobert Mustacchi     if( b_is_alloc )
2073d14abf15SRobert Mustacchi     {
2074d14abf15SRobert Mustacchi         vars->qm_queues_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
2075d14abf15SRobert Mustacchi     }
2076d14abf15SRobert Mustacchi     if CHK_NULL(vars->qm_queues_phys_addr_table)
2077d14abf15SRobert Mustacchi     {
2078d14abf15SRobert Mustacchi         DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
2079d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
2080d14abf15SRobert Mustacchi     }
2081d14abf15SRobert Mustacchi     else if (b_is_alloc)
2082d14abf15SRobert Mustacchi     {
2083d14abf15SRobert Mustacchi         mm_mem_zero( vars->qm_queues_phys_addr_table, mem_size ) ;
2084d14abf15SRobert Mustacchi     }
2085d14abf15SRobert Mustacchi 
2086d14abf15SRobert Mustacchi     for( i=0  ;i < alloc_num; i++)
2087d14abf15SRobert Mustacchi     {
2088d14abf15SRobert Mustacchi         if (b_is_alloc)
2089d14abf15SRobert Mustacchi         {
2090d14abf15SRobert Mustacchi             vars->qm_queues_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
2091d14abf15SRobert Mustacchi                                                        (lm_address_t*)&(vars->qm_queues_phys_addr_table[i]),
2092d14abf15SRobert Mustacchi                                                        mm_cli_idx);
2093d14abf15SRobert Mustacchi         }
2094d14abf15SRobert Mustacchi         if CHK_NULL( vars->qm_queues_virt_addr_table[i] )
2095d14abf15SRobert Mustacchi         {
2096d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
2097d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
2098d14abf15SRobert Mustacchi         }
2099d14abf15SRobert Mustacchi         mm_mem_zero( vars->qm_queues_virt_addr_table[i],params->ilt_client_page_size ) ;
2100d14abf15SRobert Mustacchi     }
2101d14abf15SRobert Mustacchi 
2102d14abf15SRobert Mustacchi     // common scratchpad buffer for dmae copies of less than 4 bytes
2103d14abf15SRobert Mustacchi     if( b_is_alloc )
2104d14abf15SRobert Mustacchi     {
2105d14abf15SRobert Mustacchi         void *virt = mm_alloc_phys_mem(pdev,
2106d14abf15SRobert Mustacchi                           8,
2107d14abf15SRobert Mustacchi                           &params->dmae_copy_scratchpad_phys,
2108d14abf15SRobert Mustacchi                           0,
2109d14abf15SRobert Mustacchi                           mm_cli_idx);
2110d14abf15SRobert Mustacchi         if CHK_NULL(virt)
2111d14abf15SRobert Mustacchi         {
2112d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
2113d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
2114d14abf15SRobert Mustacchi         }
2115d14abf15SRobert Mustacchi     }
2116d14abf15SRobert Mustacchi 
2117d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS ;
2118d14abf15SRobert Mustacchi }
2119d14abf15SRobert Mustacchi 
ecore_resc_alloc(struct _lm_device_t * pdev)2120d14abf15SRobert Mustacchi lm_status_t ecore_resc_alloc(struct _lm_device_t * pdev)
2121d14abf15SRobert Mustacchi {
2122d14abf15SRobert Mustacchi     pdev->ecore_info.gunzip_buf = mm_alloc_phys_mem(pdev, FW_BUF_SIZE, &pdev->ecore_info.gunzip_phys, PHYS_MEM_TYPE_NONCACHED, LM_RESOURCE_COMMON);
2123d14abf15SRobert Mustacchi     if CHK_NULL(pdev->ecore_info.gunzip_buf)
2124d14abf15SRobert Mustacchi     {
2125d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE ;
2126d14abf15SRobert Mustacchi     }
2127d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2128d14abf15SRobert Mustacchi }
2129d14abf15SRobert Mustacchi 
2130d14abf15SRobert Mustacchi /**lm_dmae_resc_alloc
2131d14abf15SRobert Mustacchi  * Allocate and initialize the TOE and default DMAE contexts.
2132d14abf15SRobert Mustacchi  * The statistics DMAE context is set-up in lm_stats_alloc_resc.
2133d14abf15SRobert Mustacchi  *
2134d14abf15SRobert Mustacchi  * @param pdev the device to use.
2135d14abf15SRobert Mustacchi  *
2136d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success, some other
2137d14abf15SRobert Mustacchi  *         failure code on failure.
2138d14abf15SRobert Mustacchi  */
lm_dmae_alloc_resc(struct _lm_device_t * pdev)2139d14abf15SRobert Mustacchi static lm_status_t lm_dmae_alloc_resc(struct _lm_device_t * pdev)
2140d14abf15SRobert Mustacchi {
2141d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_FAILURE;
2142d14abf15SRobert Mustacchi     lm_dmae_context_info_t* default_dmae_info = lm_dmae_get(pdev, LM_DMAE_DEFAULT);
2143d14abf15SRobert Mustacchi     lm_dmae_context_info_t* toe_dmae_info = lm_dmae_get(pdev, LM_DMAE_TOE);
2144d14abf15SRobert Mustacchi 
2145d14abf15SRobert Mustacchi     //allocate and initialize the default DMAE context (used for init, WB access etc...)
2146d14abf15SRobert Mustacchi     lm_status = lm_dmae_locking_policy_create(  pdev,
2147d14abf15SRobert Mustacchi                                                 LM_PROTECTED_RESOURCE_DMAE_DEFAULT,
2148d14abf15SRobert Mustacchi                                                 LM_DMAE_LOCKING_POLICY_TYPE_PER_PF,
2149d14abf15SRobert Mustacchi                                                 &default_dmae_info->locking_policy);
2150d14abf15SRobert Mustacchi     if( LM_STATUS_SUCCESS != lm_status )
2151d14abf15SRobert Mustacchi     {
2152d14abf15SRobert Mustacchi         return lm_status ;
2153d14abf15SRobert Mustacchi     }
2154d14abf15SRobert Mustacchi 
2155d14abf15SRobert Mustacchi     default_dmae_info->context = lm_dmae_context_create(pdev,
2156d14abf15SRobert Mustacchi                                                         DMAE_WB_ACCESS_FUNCTION_CMD(FUNC_ID(pdev)),
2157d14abf15SRobert Mustacchi                                                         &default_dmae_info->locking_policy,
2158d14abf15SRobert Mustacchi                                                         CHANGE_ENDIANITY);
2159d14abf15SRobert Mustacchi     if( NULL == default_dmae_info->context )
2160d14abf15SRobert Mustacchi     {
2161d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
2162d14abf15SRobert Mustacchi     }
2163d14abf15SRobert Mustacchi 
2164d14abf15SRobert Mustacchi     //allocate and initialize the TOE DMAE context
2165d14abf15SRobert Mustacchi     lm_status = lm_dmae_locking_policy_create(  pdev,
2166d14abf15SRobert Mustacchi                                                 LM_PROTECTED_RESOURCE_DMAE_TOE,
2167d14abf15SRobert Mustacchi                                                 LM_DMAE_LOCKING_POLICY_TYPE_INTER_PF,
2168d14abf15SRobert Mustacchi                                                 &toe_dmae_info->locking_policy);
2169d14abf15SRobert Mustacchi     if( LM_STATUS_SUCCESS != lm_status )
2170d14abf15SRobert Mustacchi     {
2171d14abf15SRobert Mustacchi         return lm_status ;
2172d14abf15SRobert Mustacchi     }
2173d14abf15SRobert Mustacchi 
2174d14abf15SRobert Mustacchi     toe_dmae_info->context = lm_dmae_context_create(pdev,
2175d14abf15SRobert Mustacchi                                                     DMAE_COPY_PCI_PCI_PORT_0_CMD + PORT_ID(pdev),
2176d14abf15SRobert Mustacchi                                                     &toe_dmae_info->locking_policy,
2177d14abf15SRobert Mustacchi                                                     TRUE);
2178d14abf15SRobert Mustacchi     if( NULL == toe_dmae_info->context )
2179d14abf15SRobert Mustacchi     {
2180d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
2181d14abf15SRobert Mustacchi     }
2182d14abf15SRobert Mustacchi 
2183d14abf15SRobert Mustacchi     return lm_status;
2184d14abf15SRobert Mustacchi }
2185d14abf15SRobert Mustacchi 
2186d14abf15SRobert Mustacchi /* Description:
2187d14abf15SRobert Mustacchi *    This routine is called during driver initialization.  It is responsible
2188d14abf15SRobert Mustacchi *    for allocating memory resources needed by the driver for common init.
2189d14abf15SRobert Mustacchi *    This routine calls the following mm routines:
2190d14abf15SRobert Mustacchi *    mm_alloc_mem, mm_alloc_phys_mem, and mm_init_packet_desc. */
lm_alloc_resc(struct _lm_device_t * pdev)2191d14abf15SRobert Mustacchi lm_status_t lm_alloc_resc(struct _lm_device_t *pdev)
2192d14abf15SRobert Mustacchi {
2193d14abf15SRobert Mustacchi     lm_params_t*    params     = NULL ;
2194d14abf15SRobert Mustacchi     lm_variables_t* vars       = NULL ;
2195d14abf15SRobert Mustacchi     lm_status_t     lm_status  = LM_STATUS_SUCCESS ;
2196d14abf15SRobert Mustacchi     u8_t            mm_cli_idx = 0;
2197d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
2198d14abf15SRobert Mustacchi     {
2199d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
2200d14abf15SRobert Mustacchi     }
2201d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi , "### lm_alloc_resc\n");
2202d14abf15SRobert Mustacchi 
2203d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2204d14abf15SRobert Mustacchi     if (IS_VFDEV(pdev)) {
2205d14abf15SRobert Mustacchi         lm_status = lm_vf_init_dev_info(pdev);
2206d14abf15SRobert Mustacchi         if (LM_STATUS_SUCCESS != lm_status)
2207d14abf15SRobert Mustacchi             return lm_status;
2208d14abf15SRobert Mustacchi     }
2209d14abf15SRobert Mustacchi #endif
2210d14abf15SRobert Mustacchi 
2211d14abf15SRobert Mustacchi     params     = &pdev->params ;
2212d14abf15SRobert Mustacchi     vars       = &(pdev->vars) ;
2213d14abf15SRobert Mustacchi 
2214d14abf15SRobert Mustacchi     mm_cli_idx = LM_CLI_IDX_MAX;//!!DP mm_cli_idx_to_um_idx(LM_CLI_IDX_MAX);
2215d14abf15SRobert Mustacchi 
2216d14abf15SRobert Mustacchi     // Cleaning after driver unload
2217d14abf15SRobert Mustacchi     pdev->context_info = NULL;
2218d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->cid_recycled_callbacks, sizeof(pdev->cid_recycled_callbacks));
2219d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->toe_info, sizeof(pdev->toe_info));
2220d14abf15SRobert Mustacchi 
2221d14abf15SRobert Mustacchi     lm_status = lm_alloc_sq(pdev);
2222d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
2223d14abf15SRobert Mustacchi     {
2224d14abf15SRobert Mustacchi         return lm_status;
2225d14abf15SRobert Mustacchi     }
2226d14abf15SRobert Mustacchi 
2227d14abf15SRobert Mustacchi     /* alloc forward chain */
2228d14abf15SRobert Mustacchi     pdev->tx_info.catchup_chain_idx = FWD_CID(pdev);
2229d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev))
2230d14abf15SRobert Mustacchi     {
2231d14abf15SRobert Mustacchi         /* Allocate Event-Queue: only the pf has an event queue */
2232d14abf15SRobert Mustacchi         lm_status = lm_alloc_eq(pdev);
2233d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
2234d14abf15SRobert Mustacchi         {
2235d14abf15SRobert Mustacchi             return lm_status;
2236d14abf15SRobert Mustacchi         }
2237d14abf15SRobert Mustacchi 
2238d14abf15SRobert Mustacchi         pdev->tx_info.catchup_chain_idx = FWD_CID(pdev);
2239d14abf15SRobert Mustacchi 
2240d14abf15SRobert Mustacchi         lm_status = lm_alloc_txq(pdev, pdev->tx_info.catchup_chain_idx,
2241d14abf15SRobert Mustacchi                                  (u16_t)params->l2_tx_bd_page_cnt[LM_CLI_IDX_FWD],
2242d14abf15SRobert Mustacchi                                  (u16_t)params->l2_tx_coal_buf_cnt[LM_CLI_IDX_FWD]);
2243d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
2244d14abf15SRobert Mustacchi         {
2245d14abf15SRobert Mustacchi             return lm_status;
2246d14abf15SRobert Mustacchi         }
2247d14abf15SRobert Mustacchi     }
2248d14abf15SRobert Mustacchi 
2249d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev))
2250d14abf15SRobert Mustacchi     {
2251d14abf15SRobert Mustacchi         lm_status = lm_common_setup_alloc_resc(pdev, TRUE ) ;
2252d14abf15SRobert Mustacchi     }
2253d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2254d14abf15SRobert Mustacchi     else
2255d14abf15SRobert Mustacchi     {
2256d14abf15SRobert Mustacchi         lm_status = lm_vf_setup_alloc_resc(pdev, TRUE);
2257d14abf15SRobert Mustacchi     }
2258d14abf15SRobert Mustacchi #endif
2259d14abf15SRobert Mustacchi 
2260d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
2261d14abf15SRobert Mustacchi     {
2262d14abf15SRobert Mustacchi         return lm_status;
2263d14abf15SRobert Mustacchi     }
2264d14abf15SRobert Mustacchi 
2265d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev)) {
2266d14abf15SRobert Mustacchi         lm_status = lm_stats_alloc_resc( pdev ) ;
2267d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
2268d14abf15SRobert Mustacchi         {
2269d14abf15SRobert Mustacchi             return lm_status ;
2270d14abf15SRobert Mustacchi         }
2271d14abf15SRobert Mustacchi 
2272d14abf15SRobert Mustacchi         lm_status = lm_dmae_alloc_resc(pdev);
2273d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
2274d14abf15SRobert Mustacchi         {
2275d14abf15SRobert Mustacchi             DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
2276d14abf15SRobert Mustacchi             return lm_status ;
2277d14abf15SRobert Mustacchi         }
2278d14abf15SRobert Mustacchi 
2279d14abf15SRobert Mustacchi         // Init context allocation system
2280d14abf15SRobert Mustacchi         lm_status = lm_alloc_context_pool(pdev);
2281d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
2282d14abf15SRobert Mustacchi         {
2283d14abf15SRobert Mustacchi             DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
2284d14abf15SRobert Mustacchi             return lm_status ;
2285d14abf15SRobert Mustacchi         }
2286d14abf15SRobert Mustacchi         //  CAM mirror?
2287d14abf15SRobert Mustacchi 
2288d14abf15SRobert Mustacchi         /* alloc for ecore */
2289d14abf15SRobert Mustacchi         lm_status = ecore_resc_alloc(pdev);
2290d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
2291d14abf15SRobert Mustacchi         {
2292d14abf15SRobert Mustacchi             DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
2293d14abf15SRobert Mustacchi             return lm_status ;
2294d14abf15SRobert Mustacchi         }
2295d14abf15SRobert Mustacchi     }
2296d14abf15SRobert Mustacchi     else if (IS_CHANNEL_VFDEV(pdev))
2297d14abf15SRobert Mustacchi     {
2298d14abf15SRobert Mustacchi         // Init context allocation system
2299d14abf15SRobert Mustacchi         lm_status = lm_alloc_context_pool(pdev);
2300d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
2301d14abf15SRobert Mustacchi         {
2302d14abf15SRobert Mustacchi             DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
2303d14abf15SRobert Mustacchi             return lm_status ;
2304d14abf15SRobert Mustacchi         }
2305d14abf15SRobert Mustacchi 
2306d14abf15SRobert Mustacchi         lm_status = lm_stats_alloc_fw_resc(pdev);
2307d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
2308d14abf15SRobert Mustacchi         {
2309d14abf15SRobert Mustacchi             DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
2310d14abf15SRobert Mustacchi             return lm_status ;
2311d14abf15SRobert Mustacchi     }
2312d14abf15SRobert Mustacchi     }
2313d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORMi , "### exit lm_alloc_resc\n");
2314d14abf15SRobert Mustacchi 
2315d14abf15SRobert Mustacchi     /* FIXME: (MichalS : should be called by um, but this requires lm-um api, so should rethink...) */
2316d14abf15SRobert Mustacchi     lm_status = lm_init_sp_objs(pdev);
2317d14abf15SRobert Mustacchi     if( LM_STATUS_SUCCESS != lm_status )
2318d14abf15SRobert Mustacchi     {
2319d14abf15SRobert Mustacchi         DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
2320d14abf15SRobert Mustacchi         return lm_status ;
2321d14abf15SRobert Mustacchi     }
2322d14abf15SRobert Mustacchi 
2323d14abf15SRobert Mustacchi     return lm_setup_resc(pdev);
2324d14abf15SRobert Mustacchi }
2325d14abf15SRobert Mustacchi 
2326d14abf15SRobert Mustacchi /* Description:
2327d14abf15SRobert Mustacchi *    This routine is called during driver initialization.  It is responsible
2328d14abf15SRobert Mustacchi *    for initilazing  memory resources needed by the driver for common init.
2329d14abf15SRobert Mustacchi *    This routine calls the following mm routines:
2330d14abf15SRobert Mustacchi *    mm_alloc_mem, mm_alloc_phys_mem, and mm_init_packet_desc. */
lm_setup_resc(struct _lm_device_t * pdev)2331d14abf15SRobert Mustacchi lm_status_t lm_setup_resc(struct _lm_device_t *pdev)
2332d14abf15SRobert Mustacchi {
2333d14abf15SRobert Mustacchi     volatile struct hc_sp_status_block * sp_sb = NULL;
2334d14abf15SRobert Mustacchi     lm_params_t *    params     = NULL ;
2335d14abf15SRobert Mustacchi     lm_variables_t*  vars       = NULL ;
2336d14abf15SRobert Mustacchi     lm_tx_info_t *   tx_info    = NULL ;
2337d14abf15SRobert Mustacchi     lm_rx_info_t *   rx_info    = NULL ;
2338d14abf15SRobert Mustacchi     u32_t            i          = 0 ;
2339d14abf15SRobert Mustacchi     u32_t            j          = 0 ;
2340d14abf15SRobert Mustacchi     lm_status_t      lm_status  = LM_STATUS_SUCCESS ;
2341d14abf15SRobert Mustacchi 
2342d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
2343d14abf15SRobert Mustacchi     {
2344d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
2345d14abf15SRobert Mustacchi     }
2346d14abf15SRobert Mustacchi 
2347d14abf15SRobert Mustacchi     params    = &pdev->params;
2348d14abf15SRobert Mustacchi     vars      = &(pdev->vars);
2349d14abf15SRobert Mustacchi     tx_info   = &pdev->tx_info;
2350d14abf15SRobert Mustacchi     rx_info   = &pdev->rx_info;
2351d14abf15SRobert Mustacchi     sp_sb     = lm_get_default_status_block(pdev);
2352d14abf15SRobert Mustacchi 
2353d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->cid_recycled_callbacks, sizeof(pdev->cid_recycled_callbacks));
2354d14abf15SRobert Mustacchi     mm_mem_zero(rx_info->appr_mc.mcast_add_hash_bit_array, sizeof(rx_info->appr_mc.mcast_add_hash_bit_array));
2355d14abf15SRobert Mustacchi 
2356d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->vars.nig_mirror, sizeof(lm_nig_mirror_t));
2357d14abf15SRobert Mustacchi 
2358d14abf15SRobert Mustacchi     pdev->vars.b_is_dmae_ready = FALSE ;
2359d14abf15SRobert Mustacchi 
2360d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev)) {
2361d14abf15SRobert Mustacchi         // adjust the FWD Tx ring consumer - default sb
2362d14abf15SRobert Mustacchi         lm_status = lm_setup_txq(pdev, pdev->tx_info.catchup_chain_idx);
2363d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
2364d14abf15SRobert Mustacchi         {
2365d14abf15SRobert Mustacchi             return lm_status;
2366d14abf15SRobert Mustacchi         }
2367d14abf15SRobert Mustacchi     }
2368d14abf15SRobert Mustacchi 
2369d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev)) {
2370d14abf15SRobert Mustacchi         /* setup mac flitering to drop all for all clients */
2371d14abf15SRobert Mustacchi         // lm_status = lm_setup_tstorm_mac_filter(pdev); FIXME - necessary??
2372d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
2373d14abf15SRobert Mustacchi         {
2374d14abf15SRobert Mustacchi             return lm_status;
2375d14abf15SRobert Mustacchi         }
2376d14abf15SRobert Mustacchi     }
2377d14abf15SRobert Mustacchi 
2378d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev)) {
2379d14abf15SRobert Mustacchi         lm_status = lm_common_setup_alloc_resc(pdev, FALSE ) ;
2380d14abf15SRobert Mustacchi     }
2381d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2382d14abf15SRobert Mustacchi     else {
2383d14abf15SRobert Mustacchi         lm_status = lm_vf_setup_alloc_resc(pdev, FALSE);
2384d14abf15SRobert Mustacchi     }
2385d14abf15SRobert Mustacchi #endif
2386d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
2387d14abf15SRobert Mustacchi     {
2388d14abf15SRobert Mustacchi         return lm_status;
2389d14abf15SRobert Mustacchi     }
2390d14abf15SRobert Mustacchi 
2391d14abf15SRobert Mustacchi     lm_status = lm_setup_sq(pdev);
2392d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
2393d14abf15SRobert Mustacchi     {
2394d14abf15SRobert Mustacchi         return lm_status;
2395d14abf15SRobert Mustacchi     }
2396d14abf15SRobert Mustacchi 
2397d14abf15SRobert Mustacchi     /* Only pfdev has an event-queue */
2398d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev))
2399d14abf15SRobert Mustacchi     {
2400d14abf15SRobert Mustacchi         lm_status = lm_setup_eq(pdev);
2401d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
2402d14abf15SRobert Mustacchi         {
2403d14abf15SRobert Mustacchi             return lm_status;
2404d14abf15SRobert Mustacchi         }
2405d14abf15SRobert Mustacchi     }
2406d14abf15SRobert Mustacchi 
2407d14abf15SRobert Mustacchi     // Initialize T1
2408d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev)) {
2409d14abf15SRobert Mustacchi         for( i = 0 ; i < vars->searcher_t1_num_pages ; i ++)
2410d14abf15SRobert Mustacchi         {
2411d14abf15SRobert Mustacchi             mm_mem_zero( vars->searcher_t1_virt_addr_table[i], params->ilt_client_page_size ) ;
2412d14abf15SRobert Mustacchi         }
2413d14abf15SRobert Mustacchi 
2414d14abf15SRobert Mustacchi         // Initialize T2 first we make each next filed point to its address +1 then we fixup the edges
2415d14abf15SRobert Mustacchi         for(i=0 ; i < vars->searcher_t2_num_pages ; i ++)
2416d14abf15SRobert Mustacchi         {
2417d14abf15SRobert Mustacchi             for (j=0; j < params->ilt_client_page_size; j+=64)
2418d14abf15SRobert Mustacchi             {
2419d14abf15SRobert Mustacchi                 *(u64_t*)((char*)vars->searcher_t2_virt_addr_table[i]+j+56) = vars->searcher_t2_phys_addr_table[i].as_u64+j+64; //64bit pointer
2420d14abf15SRobert Mustacchi             }
2421d14abf15SRobert Mustacchi             // now fix up the last line in the block to point to the next block
2422d14abf15SRobert Mustacchi             j = params->ilt_client_page_size - 8;
2423d14abf15SRobert Mustacchi 
2424d14abf15SRobert Mustacchi             if (i < vars->searcher_t2_num_pages -1)
2425d14abf15SRobert Mustacchi             {
2426d14abf15SRobert Mustacchi                 // this is not the last block
2427d14abf15SRobert Mustacchi                 *(u64_t*)((char*)vars->searcher_t2_virt_addr_table[i]+j) = vars->searcher_t2_phys_addr_table[i+1].as_u64; //64bit pointer
2428d14abf15SRobert Mustacchi             }
2429d14abf15SRobert Mustacchi         }
2430d14abf15SRobert Mustacchi 
2431d14abf15SRobert Mustacchi         for( i=0  ;i < vars->timers_linear_num_pages; i++)
2432d14abf15SRobert Mustacchi         {
2433d14abf15SRobert Mustacchi             mm_mem_zero(vars->timers_linear_virt_addr_table[i],params->ilt_client_page_size);
2434d14abf15SRobert Mustacchi         }
2435d14abf15SRobert Mustacchi 
2436d14abf15SRobert Mustacchi #if defined(EMULATION_DOORBELL_FULL_WORKAROUND)
2437d14abf15SRobert Mustacchi         mm_atomic_set(&vars->doorbells_cnt, DOORBELL_CHECK_FREQUENCY);
2438d14abf15SRobert Mustacchi #endif
2439d14abf15SRobert Mustacchi 
2440d14abf15SRobert Mustacchi         lm_status = lm_stats_hw_setup(pdev);
2441d14abf15SRobert Mustacchi         if(lm_status != LM_STATUS_SUCCESS)
2442d14abf15SRobert Mustacchi         {
2443d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_stats_hw_setup failed.\n");
2444d14abf15SRobert Mustacchi             return lm_status;
2445d14abf15SRobert Mustacchi         }
2446d14abf15SRobert Mustacchi 
2447d14abf15SRobert Mustacchi         lm_stats_fw_setup(pdev);
2448d14abf15SRobert Mustacchi 
2449d14abf15SRobert Mustacchi         // init_context
2450d14abf15SRobert Mustacchi         lm_status = lm_setup_context_pool(pdev) ;
2451d14abf15SRobert Mustacchi         if(lm_status != LM_STATUS_SUCCESS)
2452d14abf15SRobert Mustacchi         {
2453d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_setup_context_pool failed.\n");
2454d14abf15SRobert Mustacchi             return lm_status;
2455d14abf15SRobert Mustacchi         }
2456d14abf15SRobert Mustacchi     }
2457d14abf15SRobert Mustacchi     else if (IS_CHANNEL_VFDEV(pdev))
2458d14abf15SRobert Mustacchi     {
2459d14abf15SRobert Mustacchi         lm_status = lm_setup_context_pool(pdev) ;
2460d14abf15SRobert Mustacchi         if(lm_status != LM_STATUS_SUCCESS)
2461d14abf15SRobert Mustacchi         {
2462d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_setup_context_pool failed.\n");
2463d14abf15SRobert Mustacchi             return lm_status;
2464d14abf15SRobert Mustacchi         }
2465d14abf15SRobert Mustacchi     }
2466d14abf15SRobert Mustacchi 
2467d14abf15SRobert Mustacchi 
2468d14abf15SRobert Mustacchi     pdev->vars.mac_type = MAC_TYPE_NONE;
2469d14abf15SRobert Mustacchi     pdev->vars.is_pmf = NOT_PMF;
2470d14abf15SRobert Mustacchi 
2471d14abf15SRobert Mustacchi     lm_set_int_coal_info(pdev);
2472d14abf15SRobert Mustacchi 
2473d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->vars.nig_mirror, sizeof(pdev->vars.nig_mirror));
2474d14abf15SRobert Mustacchi 
2475d14abf15SRobert Mustacchi     return lm_status;
2476d14abf15SRobert Mustacchi }
2477d14abf15SRobert Mustacchi 
2478d14abf15SRobert Mustacchi /**
2479d14abf15SRobert Mustacchi  * @description
2480d14abf15SRobert Mustacchi  * Indicate packets from the free descriptor list and the given list
2481d14abf15SRobert Mustacchi  * @param pdev
2482d14abf15SRobert Mustacchi  * @param rx_common         - The chain to free RSC/RX.
2483d14abf15SRobert Mustacchi  * @param packet_list       - A list of packets to indicate.
2484d14abf15SRobert Mustacchi  * @param idx               - Chain index.
2485d14abf15SRobert Mustacchi  * @param is_stat_handle    - Is updating statistic is needed.
2486d14abf15SRobert Mustacchi  */
2487d14abf15SRobert Mustacchi STATIC void
lm_abort_indicate_free_list(IN OUT lm_device_t * pdev,IN lm_rx_chain_common_t * rx_common,IN s_list_t * packet_list,IN const u32_t idx,IN const u8_t is_stat_handle)2488d14abf15SRobert Mustacchi lm_abort_indicate_free_list( IN OUT   lm_device_t*          pdev,
2489d14abf15SRobert Mustacchi                              IN       lm_rx_chain_common_t* rx_common,
2490d14abf15SRobert Mustacchi                              IN       s_list_t*             packet_list,
2491d14abf15SRobert Mustacchi                              IN const u32_t                 idx,
2492d14abf15SRobert Mustacchi                              IN const u8_t                  is_stat_handle)
2493d14abf15SRobert Mustacchi {
2494d14abf15SRobert Mustacchi     lm_packet_t*            pkt          = NULL;
2495d14abf15SRobert Mustacchi     for(; ;)
2496d14abf15SRobert Mustacchi     {
2497d14abf15SRobert Mustacchi         // Run on all the free list
2498d14abf15SRobert Mustacchi         pkt = (lm_packet_t *) s_list_pop_head(&rx_common->free_descq);
2499d14abf15SRobert Mustacchi         if (pkt == NULL)
2500d14abf15SRobert Mustacchi         {
2501d14abf15SRobert Mustacchi             break;
2502d14abf15SRobert Mustacchi         }
2503d14abf15SRobert Mustacchi         pkt->status = LM_STATUS_ABORTED;
2504d14abf15SRobert Mustacchi         if(is_stat_handle)
2505d14abf15SRobert Mustacchi         {
2506d14abf15SRobert Mustacchi             LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(pdev, rx_aborted);
2507d14abf15SRobert Mustacchi         }
2508d14abf15SRobert Mustacchi #if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
2509d14abf15SRobert Mustacchi         s_list_push_tail(packet_list, (s_list_entry_t *)pkt);
2510d14abf15SRobert Mustacchi #endif
2511d14abf15SRobert Mustacchi     }
2512d14abf15SRobert Mustacchi 
2513d14abf15SRobert Mustacchi     if (!s_list_is_empty(packet_list))
2514d14abf15SRobert Mustacchi     {
2515d14abf15SRobert Mustacchi #if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
2516d14abf15SRobert Mustacchi         mm_indicate_rx(pdev, idx, packet_list, LM_STATUS_ABORTED);
2517d14abf15SRobert Mustacchi #endif
2518d14abf15SRobert Mustacchi     }
2519d14abf15SRobert Mustacchi }
2520d14abf15SRobert Mustacchi 
2521d14abf15SRobert Mustacchi /*******************************************************************************
2522d14abf15SRobert Mustacchi  * Description:
2523d14abf15SRobert Mustacchi  *
2524d14abf15SRobert Mustacchi  * Return:
2525d14abf15SRobert Mustacchi  ******************************************************************************/
lm_abort(lm_device_t * pdev,const lm_abort_op_t abort_op,const u32_t idx)2526d14abf15SRobert Mustacchi void lm_abort( lm_device_t        *pdev,
2527d14abf15SRobert Mustacchi                const lm_abort_op_t abort_op,
2528d14abf15SRobert Mustacchi                const u32_t         idx)
2529d14abf15SRobert Mustacchi {
2530d14abf15SRobert Mustacchi     lm_packet_t          *pkt          = NULL;
2531d14abf15SRobert Mustacchi     lm_rx_chain_t        *rxq_chain    = NULL;
2532d14abf15SRobert Mustacchi     lm_rx_chain_common_t *rx_common    = NULL;
2533d14abf15SRobert Mustacchi     lm_tpa_chain_t       *tpa_chain    = NULL;
2534d14abf15SRobert Mustacchi     lm_bd_chain_t        *rx_chain_bd  = NULL;
2535d14abf15SRobert Mustacchi     lm_bd_chain_t        *rx_chain_sge = NULL;
2536d14abf15SRobert Mustacchi     lm_tx_chain_t        *tx_chain     = NULL;
2537d14abf15SRobert Mustacchi     s_list_t              packet_list  = {0};
2538d14abf15SRobert Mustacchi     u16_t                 i            = 0;
2539d14abf15SRobert Mustacchi     u16_t                 active_entry = 0;
2540d14abf15SRobert Mustacchi 
2541d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "### lm_abort   abort_op=%d idx=%d\n", abort_op, idx);
2542d14abf15SRobert Mustacchi     switch(abort_op)
2543d14abf15SRobert Mustacchi     {
2544d14abf15SRobert Mustacchi         case ABORT_OP_RX_CHAIN:
2545d14abf15SRobert Mustacchi         case ABORT_OP_INDICATE_RX_CHAIN:
2546d14abf15SRobert Mustacchi         {
2547d14abf15SRobert Mustacchi             rxq_chain    = &LM_RXQ(pdev, idx);
2548d14abf15SRobert Mustacchi             rx_common    = &LM_RXQ_COMMON(pdev, idx);
2549d14abf15SRobert Mustacchi             rx_chain_bd  = &LM_RXQ_CHAIN_BD(pdev, idx);
2550d14abf15SRobert Mustacchi             rx_chain_sge = LM_RXQ_SGE_PTR_IF_VALID(pdev, idx);
2551d14abf15SRobert Mustacchi             // Verify BD's consistent
2552d14abf15SRobert Mustacchi             DbgBreakIfFastPath( rx_chain_sge && !lm_bd_chains_are_consistent( rx_chain_sge, rx_chain_bd ) );
2553d14abf15SRobert Mustacchi             /* indicate packets from the active descriptor list */
2554d14abf15SRobert Mustacchi             for(; ;)
2555d14abf15SRobert Mustacchi             {
2556d14abf15SRobert Mustacchi                 pkt = (lm_packet_t *) s_list_pop_head(&rxq_chain->active_descq);
2557d14abf15SRobert Mustacchi                 if(pkt == NULL)
2558d14abf15SRobert Mustacchi                 {
2559d14abf15SRobert Mustacchi                     break;
2560d14abf15SRobert Mustacchi                 }
2561d14abf15SRobert Mustacchi                 lm_bd_chain_bds_consumed(rx_chain_bd, 1);
2562d14abf15SRobert Mustacchi                 if( rx_chain_sge )
2563d14abf15SRobert Mustacchi                 {
2564d14abf15SRobert Mustacchi                     lm_bd_chain_bds_consumed(rx_chain_sge, 1);
2565d14abf15SRobert Mustacchi                 }
2566d14abf15SRobert Mustacchi                 LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(pdev, rx_aborted);
2567d14abf15SRobert Mustacchi                 // if in shutdown flow or not if in d3 flow ?
2568d14abf15SRobert Mustacchi                 if (abort_op == ABORT_OP_INDICATE_RX_CHAIN)
2569d14abf15SRobert Mustacchi                 {
2570d14abf15SRobert Mustacchi #if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
2571d14abf15SRobert Mustacchi                     s_list_push_tail(&packet_list, (s_list_entry_t *)pkt);
2572d14abf15SRobert Mustacchi #endif
2573d14abf15SRobert Mustacchi                 }
2574d14abf15SRobert Mustacchi                 else
2575d14abf15SRobert Mustacchi                 {
2576d14abf15SRobert Mustacchi                     s_list_push_tail(&rx_common->free_descq, &pkt->link);
2577d14abf15SRobert Mustacchi                 }
2578d14abf15SRobert Mustacchi             }
2579d14abf15SRobert Mustacchi             if ( ABORT_OP_INDICATE_RX_CHAIN == abort_op )
2580d14abf15SRobert Mustacchi             {
2581d14abf15SRobert Mustacchi                 /* indicate packets from the free descriptor list */
2582d14abf15SRobert Mustacchi                 lm_abort_indicate_free_list( pdev,
2583d14abf15SRobert Mustacchi                                              rx_common,
2584d14abf15SRobert Mustacchi                                              &packet_list,
2585d14abf15SRobert Mustacchi                                              idx,
2586d14abf15SRobert Mustacchi                                              TRUE);
2587d14abf15SRobert Mustacchi             }
2588d14abf15SRobert Mustacchi         } // ABORT_OP_INDICATE_RX_CHAIN
2589d14abf15SRobert Mustacchi         // Fall Through
2590d14abf15SRobert Mustacchi         case ABORT_OP_TPA_CHAIN:
2591d14abf15SRobert Mustacchi         case ABORT_OP_INDICATE_TPA_CHAIN:
2592d14abf15SRobert Mustacchi         {
2593d14abf15SRobert Mustacchi             tpa_chain    = &LM_TPA(pdev, idx);
2594d14abf15SRobert Mustacchi             rx_chain_bd  = &LM_TPA_CHAIN_BD(pdev, idx);
2595d14abf15SRobert Mustacchi             rx_common    = &LM_TPA_COMMON(pdev, idx);
2596d14abf15SRobert Mustacchi 
2597d14abf15SRobert Mustacchi             DbgBreakIf(!(s_list_is_empty(&packet_list)));
2598d14abf15SRobert Mustacchi 
2599d14abf15SRobert Mustacchi             /* indicate packets from the active descriptor list */
2600d14abf15SRobert Mustacchi             for(i = lm_bd_chain_cons_idx(rx_chain_bd); i != lm_bd_chain_prod_idx(rx_chain_bd); i++ )
2601d14abf15SRobert Mustacchi             {
2602d14abf15SRobert Mustacchi                 // Run on all the valid active descriptor
2603d14abf15SRobert Mustacchi                 // Valid active descriptors can only be beteen the consumer to the producers
2604d14abf15SRobert Mustacchi                 active_entry = LM_TPA_BD_ENTRY_TO_ACTIVE_ENTRY(pdev,idx,i);
2605d14abf15SRobert Mustacchi 
2606d14abf15SRobert Mustacchi                 LM_TPA_ACTIVE_ENTRY_BOUNDARIES_VERIFY(pdev, idx, active_entry);
2607d14abf15SRobert Mustacchi                 if(LM_TPA_MASK_TEST_ACTIVE_BIT(pdev, idx, active_entry))
2608d14abf15SRobert Mustacchi                 {
2609d14abf15SRobert Mustacchi                     LM_TPA_MASK_CLEAR_ACTIVE_BIT(pdev, idx, active_entry);
2610d14abf15SRobert Mustacchi                     pkt = tpa_chain->sge_chain.active_descq_array[active_entry];
2611d14abf15SRobert Mustacchi 
2612d14abf15SRobert Mustacchi                     if(NULL == pkt)
2613d14abf15SRobert Mustacchi                     {
2614d14abf15SRobert Mustacchi                         DbgBreakMsg(" Packet is null suppose to be null");
2615d14abf15SRobert Mustacchi                         continue;
2616d14abf15SRobert Mustacchi                     }
2617d14abf15SRobert Mustacchi 
2618d14abf15SRobert Mustacchi                     lm_bd_chain_bds_consumed(rx_chain_bd, 1);
2619d14abf15SRobert Mustacchi                     // if in shutdown flow or not if in d3 flow ?
2620d14abf15SRobert Mustacchi                     if ((abort_op == ABORT_OP_INDICATE_TPA_CHAIN) ||
2621d14abf15SRobert Mustacchi                         (abort_op == ABORT_OP_INDICATE_RX_CHAIN))
2622d14abf15SRobert Mustacchi                     {
2623d14abf15SRobert Mustacchi #if (DBG)
2624d14abf15SRobert Mustacchi                         /************start TPA debbug code******************************/
2625d14abf15SRobert Mustacchi                         tpa_chain->dbg_params.pck_ret_abort_active++;
2626d14abf15SRobert Mustacchi                         /************end TPA debbug code********************************/
2627d14abf15SRobert Mustacchi #endif //DBG
2628d14abf15SRobert Mustacchi #if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
2629d14abf15SRobert Mustacchi                     s_list_push_tail(&packet_list, (s_list_entry_t *)pkt);
2630d14abf15SRobert Mustacchi #endif
2631d14abf15SRobert Mustacchi                 }
2632d14abf15SRobert Mustacchi                     else
2633d14abf15SRobert Mustacchi                 {
2634d14abf15SRobert Mustacchi                         s_list_push_tail(&rx_common->free_descq, &pkt->link);
2635d14abf15SRobert Mustacchi                     }
2636d14abf15SRobert Mustacchi                 }
2637d14abf15SRobert Mustacchi                 }
2638d14abf15SRobert Mustacchi             if ((abort_op == ABORT_OP_INDICATE_TPA_CHAIN) ||
2639d14abf15SRobert Mustacchi                 (abort_op == ABORT_OP_INDICATE_RX_CHAIN))
2640d14abf15SRobert Mustacchi             {
2641d14abf15SRobert Mustacchi #if (DBG)
2642d14abf15SRobert Mustacchi                 /************start TPA debbug code******************************/
2643d14abf15SRobert Mustacchi                 // Total packet aborted
2644d14abf15SRobert Mustacchi                 tpa_chain->dbg_params.pck_ret_abort += s_list_entry_cnt(&packet_list) + s_list_entry_cnt(&rx_common->free_descq);
2645d14abf15SRobert Mustacchi 
2646d14abf15SRobert Mustacchi                 if((tpa_chain->dbg_params.pck_ret_abort + tpa_chain->dbg_params.pck_ret_from_chip) !=
2647d14abf15SRobert Mustacchi                    (tpa_chain->dbg_params.pck_received + tpa_chain->dbg_params.pck_received_ind) )
2648d14abf15SRobert Mustacchi                 {
2649d14abf15SRobert Mustacchi                     DbgBreakMsg("VBD didn't return all packets this chain ");
2650d14abf15SRobert Mustacchi                 }
2651d14abf15SRobert Mustacchi                 /************end TPA debbug code******************************/
2652d14abf15SRobert Mustacchi #endif //DBG
2653d14abf15SRobert Mustacchi                 /* indicate packets from the free descriptor list */
2654d14abf15SRobert Mustacchi                 lm_abort_indicate_free_list( pdev,
2655d14abf15SRobert Mustacchi                                              rx_common,
2656d14abf15SRobert Mustacchi                                              &packet_list,
2657d14abf15SRobert Mustacchi                                              idx,
2658d14abf15SRobert Mustacchi                                              FALSE);
2659d14abf15SRobert Mustacchi 
2660d14abf15SRobert Mustacchi #if (DBG)
2661d14abf15SRobert Mustacchi                 /************start TPA debbug code******************************/
2662d14abf15SRobert Mustacchi                 // make sure all packets were abort
2663d14abf15SRobert Mustacchi                 if(0 != (s_list_entry_cnt(&packet_list) + s_list_entry_cnt(&rx_common->free_descq)))
2664d14abf15SRobert Mustacchi                 {
2665d14abf15SRobert Mustacchi                     DbgBreakMsg("VBD didn't return all packets this chain ");
2666d14abf15SRobert Mustacchi             }
2667d14abf15SRobert Mustacchi                 /************end TPA debbug code******************************/
2668d14abf15SRobert Mustacchi #endif //DBG
2669d14abf15SRobert Mustacchi             }
2670d14abf15SRobert Mustacchi         break;
2671d14abf15SRobert Mustacchi         } // ABORT_OP_INDICATE_TPA_CHAIN
2672d14abf15SRobert Mustacchi         case ABORT_OP_INDICATE_TX_CHAIN:
2673d14abf15SRobert Mustacchi         {
2674d14abf15SRobert Mustacchi             tx_chain = &LM_TXQ(pdev, idx);
2675d14abf15SRobert Mustacchi             for(; ;)
2676d14abf15SRobert Mustacchi             {
2677d14abf15SRobert Mustacchi                 pkt = (lm_packet_t *) s_list_pop_head(&tx_chain->active_descq);
2678d14abf15SRobert Mustacchi                 if(pkt == NULL)
2679d14abf15SRobert Mustacchi                 {
2680d14abf15SRobert Mustacchi                     break;
2681d14abf15SRobert Mustacchi                 }
2682d14abf15SRobert Mustacchi                 pkt->status = LM_STATUS_ABORTED;
2683d14abf15SRobert Mustacchi                 LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(pdev, tx_aborted);
2684d14abf15SRobert Mustacchi                 lm_bd_chain_bds_consumed(&tx_chain->bd_chain, pkt->u1.tx.bd_used);
2685d14abf15SRobert Mustacchi                 if (pkt->u1.tx.coalesce_buf) {
2686d14abf15SRobert Mustacchi                     /* return coalesce buffer to the chain's pool */
2687d14abf15SRobert Mustacchi                     lm_put_coalesce_buffer(pdev, tx_chain, pkt->u1.tx.coalesce_buf);
2688d14abf15SRobert Mustacchi                     pkt->u1.tx.coalesce_buf = NULL;
2689d14abf15SRobert Mustacchi                 }
2690d14abf15SRobert Mustacchi                 s_list_push_tail(&packet_list, (s_list_entry_t *)pkt);
2691d14abf15SRobert Mustacchi             }
2692d14abf15SRobert Mustacchi             if (!s_list_is_empty(&packet_list))
2693d14abf15SRobert Mustacchi             {
2694d14abf15SRobert Mustacchi                 mm_indicate_tx(pdev, idx, &packet_list);
2695d14abf15SRobert Mustacchi             }
2696d14abf15SRobert Mustacchi 
2697d14abf15SRobert Mustacchi             // changed from pdev->params.l2_tx_bd_page_cnt[idx] to pdev->params.l2_tx_bd_page_cnt[0]
2698d14abf15SRobert Mustacchi             DbgBreakIf(!lm_bd_chain_is_full(&tx_chain->bd_chain));
2699d14abf15SRobert Mustacchi             DbgBreakIf(s_list_entry_cnt(&tx_chain->coalesce_buf_list) != tx_chain->coalesce_buf_cnt);
2700d14abf15SRobert Mustacchi             break;
2701d14abf15SRobert Mustacchi         } // ABORT_OP_INDICATE_TX_CHAIN
2702d14abf15SRobert Mustacchi         default:
2703d14abf15SRobert Mustacchi         {
2704d14abf15SRobert Mustacchi             DbgBreakMsg("unknown abort operation.\n");
2705d14abf15SRobert Mustacchi             break;
2706d14abf15SRobert Mustacchi         }
2707d14abf15SRobert Mustacchi     } //switch
2708d14abf15SRobert Mustacchi } /* lm_abort */
2709d14abf15SRobert Mustacchi 
2710d14abf15SRobert Mustacchi #include "57710_int_offsets.h"
2711d14abf15SRobert Mustacchi #include "57711_int_offsets.h"
2712d14abf15SRobert Mustacchi #include "57712_int_offsets.h"
2713d14abf15SRobert Mustacchi void ecore_init_e1_firmware(struct _lm_device_t *pdev);
2714d14abf15SRobert Mustacchi void ecore_init_e1h_firmware(struct _lm_device_t *pdev);
2715d14abf15SRobert Mustacchi void ecore_init_e2_firmware(struct _lm_device_t *pdev);
2716d14abf15SRobert Mustacchi 
lm_set_init_arrs(lm_device_t * pdev)2717d14abf15SRobert Mustacchi int lm_set_init_arrs(lm_device_t *pdev)
2718d14abf15SRobert Mustacchi {
2719d14abf15SRobert Mustacchi     u32_t const chip_num = CHIP_NUM(pdev);
2720d14abf15SRobert Mustacchi     switch(chip_num)
2721d14abf15SRobert Mustacchi     {
2722d14abf15SRobert Mustacchi     case CHIP_NUM_5710:
2723d14abf15SRobert Mustacchi         DbgBreakIf( !CHIP_IS_E1(pdev) );
2724d14abf15SRobert Mustacchi         ecore_init_e1_firmware(pdev);
2725d14abf15SRobert Mustacchi         INIT_IRO_ARRAY(pdev) = e1_iro_arr;
2726d14abf15SRobert Mustacchi         break;
2727d14abf15SRobert Mustacchi     case CHIP_NUM_5711:
2728d14abf15SRobert Mustacchi     case CHIP_NUM_5711E:
2729d14abf15SRobert Mustacchi         DbgBreakIf( !CHIP_IS_E1H(pdev) );
2730d14abf15SRobert Mustacchi         ecore_init_e1h_firmware(pdev);
2731d14abf15SRobert Mustacchi         INIT_IRO_ARRAY(pdev) = e1h_iro_arr;
2732d14abf15SRobert Mustacchi         break;
2733d14abf15SRobert Mustacchi     case CHIP_NUM_5712:
2734d14abf15SRobert Mustacchi     case CHIP_NUM_5713:
2735d14abf15SRobert Mustacchi     case CHIP_NUM_5712E:
2736d14abf15SRobert Mustacchi     case CHIP_NUM_5713E:
2737d14abf15SRobert Mustacchi         DbgBreakIf( !CHIP_IS_E2(pdev) );
2738d14abf15SRobert Mustacchi     case CHIP_NUM_57800:
2739d14abf15SRobert Mustacchi     case CHIP_NUM_57810:
2740d14abf15SRobert Mustacchi     case CHIP_NUM_57840_4_10:
2741d14abf15SRobert Mustacchi     case CHIP_NUM_57840_2_20:
2742d14abf15SRobert Mustacchi     case CHIP_NUM_57840_OBSOLETE:
2743d14abf15SRobert Mustacchi     case CHIP_NUM_57811:
2744d14abf15SRobert Mustacchi         DbgBreakIf( !CHIP_IS_E2(pdev) && !CHIP_IS_E3(pdev) );
2745d14abf15SRobert Mustacchi         ecore_init_e2_firmware(pdev);
2746d14abf15SRobert Mustacchi         INIT_IRO_ARRAY(pdev) = e2_iro_arr;
2747d14abf15SRobert Mustacchi         break;
2748d14abf15SRobert Mustacchi     default:
2749d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "chip-id=%x NOT SUPPORTED\n", CHIP_NUM(pdev));
2750d14abf15SRobert Mustacchi         return -1; // for now not supported, can't have all three...
2751d14abf15SRobert Mustacchi     }
2752d14abf15SRobert Mustacchi     return 0;
2753d14abf15SRobert Mustacchi }
2754d14abf15SRobert Mustacchi 
2755